; [T?c@s{bdZdZdkZdkZyeWn+dZeidjoddBZqTnXeed o de_neid d jo;eid d jo#d eeifGHei dqnydk Z dk Z dk Z dk Z dkZdkZdkZdkZdkZdkZdkZd klZdklZdklZeidjodkZdkZnWnLej o@ZydkZeiWnnXdeGHei dnXydkl Z l!Z!l"Z"Wn,ej o dk#l Z l!Z!l"Z"nXe$Z%y dk%Z%Wn e$Z%nXe$Z&e%odei'dj oei(e$f\Z(Z)yuxeei'dD]VZ)e)d djo?e)dZ)e)oei(i*e)oei(i+de)qq|q|Wdk&Z&Wn e$Z&nXe(e_([([)ne$Z,eidjo!y dk,Z,Wq:e$Z,q:Xne$Ze$Z-y dk-Z-Wn e$Z-nXy(dk.Z.dk/Z/dk0Z0dk1Z1WnLej o@ZydkZeiWnnXdeGHei dnXe.i2Z2dZ3dZ4dZ5dZ6ddfZ7y ei8Wn9yei9ei:fe_8WqNei9fe_8qNXnXy ei:Wne$e_:nXdZ;dZ<e$e$dZ=dZ>dZ?e$d Z@d!ZAd"ZBd#ZCe iDZEd$ZFeGeHeiIfZJd%eKfd&YZLd'ZMd(ZNdd)ZOd*ZPhaQd+ZRd,ZSd-ZTd.ZUe$d/ZVeiWZXeiYZZeid0jo eiZXnd1Z[d2fd3YZ\d4Z]d5fd6YZ^dd7Z#d8Z_fd9Z`fd:Zafabdd;Zcd<Zdd=Zed>fd?YZfd@effdAYZgdBeffdCYZhdDeffdEYZidFZjdGdHdIdJfZkdKdLfZldMdNdOdPdQdRdSdTdUdVdWdXdYf ZmdZndZZod[Zpd\Zqd]Zrd]Zsd]Ztd^Zud^Zvd^ZwdZxd]Zyd_Zzd`Z{dadbfZ|no eidjodcdadbddfZ|nyeWn dZnXdeZ}dffdgYZ~dhfdiYZe$Zdje\fdkYZdlfdmYZdnfdoYZdpe\fdqYZdrefdsYZdtefduYZdvefdwYZdxefdyYZdzefd{YZd|efd}YZd~efdYZdefdYZdfdYZdeKfdYZde\fdYZdfdYZeZdZddZdfdYZdefdYZdefdYZdZe$e$e$dZdZdZdZdZdZdZe$dZdZdZdZdZee.i_ee.i/_ee.i/_ee.i/_ee.i/_ee.i/_ee.i/_ee.i/_ee.i_ee.i_ee.i_ee.i_ee.i_ee.i_dZdZe$e$e$dZe$e$e$dZe$dZe$dZe$dZe$dZe$dZe$dZee/i_ee/i_ee/i_ee/i_ee/i_ee/i_ee/i_ee/i_ee/i_ee/i_dZee.i_dZddddfZyZeiee.iidZeo.eeeddgZeed Zn[WnnXdZdZe$ZdZdZe.iZe.iZe.iZe.iZe.iZe.iZe.iZe.iZe.iZhZddZdZdZddZdZeidZdZe$e$ddZe$e$dZeZe$e$e$e$dZhZdddfZe$dZdZdZdZdZe$e$e$e$dZeZdZe$dZe$dZde/ifdYZde/ifdYZe/iZe/iZde/ifdYZde.i/fdYZde.ifdYZ de.i fdYZ de.i fdYZ dfdYZdefdYZdefdYZdefdYZdefdYZdfdYZdfdYZde.ifdYZdefdYZdeifdYZdeifdYZdfdYZdefdYZdefdYZdefdYZdefdYZdfdYZ defdYZ!defdYZ"dddZ#dddZ$dddZ%e$a&dZ'defdYZ(dfdYZ)dfdYZ*dfdYZ+dfdYZ,de,e+fd YZ-d fd YZ.d e.fd YZ/dfdYZ0de.i1fdYZ2de2fdYZ3de*fdYZ4dfdYZ5de5fdYZ6de5fdYZ7defdYZ8de6fdYZ9d e7fd!YZ:d"fd#YZ;d$e8fd%YZ<d&efd'YZ=d(e9fd)YZ>d*e:fd+YZ?d,e;fd-YZ@d.e<fd/YZAd0eAfd1YZBd2efd3YZCd4eCfd5YZDd6e9fd7YZEd8e:fd9YZFd:e;fd;YZGd<e;fd=YZHd>e<fd?YZId@e<fdAYZJdBefdCYZKdDeKfdEYZLdFe9fdGYZMdHe:fdIYZNdJe;fdKYZOdLe<fdMYZPdNefdOYZQdPefdQYZRdRefdSYZSdTefdUYZTdVeTfdWYZUdXeUfdYYZVdZfd[YZWd\eWfd]YZXd^eWfd_YZYeXZZnoedd`ddfjo eYZZndaeZfdbYZ[dce[fddYZ\deeZfdfYZ]dgeZfdhYZ^e^Z_e]Z_e\Z_e[Z_difdjYZ`dkfdlYZadmeafdnYZbdofdpYZcdqecfdrYZddsecfdtYZeduecfdvYZfdwecfdxYZgdyecfdzYZhehZiehZjd{ecfd|YZkd}ecfd~YZldecfdYZmdZndZodd]dZpdd]dZqdd]dZrdd]dZsdd]dZtdZuddZvdfdYZwdfdYZxdfdYZydewexeyfdYZzdezfdYZ{dezfdYZ|dewfdYZ}de}fdYZ~de~fdYZdefdYZdefdYZdfdYZde}fdYZdeefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZde}fdYZdezfdYZdefdYZdeze}fdYZde}fdYZdewfdYZdfdYZdefdYZdefdYZdfdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdfdYZdfdYZdfdYZdfdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZd efd YZd efd YZd efdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefd YZd!efd"YZd#efd$YZd%efd&YZd'e{fd(YZd)efd*YZeededeidd]eed+ed,eieiBddeed-ed.eieiBddeed/ed0eidd]eed1ed2eiddeed3edeiddeed4ed5eidd]eed6edeiddeed7edeiddeed8edeiddeed9edeiddeed:ed;eiddeed<ed=eiddeed>ed eieiBddeed?ed eieiBddeed@edAeiddeededBeidd]eedCedDeiddeedEedeiddeedFedeiddeedGedHeieiBddeedIedJeieiBddeedKedeieiBddeedLed!eieiBddeedMed%eiddeedNedOeidddPefdQYZdRefdSYZdTefdUYZdVezfdWYZdXefdYYZdZe{fd[YZd\efd]YZd^e~fd_YZd`efdaYZdbefdcYZddefdeYZdfefdgYZdhefdiYZdjefdkYZdlefdmYZdnefdoYZdpefdqYZdrefdsYZdtefduYZdvefdwYZdxefdyYZeededPeiddeedzedTeiddeed`edXeiddeed{ed|eiddeed}ed~eieiBdddddddddZd[d\feededeiddeededheieiBeiBddeededeiddeededeiddeededneiddeededeiddeededreiddeededxeidddefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZeededeidddddfeededeiddeededeiddeededeiddeededeiddeededeiddeededeiddeededeiddeededeiddeededeiddeededeidd`eededeiddeededeiddeededeiddeededeiddddeededeiddeededeiddeededeiddeededeiddeededeiddeededeidddefdYZdefdYZdefdYZeededeiddeededeiddeededeidddefdYZdefdYZdefdYZdefdYZdefdYZeededeidd]eededeidd]eededeiddeededeiddeededeidddefdYZdefdYZdefdYZ defdYZ defdYZ eede d eiddd efd YZ d e~fd YZ de}fdYZdefdYZdefdYZdefdYZdefdYZeed\edeiddeededeidddefdYZde~fdYZdefdYZd efd!YZd"efd#YZd$efd%YZd&eefd'YZd(efd)YZd*ezfd+YZd,efd-YZd.efd/YZd0efd1YZd2efd3YZ d4efd5YZ!d6efd7YZ"d8efd9YZ#d:eefd;YZ$d<efd=YZ%d>e%fd?YZ&d@efdAYZ'dBefdCYZ(eedZedDei)ei*Bddeed[ed$ei)ddeedEedFei)ddeedGedHei)ddeedIedJei)ddeedKed0ei)ddeedLe dMei)ddeedNe!dOei)ddeedPe"dQei)ddeedRe%d<ei)ddeedSe&d>ei)ddeedTe(dUeidddVefdWYZ+dXefdYYZ,dZe,fd[YZ-d\e,fd]YZ.d^e,fd_YZ/eed e-d`ei0ei*Bddeede,dXei0ddeedae.d\ei0ddeedbe/d^ei0dddcefddYZ1deefdfYZ2dge2fdhYZ3die3fdjYZ4dke3fdlYZ5dme5fdnYZ6doefdpYZ7eedqe2drei0ddeedse3dtei0ddeedue4dvei0ddeede5dwei0ddeede6dxei0ei*Bddeedye7doei0dddze}fd{YZ8d|efd}YZ9d~e9fdYZ:eede9dei;dddefdYZ<defdYZ=defdYZ>defdYZ?defdYZ@eede@deidezdefdYZAdefdYZBdeBfdYZCdefdYZDdefdYZEdeEfdYZFdeEfdYZGeedeEdeiHddeedeFdeiHddeedeGdeiHdddefdYZIdefdYZJdefdYZKdefdYZLdefdYZMdeMfdYZNdeMfdYZOdeMfdYZPdeMfdYZQdeMfdYZRdeMfdYZSdeMfdYZTdeMfdYZUde}fdYZVdeMfdYZWeedeMdeiXeiBdd]eedeNdeiXdd]eedeOdeiXeiBddeedePdeiXddeedeQdeiXddddeedeRdeiXddddeedeSdeiXdd]eedeTdeiXddeedeUdeiXddeedeWdeiXdddefdYZYdefdYZZdefdYZ[defdYZ\defdYZ]de]fdYZ^de]fdYZ_de\fdYZ`de_fdYZade`fdYZbde_fdYZcde~fdYZddefdYZedefdYZfeede]deigddeede^deigddeede_deigei*BddeedeadeigddeedecdeigeiBddeedefdeigeiBdddefdYZhdefdYZieedeideiHeiBdddefdYZjdefdYZkdefdYZldelfdYZmeedeldeineiBddddeedemdeindddefdYZodefd YZpd epfd YZqd eqfd YZrdefdYZsdeqfdYZtdepfdYZudeufdYZvdepfdYZwdeqfdYZxdexfdYZydefdYZzdefdYZ{d exfd!YZ|eed"epdeiddeed#eqd$eiddeed%erd eiddeed&etdeiddd'efd(YZ}d)efd*YZ~d+e}fd,YZd-e}fd.YZd/efd0YZd1efd2YZd3ezfd4YZd5e}fd6YZeed7e}d8eiddeed9ed+eiddeed:ed;eiddeed<ed=eiddeed>ed?eiddeed@ed5eidd]dAefdBYZdCefdDYZdEefdFYZdGefdHYZdIefdJYZdKezfdLYZdMefdNYZdOefdPYZdQefdRYZdSefdTYZdUefdVYZdWefdXYZdYefdZYZd[efd\YZd]eexfd^YZd_efd`YZeedaedCeieiBddddbeedceddeieiBddeedeedIeieiBddeedfedgeieiBddeedhedieieiBddeedjedkeieiBddeedledWeieiBddeedmed_eidddnefdoYZdpefdqYZdrefdsYZdtefduYZdvefdwYZdxefdyYZdzefd{YZd|efd}YZd~efdYZeededeieiBddeededeieiBddeededteieiBddeededxeieiBddeeded~eieiBddde~fdYZde}fdYZdefdYZeededeidddefdYZdefdYZdefdYZeededeidddefdYZdfdYZde~fdYZdeefdYZdeefdYZdee}fdYZdefdYZdefdYZdefdYZeededei;ddeededei;ei*BdddefdYZdefdYZeededeiHdddefdYZdezfdYZdefdYZdefdYZeededeiddeededeiddde~fdYZdefdYZdefdYZdefdYZde{fdYZdefdYZde{fdYZde~fdYZdefdYZdefdYZeededeiHddddeededeiHddeededeiHddeededeiHdd]dddefdYZdezfdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZeededeidddhddNYZeed?ed@ei;ddeedAedei;ddeedBed#ei;ddeedCedDei;ddeedEedFei;ddeedGed-ei;ddeedHed1ei;eiBddeedIed5ei;eiBddeedJedKeiHeiBdddLefdMYZeedNedOeiHdddPefdQYZdRefdSYZdTefdUYZdVefdWYZdXefdYYZdZefd[YZd\efd]YZeed^ed_einddeed`edaeinddeedbedXeinddeedced\eindddde~fdeYZdfefdgYZeedhedfeiHdddiefdjYZdkefdlYZdmefdnYZdoefdpYZdqefdrYZdsefdtYZeeduedveidddddddddZd[d\feedwedseieiBdddhddN<dxefdyYZdzefd{YZeed|ed}eidddddddddZd[d\fd~efdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZeededeiddddeededeiddeededeiddeededeidddefdYZdefdYZdefdYZ defdYZ eededei eiBdddhdd<eede dei eiBeiBdddhdd<defdYZ de fdYZ eede dei0eiBddeede dei0eiBddde|fdYZde fdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZeededeieiBddeededeieiBddeededeieiBddeededeieiBdddefdYZdefdYZde}fdYZde}fdYZdefdYZeededeieiBeiBdddefdYZeededeieiBeiBddde~fdYZdefdYZdefdYZ defdYZ!defdYZ"defdYZ#defdYZ$defdYZ%defdYZ&de}fdYZ'de'fdYZ(de'fdYZ)de'fdYZ*de'fdYZ+de'fdYZ,de'fdYZ-de'fdYZ.defdYZ/de/fdYZ0de/fdYZ1de/fdYZ2de/fdYZ3de/fdYZ4de/fdYZ5de/fdYZ6de/fdYZ7dZ8e8d e0d ei9eiBdde8d e1dei9eiBdde8d e2dei9dde8d e3dei9dde8de4dei9eiBdde8de5dei9dde8de6dei9dde8de7dei9dd[8defdYZ:defdYZ;defdYZ<de;fdYZ=de<fdYZ>de>fdYZ?d e>fd!YZ@eed"e<d#eiAddd$dfdeBdeed%e>d&eiAddd$dfdeBdd'd(eed)e?d*eiAddd$dfdeBd d'd(eed+e@d,eiAddd$dfdeBdd'd(d-efd.YZCd/eCfd0YZDd1e}fd2YZEd3efd4YZFd5efd6YZGd7efd8YZHd9efd:YZId;efd<YZJeed=eId>eiKddd$eBddeBdd?eBdeed@eJdAeiKdd]d$eBddeBdd?eBddBe}fdCYZLdDefdEYZMdFeMfdGYZNdHeMfdIYZOdJeLfdKYZPdLeMfdMYZQeedNeMdOeiReiBddd$ddfdddddZd[d\feedPeNdQeiReiBddd$ddd`fddddZd[d\feedReOdSeiReiBddd$ddfdddd dddddZd[d\f eedTeQdLeiReiBdddUefdVYZSdWefdXYZTdYefdZYZUd[eUfd\YZVd]eUfd^YZWd_eUfd`YZXdaeUfdbYZYdceUfddYZZdeeZfdfYZ[dgZ8e8dheUdYe8dieVdje8dkeWdle8dmeXdne8doeYdpe8dqeZdre8dse[dt[8duefdvYZ\dwefdxYZ]dye fdzYZ^d{e}fd|YZ_d}e_fd~YZ`defdYZadefdYZbde_fdYZcde_fdYZdde_fdYZede_fdYZfdefdYZgdefdYZhdefdYZide`fdYZjdefdYZkdfdYZldelefdYZmdemfdYZndemfdYZodemfdYZpdemfdYZqdemfdYZrdemfdYZsdemfdYZtdetfdYZudelefdYZvdemfdYZwdewfdYZxdexfdYZydeyfdYZzdZ8e8dendei{dde8deodei{dd]e8depdei{eiBdde8deqdei{eiBdde8derdei{dde8desdei{eiBdde8detdei{dde8deudei{dde8devdei{dde8dewdei{dde8dexdei{dde8deydei{eiBdd]e8dezdei{eiBdd][8deefdYZ|dfdYZ}dfdYZ~dfdYZdfdYZdZdZdZdZe$dZei eei'dS(sPySolshttp://www.oberhumer.com/pysolNisntisplatformsunknownisjavais1.5.2s-%s needs Python 1.5.2 or better (you have %s)(sStringIO(sUserDict(sUserListsmacsV %s cannot find the standard Python libraries. Please check your Python installation. (sPicklers UnpicklersUnpicklingErrors --nosoundi s --bindir=isU %s cannot find the Tkinter Python libraries. Please check your Python installation. s4.82s 20 Aug 2003iRcCst|tijo`yt|}WnEd}x9|D]-}t|djo d}n||}q9WnX|Sn t|}|SdS(Nsi(stypessstypess UnicodeTypesstrsxscsord(ssscsx((spysol.pysustrs  cCsttt|SdS(N(stuplesrangeslensobject(sobject((spysol.pysindicesscCs_|tjott|Sn;|tjott||Sntt|||SdS(N(sstopsNonestuplesrangesstartsstep(sstartsstopsstep((spysol.pystranges   cCstt|SdS(N(srangeslensobject(sobject((spysol.pys range_lenscCst|tijo&t|}|it|}nBt|tijo|}|int|}|i|SdS(N( stypessequencestypess TupleTypeslistslsreversestuplesListType(ssequencesl((spysol.pysreverses    cCso|tjo&ttttt||Sn9g}x%|D]}|i |||fq@Wt|SdS(N( sindicessNonestuplesmapsrangeslensobjectslsisappend(sobjectsindicessisl((spysol.pysiranges &cCsD|tjottt|Sntttt||SdS(N(s conditionsNoneslensfilterssequencesmap(s conditionssequence((spysol.pyscounts cCsH|tjo ti}nx#|D]}||odSq!q!WdSdS(Nii(s conditionsNonesoperatorstruthssequencesobj(s conditionssequencesobj((spysol.pysexistss    cCsI|tjo ti}nx$|D]}|| odSq!q!WdSdS(Nii(s conditionsNonesoperatorstruthssequencesobj(s conditionssequencesobj((spysol.pysforalls   cCs2|djodSn|djodSndSdS(Niii(sexpr(sexpr((spysol.pyssgns   sSubclassResponsibilitycBstZRS(N(s__name__s __module__(((spysol.pysSubclassResponsibilityscOsM|o#t|igt|}n|if}t|||SdS(N(sargsstuplesfsim_classslistsasapplyskw(sfsargsskwsa((spysol.pysstatics#cCs|o|Sn|SdS(N(sexprsval1sval2(sexprsval1sval2((spysol.pysifelsescCsx|iD]q\}}|i|oUt||t|jo|||tZdZdZdZdZdZdZRS(NcKs|ii|dS(N(s_s__dict__supdateskw(s_skw((spysol.pys__init__!scCst|iSdS(N(sstrs_s__dict__(s_((spysol.pys__str__#scKsHx1|iD]#}t||o t|q q W|ii|dS(N(skwskeysskeyshasattrs_sAttributeErrors__dict__supdate(s_skwskey((spysol.pysaddattr%s  cCsLx5|iD]'}|ii| o t|q q W|ii|dS(N(sdictskeysskeys_s__dict__shas_keysAttributeErrorsupdate(s_sdictskey((spysol.pysupdate*s  cCsx|iiD]}t|}|tijog|i|ti }|djotidn|djo&yti |dWnnXdSnx5tdddD]!}yti|WqqXqWy3tidti}ti|ti|WnnXyCti djo,ytiWnnXti||nWnnXxnotidqWndSdS( Nii@sposixis fork failediis /dev/null(sargssfilestuplesosspathsisfileserrorsstrsstatsmodesnamesforkspidswaitpidsrangesfdsclosesopensO_RDWRsdupssetpgrpsexecvs_exit(sfilesargsspidsfdsmode((spysol.pysspawnvmsV      cCs|otii|o.yt||o|SnWnnXtSntiidd}t i |ti }xu|D]m}y]|otii |o?tii||}yt||o|SnWqqXnWqyqyXqyWtSdS(NsPATHs(sfilesosspathsisabssspawnvsargssNonesenvironsgetsstrings splitfieldsspathsepsdirsisdirsjoinsf(sfilesargssfspathsdir((spysol.pysspawnvps,   cCs|ottj Snf}tidjodtfdtff}nxa|D]Y\}}y.t||}|o||fadSnWqNt ot i qqNXqNWtadSdS(Nsposixskmixsgmixii( squerys __SOUND_MIXERsNonesMIXERSsossnamesargssspawnvpsfs tracebacks print_exc(squerysnamesfsargssMIXERS((spysol.pysspawnSystemSoundMixers&   cCs#tidjo tSndSdS(Nsnti(sossnames win32_spawnSystemDisplaySettings(((spysol.pysspawnSystemDisplaySettingss cCstidjot|Sndo tidjo|f}dd|df}dd|ffd |fd |fd |fd |fd |ffd|fff}x>|D]2\}}yt||odSnWqqXqWndSdS(Nsntisposixs-remotesopenURL(s ,new-window)s kfmclientsopenURLsnetscapes netscape4s netscape3s/opt/netscape-3.04/netscape304smozillasgnome-help-browseri(sossnames win32_openURLsurlsnssBROWSERSsargssspawnvp(surlsnamesargssBROWSERSsns((spysol.pysopenURLs Q    s PysolRandomcBstZdZdZdZdZdZdZedZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZRS(NliiiiicCs?|tjo|i}n|i||_|i|_dS(N(sseedsNones_s_getRandomSeedssetSeeds initial_seedsORIGIN_UNKNOWNsorigin(s_sseed((spysol.pys__init__s cCs|i|iSdS(N(s_sstrs initial_seed(s_((spysol.pys__str__scCs|i|_dS(N(s_s initial_seedsseed(s_((spysol.pysresetscCs |iSdS(N(s_sseed(s_((spysol.pysgetSeedscCsr|i|}t|tij o tdnd|jo |ijn o tdn||_|SdS(Nsseeds must be longslsseed out of range( s_s _convertSeedsseedstypestypessLongTypes TypeErrorsMAX_SEEDs ValueError(s_sseed((spysol.pyssetSeeds "  cCs3td}|i|_|ii|i|SdS(Nl(s PysolRandomsrandoms_s __class__s__dict__supdate(s_srandom((spysol.pyscopys  cCs"|t|it|SdS(N(sseqsints_srandomslen(s_sseq((spysol.pyschoicescCs$|t|i|d|SdS(Ni(sasints_srandomsb(s_sasb((spysol.pysrandintscCs tdS(N(sSubclassResponsibility(s_((spysol.pysrandomscCst|SdS(N(slongsseed(s_sseed((spysol.pys _convertSeedscCs$||ijo |dSndSdS(Nll(sseeds_sMAX_SEED(s_sseed((spysol.pys increaseSeeds cCs7ttid}||d?A|id}|SdS(Nf256.0il(slongstimests_sMAX_SEED(s_st((spysol.pys_getRandomSeedscCsgt|d}xP|djoB|id|}||||f\||<||<|d}qWdS(Nii(slensseqsns_srandintsj(s_sseqsjsn((spysol.pysshuffle s  "(s__name__s __module__sMAX_SEEDsORIGIN_UNKNOWNs ORIGIN_RANDOMsORIGIN_PREVIEWsORIGIN_SELECTEDsORIGIN_NEXT_GAMEsNones__init__s__str__sresetsgetSeedssetSeedscopyschoicesrandintsrandoms _convertSeeds increaseSeeds_getRandomSeedsshuffle(((spysol.pys PysolRandoms&            s LCRandom64cBs tZdZdZdZRS(NlcCsQtt|}|ddjo|d }nddt||}|SdS(NisLs0i(sreprslongsseedssslen(s_sseedss((spysol.pysstrs cCs2|idd|i@|_|id?d@dSdS(Nl-*PBlilf 2147483648.0(s_sseedsMAX_SEED(s_((spysol.pysrandoms(s__name__s __module__sMAX_SEEDsstrsrandom(((spysol.pys LCRandom64s s LCRandom31cBs)tZdZdZdZdZRS(NlcCsdt|SdS(Ns%05d(sintsseed(s_sseed((spysol.pysstrscCs.|idd|i@|_|id?dSdS(NlClMif32768.0(s_sseedsMAX_SEED(s_((spysol.pysrandomscCs@|idd|i@|_|t|id?|d|SdS(NlClMii(s_sseedsMAX_SEEDsasintsb(s_sasb((spysol.pysrandint!s(s__name__s __module__sMAX_SEEDsstrsrandomsrandint(((spysol.pys LCRandom31s  sWHRandomcBsGtZddddZdZdZdZdZd ZRS( Nlzs( sressplitsversion_stringsvsstringsfilterstuplesmapsint(sversion_stringsv((spysol.pysget_version_tupleus  sTimercBs/tZddZdZdZdZRS(NscCsH||_ti|_tidjoti|_n|i|_dS(Nsnt(smsgs_stimesclocksossnamesstart(s_smsg((spysol.pys__init__s   cCs|i|_dS(N(s_sclocksstart(s_((spysol.pysresetscCs|i|iSdS(N(s_sclocksstart(s_((spysol.pysgetscCs"d|i|i|ifSdS(Ns%-20s %6.3f seconds(s_smsgsclocksstart(s_((spysol.pys__repr__s(s__name__s __module__s__init__sresetsgets__repr__(((spysol.pysTimer~s   s DataLoadercBsVtZgdZeddZedZedZeedZedZRS(Nc Cswt|_t|tijo |f}nt|titifjpt |}t i i |\}} | o t i}n|i||it i i|dt idjont idjont idjonno t idjo xtdfD] } xddd fD]}yt i i|o|it i i|d | |it i i|d | |it i i|d | |it i i|d | |it i i|d| |it i i|d| nWq%tj oq%Xq%WqWng|_ x|D]}| oq2nyUt i i|} | o!| |i j ot i i| o|i i| nWq2tj oq2Xq2Wx|i D]}d} x_|D]W}y;t i i||}t i i|o| d} nPWqtj oqXqW| t |jo||_PqqWt i!t"|dt"|dS(Nsdatasposixsntsmaciss@prefix@s /usr/locals/usrs share/pysols lib/pysolsshare/games/pysolslib/games/pysolsgames/share/pysolsgames/lib/pysolis: DataLoader could not find (#sNones_sdirstypes filenamesstypess StringTypes TupleTypesListTypesAssertionErrorspathsosssplitsargv0sheadstailscurdirsappendsjoinsnamesVERSIONsvsprefixsisdirsEnvErrorspsnormpathsnpsnsfilenamesfsisfileslenserrorsstr( s_sargv0s filenamesspathsfilenamesfsheadspsprefixstailsvsnpsn((spysol.pys__init__st  &   ' +     icCs|tjo df}n$t|tijo |f}nxP|D]H}tii|i||}tii |}||o|SqDqDW|o-tid|d|idt|ntSdS(NssDataLoader could not find s in s (ssubdirssNonestypestypess StringTypesdirsosspathsjoins_sfilenamesfsnormpathsfuncsdo_raiseserrorsstr(s_sfuncsfilenamessubdirssdo_raisesfsdir((spysol.pys __findFiles     -cCs|itii||SdS(N(s_s_DataLoader__findFilesosspathsisfilesfilenamessubdirs(s_sfilenamessubdirs((spysol.pysfindFilescCsox?tD]7}|itii|||d}|o|SqqWti d|d|i dt |dS(Nis DataLoader could not find image s in s ( sIMAGE_EXTENSIONSsexts_s_DataLoader__findFilesosspathsisfilesfilenamessubdirssfserrorsdirsstr(s_sfilenamessubdirssfsext((spysol.pys findImages " cCs]| otit}ntii|\}}| o|d}n|i ||SdS(Ns.xbm( sfilenamesstringslowersPACKAGEsosspathssplitextsrootsexts_sfindFilessubdirs(s_sfilenamessubdirssextsroot((spysol.pysfindIcons cCs|itii||SdS(N(s_s_DataLoader__findFilesosspathsisdirsfilenamessubdirs(s_sfilenamessubdirs((spysol.pysfindDirs( s__name__s __module__s__init__sNones_DataLoader__findFilesfindFiles findImagesfindIconsfindDir(((spysol.pys DataLoaders  <  sResourcecBstZdZdZRS(NcKsPt|dddddddddddd }tti|f|idS( Nsnamessfilenamesbasenamesabsnamesindexiserrori(sKwStructskwsapplysStructs__init__s_sgetKw(s_skw((spysol.pys__init__s cCstit|iSdS(N(sstringslowerslatin1_to_asciis_sname(s_((spysol.pys getSortKeys(s__name__s __module__s__init__s getSortKey(((spysol.pysResources sResourceManagercBstZdZdZdZdZdZdZdZdZ d Z d Z d Z d Z ed ZdZRS(NcCsCd|_g|_t|_h|_h|_h|_h|_dS(Ni( s_s _selected_keys_objectssNones_objects_by_names_objects_cache_names_objects_cache_filenames_objects_cache_basenames_objects_cache_absname(s_((spysol.pys__init__s      cCs |iSdS(N(s_s _selected_key(s_((spysol.pys getSelectedscCs;d|jot|ijnpt||_dS(Ni(sindexslens_s_objectssAssertionErrors _selected_key(s_sindex((spysol.pys setSelecteds.cCst|iSdS(N(slens_s_objects(s_((spysol.pyslenscCs|idjpt|io|ii|i pt||i|i<|iodti i |i|_ ti i |i|_ ||i |i<||i|i <||i|i d|jot|ijno|i|SntSdS(Ni(sindexslens_s_objectssNone(s_sindex((spysol.pysgets'cCs|ii|SdS(N(s_s_objects_cache_namesgetskey(s_skey((spysol.pys getByNamescCs|ii|SdS(N(s_s_objects_cache_basenamesgetskey(s_skey((spysol.pys getByBasenamescCst|iSdS(N(stuples_s_objects(s_((spysol.pysgetAllscCsY|itjo>td|i}|ittd||_n|iSdS(NcCs|i|fS(N(sobjs getSortKey(sobj((spysol.pysscCs|dS(Ni(sitem(sitem((spysol.pyss(s_s_objects_by_namesNonesmaps_objectsslssortstuple(s_sl((spysol.pysgetAllSortedByNames  cCsvyZ|oOtii|}|otii|o ||j o|i|qYnWntj o }nXdS(N( sdirsosspathsnormpathsisdirsresultsappendsEnvErrorsex(s_sresultsdirsex((spysol.pys_addDir!s(c Cs&t}zti||dt}ti|\}} } xt | D]}yti ||\} } }WnPnX| p| oqFn|djot| tijo=x:ti| tiD]}|i|ti|qWqFqFWWd|tj oyti|Wq!q!XnXdS(Nii(sNoneskswin32apis RegOpenKeyExshkeyssubkeysKEY_READsRegQueryInfoKeysnsubkeyssnvaluesstsrangesis RegEnumValueskeysvaluesvtypestypestypess StringTypesstringssplitsosspathsepsds_s_addDirsresultsstrips RegCloseKey( s_sresultshkeyssubkeysvtypesdsisksnsubkeyssvaluestskeysnvalues((spysol.pys_addRegistryKey)s, #) c Cst|tijo |f}ng} |oLxItiti i |dti D]}|i| ti|qUWnxA|ii|ii|iifD]}| oqntii|}| ptii| oqnx|D]}y|ddjowtiitii||d }|i| |ti|d}|ixA|D]}|i| |qbWn |i| tii||Wqtj o }qXqWqW|i djodG|G|GdG| GHn| SdS(Nsis-*is getSearchDirss->(!stypessearchstypess StringTypesresultsenvsstringssplitsossenvironsgetspathsepsds_s_addDirsstripsapps dataloadersdirsdnsmaintsconfigspathsnormpathsisdirsssjoinsglobsglobdirsssortsEnvErrorsexsdebug( s_sappssearchsenvsdsdirsssexsglobdirssresult((spysol.pys getSearchDirs>s> %!"% # c Cst ogSnddf}tdf} t|tijo |f}ng}x| D]}x|D]}x||D]t}d|t ||f} tt| } ti| d}x5ttfD]'} y|i|| |WqqXqWqrWqeWqXW|idjodG|GdG|GHn|SdS(NsMarkus OberhumerssSoftwares\isgetRegistryDirss->(swin32apisvendorssVERSIONsversionsstypes categoriesstypess StringTypesresultsversionsvendorscategorysPACKAGEstsfiltersNonesstringsjoinssubkeysHKEY_CURRENT_USERsHKEY_LOCAL_MACHINEshkeys_s_addRegistryKeysappsdebug( s_sapps categoriessresultscategorysvendorssversionssubkeysvendorsversionsshkeyst((spysol.pysgetRegistryDirs[s2    (s__name__s __module__s__init__s getSelecteds setSelectedslensregistersgets getByNames getByBasenamesgetAllsgetAllSortedByNames_addDirs_addRegistryKeysNones getSearchDirssgetRegistryDirs(((spysol.pysResourceManagers            sCSIcBstZdZdZdZdZdZdZdZdZ dZ dZ dZ dZ dZd Zhdd <dd <dd <dd <dd<dd<dd<d d<d?d@<dAdB<dCdDti|h|_h|_h|_h|_h|_dS(N(sResourceManagers__init__s_sregistered_typessregistered_sizessregistered_stylessregistered_nationalitiessregistered_dates(s_((spysol.pys__init__s      cCs|i}tii| odSn||i_|tijotd|_ d|_ n|ti jotd|_ d|_ nu|ti jo4d|_ td|_ d|_ td|_n1|tijo4d|_ td|_ d|_ td |_n|tijo%d |_ td|_ d |_ n|tijo)dSd|_ td|_ d |_ n|tijo%d|_ td|_ d |_ nJ|tijo5dSd|_ f|_ d|_ t|i|_ndSdSdS(Nii scshdi iiiiii sabcdefghs abcdefghis abcdefghijisi(scsstypesssCSIsTYPEshas_keyssis TYPE_FRENCHsrangesranksssuitss TYPE_HANAFUDAs TYPE_TAROCKsnbottomsstrumpss TYPE_HEXADECKsTYPE_MUGHAL_GANJIFAsTYPE_NAVAGRAHA_GANJIFAsTYPE_DASHAVATARA_GANJIFAsTYPE_TRUMP_ONLYsncards(s_scsss((spysol.pys_check sR                 cCs|i| odSnt|it|it|i|_|id |_d|i i jo djn o|i |i f\}}|djo |djoti|i _ qY|djo |djoti|i _ qY|djo |d joti|i _ qY|d jo |d joti|i _ qYti|i _ n|i}ttd ||i _x4|i iD]&}|ii|d d|i|]sicCstii|S(N(sCSIs NATIONALITYshas_keyss(ss((spysol.pys`sidcCstii|S(N(sCSIsDATEshas_keyss(ss((spysol.pysds('s_s_checkscsslensranksssuitsstrumpssncardssnamessissizesCARDWsCARDHsCWsCHsCSIs SIZE_TINYs SIZE_SMALLs SIZE_MEDIUMs SIZE_LARGEs SIZE_XLARGEsstylesskeysstuplesfiltersssregistered_stylessgets nationalitiessregistered_nationalitiessyearsdatessregistered_datesstypesregistered_typessregistered_sizessupdateCardbacksResourceManagersregister(s_scssCHskeyssssCW((spysol.pysregisterKsF,%  $ $ $     (s__name__s __module__s__init__s_checksregister(((spysol.pysCardsetManagers  +sTilecBstZdZRS(NcKs8t|dtdd}tti|f|idS(Nscolors text_colors#000000(sKwStructskwsNonesapplysResources__init__s_sgetKw(s_skw((spysol.pys__init__ns (s__name__s __module__s__init__(((spysol.pysTilemss TileManagercBstZRS(N(s__name__s __module__(((spysol.pys TileManagertssSamplecBstZdZRS(NcKs2t|dd}tti|f|idS(Nsvolumei(sKwStructskwsapplysResources__init__s_sgetKw(s_skw((spysol.pys__init__ws (s__name__s __module__s__init__(((spysol.pysSamplevss SampleManagercBstZRS(N(s__name__s __module__(((spysol.pys SampleManager|ssMusiccBstZRS(N(s__name__s __module__(((spysol.pysMusic~ss MusicManagercBstZRS(N(s__name__s __module__(((spysol.pys MusicManagerssGIcOBs tZeiZeiZeiZei Z ei Z ei ZeiZeiZeiZdZdZdZdZdZdZdZdZd Zd Zd Zd Z d Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3d Z4d!Z5d"Z6dd >Z7dd>Z8dd>Z9dd>Z:dd>Z;dd>Z<dd>Z=dd>Z>dd>Z?dd>Z@dd>ZAd#ed$fd%ed$fd&ed$fd'ed$fd(ed$fd)ed$fd*e d$fd+e!d$fd,e$d$fd-e(d$fd.e*d$fd/e,d$fd0e-d$fd1e0d$fd2e2d$fd3e3d$fd4e5d$fd5e6d$fd6ed$fd7ed$fd8ed$fd9ed$ffZBd:ed$fd;e"d$fd<e#d$fd=e&d$fd>e)d$fd?e+d$fd@e'd$fdAe.d$fdBe/d$fdCe4d$ff ZCdDe<e"e#e)e+ee4fdEfdFe<e)e+efdGfd;e<e"dHfd<e<e#dHfdCe<e4dHffZDdDe9e"e#e)e+ee4fdEfdFe9e)e+efdGfd;e9e"dHfd<e9e#dHfdCe9e4dHffZEhddI<d!dJ<dKdL<dMdN<dOdP<dQdJ<dRdS<dTdU<dVdWssBeleaguered Castle types Canfield typesFan typesForty Thieves types FreeCell types Golf types Gypsy types Klondike types Montana types Napoleon types Numerica types Pairing types Raglan types Simple gamess Spider types Terrace types Yukon typesOne-Deck gamessTwo-Deck gamessThree-Deck gamessFour-Deck gamessDashavatara Ganjifa types Hanafuda typesHex A Deck types Matrix typesMughal Ganjifa typesNavagraha Ganjifa types Memory types Poker types Puzzle types Tarock types French typecCs!|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.pysss Ganjifa typecCs!|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.pysscCs!|ii|@o|ii|jS(N(sgissis game_flagssgfs game_typesgt(sgisgfsgt((spysol.pyssijii4iiHisiKi~iRiiiiiXiiDsAtari ST Patiencei'sGnome AisleRioti"i#i(i)i*i+i:i;i\i]i^i_i`idioipiqiiis KDE Patiencei2iisxpat2i6i?iYiYs1.00s1.01s1.02s1.03s1.10s1.11s2.00is2.01iiis2.02s2.90i$s2.99i%s3.00i&i-i.i/i0i1i3i5i7i8i9i<i=i>i@iAiBiCiEiFiGiIiJiLiMiNiOiPiQiSiTiUiViWiZi[iaibicieifigihikils3.10iminiritiuiviwixiii{i|i}is3.20iiiiiiiiiiiiiiiZi[i\i]i^i_i`s3.21iis3.30iiiiiiis3.40iiis4.00iiiiiiiis4.20iiiiiiiiiiiiiis4.30iiiiiis4.41iiiEiDiCiBiAi@ii>iii;i:is4.60iiiis4.70icCsrx|iD]\}}td|}d|t|fGHx|D]}t|ti jpt |i i |o|GHdp t |n|o|i | o|GHdp t |qEqEWq Wg}x|iD]\}}td|}d|t|t|t|fGHx|D]}t|ti jpt |i i |o|GHdp t |n||jo|GHdp t |n|o|i | o|GHdp t |q-q-W|it|qWdGt|GdGH|oc|i}t|d|}t|}x|D]}|i|q?W|o dG|GHqnndS( NcCs |djS(Ni(sid(sid((spysol.pys3ss%-20s: %d gamesis%s: %3d games, %3d totalstotal:sgamescCs|i|idjS(Ni(smsgetsidsplugin(sidsm((spysol.pysKssWARNING: games without version:(s_sGAMES_BY_COMPATIBILITYskeysgamessfilterslensidstypestypessIntTypesAssertionErrorsPROTECTED_GAMESsgetsmanagers all_gamessGAMES_BY_PYSOL_VERSIONsextendslistsgetGamesIdSortedByIdsgsremove(s_smanagers all_gamessgsgamesskeysid((spysol.pysassertGI1sH " (   (Ns__name__s __module__sCSIs TYPE_FRENCHs GC_FRENCHs TYPE_HANAFUDAs GC_HANAFUDAs TYPE_TAROCKs GC_TAROCKs TYPE_MAHJONGGs GC_MAHJONGGs TYPE_HEXADECKs GC_HEXADECKsTYPE_MUGHAL_GANJIFAsGC_MUGHAL_GANJIFAsTYPE_NAVAGRAHA_GANJIFAsGC_NAVAGRAHA_GANJIFAsTYPE_DASHAVATARA_GANJIFAsGC_DASHAVATARA_GANJIFAsTYPE_TRUMP_ONLYs GC_TRUMP_ONLYs GT_1DECK_TYPEs GT_2DECK_TYPEs GT_3DECK_TYPEs GT_4DECK_TYPEsGT_BAKERS_DOZENsGT_BELEAGUERED_CASTLEs GT_CANFIELDsGT_DASHAVATARA_GANJIFAs GT_FAN_TYPEsGT_FORTY_THIEVESs GT_FREECELLsGT_GOLFsGT_GYPSYs GT_HANAFUDAs GT_HEXADECKs GT_KLONDIKEs GT_MAHJONGGs GT_MATRIXs GT_MEMORYs GT_MONTANAsGT_MUGHAL_GANJIFAs GT_NAPOLEONsGT_NAVAGRAHA_GANJIFAs GT_NUMERICAsGT_PAIRING_TYPEs GT_POKER_TYPEsGT_PUZZLE_TYPEs GT_RAGLANs GT_ROW_TYPEsGT_SIMPLE_TYPEs GT_SPIDERs GT_TAROCKs GT_TERRACEsGT_YUKONsGT_BETAs GT_CHILDRENs GT_CONTRIBs GT_HIDDENsGT_OPENs GT_ORIGINALs GT_POPULARs GT_RELAXEDsGT_SCOREsGT_SEPARATE_DECKSs GT_XORIGINALsSELECT_GAME_BY_TYPEsSELECT_SPECIAL_GAME_BY_TYPEsSELECT_ORIGINAL_GAME_BY_TYPEsSELECT_CONTRIB_GAME_BY_TYPEsPROTECTED_GAMESsGAMES_BY_COMPATIBILITYsGAMES_BY_PYSOL_VERSIONs_CHILDREN_GAMESs _OPEN_GAMESs_POPULAR_GAMESsNonesassertGI(((spysol.pysGIs                    Q {{W W&!B6sGameInfoExceptioncBstZRS(N(s__name__s __module__(((spysol.pysGameInfoExceptionQssGameInfoc Bs5tZhdeeededfedZRS(Niii c Cs|t| t| t| }|d@}|d@}ti djot |}n| o |} nt | tijo | f} n| o f} nd|jo djn ot|dt|nd|jo djn ot|dt|n| p"d t| jo d jn ot|d ntii|ot|d t|nxtitiftitiftitiffD]\\}}||@o ||jo|i|q||@ o ||jo||B}qqWd|jo d jn o|ti jo ti!}q |ti"jo ti#}q |ti$jo ti%}q |ti&jo ti'}q |ti(jo ti)}q |ti*jo ti+}q |ti,jo ti-}q ti.}nt/d|d|d|d|d|}|i2|t/i4|d|d|d|d| dt7| d|d|d|d|dt7| dt7| dt7| d|d|dddS( Niismacii?Bs: invalid game ID is: invalid number of decks iis: invalid game names: protected game ID i s game_types game_flagssdeckssredealssncardssids gameclasssnames short_namesaltnamesscategoryssuitssranksstrumpsssisrules_filenamesplugini(9sdecksslenssuitssranksstrumpssncardss game_types game_flagssossnameslatin1_to_asciis short_namestypesaltnamesstypess StringTypesidsGameInfoExceptionsstrsGIsPROTECTED_GAMESsgets GT_CHILDRENs_CHILDREN_GAMESsGT_OPENs _OPEN_GAMESs GT_POPULARs_POPULAR_GAMESsfslsappendscategorys GT_HANAFUDAs GC_HANAFUDAs GT_TAROCKs GC_TAROCKs GT_MAHJONGGs GC_MAHJONGGs GT_HEXADECKs GC_HEXADECKsGT_MUGHAL_GANJIFAsGC_MUGHAL_GANJIFAsGT_NAVAGRAHA_GANJIFAsGC_NAVAGRAHA_GANJIFAsGT_DASHAVATARA_GANJIFAsGC_DASHAVATARA_GANJIFAs GC_FRENCHsStructsredealssgi_sisupdatessis__init__s_s gameclassstuplesrules_filename(s_sids gameclasssnames game_typesdeckssredealsssiscategorys short_namesaltnamesssuitssranksstrumpssrules_filenames game_flagssncardssgi_sisfsl((spysol.pys__init__Tsf$     -4            $(s__name__s __module__sNonesranges__init__(((spysol.pysGameInfoSss GameManagercBsYtZdZdZdZdZdZdZdZdZ d Z RS( NcCsgd|_h|_h|_t|_t|_t|_t|_h|_ h|_ d|_ h|_ dS(Nii( s_s_GameManager__selected_keys_GameManager__gamess_GameManager__gamenamessNones_GameManager__games_by_ids_GameManager__games_by_names!_GameManager__games_by_short_names_GameManager__games_by_altnames_GameManager__all_gamess_GameManager__all_gamenamessloading_pluginsregistered_game_types(s_((spysol.pys__init__s          cCs |iSdS(N(s_s_GameManager__selected_key(s_((spysol.pys getSelectedscCs'|ii|pt||_dS(N(s_s_GameManager__all_gamesshas_keysgameidsAssertionErrors_GameManager__selected_key(s_sgameid((spysol.pys setSelectedscCs|ii|SdS(N(s_s_GameManager__all_gamessgetskey(s_skey((spysol.pysgetscCst|t o tdn|i|_|ii|i otdt |i n|i i|i o%tdt |i dt i n|iiti@odSnnod|i jo djnodSn||i|i <||i |i scCs|dS(Ni(sitem(sitem((spysol.pyss(s_s_GameManager__games_by_namesNonesl1sl2sl3s_GameManager__gamessitemssidsgisstringslowerslatin1_to_asciisnamesappends short_namesaltnamessnssortstuplesmaps!_GameManager__games_by_short_names_GameManager__games_by_altname(s_snamesgisnsl2sl3sl1sid((spysol.pysgetGamesIdSortedByNames(     cCs)|itjo|in|iSdS(N(s_s_GameManager__games_by_namesNonesgetGamesIdSortedByNames!_GameManager__games_by_short_name(s_((spysol.pysgetGamesIdSortedByShortNamescCs)|itjo|in|iSdS(N(s_s_GameManager__games_by_namesNonesgetGamesIdSortedByNames_GameManager__games_by_altname(s_((spysol.pys#getGamesTuplesSortedByAlternateNames( s__name__s __module__s__init__s getSelecteds setSelectedsgetsregistersgetGamesIdSortedByIdsgetGamesIdSortedByNamesgetGamesIdSortedByShortNames#getGamesTuplesSortedByAlternateName(((spysol.pys GameManagers       cCsti||SdS(N(sGAME_DBsregistersgameinfo(sgameinfo((spysol.pys registerGames cCs;|t_tidjodSnt|ttdS(Nsnt(spluginsGAME_DBsloading_pluginsossnamesexecfilesfilenamesglobals(smodnamesfilenamesplugin((spysol.pysloadGames  sAbstractAudioClientcBstZdZdZdZdZdZdZdddd Zd Z d Z dddd Z d Z dZ dZdZdZdZdZdZdZdZdZdZRS(NcCsUt|_t|_d|_t|_h|_d|_d|_d|_ d|_ dS(Nii( sNones_sserversaudiodevs connectedsapps file_cachessample_prioritys sample_loopsmusic_prioritys music_loop(s_((spysol.pys__init__s        cCs|idS(N(s_sdestroy(s_((spysol.pys__del__scCsdS(N((s_((spysol.pys startServerscCsv|pt||_|itj oKy|io d|_nWqrtotin|i qrXndS(Ni( sappsAssertionErrors_sserversNones_connectServers connecteds tracebacks print_excsdestroy(s_sapp((spysol.pys connectServers  cCsT|itj oy|iWq,q,Xnt|_t|_d|_t|_dS(Ni(s_saudiodevsNones_destroysservers connectedsapp(s_((spysol.pysdestroys   cCs|i|idS(N(s_s stopSampless stopMusic(s_((spysol.pysstopAll s iicCs|itjp|i p|iii odSn||ijo|iodSn|ii i |}| p|i odSny:|i|i |||o||_||_dSnWntotiqnXdSdS(Nii(s_saudiodevsNonesappsoptssoundspriorityssample_prioritys sample_loopssample_managers getByNamesnamesobjsabsnames _playSamplesloopsvolumes tracebacks print_exc(s_snamesprioritysloopsvolumesobj((spysol.pys playSample s ,   cCs[|itjodSny|iWntotiqEnXd|_d|_dS(Nii(s_saudiodevsNones _stopSampless tracebacks print_excssample_prioritys sample_loop(s_((spysol.pys stopSampless cCs[|itjodSny|iWntotiqEnXd|_d|_dS(Nii(s_saudiodevsNones_stopSamplesLoops tracebacks print_excssample_prioritys sample_loop(s_((spysol.pysstopSamplesLoop%s cCs|itjp|i p|iii odSn||ijo|iodSn|ii i |}| p|i odSny:|i|i |||o||_||_dSnWntotiqnXdSdS(Nii(s_saudiodevsNonesappsoptssoundsprioritysmusic_prioritys music_loops music_managers getByBasenamesbasenamesobjsabsnames _playMusicsloopsvolumes tracebacks print_exc(s_sbasenamesprioritysloopsvolumesobj((spysol.pys playMusic.s ,   cCs[|itjodSny|iWntotiqEnXd|_d|_dS(Nii(s_saudiodevsNones _stopMusics tracebacks print_excsmusic_prioritys music_loop(s_((spysol.pys stopMusic>s cCsdSdS(Ni((s_((spysol.pys_connectServerGscCsdS(N((s_((spysol.pys_destroyIscCsdSdS(Ni((s_snamesprioritysloop((spysol.pys _playSampleKscCsdS(N((s_((spysol.pys _stopSamplesMscCs|idS(N(s_s _stopSamples(s_((spysol.pys_stopSamplesLoopOscCsdSdS(Ni((s_snamesprioritysloopsvolume((spysol.pys _playMusicQscCsdS(N((s_((spysol.pys _stopMusicSscCsdSdS(Ni((s_((spysol.pys getMusicInfoUscCsdS(N((s_s music_list((spysol.pysplayContinuousMusicWscCsdS(N((s_((spysol.pys playNextMusicYscCsdS(N((s_((spysol.pysupdateSettings[s(s__name__s __module__s__init__s__del__s startServers connectServersdestroysstopAlls playSamples stopSamplessstopSamplesLoops playMusics stopMusics_connectServers_destroys _playSamples _stopSampless_stopSamplesLoops _playMusics _stopMusics getMusicInfosplayContinuousMusics playNextMusicsupdateSettings(((spysol.pysAbstractAudioClients,              sPysolSoundServerModuleClientcBs}tZdZdZdZdZdZdZdZdZ d Z d Z d Z d Z d ZRS(NcCsXy#t|_|iid|_Wn.totint|_t|_nXdS(Ni(spysolsoundservers_saudiodevsinitsservers tracebacks print_excsNone(s_((spysol.pys startServer^s    cCs|ii|SdS(N(s_saudiodevscmd(s_scmd((spysol.pyscmdgscCsQ|id}|djodSndo |iio|idndSdS(Ns protocol 6isdebug 1i(s_scmdsrsappsdebug(s_sr((spysol.pys_connectServeris  cCs|iidS(N(s_saudiodevsexit(s_((spysol.pys_destroypscCs(|id|d|||fdSdS(Nsplaywav '%s' %d %d %d %dii(s_scmdsfilenamesprioritysloopsvolume(s_sfilenamesprioritysloopsvolume((spysol.pys _playSamplers cCs|iddS(Nsstopwav(s_scmd(s_((spysol.pys _stopSamplesuscCs|iddS(Ns stopwavloop(s_scmd(s_((spysol.pys_stopSamplesLoopwscCs(|id|d|||fdSdS(Nsplaymus '%s' %d %d %d %dii(s_scmdsfilenamesprioritysloopsvolume(s_sfilenamesprioritysloopsvolume((spysol.pys _playMusicys cCs|iddS(Nsstopmus(s_scmd(s_((spysol.pys _stopMusic|scCs#|io|iiSndSdS(Ni(s_saudiodevs getMusicInfo(s_((spysol.pys getMusicInfo~s cCs|itjp|i odSny_d}xE|D]=}|io-|id|i|i d||i fq3q3W|idWnt ot i qnXdS(Ni?Bsqueuemus '%s' %d %d %d %dis startqueue( s_saudiodevsNonesappsloops music_listsmusicsabsnamescmdsindexsvolumes tracebacks print_exc(s_s music_listsmusicsloop((spysol.pysplayContinuousMusics 1cCs|iddS(Nsnextmus(s_scmd(s_((spysol.pys playNextMusicscCs|itjp|i odSnddf\}}|iiio"|iii}|iii }ny&|i d||i d|Wnt ot i qnXdS(Nis setwavvol %ds setmusvol %d( s_saudiodevsNonesappsssmsoptssoundssound_sample_volumessound_music_volumescmds tracebacks print_exc(s_smss((spysol.pysupdateSettingss(s__name__s __module__s startServerscmds_connectServers_destroys _playSamples _stopSampless_stopSamplesLoops _playMusics _stopMusics getMusicInfosplayContinuousMusics playNextMusicsupdateSettings(((spysol.pysPysolSoundServerModuleClient]s          sWin32AudioClientcBs#tZdZdZdZRS(NcCsBy"dk}||_~d|_Wnt|_t|_nXdS(Ni(swinsounds_saudiodevsserversNone(s_swinsound((spysol.pys startServers    cCs|i}|i|iB|iB|iB}|o||i B}n||i jo||i B}ny|i ||dSWnnXdSdS(Nii(s_saudiodevsas SND_FILENAMEs SND_NODEFAULTs SND_NOWAITs SND_ASYNCsflagssloopsSND_LOOPspriorityssample_prioritys SND_NOSTOPs PlaySoundsfilename(s_sfilenamesprioritysloopsvolumesasflags((spysol.pys _playSamples cCs-|i}|i|iB}|it|dS(N(s_saudiodevsas SND_NODEFAULTs SND_PURGEsflagss PlaySoundsNone(s_sasflags((spysol.pys _stopSampless (s__name__s __module__s startServers _playSamples _stopSamples(((spysol.pysWin32AudioClients cCsS|itj o?x/|iD]$}y|ii|WqqXqWt|_ndS(N(s_s _tclCommandssNonesnamestks deletecommand(s_sname((spysol.pys Misc__destroys cCs&|i|id|f|||SdS(Nsbind(s_s_binds_wstagOrIdssequencesfuncsadd(s_stagOrIdssequencesfuncsadd((spysol.pysCanvas__tag_bindscGs| o#|i|ii|idSn|ddjo|it|dSn4|ddjo"|it |d|dSndS(Nsxviewismovetoisscrolli( sargss_s _getdoublesstkscalls_ws xview_movetosfloats xview_scrollsint(s_sargs((spysol.pys Canvas__xviews #cCs/t|d}|ii|idd|SdS(Nf0.0sxviewsmoveto(smaxsfractions_stkscalls_w(s_sfraction((spysol.pysCanvas__xview_movetoscCsn|djo>|i|ii|id}|ddjodSqKn|ii|idd||SdS(Nisxviewf0.0001sscroll(snumbers_s _getdoublesstkscalls_wsvswhat(s_snumberswhatsv((spysol.pysCanvas__xview_scrolls  ! cGs| o#|i|ii|idSn|ddjo|it|dSn4|ddjo"|it |d|dSndS(Nsyviewismovetoisscrolli( sargss_s _getdoublesstkscalls_ws yview_movetosfloats yview_scrollsint(s_sargs((spysol.pys Canvas__yviews #cCs/t|d}|ii|idd|SdS(Nf0.0syviewsmoveto(smaxsfractions_stkscalls_w(s_sfraction((spysol.pysCanvas__yview_movetoscCsn|djo>|i|ii|id}|ddjodSqKn|ii|idd||SdS(Nisyviewf0.0001sscroll(snumbers_s _getdoublesstkscalls_wsvswhat(s_snumberswhatsv((spysol.pysCanvas__yview_scrolls  ! cCs |iidd|i|SdS(Nswmsstate(s_stkscalls_wsnewstate(s_snewstate((spysol.pys Wm__wm_statescCs |ii|idd|SdS(Nsxviewsmoveto(s_stkscalls_wsfraction(s_sfraction((spysol.pysText__xview_movetoscCs#|ii|idd||SdS(Nsxviewsscroll(s_stkscalls_wsnumberswhat(s_snumberswhat((spysol.pysText__xview_scrollscCs |ii|idd|SdS(Nsyviewsmoveto(s_stkscalls_wsfraction(s_sfraction((spysol.pysText__yview_movetoscCs#|ii|idd||SdS(Nsyviewsscroll(s_stkscalls_wsnumberswhat(s_snumberswhat((spysol.pysText__yview_scrollscCs|ii|iSdS(N(s_scanvassbboxsid(s_((spysol.pysCanvasItem__bboxscCs|ii|iSdS(N(s_scanvassbboxsid(s_((spysol.pys Group__bboxscCs |ii|i|||SdS(N(s_scanvasstag_bindsidssequencescommandsadd(s_ssequencescommandsadd((spysol.pysCanvasItem__bindscCs |ii|i|||SdS(N(s_scanvasstag_bindsidssequencescommandsadd(s_ssequencescommandsadd((spysol.pys Group__bindscCs|ii|i||SdS(N(s_scanvass tag_unbindsidssequencesfuncid(s_ssequencesfuncid((spysol.pysCanvasItem__unbindscCs|ii|i||SdS(N(s_scanvass tag_unbindsidssequencesfuncid(s_ssequencesfuncid((spysol.pys Group__unbindscCs|ii|i|SdS(N(s_scanvass tag_raisesids abovethis(s_s abovethis((spysol.pysCanvasItem__tkraisescCs|ii|i|SdS(N(s_scanvass tag_lowersids belowthis(s_s belowthis((spysol.pysCanvasItem__lowerscCs|ii|i|SdS(N(s_scanvass tag_raisesids abovethis(s_s abovethis((spysol.pysGroup__tkraisescCs|ii|i|SdS(N(s_scanvass tag_lowersids belowthis(s_s belowthis((spysol.pys Group__lower scGs4|iot|i|}nt|i|SdS(N(s_ssubstsapplysargssfunc(s_sargs((spysol.pysCallWrapper____call__s stkis.sbreakshand1swatchcCs@||f}ti|}|o|Snddf}|ddddfjoddf}n|dfjodd f}n|d fjoJ|d jotd}q.|d jodd f}q.ddf}nV|dfjoddf}n6|dfjoddf}n|dfj on|t|<|SdS(Ns Helveticas-14scanvass canvas_smallssmalls tree_smalls-12s canvas_larges-18s canvas_cardiGi9s-16s canvas_fixedsCouriersfixedsdefault(snamescardwskeys getFont_cachesgetsfontsgetFont(snamescardwskeysfont((spysol.pysgetFont3s.     cCs|idS(N(swindows wm_withdraw(swindow((spysol.pys wm_withdrawLscCsrtidjotddddfj}|o5y|i|iWqdtij oqdXn|i dS(Nsntiii( sossnames tkversionsneed_fixswindows wm_iconifysupdate_idletaskssTkintersTclErrors wm_deiconify(swindowsneed_fix((spysol.pys wm_deiconifyNs(  cCsM|idjo6|o tidjo|idqIt|ndS(Nsiconicsntszoomed(swindowswm_states maximizedsossnames wm_deiconify(swindows maximized((spysol.pyswm_mapWscCsJ| odSntidjo&|id||id|ndS(Nsposixs@(sfilenamesossnameswindows wm_iconbitmaps wm_iconmask(swindowsfilename((spysol.pys wm_set_icon]s s%^(\d+)x(\d+)\+([\-]?\d+)\+([\-]?\d+)$cCs|i}ti|}| otidt|nt t |i }|i djod|d<|d  "    " ++cCsntid|d|}|i|jpt|i|jpt|it||||SdS(Nswidthsheight( sTkinters PhotoImageswidthsheightsimagesAssertionErrorsblanks fillImagesfillsoutline(swidthsheightsfillsoutlinesimage((spysol.pys createImages  sMfxCanvasGroupcBs2tZedZddZdZdZRS(NcCsTtii|d|d||iii|i pt ||ii|ii(sbinds_stopsmCancelsfocussNones setTransientsparentsgrab_setsTkintersTclErrorstimeoutsaftersmTimeoutstimersmainloops SystemExitsdestroy(s_sfocusstimeout((spysol.pysmainloop s  cCst|it|iy|iiWntotiqJnXy|iiWntotiqznXt |i|i oXy5t |i do|i i n|i i WqtotiqqXnt|_t|_ dS(Ns busyUpdate(s after_cancels_stimersunbind_destroystops wm_withdraws tracebacks print_excsdestroysdestructsparentshasattrs busyUpdatesupdatesNone(s_((spysol.pysdestroy s4     cCstdSdS(Nsdefault(sgetFont(s_((spysol.pysgetDefaultFont3 scGsd|_tdS(Ni(s_sstatuss SystemExit(s_sevent((spysol.pyswmDeleteWindow5 s cGsd|_tdS(Ni(s_sstatuss SystemExit(s_sevent((spysol.pysmCancel8 s cGsd|_tdS(Ni(s_sstatuss SystemExit(s_sevent((spysol.pysmTimeout; s ( s__name__s __module__sNonesimgs__init__smainloopsdestroysgetDefaultFontswmDeleteWindowsmCancelsmTimeout(((spysol.pys_ToplevelDialogs"    s MfxDialogcBs>tZdZdZdZdZdZdZRS(Nc Ks|i|}ti||||i|i|i |\}}|i |||i|_ ti|d|id|id|id|i}|idtiddd|id |i|i||}|i||idS( Nstextsjustifyswidthsfontsfillsexpandispadxspady(s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssbuttonsTkintersLabelstextsjustifyswidthsfontsmsgspacksBOTHspadxspadys createButtonssfocussmainloopstimeout(s_sparentstitleskws top_framesfocuss bottom_framesmsg((spysol.pys__init__? s +c(Cst|dddddddddd fd dd dd |id |idddddtdddddddtdddddd}dt|idj}t|i d||SdS(Nstimeoutis resizablestextssjustifyscentersstringssOKsdefaultswidthsfonts buttonfontspadxispadysbitmaps bitmap_sideslefts bitmap_padxi s bitmap_padysimages image_sides image_padxs image_padyiisseparatorwidth( sKwStructskws_sgetDefaultFontsNoneslensstringsssws kwdefaults__dict__(s_skwssw((spysol.pysinitKwJ s     c Csti|i}|idtidtidd|i djoWti|iddd|i d |i d |i d }|idtidti nti|i}|idti dtid d ||fSdS(Nssidesfillsipadyiisreliefssunkensheightswidths borderwidthisexpandi(sTkintersFrames_stops bottom_framespacksBOTTOMsBOTHskwsseparatorwidths separatorsXs top_framesTOP(s_skws top_frames bottom_frames separator((spysol.pys createFramesY s" "cCs ddddg}|i|joQti|d|i|i|i}|i d|i d|i d|i n|ioAti|d |i}|i d|i d|i d|i nL|ioAti|d|i}|i d|id|id|indS( Nserrorsinfos questheadswarningsimagessidespadxspadysbitmap(sbmskwsbitmapsTkintersLabelsframes_simgsindexsbspacks bitmap_sides bitmap_padxs bitmap_padysimages image_sides image_padxs image_pady(s_sframeskwsbsbm((spysol.pys createBitmapsd s() ) c Csd} } |idd|iddf\}}t}d}xj|i D]_} t | t i jo| d} n| o.tidd| } t|t| }qJqJWx|i D]} | d }} t | t i jo8t| d jptt| d } | d} n| tjoqn| djo.ti|d | d |id d}|} n^ti|d | d |iddd|| d}| |ijo|}|iddnt| } no | |jo&| || d } |id| n| d } |id| ddddd|d||i| qW|tj o?t||id} t |i!d| t |i!d| n|SdS(Nis buttonpadxi s buttonpadyiis[\s\.\,]siistextsfontsstatesdisabledsdefaultsnormalscommandcCs |i|S(N(s_smDonesbutton(s_sbutton((spysol.pys ssactiveswidthscolumnsrowsstickysewspadxspadycCs |i|S(N(s_smDonesbutton(sevents_sbutton((spysol.pys sss ("sbuttonscolumnskwsgetspadxspadysNonesfocussmax_lensstringsssstypestypess TupleTypesressubsmaxslensxbuttonsAssertionErrorsintsTkintersButtonsframes buttonfontsbs_sdefaultsconfigslsgrid_configuresgrid_columnconfiguresbindstop( s_sframeskwsfocussmax_lenspadyspadxsxbuttonsbscolumnsbuttonslss((spysol.pys createButtonso sP *    $   ( cCs||_tdS(N(sbuttons_s SystemExit(s_sbutton((spysol.pysmDone s (s__name__s __module__s__init__sinitKws createFramess createBitmapss createButtonssmDone(((spysol.pys MfxDialog> s   (sMfxExceptionDialogcBstZddZRS(NsErrorcKst|dd}t|idd}|o|ddjo|d}n|d}t|to |it j o&d|i |i t |if}n t|}|||_tti|||f|idS(Nsbitmapserrorstextsis s[Errno %s] %s: %s(sKwStructskwsstrsgetstexts isinstancesexsEnvironmentErrorsfilenamesNoneserrnosstrerrorsreprstsapplys MfxDialogs__init__s_sparentstitlesgetKw(s_sparentsexstitleskwstextst((spysol.pys__init__ s  &  (s__name__s __module__s__init__(((spysol.pysMfxExceptionDialog ssMfxSimpleSlidercBs#tZdZdZdZRS(Nc Ks|i|}ti||||i|i|i |\} } |i | |||_ ti|_|ii|ti| d|d|d|dtiddd|d|id d } | id tid |id |i|i| |} |i| |i dS(Nsfrom_stos resolutionsorientslengths3islabelsvariables takefocusissidespadxspady(!s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssvaluesTkinters DoubleVarsvarssetsScalesfrom_stos resolutions HORIZONTALslabelssliderspacksTOPspadxspadys createButtonssfocussmainloopstimeout( s_sparentstitleslabelsvaluesfrom_stos resolutionskws top_framesfocusssliders bottom_frame((spysol.pys__init__ s !%cCs8t|dddfdddd}ti||SdS(NsstringssOKsCancelsdefaultisseparatorwidth(sKwStructskws MfxDialogsinitKws_(s_skw((spysol.pysinitKw s cCs%||_|ii|_tdS(N(sbuttons_svarsgetsvalues SystemExit(s_sbutton((spysol.pysmDone s (s__name__s __module__s__init__sinitKwsmDone(((spysol.pysMfxSimpleSlider s  sMfxSimpleEntrycBstZdZRS(Nc Ks/|i|}ti||||i|i|i |\}} |i ||||_ |o/ti|d|dd}|iddn|idd}ti|ddd ||_|iid||iid tid |id|i|i| |}|i}|i||idS( Nstexts takefocusispadyise_widthsexportselectioniswidthssidespadx(s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssvalueslabelsTkintersLabelspacksgetswsEntrysvarsinsertsTOPspadxspadys createButtonssfocussmainloopstimeout( s_sparentstitleslabelsvalueskws top_framesfocussws bottom_frame((spysol.pys__init__ s ( (s__name__s __module__s__init__(((spysol.pysMfxSimpleEntry ss MfxTooltipcBsGtZdZdZdZdZdZdZdZRS(NcCs||_t|_t|_t|_t|_g|_|ii|ii d|i |ii|ii d|i |ii|ii d|i d|_ t i|_t i|_d|_d|_d|_d|_dS( Nsss is#000000s#ffffe0ii(swidgets_sNonestextstimerstooltipslabelsbindingssappendsbinds_enters_leavestimesTkintersSOLIDsreliefsLEFTsjustifysfgsbgsxoffsetsyoffset(s_swidget((spysol.pys__init__ s       """      cCs ||_dS(N(stexts_(s_stext((spysol.pyssetText scCss|io|io[|iid|id|iid|id|iid|idg|_ndS(Nsisis i(s_sbindingsswidgetsunbind(s_((spysol.pys_unbind s cCs|i|idS(N(s_s_unbinds_leave(s_((spysol.pysdestroy s cGs/t|it|i|i|i|_dS(N(s after_cancels_stimersafterswidgetstimes_showTip(s_sevent((spysol.pys_enter s cGsnt|it|_|ioJ|iit|it|_|iit|it|_ndS(N(s after_cancels_stimersNonestooltipslabelsdestroysdestruct(s_sevent((spysol.pys_leave s        cCsx|ip|i odSn|ii}|tifjo#|idtijodSq_n|ii }|ii |ii }||i}||i}ti|_|ii|iid|iid|iti|id|id|id|id|id|id dd d |_|iid dd d|iid||f|iidS(NsstateisWM_DELETE_WINDOWstextsreliefsjustifysfgsbgsbds takefocusisipadxsipadys%+d%+d(s_stooltipstextswidgets __class__scsTkintersButtonsDISABLEDs winfo_rootxsxs winfo_rootys winfo_heightsysxoffsetsyoffsetsToplevels wm_iconifyswm_overrideredirects wm_protocolsdestroysLabelsreliefsjustifysfgsbgslabelspacks wm_geometrys wm_deiconify(s_sysxsc((spysol.pys_showTip s(     '( s__name__s __module__s__init__ssetTexts_unbindsdestroys_enters_leaves_showTip(((spysol.pys MfxTooltip s      sMfxScrolledCanvascBstZdddZdZdZdZdZdZdZd Z e d Z e d Z d Z d ZdZddZddZdZdZdZdZdZdZdZdZdZdZRS(Nic Ks|id|id}t|d|dddddd||_|i|t|_ t|_ ||_ t|_ ||_ d|_d|_d|_t|_|i||iiddd|iiddd|o|d jo:d }totid }n|iidd |n|i|| ot|i d |in|in|ox|d jo:d }totid }n|iidd |n|i|t|i d |i|indS(Nsbgshighlightthicknessisxscrollincrementisyscrollincrementsweightiiisminsizesi(skwsgetsparentscgetsbgs kwdefaults_s createFramesNonescanvasshbars hbar_modesvbars vbar_modes hbar_shows vbar_showsresize_pendingstimers createCanvassframesgrid_rowconfiguresgrid_columnconfigureswswin32apisGetSystemMetricss createHbarsbinds_mapBarsbindHbars createVbarsbindVbar(s_sparentshbarsvbarskwsbgsw((spysol.pys__init__ sH                cCs>t|it|_|i|ii|iidS(N(s after_cancels_stimersNones unbind_allscanvassdestroysframe(s_((spysol.pysdestroy7 s     cKst|iif|dS(N(sapplys_sframespackskw(s_skw((spysol.pyspack= scCs8t|it|it|it|idS(N(sunbind_destroys_shbarsvbarscanvassframe(s_((spysol.pys unbind_all? s   cCsI|id}|id}ti|id|d|dt|_ dS(Nswidthsheightsbg( skwsgetswidthsheightsTkintersFrames_sparentsNonesframe(s_skwsheightswidth((spysol.pys createFrameD scCsAtti|if||_|iidddddddS(Nsrowiscolumnsstickysnews(sapplysTkintersCanvass_sframeskwscanvassgrid(s_skw((spysol.pys createCanvasH sc CsTti|iddd|dddd|_|i|id<|ii|id s(swsNones_scanvassbinds unit_lefts unit_right(s_sw((spysol.pysbindHbarS s  cCs|tjo |i}nt|d|it|d|it|d|it|d|it|d|i t|d|i t|d|i dS(Nsss ssss( swsNones_scanvassbindspage_ups page_downsunit_ups unit_downs scroll_tops scroll_bottom(s_sw((spysol.pysbindVbarX s  cCsP|ii}|i}|iod|_|ii n|i|dS(Ni( seventswidgetswinfo_toplevelstops wm_geometrysgs_sresize_pendingscanvassupdate_idletasks(s_seventsgstop((spysol.pys_mapBarb s    cGs!t|ii||idS(N(sapplys_shbarssetsargssshowHbar(s_sargs((spysol.pys_setHbari scGs!t|ii||idS(N(sapplys_svbarssetsargssshowVbar(s_sargs((spysol.pys_setVbarl sicCs|i odSn|djo |i}n|djo]|ii odSn|ii}t|ddjpt|dddj}n||i jodSn|o#|ii ddddddn|ii ||_ dSdS( Niif0.0001f1.0srowscolumnsstickyswe( s_shbarsshows hbar_modescanvasswinfo_ismappedsxviewsviewsabss hbar_showsgrids grid_forget(s_sshowsview((spysol.pysshowHbaro s     5#  cCs|i odSn|djo |i}n|djo]|ii odSn|ii}t|ddjpt|dddj}n||i jodSn|o#|ii ddddddn|ii ||_ dSdS( Niif0.0001f1.0srowscolumnsstickysns( s_svbarsshows vbar_modescanvasswinfo_ismappedsyviewsviewsabss vbar_showsgrids grid_forget(s_sshowsview((spysol.pysshowVbar s     5#  cGs|iidddSdS(Nispagesbreak(s_scanvass yview_scroll(s_sevent((spysol.pyspage_up scGs|iidddSdS(Nispagesbreak(s_scanvass yview_scroll(s_sevent((spysol.pys page_down scGs|iidddSdS(Nisunitsbreak(s_scanvass yview_scroll(s_sevent((spysol.pysunit_up scGs|iidddSdS(Nisunitsbreak(s_scanvass yview_scroll(s_sevent((spysol.pys unit_down scGs|iidddSdS(Nispagesbreak(s_scanvass xview_scroll(s_sevent((spysol.pys page_left scGs|iidddSdS(Nispagesbreak(s_scanvass xview_scroll(s_sevent((spysol.pys page_right scGs|iidddSdS(Nisunitsbreak(s_scanvass xview_scroll(s_sevent((spysol.pys unit_left scGs|iidddSdS(Nisunitsbreak(s_scanvass xview_scroll(s_sevent((spysol.pys unit_right scGs|iiddSdS(Nisbreak(s_scanvass yview_moveto(s_sevent((spysol.pys scroll_top scGs|iiddSdS(Nisbreak(s_scanvass yview_moveto(s_sevent((spysol.pys scroll_bottom s(s__name__s __module__s__init__sdestroyspacks unbind_alls createFrames createCanvass createHbars createVbarsNonesbindHbarsbindVbars_mapBars_setHbars_setVbarsshowHbarsshowVbarspage_ups page_downsunit_ups unit_downs page_lefts page_rights unit_lefts unit_rights scroll_tops scroll_bottom(((spysol.pysMfxScrolledCanvas s2%                      sMfxScrolledTextcBs8tZedZdZdZdZdZRS(NcKsh}xP|iD]B}t|tijp |djo||||<||=qqW|ido|d|dsss foregroundsblues underlinei( s_sanchorsurlstagstextstag_adds anchor_markstag_bindscreateCallbacks anchor_enters anchor_leaves tag_configsNone(s_surlstag((spysol.pys anchor_end s   cGs|iid|iidS(Nscursor(s_stextsconfigsviewers handcursor(s_sargs((spysol.pys anchor_enter scGs|iid|iidS(Nscursor(s_stextsconfigsviewers defcursor(s_sargs((spysol.pys anchor_leave scCs|io)|ii|i|idt|_n|o|iid|_|ii|do|d|_q|do d|_q|do d|_q|do d|_qt|_ndS( Nsinsertiispreisboldisitalic( s_sfontstextstag_adds font_marksNonesindexsfontmapshas_key(s_sfont((spysol.pysnew_font s        cCsd||_dS(Ns (slevels_sindent(s_smarginslevel((spysol.pys new_margin- scCs|i|i|ddS(Ns (s_s_tkHTMLWriter__writesindentsdata(s_sdata((spysol.pyssend_label_data/ scCsY|idjo|idn|djo|id|nd|_d|_dS(Nis (s_scols_tkHTMLWriter__writes blanklinesatbreak(s_s blankline((spysol.pyssend_paragraph1 s   cGsQtt|idd}|id||idd|_d|_dS(Nswidthf0.90000000000000002s_s i(sints_stextswidths_tkHTMLWriter__writescolsatbreak(s_sargsswidth((spysol.pys send_hor_rule8 s   (s__name__s __module__s__init__screateCallbackswrites_tkHTMLWriter__writes anchor_bgns anchor_ends anchor_enters anchor_leavesnew_fonts new_marginssend_label_datassend_paragraphs send_hor_rule(((spysol.pys tkHTMLWriter s '         s tkHTMLParsercBs,tZdZdZdZdZRS(NcCs6tii|||||iii|||dS(N( shtmllibs HTMLParsers anchor_bgns_shrefsnamestypes formatterswriter(s_shrefsnamestype((spysol.pys anchor_bgn? scCs+|io t|_n|iiidS(N(s_sanchorsNones formatterswriters anchor_end(s_((spysol.pys anchor_endB s  cCs|iid|idS(Ni(s_s formatters end_paragraphsddpop(s_sattrs((spysol.pysdo_dtF scCs)|iiii||||||dS(N( s_s formatterswritersviewers showImagessrcsaltsismapsalignswidthsheight(s_ssrcsaltsismapsalignswidthsheight((spysol.pys handle_imageI s(s__name__s __module__s anchor_bgns anchor_endsdo_dts handle_image(((spysol.pys tkHTMLParser> s   s tkHTMLViewercBstZdZdZdZdZdZdZdZdZ d Z e d d Z d Z d d d d dZd d dZdZdZdZdZdZdZRS(NcCs||_t|_t|_tdgdd|_g|_|d|_d|_ t i |}|_ |i dddd t i|d d d |i|_|ii dd t i|d dd |i|_|ii dd t i|d dd |i|_|ii dd t i|d dd |i|_|ii ddddf}tidjoddf}nt|ddddd|id|dddddd|_|ii dd dd!d"d#|idS($Nslistsindexiscursorshand2ssidesbottomsfillsxstextsIndexscommandsleftsBacksForwardsClosesrights Helveticai sntsTimes New Romansfgs#000000sbgs#f7f3ffsfontswrapswordspadxispadystopsbothsexpandi(sparents_sNoneshomesurlsStructshistorysimagess defcursors handcursorsTkintersFramesframespacksButtonsgoHomes homeButtonsgoBacks backButtons goForwards forwardButtonsdestroys closeButtonsbasefontsossnamesMfxReadonlyScrolledTextstexts initBindings(s_sparentsbasefontsframe((spysol.pys__init__L s@           cCs|i}t|d|it|d|it|d|it|d|it|d|it|d|it|d|i t|d|i t|d |i t|d |i dS( NsWM_DELETE_WINDOWssss sssss( s_sparentswsbindsdestroyspage_ups page_downsunit_ups unit_downs scroll_tops scroll_bottomsgoBack(s_sw((spysol.pys initBindingso s cGsPt|iy|iiWnnXy|iiWnnXt|_dS(N(sunbind_destroys_sparents wm_withdrawsdestroysNone(s_sevent((spysol.pysdestroy{ s cGs|iidddSdS(Nispagesbreak(s_stexts yview_scroll(s_sevent((spysol.pyspage_up scGs|iidddSdS(Nispagesbreak(s_stexts yview_scroll(s_sevent((spysol.pys page_down scGs|iidddSdS(Nisunitsbreak(s_stexts yview_scroll(s_sevent((spysol.pysunit_up scGs|iidddSdS(Nisunitsbreak(s_stexts yview_scroll(s_sevent((spysol.pys unit_down scGs|iiddSdS(Nisbreak(s_stexts yview_moveto(s_sevent((spysol.pys scroll_top scGs|iiddSdS(Nisbreak(s_stexts yview_moveto(s_sevent((spysol.pys scroll_bottom sicCs|tjo |i}ntii|}|o|otii| oxtii |\}}tii |\}}t||djotii|||}ntii|}n|SdS(Ni(sbaseurlsNones_surlsosspathsnormpathsrelpathsisabsssplitsh1st1sh2st2scmpsjoin(s_surlsbaseurlsrelpathsh1st2st1sh2((spysol.pysbasejoin s  "cCsf|ddjptii|otii|d}ntii|}t|d|fSdS(Nis/s index.htmlsrb(surlsosspathsisdirsjoinsnormpathsopen(s_surl((spysol.pysopenfile s$icCs-|iido/|io |iio|iiiqBnx|ddddddfD]b}ti||djoCt | o-|i t d d |d d d |ndSq[q[W|i |d|}y;t} |i|\} }| i} | it} Wn}tj oA} | o| in|i d|dt| dSn2| o| in|i d|dSnX||_ |itjo|i |_n|o |i|i d|d|n|iidjo|ii ddn|ii dd|iit!|ii"jo|i#i ddn|i#i dd|i$|i%f\}}d|_$|_%|i(i d|i$|i(i)|i*i d|i$|i*i)|i(i dd|i(i+ddg|_,t-|i(|} t/i0| } t2| }|i4| |i|i(i ddd|jo djno|i(i5|nd|jo djno|i(i6|n|i7i8|i9|i7i:|i9||f\|_$|_%|i(i d|i$|i*i d|i$dS(Nsappsftp:sgopher:shttp:smailto:snews:stelnet:is HTML limitation: sThe s! protocol is not supported yet. s%Please use your standard web browser sto open the following URL: srelpathsUnable to service request: s sxviewsyviewisstatesnormalsdisabledswatchscursors1.0sendf0.0f1.0(;s_s__dict__sgetsappsgames _cancelDragspsstringsfindsurlsopenURLs errorDialogsPACKAGEsbasejoinsrelpathsNonesfilesopenfilesreadsdatascloses Exceptionsexsstrshomesadds addHistorysxviewsyviewshistorysindexs backButtonsconfigslenslists forwardButtons defcursors handcursorsold_c1sold_c2stextsupdate_idletaskssframesdeletesimagess tkHTMLWriterswriters formattersAbstractFormattersfmts tkHTMLParsersparsersfeeds xview_movetos yview_movetosparentswm_titlestitles wm_iconname(s_surlsaddsrelpathsxviewsyviewsold_c1sold_c2sparsersexsfilesfmtswritersdatasp((spysol.pysdisplay s|-            cCs|iidjoO|ii|iid\}}}t||djo|i dSqbn|ii|ii3|iii |||f|iid|i_dS(Nii( s_shistorysindexslistsusxvsyvscmpsurlsupdateHistoryXYViewsappendsxviewsyview(s_surlsxviewsyviewsusxvsyv((spysol.pys addHistory s#  cCs|iidjop|ii|iid\}}}|iid}|iid}|||f|ii|iidt|dddfdddddd }ti||SdS( NsstringssOKsCancelsdefaultis resizableisseparatorwidthi(sKwStructskws MfxDialogsinitKws_(s_skw((spysol.pysinitKw= s  cCs)|iidd|_ti|dS(Ns1.0send(s_stext_wsgetstextsDisplayTextDialogsdestroy(s_((spysol.pysdestroyD scGsdS(N((s_sevent((spysol.pyswmDeleteWindowG scGsdS(N((s_sevent((spysol.pysmCancelI s(s__name__s __module__sMfxScrolledTexts Text_ClasssinitKwsdestroyswmDeleteWindowsmCancel(((spysol.pysEditTextDialog; s    sPlayerOptionsDialogcBs#tZdZdZdZRS(Nc Ksg|i|}ti||||i|i|i |\} }|i | |t i|_|ii|iidjt i|_|ii|iidjt i|_|ii|iidjt i| dddd}|idd|idd}t i| d d d ||_|iid|ii |iid t i!d |i"d|i#t i$| d|idd}|id t i!d |i"d|i#t i$| d|idd}|id t i!d |i"d|i#|ii|_ |ii|_|ii|_%|ii|_|i&||}|i(||i)dS(Nistexts Please enter your names takefocusspadyise_widthisexportselectioniswidthssidespadxsvariables Confirm quitsUpdate statistics and logs(*s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssTkinters BooleanVarsupdate_stats_varssetsappsoptsupdate_player_statss confirm_varsconfirmswin_animation_vars win_animationsLabelswidgetspacksgetswsEntrys player_varsinsertsplayersTOPspadxspadys Checkbuttons update_statss createButtonssfocussmainloopstimeout( s_sparentstitlesappskwswidgetsfocussws bottom_frames top_frame((spysol.pys__init__L s8( % %cCsa||_t|ii|_|ii|_|ii|_ |i i|_ t dS(N( sbuttons_sustrs player_varsgetsplayers confirm_varsconfirmsupdate_stats_vars update_statsswin_animation_vars win_animations SystemExit(s_sbutton((spysol.pysmDonei s  cCsJt|dddfdddddd d d d d }ti||SdS( NsstringssOKsCancelsdefaultisseparatorwidthis resizableispadxi spady(sKwStructskws MfxDialogsinitKws_(s_skw((spysol.pysinitKwp s  (s__name__s __module__s__init__smDonesinitKw(((spysol.pysPlayerOptionsDialogK s  sDemoOptionsDialogcBstZdZdZRS(Nc Ks|i|}ti||||i|i|i |\}}|i ||t i|_|ii|iidjt i|_|ii|iidjt i|_|ii|iit i|d|idd}|idt id|id|it i|d|idd}|idt id|id|it i|d d d d d ddt i ddddd|idd}|idt id|id|i|i!||}|i#||i$|ii%|_|ii%|_|ii%|_dS(NisvariablestextsDisplay floating Demo logossidespadxspadysShow score in statusbarsfrom_f0.20000000000000001stof9.9000000000000004s resolutionf0.10000000000000001sorientslengths3islabelsSet demo delay in secondss takefocus(&s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssTkinters BooleanVars demo_logo_varssetsappsopts demo_logosdemo_score_vars demo_scores DoubleVarsdemo_sleep_vars demo_sleeps CheckbuttonswidgetspacksTOPspadxspadysScales HORIZONTALs createButtonssfocussmainloopstimeoutsget( s_sparentstitlesappskwswidgetsfocuss bottom_frames top_frame((spysol.pys__init__x s4 % % %cCs8t|dddfdddd}ti||SdS(NsstringssOKsCancelsdefaultisseparatorwidth(sKwStructskws MfxDialogsinitKws_(s_skw((spysol.pysinitKw s (s__name__s __module__s__init__sinitKw(((spysol.pysDemoOptionsDialogw s sHintOptionsDialogcBstZdZRS(NcKsLt||d|iiddd}|i|_|i |_ |i |_dS(NsSet hint delay in secondsf0.20000000000000001f9.9000000000000004f0.10000000000000001( sMfxSimpleSlidersparentstitlesappsopts hint_sleepsdsstatuss_sbuttonsvalue(s_sparentstitlesappskwsd((spysol.pys__init__ s    (s__name__s __module__s__init__(((spysol.pysHintOptionsDialog ssSoundOptionsDialogcBsDtZfZdZdZdZdZdZdZRS(Nc Ks||_|i|}ti||||i|i |i |\}}|i |||ii|_ti|_|ii|iidjti|_|ii|iidjti|_|ii|iiti|_|ii|iiti|d|idd}|idtid|id|i t!i"djot#oPti|d|idd d |i$}|idtid|id|i nt#o|i%idjoti&|d dd d dddti'ddddd|idd}|idtid|id|i ti&|d dd d dddti'ddddd|idd}|idtid|id|i nt(|i)d<|i*||}|i,||i-dS(Nisvariablestexts Sound enabledssidespadxspadysntsUse DirectX for sound playingscommandsfrom_stois resolutionisorientslengths3islabels Sample volumes takefocuss Music volume(.sapps_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssoptscopys saved_optsTkinters BooleanVarssoundssets sound_modesIntVars sample_volumessound_sample_volumes music_volumessound_music_volumes CheckbuttonswidgetspacksTOPspadxspadysossnamespysolsoundserversmOptSoundDirectXs startup_optsScales HORIZONTALsNonesstringss createButtonssfocussmainloopstimeout( s_sparentstitlesappskwswidgetsfocuss bottom_frames top_frame((spysol.pys__init__ sH  %) % ) cCsddddg}|itjoddf|d|iii|djo|iiid d d qn|djotSnti||SdS( Niiisnts sndvol32.exesposixskmixsgmixisdropspriorityi(sbuttons_ssoundsgetsappsopts sound_modes sample_volumessound_sample_volumes music_volumessound_music_volumesMIXERSsossnamesNonesargssspawnvpsfsMIXERs tracebacks print_excs saved_optsaudiosupdateSettingss playSamples EVENT_HANDLEDs MfxDialogsmDone(s_sbuttonsnamesfsargssMIXERS((spysol.pysmDone s@       ! cGs|idSdS(Ni(s_smDone(s_sevent((spysol.pysmCancel scGs|idSdS(Ni(s_smDone(s_sevent((spysol.pyswmDeleteWindow sc Gs8t|iddddtddddd d f}dS( NstitlesSound preferences infostextsEChanging DirectX settings will take effect the next time you restart sbitmapswarningsdefaultisstringssOK(s MfxDialogs_stopsPACKAGEsd(s_seventsd((spysol.pysmOptSoundDirectX s ( s__name__s __module__sMIXERs__init__sinitKwsmDonesmCancelswmDeleteWindowsmOptSoundDirectX(((spysol.pysSoundOptionsDialog s &   s AboutDialogcBstZdZRS(NcCs&ti||\}}||fSdS(N(s MfxDialogs createFramess_skws top_frames bottom_frame(s_skws top_frames bottom_frame((spysol.pys createFrames s(s__name__s __module__s createFrames(((spysol.pys AboutDialog scCs.|o|iidnd}|iidjo d}ntdjo d}nddf}|o d f}nt |i d d td |d td|dt dddtdddt d|iidd|dddd}|idjo |idjot|d|n|iSdS(Nsabouts#A Python Solitaire Game Collection f0.80000000000000004sA World Domination Project sPyJonggs"A Python Mahjongg Game Collection sNices Credits...sEnjoystitlesAbout stimeoutstexts sVersion s sICopyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Markus F.X.J. Oberhumer sAll Rights Reserved. s. is free software distributed under the terms s#of the GNU General Public License s2For more information about this application visit simageisstringssdefaultisseparatorwidthissound(ssoundsappsaudios playSamplests miscrandomsrandomsPACKAGEsstringsstimeouts AboutDialogstopsVERSIONs PACKAGE_URLsgimagesslogossdsstatussbuttons helpCredits(sappstimeoutssoundsdstsstrings((spysol.pys helpAbout s$     6   cCs|o|iidnd}tdjo d}nt|iddtd|dtd |d t d d d t d|i i dddfdddd}|iSdS(NsaboutsA Solitaire Game Collection sPyJonggs"A Python Mahjongg Game Collection stitlesAbout stimeoutstexts sVersion s sICopyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Markus F.X.J. Oberhumer s3 For more information about this application visit simageisstringssEnjoysdefaultisseparatorwidth(ssoundsappsaudios playSamplestsPACKAGEs MfxDialogstopstimeoutsVERSIONs PACKAGE_URLsgimagesslogossdsstatus(sappstimeoutssoundsdst((spysol.pyshelpAboutSimple s  & cCs|o|iidnd}tdjo d}nFtdjo d}n/tdjo d}ntd jo d }nt|id td d |dtddddddddd|dd|i i ddddd}|i SdS(NscreditssstksTcl/Tk, sgnomesPyGTK, skdespyKDE, swxs wxPython, stitles Creditsstimeoutstexts credits go to: s-Volker Weidner for getting me into Solitaire s1Guido van Rossum for the initial example program s3T. Kirk for lots of contributed games and cardsets s&Carl Larsson for the background music s8The Gnome AisleRiot team for parts of the documentation s Natascha s s The Python, s2SDL & Linux crews for making this program possiblesimageis image_sidesrightsseparatorwidthi(ssoundsappsaudios playSampleststknames MfxDialogstopsPACKAGEstimeoutsgimagesslogossdsstatus(sappstimeoutssoundsdst((spysol.pys helpCredits* s     2  cCsz| otSnyQ|ii||}ttjo+ddf\}}|ii||anWn@tj o4t |i dt ddd|dd}tSnXt |i dt d }|id jp|id jod }|id dnd}|iddyt||iiWnnXt|}||_t|_|i|t|d||SdS(Ns index.htmlshtmlstitles HTML ProblemstextsCannot find help document sbitmapswarnings Helpi iXii,iiiis maximized(sdocumentsNonesapps dataloadersfindFilesdirsdocshelp_html_indexsEnvErrors MfxDialogstopsPACKAGEsdsmakeHelpToplevelswinfo_screenwidthswinfo_screenheights maximizeds wm_minsizes wm_set_iconsfindIcons tkHTMLViewersviewershomesdisplayswm_map(sappsdocumentsdirsviewersdocs maximizedstopsd((spysol.pyshelpHTML@ s:    &    sStatus_StatsDialogcBstZdZRS(Nc Cs|i|if\}}d}}d}x'|iiD]}|t|i }q5Wt djoPdt |i d}|dt |}|dt t|i |}n dt |i dd t |i dd t |id}|iio_|iidjo%|d t |iiid }n|d t t|iii }n|iio|ii|iijo'|dt t|iii }n|iio|dt |}ntidti|ii} ti||ddd|id|idd dd|idd| ddt |i i!ddt |i"ddt |i#ddt |i$ddt |i%d||dddd ffd!|i&i'i(d"d#d$d%d&d'd&d(d)dS(*NsisPyJonggsHighlight tiles: s s Tiles removed: s Tiles remaining: sHighlight piles: sHighlight cards: sHighlight same rank: s Redeals: is Cards in Talon: s Cards in Waste: s Cards in Foundations: s%Y-%m-%d %H:%Mstitles Game statusstextsformatsPlaying time: s Started at: s sMoves: s Undo moves: sBookmark moves: s Demo moves: sHints: sstringssOKs Statistics...iesimageis image_sideslefts image_padxispadxsseparatorwidthi()sgamesstatssgstatssw1sw2snsss foundationsslenscardssPACKAGEsstrshighlight_pilesshighlight_cardsshighlight_samerankstalonsgameinfosredealssroundswastestimesstrftimes localtimes start_timesdates MfxDialogs__init__s_sparents getTitleNames getGameNumbersgetTimesmovessindexs undo_movessgoto_bookmark_movess demo_movesshintssappsgimagesslogos( s_sparentsgamesstatssssnsgstatssw2sw1sdate((spysol.pys__init___ s2   %A %'&' ! (s__name__s __module__s__init__(((spysol.pysStatus_StatsDialog^ ssPysolStatsFormattercBsjtZdZdfdYZdefdYZddZdZd Zd Zd Z RS( NcCs ||_dS(N(sapps_(s_sapp((spysol.pys__init__ ss StringWritercBsJtZdZdZddZdZedZdddZRS( NcCs d|_dS(Ns(s_stext(s_((spysol.pys__init__ scCs|i||_dS(N(s_stextss(s_ss((spysol.pysp sicCs|id|dS(Ns (s_spscount(s_scount((spysol.pysnl scCs|i|dS(N(s_spss(s_ss((spysol.pyspheader scCs*d|||||f}|i|dS(Ns%-30s %7s %7s %7s %7s (st1st2st3st4st5sss_sp(s_st1st2st3st4st5sgameidss((spysol.pyspstats sicCs!|id||||fdS(Ns%-25s %-20s %17s %s (s_spsgamenames gamenumbersdatesstatus(s_sgamenames gamenumbersdatesstatussgameidswon((spysol.pysplog s( s__name__s __module__s__init__spsnlspheadersNonespstatssplog(((spysol.pys StringWriter s      s FileWritercBstZdZdZRS(NcCs ||_dS(N(sfiles_(s_sfile((spysol.pys__init__ scCs|ii|dS(N(s_sfileswritess(s_ss((spysol.pysp s(s__name__s __module__s__init__sp(((spysol.pys FileWriter s iHcCstiti}tidtiti}t|t|t|d}|i |d||d|i d|d|i ddS(Ns%Y-%m-%d %H:%Mis s s-( stimesctimesdatesstrftimes localtimesmaxs pagewidthslensheadersblanksswriterspheader(s_swritersheaders pagewidthsblankssdate((spysol.pys writeHeader s !#c Cs|i} |i||d|i|pddddd|idddf\}} }| i }x|D]} | i| }| ii|| \} } || | | f\}} | | djodd | | | }nd }| djp| djp| | ii jo1|i|| | | | |d | |d }qqqqW|i|| f\} } | | djodd | | | }nd }|id |t|f| | | | ||id|SdS(Ni>s Demo gamessPlayedsWonsLosts% wonis%.1ff100.0s0.0sgameidisTotal (%d out of %d games)i(s_sapps writeHeaderswritersheaderspstatssplayersnlstwonstloststgamessgetGamesIdSortedByNamesgsidsgetGameMenuitemNamesnamesstatssgetStatsswonslostspercsgameslen(s_swritersplayersheaderstwonspercstgamessnamesgsappslostswonstlostsid((spysol.pys writeStats s4    -#  c Cs| p| odSn|i||d|idddd|iddf\} }x|D]w}t |t i j oqdnt|djo|dttd f}nLt|d jo|td f}n%t|d jo|d f}nt|d joqdn|d} t | t ij oqdn|ii| }| o"|iitii| }n|o |i} n d | } |d }t|d jo,d|dd !|d d!|dd !f}n$t|djo |}nd}tidti|d} |ddjo2|ddj}| ||d |f\} }nd} d|djo djno%dddddf|dd} n|i| || | d| d|dqdW|idd SdS(NiiGsGames Game numbers Started at sStatusisiiis** UNKNOWN %d **is%s-%s-%sii is ** ERROR **s%Y-%m-%d %H:%Miis*error*isLoadedsNot wonsLostsWonsPerfectsgameidswon("splayers prev_gamess_s writeHeaderswritersheadersplogsnlstwonstlostspgstypestypess TupleTypeslensNonesgameidsIntTypesapps getGameInfosgisGIsPROTECTED_GAMESsgets short_namesnamesfs gamenumberstimesstrftimes localtimesdateswonsstatus(s_swritersplayersheaders prev_gamesstlostsgiswonspgsstatussdatestwonsgameidsnamesfs gamenumber((spysol.pys _writeLog sV  "   , ""%* cCs2|iiii|}|i||||SdS(N( s_sappsstatss prev_gamessgetsplayers _writeLogswritersheader(s_swritersplayersheaders prev_games((spysol.pys writeFullLog scCs2|iiii|}|i||||SdS(N( s_sappsstatss session_gamessgetsplayers prev_gamess _writeLogswritersheader(s_swritersplayersheaders prev_games((spysol.pyswriteSessionLog s( s__name__s __module__s__init__s StringWriters FileWriters writeHeaders writeStatss _writeLogs writeFullLogswriteSessionLog(((spysol.pysPysolStatsFormatter s    - sPysolMenubarActionscBstZdZdZdZdZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdZedZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#d$Z%d%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9d:Z:d;Z;d<Z<d=Z=d>Z>d?Z?d@Z@dAZAdBZBdCZCdDZDdEZEdFZFdGZGdHZHdIZIdJZJdKZKdLZLdMZMdNZNdOZOdPZPdQZQdRZRRS(SNc0Cs||_||_t|_tddddddddddddddd dd dd dd dd ddddddd|_tdt|dt|dt|d t|d t|d t|d t|dt|dt|d t|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|dt|d t||_ dS(!Nssaveissave_ass hold_and_quitsundosredosrestartsdealshints autofaceupsautodropsautodeals quickplaysdemoshighlight_pilessrulessgameidsgameid_popularscomments bookmarksshighlight_cardsshighlight_samerankssoundscardbacks tabletiles animationssshadowsshadestoolbars toolbar_sizestoolbar_reliefs statusbar( sapps_stopsNonesgamesStructs menustatesMfxRadioMenuItemsMfxCheckMenuItemstkopt(s_sappstop((spysol.pys__init__ sR                         cCs!||_|tjodSn|i|ijpt|i|iif\}}|ii|i |i i|i |i it |i i |ii|i|ii|i|ii|i|ii|i|ii|i|ii|i|ii|i|ii|i|ii|i|ii|i|ii|i|ii|iii|ii|iif|ii|i|ii|i|i i|i |i!i|i!|i"i|i"|i#i|i#|i$i|i$dS(N(%sgames_sNonesappsAssertionErrorstkoptsoptsgameidssetsidsgameid_popularscommentsbools gsaveinfos autofaceupsautodropsautodeals quickplaysundoshints bookmarksshighlight_pilesshighlight_cardsshighlight_samerankssoundscardbackscardsets backindexs tabletilestabletile_indexs animationssshadowsshadestoolbars toolbar_sizestoolbar_reliefs statusbar(s_sgamesoptstkopt((spysol.pys connectGames8  cCsdS(N((s_sgameids((spysol.pysupdateRecentGamesMenu8scCsdS(N((s_((spysol.pysupdateBookmarkMenuState:scCsdS(N((s_((spysol.pysupdateBackgroundImagesMenu<scCs!|itjp |iiSdS(N(s_sgamesNones _finishDrag(s_((spysol.pys _finishDrag>scCs!|itjp |iiSdS(N(s_sgamesNones _cancelDrag(s_((spysol.pys _cancelDrag@scOs1|itj ptt|ii||SdS(N(s_sgamesNonesAssertionErrorsapplyschangedsargsskw(s_sargsskw((spysol.pyschangedBscCs tdS(N(sSubclassResponsibility(s_sstatespath((spysol.pys setMenuStateEscCs tdS(N(sSubclassResponsibility(s_sstatespath((spysol.pyssetToolbarStateGscCsn|i}x^|iiD]M\}}t|ti jodgt ||i|s<3>(s _MfxToolbars__init__s_stopsreliefsPysolToolbarActionssdirssizes _createButtonsmNewGamesmRestarts_createSeparatorsmOpensmSavesmUndosmRedosmDrops mPlayerStatss mHelpRulessmQuitsTkintersFLATs _createLabels player_labelsbindsmOptPlayerOptionssNonespopupsframes clickHandlersrightclickHandler(s_stopsdirssizesrelief((spysol.pys__init__s0        cCsdp tidjo|iidddti|iidtidti dd |i d d dti dti |i d d dti dti n&|iidtidti dddS( Nisntsbdisreliefssidesfillsipadyiswidth(sossnames_sframesconfigsTkintersSOLIDspacksTOPsXs_createSeparatorsLEFTsFLATsRIGHT(s_((spysol.pys _initFrames %"&cCs}tii|i|}t}xTt D]L}tii|i||}tii |ot i d|}Pq%q%W|SdS(Nsfile(sosspathsjoins_sdirsnamesfilesNonesimagesIMAGE_EXTENSIONSsextsisfilesTkinters PhotoImage(s_snamesimagesextsfile((spysol.pys _loadImages icCsT|i|}ti|id|ddd|i}||_ |o7|i d||i djo|i |_ q}n|itijo;|itjo|i|d|_n|i|dd|d?|id d@d|dAt|d dB}|id d:d|dC|id d<d|dD|i dE}|id dFd|i-ddGt%d0jo#|id dHd|i.ddIn |id dJd|i.ddI|i|id dKd|i/d|d2|id dLd|i0|i dM}|id dNd|i1t%d0jot|d dO}|i)d dPd8|i*i2d|i3|i)d dQd8|i*i4d|i5|i)d dRd8|i*i6d|i7|i)d dSd8|i*i8d|i9nt|d dT}|i)d dUd8|i*i:d|i;|i)d d3d8|i*i<d|i=|i)d dVd8|i*i>d|i?|i|i)d dWd8|i*i@d|iAt|d dO}|i)d dPd8|i*i2d|i3|i)d dQd8|i*i4d|i5|i)d dRd8|i*i6d|i7|i)d dXd8|i*i8d|i9|i)d dYd8|i*iBd|iC|i)d dZd8|i*iDd|iE|i|iFiGiHtIjo2|i)d d[d8|i*iJd|iKd\tLiMnVtNo)|i)d d]d8|i*iJd|iOn&|i)d d[d8|i*iJd|iK|iFiP}|iR} t%d0joN|id d^d|iTdd_t|d d`}|id dad|iUnK|id dbd|iTdd_t|d dc}|id ddd|iUt|d de}|iVd dfd8|i*iWdgdhd|iX|iVd did8|i*iWdgdjd|iX|iVd dkd8|i*iWdgdd|iX|iVd dld8|i*iWdgdmd|iX|iVd dnd8|i*iWdgdod|iXt%d0joN|i)d dpd8|i*iYd|iZ|i)d dqd8|i*i[d|i\n|i|id drd|i]|id dsd|i^|it|d dt}|iVd dud8|i*i_dgdhd|i`|iVd dvd8|i*i_dgdd|i`|iVd dwd8|i*i_dgdjd|i`|i|iVd dxd8|i*iadgdhd|ib|iVd dyd8|i*iadgdd|ib|i)d dzd8|i*icd|id|i d{}|id d|d|ied|d}|id d~d|if|id dd|igdd}thdo@dhjo6|id dd|ii|id dd|ijn|i|id dt%dd|iktIt_d}|imdd|i|imdd|in|imdd|io|im|d|i|im|d|i|im|d|ip|im|d|i|im|d|i|im|d|i|imdd|i|imdd|i|imdd|i|im|d|i$|imdd|i&|imdd|i(|im|d|iq|imdd|i-|im|d|ir|imdd|i.|im|d|i/|imdd|iT|im|d|is|im|d|it|im|d|i1|im|d}|ie|imdd}|ig|imdd|iu|im|d|iv|imdd|i'|im|d|iw|imdd|i|imdd|i&|imdd|i'|im|d|iw|imdd|i|imdd|i&x:td&D],}|im|tx|d||dqJWno |iFiyor|im|d|iv|im|d|iz|im|d|i{|im|d|i||im|d|i}ndS(Nsnamesmenubarisposixsgroovesreliefsactiveborderwidths sCtrl-smacsCmd-s&Fileslabels &New gamescommands acceleratorsNs R&ecent gamessSelect &random gamesRsSelect game by nu&mber...sMs&Open...sOs&SavesSs Save &as...s&Hold and quits&QuitsQs&Selects&Edits&UndosZs&Redos Redo &alls &Set bookmarki s Bookmark %dcCs |i|S(N(s_s mSetBookmarksi(s_si((spysol.pysyssGo&to bookmarks%dcCs |i|S(N(s_s mGotoBookmarksi(s_si((spysol.pys~ss&Clear bookmarkss Restart &gamesGs&GamesPyJonggs &Deal cardssDs &Auto dropsAs S&tatus...sTs &Comments...svariables &StatisticssCurrent game...cCs|iddS(Nsmodeie(s_s mPlayerStats(s_((spysol.pysss All games...cCs|iddS(Nsmodeif(s_s mPlayerStats(s_((spysol.pysssSession log...cCs|iddS(Nsmodeih(s_s mPlayerStats(s_((spysol.pysss Full log...cCs|iddS(Nsmodeig(s_s mPlayerStats(s_((spysol.pysssDemo statisticscCs|iddS(NsmodeiM(s_s mPlayerStats(s_((spysol.pysscCs|iddS(NsmodeiN(s_s mPlayerStats(s_((spysol.pysss&Assists&HintsHsHighlight t&ilessIsHighlight p&iless&DemosDemo (&all games)s&Optionss&Player options...s Assist &levels Enable &undosEnable &bookmarkss Enable &hintsEnable highlight t&iless&Automatic plays Auto &face ups Auto &deals &Quick playsEnable highlight p&ilessEnable highlight &cardssEnable highlight same &ranks&Soundsstates &Sound...s Tiles&et...sEs Tile &bordersTable b&ackground...s Cards&et...sCard &backgroundsTable t&ile...s A&nimationss&Nonesvalueis &Timer basedis&Fasts&Slowis &Very slowis Card shado&wsShade &legal movess&Hint options...s&Demo options...s&Toolbars&Hides&Tops&Bottoms &Small iconss &Large iconss Stat&usbars&Helps &ContentssF1s &How to plays&Rules for this games&License termss What's &new ?s&About s...sControl-ssnsgsvsrsmsosssqszs BackSpacesspacestshsisdsesbspsPrintsusaslsksjcCs|i|ddS(Nsconfirmi(s_s mGotoBookmarksi(sevents_si((spysol.pysssEndsPriorsNextsUpsDown(~s_s_addPaths MfxMenubarsaddPathskwsossnamesapplystops_PysolMenubar__menubarsbinds_keyPressHandlersms _createMenusmenus add_commandsmNewGamesMfxMenussubmenusmSelectRandomGamesmSelectGameByIds add_separatorsmOpensmSavesmSaveAss mHoldAndQuitsmQuits_addSelectGameMenusmUndosmRedosmRedoAllsrangesislabelsaccsmClearBookmarkssmRestartsPACKAGEsmDealsmDropsmStatussadd_checkbuttonstkoptscommentsmEditGameCommentsmHintsmHighlightPilessmDemos mMixedDemosmOptPlayerOptionssundosmOptEnableUndos bookmarkssmOptEnableBookmarksshintsmOptEnableHintshighlight_pilessmOptEnableHighlightPiless autofaceupsmOptAutoFaceUpsautodrops mOptAutoDropsautodeals mOptAutoDeals quickplays mOptQuickPlayshighlight_cardssmOptEnableHighlightCardsshighlight_sameranksmOptEnableHighlightSameRanksappsaudiosaudiodevsNonessounds mOptSoundsTkintersDISABLEDspysolsoundserversmOptSoundDialogscardset_managersmanagerslensnsmSelectCardsetDialogsmSelectTileDialogsadd_radiobuttons animationssmOptAnimationssshadows mOptShadowsshades mOptShadesmOptHintOptionssmOptDemoOptionsstoolbars mOptToolbars toolbar_sizesmOptToolbarSizes statusbars mOptStatusbarsmHelpsmHelpHowToPlays mHelpRulessbundles mHelpLicenses mHelpNewss mHelpAboutsctrls_bindKeysmSelectGameDialogsmSelectGameDialogWithPreviewsmNewGameWithNextIds mPlayerStatssmHint1smOptChangeCardbacksmOptChangeTableTiles mScreenshotsmPlayNextMusicsmDrop1sstrsdebugsmSelectPrevGameByNamesmSelectNextGameByNamesmSelectPrevGameByIdsmSelectNextGameById( s_sctrlsmanagersmenuslabelsaccssubmenusismsnskw((spysol.pys_createMenubarXsl   ## ## #   # ) # %   # # %%%)%%% %%%%%%% 2)%   +++++ %)  +++ ++%# !  *cCsdo| ot|djo4||iti|<||iti|( smodifierslenskeysfuncs_s_PysolMenubar__keybindingssstringslowersupperssequencesbindstop(s_smodifierskeysfuncssequence((spysol.pys_bindKeys")cCst}|o|io|iio*|io|i|ii_t}qNn|i i |i}|o|i d@djo||t}qn|SdS(Nii( sEVENT_PROPAGATEsrsevents_sgamesdemoscharskeypresss EVENT_HANDLEDs_PysolMenubar__keybindingssgetsfuncsstate(s_seventsrsfunc((spysol.pys_keyPressHandlers   cCs,d}t|i|d|dd}|SdS(Nistearoffs underlinei(stearoffsMfxMenus_s_PysolMenubar__menubarslabelsmenu(s_slabelsmenustearoff((spysol.pys _createMenu)scCsTt|iii|iii}t|}|i ddd|i dd|i ddd|i dd|i dd f}|i|||f|i|iitd jo1|i |i|||i|iidSnt|dd }|i||ti|i|ii|i |i||ti|i|iidS( Nslabels All &games...scommands acceleratorsGsPlayable pre&view...sVs&Popular gamescCs|iiti@S(N(sgissis game_flagssGIs GT_POPULAR(sgi((spysol.pys3ssPyJonggs&Special games(smaps_sappsgdbsgetsgetGamesIdSortedByShortNamesgamesstuplesmenus add_commandsmSelectGameDialogsmSelectGameDialogWithPreviews add_separatorsdatas_addSelectGameSubMenusmSelectGamePopularstkoptsgameid_popularsPACKAGEs_addSelectMahjonggGameSubMenus mSelectGamesgameidsMfxMenussubmenusGIsSELECT_SPECIAL_GAME_BY_TYPEsSELECT_GAME_BY_TYPE(s_smenussubmenusgamessdata((spysol.pys_addSelectGameMenu-s$$     c Csd}x|D]\} } | tjo d}q nt| |}| oq n|o|i d}nt |d| }no | djoq |i ||||q WdS(Niislabels Mahjongg type(sneed_seps select_dataslabels select_funcsNonesfiltersgamessgsmenus add_separatorsMfxMenussubmenus_s_addSelectGameSubSubMenuscommandsvariable( s_smenusgamess select_datascommandsvariablessubmenusneed_sepsgs select_funcslabel((spysol.pys_addSelectGameSubMenu@s     c CsxddddddfD]}t|d|dd |}| oqn|d}|d|djo|dd |d}nt|d |}|i ||||qWdS( NsACsDFsGKsLRsSTsUZiicCs"||idjo |jnS(Ni(sc0sgis short_namesc1(sgisc0sc1((spysol.pysSss - slabel( scsfiltersgsggslabelsMfxMenusmenussubmenus_s_addSelectGameSubSubMenuscommandsvariable( s_smenusgscommandsvariablessubmenuscslabelsgg((spysol.pys_addSelectMahjonggGameSubMenuQs  c Csd|ift|ddj}xott|D][}||}|djo||dj}|i d|d|d|d|i d|iq6WdS( Niiiscommandsvariables columnbreaksvalueslabel(s_s_PysolMenubar__cb_maxslensgscbsrangesisgis columnbreaksmenusadd_radiobuttonscommandsvariablesids short_name( s_smenusgscommandsvariablesis columnbreaksgiscb((spysol.pys_addSelectGameSubSubMenu[s# cCs|idjo#|idjo|i|iijoY|iii|i|ii i|i|ii |ii |id|i nt SdS(Nisrandom(sdsstatussbuttonsgameids_sgamesidstkoptssetsgameid_popularsendGamesquitGamesrandoms EVENT_HANDLED(s_sd((spysol.pys_mSelectGameDialogcs6  cGs|iid|iidS(Nscursor(s_sgames setCursorsapps top_cursor(s_sevent((spysol.pys__restoreCursormscGsv|iodSn|iidtt|i|it|iddd|i d|ii }|i |SdS(Nscursorstitles Select gamesappsgameid( s_s _cancelDragsgames setCursors CURSOR_WATCHs after_idlestops_PysolMenubar__restoreCursorsSelectGameDialogsappsidsds_mSelectGameDialog(s_seventsd((spysol.pysmSelectGameDialogos c Gs|iodSn|iidtt}t|i|i t |iddd|i d|ii d|}|i|SdS(Nscursorstitles Select gamesappsgameidsbookmark(s_s _cancelDragsgames setCursors CURSOR_WATCHsNonesbookmarks after_idlestops_PysolMenubar__restoreCursorsSelectGameDialogWithPreviewsappsidsds_mSelectGameDialog(s_seventsdsbookmark((spysol.pysmSelectGameDialogWithPreviewvs  c Cs|idd}|iddd|ift|ddj}d}x|D]}|i i |}| oqQn|djo||dj}|id|id|iid |d |i d |i|d }qQWdS( Ns.menubar.file.recentgamesiislastiiscommandsvariables columnbreaksvalueslabeli(s_s_PysolMenubar__menupathssubmenusdeletes_PysolMenubar__cb_maxslensgameidsscbsisidsapps getGameInfosgis columnbreaksadd_radiobuttons mSelectGamestkoptsgameids short_name(s_sgameidsssubmenusiscbs columnbreaksgisid((spysol.pysupdateRecentGamesMenus# c Cs|i}|iid} |iid}|iid}| tjp|tjp |tjodSn|i i i o |i i } | \}}}x-tdD]}|i|d|| qW|i|d|| |\}}}d} x_tdD]Q}|i ii i|tj }|i|d||o| | p|} qW|i|d|| o| |\}}}|i|d|| o| dS(Ns.menubar.edit.setbookmarks.menubar.edit.gotobookmarks.menubar.edit.clearbookmarksi sstatei(s_s_getEnabledStatesstates_PysolMenubar__menupathsgetsmp1smp2smp3sNonesappsopts bookmarkssgamescanSetBookmarksxsmenusindexssubmenusrangesis entryconfigsmss gsaveinfoss( s_ssubmenusindexsismenusssstatesmp2smp3smssmp1sx((spysol.pysupdateBookmarkMenuStates, '    cCs!|iid}tdjo |tjo|iid}n|d}|idd|ii i }t t it it|}xtt|D]t}|djo||dj}|id||id||id |iid |d |id |d dddqWdS(Ns.menubar.options.cardbackgroundsPyJonggs.menubar.options.tileborderiislastslabelsimagesvariablesvaluescommands columnbreaks indicatorons hidemargin(s_s_PysolMenubar__menupathsgetsmpsPACKAGEsNonessubmenusdeletesappsimagess getCardbackssmbackssintsmathsceilssqrtslenscbsrangesis columnbreaksadd_radiobuttonsnames menu_imagestkoptscardbacks mOptCardback(s_ssubmenusmbacksscbs columnbreaksismp((spysol.pysupdateBackgroundImagesMenus $2cCssd|}|ii|}tdjo |tjodSn|\}}}|i |}|i |d|dS(Ns .menubar.sPyJonggsstate(spaths_s_PysolMenubar__menupathsgetsmpsPACKAGEsNonesmenusindexssubmenus_getEnabledStatesstatesss entryconfig(s_sstatespathssubmenusindexsmenusssmp((spysol.pys setMenuStates cCs6|i|}t|ii|d}||dssfillsexpandi(skwsgetsparentscgetsbgsapplysMfxScrolledCanvass__init__s_s rootnodessupdateNodesWithTreesNones selection_keysnodesskeyssStylesstylescanvasstext_normal_fgstext_normal_bgsbinds singleClicks doubleClickspacksTkintersBOTH(s_sparents rootnodesskwsbg((spysol.pys__init__s'     cCs=x)|ii|igD]}d|_qWti|dS(Ni(s_skeyssgets selection_keysnodesselectedsMfxScrolledCanvassdestroy(s_snode((spysol.pysdestroys cCs<|iiti}|o|ii|dSntSdS(Ni( s_scanvass find_withtagsTkintersCURRENTsidsnodessgetsNone(s_seventsid((spysol.pysfindNodescCs|ii|iif\}}||ii}||iid}x[|iD]P}||_ y(|i ||t t \}}}}WqLtij oqLXqLW|iid}|iiddd|d|df|iid|iidS(Nisalls scrollregioniisyscrollincrement(s_sstylesoriginxsoriginysnxsnysdistxsheights rootnodessnodestreesdrawsNoneslxslysTkintersTclErrorscanvassbboxsconfigsdisty(s_snodesbboxsnxsnyslxsly((spysol.pysdraws  ( 'cCs&h|_h|_|iiddS(Nsall(s_snodesskeysscanvassdelete(s_((spysol.pysclears  cCs\|id}d|id<|ii|i|i|i|i||idtt|if||_|iidddddddS(Nsrowiscolumnsstickysnews(sapplys MfxCanvass_sframeskwscanvassgrid(s_skw((spysol.pys createCanvassc Cs8|iidddtiddd|id|idS(Nssidesrightsfillsexpandispadxspady(s_sframespacksTkintersBOTHskwspadxspady(s_skw((spysol.pyspackscCs|ii|i}|idjoG|ii|i o-|ii d|i |ii |i qn*|ii d|ii|ii t|i|dS(Nisbg(sappstabletile_managersgetstabletile_indexstilesindexs_scanvasssetTilesfilenamesconfigstop_bgs setTextColors text_colorsopts tablecolorsNonespackskw(s_sappskwstile((spysol.pyssetups(s__name__s __module__s createCanvasspackssetup(((spysol.pysSelectDialogPreviewCanvass  sSelectGameLeafcBstZRS(N(s__name__s __module__(((spysol.pysSelectGameLeafssSelectGameNodecBstZdZRS(NcCsg}t|itoXx|iD]F\}}|o|o,t|i||d|}|i |q#q#Wndx`|ii i D]O}|o |i|o2t|i||id|i}|i |qqW|p |ii iSdS(Nskey(scontentss isinstances_s select_funcsUserListsidsnamesSelectGameLeafstreesnodesappendsdatas all_games_gisgisno_games(s_snodesnamesgisidscontents((spysol.pys _getContentss !(s__name__s __module__s _getContents(((spysol.pysSelectGameNodessSelectGameDatacBstZdZRS(NcCsti|t|ii|ii|_t t t dt g|_ t }}}}g} xtitititifD]} g}xj| D]b\} } | t jpt| |i oqntidd| } |itt | | qW| i|qWno| do&tt dt| ddd}nno| do tt dt| d}nno| d o tt d t| d }nno| d ont gf\} }xdti!D]Y\} }|d } | t jpt| |i oqn|itt | | qWno|ott d t|} nt gf\}}xnti$D]c\} }|d } | t jpt| |i oq{nd| } |itt | | q{Wno|o t%djott dt|}nt&t'|ii(}t*t tt ddddtt d|tt dddd||tt dtt dtt ddtt ddtt ddtt ddtt d d!tt d"d#tt d$d%tt d&d'ftt d(tt d)d*tt d+d,tt d-d.tt d/d0ftt d1tt d2d3tt d4d5tt d6d7tt d8d9tt d:d;tt d&d<f| f|tt d=tt d>d?tt d@dAtt dBdCtt dDdEtt dFdGf||f |_+dS(HNs (no games)s&siis by Game Typesexpandeds Special GamesisOriginal GamesicCs |i|jS(N(sgisidsgames(sgisgames((spysol.pysssby CompatibilitysNew games in vsPySolsby PySol versions All GamescCsdS(Ni((sgi((spysol.pysssAlternate Namess Popular GamescCs|iiti@S(N(sgissis game_flagssGIs GT_POPULAR(sgi((spysol.pysssby Game Featuresby Number of Cardss32 cardscCs|iidjS(Ni (sgissisncards(sgi((spysol.pysss48 cardscCs|iidjS(Ni0(sgissisncards(sgi((spysol.pysss52 cardscCs|iidjS(Ni4(sgissisncards(sgi((spysol.pysss64 cardscCs|iidjS(Ni@(sgissisncards(sgi((spysol.pysss78 cardscCs|iidjS(NiN(sgissisncards(sgi((spysol.pysss 104 cardscCs|iidjS(Nih(sgissisncards(sgi((spysol.pysss 144 cardscCs|iidjS(Ni(sgissisncards(sgi((spysol.pysss Other numbercCs%|iidddddddfjS(Ni i0i4i@iNihi(sgissisncards(sgi((spysol.pysssby Number of Deckss 1 deck gamescCs|iidjS(Ni(sgissisdecks(sgi((spysol.pysss 2 deck gamescCs|iidjS(Ni(sgissisdecks(sgi((spysol.pysss 3 deck gamescCs|iidjS(Ni(sgissisdecks(sgi((spysol.pysss 4 deck gamescCs|iidjS(Ni(sgissisdecks(sgi((spysol.pysssby Number of Redealss No redealcCs|iidjS(Ni(sgissisredeals(sgi((spysol.pysss1 redealcCs|iidjS(Ni(sgissisredeals(sgi((spysol.pysss 2 redealscCs|iidjS(Ni(sgissisredeals(sgi((spysol.pysss 3 redealscCs|iidjS(Ni(sgissisredeals(sgi((spysol.pysssUnlimited redealscCs|iidjS(Ni(sgissisredeals(sgi((spysol.pysscCs|iidddddfjS(Niiiii(sgissisredeals(sgi((spysol.pysssOther CategoriessGames for Children (very easy)cCs|iiti@S(N(sgissis game_flagssGIs GT_CHILDREN(sgi((spysol.pysssGames with ScoringcCs|iiti@S(N(sgissis game_flagssGIsGT_SCORE(sgi((spysol.pysssGames with Separate DeckscCs|iiti@S(N(sgissis game_flagssGIsGT_SEPARATE_DECKS(sgi((spysol.pysssOpen Games (all cards visible)cCs|iiti@S(N(sgissis game_flagssGIsGT_OPEN(sgi((spysol.pys ssRelaxed VariantscCs|iiti@S(N(sgissis game_flagssGIs GT_RELAXED(sgi((spysol.pys s(,sSelectDialogTreeDatas__init__s_smapsappsgdbsgetsgetGamesIdSortedByNames all_games_gisSelectGameLeafsNonesno_gamess s_by_types s_specials s_originals s_contribsgsGIsSELECT_GAME_BY_TYPEsSELECT_SPECIAL_GAME_BY_TYPEsSELECT_ORIGINAL_GAME_BY_TYPEsSELECT_CONTRIB_GAME_BY_TYPEsdatasggsnames select_funcsexistssressubsappendsSelectGameNodestupless_by_compatibilitysGAMES_BY_COMPATIBILITYsgamesss_by_pysol_versionsGAMES_BY_PYSOL_VERSIONsPACKAGEsUserListslists#getGamesTuplesSortedByAlternateNamesul_alternate_namessfilters rootnodes(s_sapps s_originalsul_alternate_namessggs s_contribss_by_pysol_versions s_specials s_by_types select_funcsdatasnamess_by_compatibilitysgsgames((spysol.pys__init__sb ! !"  !  ! (s__name__s __module__s__init__(((spysol.pysSelectGameDatassSelectGameTreeWithPreviewcBstZeZeZRS(N(s__name__s __module__sNonesdatas html_viewer(((spysol.pysSelectGameTreeWithPreviewssSelectGameTreecBstZedZRS(NcCs|i|dS(N(s_s doubleClicksevent(s_sevent((spysol.pys singleClicks(s__name__s __module__sNones singleClick(((spysol.pysSelectGameTreessSelectGameDialogcBs>tZeZeZeZdZdZ dZ dZ RS(Nc Ks@|i|}ti||||i|i|i |\}}|i ||||_ ||_t|_|iitjo|i||i_n|iidd|i||d|d|id|i|_|iiidtiddd|id |i|i||}|ii}|i!||i"dS( Niskeysdefaultsfontsfillsexpandispadxspady(#s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssappsgameidsNonesrandomsTreeDataHolder_ClasssdatasTreeData_Classstops wm_minsizes Tree_ClasssfontstreesframespacksTkintersBOTHspadxspadys createButtonssfocussmainloopstimeout( s_sparentstitlesappsgameidskwsfocuss bottom_frames top_frame((spysol.pys__init__s   -1 cCs_t|dttdfddddddd td d d d d d dd }ti||SdS(NsstringssCancelsdefaultisseparatorwidthis resizableisfontspadxi spadys buttonpadxs buttonpadyi(sKwStructskwsNones MfxDialogsinitKws_(s_skw((spysol.pysinitKw)s  cCs@t|_|ii|iit|iiti|dS(N(sNones_sappstreesupdateNodesWithTrees rootnodessdestroys MfxDialog(s_((spysol.pysdestroy2s  cCs|djo|ii|_d|i_n|djo|ii|ii}| odSnt i i dd}t i}|tjot|i||t _n6|iii||}|i|i|dddSnti||dS(Niishtmlsrulessrelpath(sbuttons_strees selection_keysgameids n_expansionssappsgetGameRulesFilenamesdocsosspathsjoinsdirsSelectGameTreeWithPreviews html_viewersviewersNoneshelpHTMLs dataloadersfindFilesurlsupdateHistoryXYViewsdisplays MfxDialogsmDone(s_sbuttonsviewersdocsurlsdir((spysol.pysmDone7s      ( s__name__s __module__sSelectGameTrees Tree_ClasssSelectGameTreeWithPreviewsTreeDataHolder_ClasssSelectGameDatasTreeData_Classs__init__sinitKwsdestroysmDone(((spysol.pysSelectGameDialogs  sSelectGameDialogWithPreviewcBsDtZeZedZdZdZddZddZ RS(Nc Ksb|i|}ti||||i|i|i |\} } |i | |||_ ||_||_t|_|iitjo|i||i_n|iidd|ii}|djoddf\} } nY|djoddf\} } n6|djod d f\} } ndd f\} } tdt| d d |iid } |i|| d|d|id|i d| |_!|i!i"i#dddt$i%ddd|i&d|i't(| d| |_)|i)i*||d|i)i+_)d|_,t|_-t|_.|i/|dd|i0| |}|i2||i3dS(NiiiLiiXiii iii,i i skeysdefaultsfontswidthssidesleftsfillsexpandispadxspadyiis animations(4s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssappsgameidsbookmarksNonesrandomsTreeDataHolder_ClasssdatasTreeData_Classstops wm_minsizeswinfo_screenwidthsswsw1sw2smaxsminssubsampled_imagessCARDWs Tree_ClasssfontstreesframespacksTkintersBOTHspadxspadysSelectDialogPreviewCanvasspreviewssetupscanvass preview_keys preview_games preview_apps updatePreviews createButtonssfocussmainloopstimeout( s_sparentstitlesappsgameidsbookmarkskwsswsfocussw2sw1s bottom_frames top_frame((spysol.pys__init__Ks>       *37   cCs5t|ddtdfdd}ti||SdS(NsstringssSelectsCancelsdefaulti(sKwStructskwsNonesSelectGameDialogsinitKws_(s_skw((spysol.pysinitKwlscCs.|idd|iiti|dS(Nsdestroyi(s_s deletePreviewspreviews unbind_allsSelectGameDialogsdestroy(s_((spysol.pysdestroyqs icCsd|_|ioBt|ii|iii|o|iiidqUn|io+|ii |ii t |int |_|o(|i ot |i nt |_ ndS(Nisall( s_s preview_keyspreviewsunbind_destroyscanvassdeleteAllItemssdestroysdeletes preview_gamesendGamesdestructsNones preview_app(s_sdestroy((spysol.pys deletePreviewus       ic %Cs||ijodSn|i|ii}|iii|} | od|_dSn|i t jot d|ii d|d|iiid|iiiddd|iid |iid |iid |iid t d |iid|iiid|iid|iiidt d|iidt d|ii|_ d|i i_d|i i_nt |i _ |djo||i i_n|io|ii|ii n|i!i"d|ii#|nov|i$|i%f\} }| djo |djo:t(|| d|ddddddddt)d q]n| i*| |_|ii+|i ddf\}}|ii.|ii/f\}} |i2d!| | | | f|i3d|i4dt }||ijo|ii6i5i}n||ijo|i7o|ii8|i7n|ii9d"|d#d|i2d!| | || f|ii |i _ |iiiod$|i i_nd|i i_|ii5i|_5|i5i:|i5_;||_dS(%Nisaudioscanvasscardsetscommentssdebugis gamerandomsgdbsgimagessimagessmenubars miscrandomsopts startup_optsstatsstops top_cursorstoolbars constructGamesPlayable Preview - iidiispreviewsanchorssstexts Playable Areasfonts canvas_larges scrollregionsrandomsautoplayi(<sgameids_s preview_keys deletePreviewspreviewscanvassappsgdbsgetsgis preview_appsNonesStructsaudioscardsetscopyscommentssnews gamerandomsgimagesssubsampled_imagess miscrandomsopts startup_optsstatss top_cursors constructGamesshadowsshades animationss preview_gamesendGamesdestructstopswm_titlesgetGameTitleNames winfo_widths winfo_heightscwschs MfxCanvasTextsgetFonts gameclasss createPreviewstxstyswidthsheightsgwsghsconfigs xview_movetos yview_movetosrandomsgamesbookmarksrestoreGameFromBookmarksnewGamesORIGIN_PREVIEWsorigin( s_sgameids animationssgwstxstysrandomscanvasschsghscwsgi((spysol.pys updatePreviews~                  ( s__name__s __module__sSelectGameTreeWithPreviews Tree_ClasssNones__init__sinitKwsdestroys deletePreviews updatePreview(((spysol.pysSelectGameDialogWithPreviewIs  !   sSelectCardsetLeafcBstZRS(N(s__name__s __module__(((spysol.pysSelectCardsetLeafssSelectCardsetNodecBstZdZRS(NcCs}g}x\|iiiD]K}|i|o5t|i|d|id|i }|i |qqW|p |iii SdS(Nstextskey( scontentss_streesdatas all_objectssobjs select_funcsSelectCardsetLeafsnamesindexsnodesappends no_contents(s_snodesobjscontents((spysol.pys _getContentss$(s__name__s __module__s _getContents(((spysol.pysSelectCardsetNodessSelectCardsetDatacBstZdZRS(Nc Csti||i|_td|i|_tttddtg|_ t} t i i }|idg}xJ|D]B\}}|ii|o#|itt||dqqW|o"ttdt|dd} nt}t ii }|idg}xJ|D]B\}}|ii|o#|itt||d q%q%W|o8|ittd d ttd t|}nt}t ii }|idg}xJ|D]B\}}|ii|o#|itt||d qqW|o8|ittd dttdt|}nt}t ii }|idg}xJ|D]B\}}|ii|o#|itt||dqqW|o8|ittd dttdt|}nttttdddt |idjttdttddttddttddttddttdd fdd| |||f|_!dS(!NcCs|i S(N(sobjserror(sobj((spysol.pysss (no cardsets)skeycCst|d|dS(Ni(scmpsasb(sasb((spysol.pysscCs||iijS(N(skeyscsssistype(scsskey((spysol.pysssby TypesexpandedicCs||iijS(N(skeyscsssisstyles(scsskey((spysol.pysss UncategorizedcCs |ii S(N(scsssisstyles(scs((spysol.pysssby StylecCs||iijS(N(skeyscsssis nationalities(scsskey((spysol.pysscCs |ii S(N(scsssis nationalities(scs((spysol.pysssby NationalitycCs||iijS(N(skeyscsssisdates(scsskey((spysol.pysscCs |ii S(N(scsssisdates(scs((spysol.pysssby Dates All CardsetscCsdS(Ni((scs((spysol.pyssi sby Sizes Tiny cardsetscCs|iitijS(N(scsssissizesCSIs SIZE_TINY(scs((spysol.pysssSmall cardsetscCs|iitijS(N(scsssissizesCSIs SIZE_SMALL(scs((spysol.pysssMedium cardsetscCs|iitijS(N(scsssissizesCSIs SIZE_MEDIUM(scs((spysol.pysssLarge cardsetscCs|iitijS(N(scsssissizesCSIs SIZE_LARGE(scs((spysol.pysssXLarge cardsetscCs|iitijS(N(scsssissizesCSIs SIZE_XLARGE(scs((spysol.pyss("sSelectDialogTreeDatas__init__s_smanagersgetAllSortedByNames all_objectssfiltersSelectCardsetLeafsNones no_contentssselect_by_typesCSIsTYPEsitemsssortsnodesskeysnamesregistered_typessgetsappendsSelectCardsetNodestuplesselect_by_stylesSTYLEsregistered_stylessselect_by_nationalitys NATIONALITYsregistered_nationalitiessselect_by_datesDATEsregistered_datesslens rootnodes( s_smanagerskeysselect_by_datesnamesitemssselect_by_nationalitysselect_by_stylesnodessselect_by_type((spysol.pys__init__sb  '" ' ' '(s__name__s __module__s__init__(((spysol.pysSelectCardsetDatassSelectCardsetByTypeDatacBstZdZRS(NcCsti||i|_tttddtg|_t i i }|i dg}xJ|D]B\}}|ii|o#|itt||dqfqfWttdt|dd}tt|f|_dS(Ns (no cardsets)skeycCst|d|dS(Ni(scmpsasb(sasb((spysol.pysscCs||iijS(N(skeyscsssistype(scsskey((spysol.pysssby Typesexpandedi(sSelectDialogTreeDatas__init__s_smanagersgetAllSortedByNames all_objectssSelectCardsetLeafsNones no_contentssCSIsTYPEsitemsssortsnodesskeysnamesregistered_typessgetsappendsSelectCardsetNodestuplesselect_by_typesfilters rootnodes(s_smanagerskeysnamesitemssnodessselect_by_type((spysol.pys__init__s  '(s__name__s __module__s__init__(((spysol.pysSelectCardsetByTypeDatassSelectCardsetTreecBstZeZRS(N(s__name__s __module__sNonesdata(((spysol.pysSelectCardsetTreessSelectCardsetByTypeTreecBstZeZRS(N(s__name__s __module__sNonesdata(((spysol.pysSelectCardsetByTypeTreessSelectCardsetDialogWithPreviewcBsJtZeZeZeZedZdZ dZ dZ dZ RS(Nc Ks|i|}ti||||i|i|i |\} } |i | ||tjo|i}n||_||_ |iitjo|i|||i_n|iidd|iidjoddf\}} nddf\}} |i|| d|d|id|id ||_|iiid d d tid dd|i d|i!t"| d | |_#|i#i$||d|_&g|_'|i(||i)| |}|ii}|i+||i,dS(Niii ii,skeysdefaultsfontswidthssidesleftsfillsexpandispadxspadyi(-s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapsskeysNonesmanagers getSelectedsTreeDataHolder_ClasssdatasTreeData_Classstops wm_minsizeswinfo_screenwidthsw1sw2s Tree_ClasssfontstreesframespacksTkintersBOTHspadxspadysSelectDialogPreviewCanvasspreviewssetupsapps preview_keyspreview_imagess updatePreviews createButtonssfocussmainloopstimeout( s_sparentstitlesappsmanagerskeyskwsw1sfocussw2s bottom_frames top_frame((spysol.pys__init__%s2   7    cCsM|ii|iit|ii|iig|_t i|dS(N( s_streesupdateNodesWithTrees rootnodessNonesdestroyspreviews unbind_allspreview_imagess MfxDialog(s_((spysol.pysdestroy@s    cCs_t|ddddfddddd d d td d dd dd dd }ti||SdS(NsstringssOKsLoadsCancelsdefaultisseparatorwidthis resizableisfontspadxi spadys buttonpadxs buttonpadyi(sKwStructskwsNones MfxDialogsinitKws_(s_skw((spysol.pysinitKwFs  cCs$|ddfjo|ii|_d|i_n|ddfjo|ii|ii}| odSnt i i |i d}|djot i i |i d}ny&t|}|i}|iWn dSnXt|idtd|id |}dSnti||dS( Niiiis COPYRIGHTs config.txtstitles stext(sbuttons_strees selection_keyskeys n_expansionssmanagersgetscssosspathsjoinsdirsfsopensfilesreadstextsclosesDisplayTextDialogstopsCARDSETsnamesds MfxDialogsmDone(s_sbuttonsdsfsfilestextscs((spysol.pysmDoneOs(    c Cs ||ijodSn|ii}|ig|_|ii|} | od|_dSn| i \}}y_| i \}}xF|D]>} tii| i| | i}|iitd|qWWnd|_g|_dSnXddddd| id| idf\}} } }}}} x|iD]}t || | ddd|t!| |t!| |f\}}|d}||djod| | f\} } q;| |} q;W|i"d dd|||| f|i"d |d | ||_dS( Nisfileii sanchorsnwsimageis scrollregionsxscrollincrementsyscrollincrement(#skeys_s preview_keyspreviewscanvassdeleteAllItemsspreview_imagessmanagersgetscssgetPreviewCardNamessnamesscolumnssnsosspathsjoinsdirsextsfsappends loadImagesCARDWsCARDHsisxsyssxssysdxsdysimagesMfxCanvasImagesmaxsconfig(s_skeyscanvasssxsdxsfsisimagessysnsysdyscssxscolumnssnames((spysol.pys updatePreviewds@    !  > $ $( s__name__s __module__sSelectCardsetTrees Tree_ClasssTreeDataHolder_ClasssSelectCardsetDatasTreeData_ClasssNones__init__sdestroysinitKwsmDones updatePreview(((spysol.pysSelectCardsetDialogWithPreview!s   s$SelectCardsetByTypeDialogWithPreviewcBstZeZeZeZRS(N(s__name__s __module__sSelectCardsetByTypeTrees Tree_ClasssTreeDataHolder_ClasssSelectCardsetByTypeDatasTreeData_Class(((spysol.pys$SelectCardsetByTypeDialogWithPreviewssSelectTileLeafcBstZRS(N(s__name__s __module__(((spysol.pysSelectTileLeafssSelectTileNodecBstZdZRS(NcCs}g}x\|iiiD]K}|i|o5t|i|d|id|i }|i |qqW|p |iii SdS(Nstextskey( scontentss_streesdatas all_objectssobjs select_funcsSelectTileLeafsnamesindexsnodesappends no_contents(s_snodesobjscontents((spysol.pys _getContentss$(s__name__s __module__s _getContents(((spysol.pysSelectTileNodessSelectTileDatacBstZdZRS(NcCsSti||i|_td|i|_td|i|_tttddtg|_ t |t i jpt|idj}d}ttdtttddd tttd dd tttd dd tttdddtttdddtttdddfd|ttddd|f|_dS(NcCs|i S(N(sobjserror(sobj((spysol.pysscCs|idjo|iS(Ni(stilesindexsfilename(stile((spysol.pysss (no tiles)skeyiis Solid ColorssBlues#0082dfsGreens#008200sNavys#000086sOlives#868200sOranges#f79600sTeals#008286sexpandedsAll BackgroundscCsdS(Ni((stile((spysol.pyss(sSelectDialogTreeDatas__init__s_smanagersgetAllSortedByNames all_objectssfiltersSelectTileLeafsNones no_contentsstypeskeystypess StringTypeslense1se2sSelectTileNodes rootnodes(s_smanagerskeyse1se2((spysol.pys__init__s +(s__name__s __module__s__init__(((spysol.pysSelectTileDatassSelectTileTreecBstZeZRS(N(s__name__s __module__sNonesdata(((spysol.pysSelectTileTreessSelectTileDialogWithPreviewcBsJtZeZeZeZedZdZ dZ dZ dZ RS(Nc Ks|i|}ti||||i|i|i |\} } |i | ||tjo|i}n||_||_ |ii|_|iitjo|i|||i_n|iidd|iidjoddf\}} nddf\}} |i|| d|d|id|id||_|iii d d d t!i"d d d|i#d|i$t%| d| dd dd |_&|i&i |d|_'|i(||i)| |}|ii}|i+||i,dS(Niii i,skeysdefaultsfontswidthssidesleftsfillsexpandispadxspadyshbarsvbari(-s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapsskeysNonesmanagers getSelectedsappsopts tablecolorsTreeDataHolder_ClasssdatasTreeData_Classstops wm_minsizeswinfo_screenwidthsw1sw2s Tree_ClasssfontstreesframespacksTkintersBOTHspadxspadysSelectDialogPreviewCanvasspreviews preview_keys updatePreviews createButtonssfocussmainloopstimeout( s_sparentstitlesappsmanagerskeyskwsw1sfocussw2s bottom_frames top_frame((spysol.pys__init__s2   7!   cCsD|ii|iit|ii|iiti|dS(N( s_streesupdateNodesWithTrees rootnodessNonesdestroyspreviews unbind_alls MfxDialog(s_((spysol.pysdestroys  cCs_t|ddddfddddd d d td d dd dd dd }ti||SdS(NsstringssOKsSolid color...sCancelsdefaultisseparatorwidthis resizableisfontspadxi spadys buttonpadxs buttonpadyi(sKwStructskwsNones MfxDialogsinitKws_(s_skw((spysol.pysinitKws  cCs|djo|ii|_d|i_n|djotid|id|i dd}|o|doIt i |d|_|i|_ |ii |i|i|indSnti||dS(Niismasters initialcolorstitlesSelect table color(sbuttons_strees selection_keyskeys n_expansionsstkColorChoosersaskcolorstops tablecolorscsstringslowersupdateSelections updatePreviews MfxDialogsmDone(s_sbuttonsc((spysol.pysmDones    cCs6||ijodSn|ii}t|tijoN|id||i |i t |i t ||_||_ dSnt }|ii|}|oAytd|idd}Wqtij o}t }qXn|i |i ||i |i||_|t jo d|_ndS(Nsbgsfilesditherii(skeys_s preview_keyspreviewscanvasstypestypess StringTypesconfigsdeleteAllItemsssetTilesNones setTextColors tablecolorsimsmanagersgetstiles loadImagesfilenamesTkintersTclErrorsexs text_color(s_skeyscanvassimstilesex((spysol.pys updatePreviews0          ( s__name__s __module__sSelectTileTrees Tree_ClasssTreeDataHolder_ClasssSelectTileDatasTreeData_ClasssNones__init__sdestroysinitKwsmDones updatePreview(((spysol.pysSelectTileDialogWithPreviews   sSingleGame_StatsDialogcBsbtZdZdZdZdZdZdZdZdZ d Z d Z RS( NcKs|i|}ti||||i|i|i |\} } |i | ||pd|_ |iidd|i|_|i} |i} |idjp|idjo|i} |i} n|ii||\} }| | || |d|iii|g} t |d| } t!t |d| } t!t |d| }| | || |d |i"| |}|i$||i%dS( Ns Demo gamesii iXsTotalcCs|d|jS(Ni(sasb(sasb((spysol.pys scCs|ddjS(Nii(sa(sasb((spysol.pysscCs|ddjS(Nii(sa(sasb((spysol.pysssCurrent session(&s_sinitKwskws_ToplevelDialogs__init__sparentstitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssplayerstops wm_minsizesbuttonscreate3DBarCharts createChartscreatePieChartswinfo_screenwidthswinfo_screenheightscreateSimpleChartsappsstatssgetStatssgameidswonslosts session_gamessgetsgsfilterslens createButtonssfocussmainloopstimeout(s_sparentstitlesappsplayersgameidskwslostsfocussgs createChartswons bottom_frames top_frame((spysol.pys__init__s*   &  cCskddf\}}||djo:t|||}tt|dd}d|}n||fSdS(Nf0.0if1.0000000000000001e-05f0.99999000000000005f1.0(spwonsplostswonslostsfloatsminsmax(s_swonslostspwonsplost((spysol.pys_getPwons c Cstd}ti|}ti|d|d|}|i d}|i dti dti ddd d d d |i dti |id d||ddddti|d|d|ddd dd d}|id dd|dd|||fSdS(Ns tree_smallswidthsheightsinsertbackgroundssidesfillsexpandispadxispadyi iissoutlines#7f7f7fstextsfontsbdiiswindowsanchorsnw(sgetFontstfontsTkintersFramesframesCanvasswshscscgetsfgspacksTOPsBOTHscreate_rectanglesLabelstextsls create_window( s_sframeswshstextscsfgslstfont((spysol.pys_createChartInits ."-c Cs.td}|id} |i||\} }|d}|i ||dddddd|d | |i ||d dd ddd|d | |i ||d dd ddd|d | |d d}|i ||ddd|ddd|d | |i ||d dd|ddd|d | |i ||d dd||ddd|d | |d d} |i|d| || d | ||djo|d }ttd| } |i ||ddd| ddd|d | |i ||d ddd| ddd|d | ndS(Ns tree_smallsinsertbackgroundistextsWon:sanchorsnwsfontsfillisLost:isTotal:is%dsnei f100.0s%d%%id(sgetFontstfontscscgetsfgs_s_getPwonswonslostspwonsploststxsxs create_textstysys create_linesintsroundspw( s_scstxstyswonslostsxsploststfontsfgsyspwonspw((spysol.pys_createChartTexts%s$  ,,,004  0c Cs|djodSnt|}xddddfD]}|||d|||df||<|d}tt||d|} tt||d|} ||d| ||d| f||iiiiiiiiis#00ff00s#008200s#00c300ifii1i=iiiiiiiis#ff0000s#860400s#c70400iii0stextsfontsfill(sappsgimagessstatssimageswidthsheightsiwsihs_s_createChartInitsframestextscstfontsfgs_getPwonswonslostspwonsploststxsyystys create_imagespscols_createChart3DBars_createChartTextss create_textsplayer(s_sframesappswonsloststextscspwonstfontstysplostsiwscolsyysihsimagesfgstxsp((spysol.pyscreate3DBarChartYs % 'N N c Cs9|i|dd|\}} }|i||\}} dddf}dddf} ||d joLd d |d | f\} }} |id d ddddddd| d||id d ddddddd| |d| |id d ddddd| d||id d ddddd| |d| |d d | d f\}}|i|||d|ddd| d}|i|||d|dddni|id d dddddd|id d dddd|idddddd d!| dd"|i||| ||dS(#Ni,idiiiii)iKif0.0f360.0iii insfills#007f00sstartsextents#7f0000s#00ff00s#ff0000i is#7f7f7fs#f0f0f0iAi2stextsNo gamessanchorscentersfonts#bfbfbf(s_s_createChartInitsframestextscstfontsfgs_getPwonswonslostspwonsploststxstysssewonselosts create_arcsxsyscreate_rectangles create_ovals create_texts_createChartTexts(s_sframesappswonsloststextscspwonstxstysplostselostssstfontsfgsysxsewon((spysol.pyscreatePieChartls$! 04(,$ ($(cCsYt|ddddfddffddd d d d d ddd}ti||SdS(NsstringssOKs All games...ifsReset...i.sdefaultisseparatorwidthis resizableispadxi spady(sKwStructskws MfxDialogsinitKws_(s_skw((spysol.pysinitKws ! cCstdSdS(Nssmall(sgetFont(s_((spysol.pysgetDefaultFonts( s__name__s __module__s__init__s_getPwons_createChartInits_createChartTextss_createChart3DBarscreateSimpleChartscreate3DBarChartscreatePieChartsinitKwsgetDefaultFont(((spysol.pysSingleGame_StatsDialogs        s"AllGames_StatsDialogScrolledCanvascBstZRS(N(s__name__s __module__(((spysol.pys"AllGames_StatsDialogScrolledCanvasssAllGames_StatsDialogcBstZddf\ZZeidjo dZndZdZdZdZ d Z e d Z d Z d eifd YZRS(Niismaciic Ksd}|o|idjo d}nt|d||i|i|}ti ||||i |i |i |\} } |i| |||_|iidd|i |_|i|_t| d|id|i|_|iidtidd d |id |ih|_|ii |_ ||i _!t"|i d |i#|i$|||i i&d }|i i'ddd|d|df|i i(|i)|i*| |}|i,||i-dS(NiiXisheightiswidthsfillsexpandispadxspadyssalls scrollregioniii(.slinessparentswinfo_screenheights kwdefaultskws_sCHAR_HsinitKws_ToplevelDialogs__init__stitles resizablesdefaults createFramess top_frames bottom_frames createBitmapssappstops wm_minsizesbuttonsfonts"AllGames_StatsDialogScrolledCanvasswidthsheightsscspacksTkintersBOTHspadxspadysnodesscanvassdialogsbinds singleClicks fillCanvassplayersbboxsconfigs yview_movetosYVIEWs createButtonssfocussmainloopstimeout( s_sparentstitlesappsplayerskwslinessfocussbboxs bottom_frames top_frame((spysol.pys__init__s0    !.  'cCs_t|ddddfddffddd d d d d ddddd}ti||SdS(NsstringssOKs Save to fileis Reset all...i-sdefaultisseparatorwidthis resizableispadxi spadyswidthi(sKwStructskws MfxDialogsinitKws_(s_skw((spysol.pysinitKws !   cCstdSdS(Nssmall(sgetFont(s_((spysol.pysgetDefaultFontscCs<t|_t|i_h|_|iiti|dS(N( sNones_sappscanvassdialogsnodessscsdestroys MfxDialog(s_((spysol.pysdestroys     cCs}|iiti}| odSn|ii|dttf\}}dS|o|o |G|GHn|o |GHndS(Ni( s_scanvass find_withtagsTkintersCURRENTsidsnodessgetsNonesgameids gamenumber(s_seventsgameidsids gamenumber((spysol.pys singleClicks% cCs{t|i}|i|i|i|i}|i ||| o|i dt |dnt|t|dS(NsNo entries for player s (sPysolStatsFormatters_sappsas CanvasWriterscanvassfontsCHAR_Hswriters writeStatssplayersheaderspsustrsdestruct(s_splayersheadersaswriter((spysol.pys fillCanvass  s CanvasWritercBsYtZdZdZdZdZedZdZdZ ddd Z RS( NcCsf||_|id|_||_||_d|_|_t|_ t|_ |ii d|dS(Nsinsertbackgroundisyscrollincrement( scanvass_scgetsfgsfontshsxsysNonesgameids gamenumbersconfig(s_scanvassfontsh((spysol.pys__init__s     cCs#|i|if|iii|is iistextsanchorsnwsfontsfill( s_sysh1sh2ssshscanvass create_textsxsfontsfgsids_addItem(s_sssh2sh1sid((spysol.pysps   9cCsdS(N((s_ss((spysol.pyspheadersc Csj|idjodSn||_t|_d|if\} } |i}d}t ||| | dddt |}t ||| d| dddt |}t ||| d | dddt |}t ||| d | dddt |}t ||| d | dddt |}|i| d | t ||i||_t|_dS( Ni>iisanchorsnwstextisneii,i^it(s_sysgameidsNones gamenumbersxs _pstats_textspshsmaxsustrst1st2st3st4st5s pstats_perc( s_st1st2st3st4st5sgameidshspsysx((spysol.pyspstatss   *....cKsRt|d|id|it|ii||f|}|i ||i SdS(Nsfontsfill( s kwdefaultskws_sfontsfgsapplyscanvass create_textsxsysids_addItemsh(s_sxsyskwsid((spysol.pys _pstats_texts c Cs|od|djo djn odSntttit|}|djodSn||dddd|i df\} } }} nott||d }no |djodSn|djo[td |}t|d|}|ii| | | || | d dd d dd}n||jo=|ii| || | || | d dd ddd}ndSnt}|ii| | | || | d dd |dd}no| d|df\} }| d| df\} } tt||d }|djo9|ii| | | || | d dd d dd}n||jo=|ii| || | || | d dd ddd}ndSnd}| d}xddddddddddf D]}||joPndd|d|f\}}} d t|t|t| f} |ii|| d|d!| | dd dd | d| }|d}td"|d#}qWdS($Ns0is9iiii if100.0iswidthsfills#00ff00soutlines#000000s#ff0000s#808080sf1.0i iii)i3i=iGiQi[iii@s #%02x%02x%02xif0.0f0.10000000000000001(stsintsroundsstringsatofsstrspercsxsys_shsrxsrysrwsrhswsmaxsminscanvasscreate_rectanglesidsNonesfillspsixsisrsgsbsc(s_sxsystsixsidsfillspercsrwsrxsrysrhscsbsgsispsrsw((spysol.pys pstats_percsZ*! 1 # '# # ' %  %+ icCs{|djo"d|dd!jo djno||_||_n|id||||ft|_t|_dS(Nis0is9s%-25s %-20s %17s %s (sgameids gamenumbers_spsgamenamesdatesstatussNone(s_sgamenames gamenumbersdatesstatussgameidswon((spysol.pysplog(s 2   ( s__name__s __module__s__init__s_addItemspspheadersNonespstatss _pstats_texts pstats_percsplog(((spysol.pys CanvasWriters      -(s__name__s __module__sCHAR_WsCHAR_HsossnamesYVIEWs__init__sinitKwsgetDefaultFontsdestroysNones singleClicks fillCanvassPysolStatsFormatters StringWriters CanvasWriter(((spysol.pysAllGames_StatsDialogs      sFullLog_StatsDialogcBs tZdZdZdZRS(NicCsqt|i}|i|i|i|i}|i ||| o|i dt |dnt|dS(NsNo log entries for s (sPysolStatsFormatters_sappsas CanvasWriterscanvassfontsCHAR_Hswriters writeFullLogsplayersheaderspsustrsdestruct(s_splayersheadersaswriter((spysol.pys fillCanvas1s c CsZt|ddddfddffddd td d d |i}ti||SdS( NsstringssOKsSession log...ihs Save to fileisdefaultisfonts canvas_fixedswidthiL(sKwStructskwsgetFonts_sCHAR_WsAllGames_StatsDialogsinitKw(s_skw((spysol.pysinitKw7s ! (s__name__s __module__sYVIEWs fillCanvassinitKw(((spysol.pysFullLog_StatsDialog/s sSessionLog_StatsDialogcBstZdZdZRS(NcCsqt|i}|i|i|i|i}|i ||| o|i dt |dnt|dS(Ns#No current session log entries for s (sPysolStatsFormatters_sappsas CanvasWriterscanvassfontsCHAR_HswriterswriteSessionLogsplayersheaderspsustrsdestruct(s_splayersheadersaswriter((spysol.pys fillCanvas?s cCsAt|ddddfddffdd}ti||SdS( NsstringssOKs Full log...igs Save to fileisdefaulti(sKwStructskwsFullLog_StatsDialogsinitKws_(s_skw((spysol.pysinitKwEs'(s__name__s __module__s fillCanvassinitKw(((spysol.pysSessionLog_StatsDialog>s s AbstractCardcBstZdddZdZdZdZdZddZd Zd Z e d Z dd Z dd Z dZRS(NicCsr||_||_||_|d|_||_||_||_t|_ d|_ t|_ d|_ |_ dS(Nii(sids_sdeckssuitscolorsranksxsysNonesitemsface_ups hide_stackshide_xshide_y(s_sidsdeckssuitsranksgamesxsy((spysol.pys__init__Ks          cCs$d|i|i|i|ifSdS(NsCard(%d, %d, %d, %d)(s_sidsdeckssuitsrank(s_((spysol.pys__str__WscCs|itj SdS(N(s_s hide_stacksNone(s_((spysol.pysisHiddenYscCs0|i||i|i||i|idS(N(s_smoveBysxshide_xsyshide_y(s_sxsy((spysol.pysmoveTo[scCsgt|t|f\}}|p|o7|i||_|i||_|ii||ndS(N(sintsdxsdys_sxsysitemsmove(s_sdxsdy((spysol.pysmoveBy]s icCs&|o|in|iidS(N(sunhides_sitemstkraise(s_sunhide((spysol.pystkraisecscCsdS(N((s_sstack((spysol.pyshidegscCsdS(N((s_((spysol.pysunhideiscCsdS(N((s_sssgroup((spysol.pys setSelectedkscCs tdS(N(sSubclassResponsibility(s_sunhide((spysol.pysshowFacemscCs tdS(N(sSubclassResponsibility(s_sunhide((spysol.pysshowBackoscCs tdS(N(sSubclassResponsibility(s_simage((spysol.pysupdateCardBackgroundqs(s__name__s __module__s__init__s__str__sisHiddensmoveTosmoveBystkraiseshidesunhidesNones setSelectedsshowFacesshowBacksupdateCardBackground(((spysol.pys AbstractCardJs          s_HideableCard_1cBstZdZdZRS(NcCs||ijodSn|io*|i|i|i|if\}}n|i|if\}}|i}|ii i |ii d|i |||i|if\|_|_||_dS(Nsmove( sstacks_s hide_stackshide_xshide_yshxshysitemscanvasstkscalls_wsid(s_sstacksitemshxshy((spysol.pyshidets * (cCsz|itjodSn|i}|iii|iid|i|i |i ddf\|_ |_ t|_dSdS(Nismovei( s_s hide_stacksNonesitemscanvasstkscalls_wsidshide_xshide_y(s_sitem((spysol.pysunhides 0 (s__name__s __module__shidesunhide(((spysol.pys_HideableCard_1ss s_HideableCard_2cBstZdZdZRS(NcCs8||ijodSn|iidd||_dS(Nsstateshidden(sstacks_s hide_stacksitemsconfig(s_sstack((spysol.pyshidescCs<|itjodSn|iiddt|_dSdS(Nisstatesnormali(s_s hide_stacksNonesitemsconfig(s_((spysol.pysunhides  (s__name__s __module__shidesunhide(((spysol.pys_HideableCard_2s is _OneImageCardcBsJtZdddZdZddZddZdZdZRS( Nic Csti||||||d|d||i ||||_ |i ||||_ |i |_t|i|i|i d|idd|_dS(Nsxsysimagesanchorsnw(s _HideableCards__init__s_sidsdeckssuitsranksgamesxsysgetCardFaceImages _face_imagesgetCardBackImages _back_images _active_imagesMfxCanvasImagescanvassitem(s_sidsdeckssuitsranksgamesxsy((spysol.pys__init__s ( cCs4||ij o |iid|||_ndS(Nsimage(simages_s _active_imagesitemsconfig(s_simage((spysol.pys _setImagesicCs<|i o-|id|i|i|d|_ndS(Nsimagei(s_sface_ups _setImages _face_imagestkraisesunhide(s_sunhide((spysol.pysshowFaces  cCs;|io-|id|i|i|d|_ndS(Nsimagei(s_sface_ups _setImages _back_imagestkraisesunhide(s_sunhide((spysol.pysshowBacks  cCs,||_|i o|id|ndS(Nsimage(simages_s _back_imagesface_ups _setImage(s_simage((spysol.pysupdateCardBackgrounds  cCsst|t|f\}}|i||_|i||_|i}|iii |ii d|i ||dS(Nsmove( sintsdxsdys_sxsysitemscanvasstkscalls_wsid(s_sdxsdysitem((spysol.pysmoveBys  (s__name__s __module__s__init__s _setImagesshowFacesshowBacksupdateCardBackgroundsmoveBy(((spysol.pys _OneImageCards     s_OneImageCardWithHideByConfigcBs;tZdZdZddZddZdZRS(NcCs5||ijodSn|idt||_dS(Nsimage(sstacks_s hide_stacks _setImagesNone(s_sstack((spysol.pyshidescCs]|itjodSn|io|id|in|id|it|_dSdS(Nisimagei(s_s hide_stacksNonesface_ups _setImages _face_images _back_image(s_((spysol.pysunhides  icCsG|i o8|o|id|in|iid|_ndS(Nsimagei(s_sface_upsunhides _setImages _face_imagesitemstkraise(s_sunhide((spysol.pysshowFaces   cCsF|io8|o|id|in|iid|_ndS(Nsimagei(s_sface_upsunhides _setImages _back_imagesitemstkraise(s_sunhide((spysol.pysshowBacks   cCs7||_|i o|i o|id|ndS(Nsimage(simages_s _back_imagesface_ups hide_stacks _setImage(s_simage((spysol.pysupdateCardBackgrounds (s__name__s __module__shidesunhidesshowFacesshowBacksupdateCardBackground(((spysol.pys_OneImageCardWithHideByConfigs    s _TwoImageCardcBs8tZdddZddZddZdZRS(Nic Csti||||||d|d|t |i |_ t |i |i|i d|i|||dd|_t |i |i|i d|i|||dd|_|ii|i |ii|i dS(Nsxsysimagesanchorsnw(s _HideableCards__init__s_sidsdeckssuitsranksgamesxsysMfxCanvasGroupscanvassitemsMfxCanvasImagesgetCardFaceImages_TwoImageCard__facesgetCardBackImages_TwoImageCard__backsaddtag(s_sidsdeckssuitsranksgamesxsy((spysol.pys__init__s (99icCsg|i oXto*|iidd|iiddn|ii|i|d|_ndS(Nsstateshiddensnormali(s_sface_ups TK_DASH_PATCHs_TwoImageCard__backsconfigs_TwoImageCard__facestkraisesunhide(s_sunhide((spysol.pysshowFaces   cCsf|ioXto*|iidd|iiddn|ii|i|d|_ndS(Nsstateshiddensnormali(s_sface_ups TK_DASH_PATCHs_TwoImageCard__facesconfigs_TwoImageCard__backstkraisesunhide(s_sunhide((spysol.pysshowBacks   cCs|iid|dS(Nsimage(s_s_TwoImageCard__backsconfigsimage(s_simage((spysol.pysupdateCardBackgrounds(s__name__s __module__s__init__sshowFacesshowBacksupdateCardBackground(((spysol.pys _TwoImageCards  s_TwoImageCardWithHideItemcBs8tZdddZddZddZdZRS(Nic Csti||||||d|d|t |i |_ t |i |i|i dd|i|||dd|_t |i |i|i d|i|||dd|_|ii|i |ii|i dS(Nsxsyi*simagesanchorsnw(s _HideableCards__init__s_sidsdeckssuitsranksgamesxsysMfxCanvasGroupscanvassitemsMfxCanvasImagesgetCardFaceImages_TwoImageCardWithHideItem__facesgetCardBackImages_TwoImageCardWithHideItem__backsaddtag(s_sidsdeckssuitsranksgamesxsy((spysol.pys__init__s (=9icCsO|i o@|iidd|iidd|i|d|_ndS(Nii'ii(s_sface_ups_TwoImageCardWithHideItem__backsmoves_TwoImageCardWithHideItem__facestkraisesunhide(s_sunhide((spysol.pysshowFaces   cCsN|io@|iidd|iidd|i|d|_ndS(Nii*i(s_sface_ups_TwoImageCardWithHideItem__facesmoves_TwoImageCardWithHideItem__backstkraisesunhide(s_sunhide((spysol.pysshowBacks   cCs|iid|dS(Nsimage(s_s_TwoImageCardWithHideItem__backsconfigsimage(s_simage((spysol.pysupdateCardBackgrounds(s__name__s __module__s__init__sshowFacesshowBacksupdateCardBackground(((spysol.pys_TwoImageCardWithHideItems  sImagesCardbackcBstZedZRS(NcCs?|tjo |}n||_||_||_||_dS(N(s menu_imagesNonesimagesindexs_sname(s_sindexsnamesimages menu_image((spysol.pys__init__ s     (s__name__s __module__sNones__init__(((spysol.pysImagesCardbackssImagescBstZddZdZdddZdZdZeddZd Z d Z d Z d Z d dZ dZdZdZdZdZRS(NicCs8||_||_||_|tjodSn|i||i||i |f\|_|_|_ d||_ |i |_ |djot d|i ||_ n|i||i|f\|_|_|i||i|f\|_|_d|_g|_g|_g|_g|_g|_g|_dS(Ni ii i(s dataloaders_sdscssrsreducedsNonesCARDWsCARDHsCARDDs CARD_XOFFSETsCARD_UP_YOFFSETs CARD_YOFFSETsmaxsSHADOW_XOFFSETsSHADOW_YOFFSETsCARD_DXsCARD_DYs _shade_indexs_cards_backs_bottoms_letters_shadows_shade(s_s dataloaderscssr((spysol.pys__init__s&    6   &&      cCsdS(N((s_((spysol.pysdestruct$scCstii|ii|}td|}|i |i f\}}|idjo||f\|_|_nI|o ||ijp|o ||ijotd|||fn|SdS(NsfileisInvalid size %dx%d of image %s(sosspathsjoins_scssdirsfilenamesfs loadImagesimgswidthsheightswshsCARDWsCARDHscheck_wscheck_hs Exception(s_sfilenamescheck_wscheck_hsimgsfshsw((spysol.pys __loadCard&s.cCsst|id|id}tdtt|}|i|}|i i t t |i |||dS(Nf40.0f60.0i(smaxs_sCARDWsCARDHsrsintsroundsim1s subsamplesim2s_backsappendsImagesCardbackslensname(s_sim1snamesrsim2((spysol.pys __addBack1scCs/|i oZt|i|idddd}d}|i||t|i i |f|i _ nt }x]t |idjoF|t jo%t|i|idt dd}n|ii|qnWx]t |idjoF|t jo%t|i|idt dd}n|ii|qWdS(Nsfills#a0a0a0soutlines#000000sii(s_s_backs createImagesCARDWsCARDHsimsnames_Images__addBackstuplescss backnamessNonesbottomslens_bottomsappends_letter(s_snamesbottomsim((spysol.pys_createMissingImages6s  !# % %ic Csm|iid} d}|on|iit|ii|ii|ii }| o||ii d}nt dd|i |}nxe|iiD]T}|ii|i||ii||id_|o|id|qqWt|i|iijptxL|iiD]>}y.|o#|i|} |i| |nWq#q#Xq#W|o|iddnxpt|iiD]\}y1d|d| f}|ii|i|WnnX|o|id|qqWxpt|ii D]\}y1d|d| f}|ii|i|WnnX|o|id|qqWxt|ii D]}|o|iitnPd|| f}y|i|d dd d} Wn t} nX|ii| |o|id|qyqyW|o|i itn|i i|id | |o|id|n|i!dSdS( Niif80.0issteps bottom%02d.%ssl%02d.%ss shadow%02d.%sscheck_wscheck_hsshade.("s_scssextspstepsprogresssncardsslens backnamessnbottomssnletterssfastsnshadowssmaxspercentsgetFaceCardNamessns_cardsappends_Images__loadCardsfilenamesupdatesAssertionErrorsnamesims_Images__addBacksrangesis_bottomsranks_letters_shadowsNones_shades_createMissingImages( s_sappsprogresssfastsrankspstepsnamesisnsextsim((spysol.pysloadEsz0##   cCs3|t|ii|}|i||iiSdS(N( ssuitslens_scssrankssranksindexs_cardsncards(s_sdeckssuitsranksindex((spysol.pysgetFacezscCs+|iit|i}|i|iSdS(N(s_scss backindexslens_backsindexsimage(s_sdeckssuitsranksindex((spysol.pysgetBack}scCs|idSdS(Ni(s_s_bottom(s_((spysol.pysgetTalonBottomscCs|idSdS(Ni(s_s_bottom(s_((spysol.pysgetReserveBottomsicCswt|tijpt|djo|idSnd|}|t|ijo|idSn|i|SdS(Niii( stypessuitstypessIntTypesAssertionErrors_s_bottomsislen(s_ssuitsi((spysol.pys getSuitBottoms  cCs|idSdS(Ni(s_s_bottom(s_((spysol.pysgetBraidBottomscCsYd|jo djnpt|t|ijo|idSn|i|SdS(Nii(sranksAssertionErrorslens_s_letters_bottom(s_srank((spysol.pys getLetters%cCsA|djpt|t|ijotSn|i|SdS(Ni(sncardssAssertionErrorslens_s_shadowsNone(s_sncards((spysol.pys getShadowscCs|i|iSdS(N(s_s_shades _shade_index(s_((spysol.pysgetShadescCs |iSdS(N(s_s_back(s_((spysol.pys getCardbackss(s__name__s __module__s__init__sdestructs_Images__loadCards_Images__addBacks_createMissingImagessNonesloadsgetFacesgetBacksgetTalonBottomsgetReserveBottoms getSuitBottomsgetBraidBottoms getLetters getShadowsgetShades getCardbacks(((spysol.pysImagess     5         sSubsampledImagescBs&tZddZdZdZRS(NicCsbti|t|id||i|i||_|i|i ||_ |i|i ||_ xo|i D]d}|tjo|i i tqn|i i|}|i i tt|i |i||qnW|i|if\}}xm|iD]b}|tjptddddfjo|ii tq|ii t|dd||qWdS(Nsriii(sImagess__init__s_sNonesimagesscssrs _subsamples_cards_bottoms_letters_backsappendsimages subsamplesimsImagesCardbackslensnamesCARDWsCARDHsCWsCHs_shades tkversions copyImage(s_simagessrsCHs_backsimsCW((spysol.pys__init__s   / &cCstSdS(N(sNone(s_sncards((spysol.pys getShadowscCs`g}xO|D]G}|tjp |djo|i|q |i|i|q W|SdS(Ni(ssslsimsNonesrsappends subsample(s_slsrsssim((spysol.pys _subsamples(s__name__s __module__s__init__s getShadows _subsample(((spysol.pysSubsampledImagess  s AtomicMovecBs,tZdZdZdZdZRS(NcCs|i|dS(N(s_sredosgame(s_sgame((spysol.pysdoscCst|iSdS(N(sstrs_s__dict__(s_((spysol.pys__repr__scCst|iSdS(N(sstrs_s__dict__(s_((spysol.pys__str__scCsdSdS(Ni((s_sother((spysol.pys cmpForRedos(s__name__s __module__sdos__repr__s__str__s cmpForRedo(((spysol.pys AtomicMoves   s AMoveMovecBs8tZddZdZdZdZdZRS(NicCsK||j pt||_|i|_|i|_||_||_ dS(N( s from_stacksto_stacksAssertionErrorsncardss_sids from_stack_ids to_stack_idsframessshadow(s_sncardss from_stacksto_stacksframessshadow((spysol.pys__init__s     c Cs|ii|ijo&|i||i| pt ng} x-t |D]}|i }| i|qOW| i|idjoH|i| d\} }|i||| | |d|id|inx| D]}|i|qWdS(Nisframessshadow(sgamesmovessstatesS_PLAYsto_stacks acceptsCardss from_stackscardssncardssAssertionErrorsrangesis removeCardscardsappendsreverses_sframessgetPositionForsxsysanimatedMoveTosshadowscsaddCard( s_sgamesncardss from_stacksto_stackscsisyscardscardssx((spysol.pys__doMoves&   /cCs1|i||i|i|i|i|idS(N(s_s_AMoveMove__doMovesgamesncardss allstackss from_stack_ids to_stack_id(s_sgame((spysol.pysredoscCs1|i||i|i|i|i|idS(N(s_s_AMoveMove__doMovesgamesncardss allstackss to_stack_ids from_stack_id(s_sgame((spysol.pysundoscCsCt|i|ip)t|i|ipt|i|iSdS(N(scmps_sncardssothers from_stack_ids to_stack_id(s_sother((spysol.pys cmpForRedos(s__name__s __module__s__init__s_AMoveMove__doMovesredosundos cmpForRedo(((spysol.pys AMoveMoves    s AFlipMovecBs5tZdZdZdZdZdZRS(NcCs|i|_dS(N(sstacksids_sstack_id(s_sstack((spysol.pys__init__scCs3|id}|io|in |idS(Ni(sstackscardsscardsface_upsshowBacksshowFace(s_sgamesstackscard((spysol.pys__doMoves  cCs|i||i|idS(N(s_s_AFlipMove__doMovesgames allstackssstack_id(s_sgame((spysol.pysredoscCs|i||i|idS(N(s_s_AFlipMove__doMovesgames allstackssstack_id(s_sgame((spysol.pysundoscCst|i|iSdS(N(scmps_sstack_idsother(s_sother((spysol.pys cmpForRedos(s__name__s __module__s__init__s_AFlipMove__doMovesredosundos cmpForRedo(((spysol.pys AFlipMoves     sATurnStackMovecBs/tZddZdZdZdZRS(NicCs9||j pt|i|_|i|_||_dS(N(s from_stacksto_stacksAssertionErrorsids_s from_stack_ids to_stack_ids update_flags(s_s from_stacksto_stacks update_flags((spysol.pys__init__s  cCs|i|i}|i|i}t|idjpt t|idjpt t|i}xlt |D]^}d}|id|dd}|ipt |i|d|dd|id|qvW|id@o"dpt |id|_n|id@oX||iijpt |i|ijp |idjpt |id|_n|i|idS(Niisunhidesupdatei(sgames allstackss_s from_stack_ids from_stacks to_stack_idsto_stackslenscardssAssertionErrorslsrangesisunhides removeCardscardsface_upsaddCardsshowBacks update_flagssroundssstalons max_roundss updateText(s_sgamescardsunhidesislsto_stacks from_stack((spysol.pysredos* * cCs|i|i}|i|i}t|idjpt t|idjpt t|i}xmt |D]_}d}|id|dd}|i pt |id||i|d|ddqvW|id@o9dpt |idjpt |id|_n|id@oE||iijpt |idjpt |id|_n|i|idS(Niisunhidesupdatei(sgames allstackss_s to_stack_ids from_stacks from_stack_idsto_stackslenscardssAssertionErrorslsrangesisunhides removeCardscardsface_upsshowFacesaddCards update_flagssroundssstalons updateText(s_sgamescardsunhidesislsto_stacks from_stack((spysol.pysundo s,  cCsCt|i|ip)t|i|ipt|i|iSdS(N(scmps_s from_stack_idsothers to_stack_ids update_flags(s_sother((spysol.pys cmpForRedos(s__name__s __module__s__init__sredosundos cmpForRedo(((spysol.pysATurnStackMoves   sNEW_ATurnStackMovecBs8tZddZdZdZdZdZRS(NicCs9||j pt|i|_|i|_||_dS(N(s from_stacksto_stacksAssertionErrorsids_s from_stack_ids to_stack_ids update_flags(s_s from_stacksto_stacks update_flags((spysol.pys__init__$s  cCst|idjptt|idjptx|iD]z}|ii|i|ii |i|o&|i pt|i ddqD|i pt|i ddqDW|i|_g|_|i|i|i|idS(Nisunhide(slens from_stackscardssAssertionErrorsto_stackscardsitemsdtagsgroupsaddtags show_facesface_upsshowFacesshowBacks refreshViews updateText(s_s from_stacksto_stacks show_facescard((spysol.pys__doMove)s"      cCs|i|i}|i|i}|id@oX||ii jpt |i |i jp |i djpt |i d|_ n|i ||ddS(Nii(sgames allstackss_s from_stack_ids from_stacks to_stack_idsto_stacks update_flagsssstalonsAssertionErrorsrounds max_roundss_NEW_ATurnStackMove__doMove(s_sgamesto_stacks from_stack((spysol.pysredo;s*cCs|i|i}|i|i}|id@oE||ii jpt |i djpt |i d|_ n|i ||ddS(Ni( sgames allstackss_s from_stack_ids from_stacks to_stack_idsto_stacks update_flagsssstalonsAssertionErrorsrounds_NEW_ATurnStackMove__doMove(s_sgamesto_stacks from_stack((spysol.pysundoCscCsCt|i|ip)t|i|ipt|i|iSdS(N(scmps_s from_stack_idsothers to_stack_ids update_flags(s_sother((spysol.pys cmpForRedoKs(s__name__s __module__s__init__s_NEW_ATurnStackMove__doMovesredosundos cmpForRedo(((spysol.pysNEW_ATurnStackMove#s     sAUpdateStackMovecBs5tZdZdZdZdZdZRS(NcCs|i|_||_dS(N(sstacksids_sstack_idsflags(s_sstacksflags((spysol.pys__init__Ps cCsa|id@o|i||in9|id@o|in|id@o|indS(Ni@ii (s_sflagssstacks updateModelsundos updateTexts refreshView(s_sgamesstacksundo((spysol.pys__doMoveSs cCs?|id@ddfjo!|i||i|idndS(Niii(s_sflagss_AUpdateStackMove__doMovesgames allstackssstack_id(s_sgame((spysol.pysredo[scCs?|id@ddfjo!|i||i|idndS(Niii(s_sflagss_AUpdateStackMove__doMovesgames allstackssstack_id(s_sgame((spysol.pysundo^scCs-t|i|ipt|i|iSdS(N(scmps_sstack_idsothersflags(s_sother((spysol.pys cmpForRedoas(s__name__s __module__s__init__s_AUpdateStackMove__doMovesredosundos cmpForRedo(((spysol.pysAUpdateStackMoveOs     sANextRoundMovecBs,tZdZdZdZdZRS(NcCs|i|_dS(N(sstacksids_sstack_id(s_sstack((spysol.pys__init__fscCsr|i|i}||iijpt|i|i jp |i djpt|id|_|i dS(Nii( sgames allstackss_sstack_idsstackssstalonsAssertionErrorsrounds max_roundss updateText(s_sgamesstack((spysol.pysredohs *cCs_|i|i}||iijpt|idjpt|id|_|i dS(Ni( sgames allstackss_sstack_idsstackssstalonsAssertionErrorsrounds updateText(s_sgamesstack((spysol.pysundons cCst|i|iSdS(N(scmps_sstack_idsother(s_sother((spysol.pys cmpForRedots(s__name__s __module__s__init__sredosundos cmpForRedo(((spysol.pysANextRoundMovees   s ASaveSeedMovecBs,tZdZdZdZdZRS(NcCs|ii|_dS(N(sgamesrandomsgetSeeds_sseed(s_sgame((spysol.pys__init__wscCs|ii|idS(N(sgamesrandomssetSeeds_sseed(s_sgame((spysol.pysredoyscCs|ii|idS(N(sgamesrandomssetSeeds_sseed(s_sgame((spysol.pysundo{scCst|i|iSdS(N(scmps_sseedsother(s_sother((spysol.pys cmpForRedo}s(s__name__s __module__s__init__sredosundos cmpForRedo(((spysol.pys ASaveSeedMovevs   sAShuffleStackMovecBs,tZdZdZdZdZRS(NcCs@|i|_ttd|i|_|i i |_ dS(NcCs|iS(N(scsid(sc((spysol.pyss( sstacksids_sstack_idstuplesmapscardsscard_idssgamesrandomsgetSeedsseed(s_sstacksgame((spysol.pys__init__s cCs|i|i}||iijpt|it t d|i jpt|i i |i|i }t|d}xS|djoE|i id|}||||f\||<||<|d}qW|idS(NcCs|iS(N(scsid(sc((spysol.pyssii(sgames allstackss_sstack_idsstackssstalonsAssertionErrorscard_idsstuplesmapscardssrandomssetSeedsseedsseqslensnsrandintsjs refreshView(s_sgamesseqsjsnsstack((spysol.pysredos,  "cCs|i|i}g}xB|iD]7}|i|}|i|jpt |i |q W||_|i i |i |idS(N(sgames allstackss_sstack_idsstackscardsscard_idssidscsAssertionErrorsappendsrandomssetSeedsseeds refreshView(s_sgamescsidscardssstack((spysol.pysundos   cCsCt|i|ip)t|i|ipt|i|iSdS(N(scmps_sstack_idsotherscard_idssseed(s_sother((spysol.pys cmpForRedos(s__name__s __module__s__init__sredosundos cmpForRedo(((spysol.pysAShuffleStackMoves  cCs<| odSnx!|D]}|i odSqqWdSdS(Nii(scardsscsface_up(scardssc((spysol.pys cardsFaceUps  cCs;| odSnx |D]}|iodSqqWdSdS(Nii(scardsscsface_up(scardssc((spysol.pys cardsFaceDowns  i cCsft| odSn|d}x;|dD]/}|i|||ijodSn|}q+WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmod(scardssmodsdirsc2sc1((spysol.pysisRankSequences   cCsyt| odSn|d}xN|dD]B}|i|||ijp|i|ijodSn|}q+WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmodscolor(scardssmodsdirsc2sc1((spysol.pysisAlternateColorSequences  . cCsyt| odSn|d}xN|dD]B}|i|||ijp|i|ijodSn|}q+WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmodscolor(scardssmodsdirsc2sc1((spysol.pysisSameColorSequences  . cCsyt| odSn|d}xN|dD]B}|i|||ijp|i|ijodSn|}q+WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmodssuit(scardssmodsdirsc2sc1((spysol.pysisSameSuitSequences  . cCsyt| odSn|d}xN|dD]B}|i|||ijp|i|ijodSn|}q+WdSdS(Nii(s cardsFaceUpscardssc1sc2sranksdirsmodssuit(scardssmodsdirsc2sc1((spysol.pysisAnySuitButOwnSequences  . cCsttd|SdS(NcCs|i S(N(ssscards(ss((spysol.pyss(slensfiltersstacks(sstacks((spysol.pysgetNumberOfFreeStacksscCsmg}xG|D]?}|i p|idi otSn|i|idq W|o|in|SdS(Ni(scardssstackssssface_upsNonesappendsreverse(sstackssreversescardsss((spysol.pysgetPileFromStacksssStackcBstZhdZdZdZdZdZdZdZdZ d d d Z e d d d Z d Z d ZdZdZe dZdZdZe dZdZdZdZdZdZdZdZdZdZdZdddZd Z d d!Z!ddd d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d d2Z2d3Z3d4d5Z4d6Z5d7Z6d8Z7d9Z8d:Z9d;Z:d<Z;d=Z<d>Z=d?Z>d@Z?dAZ@d dBZAdCZBdDZCd4d4dEZDdFZEdGZFdHZGe dIZHe dJZIRS(KNc Cst|i}|ii|tt|}tt|}||f}||i |<|||f\}} }||_||_g|_tdddddddddddddd d d d d d d dddddddd |_|ii|t|iitijptt|iitijptt|iitijptt|iitijptt|iitijptt|iitijpt|| _|| _ |i| _d | _d | _t | i| _!tdt"dt"dt"| _#tdt"| _$tdt"dt"dt"dt"dt"| _%t"| _&| idjo | i dj| _'d| _(d| _)d| _*dS(Nssuitiscolorsranks base_suits base_colors base_ranksdirismodi smax_moves max_accepts max_cardsi?Bsmin_moveis min_accepts min_cardssbottomsredeals redeal_imgsncardssroundss redeal_strsmisci(+slensgames allstackssidsappends_sintsroundsxsysmapkeysstackmapsmodelsviews controllerscardssStructscapsupdatestypessuitstypessIntTypesAssertionErrorscolorsranks base_suits base_colors base_rankscanvass CARD_XOFFSETs CARD_YOFFSETsMfxCanvasGroupsgroupsNonesimagessitemsstextss top_bottoms is_visiblesis_openscan_hide_cardssmax_shadow_cards( s_sxsysgamescaps controllersmapkeysmodelsidsview((spysol.pys__init__sf      ######        "  cCst|idS(N(sunbind_destroys_sgroup(s_((spysol.pysdestructscCs&|i|io|indS(N(s_s prepareViews is_visibles initBindings(s_((spysol.pys prepareStack!s  cCs|i}t|d|it|d|it|d|it|d|it|d|it|d|it|d|i t|d|i t|d |i dS( Ns<1>s ss s s s<3>s<2>s ( s_sgroupsbinds_Stack__clickEventHandlers_Stack__motionEventHandlers_Stack__releaseEventHandlers _Stack__controlclickEventHandlers_Stack__shiftclickEventHandlers_Stack__doubleclickEventHandlers_Stack__rightclickEventHandlers_Stack__middleclickEventHandler(s_sgroup((spysol.pys initBindings%s cCs|i|if\}}t|tijo|f|_n"tt t t t ||_t|tijo|f|_n"tt t t t ||_|i djo|i |_ |iidjo d|_ q@tt|io d|_ q@tt|io d|_ q@|iio d|_ q@n|i o|iiii|iiiif\}}|i|d}|i|d}|d|djoddf\|_|_ qO|d|djoddf\|_|_ qO||ii!d|djoddf\|_|_ qOddf\|_|_ n|i"djoD|i o1t#|iddjpt#|iddj|_"n|i$djo@d|_$t#|id|iiiijo d|_$qn|i o|i%ndS( Niiiii'ii?Bi(&s_s CARD_XOFFSETs CARD_YOFFSETsoxsoystypestypessIntTypestuplesmapsintsroundscan_hide_cardss is_visiblescaps max_cardssfiltersNonescanvasspreviewsgamesappsimagessCARDWsCARDHsCWsCHsxscxsyscyshide_xshide_ysheightsis_opensabssmax_shadow_cardss prepareBottom(s_sCHsCWscyscxsoysox((spysol.pys prepareView0sH!!      *D & cCs|io|iitjpt|i}|tj oVt|i |i |i d|dt |i_|iii |i|ii|_ndS(Nsimagesanchor(s_s is_visiblesimagessbottomsNonesAssertionErrorsgetBottomImagesimgsMfxCanvasImagescanvassxsys ANCHOR_NWsaddtagsgroups top_bottom(s_simg((spysol.pys prepareBottomZs$  c Cs|io|iitjpt|iii}t |i |i |i |i |i |i |idddddd|i_|iii|i|ii|_dS(Nsfillssoutlineswidthi(s_s is_visiblesitemssbottomsNonesAssertionErrorsgamesappsimagessMfxCanvasRectanglescanvassxsysCARDWsCARDHsaddtagsgroups top_bottom(s_simages((spysol.pysprepareInvisibleBottombs$  cCsP|iidjpt|iidjptt|d ptdS(Nissuit(s_scapsmin_movesAssertionErrors min_acceptshasattr(s_((spysol.pys assertStackksicCs||f\}}|ii||id||iot |idjo|idi |n|i i |i |i||o|in|SdS(Nsunhideii(s_smodelsviewscardssappendscardstkraisesunhidescan_hide_cardsslenshidesitemsaddtagsgroups _positionsupdates updateText(s_scardsunhidesupdatesmodelsview((spysol.pysaddCardos  cCsj||f\}}t|idjpt|tjox|id}|ii |i |o|i o9|i t|idjo|idi qn|id=n|ii |i |o|i oe|i t|idjoA||idjp||idjo|idi q9q=n|ii ||o|in|SdS(Niiiii(s_smodelsviewslenscardssAssertionErrorscardsNonesitemsdtagsgroupsunhidescan_hide_cardssremovesupdates updateText(s_scardsunhidesupdatesmodelsview((spysol.pys removeCardzs(    (cCs!|io|idSntSdS(Ni(s_scardssNone(s_((spysol.pysgetCards cCss|iidjoX|i|ii }xAt||iijo#|i|o|Sn|d=q*WntSdS(Ni(s_scapsmax_movescardsslensmin_moves canMoveCardssNone(s_scards((spysol.pysgetPilescCs)|i|\}}|i||dS(N(s_sgetPositionForscardsxsysmoveTo(s_scardsysx((spysol.pys _positionscCsH||f\}}|tj o|io|ii||SndSdS(Ni(s_smodelsviewseventsNonescardsscanvassfindCard(s_seventsmodelsview((spysol.pys _findCardsc Cs||f\} } |tjo | i}n|iii}d}xt t |D]}||}|i |i|i |i|i|if}||djo0||djo||djo||djo |}qTqTW|SdS(Niiiii(s_smodelsviewscardssNonesgamesappsimagessindexsrangeslensiscsxsysCARDWsCARDHsr( s_sxsyscardssindexsisimagesscsrsmodelsview((spysol.pys _findCardXYs  ,DcCsdS(N((s_sundosflags((spysol.pys updateModelscCs(|i|_|i|_|i|_dS(N(s_sidsclonesgamescap(s_sclone((spysol.pys copyModels  cCs|tjo|id}nt|djodSn|di|di|ii}||iidjo||iiSn|SdS(Niiii(scardssNones_slensrankscapsmodsdir(s_scardssdir((spysol.pys getRankDirs "cCsdSdS(Ni((s_((spysol.pysbasicIsBlockedscCs||jp |iodSn|i}t|}||ijp ||ijodSn|t|i}||i jodSnx|D]}|i odSn|i djo|i |i jodSn|i djo|i |i jodSn|idjo|i|ijodSqqW|io|idi Sn|d}|idjo|i |ijodSn|idjo|i |ijodSn|idjo|i|ijodSndSdS(Niii(s from_stacks_sbasicIsBlockedscapslenscardssls min_accepts max_accepts max_cardsscsface_upssuitscolorsranks base_suits base_colors base_rank(s_s from_stackscardsscscapsl((spysol.pysbasicAcceptsCardss:    ###   ###cCs|iodSn|i}t|}||ijp ||ijodSnt|i|}||ijodSnt |SdS(Ni( s_sbasicIsBlockedscapslenscardsslsmin_movesmax_moves min_cardss cardsFaceUp(s_scardsscapsl((spysol.pysbasicCanMoveCardss    cCsdSdS(Ni((s_s from_stackscards((spysol.pys acceptsCardsscCsdSdS(Ni((s_scards((spysol.pys canMoveCardsscCsdSdS(Ni((s_((spysol.pys canFlipCardscCstdfSdS(Ni(sNone(s_sstacks((spysol.pys canDropCardsscCsdS(N((s_((spysol.pys resetGamescCsd|ii|ifSdS(Ns%s(%d)(s_s __class__s__name__sid(s_((spysol.pys__repr__scCs|ii|dS(N(s_sgamesflipMove(s_((spysol.pysflipMovesicCs0|ii|||d|d||idS(Nsframessshadow(s_sgamesmoveMovesncardssto_stacksframessshadows fillStack(s_sncardssto_stacksframessshadow((spysol.pysmoveMoves"cCs|ii|dS(N(s_sgames fillStack(s_((spysol.pys fillStackscCs[|o|iiddn|i|ii o|iin|iidS(Nsflipi(ssounds_sgames playSamplesflipMoves checkForWinsautoPlays finishMove(s_ssound((spysol.pys playFlipMoves  cCs|oJ||iiijo|iidddqQ|iidddn|i||d|d||ii o,||iiij o|ii qn|ii dS(Nsdropspriorityismovei sframessshadow(ssoundsto_stacks_sgamesss foundationss playSamplesmoveMovesncardssframessshadows checkForWinsautoPlays finishMove(s_sncardssto_stacksframessshadowssound((spysol.pys playMoveMovescCstSdS(N(sNone(s_((spysol.pysgetBottomImagesc Cs||f\}} | io| i| ifSn| i| if\}}ddt| it| if\}}} }xa|i D]V}||joPn|| i|}|| i|}|d| }|d|}qW||fSdS(Nii(s_smodelsviewscan_hide_cardssxsyslens CARD_XOFFSETs CARD_YOFFSETsixsiyslxslyscardsscscard( s_scardsiysixscslysysxsmodelslxsview((spysol.pysgetPositionFors 0  c Cst||f\} } | i}| i pt|djodSn| ioEx|d D]}|i|qVWx |dD]}|i qxWn|di }| i | i f\}}ddt| i t| if\}}}} x|dD]|}|i i||i }| i oR|| i |}|| i|}|d|}|d| }|i||qqWdS(Niiii(s_smodelsviewscardss is_visibleslenscan_hide_cardsscshidesunhidesitemsxsys CARD_XOFFSETs CARD_YOFFSETsixsiyslxslystkraisesmoveTo( s_siysixscsysitemslxscardssxsmodelslysview((spysol.pys refreshViews0     0   cCs|iidjp|iitjodSnd}d}|iiitj o>|iii}|djod}|i o d}qqn|o|t |i }ndo |ii i od}x|i D]}|ioB|itj pt|idjp |idjptq|d}|itjpt|idjo |idjptqW|d|}n|iiid|dS(Niss%ds%Dis %2dstext(s_sgamespreviewstextssncardssNonestsformats text_formatscardsslensappsdebugsvisiblescsisHiddens hide_stacksAssertionErrorshide_xshide_ysconfig(s_sformatscsvisiblest((spysol.pys updateText4s0&    + +cCs\||ijpt|i p|i odSn||idjodSn|iSdS(Niii(scards_scardssAssertionErrors is_visiblesface_upsis_open(s_scard((spysol.pysbasicShallHighlightSameRankMs cCs|i|SdS(N(s_sbasicShallHighlightSameRankscard(s_scard((spysol.pysbasicShallHighlightMatchTscCs>|i|}|djodSn|i|}|i| odSn|iii i }||||dfg}x|ii D]y}xp|iD]e}||joqn|i|ijoqn|i|o!|i||||dfqqWqW|iiid|ii_|ii||iii iSdS(Niii(s_s _findCardseventsiscardsscardsbasicShallHighlightSameRanksgamesappsoptshighlight_samerank_colorsscolsinfos allstacksssscsranksappendsstatsshighlight_sameranks_highlightCardsshighlight_samerank_sleep(s_seventsinfoscsiscolssscard((spysol.pyshighlightSameRankVs(     )c Cs|i|}|djodSn|i|} |i|  odSn|iii i }| } } g}d}x)|iiD]}||iiijo||iiijoqnx|iD]}|| joqn|i| oqn|ii|| ||od}||joR|ii|}|d|jo |} qn|d|jo |} qqun|i||||dfqqWqW|og|o |iiid|ii_n|i|| | |df|ii||iii iSndSdS(Niii(s_s _findCardseventsiscardsscardsbasicShallHighlightMatchsgamesappsoptshighlight_cards_colorsscolsc1sc2sinfosfounds allstackssss foundationsscsshallHighlightMatchsindexsjsappendsstatsshighlight_cardss_highlightCardsshighlight_cards_sleep( s_seventsinfoscsisjscolsssfoundsc2sc1scard((spysol.pyshighlightMatchingCardsgsF    ,    ) #cCsdSdS(Ni((s_sevent((spysol.pys clickHandlerscCs|i odSn|i|}t|i|d}|djp|djp|i|i odSn|i|i i |i i i |i i|i iii|i|i i|i|di |i i i dSdS(Nii(s_sis_opens _findCardseventsislenscardss positionssface_upsitemstkraisesgamescanvassupdate_idletasksssleepsappsoptsraise_card_sleepslower(s_seventsis positions((spysol.pysmiddleclickHandlers ,%cCsdSdS(Ni((s_sevent((spysol.pysrightclickHandlerscCs|i|SdS(N(s_s clickHandlersevent(s_sevent((spysol.pysdoubleclickHandlerscCsdSdS(Ni((s_sevent((spysol.pyscontrolclickHandlerscCs,|iiiio|i|SndSdS(Ni(s_sgamesappsoptshighlight_samerankshighlightSameRanksevent(s_sevent((spysol.pysshiftclickHandlerscCsdSdS(Ni((s_sevent((spysol.pysshiftrightclickHandlerscCs=|io/|o|iidn|i||ndS(Nsnomove(sdragscardsssounds_sgames playSamplesmoveCardsBackHandlersevent(s_seventsdragssound((spysol.pysreleaseHandlers cCs%x|iD]}|i|q WdS(N(sdragscardsscards_s _position(s_seventsdragscard((spysol.pysmoveCardsBackHandlers icCs|iio|ii|n|iiotSn|iiio|iiii |n|o@||}|djo#|dj}|i|d|qn ||tSdS(Nissound(s_sgamesdemosstopDemoseventsbusys EVENT_HANDLEDsdragsstacks cancelDrags start_dragshandlersrssounds startDrag(s_seventshandlers start_dragssoundsr((spysol.pys__defaultClickEventHandlers      cCs|i||idSdS(Ni(s_s _Stack__defaultClickEventHandlersevents clickHandler(s_sevent((spysol.pys__clickEventHandlerscCs|i||idSdS(Ni(s_s _Stack__defaultClickEventHandlerseventsdoubleclickHandler(s_sevent((spysol.pys__doubleclickEventHandlerscCs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventsmiddleclickHandler(s_sevent((spysol.pys__middleclickEventHandlerscCs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventsrightclickHandler(s_sevent((spysol.pys__rightclickEventHandlerscCs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventscontrolclickHandler(s_sevent((spysol.pys__controlclickEventHandlerscCs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventsshiftclickHandler(s_sevent((spysol.pys__shiftclickEventHandlerscCs|i||iSdS(N(s_s _Stack__defaultClickEventHandlerseventsshiftrightclickHandler(s_sevent((spysol.pys__shiftrightclickEventHandlerscCs|iio|ii|n|iiotSnnoE|ii}|it jot |i |i |_n||_n|i |tSdS(Ni(s_sgamesdemosstopDemoseventsbusys EVENT_HANDLEDsdragstimersNones after_idlescanvass keepDragTimerskeepDrag(s_seventsdrag((spysol.pys__motionEventHandlers     cCsX|iio|ii|n|iiotSn|i||i|tSdS(N( s_sgamesdemosstopDemoseventsbusys EVENT_HANDLEDskeepDrags finishDrag(s_sevent((spysol.pys__releaseEventHandlers    cCs`|it|iii}|io2t|id}t |i ||i |_ ntSdS(Nf1000.0(s_s_Stack__leaveEventHandlersNonesgamesappsoptsmagnetic_mousesintsmagnetic_mouse_timestsafterscanvass!_Stack__magneticMouseTimerHandlersmagnetic_mouse_timers EVENT_HANDLED(s_seventsoptst((spysol.pys__enterEventHandlers   cCs0t|iit|i_t|i_tSdS(N(s after_cancels_smagnetic_mousestimersNonesevents EVENT_HANDLED(s_sevent((spysol.pys__leaveEventHandlers  cCs9|ii}|it|o|iii ondS(N(s_smagnetic_mousesevents_Stack__leaveEventHandlersNonesgamesdragsstack(s_sevent((spysol.pys__magneticMouseTimerHandlers  c Cs|iiitjpt|i|}|djp|i |i | odSn|o|ii dn|i |_|i|_|i}|i}|i |_|i|_||_|g|_|i ||_ |ii} |i|i |_x|iD]}|iqW| i | i f\}}x+|i D] } | i| i||q>W|iii i!o|ii"i#dt$ndS(Nis startdragscursor(%s_sgamesdragsstacksNonesAssertionErrors _findCardseventsis canMoveCardsscardsssounds playSamplesxslastxsyslastysstart_xsstart_ysnoshade_stackssappsimagess createShadowssshadowsssstkraisesSHADOW_XOFFSETsSHADOW_YOFFSETssxssyscardsmoveBysopts dragcursorscanvassconfigs CURSOR_DRAG( s_seventssoundssxsisssdragssysgamescardsimages((spysol.pys startDrags6%            cCs|ii}|i odSn||ijpt|i|i}|i |i }|p|o|i|_|i |_ |ii iio|inx!|iD]}|i||qWx%|iD]}|i||qWnt|_dS(N(s_sgamesdragscardssstacksAssertionErrorseventsxslastxsdxsyslastysdysappsoptsshades _updateShadesshadowssssmovescardsmoveBysNone(s_seventsdragssscardsdxsdy((spysol.pyskeepDrags$      cCsD|ii}t|it|_|io|i|indS(N(s_sgamesdrags after_cancelstimersNoneseventskeepDrag(s_sdrag((spysol.pys keepDragTimers     c Cs|iiii p|iidjofSnt|}|djp ||i jofSn|iii }|di |di f\} } xP|dD]D}|i | jpt|i | |ijofSn|i } qW|id|i|f\} } | o| o|d}|iddjo|d}n|i |i||i |i|f\} } t|ii| | | id| dt}t|ii| | d| dt}|i|i |i|i ||fSnfSdS(Niiisimagesanchor(!s_sgamesappsoptsshadowscanvasspreviewslenscardsslsmax_shadow_cardssimagessxsyscxscyscsabss CARD_YOFFSETs getShadowsimg0simg1sCARDWsdxsCARDHsdysMfxCanvasImagesheights ANCHOR_SEss1ss2slowersitem( s_scardssdxsdyscss2ss1slsimagesscyscxsimg1simg0((spysol.pys createShadowss4'   - $ .cCsI|iiio|iiiint|ii_t|ii_dS(N(s_sgamesdrags shade_imgsdeletesNones shade_stack(s_((spysol.pys _deleteShade3scCs(|i}|ii}|i}|tjodSn|i|if\} }|i } | i d}|i|| if}|i|i|i| |i|f\} } }}tdddf\}}}} x|D]}|tjp || ijoqn|i o7|i d}|i|i|i| |i|f}n'|i|i|i| |i|f}||djp0||djp|d| jp|d| joqn|| ijonA|i| i| i o| ii |n| ii |q| |dd| |dd}||jo*|||d|df\}}}} qqW|| i"jodSn|tjo|i#dSn|| _"| i$o| i$i%|| ndt&|i'|| d|dt(}|| _$| i)o|i*| i)dn|i*| i di+dS( Niiɚ;iiiisimagesanchor(,s_sgamesappsimagessgetShadesimgsNonesCARDWsCARDHsCWsCHsdragscardsscsgetClosestStacksstacksstackssxsysr1_0sr1_1sr1_2sr1_3ssstackssdiffssxssysssnoshade_stackssr2scanshade_stackss acceptsCardssappendsdiffs shade_stacks _deleteShades shade_imgsmoveTosMfxCanvasImagescanvass ANCHOR_NWsshadowsslowersitem(s_simagesssdiffsdiffsimgssstacksCHsr1_2sr1_3sr1_0sr1_1ssysdragsCWscssxsr2sgamesssstacks((spysol.pys _updateShade8sV      2  *&D" .    !  cCs{|ii}t|it|_|ig|_g|_x|i D]}|i qHWg|_ t|_ g|_ dS(N(s_sgamesdrags after_cancelstimersNones _deleteShadescanshade_stackssnoshade_stackssshadowssssdeletesstackscards(s_sssdrag((spysol.pys _stopDraggs         cCs|iiiio#|iiid|iiin|iii }|i |i o+|i |jpt |i||ndS(Nscursor(s_sgamesappsopts dragcursorscanvassconfigs top_cursorsdragscopys _stopDragscardssstacksAssertionErrorsreleaseHandlersevent(s_seventsdrag((spysol.pys finishDragss#  cCs|iiiio#|iiid|iiin|iii }|i |i o+|i |jpt |i||ndS(Nscursor(s_sgamesappsopts dragcursorscanvassconfigs top_cursorsdragscopys _stopDragscardssstacksAssertionErrorsmoveCardsBackHandlersevent(s_seventsdrag((spysol.pys cancelDrag{s#  (Js__name__s __module__s__init__sdestructs prepareStacks initBindingss prepareViews prepareBottomsprepareInvisibleBottoms assertStacksaddCardsNones removeCardsgetCardsgetPiles _positions _findCards _findCardXYs updateModels copyModels getRankDirsbasicIsBlockedsbasicAcceptsCardssbasicCanMoveCardss acceptsCardss canMoveCardss canFlipCards canDropCardss resetGames__repr__sflipMovesmoveMoves fillStacks playFlipMoves playMoveMovesgetBottomImagesgetPositionFors refreshViews updateTextsbasicShallHighlightSameRanksbasicShallHighlightMatchshighlightSameRankshighlightMatchingCardss clickHandlersmiddleclickHandlersrightclickHandlersdoubleclickHandlerscontrolclickHandlersshiftclickHandlersshiftrightclickHandlersreleaseHandlersmoveCardsBackHandlers _Stack__defaultClickEventHandlers_Stack__clickEventHandlers_Stack__doubleclickEventHandlers_Stack__middleclickEventHandlers_Stack__rightclickEventHandlers _Stack__controlclickEventHandlers_Stack__shiftclickEventHandlers#_Stack__shiftrightclickEventHandlers_Stack__motionEventHandlers_Stack__releaseEventHandlers_Stack__enterEventHandlers_Stack__leaveEventHandlers!_Stack__magneticMouseTimerHandlers startDragskeepDrags keepDragTimers createShadowss _deleteShades _updateShades _stopDrags finishDrags cancelDrag(((spysol.pysStacks <   *                                                     / sDealRow_StackMethodscBs_tZedddddZedddddZddddZdddddZRS(NiiicCs|tjo|iii}n|o|o|iiii o|ii n|i ||||}|o|iin|SdS(N(srowssNones_sgamessssoundsframessappsopts animationssstartDealSamples dealToStackssflipsreversesns stopSamples(s_srowssflipsreversesframesssoundsn((spysol.pysdealRows !cCs|tjo|iii}n|o|o|iiii o|ii nt |i t |jo|t |i  }n|i ||||}|o|iin|SdS(N(srowssNones_sgamessssoundsframessappsopts animationssstartDealSampleslenscardss dealToStackssflipsreversesns stopSamples(s_srowssflipsreversesframesssoundsn((spysol.pys dealRowAvails !cCsp|i p| odSnt|it|jpt|ii|ii}|ot |}|i nx|D]}|i i pt||j pt|djo|iii|iijo>|idd}|i|dd|o|iqNq~|o|ii|n|iid||d|q~W|ii|t|SdS(Nisupdateisframes(s_scardssstacksslensAssertionErrorsgames enterStatesS_DEALs old_statesreverseslistsrsgetCardsface_upsframessmovessstatesS_INITs removeCardscsaddCardsflipsshowFacesflipMovesmoveMoves leaveState(s_sstackssflipsreversesframesscs old_statesr((spysol.pys dealToStackss*# ) c Cs|djo|iiidii}n|i p| odSn|ii |ii }|ot |}|i nd}x|D]} | |j ptx|io|d}|o|ii|n|o|idi|jomx|iiiD]U}||j pt|i||ido!|iid||d|PqqWq|iid|| d|PqWqW|ii||SdS(Niiisframes(sranks_sgamesss foundationsscaps base_rankscardssstackss enterStatesS_DEALs old_statesreverseslistsnsrsAssertionErrorsflipsflipMoves acceptsCardssmoveMovesframess leaveState( s_sstackssflipsreversesframessranksns old_statesssr((spysol.pysdealToStacksOrFoundationss8      (s__name__s __module__sNonesdealRows dealRowAvails dealToStackssdealToStacksOrFoundations(((spysol.pysDealRow_StackMethodss sDealBaseCard_StackMethodscBs)tZdddZddddZRS(NiicCs|id}|iddd|ddxb|iiiD]Q}|i|i _ |o5t d|i}|ii ii|i|fq9q9W|SdS(Nisncardsisframessupdate_saveinfois base_rank(s_scardsscs dealBaseCardssframessgamesss foundationssrankscaps base_ranksupdate_saveinfosStructssaveinfos stack_capssappendsid(s_sframessupdate_saveinfoscscapss((spysol.pysdealSingleBaseCards 'cCsc|iii|iijpt|i ptx'|djo|ipt|id}xd|ii i D]?}|i o&|i i djp|i i |ijoPqsqsWdptt}|i|i _|o5td|i}|iiii|i|fn|i o|ii|n|iid||d||d}q8WdS(Niis base_rankisframes(s_sgamesmovessstatesS_INITsAssertionErrors base_cardssncardsscardsscsss foundationsscaps base_suitssuitsNonesranks base_ranksupdate_saveinfosStructssaveinfos stack_capssappendsidsface_upsflipMovesmoveMovesframes(s_sncardssframessupdate_saveinfoscscapss((spysol.pys dealBaseCardss(#  4 # (s__name__s __module__sdealSingleBaseCards dealBaseCards(((spysol.pysDealBaseCard_StackMethodss s TalonStackcBstZdddZdZdZdZdZdZdd Zd Z ddd Z d Z d Z dZ RS(NicKs<ti||||d|||_||_|i dS(Nscap( sStacks__init__s_sxsysgamescaps max_roundssnum_deals resetGame(s_sxsysgames max_roundssnum_dealscap((spysol.pys__init__s  cCsd|_g|_dS(Ni(s_srounds base_cards(s_((spysol.pys resetGames cCscti||iii}|djo|i|jptn|i|djptdS(Nii( sStacks assertStacks_sgamesgameinfosredealssns max_roundssAssertionError(s_sn((spysol.pys assertStacks   cCs|iiddSdS(Nssoundi(s_sgames dealCards(s_sevent((spysol.pys clickHandlerscCs|i|SdS(N(s_s clickHandlersevent(s_sevent((spysol.pysrightclickHandlerscCst|idjSdS(Ni(slens_scards(s_((spysol.pys canDealCardssicCsdS(N((s_ssound((spysol.pys dealCardsscCsdx<|iiD].}x%|io|iddddqWq Wx|iiD]}|iqLWdS(Nsunhideisupdate(s_sgames allstackssstackscardss removeCards updateText(s_sstack((spysol.pysremoveAllCardss   cCsvti||o|iidjo>|iitj o'd|i }|iii d|qen|o|i dj}|iitj oj|i|}|tj o||iij o&|iii d|||i_nddf|}nddf|}|iitj o|iidjo=||iijo&|iii d|||i_qnqrndS( NisRound %dstextisimagessRedealsStop(sStacks updateTexts_s update_roundssgamespreviewstextssroundssNonesroundstsconfigs update_redeals canDealCardssdealsimagessredealsgetRedealImagessimgs redeal_imgs redeal_str(s_s update_roundss update_redealsimgsdealst((spysol.pys updateTexts$   &cCseti||i p|iitjodSn|iitj p|iitj odSn|i i djodSn|i i i}|i |i d|i|iddf\}}}|i djo |idjo|i|idj}|tj ot|i i||d|dd|i_||i_|iii|i|iii|i|ii|_|idjo$|i|idd f\}}qt}qn|i d jo|o|idjo~|i i i}t|i i||d||i_d |i_|iii|i|iii|i|ii|_qandS( Niiscenteri6simagesanchoriZissi+s(sStacks prepareViews_s is_visiblesimagessbottomsNonesredealstextssgamespreviewsappsxsCARDWsysCARDHscxscyscasgetRedealImagess max_roundssimgsMfxCanvasImagescanvass redeal_imgstkraises top_bottomsaddtagsgroups MfxCanvasTexts redeal_str(s_simgscascyscxsimages((spysol.pys prepareViews< &4   $ cCs|iiiiSdS(N(s_sgamesappsimagessgetTalonBottom(s_((spysol.pysgetBottomImage5scCs|iiiiSdS(N(s_sgamesappsgimagessredeal(s_((spysol.pysgetRedealImages7s(s__name__s __module__s__init__s resetGames assertStacks clickHandlersrightclickHandlers canDealCardss dealCardssremoveAllCardss updateTexts prepareViewsgetBottomImagesgetRedealImages(((spysol.pys TalonStacks        sDealRowTalonStackcBstZddZRS(NicCs|id|SdS(Nssound(s_s dealRowAvailssound(s_ssound((spysol.pys dealCards:s(s__name__s __module__s dealCards(((spysol.pysDealRowTalonStack9ssInitialDealTalonStackcBstZdZdZRS(NcCsdS(N((s_((spysol.pys initBindings=scCstSdS(N(sNone(s_((spysol.pysgetBottomImage?s(s__name__s __module__s initBindingssgetBottomImage(((spysol.pysInitialDealTalonStack<s s OpenStackcBsttZdZdZdZdZdZdZdZdZ d Z d d Z e e d Z RS( NcKs<t|ddddddti||||d|dS(Nsmax_moveis max_acceptis max_cardsi?Bscap(s kwdefaultscapsStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__BscCs|i||SdS(N(s_sbasicAcceptsCardss from_stackscards(s_s from_stackscards((spysol.pys acceptsCardsEscCs|i|SdS(N(s_sbasicCanMoveCardsscards(s_scards((spysol.pys canMoveCardsGscCs3|ip|i odSn|idi SdS(Nii(s_sbasicIsBlockedscardssface_up(s_((spysol.pys canFlipCardIscCs|ip|i otdfSn|id}|i|oCx@|D]4}||j o|i||o|dfSqJqJWntdfSdS(Niii(s_sbasicIsBlockedscardssNones canMoveCardssstackssss acceptsCards(s_sstacksscardsss((spysol.pys canDropCardsMs  cCsO|ii|\}}}||jo |io|idSndSdS(Nii( s_sgames getAutoStackssevents flipstackss dropstackss quickstackss canFlipCards playFlipMove(s_sevents quickstackss dropstackss flipstacks((spysol.pys clickHandlerVs  cCs|i|odSn|iiiio_|ii|\}}}||jo3|i |}|ii i||ii _|SqndSdS(Nii(s_sdoubleclickHandlerseventsgamesappsopts quickplays getAutoStackss flipstackss dropstackss quickstackssquickPlayHandlersnsstatssquickplay_moves(s_seventsns quickstackss flipstackss dropstacks((spysol.pysrightclickHandler\s  cCs|ii|\}}}||jo |io|idSn||jo]|i |ii i \}}|o4|iiddd|i||dddSqndSdS(Nisautodropspriorityissoundii(s_sgames getAutoStackssevents flipstackss dropstackss quickstackss canFlipCards playFlipMoves canDropCardssss foundationssto_stacksncardss playSamples playMoveMove(s_seventsncardssto_stacks quickstackss flipstackss dropstacks((spysol.pysdoubleclickHandlerfs   cCs,|iiiio|i|SndSdS(Ni(s_sgamesappsoptshighlight_cardsshighlightMatchingCardssevent(s_sevent((spysol.pyscontrolclickHandlerrsicCs |i}|tj oq|i|i|i|if\}}t |djot |djo!t i |||d|dSqn|ii|d|}| p||jp|i|| ot i |||d|n#|it||ddd|dS(Ni ssoundisframes(sdragscardsseventsNonesxsstart_xsysstart_ysdxsdysabssStacksreleaseHandlers_ssoundsgamesgetClosestStacksstacks acceptsCardss playMoveMoveslen(s_seventsdragssoundsdxsdyscardssstack((spysol.pysreleaseHandlervs  && )c Cs|tjo|iii}n|tjo |iii|iii}ng} |i ox|D]}||j o|i ou|i } | o|i || oK|iit| ||}| i|t|  t| ||fqqeqeWn&t|i f\}}|od|i|}|djoD|i |} t| t|jo |i| o | }q~qnx||fD]} | oqnxy|D]q}||j o|i || oK|iit| ||}| i|t|  t| ||fqqWqW| o]| i| i| dddjo0| ddi| dd| dddSqndSdS(Niiiii(s from_stackssNones_sgamessgs dropstackss to_stackssss foundationssmovesscardssgetPilespiles acceptsCardssgetQuickPlayScoreslensscoresappendspile1spile2s _findCardseventsis canMoveCardsssortsreverses playMoveMove( s_sevents from_stackss to_stacksspile1spile2sisssscorespilesmoves((spysol.pysquickPlayHandlersH     9  )  5  ( (s__name__s __module__s__init__s acceptsCardss canMoveCardss canFlipCards canDropCardss clickHandlersrightclickHandlersdoubleclickHandlerscontrolclickHandlersreleaseHandlersNonesquickPlayHandler(((spysol.pys OpenStackAs       sAbstractFoundationStackcBsDtZdZdZdZdZeedZdZRS(NcKsQt|d|d|dtddddddtti||||f|dS( Nssuits base_suits base_ranksdiris max_accepts max_cardsi ( s kwdefaultscapssuitsACEsapplys OpenStacks__init__s_sxsysgame(s_sxsysgamessuitscap((spysol.pys__init__scCstdfSdS(Ni(sNone(s_sstacks((spysol.pys canDropCardsscCsdSdS(Ni((s_sevent((spysol.pys clickHandlerscCsdSdS(Ni((s_sevent((spysol.pysrightclickHandlerscCsdSdS(Ni((s_sevents from_stackss to_stacks((spysol.pysquickPlayHandlerscCs |iiii|iiSdS(N(s_sgamesappsimagess getSuitBottomscaps base_suit(s_((spysol.pysgetBottomImages( s__name__s __module__s__init__s canDropCardss clickHandlersrightclickHandlersNonesquickPlayHandlersgetBottomImage(((spysol.pysAbstractFoundationStacks     sSS_FoundationStackcBstZdZRS(NcCsoti||| odSn|io>|idi|ii|ii|dijodSqgndSdS(Niii( sAbstractFoundationStacks acceptsCardss_s from_stackscardssrankscapsdirsmod(s_s from_stackscards((spysol.pys acceptsCardss  2 (s__name__s __module__s acceptsCards(((spysol.pysSS_FoundationStackssRK_FoundationStackcBstZedZdZRS(NcKs&tti|||||f|dS(N( sapplysSS_FoundationStacks__init__s_sxsysgamessuitscap(s_sxsysgamessuitscap((spysol.pys__init__scCsEti||iitjpt|iitjptdS(N( sSS_FoundationStacks assertStacks_scapssuitsANY_SUITsAssertionErrorscolors ANY_COLOR(s_((spysol.pys assertStacks (s__name__s __module__sANY_SUITs__init__s assertStack(((spysol.pysRK_FoundationStacks sAC_FoundationStackcBstZdZdZRS(NcKs6t|d|tti||||t f|dS(Ns base_suit( s kwdefaultscapssuitsapplysSS_FoundationStacks__init__s_sxsysgamesANY_SUIT(s_sxsysgamessuitscap((spysol.pys__init__scCs[ti||| odSn|io*|di|idijodSqSndSdS(Niii(sSS_FoundationStacks acceptsCardss_s from_stackscardsscolor(s_s from_stackscards((spysol.pys acceptsCardss   (s__name__s __module__s__init__s acceptsCards(((spysol.pysAC_FoundationStacks sSequenceStack_StackMethodscBs5tZdZdZdZdZdZRS(NcCs tdS(N(sSubclassResponsibility(s_scards((spysol.pys _isSequencescCs|i|SdS(N(s_s _isSequencescards(s_scards((spysol.pys_isAcceptableSequencescCs|i|SdS(N(s_s _isSequencescards(s_scards((spysol.pys_isMoveableSequencescCsn|i|| odSn|i| odSn|io|i|idg| odSndSdS(Niii(s_sbasicAcceptsCardss from_stackscardss_isAcceptableSequence(s_s from_stackscards((spysol.pys acceptsCardss)cCs!|i|o |i|SdS(N(s_sbasicCanMoveCardsscardss_isMoveableSequence(s_scards((spysol.pys canMoveCardss(s__name__s __module__s _isSequences_isAcceptableSequences_isMoveableSequences acceptsCardss canMoveCards(((spysol.pysSequenceStack_StackMethodss     s BasicRowStackcBstZdZRS(NcKsKt|dddttti||||f||i i i |_ dS(Nsdiris base_rank( s kwdefaultscapsANY_RANKsapplys OpenStacks__init__s_sxsysgamesappsimagess CARD_YOFFSET(s_sxsysgamescap((spysol.pys__init__s(s__name__s __module__s__init__(((spysol.pys BasicRowStackssSequenceRowStackcBstZdZRS(NcKs9t|ddddtti||||f|dS(Nsmax_movei?Bs max_accept( s kwdefaultscapsapplys BasicRowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__s(s__name__s __module__s__init__(((spysol.pysSequenceRowStackss AC_RowStackcBstZdZRS(NcCs t||ii|iiSdS(N(sisAlternateColorSequencescardss_scapsmodsdir(s_scards((spysol.pys _isSequences(s__name__s __module__s _isSequence(((spysol.pys AC_RowStackss SC_RowStackcBstZdZRS(NcCs t||ii|iiSdS(N(sisSameColorSequencescardss_scapsmodsdir(s_scards((spysol.pys _isSequences(s__name__s __module__s _isSequence(((spysol.pys SC_RowStackss SS_RowStackcBstZdZRS(NcCs t||ii|iiSdS(N(sisSameSuitSequencescardss_scapsmodsdir(s_scards((spysol.pys _isSequences(s__name__s __module__s _isSequence(((spysol.pys SS_RowStackss RK_RowStackcBstZdZRS(NcCs t||ii|iiSdS(N(sisRankSequencescardss_scapsmodsdir(s_scards((spysol.pys _isSequences(s__name__s __module__s _isSequence(((spysol.pys RK_RowStackssFreeCell_AC_RowStackcBstZdZRS(NcCs@t|iiid}t||joti ||SdS(Ni( sgetNumberOfFreeStackss_sgamesssreservessmax_moveslenscardss AC_RowStacks canMoveCards(s_scardssmax_move((spysol.pys canMoveCardss(s__name__s __module__s canMoveCards(((spysol.pysFreeCell_AC_RowStackssFreeCell_SS_RowStackcBstZdZRS(NcCs@t|iiid}t||joti ||SdS(Ni( sgetNumberOfFreeStackss_sgamesssreservessmax_moveslenscardss SS_RowStacks canMoveCards(s_scardssmax_move((spysol.pys canMoveCardss(s__name__s __module__s canMoveCards(((spysol.pysFreeCell_SS_RowStackssSpider_AC_RowStackcBstZdZRS(NcCs t||ii|iiSdS(N(sisRankSequencescardss_scapsmodsdir(s_scards((spysol.pys_isAcceptableSequences(s__name__s __module__s_isAcceptableSequence(((spysol.pysSpider_AC_RowStackssSpider_SS_RowStackcBstZdZRS(NcCs t||ii|iiSdS(N(sisRankSequencescardss_scapsmodsdir(s_scards((spysol.pys_isAcceptableSequence s(s__name__s __module__s_isAcceptableSequence(((spysol.pysSpider_SS_RowStackssYukon_AC_RowStackcBs#tZdZdZdZRS(NcKs9t|ddddtti||||f|dS(Nsmax_movei?Bs max_accept( s kwdefaultscapsapplys BasicRowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__ scCs;|i|ii|ii|ijo|i|ijSdS(N(sc1sranks_scapsdirsmodsc2scolor(s_sc1sc2((spysol.pys _isSequence scCsU|i|| odSn|io|i|id|d odSndSdS(Niii(s_sbasicAcceptsCardss from_stackscardss _isSequence(s_s from_stackscards((spysol.pys acceptsCards s )(s__name__s __module__s__init__s _isSequences acceptsCards(((spysol.pysYukon_AC_RowStack s  sYukon_SS_RowStackcBstZdZRS(NcCs;|i|ii|ii|ijo|i|ijSdS(N(sc1sranks_scapsdirsmodsc2ssuit(s_sc1sc2((spysol.pys _isSequence s(s__name__s __module__s _isSequence(((spysol.pysYukon_SS_RowStack ssKingAC_RowStackcBstZdZRS(NcKs3t|dttti||||f|dS(Ns base_rank( s kwdefaultscapsKINGsapplys AC_RowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__ s(s__name__s __module__s__init__(((spysol.pysKingAC_RowStack ssKingSS_RowStackcBstZdZRS(NcKs3t|dttti||||f|dS(Ns base_rank( s kwdefaultscapsKINGsapplys SS_RowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__ s(s__name__s __module__s__init__(((spysol.pysKingSS_RowStack ssKingRK_RowStackcBstZdZRS(NcKs3t|dttti||||f|dS(Ns base_rank( s kwdefaultscapsKINGsapplys RK_RowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__ s(s__name__s __module__s__init__(((spysol.pysKingRK_RowStack ss WasteStackcBstZRS(N(s__name__s __module__(((spysol.pys WasteStack ssWasteTalonStackcBs5tZdedZdZdZddZRS(NicKs2tti||||||f|||_ dS(N( sapplys TalonStacks__init__s_sxsysgames max_roundssnum_dealscapswaste(s_sxsysgames max_roundssnum_dealswastescap((spysol.pys__init__ s%cCs7ti||itjo|iii|_ndS(N(s TalonStacks prepareStacks_swastesNonesgamess(s_((spysol.pys prepareStack# s cCs||i}|io<tt|i|i}t|i||iijSn&|io|i |i jodSndSdS(Nii( s_swastescardssminslensnum_deals num_cardsscaps max_cardssrounds max_rounds(s_swastes num_cards((spysol.pys canDealCards' s  !ic Cs|ii|ii}d}|i}|io|o |ii o|ii dnt t |i|i }t |i||iijptxt|D]X}|idi o|ii|n|iid||dddd|iqWnk|io|i|ijoM|o|ii dd d nt |i}|ii||d dn|ii||SdS( Nis dealwasteiisframesisshadows turnwastespriorityis update_flags(s_sgames enterStatesS_DEALs old_states num_cardsswastescardsssoundsdemos playSamplesminslensnum_dealscaps max_cardssAssertionErrorsrangesisface_upsflipMovesmoveMoves fillStacksrounds max_roundss turnStackMoves leaveState(s_ssoundsis num_cardss old_stateswaste((spysol.pys dealCards/ s*  ' "(s__name__s __module__sNones__init__s prepareStacks canDealCardss dealCards(((spysol.pysWasteTalonStack s  sFaceUpWasteTalonStackcBstZdZdZRS(NcCs)t|idjo|idi SdS(Nii(slens_scardssface_up(s_((spysol.pys canFlipCardE scCs%|io|ii|ndS(N(s_s canFlipCardsgamesflipMove(s_((spysol.pys fillStackG s (s__name__s __module__s canFlipCards fillStack(((spysol.pysFaceUpWasteTalonStackD s sOpenTalonStackcBsPtZeiZeiZeiZdZdZdZdZ dZ RS(NcKs3t|ddtti||||f|dS(Nsmax_movei( s kwdefaultscapsapplys TalonStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__N scCsdSdS(Ni((s_((spysol.pys canDealCardsQ scCs)t|idjo|idi SdS(Nii(slens_scardssface_up(s_((spysol.pys canFlipCardS scCs%|io|ii|ndS(N(s_s canFlipCardsgamesflipMove(s_((spysol.pys fillStackU s cCs5|ioti||Snti||SdS(N(s_s canDealCardss TalonStacks clickHandlersevents OpenStack(s_sevent((spysol.pys clickHandlerX s ( s__name__s __module__s OpenStacks canMoveCardss canDropCardssreleaseHandlers__init__s canDealCardss canFlipCards fillStacks clickHandler(((spysol.pysOpenTalonStackJ s       s ReserveStackcBstZdZdZRS(NcKs9t|ddddtti||||f|dS(Ns max_acceptis max_cards( s kwdefaultscapsapplys OpenStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__^ scCs|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImagea s(s__name__s __module__s__init__sgetBottomImage(((spysol.pys ReserveStack] s sInvisibleStackcBs,tZdZdZdZdZRS(NcKsUddt|if\}}t|ddddti||||d|dS(Ni smax_moveis max_acceptscap( slensgames allstackssxsys kwdefaultscapsStacks__init__s_(s_sgamescapsysx((spysol.pys__init__d scCs#ti||i ptdS(N(sStacks assertStacks_s is_visiblesAssertionError(s_((spysol.pys assertStackh s cCsdS(N((s_((spysol.pys initBindingsk scCstSdS(N(sNone(s_((spysol.pysgetBottomImagem s(s__name__s __module__s__init__s assertStacks initBindingssgetBottomImage(((spysol.pysInvisibleStackc s   s StackWrappercBstZdZdZRS(NcKsJt|tijptt|tpt||_||_dS(N( stypes stack_classstypess ClassTypesAssertionErrors issubclasssStacks_scap(s_s stack_classscap((spysol.pys__init__p s cKsB|ii}tt|f|t|i|||f|SdS(N( s_scapscopyscsapplys kwdefaults stack_classsxsysgame(s_sxsysgamescapsc((spysol.pys__call__u s(s__name__s __module__s__init__s__call__(((spysol.pys StackWrappero s sWeakStackWrappercBstZdZRS(NcKs6tt|f|it|i|||f|SdS(N(sapplys kwdefaultscaps_s stack_classsxsysgame(s_sxsysgamescap((spysol.pys__call__z s(s__name__s __module__s__call__(((spysol.pysWeakStackWrappery ssFullStackWrappercBstZdZRS(NcKs#t|i|||f|iSdS(N(sapplys_s stack_classsxsysgamescap(s_sxsysgamescap((spysol.pys__call__~ s(s__name__s __module__s__call__(((spysol.pysFullStackWrapper} ss HintInterfacecBstZdZedZRS(NcCsdS(N((s_sgameslevel((spysol.pys__init__ scCsgSdS(N((s_s taken_hint((spysol.pysgetHints s(s__name__s __module__s__init__sNonesgetHints(((spysol.pys HintInterface s s AbstractHintcBstZdZdZdZdfdYZdZdZeedZ d Z d Z d Z ed Z d ZdZdZdZeZdZedZdZdZdZRS(NcCsX||_||_d|_|idjo d|_nt|_g|_|idS(Nii'(sgames_slevelsscore_flatten_valuesNones bonus_colors_AbstractHint__clonessreset(s_sgameslevel((spysol.pys__init__ s      cCs|idS(N(s_sreset(s_((spysol.pys__del__ scCs g|_d|_|idS(Ni(s_shintss max_scores_AbstractHint__destructClones(s_((spysol.pysreset s  s AClonedStackcBstZdZRS(NcCs'|i|_|i|||_dS(N(sstacks __class__s_s copyModels stackcardsscards(s_sstacks stackcards((spysol.pys__init__ s  (s__name__s __module__s__init__(((spysol.pys AClonedStack scCs*|i||}|ii||SdS(N(s_s AClonedStacksstacks stackcardssss_AbstractHint__clonessappend(s_sstacks stackcardsss((spysol.pys ClonedStack scCs7x'|iD]}|i|_t|q Wg|_dS(N(s_s_AbstractHint__clonessss AClonedStacks __class__sdestruct(s_ss((spysol.pys__destructClones s   c Cs|djodSnt|i||_|idjo||i|i}n|tjo |i}n|tjpt |djpt t |i  }t |||||||f}|i i|dS(Nii(sscoresmaxs_s max_scoresscore_flatten_values text_colorsNonesBLACKs forced_moveslensAssertionErrorshintsspossintsncardss from_stacksto_stacksahsappend( s_sscoresncardss from_stacksto_stacks text_colors forced_movespossah((spysol.pysaddHint s   '!cCs/|i}|i|i|i|SdS(N(s_shintssresetssortsreverse(s_shints((spysol.pys __returnHints s     iicCs|i|i}|o|do|dgSn|idjo`x]|iD]N}|io;|i|i d|||i djo|i SqqNqNWn|i |idjo4|i o#|i|i d|iitqn|i SdS(Niiii_i(s_sresetsgames taken_hintslevels allstackssrs canFlipCardsaddHints SCORE_FLIPs_AbstractHint__returnHintss computeHintss canDealCardss SCORE_DEALssstalonsNone(s_s taken_hintsgamesr((spysol.pysgetHints s       'cCsdS(N((s_((spysol.pys computeHints scCs1||jp|i|| odSndSdS(Nii(s from_stacksto_stacks acceptsCardsspile(s_s from_stacksto_stackspilesrpile((spysol.pys_defaultShallMovePile s!cCsa||jp|i|| odSn|i|d|}|i||odSndSdS(Nis stackcardsi(s from_stacksto_stacks acceptsCardsspiles_s ClonedStacksrpilesrr(s_s from_stacksto_stackspilesrpilesrr((spysol.pys_cautiousShallMovePile s !cCsu||jp|i|| odSn|idjo4|i|d|}|i||odSqmndSdS(Niis stackcardsi( s from_stacksto_stacks acceptsCardsspiles_slevels ClonedStacksrpilesrr(s_s from_stacksto_stackspilesrpilesrr((spysol.pys_cautiousDemoShallMovePile s! cCs||j ptdSt}|ixO|D]G}x>|D]2}||j o|i||goPqpq>q>WdSq1WdSdS(Nii( s from_stacksstackssAssertionErrorspilescardssreversescardsss acceptsCards(s_s from_stacksstackss stackcardsssscardscards((spysol.pys_canDropAllCards s   isblacksredsblue(s__name__s __module__s__init__s__del__sresets AClonedStacks ClonedStacks_AbstractHint__destructClonessNonesaddHints_AbstractHint__returnHintss SCORE_FLIPs SCORE_DEALsgetHintss computeHintss_defaultShallMovePiles_cautiousShallMovePiles_cautiousDemoShallMovePiles shallMovePiles_canDropAllCardssKINGsKsBLACKsREDsBLUE(((spysol.pys AbstractHint s*           s DefaultHintcBstZdZdZdZdZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdZdZdZeZdZdZdZdZRS(NcCsdSdS(Ni((s_((spysol.pys_preferHighRankMoves si,iidcCs!|ptd}|oC|i|d|}|i|i i i do |i }q^n|io|idi|dijo ||id|di}nt|io ||id|di}nG|o#||i|i|di}n||id|di}|SdS(Nis stackcardsii(spilesAssertionErrorsbonussrpiles_s ClonedStacksrsrrs canDropCardssgamesss foundationssBONUS_DROP_CARDstscardsssuitsBONUS_SAME_SUIT_MOVEsranks_preferHighRankMovessBONUS_NORMAL_MOVEsK(s_srstspilesrpilesrrsbonus((spysol.pys_getMoveCardBonus s(   #icCs9|o|ptt|it|d}|SdS(Ni(spilesrpilesAssertionErrorsmaxs_sBONUS_FLIP_CARDslensbonus(s_srstspilesrpilesbonus((spysol.pys_getFlipSpecialBonus!si(#iicCs| o |iSn|di o|i||||Sn|i||i i i d|o|i |_ |i|iSn|i|ogxd|i i iD]O}||jp|i oqn|i||o|i|_ |iSqqWndSdS(Nis stackcardsi(srpiles_sBONUS_CREATE_EMPTY_ROWsface_ups_getFlipSpecialBonussrstspiles_canDropAllCardssgamesss foundationssREDs bonus_colorsBONUS_CAN_DROP_ALL_CARDSsBONUS_CAN_CREATE_EMPTY_ROWs canMoveCardssrowssxscardss acceptsCardssBLUE(s_srstspilesrpilesx((spysol.pys_getMoveSpecialBonus !s  "  c Cs|pt||_|i||||}d|jo djnpt|i ||||}d|jo djnpt||||ifSdS(Nii(#i( spilesAssertionErrorscolors_s bonus_colors_getMoveSpecialBonussrstsrpilesb1s_getMoveCardBonussb2sscore( s_sscorescolorsrstspilesrpilesb2sb1((spysol.pys_getMovePileScore!s %%cCs|pt||_d}|io d}n|i||||}d|jo djnpt|||ifSdS(Ni0uiyii( spilesAssertionErrorscolors_s bonus_colorsscorestscardss_getMoveCardBonussrsrpilesb2(s_sscorescolorsrstspilesrpilesb2((spysol.pys_getMoveWasteScore$!s  %c Csk||j pt|djod|fSn|i}|d}|ii djot |i}nI|i |ii |ii }||ii djo||ii }nt|djo d}n}||iiijo d}n]t |djo d}n@|i||iiid |d od }|i}nd }||i|i }||fSdS( NiiHkiiii`giaixcs stackcardsi_iP(stsrsAssertionErrorsncardsscolorscardsspilescscaps base_rankslensdsranksmodsabssscores_sgamessgs talonstackss_canDropAllCardssss foundationssREDsK( s_sscorescolorsrstsncardsscsdspile((spysol.pys_getDropCardScore,!s,      & cCs|i}|i|ii|ii|i o |idjo |i |ii|ii n|i o |idjo)|i |ii |ii|iin|i o |i |ii|ii n|i o |i|ii |iindS(Ni(s_sgamesstep010ssgs dropstackssssrowsshintsslevelsstep020s foundationssstep030sstep040s reservestackssstep050(s_sgame((spysol.pys computeHintsE!s  )   c Csx|D]}|i|iii\}}|obdt f\}}|i |||||\}}|i ||||||djoPqnx5|i|D]$}|o|i|||qqWqWdS(Nii_(s dropstackssrs canDropCardss_sgamesss foundationsstsncardssNonesscorescolors_getDropCardScoresaddHintsstep010b_getPilesspilesstep010_movePilesrows( s_s dropstackssrowssncardsscolorsrspilesscorest((spysol.pysstep010P!s!  cCs|ifSdS(N(sstacksgetPile(s_sstack((spysol.pysstep010b_getPiles\!sc Csct|} t|i} d| jo | jnpt|i| |  } d}||i i i j}x|D]}dtf\}}|i||||  oqsn|o(|i|||||| \}}nh|i o2| | joqsn|oqsnd}d}nd}|i|||||| \}}|i|| |||qsWdS(Niii`i8(slenspileslpsrscardsslrsAssertionErrorsrpilesempty_row_seens_sgamessgs talonstackss r_is_wastesrowsstsNonesscorescolors shallMovePiles_getMoveWasteScores_getMovePileScoresaddHint( s_srspilesrowss r_is_wastesscoresempty_row_seenscolorstslpsrpileslr((spysol.pysstep010_movePile^!s. %(   $c Csx|D]} x|i| D]} | pt| djoqng} d} x| D]}|i | d|g}|i |\}}|o || j o1|djpt| i|||| fn| d} qXWx| D]}|d}| |dd} | i| ptx|D]}|| jp|i| |  oq%nd}|d|i| ii}dd|d| |d|itf}|i|t| | ||id |q%WqWqWqWdS( Niis stackcardsiii@ii?Bs forced_move(srowssrs_sstep020_getPilesspileslens drop_infosiscs ClonedStacksrrs canDropCardss foundationssstacksncardssAssertionErrorsappendsdissub_piles canMoveCardssts acceptsCardssscoresKsgetCardsranksBLUEsNonesforcesaddHintsRED(s_srowss foundationssscorescsforcesncardssrrsdisisrspilessub_piles drop_infosstackst((spysol.pysstep020x!s: !&c Csx|D]}|i} | p|i| g oqnxU|D]M} | |jp| i|| g oqCn|i | d| i | g}x|D]} | | joqn| i} | oqn|i| |  oqn| i t| i t|  } |i | d| }|i| | oqnd| i}ddt| | | |itf}|i|d|| |id|qWqCWqWdS(Ns stackcardsi Ni?Biis forced_move(s foundationssssgetCardscards canMoveCardssrowssts acceptsCardss_s ClonedStackscardsstts dropstackssrsgetPilespileslensrpilesrrsranksscoresBLUEsNonesforcesaddHint(s_s foundationssrowss dropstackssforcesscoresrrsttsssrspilesrpilescardst((spysol.pysstep030!s4 $    $c Cs/| odSnx|D]}|i} | p|i| g oqn| g}|it|it| }|i |d|}x|D]} | |jp| i|| oqn|i| |oqnd}|i|t|| ||\}}|i|t||| |PqWqWdS(Ns stackcardsi'(s reservestackssrowssrsgetCardscards canMoveCardsspilescardsslensrpiles_s ClonedStacksrrsts acceptsCardssscores_getMovePileScoresNonescolorsaddHint( s_srowss reservestackssscoresrrscolorsrspilesrpilescardst((spysol.pysstep040!s(   !$cCs| odSndS(N(s reservestacks(s_s reservestackssrows((spysol.pysstep050!s(s__name__s __module__s_preferHighRankMovessBONUS_DROP_CARDsBONUS_SAME_SUIT_MOVEsBONUS_NORMAL_MOVEs_getMoveCardBonussBONUS_FLIP_CARDs_getFlipSpecialBonussBONUS_CREATE_EMPTY_ROWsBONUS_CAN_DROP_ALL_CARDSsBONUS_CAN_CREATE_EMPTY_ROWs_getMoveSpecialBonuss_getMovePileScores_getMoveWasteScores_getDropCardScores computeHintssstep010sstep010b_getPilessstep010_movePilesstep020_getPilessstep020sstep030sstep040sstep050(((spysol.pys DefaultHint s.            sCautiousDefaultHintcBstZeiZdZRS(NcCsdSdS(Ni((s_((spysol.pys_preferHighRankMoves!s(s__name__s __module__s DefaultHints_cautiousShallMovePiles shallMovePiles_preferHighRankMoves(((spysol.pysCautiousDefaultHint!s sKlondikeType_HintcBstZRS(N(s__name__s __module__(((spysol.pysKlondikeType_Hint!ssYukonType_HintcBstZdZRS(NcCs@|i}g}x#|o|i||d}qW|SdS(Ni(sstacksgetPilespspilessappend(s_sstackspspiles((spysol.pysstep010b_getPiles!s  (s__name__s __module__sstep010b_getPiles(((spysol.pysYukonType_Hint!ssFreeCellType_HintcBstZRS(N(s__name__s __module__(((spysol.pysFreeCellType_Hint!ss GolfType_HintcBstZRS(N(s__name__s __module__(((spysol.pys GolfType_Hint!ssSpiderType_HintcBstZRS(N(s__name__s __module__(((spysol.pysSpiderType_Hint!ssFreeCellSolverWrappercBs0tZdefdYZdZdZRS(NsFreeCellSolver_HintcBs#tZdZdZdZRS(NcCsd|id|iSdS(Ns A23456789TJQKsCSHD(scardsrankssuit(s_scard((spysol.pysstr1!scCsd|idd|iSdS(NsCSHDs-s A23456789TJQK(scardssuitsrank(s_scard((spysol.pysstr2!sc CsYd} d}xC|iiiD]2}|io"|d|i|id}qqW|o| d|d} nd}xM|iiiD]<}|io"|d|i |id}q|d}qW|o| d|d} nx_|iii D]N}d}x(|iD]}||i |d}qW| t i |d} qWtti|i}y|i| }Wn t}nX|ot|}|dd jptt}|iii|iii |iii}xh|d joZ|d}tid |||d!} d d | d || d || d t|f}qW|ii|ndS(Nss isFounds:s s -sFC:iisdd>Z?d?Z@d@ZAdAZBdBZCd dCZDdDZEeFZGdEZHdFZIdGZJdHZKdIZLdJZMdKZNddLZOdMZPddNZQdOZRdPZSdQZTdRZUdSZVdTZWedUZXd4d4d4d dVZYdWZZd dXZ[dYZ\dZd[Z]dZd\Z^d]Z_d^Z`d_Zad`ZbdaZcdbZddcZeeddZfddZedeZgd dfdgZhedhZidiZjdjZkdkZldlZmdmZndnZodoZpdpZqdqZrd4d4drZsdsZtd dtZuduZvdvZwdwZxdxZydyZzdzZ{d{Z|d d|Z}d4d d}Z~d~ZdZd dZdZdZdZd dZddZdZdZdZRS(Niiiiii i0i@iPic Csd|_t|_||_|i|_|idjptd|_t|_ t |_ g|_ h|_ g|_t|_tdtdtdgdgdgdg|_tdgd gd gd gd g|_td gdgdg|_|idS(Nistalonswastes foundationssrowssreservess internalss openstackss talonstackss dropstackss reservestackss hp_stackssinfos remainingsdata(s_spreviewsNonesrandomsgameinfosidsAssertionErrorsbusysVERSIONsversions VERSION_TUPLEs version_tuplescardssstackmaps allstackss demo_logosStructssssgsregionssreset(s_sgameinfo((spysol.pys__init__"s6              cCstd}|i}|i||idt|i i t d|i |i i t d|i |iiio|iiiiddn|itd|ii|i_td|ii|i_t|i|_t|ii|i_t|ii|i_t|ii|i_t|ii|i_t|ii|i_t|ii|i_t|ii|i_t|ii|i_t|ii|i_x%|iD]}|i!|i"qW|ii#o>t$|ii#dpt%t$|ii#d pt%n|i&|i' o"|i(d |iii|_'n|i)|i i*d |i+i,|i-|i.t/i/|i0_1||_dS( Ns Game.createscursors - sstepicCs|ii|iijS(N(ssscaps max_accepts min_accept(ss((spysol.pys>"scCs|iidjS(Ni(ssscapsmax_move(ss((spysol.pys?"ssrounds max_roundssprogresss(2sTimerstimers_sbusysold_busys_Game__createCommonsapps setCursors CURSOR_WATCHstopswm_titlesPACKAGEs getTitleNames wm_iconnamesintrosprogresssupdates createGamesfilterssgs openstackss dropstackss hp_stacksstuples allstackssss foundationssrowssreservess internalss talonstackss reservestackssstacks prepareStacks assertStackstalonshasattrsAssertionErrorsoptimizeRegionsscardss createCardss initBindingss wm_geometryscanvasssetInitialSizeswidthsheightstimesstatss update_time(s_sappsold_busystimersstack((spysol.pyscreate5"sH       !  " cCsFt|id|it|id|it|id|idS(Ns<1>s<2>s<3>(sbinds_scanvass clickHandler(s_((spysol.pys initBindingsX"scCsd|_||_|i|_|i|_d|_tdtdtdddddtd gd gd td td gdg |_|i i tjo|ii i |i _ ntdtdtdtdtdt|_ dS(Nisseventstimersstart_xisstart_ysstackscardssshadowss shade_stacks shade_imgscanshade_stackssnoshade_stackssinfoshelpsmiscsscores base_rank(s_sbusysappstopscanvassfilenamesStructsNonesdragsgstatss start_playersoptsplayerstexts(s_sapp((spysol.pys__createCommon\"s.       cCstd}|i}|i|td|ii |_ |i t d|i i |i _ t d|i i|i _x%|iD]}|i|iqW|i|i|_||_dS(NsGame.createPreviewicCs|ii|iijS(N(ssscaps max_accepts min_accept(ss((spysol.pys~"scCs|iidjS(Ni(ssscapsmax_move(ss((spysol.pys"s(sTimerstimers_sbusysold_busys_Game__createCommonsappsmaxscanvasspreviews createGamesfilterssgs openstackss dropstackss hp_stackss allstackssstacks prepareStacks assertStacksoptimizeRegionss createCardsscards(s_sappsold_busystimersstack((spysol.pys createPreviewx"s       cCsJx|iD]}t|q Wx%|iD]}|it|q(WdS(N(s_scardssobjsdestructs allstacks(s_sobj((spysol.pysdestruct"s   cCsLd|_t|_tdtdddd|_tdg|_tdtdd d d |_td d d d dd dd dd dd dd dd dd dd dd dd dd dtidd|_ |i |odSntdd dd dd dd dd d |i d!tid"dd#t |_ td$hd%d|_dS(&Nsslistsindexislevels stack_capssstackss talon_roundisncardsishintsshighlight_pilesshighlight_cardsshighlight_sameranks undo_movess redo_movess total_movess player_movess demo_movessautoplay_movessquickplay_movessgoto_bookmark_movess demo_updateds update_times elapsed_timef0.0sholdedsloadedssaveds restartedsupdateds start_timestotal_elapsed_times start_players bookmarksscomment(s_sfilenamesNonesdemosStructshintsssaveinfosloadinfostimesstatss startMovessrestartsU_PLAYsgstatss gsaveinfo(s_srestart((spysol.pysreset"sL           cCs|ii|iSdS(N(s_sappsgetGameTitleNamesid(s_((spysol.pys getTitleName"scCs*t|i}|o d|Sn|SdS(Ns#(sstrs_srandomsssformat(s_sformatss((spysol.pys getGameNumber"s cCs4tt|tt|f\|_|_dS(N(sintsroundswshs_swidthsheight(s_swsh((spysol.pyssetSize"scCsV|io|iid|n|io |iio|iiid|ndS(Nscursor(s_scanvassconfigscursorsappstoolbars setCursor(s_scursor((spysol.pys setCursor"s cCs$|idf\}|_|idt|i|id||i|i ||i t |i ii|iijptx|iD]}|iqW|i|id|iii|id|idddd|id |iii|iii|i|i o-t|i d |iii!|i i"n|i#|i$|i%_&|i'|i(x|iD]}|iqW|i|idd|i)|i#|o|i+d|i_,n|id|ii-t.i.|i_/||_dS( Niscursorsrestartsplayers gamenumbersformatsmovesisstatss maximized(0s_sbusysold_busys setCursors CURSOR_WATCHs disableMenussresetsrestarts resetGames createRandomsrandomsshuffleslenssstalonscardssgameinfosncardssAssertionErrors allstackssstacks updateTexts updateStatussappsoptsplayers getGameNumbersstatssgetStatssidspreviewswm_mapstops wm_maximizeds busyUpdates stopSamplessS_INITsmovessstates startGames startMovess updateMenussautoplaysautoPlays player_movess top_cursorstimes update_time(s_srandomsrestartsautoplaysold_busysstack((spysol.pysnewGame"sF    )  ".         c Cs|idf\}|_|o|in|i|i|_|i|_|i|_|i |_ |i |_ |i |_ |i |_ |i |_ |i|_|ii|ii_t|it|iijptxtt|iD]m}xd|ii|D]R} | \}} |i|}| o|in |i |i|i!|qWqWx4|i i"D]&\}}|i|i$i%|i&quW|i'|x|iD]} | i)qW|i)|i*d|i+i,i-|i*d|i.ddd|i i/|i*d|i+i i0|i+i,i-|i1|i2 o*|i3t4|i5d|i+i,i6n|i7d|i+i8t9i9|i _:||_dS( Nisplayers gamenumbersformatsmovessstatss maximizedscursor(;s_sbusysold_busysresets resetGamesgamesfilenamesversions version_tuplesrandomsmovessstatssgstatsssaveinfos gsaveinfosloadinfos talon_roundssstalonsroundslens allstackssstackssAssertionErrorsrangesistscard_idsface_upscardsscardsshowFacesshowBacksaddCards stack_capssstack_idscapsupdates__dict__s_restoreGameHooksstacks updateTexts updateStatussappsoptsplayers getGameNumbersindexsgetStatssidspreviews updateMenusswm_mapstops wm_maximizeds setCursors top_cursorstimes update_time( s_sgamesresetsold_busyscapsiscardscard_idsstack_idstsface_upsstack((spysol.pys restoreGame"sT          )       (.   cCs|idf\}|_t|}t|}|i||i }|i |i jpt |i |ddt|||_dS(Nisreseti(s_sbusysold_busysStringIOsbookmarksfiles Unpicklersps _undumpGamesappsgamesidsAssertionErrors restoreGamesdestruct(s_sbookmarksold_busyspsgamesfile((spysol.pysrestoreGameFromBookmark#s   cCst|i_|iiix|iD]}|i q&W|i djoBx?|i i |i i fD]!}|o|iddqcqcWndS(Nistexts(sNones_shintsslistssstalonsremoveAllCardss allstackssstacks resetGamespreviewstextssscores base_rankstsconfig(s_sstackst((spysol.pys resetGame#s  cCsd}||ijo|dB}n|iii|iij o|dB}n|tj oL|i|iij o|dB}q|i |ii jo|dB}qn|SdS(Niiii( sfsids_sappsnextgamescardsetsrandomsNones __class__s initial_seed(s_sidsrandomsf((spysol.pys nextGameFlags(#s c Cs|i|o\|i|if\}}t}t|d}|i |dd|i |i i _n|djo|i dtn||i i _||i i _||i i _||i i _||i i _|idtdtdt|iidS(Nisbookmarkiscursorsmovess gamenumbersstats(s_s updateTimesbookmarksidsrandomsStringIOsfilesPicklersps _dumpGamesgetvaluesappsnextgames setCursors CURSOR_WATCHs loadedgames startdemosholdgames updateStatussNonestopsmainquit( s_sidsrandoms loadedgames startdemosbookmarksholdgamespsfile((spysol.pysquitGame4#s    cCs*|iodSn|ii|odSn|odSn|oH|iidjo|i djo|i i d|i _ ndSn|i |ii }|iow|i}|o`|ii|id||i|i<|ii|id||i|i<|i||_q&ndS(Nii(s_spreviewsapps wm_save_statesholdgamesbookmarksrestartsmovessindexsgetPlayerMovessgstatss restarteds updateStatssstatssshallUpdateBalancesgetGameBalancesbs total_balancesgetsidssession_balancesgameid_balance(s_srestartsbookmarksholdgamesbsstats((spysol.pysendGameF#s&  &    &&cCs-|idd|iddd|idS(Nsrestartisrandom(s_sendGamesnewGamesrandom(s_((spysol.pys restartGameZ#scCs|tjot|ito&|ii}|iii |nxBno:|iii}|iii}|djoPqIqPWt||_|ii |i_ n||_|ii dS(Nil_(srandomsNones isinstances_s LCRandom64sgetSeedsseedsapps gamerandomssetSeedsdummys ORIGIN_RANDOMsoriginsreset(s_srandomsdummysseed((spysol.pys createRandom]#s    cCs1|ii}||jo||i_n|SdS(N(s_smovessstates old_state(s_sstates old_state((spysol.pys enterStatel#s  cCs||i_dS(N(s old_states_smovessstate(s_s old_state((spysol.pys leaveStateq#sc Cstd}|i} d}|od|i| i}ng} d} |i i i |i i if\} }x6t| iD]%}x| iD]}x{| iD]p}|i| |||d| d|} | tjoqn| i| | d} |o|id|qqWqWt| i}x{| iD]p}|i| |||d| d|} | tjoq+n| i| | d} |o|id|q+q+WqzW|o|idd nt| | ijpt| SdS( NsGame.createCardsif100.0sxsyisstepspercentid(sTimerstimers_sgameinfosgispstepsprogressspercentsncardsscardssidssstalonsxsysrangesdeckssdeckssuitsssuitsrankssranks _createCardscardsNonesappendsupdateslens trump_suitstrumpssAssertionError(s_sprogresssrankspstepsdeckssuitsystimers trump_suitsxscardsscardsidsgi((spysol.pys createCardss#sF  $  $    $   c Cs)t||||d|d|d|SdS(Nsgamesxsy(sCardsidsdeckssuitsranks_sxsy(s_sidsdeckssuitsranksxsy((spysol.pys _createCard#scCst|i}t|itot|djoYg}xFtdD]8}x/ddddfD]}|i |||qaWqHW|}n|ii |ii ||i|}x7|D]/}|iii|dd|iddqWdS(Ni4i ii'isupdatesunhide(slists_scardss isinstancesrandoms LCRandom31slensfcardssrangesisjsappendsresetsshuffles _shuffleHookscardssstalonsaddCardsshowBack(s_sisjsfcardsscardscards((spysol.pysshuffle#s &   cCsg}|ii|ii|ii}x[t|iiD]G}||}t |i|||!}|ii ||i|q<W|i|}x7|D]/}|iii|dd|iddqWdS(Nsupdateisunhide(scardss_srandomsresetsgameinfosncardssdeckssnsrangesdecksislists deck_cardssshufflesextends _shuffleHookscardssstalonsaddCardsshowBack(s_sdecksisns deck_cardsscardscards((spysol.pysshuffleSeparateDecks#s  cCs|SdS(N(scards(s_scards((spysol.pys _shuffleHook#si?BcCs'|i|||\}}||SdS(N(s_s_shuffleHookMoveSorterscardssfuncsncardssscards(s_scardssfuncsncardssscards((spysol.pys_shuffleHookMoveToTop#scCs'|i|||\}}||SdS(N(s_s_shuffleHookMoveSorterscardssfuncsncardssscards(s_scardssfuncsncardssscards((spysol.pys_shuffleHookMoveToBottom#sc Csgt|f\} }xq|D]h}||\}}|o?|i|| i |||ft| |joPq~n|d}q W| i | i t d| }||fSdS(NicCs|dS(Ni(sitem(sitem((spysol.pys#s(slenscardsssitemssiscsfuncsselects sort_ordersremovesappendsncardsssortsreversesmapsscards( s_scardssfuncsncardsscsis sort_ordersscardssselectssitems((spysol.pys_shuffleHookMoveSorter#s    cCsS|io|in|iodSn|iio|iiindSdS(Nii(s_sdemosstopDemosbusysdragsstacks finishDrag(s_((spysol.pys _finishDrag#s   cCsS|io|in|iodSn|iio|iiindSdS(Nii(s_sdemosstopDemosbusysdragsstacks cancelDrag(s_((spysol.pys _cancelDrag#s   cCs#|i o|iiindS(N(s_spreviewsappsmenubars updateMenus(s_((spysol.pys updateMenus#s cCs#|i o|iiindS(N(s_spreviewsappsmenubars disableMenus(s_((spysol.pys disableMenus#s cGs |io|intSdS(N(s_sdemosstopDemosEVENT_PROPAGATE(s_sargs((spysol.pys clickHandler#s cKs]|iodSn|ii|iif\}}x&|iD]\}}|djok|t jo"|o|i ddq=q=nt |tijo"|o|i d|q=q=qn|djok|t jo"|o|i ddq=q=nt |tijo"|o|i d|q=q=q9n|djo|t jo"|o|i ddq=q=nt |tijo&|o|i dd|q=q=nt |tijo"|o|i d|q=q=qn|djo|t jo"|o|i ddq=q=nt |tijoV|oHt|}|iiio|i dd|q|i d|q=q=qn|djo|t jo"|o|i ddq=q=nt |tijoId |d |d |d |d f}|o|i d|q=q=q8n|d joq=nt|q=WdS( Ns gamenumberssinfosmovessMoves %dsplayersPlayer sstatss %d: %d/%diistime(s_spreviewsappstoolbars statusbarstbssbskwsitemssksvsNones updateTextstypestypess StringTypesIntTypes StringTypessustrsopts toolbar_sizes TupleTypestsAttributeError(s_skwsksvssbstbst((spysol.pys updateStatus#sz                 '  cCs8|iio#|iii|d|d|SndSdS(Nsprioritysloopi(s_sappsaudios playSamplesnamesprioritysloop(s_snamesprioritysloop((spysol.pys playSample$s #cCs%|iio|iiindS(N(s_sappsaudios stopSamples(s_((spysol.pys stopSamples$s cCs%|iio|iiindS(N(s_sappsaudiosstopSamplesLoop(s_((spysol.pysstopSamplesLoop$s cCs|iii}|o|i o|iin|iio |iii o|dddfjo|i dddd|q|djo|i d ddd|q|d jo|i d ddd|qndS( Niiisdeal01spriorityidsloopisdeal04isdeal08( s_sappsopts animationssaspreviewscanvassupdate_idletaskssaudiossounds playSamplesloop(s_sloopsa((spysol.pysstartDealSample$s  ic Cs|iodSn|djo|iii}n|o| o t}n| o d}n|idt |i d|d|ddd |d d d f}|i djp |idjodSqndSdS( NiisDiscard current game ?s areyousurestitlestextsbitmaps questheadsdefaultsstringssOKsCancel(s_spreviewsconfirmsappsoptstitlesPACKAGEstexts playSamples MfxDialogstopsdefaultsdsstatussbutton(s_stitlestextsconfirmsdefaultsd((spysol.pys areYouSure$$s        cCs%t|idddddd}dS(NstitlesNot yet implementedstexts%This function is not yet implemented.sbitmapserror(s MfxDialogs_stopsd(s_sd((spysol.pysnotYetImplemented3$sc CsC|iiidjp |djodSn|iio|ii odSntddf\} } } |iiidjo t } ndd}|djo d}n|djpt|iiidjo|d}|d}nz|iiidjo|d}|d}nL|iiid jo5|ii|ijo |djo|d}qen|djo|iii}nf}|ox|D]}|iqWn|d}||it|||it|f\}}ddf\} }d}| o | }nx||jot!t"||| t!t"|||f\}}| |||f\} }x|D]}|i&||qWx|D]}|i'||qW|djo |o|o=|ii)i*|ii)i+f\}}|i.|||}n|i/i0d}| o|||}|| } | o | d jot4| q| o| d |jo:|d}|djo| d |jo|d}qqn||}qWx|D]}|i5qW||i||if\}}x|D]}|i'||qW|i/i0dS( Niiif0.14999999999999999iiiiif0.0050000000000000001f0.75f-1.5(6s_sappsopts animationssframessdebugstopswinfo_ismappedsNonesclocksdelaysskipsuclocksSPFsAssertionErrorsmovessstatesS_INITsshadowsshadowsstkraisescardsscardsc0sxsfloatsysdxsdystxstysis starttimesintsroundsmxsmysssmovesmoveBys from_stacksimagessSHADOW_XOFFSETsSHADOW_YOFFSETssxssys createShadowsscanvassupdate_idletaskssstepsendtimessleepsusleepsdelete(s_s from_stacksto_stackscardssxsystkraisesframessshadowsskipssleepstxsclocksdelaysSPFsstepsdxsdysc0scardsshadowsssyssxsendtimesistysss starttimesmysmx((spysol.pysanimatedMoveTo7$s#      #  4  :$    c Csh|iii odSn|iio|ii odSn|iii} | djod|ii_n!| djod|ii_ng} xO|i D]D}||i i j o+x(|iD]}| i ||fqWqqWg}xNtdD]@}|iii| \}}||j o|i |qqW|i i i|i i if\}}|i|if\} }x| o|iii| } | \}}|i|dd||jpt| djo\|i|t|g| d|dddd d|i|t|g||ddd dn|i ||| i!| q|W| |ii_dS( Niiiiisupdateistkraisesshadow("s_sappsopts animationssdebugstopswinfo_ismappedsold_ascardss allstacksssstalonscsappendsacardssrangesis miscrandomschoicesxsyssxssyswidthsheightswshsts removeCardslensanimatedMoveTosNonesmoveTosremove( s_sperfectscssxsishsacardsssyssstswscardssold_a((spysol.pys winAnimationr$sF     $  0,cCs@|djo/|io|ii|q<ti|ndS(Ni(ssecondss_stopssleepstime(s_sseconds((spysol.pyssleep$s  cCsU|iiitijo|djo|d}q8n|iii|||SdS(Ni i( s_sappscardsetstypesCSIs TYPE_TAROCKsranksimagessgetFacesdeckssuit(s_sdeckssuitsrank((spysol.pysgetCardFaceImage$s cCs|iii|||SdS(N(s_sappsimagessgetBacksdeckssuitsrank(s_sdeckssuitsrank((spysol.pysgetCardBackImage$sc Csntdf\}}xQ|D]I}|i|d|i|d}||jo||f\}}qqW|SdS(Niɚ;i( sNonesclosestscdistsstackssstacksxscxsyscysdist( s_scxscysstackss dragstacksdistsclosestsstackscdist((spysol.pys_getClosestStack$s  cCs|i|if\}}xx|iiD]j\}}||djo0||djo||djo||djo|i ||||Sq%q%W|i |||ii |SdS(Niiii( scardsxsyscxscys_sregionssinfosstackssrects_getClosestStacks dragstacks remaining(s_scards dragstacksrectscyscxsstacks((spysol.pysgetClosestStack$s  Dc Cswt|djptt|djo'|d|djo|d|djptx|D]}|o ||ijpt|i|i|f\}}}||djo0||djo||djo||djptxB|i i D]4}||djo||dj ptqqWqeW|i i i|t|i i  t|t|fdS(Niiiii(slensstackssAssertionErrorsrectsss_s allstackssxsysrsregionssdatasdsprioritysappendstuple( s_sstackssrectsprioritysdsssrsysx((spysol.pys setRegion$sDK %cCs|iii|iiig|i_x5|iiD]'}|iii|d|dfq9Wt|ii|i_t |i i }xM|iiD]?\}}x0|D](}x||jo|i|qWqWqWt||i_ dS(Nii(s_sregionssdatassortsreversesinfosdsappendstupleslistssgs openstackss remainingsstackssrectsstacksremove(s_sdsstackssrectsstacks remaining((spysol.pysoptimizeRegions$s   %  cCs tdS(N(sSubclassResponsibility(s_((spysol.pys createGame$scCs tdS(N(sSubclassResponsibility(s_((spysol.pys startGame$scCs!|iio|iiiSdS(N(s_ssstalons canDealCards(s_((spysol.pys canDealCards$scCs|iio |ioo|i|i|i}|iiid|}|i ||i|i o|i n|SndSdS(Nssoundi(s_ssstalons canDealCardss finishMoves enterStatesS_DEALs old_states dealCardsssoundsns leaveStates checkForWinsautoPlay(s_ssounds old_statesn((spysol.pys dealCards$s   cCsdS(N((s_sstack((spysol.pys fillStack$scCs |iSdS(N(s_s Hint_Class(s_((spysol.pys getHintClass$scCsdSdS(Ni((s_((spysol.pys getStrictness$scCsdSdS(Ni((s_((spysol.pys canSaveGame$scCs|i|jSdS(N(s_s GAME_VERSIONs game_version(s_s version_tuples game_version((spysol.pys canLoadGame$scCs|iSdS(N(s_s canSaveGame(s_((spysol.pyscanSetBookmark$scCsdSdS(Ni((s_((spysol.pyscanUndo$scCs|iSdS(N(s_scanUndo(s_((spysol.pyscanRedo$scCs|iidjodSn|iidjodSn| o:|iidjodSn|iidjodSqxn|iidjp|i djodSndSdS(Niii( s_sgstatssupdatedsloadedsrestarts restartedsgoto_bookmark_movessmovessindexsgetPlayerMoves(s_srestart((spysol.pyschanged$s &cCs|idj}| p#|iidjp|iidjo|d|ifSn|iidjo6|iidjo#|ii djo|ii djo|d|i fSn|d|i fSdS(Niii( s_s isGameWonswonsstatsshintss demo_movessU_LOSTs undo_movessgoto_bookmark_movesshighlight_pilesshighlight_cardss U_PERFECTsU_WON(s_swon((spysol.pys getWinStatus$s .LcCs|iodSn|i\}}}|o|idjo)||i_ |i ii t ||n!|i ot||i_|i iioT|i ii |i ii|||id|i ii|i ii|iqn| o|i iio|iio&|i ii|i ii|dq|iidjo|ii djo&|i ii|i ii|dqqndS(Nisstatsii(s_spreviews getWinStatusswonsstatussupdatedsdemosgetPlayerMovessstatss demo_updatedsapps updateStatssNoneschangedsgstatssoptsupdate_player_statssplayers updateStatussgetStatssidsloadeds updateLog(s_sdemosstatussupdatedswon((spysol.pys updateStats$s"    "6 &&c Cs|i\}}}| odSn|i|iodSn|djo|i|idddt |i ddd d d |i d d t |i idddtdfd|iiiddd}n9|djo|i|idddt |i ddd dd |i d d t |i idddtdfd|iiiddd}n|iidjoG|idddt |i ddddd dddtdf}nD|idddt |i ddddd dddddf}|idjo |idjoT|i|djo|id dn|djo|in|in/|idjo |idjo|indSdS(!Niiis winperfectspriorityistitlesGame wonstexts3 Congratulations, this was a truly perfect game ! sYour playing time is s sfor s moves. sstringssNew gamesCancelsimageisseparatorwidthswinwons Congratulations, you did it ! is winfinisheds Game finishedsbitmapsinfos Game finished swinlosts+ Game finished, but not without my help... sRestartsperfect(s_s getWinStatusswonsstatussupdateds finishMovespreviews updateStatss playSamples MfxDialogstopsgetTimesstrsmovessindexsNonesappsgimagesslogossdsgstatssbuttonsendGames winAnimationsnewGames restartGame(s_sstatussupdatedsdswon((spysol.pys checkForWin%sN    0#  0#     cCsGd}x'|iiD]}|t|i}qW|t|ijSdS(Ni(scs_sss foundationsslenscards(s_scss((spysol.pys isGameWon=%s  cCsCx8|iiD]*}t|idjo|iSq q WdSdS(Nii(s_sss foundationsslenscardss getRankDir(s_ss((spysol.pysgetFoundationDirB%s  cCs|ii}|SdS(N(s_sstatss player_moves(s_s player_moves((spysol.pysgetPlayerMovesG%s cCsiti}||ii}|djo0|ii||i_|ii||i_n||i_dS(Ni( stimests_sstatss update_timesds elapsed_timesgstatsstotal_elapsed_time(s_sdst((spysol.pys updateTimeJ%s   cCs|itt|ii}|djodSn|djod|d|dfSnd|d|dd|dfSdS(Nis0:00is%d:%02di<s %d:%02d:%02d(s_s updateTimesintsroundsstatss elapsed_timest(s_st((spysol.pysgetTimeQ%s   cCs#|ii|ii|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacksW%scCs|iodSn|idf\}|_|djo|iii}n|djo|iii}n|djo|iii}n|i i }|i |||d|}|i|i i|i i ||i _||_|SdS(Niissound(s_sdemosbusysold_busys autofaceupsappsoptsautodropsautodealsstatss total_movessmovess _autoPlayssoundsns finishMovesautoplay_moves(s_s autofaceupsautodropsautodealssoundsold_busysmovessn((spysol.pysautoPlayY%s        c Cs|i\} } }d}xv|ond}|o| osxp| D]d} | ioQ|o|i dddn| i d}|i |i odSqq@q@Wn|o| ox| D]} | i|ii\}}|oW|i |o|i dddn| i||d}|i odSq@qqWn|o@|id|o)d}|i |i odSqqqqWdSdS( Niisautoflipspriorityisautodropissound(s_s getAutoStackss flipstackss dropstackss quickstackssdone_somethings autofaceupsss canFlipCardssounds playSamplesflipMoves finishMoves checkForWinsautodrops canDropCardss foundationssto_stacksncardssmoveMovesautodeals _autoDeal( s_s autofaceupsautodropsautodealssoundsncardssto_stacksdone_somethings quickstackssss flipstackss dropstacks((spysol.pys _autoPlayf%sF        cCsR|ii}|o t|idjo |io|id|SndSdS(Nissound( s_ssswasteswslenscardss canDealCardss dealCardsssound(s_ssoundsw((spysol.pys _autoDeal%s *cCs,|iio|iidffSnfSdS(Ni(s_ssgs hp_stacks(s_((spysol.pysgetHighlightPilesStacks%s f1.5c Cs!| odSng}x|D]\}} } }| |ijo | |ijpt|id} | djop|i | \} } |i | \}}| |idj o | djo|| }qL||iii}nm|i | \} } |i | \}}||iii}| |idj o| |iii| } n||iii}t|i| d| d|d|ddddtd|}|i| i|i|qW| odSn|ii|i||ix|D]}|iqW|iitSdS(Niiiswidthisfillsoutline( sinfositemssssc1sc2scolorscardssAssertionErrors CARD_YOFFSETssy0sgetPositionForsx1sy1sx2sy2s_sappsimagessCARDHsCARDWsMfxCanvasRectanglescanvassNonesrstkraisesitemsappendsupdate_idletasksssleepsreversesdeletes EVENT_HANDLED(s_sinfossleepsrsy2scolorsitemssx2ssssy0sy1sc2sc1sx1((spysol.pys_highlightCards%sB'  !%    cCs|i}| odSn|iii}g}xv|D]n}xe|dD]Y}|i }|ot ||djo)|i ||d|d|dfqIqIWq8W|i||SdS(Niii(s_sgetHighlightPilesStackss stackinfosappsoptshighlight_piles_colorsscolshississsgetPilespileslensappends_highlightCardsssleep(s_s stackinfossleepssssishispilescol((spysol.pyshighlightPiles%s   1cCsdSdS(Ni((s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch%scCst|idjSdS(Ni(slensto_stackscards(s_sncardss from_stacksto_stack((spysol.pysgetQuickPlayScore%scCsdS(N((s_((spysol.pys updateText%scCstSdS(N(sNone(s_((spysol.pys getGameScore%scCsFt|i }x+|iiD]}|dt|i}qW|SdS(Ni(slens_scardssvsss foundations(s_sssv((spysol.pysgetGameScoreCasino%s  cCs>|iiodSn|ii|iijodSndSdS(Nii(s_sgstatssloadedsrandomsoriginsORIGIN_SELECTED(s_((spysol.pysshallUpdateBalance%s  cCsdSdS(Ni((s_((spysol.pysgetGameBalance%scCsA|i}|tjotSn|||}|i|SdS(N(s_s getHintClasss hint_classsNoneslevelshintsgetHintss taken_hint(s_slevels taken_hintshints hint_class((spysol.pysgetHints%s   cCs|itjotSn||iijo||i_t|i_n|iitjo(|i|||i_d|i_n|ii otSn|ii|ii}|iid|i_|iit |iijod|i_n|\} }} }} } } |ot |i| jpt| djo6|djpt||iijpt|Sn|| joF|djpt| djot |i| jpt|Sn_| ptd| jot |ijnpt| i||i| pt|djo|Sn|ii}|i|i| \}}| i| i\}}||i ||i!f\}}||i ||i!f\}}| djo&||i"d}||i#d}n_|i$do*||i$dd}||i#d}n'||i"d}||i%dd}||i"d}||i#d}t&|i'||||ddd|ii(i)dd d d d d f}|djp|djo |ii(i+}|o|ii-o |ii(i-o'|ii-i.d dd| d| nd}|i'i/|i||o#|ii-i.d ddddn|tj o|i0n|i'i/|SdS(Niiif0.0swidthisfillsarrowslasts arrowshapeii sinfostexts Score %6dsfgss#000000(1s_s getHintClasssNoneslevelshintsslistsgetHintss taken_hintsindexshslensscorespossncardss from_stacksto_stacks text_colors forced_movescardssAssertionErrorssstalons acceptsCardsssleepsappsimagessgetPositionForsx1sy1sgetCardsx2sy2sCARD_DXsCARD_DYsCARDWsCARDHs CARD_XOFFSETs CARD_YOFFSETs MfxCanvasLinescanvassoptshintarrow_colorsarrows demo_scoresinfos statusbars configLabelsupdate_idletaskssdelete(s_slevelssleeps taken_hintspossimagess from_stacksy1sy2s forced_movesscoresncardss text_colorsto_stacksx2sx1sinfoshsarrow((spysol.pysshowHint%sv $  *."     )$'  #  icCs|djpt|i odSntd|d|d|iiidgdt dt d|i i d t |_ t |i _no|in|it|i|idS( Nislevelsmixedssleeps last_dealshintskeypresssstart_demo_movess info_texti(slevelsAssertionErrors_stopsStructsmixedsappsopts demo_sleepsNonesstatss demo_movessdemoshintsslistscreateDemoInfoTextscreateDemoLogos after_idles demoEvent(s_smixedslevel((spysol.pys startDemo&s      cCsC|i odSn|iitt|_t|_|idS(N(s_sdemoscanvass setTopImagesNones demo_logos updateMenus(s_sevent((spysol.pysstopDemo+&s    c Csc|i p |iio|i|idSn|i|i} |i|ii t |i _ |i }t df\}}d}d} |djo d} n|io]d} |ii o d}q|djo|id|iiidd d d f}t|id td ddt|iidd|iii dd|fddd| }|i}q|iiiddf}d}|ii"o$|d|i#i|i#i$f}nt|id td d|d|d|fddd| }|i}n| o|ii o d}q|djo|idn|iiidddf}t|id td dd d|d|fddd| }|i}n| oq|i%d!d|io|djo |ii" o{|i#i$|ii&jo^|ii'd|i_'|ii'd"djo-|iiot(|idd}qhqlqpn|io |djof|i}|i)} no|i*o |ii"o^|ii+i,} |ii+i.} t | } | i|i)dt/| }| |} ng|i*o\|ii+i,} xGt/| djo/|ii0} dp | |i)joPq4q4Wn|i1| djo1|i2|i3d#d|i4d$|i*q-|i2|i|i5| d%dq_|ido |ii"o"|i2|i6|i3q_n/|ii7|iot8|i|i9ndS(&Nisinfoi'iiis autopilotwonsGreatsCoolsYeahsWowstitles Autopilotstexts Game solved in s moves. simageisstringssseparatorwidthstimeoutsOKs Game finished s %d %d sbitmapspadxis autopilotlostsOh wells That's lifesHmms This won't come out... sdemoisautoplaysmixeds startdemo(:s_sdemoskeypresssstopDemos updateMenussplayOneDemoMovesfinisheds finishMovestopsupdate_idletaskssNoneshintsslistsgetPlayerMovess player_movessdsstatussbitmapstimeouts isGameWonswinfo_ismappeds playSamplesapps miscrandomschoicesss MfxDialogsPACKAGEsstrsmovessindexsgimagesslogosstextsdebugsstatss demo_movess updateStatssstart_demo_movess demo_counters helpAboutsidsmixedsgdbsgetGamesIdSortedByIdsglsgetGamesIdSortedByNameslensgetRandomGameIds nextGameFlagssendGamesnewGames startDemosquitGames winAnimations busyUpdates after_idles demoEvent( s_sstatussindexs player_movessdstextsssbitmapsdemosfinishedstimeoutsglsid((spysol.pys demoEvent2&s            !  $    %%             c Cs|iidjodSn|i} |iio|ii o d} qPn|i p |i d o|i ddodSqn|i |i | d|i } | |_ | odSn| \} }}}}}}|djoY|idjodSn|iii}||ijodSn|ii|nD||jo|ig|_n |i||dd g|_dSdS( Niif-1.0issoundis taken_hintsframesi(s_smovessindexsdemossleepsappsdebugstopswinfo_ismappedshints _autoDealsshowHintslevelshsscorespossncardss from_stacksto_stacks text_colors forced_moves dealCardsssstalonsgetCardscs last_dealsappendsflipMovesmoveMove( s_sdemoscsncardss from_stackspossto_stacks text_colors forced_movesscoressleepsh((spysol.pysplayOneDemoMove&s6         c CsdS|i p|iip|iodSndd|idfd|id|idfdddfd|iddfg}|i|}|oOt d}t |i |d|dd |d d |d |i |i_ndS( Nsswissesnwsnes canvas_largeiisanchorisfontstext(s_sdemos info_textspreviewsheightswidthstinfosgetDemoInfoTextAttrstasgetFontsfonts MfxCanvasTextscanvassgetDemoInfoText(s_stastinfosfont((spysol.pyscreateDemoInfoText&s"R !cCs|iiSdS(N(s_sgameinfos short_name(s_((spysol.pysgetDemoInfoText&scCsggf\}}x|iD]|}|iol|i||it|i |i o|i i djo|i|q|it|i qqW|i |}|djo|i |}n|djotSn||SdS(Ni(sitems1sitems2s_s allstackssss is_visiblesappendsextendslistscardsscaps max_accepts$_Game__checkFreeSpaceForDemoInfoTextstisNonestinfo(s_stinfositems2sssitems1sti((spysol.pysgetDemoInfoTextAttr&s     c Csc|iii|iiif\} }d| d|id| df\} } |d|i d|df\}}ddddg}x|D]}|i|if\} }||jo:| | jod|di8| i8n|i?||djo#|ti }| |djn| djo4|i>|_>|i=|_=|i5|_5|i9|_9n|SdS(NcCs9| o-| odtd}ntt|ndS(NsInvalid or damaged s save file(sexprstextsPACKAGEs Exceptionsstr(sexprstext((spysol.pyscheck'scCs\|i}t|tijo2t||j odtd}t |qTn|SdS(NsInvalid or damaged s save file( spsloadsobjstypeststypessTypeTypesPACKAGEstexts Exception(stspsobjstext((spysol.pyspload's  iisCannot load games saved with s version iisIncompatible savegame formatis#Cannot load this game from version s> as the game rules have changed in the current implementation.soriginiiisEOF(As_s updateTimesNonescheckspsploadspackagestypestypess StringTypesPACKAGEsversionslensget_version_tuples version_tuples_getUndumpVersionsvs VERSION_TUPLEs game_versionsbookmarksvts TupleTypesIntTypesidsGIsPROTECTED_GAMESshas_keysapps constructGamesgames canLoadGamesdestructsrandomsWHRandoms InstanceTypes isinstances PysolRandomshasattrsORIGIN_UNKNOWNsoriginsloadinfosstackssncardssnstackssrangesisstacksjscard_idsface_upsappendsgameinfos talon_roundssaveinfosStructs merge_dicts__dict__s gsaveinfosListTypestalon_base_cardssmovessgstatssstatss _loadGameHooksdummy(s_spsapps version_tuplesdummysvtsidsgstatssmovessstatss gsaveinfosbookmarkschecksversionsnstackss game_versionsncardssgamessaveinfosstackstalon_base_cardsspackagesisjscard_idsploadsvsface_up((spysol.pys _undumpGame's   & , ,  & : &  &       7  7               cCsmt}zJ|i o tdnt|d}t||}|i |Wd|o|i nXdS(NsCannot save this game.swb( sNonesfs_s canSaveGames ExceptionsopensfilenamesPicklersbinmodesps _dumpGamesclose(s_sfilenamesbinmodesfsp((spysol.pys _saveGame>(s cCs|id|jo djnpt|it|it|it|i||i|i |i|i |i|i |it |i x[|i D]P}|it |ix1|iD]&}|i|i |i|iqWqW|i|iiid|jo djno$|i|i|i|in|i|id|jo djnoK|djo|iid|i_n|i|i|i|in|i||iddS(NiiisEOF(s_s updateTimesbookmarksAssertionErrorspsdumpsPACKAGEsVERSIONs VERSION_TUPLEs GAME_VERSIONsidsrandomslens allstackssstackscardsscardsface_upssstalonsroundssaveinfos gsaveinfosmovessgstatsssavedsstatss _saveGameHook(s_spsbookmarkscardsstack((spysol.pys _dumpGameH(s: %        cCsdS(N((s_sgame((spysol.pys_restoreGameHookd(scCsdS(N((s_sp((spysol.pys _loadGameHookf(scCsdS(N((s_sp((spysol.pys _saveGameHookh(s(s__name__s __module__sU_PLAYsU_WONsU_LOSTs U_PERFECTsS_INITsS_DEALsS_FILLsS_PLAYsS_UNDOsS_REDOs GAME_VERSIONs__init__screates initBindingss_Game__createCommons createPreviewsdestructsresets getTitleNames getGameNumberssetSizes setCursorsNonesnewGames restoreGamesrestoreGameFromBookmarks resetGames nextGameFlagssquitGamesendGames restartGames createRandoms enterStates leaveStates createCardss _createCardsshufflesshuffleSeparateDeckss _shuffleHooks_shuffleHookMoveToTops_shuffleHookMoveToBottoms_shuffleHookMoveSorters _finishDrags _cancelDrags updateMenuss disableMenuss clickHandlers updateStatuss playSamples stopSamplessstopSamplesLoopsstartDealSamples areYouSuresnotYetImplementedsanimatedMoveTos winAnimationssleepsgetCardFaceImagesgetCardBackImages_getClosestStacksgetClosestStacks setRegionsoptimizeRegionss createGames startGames canDealCardss dealCardss fillStacks DefaultHints Hint_Classs getHintClasss getStrictnesss canSaveGames canLoadGamescanSetBookmarkscanUndoscanRedoschangeds getWinStatuss updateStatss checkForWins isGameWonsgetFoundationDirsgetPlayerMovess updateTimesgetTimes getAutoStackssautoPlays _autoPlays _autoDealsgetHighlightPilesStackss_highlightCardsshighlightPilessshallHighlightMatchsgetQuickPlayScores updateTexts getGameScoresgetGameScoreCasinosshallUpdateBalancesgetGameBalancesgetHintssshowHints startDemosstopDemos demoEventsplayOneDemoMovescreateDemoInfoTextsgetDemoInfoTextsgetDemoInfoTextAttrs$_Game__checkFreeSpaceForDemoInfoTextscreateDemoLogos startMovess_Game__storeMovesmoveMovesflipMoves turnStackMoves nextRoundMoves saveSeedMovesshuffleStackMovesupdateStackMoves finishMovesundosredos setBookmarks gotoBookmarksundoGotoBookmarksloadGamessaveGames _loadGames_getUndumpVersions _undumpGames _saveGames _dumpGames_restoreGameHooks _loadGameHooks _saveGameHook(((spysol.pysGame"s  " #     3    " (                  4    ; !                  -       !   "        ?  Y              %     #  a   s _LayoutStackcBs#tZedZdedZRS(NcCsItt||_tt||_||_h|_d|_dS(Ns%d(sintsroundsxs_syssuits text_argss text_format(s_sxsyssuit((spysol.pys__init__k(s   scentercKsU||id<||id<||id<|ii||tj o ||_ ndS(Nsxsysanchor( sxs_s text_argssysanchorsupdateskwsformatsNones text_format(s_sxsysanchorsformatskw((spysol.pyssetTextq(s     (s__name__s __module__sNones__init__ssetText(((spysol.pys _LayoutStackj(s sLayoutcBsCtZdddZedZdZddddZdZd Zd Z d Z d Z dd dZ dddZ ddddZdddZddddZdddZddddZddddZddddZddddZddddZddd Zdd!d"ZRS(#Ni c KsM||_|ii|_t|_tdtdtdgdgdg|_h|_g|_|ii i }|i |_ |i |_||_||_|i ||_|i||_|i|_|i|_|ii||iidjoX|ido|i|ii|_n|ido|i|ii|_qIndS( Nstalonswastes foundationssrowssreservesisXOFFSETsYOFFSET(sgames_scanvassNonessizesStructsssstackmapsregionssappsimagessCARDWsCWsCARDHsCHsXMsYMsXSsYSs CARD_XOFFSETsXOFFSETs CARD_YOFFSETsYOFFSETs__dict__supdateskwspreviewshas_key(s_sgamesXMsYMskwsimages((spysol.pys__init__y(s2           cCsTt|||}|i|if}|ii| pt ||i|<|SdS(N( s _LayoutStacksxsyssuitsstacksmapkeys_sstackmapshas_keysAssertionError(s_sxsyssuitsmapkeysstack((spysol.pys __createStack(s  cCsddf\}}|tj o|i|if\}}n|djo&||id||iddfSn|djo&||id||iddfSn|djo&||id||iddfSn|djo&||id||iddfSn|d jo||i |d dfSn|d jo"||i ||i d dfSnd }|i i idjo d}n|d jo||i|d |fSn|d jo"||i||i d |fSn|djo&||i||i dd|fSnt|dS(Nisniscenters%dsnnssssssnwsnesswsses%2dis%3dsesw(sxsysstacksNonesanchors_sCWsYMsYSsXMsCHsfsgamesgameinfosdeckssXSs Exception(s_sstacksanchorsfsysx((spysol.pys getTextAttr(s2  & & & &  "   " &isc Cs|iidjodSn|iitjpt|i||\}}} }t|i||||d| |i_|p||ii_dS(Nisanchor(s_scanvasspreviewsstackstextssncardssNonesAssertionErrors getTextAttrsanchorstxstystastfs MfxCanvasTextsdxsdys text_format( s_sstacksanchorsdxsdys text_formatstxstystfsta((spysol.pys createText(s )cCs|ii||fdS(N(s_sregionssappendsstackssrects(s_sstackssrects((spysol.pys setRegion(scCs|i}|iio%|i|ii|iii_n|iio%|i|ii|iii_n|i|i dS(N( s_sgamessstalons defaultTextstextssncardsswastesdefaultStackGroupssdefaultRegions(s_sgame((spysol.pys defaultAll(s  % % cCsm|iidjotSn|tjp|i otSntt|iif|i}|i |_ |SdS(Ni( s_scanvasspreviewsNones layout_stacks text_argssapplys MfxCanvasTextsgamests text_format(s_s layout_stackst((spysol.pys defaultText(s cCs|i}g}|iitj o|iig}n|iig||i_|ii|ii ||i_ |ii |ii|ii |i_ |ii |i_ dS(N(s_sgameswastesssNonestalonssgs talonstackssrowssreservess dropstackss foundationss openstackss reservestacks(s_sgameswaste((spysol.pysdefaultStackGroups(s  &cCsx||iD]q}g}xK|dD]?}|i|if}|ii |}|i |ii |q!W|ii ||dq WdS(Nii(s_sregionssregionsstackssssxsysmapkeysgamesstackmapsidsappends allstackss setRegion(s_sregionsstackssssmapkeysid((spysol.pysdefaultRegions(s  i cCs|i} |i|if\}} |i|if\} }|i|if\} }|i i i } t |i i i t|i i i}|dd}|td||d|i}t|d|dd|d| }t|d|}| |f\}}x8t|D]*}|iii| ||| |qWx@t||D].}|iii| ||| ||qOW| || |f\}}|i|iidd||ddfx_t|D]Q}x>t| D]0}|iii| ||| |d|qW||}qW|d|}| ||||i_ }|odpt"n| || | |f|_#dS( Niiiiii?Bssuiti($s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssrowsshalfrowssmins playcardssYOFFSETshsmaxsxsysrangesisssappends setRegionssuits foundationsstalonstextssAssertionErrorssize(s_srowsstextss playcardssYMsYSssssuitsssuitsdeckssCHsXMsSsXSsCWsishshalfrowssysx((spysol.pysbakersDozenLayout(s< ("& (,*  .icCs|i}|i|if\}} |i|if\}}|i|if\}}|i i i } t |i i i t|i i i} |d| | } t|| }|||}| dd|d|i}||t|d|}|| ||d|f\}}x:t|D],}|iii|||||}qWxWt| D]I} x@t| D]2}||}|ii i|||d| qnWq[W||||d||f\}}x:t|D],}|iii|||||}qW|i!|iid||dddf|||f\}}||||i_"}|o(|i$|||| ddd d n||| ||f|_%dS( Niiissuitii?Bsanchorsswsformats%3d(&s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssreservesstoprowssmaxsrowssmaxrowssws playcardssYOFFSETshsxsysrangesisssappendssuits foundationss setRegionstalonstextsssetTextssize(s_srowssreservesstextss playcardssYMsmaxrowssYSssssuitsstoprowsssuitsdeckssCHsXMsSsXSsCWsishswsysx((spysol.pysfreeCellLayout(sB ("    *& *(iicCs|i} |i|if\}} |i|if\} }|i|if\}}|i i i } t |i i i t|i i i}| dd|d|i}|t||d|}| |f\}}x:t|D],}|iii| ||||}qW|i|iidd||ddfx_t|D]Q} x>t| D]0}|iii| ||||d| qYW||}qFW|| d|||f\}}|o||d}n| |||i_}|o(|i |||| ddd d n|oV||}| |||i_!}|o(|i || || dd d d q{n| || ||f|_"dS( Niiiii?Bssuitsanchorsswsformats%3dsse(#s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpss playcardssYOFFSETshsmaxsxsysrangesrowssisssappends setRegionssuits foundationsstextsstalonssetTextswastessize(s_srowsswastestextss playcardssYMsYSssssuitsssuitsdeckssCHsXMsSsXSsCWsishsysx((spysol.pys gypsyLayout)s@ ( *  ."( ,icCs|i} |i|if\}} |i|if\} }|i|if\}}|i i i } t |i i i t|i i i}t|||| |d||| d|d| }| |}||d|i}t|d|}|||| d|f\}}x:t|D],}|iii| ||||}q#W| ||f\}}|i|iiddd||dfxWt|D]I} x@t| D]2}|iii| ||d| ||}qWqW|oX|d|}| |||i_}|o&|i!||d||ddqLn||}| |||i_"}|o&|i!||d||ddn||||f|_#dS( Niiiii?Bssuitsanchorss($s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssmaxsrowsswastesws playcardssYOFFSETshsxsysrangesisssappends setRegionssuits foundationsstextsssetTextstalonssize(s_srowsswastestextss playcardssYMsYSssssuitsssuitsdeckssCHsXMsSsXSsCWsishswsysx((spysol.pys harpLayout5)sB (: " *  "* &icCs4|i}|i|if\}} |i|if\}}|i|if\}}|i i i } t |i i i t|i i i} | | }d||} t|| }d}| dd|d|i}t|d|}||f\}}||||i_}|op|p| p||djo,|i ||d||ddd}q|i |||ddd d n|oT||}||||i_}|o&|i ||d||ddqn||||}|o|dd|d|jo||||d}nxWt!| D]I} x@t!| D]2}|ii$i%|||d | ||}qRWq?W||||f\}}|i&|iid ||dd d fx:t!|D],}|iii%|||||}qW|||||||f|_'dS(Niiiisanchorsnisnwsformats%3dssuitii?B((s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssfrowsswastestoprowssmaxsrowssmaxrowssyextras playcardssYOFFSETshsxsyssstalonstextsscenterssetTextsrangessuitsis foundationssappends setRegionssize(s_srowsswastestextss playcardsscentersYMsmaxrowssYSssuitsstoprowsssuitsdeckssCHsXMsSsfrowssXSsCWsishsssysxsyextra((spysol.pysklondikeLayoutT)sP (  " $ *$  "* icCs|i} |i|if\}} |i|if\} }|i|if\} }|i i i } t |i i i t|i i i}| dd|d|i}|t|||}| |f\}}x:t|D],}|iii| |||| }qW|i|iidd||ddfx_t|D]Q}x>t| D]0}|iii| ||| |d|qUW||}qBW| ||f\}}| |||i_}|o(|i || || ddd d n| || | |f|_!dS( Niiiii?Bssuitsanchorsswsformats%3d("s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpss playcardssYOFFSETshsmaxsxsysrangesrowssisssappends setRegionssuits foundationsstalonstextsssetTextssize(s_srowsstextss playcardssYMsYSssssuitsssuitsdeckssCHsXMsSsXSsCWsishsysx((spysol.pys yukonLayout{)s2 ( *  .(cCs|i}|i|if\}}|i|if\}}|i|if\}} |i i i } t |i i i t|i i i} d| d| dj}d||} t|| }d}|dd|d|i}t|d| }||f\}}||||i_}|op|p| p||djo,|i ||d|| ddd}q|i |||dd d d n|oT||}||||i_}|o&|i ||d|| ddqn||||}|o|dd|d|jo||||d}n||f\}}xt#| D]} x@t#| D]2}|ii&i'|||d | ||}qrW| djo | djo ||| f\}}|}q_q_W||| || djf\}}|i(|iid ||dddfx:t#|D],}|iii'|||||}qAW||||| ||f|_)dS(Niiiiisanchorsnisnwsformats%3dssuitii?B(*s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssfrowsswastestoprowssmaxsrowssmaxrowssyextras playcardssYOFFSETshsxsyssstalonstextsscenterssetTextsx0sy0srangessuitsis foundationssappends setRegionssize(s_srowsswastestextss playcardsscentersYMsmaxrowssy0sYSssuitsstoprowsssuitsdeckssCHsXMsSsfrowssXSsx0sCWsishsssysxsyextra((spysol.pys easyLayout)sX ( " $ *$  "$* cCs|i}|i|if\}} |i|if\}}|i|if\}}|i i i } t |i i i t|i i i} d| |} d}| dd|d|i}t|d|}|| |d|}|}||||i_}|op|p| p| |djo,|i||d||ddd}qx|i|||ddd d n|oT||}||||i_}|o&|i||d||ddqn||f\}}d||f\}}}xt"d D]} xt"| D]}||||||f\}}|ii%i&|||d | || djo | d jo:||| | |f\}}d||f\}}}qqW|d}q W||| |f\}}|i'|ii||dd|||dfx:t"|D],}|iii&|||||}q*W|| |||||f|_(dS(Niiiisanchorsnisnwsformats%3di ssuitiii?B()s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssrowsstoprowssyextras playcardssYOFFSETshsmaxsxsyssstalonstextsswastescenterssetTextsdsx0sy0srangessuitsis foundationssappends setRegionssize(s_srowsswastestextss playcardsscentersYMsy0sYSssuitsstoprowsssuitsdeckssCHsXMsSsXSsx0sCWsdsishsssysxsyextra((spysol.pys samuriLayout)sT ( " $ *  "" 2 i cCsU|i}|i|if\}}|i|if\}}|i|if\}}|i i i } t |i i i t|i i i} |ddjptd} t|| }|||}|dd|d|i}t|d|}||f\}}xmt| D]_}x@tdD]2} |ii i!|||d| ||}q%W|||f\}}qW||| |d||| f\}}x:t|D],}|iii!|||||}qW|i"|ii||d|| |d|d|ddf|||| f\}}x>t|dD],}|iii!|||||}qIW||||| f\}}x>t|dD],}|iii!|||||}qW||f\}}||||i_#} |o(| i%||||d d d d n|| ||||f|_&dS( Niii iissuiti i?Bsanchorsswsformats%3d('s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssreservessAssertionErrorstoprowssmaxsrowssmaxrowssws playcardssYOFFSETshsxsysrangesissuitsss foundationssappends setRegionstalonstextsssetTextssize(s_srowssreservesstextss playcardsscentersYMsmaxrowssYSssssuitsstoprowsssuitsdeckssCHsXMsSsXSsCWsishswsysx((spysol.pys sumoLayout)sR (  "* B(cCs|i}|i|if\}} |i|if\}}|i|if\}}|i i i } t |i i i t|i i i} |ddjpt|| djpt| |d} |d| |}| dd|d|i}t|d|}||| |f\}}xmt| D]_}x@t| D]2} |iii |||d| ||}qBW|||f\}}q/W||f\}}x>t|dD],}|iii |||||}qW|||df\}}x>t|dD],}|iii |||||}qW|i!|iidd||d|ddf||| ||df\}}xst| D]e}x>t|| D],}|iii |||||}qW||||df\}}qW||f\}}||||i_"}|o(|i$|||| dd d d n||||f|_%dS( Niiiissuiti?Bisanchorsswsformats%3d(&s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssrowssAssertionErrorsreservesstoprowssws playcardssYOFFSETshsmaxsxsysrangesissuitsss foundationssappends setRegionstalonstextsssetTextssize(s_srowssreservesstextss playcardsscentersYMsYSssssuitsstoprowsssuitsdeckssCHsXMsSsXSsCWsishswsysx((spysol.pys funLayout *sX (  "2" "(cCs|i} |i|if\}} |i|if\} }|i|if\} }|i i i } |ddjpt | |d}| d|| | }| dd|d|i}t|d|}| |f\}}| |||i_}|o,|i||d||ddddn| | d|f\}}xBt|dD]0}|ii i| |||| | }qUW| | d||df\}}xBt|dD]0}|ii i| |||| | }qW|i|ii | | d d d f| |d|f\}}xst| D]e}x>t|| D],}|iii| ||||}qTW|| ||d f\}}q=W||||f|_dS( Niiiisanchorsnsformats%dii?Bi( s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdeckssrowssAssertionErrorstoprowssws playcardssYOFFSETshsmaxsxsyssstalonstextsssetTextsrangesisappends setRegionsreservesssize(s_srowssreservesstextss playcardsscentersYMsYSstoprowssdeckssCHsXMsSsXSsCWsishssswsysx((spysol.pys oonsooLayout2*sD ,"& "cCs|i} |i|if\}}|i|if\}}|i|if\}}|i i i }|ddjpt |ddjpt |d|d||df\} }||f\} } xgtdD]Y}|iii| | | d|| |} |djo| ||f\} } qqW|d|} x<t|dD]*}|ii i| | |||qQWx@t|dD].}|ii i| | |||dqW|i|ii ||d| ||d fx@t|dD].}|iii| ||||d qWxDt|dD]2}|iii| | ||||d qDW| | |d|||i_} |odpt n| |f|_dS( Niiii iissuitii?Bi(s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdeckssrowssAssertionErrorsreservesswshsxsysrangesisss foundationssappends setRegionstalonstextsssize(s_srowssreservesstextssYMsXMsishsCHsSssswsxsysXSsYSsCWsdecks((spysol.pys ghulamLayoutQ*sB & "  (,.,0%ic Cs|i} |i|if\}} |i|if\} }|i|if\}}|i i i } t |i i i t|i i i}|| d} ||dd}| |||d||f\}}||f|_| |f\}}| |||i_}|i|||| dddd| ||||i_}|i||||| dddd|||| d}x[t|dD]I}x@t| D]2}|ii i!| ||d|||}qWqW|||| d}||}xct|dD]Q}xHt| D]:}|ii i!| ||d||d||}q)WqW| |d|df\}}x:t|D],}|iii!| ||||}qW|i"|iid||d d fdS( Niisanchorsswsformats%3dssuitii?B(#s_s_Layout__createStacksSsCWsCHsXMsYMsXSsYSsgamesgameinfosdecksslenssuitssboolstrumpssfrowssrowssfspacesheightswshssizesxsyssstalonssetTextswastesrangessuitsis foundationssappends setRegion(s_srowsswastesheightsfspacesYMsYSssuitsssuitsdeckssCHsXMsSsfrowssXSsCWsishssswsysx((spysol.pysgeneriklonLayoutn*sH (&$( "  * (s__name__s __module__s__init__sNones_Layout__createStacks getTextAttrs createTexts setRegions defaultAlls defaultTextsdefaultStackGroupssdefaultRegionssbakersDozenLayoutsfreeCellLayouts gypsyLayouts harpLayoutsklondikeLayouts yukonLayouts easyLayouts samuriLayouts sumoLayouts funLayouts oonsooLayouts ghulamLayoutsgeneriklonLayout(((spysol.pysLayoutx(s,       '+)%'sKlondikecBsPtZeiZeZeZe Z e Z dddZ dddZdZRS(Niic Ksrt||if\}}t|ddddddddt|i|f||i|i d|i d|i |ii i |ii i |d |d ||_ |iio+t|iii |iii ||_nxB|iiD]4}|ii|i|i |i |d |iqWx9|iiD]+}|ii|i|i |i |q1W|i|SdS( Nsrowsiswasteistextss playcardsiis max_roundssnum_dealssuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsys max_roundssnum_dealswastes WasteStacks foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_s max_roundssnum_dealslayoutslsssr((spysol.pys createGame*s "! + 2 ) ic CsxUtdt|iiD]8}|iiid|ii|d|ddd|qW|i |iiid||ii o|iii ndS(Nisrowssflipsframesisreverse( srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSampleswastes dealCards(s_sflipsreversesi((spysol.pys startGame*s6  cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch*s(s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsWasteTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssKingAC_RowStacksRowStack_ClasssKlondikeType_Hints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pysKlondike*s s VegasKlondikecBs8tZeiZeiZddZdZdZRS(Nic CsKti|d|t|id|iddddtd|i_ dS(Ns max_roundsisanchorsswsfonts canvas_large( sKlondikes createGames_s max_roundss MfxCanvasTextscanvassheightsgetFontstextssscore(s_s max_rounds((spysol.pys createGame*scCs|idjodSn|iiidf\}}|io|i}ndo |ii od||f}nd||}|i i i d|dS(Niis Balance %d/%ds Balance $%dstext(s_spreviewsappsstatssgameid_balancesb1sb2sshallUpdateBalancesgetGameBalancesdebugststextssscoresconfig(s_sb2sb1st((spysol.pys updateText*s cCs |dSdS(Ni(stinfo(s_stinfo((spysol.pysgetDemoInfoTextAttr*s( s__name__s __module__sGamesgetGameScoreCasinos getGameScoresgetGameBalances createGames updateTextsgetDemoInfoTextAttr(((spysol.pys VegasKlondike*s     sCasinoKlondikecBstZdZRS(NcCsti|dddS(Ns max_roundsi(s VegasKlondikes createGames_(s_((spysol.pys createGame*s(s__name__s __module__s createGame(((spysol.pysCasinoKlondike*ssKlondikeByThreescBstZdZRS(NcCsti|dddS(Nsnum_deali(sKlondikes createGames_(s_((spysol.pys createGame*s(s__name__s __module__s createGame(((spysol.pysKlondikeByThrees*ssThumbAndPouch_RowStackcBstZdZRS(NcCs t||ii|iiSdS(N(sisAnySuitButOwnSequencescardss_scapsmodsdir(s_scards((spysol.pys _isSequence*s(s__name__s __module__s _isSequence(((spysol.pysThumbAndPouch_RowStack*ss ThumbAndPouchcBs tZeZdZdZRS(NcCsti|dddS(Ns max_roundsi(sKlondikes createGames_(s_((spysol.pys createGame*scCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch*s(s__name__s __module__sThumbAndPouch_RowStacksRowStack_Classs createGamesshallHighlightMatch(((spysol.pys ThumbAndPouch*s sWhitehead_RowStackcBstZdZRS(NcCs t||ii|iiSdS(N(sisSameColorSequencescardss_scapsmodsdir(s_scards((spysol.pys_isAcceptableSequence*s(s__name__s __module__s_isAcceptableSequence(((spysol.pysWhitehead_RowStack*ss WhiteheadcBs/tZeZeZdZdZdZRS(NcCsti|dddS(Ns max_roundsi(sKlondikes createGames_(s_((spysol.pys createGame*scCsti|dddS(Nsflipi(sKlondikes startGames_(s_((spysol.pys startGame*scCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch*s( s__name__s __module__sWhitehead_RowStacksRowStack_ClasssCautiousDefaultHints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pys Whitehead*s   s SmallHarpcBstZeiZdZRS(NcCs}xLtt|iiD]2}|iiid|ii| ddddqW|i|iii|iii dS(Nsrowssflipisframes( srangeslens_sssrowssistalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame*s 0 (s__name__s __module__sLayouts gypsyLayouts Layout_Methods startGame(((spysol.pys SmallHarp*s s EastcliffcBs tZeZdZdZRS(NcCsti|dddS(Ns max_roundsi(sKlondikes createGames_(s_((spysol.pys createGame*scCsrx0tdD]"}|iiiddddq W|i|iii|iio|iiindS(Nisflipisframes( srangesis_ssstalonsdealRowsstartDealSampleswastes dealCards(s_si((spysol.pys startGame*s    (s__name__s __module__s AC_RowStacksRowStack_Classs createGames startGame(((spysol.pys Eastcliff*s s EasthavencBstZeZdZRS(NcCsti|dddddS(Ns max_roundsiswastei(sKlondikes createGames_(s_((spysol.pys createGame*s(s__name__s __module__sDealRowTalonStacks Talon_Classs createGame(((spysol.pys Easthaven*ss WestcliffcBs#tZeeddZdZRS(Nsmax_moveicCsti|dddddS(Ns max_roundsisrowsi (sKlondikes createGames_(s_((spysol.pys createGame*s(s__name__s __module__s StackWrappersSS_FoundationStacksFoundation_Classs createGame(((spysol.pys Westcliff*ss WesthavencBstZeZdZRS(NcCs#ti|dddddddS(Ns max_roundsisrowsi swastei(sKlondikes createGames_(s_((spysol.pys createGame*s(s__name__s __module__sDealRowTalonStacks Talon_Classs createGame(((spysol.pys Westhaven*ssPasSeulcBstZdZdZRS(NcCsti|dddddS(Ns max_roundsisrowsi(sKlondikes createGames_(s_((spysol.pys createGame*scCs.|i|iii|iiidS(N(s_sstartDealSamplessstalonsdealRows dealCards(s_((spysol.pys startGame+s (s__name__s __module__s createGames startGame(((spysol.pysPasSeul*s s BlindAlleyscBs#tZdZdZdZRS(NcCsti|dddddS(Ns max_roundsisrowsi(sKlondikes createGames_(s_((spysol.pys createGame+scCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys+s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook+scCs3|iiid|iiddti|dS(Nsrowssframesi(s_ssstalonsdealRows foundationss Eastcliffs startGame(s_((spysol.pys startGame +s"(s__name__s __module__s createGames _shuffleHooks startGame(((spysol.pys BlindAlleys+s  sSomersetcBs8tZeZeeddZeZdZ dZ RS(Nsmax_moveic Cs)ti|dddddddddS(Ns max_roundsisrowsi swasteistexts(sKlondikes createGames_(s_((spysol.pys createGame+scCsx:tdD],}|iiid|ii|ddq W|i|iiid|iid|iiid|iiddS(Nisrowssframesii(srangesis_ssstalonsdealRowsrowssstartDealSample(s_si((spysol.pys startGame+s  *  ( s__name__s __module__sInitialDealTalonStacks Talon_Classs StackWrappers AC_RowStacksRowStack_ClasssCautiousDefaultHints Hint_Classs createGames startGame(((spysol.pysSomerset +s  sCanistercBs&tZeZeZdZdZRS(Nc Cs)ti|dddddddddS(Ns max_roundsisrowsiswasteistexts(sKlondikes createGames_(s_((spysol.pys createGame+scCsnx*tdD]}|iiiddq W|i|iii|iiid|iidd!dS(Nisframesisrowsii(srangesis_ssstalonsdealRowsstartDealSamplesrows(s_si((spysol.pys startGame+s   (s__name__s __module__sInitialDealTalonStacks Talon_Classs RK_RowStacksRowStack_Classs createGames startGame(((spysol.pysCanister+s s AgnesSorelcBs_tZeZeedddeddZeedddeZ dZ dZ dZ RS( Nsmodi s base_ranksmax_moveicCsti|dddddS(Ns max_roundsiswastei(sKlondikes createGames_(s_((spysol.pys createGame'+scCs)ti|dd|iii}dS(Nsflipi(sKlondikes startGames_ssstalonsdealSingleBaseCardsc(s_sc((spysol.pys startGame)+scCsJ|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch,+s( s__name__s __module__sDealRowTalonStacks Talon_Classs StackWrappersSS_FoundationStacksNO_RANKsFoundation_Classs SC_RowStacksRowStack_Classs createGames startGamesshallHighlightMatch(((spysol.pys AgnesSorel#+s   sEightTimesEightcBs)tZeiZeZdZdZRS(NcCsti|dddS(Nsrowsi(sKlondikes createGames_(s_((spysol.pys createGame2+scCs[x*tdD]}|iiiddq W|i|iii|iiidS(Nisframesi(srangesis_ssstalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame4+s   ( s__name__s __module__sLayouts gypsyLayouts Layout_Methods AC_RowStacksRowStack_Classs createGames startGame(((spysol.pysEightTimesEight/+s  s AchtmalAchtcBstZdZRS(NcCsqti|dddd}|i}|ii|i|iif\}}t |i ||dd|i i _ dS(Nsrowsis max_roundsisanchorsne(sKlondikes createGames_slssswastesxsXMsys MfxCanvasTextscanvasstalonstextssrounds(s_slsssysx((spysol.pys createGame;+s %(s__name__s __module__s createGame(((spysol.pys AchtmalAcht:+ssBatsford_ReserveStackcBstZdZRS(NcCs4ti||| odSn|ditjSdS(Ni(s ReserveStacks acceptsCardss_s from_stackscardssranksKING(s_s from_stackscards((spysol.pys acceptsCardsA+s(s__name__s __module__s acceptsCards(((spysol.pysBatsford_ReserveStack@+ssBatsfordcBstZdZRS(NcKsti|dddddd}|i}|i|i|if\}}|i i t |||dd|i |i d ||i||id fd d|i|i d d |idS(Nsrowsi s max_roundsis playcardsis max_cardsiii?Bspriorityisse(sKlondikes createGames_slsssXMsheightsYSsxsysreservessappendsBatsford_ReserveStacks setRegionsYMsXSs createTextsdefaultStackGroups(s_slayoutslsssysx((spysol.pys createGameF+s! "3(s__name__s __module__s createGame(((spysol.pysBatsfordE+ss StonewallcBsAtZeZeZdddddddfZdZdZRS(Niiic Csti|dddddd}|i}t|i|id|i}|i |i |i d|i |xtdD]q}xhtdD]Z}|i |d|i |i||if\}}|iit|||ddqWq|W|idS( Nsrowsis max_roundsistextsiis max_accept(sKlondikes createGames_slsssmaxsheightsYMsYSshssetSizeswidthsXMsXSsrangesisjsxsysreservessappends OpenStacksdefaultStackGroups(s_sxsishsjslsssy((spysol.pys createGameR+s!  %  2*cCsd}xN|iD]C}|djod}|iq|iiid|d|qW|iiid|iit |iii djpt dS(Niisflipsframessrows( sframess_sDEALsflipsstartDealSamplessstalonsdealRowsreservesslenscardssAssertionError(s_sframessflip((spysol.pys startGame\+s   ( s__name__s __module__sInitialDealTalonStacks Talon_Classs AC_RowStacksRowStack_ClasssDEALs createGames startGame(((spysol.pys StonewallN+s  s FlowerGardencBs;tZeeddZeZdddddddfZRS(Nsmax_moveii(s__name__s __module__s StackWrappers RK_RowStacksRowStack_ClasssCautiousDefaultHints Hint_ClasssDEAL(((spysol.pys FlowerGardenf+ss KingAlbertcBsPtZeZeeddZeZdZ ddddfZ dZ dZ RS(Nsmax_moveii ic Cs7ti|ddd|idddd}|i}t|it|if\}} t|i |i | |i }|i|id|i||i|xt| D]x}xot|i|D]Z}|i|||i|i ||i f\}}|iit|||ddqWqW|idS( Ns max_roundsisrowsswasteistextsis max_accept(sKlondikes createGames_sROWSslsssmaxsRESERVESslensrwsrhsheightsYMsYSshssetSizeswidthsXMsXSsrangesisjsxsysreservessappends OpenStacksdefaultStackGroups( s_sxsrwsisjslssshsysrh((spysol.pys createGamep+s* $ ) 2*cCs9ti|dddd|iiid|iidS(Nsflipisreverseisrows(sKlondikes startGames_ssstalonsdealRowsreserves(s_((spysol.pys startGame{+s( s__name__s __module__sInitialDealTalonStacks Talon_Classs StackWrappers AC_RowStacksRowStack_ClasssCautiousDefaultHints Hint_ClasssROWSsRESERVESs createGames startGame(((spysol.pys KingAlbertj+s sRaglancBs)tZdddfZdZdZRS(NicCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys+s(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHook+scCsx:tdD],}|iiid|ii|ddq W|i|iiid|iid|iiid|ii|iiid|ii dS(Nisrowssframesi( srangesis_ssstalonsdealRowsrowssstartDealSamplesreservess foundations(s_si((spysol.pys startGame+s *  (s__name__s __module__sRESERVESs _shuffleHooks startGame(((spysol.pysRaglan~+s sBrigadecBsDtZeeddZdZddddfZdZdZRS(Nsmax_moveiiicCsx*tdD]}|iiiddq W|i|iii|iiid|ii|iiid|iidS(Nisframesisrows( srangesis_ssstalonsdealRowsstartDealSamplesreservess foundations(s_si((spysol.pys startGame+s  cCs/|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch+s( s__name__s __module__s StackWrappers RK_RowStacksRowStack_ClasssROWSsRESERVESs startGamesshallHighlightMatch(((spysol.pysBrigade+s  s Jane_TaloncBs&tZdZdZddZRS(NcCsdSdS(Ni((s_((spysol.pys canFlipCard+scCst|idjSdS(Ni(slens_scards(s_((spysol.pys canDealCards+sicCsd}t|idjo"|i|iiid|}nt|idjoY|ii ||ii d||iii dddd|ii ||d}n|SdS(Niissoundisframesisshadow( scslens_scardssdealRowsgamesssreservesssoundsflipMovesmoveMoveswaste(s_ssoundsc((spysol.pys dealCards+s"+(s__name__s __module__s canFlipCards canDealCardss dealCards(((spysol.pys Jane_Talon+s  sJanecBswtZeZeedddeddZeedddeZ dddZ ddd Z d Z dd Z RS( Nsmodi s base_ranks min_cardsiic Kst|ddtti||f|}|i}t |i |i d|i }|i|i|id|i||id|i|i f\} } xt|D]q}| |dd@|i}t|| |dd} |i d| _d| _|ii| | |i d} qW|i|iii|i |i|i |i f\}} t!|i"|| dd d t#d d |i$|i%_&dS( Nstextsiiiis max_acceptisanchorsswsfonts canvas_cardscardw('s kwdefaultslayoutsapplysKlondikes createGames_s max_roundsslsssmaxsheightsYMsYSshssetSizeswidthsXMsXSsx0sysrangesreservessisxs OpenStacksstacks CARD_YOFFSETsis_opensappendsdefaultStackGroupsssgs dropstacksstalons MfxCanvasTextscanvassgetFontsCWstextssinfo( s_s max_roundssreservesslayoutsxsishslsssysx0sstack((spysol.pys createGame+s&  %#   ic Cs xUtdt|iiD]8}|iiid|ii|d|ddd|qW|i |iiid||iiid|ii |iii }td|idd}xC|iiD]5}|ii|i|iii|i|fqWdS( Nisrowssflipsframesisreverses base_ranki (srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSamplesreservessdealSingleBaseCardscsStructsrankscapsupdates__dict__ssaveinfos stack_capssappendsid(s_sflipsreversescsissscap((spysol.pys startGame+s6  cCsJ|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch+scCsdSdS(Ni((s_ssound((spysol.pys _autoDeal+s(s__name__s __module__s Jane_Talons Talon_Classs StackWrappersSS_FoundationStacksNO_RANKsFoundation_Classs AC_RowStacksRowStack_Classs createGames startGamesshallHighlightMatchs _autoDeal(((spysol.pysJane+s sAgnesBernauer_TaloncBstZddZRS(NicCs |i|iiid|SdS(Nssound(s_s dealRowAvailsgamesssreservesssound(s_ssound((spysol.pys dealCards+s(s__name__s __module__s dealCards(((spysol.pysAgnesBernauer_Talon+ss AgnesBernauercBs>tZeZeedddeddZdZdZ RS(Nsmodi s base_ranksmax_moveicCs#ti|dddddddS(Ns max_roundsiswasteistexts(sJanes createGames_(s_((spysol.pys createGame+scCsti|dddS(Nsflipi(sJanes startGames_(s_((spysol.pys startGame+s( s__name__s __module__sAgnesBernauer_Talons Talon_Classs StackWrappersSS_FoundationStacksNO_RANKsFoundation_Classs createGames startGame(((spysol.pys AgnesBernauer+s i=sCasino KlondikeisVegas KlondikeisKlondike by Threesi:sThumb and PouchiCi's Small HarpiBii!iiksPas SeuliQs Blind Alleysiiis Agnes Sorels8 x 8is Achtmal Achtiiis Flower Gardenis King AlbertiiiisAgnes BernauersGypsycBsDtZeiZeZeZe Z e Z dZ dZdZRS(NcKs\t||if\}}t|ddddddt|i|f||i|i d|i d|i |ii i |ii i ||_ |iio+t|iii |iii ||_nxB|iiD]4}|ii|i|i |i |d|iqWx9|iiD]+}|ii|i|i |i |qW|idS(Nsrowsiswasteistextsissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsyswastes WasteStacks foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_slayoutslsssr((spysol.pys createGame,s* + 2 )cCsQx0tdD]"}|iiiddddq W|i|iiidS(Nisflipisframes(srangesis_ssstalonsdealRowsstartDealSample(s_si((spysol.pys startGame,s    cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch",s(s__name__s __module__sLayouts gypsyLayouts Layout_MethodsDealRowTalonStacks Talon_ClasssSS_FoundationStacksFoundation_Classs AC_RowStacksRowStack_ClasssKlondikeType_Hints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pysGypsy ,s  sGiant_FoundationcBstZdZRS(NcCs<ti|| odSnt|iiiidjSdS(Ni(sSS_FoundationStacks canMoveCardss_scardsslensgamessstalon(s_scards((spysol.pys canMoveCards&,s(s__name__s __module__s canMoveCards(((spysol.pysGiant_Foundation%,ssGiantcBstZeZdZRS(NcCs|i|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_((spysol.pys startGame,,s (s__name__s __module__sGiant_FoundationsFoundation_Classs startGame(((spysol.pysGiant*,ss Irmgard_TaloncBstZddZRS(NicCsk|ioYt|idjo|id|}n&|i|iiidd!d|}|SndSdS(Nissoundiii( s_scardsslensdealRowssoundscsgamesssrows(s_ssoundsc((spysol.pys dealCards0,s  %(s__name__s __module__s dealCards(((spysol.pys Irmgard_Talon/,ssIrmgardcBs5tZdZeiZeZeZ dZ dZ RS(NicCsti|dddddS(Nsrowsi s playcardsi(sGypsys createGames_(s_((spysol.pys createGame=,scCsw|ii}xJtddD]9}|iiid||t||!ddddqW|i |iiidS(Niisrowssflipisframes( s_sssrowssrsrangesistalonsdealRowslensstartDealSample(s_sisr((spysol.pys startGame?,s  7 ( s__name__s __module__s GAME_VERSIONsLayouts harpLayouts Layout_Methods Irmgard_Talons Talon_ClasssKingAC_RowStacksRowStack_Classs createGames startGame(((spysol.pysIrmgard8,s   sDieKoenigsbergerin_TaloncBstZeiZRS(N(s__name__s __module__sDealRowTalonStacksdealToStacksOrFoundationss dealToStacks(((spysol.pysDieKoenigsbergerin_TalonE,ssDieKoenigsbergerincBs)tZeZeeddZdZRS(Nsmax_moveicCs5|ix$tdD]}|iiiqWdS(Ni(s_sstartDealSamplesrangesissstalonsdealRow(s_si((spysol.pys startGameJ,s  (s__name__s __module__sDieKoenigsbergerin_Talons Talon_Classs StackWrappersSS_FoundationStacksFoundation_Classs startGame(((spysol.pysDieKoenigsbergerinG,ssDieRussische_FoundationcBstZdZRS(NcCsti||| odSn|io[|idi}|tjo d}n||ii|ii |dijodSqndSdS(Niiii( sAbstractFoundationStacks acceptsCardss_s from_stackscardssranksACEscapsdirsmod(s_s from_stackscardssrank((spysol.pys acceptsCardsO,s   ( (s__name__s __module__s acceptsCards(((spysol.pysDieRussische_FoundationN,ssDieRussische_RowStackcBstZdZRS(NcCs=ti||| odSn|ipt|djSdS(Nii(s AC_RowStacks acceptsCardss_s from_stackscardsslen(s_s from_stackscards((spysol.pys acceptsCardsZ,s(s__name__s __module__s acceptsCards(((spysol.pysDieRussische_RowStackY,ss DieRussischecBsAtZeZeeddZeZdZ dZ dZ RS(Ns min_cardsicCsti|dddddS(Nsrowsistextsi(sGypsys createGames_(s_((spysol.pys createGameb,scCs|i|ddSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pyse,si(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHookd,scCsx*tdD]}|iiiddq W|ix$tdD]}|iiiqDW|iiid}|iiid|ii |i dfdS(Nisframesiiisrowsi( srangesis_ssstalonsdealRowsstartDealSamplescardsscs foundationsssuit(s_sisc((spysol.pys startGamef,s   ( s__name__s __module__sInitialDealTalonStacks Talon_Classs StackWrappersDieRussische_FoundationsFoundation_ClasssDieRussische_RowStacksRowStack_Classs createGames _shuffleHooks startGame(((spysol.pys DieRussische^,s   sMissMilligan_ReserveStackcBstZdZdZRS(NcCsUti||| odSnt|idjot|iiiidjSdS(Ni( s AC_RowStacks acceptsCardss_s from_stackscardsslensgamessstalon(s_s from_stackscards((spysol.pys acceptsCardso,scCs|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImages,s(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysMissMilligan_ReserveStackn,s s MissMilligancBs>tZeeddZeZeZdddZ dZ RS(Nsmax_moveiiic CsXt||if\}}|i|idtd||i|i dtd||i |i|i f\} }|i| |||_xJtdD]<}| |i} |ii|i| ||d|dqW|i||i f\} }| |i|id||i df\}}x@t|D]2}|i i|i| ||||i }q6W|i o'|i|i d||ddfn|i|idd}|id||id|i |i f\} }x@t|D]2}| |i} |ii|i| ||qW|i|i||ddf|idS( Niiissuitiii?Bsss(sLayouts_ssslssetSizesXMsmaxsrowssXSsYMsreservessYSsxsys Talon_Classstalonsrangesis foundationssappendsFoundation_ClasssrxsrysReserveStack_Classs setRegions createTextsRowStack_ClasssdefaultStackGroups( s_srowssreservessisrxslsrysssysx((spysol.pys createGamey,s2F  -/  '2  #cCs|i|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_((spysol.pys startGame,s ( s__name__s __module__s StackWrappersSS_FoundationStacksFoundation_ClasssKingAC_RowStacksRowStack_ClasssMissMilligan_ReserveStacksReserveStack_Classs createGames startGame(((spysol.pys MissMilliganu,s sNomadcBs#tZeZeZeZdZRS(NcCsKx*tdD]}|iiiddq W|i|iiidS(Nisframesi(srangesis_ssstalonsdealRowsstartDealSample(s_si((spysol.pys startGame,s   ( s__name__s __module__sSS_FoundationStacksFoundation_Classs AC_RowStacksRowStack_Classs ReserveStacksReserveStack_Classs startGame(((spysol.pysNomad,ss MilliganCellcBs tZeZdZdZRS(NcCsti|dddS(Nsreservesi(s MissMilligans createGames_(s_((spysol.pys createGame,scCs|i|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_((spysol.pys startGame,s (s__name__s __module__s ReserveStacksReserveStack_Classs createGames startGame(((spysol.pys MilliganCell,s s MilliganHarpcBs&tZeeddZddZRS(Nsmax_moveicCsqxPtt|iiD]6}|iiid|ii|dd|ddqW|i |iiidS(Nsrowsisflipsframesi( srangeslens_sssrowssistalonsdealRowsflipsstartDealSample(s_sflipsi((spysol.pys startGame,s 4 (s__name__s __module__s StackWrappersSS_FoundationStacksFoundation_Classs startGame(((spysol.pys MilliganHarp,ssCarltoncBstZdZRS(NcCsti|dddS(Nsflipi(s MilliganHarps startGames_(s_((spysol.pys startGame,s(s__name__s __module__s startGame(((spysol.pysCarlton,ss LexingtonHarpcBstZdZeZeZRS(Ni(s__name__s __module__s GAME_VERSIONsYukon_AC_RowStacksRowStack_ClasssYukonType_Hints Hint_Class(((spysol.pys LexingtonHarp,ss BrunswickcBstZdZRS(NcCsti|dddS(Nsflipi(s LexingtonHarps startGames_(s_((spysol.pys startGame,s(s__name__s __module__s startGame(((spysol.pys Brunswick,ss MississippicBstZdZRS(NcCsti|dddS(Nsrowsi(s LexingtonHarps createGames_(s_((spysol.pys createGame,s(s__name__s __module__s createGame(((spysol.pys Mississippi,ssGriffoncBstZdZRS(NcCsti|dddS(Nsflipi(s Mississippis startGames_(s_((spysol.pys startGame,s(s__name__s __module__s startGame(((spysol.pysGriffon,ssBlockadecBs2tZeiZeZdZdZdZ RS(NcCsti|dddS(Nsrowsi (sGypsys createGames_(s_((spysol.pys createGame,scCs|i|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_((spysol.pys startGame,s cCs{||iijo|i o |iiioI|i|i}|iii |iii d||i |ndS(Ni( sstacks_sssrowsscardsstalons enterStatesS_FILLs old_statesflipMovesmoveMoves leaveState(s_sstacks old_state((spysol.pys fillStack,s .( s__name__s __module__sLayoutsklondikeLayouts Layout_Methods SS_RowStacksRowStack_Classs createGames startGames fillStack(((spysol.pysBlockade,s    iAiwsDie Knigsbergerinis Die Russischesranksiii>s Miss MilliganiiNs Milligan Cellis Milligan HarpiiDsLexington HarpiisFortyThieves_HintcBstZRS(N(s__name__s __module__(((spysol.pysFortyThieves_Hint,ss FortyThievescBsntZeZeZeZdZdZ ddfZ dZ dddddddZ dZ d Zd ZRS( Niiii i i@c Csddf|dj} t|d| d|dd|if\}}|ii} t |d| d}||i |id|i f\} }|||i| jot| |||_nt d|i|i|d|i} |i| |i|i| |i|i|i|d| |i d}|i}xWtd| D]E} |ii|i|||d | | d |i||i }qNW|i|||i d}|i|i}xIt|D];} |ii|i|||d |i ||i }qW|i!|i }|i"|i|i}t#|||d |d ||_&|i'|i&d |djo:t(|i)||i*d||idd |i&i+_,n||i }t-||||_.|i |i._/|i'|i.d |i0dS(Ni isXMsXOFFSETsYBOTTOMiiissuitsmax_moves max_roundssnum_dealsssanchor(1srowssXMsLayouts_sXOFFSETssslsgameinfosdeckssmaxsmaxrowssXSsw1sw2sXCARDSsintsYSs playcardssYOFFSETshssetSizesYMsYBOTTOMsxsysrangesis foundationssappendsFoundation_ClasssFOUNDATION_MAX_MOVEsRowStack_Classs ROW_MAX_MOVEswidthsheightsWasteTalonStacks max_roundssnum_dealstalons createTexts MfxCanvasTextscanvassCWstextssroundss WasteStackswastes CARD_XOFFSETsdefaultStackGroups(s_s max_roundssnum_dealsrowss playcardssXCARDSsXOFFSETsmaxrowssw2sw1sdeckssXMsishslsssysx((spysol.pys createGame,sB- '(,  2 (!  1 cCsx7t|idD]"}|iiiddddqWx5t|iddD]}|iiiddqRW|i|iii|iiidS(Nisflipsframesi( sranges_sDEALsissstalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame-s  cCs|io||iijo|i o|i|i}|ii io|ii i d|n>|ii i o*|ii i |ii i d|n|i|ndS(Ni(s_sFILL_EMPTY_ROWSsstacksssrowsscardss enterStatesS_FILLs old_stateswastesmoveMovestalons canDealCardss dealCardss leaveState(s_sstacks old_state((spysol.pys fillStack-s(cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch-s(s__name__s __module__sSS_FoundationStacksFoundation_Classs SS_RowStacksRowStack_ClasssFortyThieves_Hints Hint_ClasssFOUNDATION_MAX_MOVEs ROW_MAX_MOVEsDEALsFILL_EMPTY_ROWSs createGames startGames fillStacksshallHighlightMatch(((spysol.pys FortyThieves,s   sBusyAcescBstZddfZdZRS(NiicCsti|dddS(Nsrowsi (s FortyThievess createGames_(s_((spysol.pys createGame$-s(s__name__s __module__sDEALs createGame(((spysol.pysBusyAces"-s sLimitedcBstZddfZRS(Nii(s__name__s __module__sDEAL(((spysol.pysLimited&-ss CourtyardcBstZdZdZRS(Ni?Bi(s__name__s __module__s ROW_MAX_MOVEsFILL_EMPTY_ROWS(((spysol.pys Courtyard(-ss WaningMooncBstZdZRS(NcCsti|dddS(Nsrowsi (s FortyThievess createGames_(s_((spysol.pys createGame,-s(s__name__s __module__s createGame(((spysol.pys WaningMoon+-ssLucascBstZdZRS(Ni?B(s__name__s __module__s ROW_MAX_MOVE(((spysol.pysLucas.-ssDeucescBsPtZeeddddZeeddZddfZdZdZ RS(Nsmodi s base_rankiicCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys5-s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook4-scCs7|i|iiid|iiti|dS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss FortyThievess startGame(s_((spysol.pys startGame6-s ( s__name__s __module__s StackWrappersSS_FoundationStacksFoundation_Classs SS_RowStacksRowStack_ClasssDEALs _shuffleHooks startGame(((spysol.pysDeuces0-s   sCoronacBs)tZdZddfZdZdZRS(NiiicCsti|dddS(Nsrowsi (s FortyThievess createGames_(s_((spysol.pys createGame>-s(s__name__s __module__sFOUNDATION_MAX_MOVEsDEALsFILL_EMPTY_ROWSs createGame(((spysol.pysCorona:-s s QuadranglecBs;tZeedddeZeeddZdZRS(Nsmodi s base_rankcCs!ti||iiidS(N(s FortyThievess startGames_ssstalonsdealSingleBaseCard(s_((spysol.pys startGameC-s ( s__name__s __module__s StackWrappersSS_FoundationStacksNO_RANKsFoundation_Classs SS_RowStacksRowStack_Classs startGame(((spysol.pys Quadrangle@-ss FortyAndEightcBstZdZRS(Nc Cs)ti|dddddddddS(Ns max_roundsisrowsisXCARDSiHsXOFFSET(s FortyThievess createGames_(s_((spysol.pys createGameG-s(s__name__s __module__s createGame(((spysol.pys FortyAndEightF-ss LittleFortycBs#tZeZdZdZdZRS(Ni?BicCs#ti|dddddddS(Ns max_roundsisnum_dealisXOFFSETi(s FortyThievess createGames_(s_((spysol.pys createGameM-s(s__name__s __module__sSpider_SS_RowStacksRowStack_Classs ROW_MAX_MOVEsFILL_EMPTY_ROWSs createGame(((spysol.pys LittleFortyI-ssStreetscBstZeZdZRS(NcCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchQ-s(s__name__s __module__s AC_RowStacksRowStack_ClasssshallHighlightMatch(((spysol.pysStreetsO-ssMariacBstZdZRS(NcCsti|dddS(Nsrowsi (sStreetss createGames_(s_((spysol.pys createGameU-s(s__name__s __module__s createGame(((spysol.pysMariaT-ss NumberTencBstZdZddfZRS(Ni?Bi(s__name__s __module__s ROW_MAX_MOVEsDEAL(((spysol.pys NumberTenW-ss RankAndFilecBstZdZddfZRS(Ni?Bii(s__name__s __module__s ROW_MAX_MOVEsDEAL(((spysol.pys RankAndFileZ-ss TripleLinecBs5tZdZdZdZddfZdZdZRS(Niii?BiicCsti|dddddS(Ns max_roundsisrowsi (sStreetss createGames_(s_((spysol.pys createGamec-s(s__name__s __module__s GAME_VERSIONsFOUNDATION_MAX_MOVEs ROW_MAX_MOVEsDEALsFILL_EMPTY_ROWSs createGame(((spysol.pys TripleLine]-s  s RedAndBlackcBs;tZeZdZddfZdZdZdZRS(Ni?BiicCsti|dddS(Nsrowsi(s FortyThievess createGames_(s_((spysol.pys createGamei-scCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pysl-s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHookk-scCs7|i|iiid|iiti|dS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationssStreetss startGame(s_((spysol.pys startGamem-s ( s__name__s __module__sAC_FoundationStacksFoundation_Classs ROW_MAX_MOVEsDEALs createGames _shuffleHooks startGame(((spysol.pys RedAndBlacke-s    sZebracBs#tZdZdZdZdZRS(NiicCs#ti|dddddddS(Ns max_roundsisrowsisXOFFSETi(s FortyThievess createGames_(s_((spysol.pys createGameu-s(s__name__s __module__sFOUNDATION_MAX_MOVEs ROW_MAX_MOVEsFILL_EMPTY_ROWSs createGame(((spysol.pysZebraq-ssIndian_RowStackcBstZdZRS(NcCs t||ii|iiSdS(N(sisAnySuitButOwnSequencescardss_scapsmodsdir(s_scards((spysol.pys _isSequencex-s(s__name__s __module__s _isSequence(((spysol.pysIndian_RowStackw-ssIndiancBs,tZeZddfZdZdZRS(NiicCsti|dddddS(NsXCARDSiJsXOFFSETi(s FortyThievess createGames_(s_((spysol.pys createGame}-scCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch-s(s__name__s __module__sIndian_RowStacksRowStack_ClasssDEALs createGamesshallHighlightMatch(((spysol.pysIndianz-s  s MidshipmancBstZddfZdZRS(NicCsti|dddS(Nsrowsi (s FortyThievess createGames_(s_((spysol.pys createGame-s(s__name__s __module__sDEALs createGame(((spysol.pys Midshipman-s sNapoleonsExilecBs#tZeZddfZdZRS(NiicCs/|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch-s(s__name__s __module__s RK_RowStacksRowStack_ClasssDEALsshallHighlightMatch(((spysol.pysNapoleonsExile-s s DoubleRailcBs#tZdZddfZdZRS(Ni?BiicCsti|dddS(Nsrowsi(s FortyThievess createGames_(s_((spysol.pys createGame-s(s__name__s __module__s ROW_MAX_MOVEsDEALs createGame(((spysol.pys DoubleRail-s s SingleRailcBstZdZRS(NcCsti|dddddS(NsrowsisXCARDSi0(s FortyThievess createGames_(s_((spysol.pys createGame-s(s__name__s __module__s createGame(((spysol.pys SingleRail-si s Forty ThievessaltnamessNapoleon at St.Helenas Le CadraniPs Busy AcesiiOs Waning Mooni}imiiinisForty and Eightiss Little FortyiLiIiFs Number TeniGs Rank and FilesEmperori~s Red and BlackiqiEiJis Double Railis Single RailsDiplomatcBs\tZeZeZeZdZdZ ddfZ dZ dZ dZ dZdZRS(Niiic Cst||if\}}|i|id|i|id|i|i|if\}}xSt dD]E}|i i|i|||d|dd|i||i}qlW|i||if\}}xIt dD];}|ii|i|||d|i||i}qW|i|i|if\}}t|||dd|_|i|id||i}t||||_|i|id|idS( Niissuitismax_moves max_roundsisnn(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsFoundation_ClasssFOUNDATION_MAX_MOVEsrowssRowStack_Classs ROW_MAX_MOVEsheightsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_sislsssysx((spysol.pys createGame-s*, "  cCsx1t|idD]}|iiiddqW|ix+t|idD]}|iiiqRW|iiidS(Nisframesi( sranges_sDEALsissstalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame-s cCs|io||iijo|i o|i|i}|ii io|ii i d|n>|ii i o*|ii i |ii i d|n|i|ndS(Ni(s_sFILL_EMPTY_ROWSsstacksssrowsscardss enterStatesS_FILLs old_stateswastesmoveMovestalons canDealCardss dealCardss leaveState(s_sstacks old_state((spysol.pys fillStack-s(cCs/|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch-s(s__name__s __module__sSS_FoundationStacksFoundation_Classs RK_RowStacksRowStack_ClasssFortyThieves_Hints Hint_ClasssFOUNDATION_MAX_MOVEs ROW_MAX_MOVEsDEALsFILL_EMPTY_ROWSs createGames startGames fillStacksshallHighlightMatch(((spysol.pysDiplomat-s    sLadyPalkcBstZdZRS(Ni?B(s__name__s __module__s ROW_MAX_MOVE(((spysol.pysLadyPalk-ssCongresscBs#tZddfZdZdZRS(Niic Cst||if\}}|i|id|i|id|ixt dD]}}xtt dD]f}|id||i|i||if\}}|ii|i|||d|d|iqgWqTWxt dD]}xt dD]s}|idd||i|i||if\}}|i|||d|i}d|_|ii|qWqW|i|if\}}t|||dd |_|i|id ||i}t||||_|i|id |idS( Niiissuitsmax_moveiis max_roundsisss(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsys foundationssappendsFoundation_ClasssFOUNDATION_MAX_MOVEsRowStack_Classs ROW_MAX_MOVEsstacks CARD_YOFFSETsrowssWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_sisjssslsysxsstack((spysol.pys createGame-s0,  2  6  (s__name__s __module__sDEALsFILL_EMPTY_ROWSs createGame(((spysol.pysCongress-s iis Lady PalkisDoubleKlondikecBs>tZeiZeZeZdddZ dZ dZ RS(Niic Kst||if\}}t|ddddddddt|i|f||i|i d|i dt |ii i |ii i |d |d ||_ t|iii |iii ||_x?|iiD]1} |iit| i | i |d | iqWx9|iiD]+} |ii|i| i | i |qW|i|djo|i iitjpt|i|i d \}}} }|i#do|d |i$}nt%|i&||d| |i i_n|SdS(Nsrowsi swasteistextss playcardsiis max_roundssnum_dealssuitsnnisanchor('sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizesWasteTalonStackstalonsxsys max_roundssnum_deals WasteStackswastes foundationssrsappendsSS_FoundationStackssuitsrowssRowStack_Classs defaultAllstextssroundssNonesAssertionErrors getTextAttrstxstystastfsgetsYMs MfxCanvasTextscanvas( s_s max_roundssnum_dealslayoutstxstyslstfsssrsta((spysol.pys createGame.s*"' / )  !(cCsxPtt|iiD]6}|iiid|ii|dddddqW|i|iii|iii dS(Nsrowsisflipisframes( srangeslens_sssrowssistalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame%.s 4 cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch+.s( s__name__s __module__sLayouts harpLayouts Layout_MethodsKingAC_RowStacksRowStack_ClasssKlondikeType_Hints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pysDoubleKlondike .s   sDoubleKlondikeByThreescBstZdZRS(NcCsti|dddS(Nsnum_deali(sDoubleKlondikes createGames_(s_((spysol.pys createGame/.s(s__name__s __module__s createGame(((spysol.pysDoubleKlondikeByThrees..ss GargantuacBstZdZRS(NcCsti|dddS(Ns max_roundsi(sDoubleKlondikes createGames_(s_((spysol.pys createGame2.s(s__name__s __module__s createGame(((spysol.pys Gargantua1.ssBigHarpcBs tZeZdZdZRS(NcCsti|dddddS(Ns max_roundsisrowsi (sDoubleKlondikes createGames_(s_((spysol.pys createGame6.scCs}xLtt|iiD]2}|iiid|ii| ddddqW|i|iii|iii dS(Nsrowssflipisframes( srangeslens_sssrowssistalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame8.s 0 (s__name__s __module__s AC_RowStacksRowStack_Classs createGames startGame(((spysol.pysBigHarp4.s sStepscBstZeZdZRS(NcCsti|dddddS(Ns max_roundsisrowsi(sDoubleKlondikes createGames_(s_((spysol.pys createGame@.s(s__name__s __module__s AC_RowStacksRowStack_Classs createGame(((spysol.pysSteps>.sisDouble KlondikeisDouble Klondike by ThreesiisBig Harpi3sPictureGallery_HintcBstZdZRS(Nc Cs=|i}x|iiD]}|i|ii\} }| o |djo|i }| |j o|pt |i tjpt ||iijodd|ii}nd}|d|i|i }|i|d|| qqW|i ox|iiD] }|i}| pt|djoqn||iijoN|i|d|id }|it|oqndd|ii}nd}xk|iiD]]} | |j o| i||o7|d|i|di }|i|d|| PqqWqWn|i ox|iiD]}|i}| pt|djoq1n|i|d|id }|it|oq1nxk|iiD]]} | |j o| i||o7d d|i|di }|i|d|| PqqWq1Wn|i ox|iiD]}|i}| p,t|djpt|t|ijoq)nd }xk|iiD]]} | |j o| i||o7|d|i|di }|i|d|| PqqWq)Wn|i d jo4|i!o#|i|i"d|ii#tq9ndS( Nii_iids stackcardsii8iipi`i($s_sgamessgs dropstackssrs canDropCardssss foundationsstsnsgetCardscsAssertionErrorsranksACEstableauxscaps base_ranks base_scoresKsscoresaddHintshintssgetPilespileslens ClonedStackscardssrrs acceptsCardssNonesrowsslevels canDealCardss SCORE_DEALstalon( s_scsscoresrrs base_scoresnsgamesrspilest((spysol.pys computeHintsM.s|                7   (s__name__s __module__s computeHints(((spysol.pysPictureGallery_HintL.ssPictureGallery_FoundationcBstZdZdZRS(Nc CsTti||||dtddddddtd|iii i d|_ dS( Ns base_ranksdirismax_moves max_cardsiii ( sRK_FoundationStacks__init__s_sxsysgamesACEsminsappsimagess CARD_YOFFSET(s_sxsysgame((spysol.pys__init__.s.cCs|iiiitSdS(N(s_sgamesappsimagess getLettersACE(s_((spysol.pysgetBottomImage.s(s__name__s __module__s__init__sgetBottomImage(((spysol.pysPictureGallery_Foundation.s sPictureGallery_TableauStackcBs#tZdZdZdZRS(Nc Cs5ti||||d|dddd||_dS(Ns base_ranksdiris max_accepti( s SS_RowStacks__init__s_sxsysgames base_ranksyoffsets CARD_YOFFSET(s_sxsysgames base_ranksyoffset((spysol.pys__init__.s(cCsVti||| odSn|io|idi|iijodSndSdS(Nii(s SS_RowStacks acceptsCardss_s from_stackscardssrankscaps base_rank(s_s from_stackscards((spysol.pys acceptsCards.s 'cCs |iiii|iiSdS(N(s_sgamesappsimagess getLetterscaps base_rank(s_((spysol.pysgetBottomImage.s(s__name__s __module__s__init__s acceptsCardssgetBottomImage(((spysol.pysPictureGallery_TableauStack.s  sPictureGallery_RowStackcBstZdZdZRS(NcCsLti||| odSn|ip|iiiiodSndSdS(Nii(s BasicRowStacks acceptsCardss_s from_stackscardssgamessstalon(s_s from_stackscards((spysol.pys acceptsCards.s cCs|iiiiSdS(N(s_sgamesappsimagessgetTalonBottom(s_((spysol.pysgetBottomImage.s(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysPictureGallery_RowStack.s sPictureGallerycBsDtZeZdZdZdZdZdZdZ RS(Nc Cst||if\}}tdtd|id}|id|}dd|i|i dd}|i d|i |i|id||i||idg|id|i |i d} |i|i d}|iit| |||i}xsdddfD]b}|i} xFtdD]8}|iit| |||d|| |i } q3W||}qW|i||if\} }xCtdD]5}|iit| ||d d| |i } qW|id|i |i d} |i|i}t| |||_|i |id |i!|i| |i"dd d ||i f|i|i|i|i#_$|ig|i#_%|i|i|i#_&dS( Ni ii iistableauxisyoffsets max_acceptsseii?B('sLayouts_ssslsminsmaxsYOFFSETsTABLEAU_YOFFSETsYSsthsCHshssetSizesXSsXMsYMsaddattrsxsys foundationssappendsPictureGallery_FoundationsisrangesjstableauxsPictureGallery_TableauStacksrowssPictureGallery_RowStacksheightsDealRowTalonStackstalons createTexts setRegionsCWssgs openstackss talonstackss dropstacks( s_sisjsTABLEAU_YOFFSETslsssthshsysx((spysol.pys createGame.s> 4   % "1cCs@|iiid|iidd|i|iiidS(Nsrowssframesi(s_ssstalonsdealRowstableauxsstartDealSample(s_((spysol.pys startGame.s" cCset|iididjodSnx2|iiD]$}t|idjodSq5q5WdSdS(Niiii(slens_sss foundationsscardsstableauxsstack(s_sstack((spysol.pys isGameWon.s   cCs^|iiioJ||iijot|idjo|iiid|gqZndS(Nisrows(s_ssstalonscardssstacksrowsslensdealRow(s_sstack((spysol.pys fillStack.s)cCsj|itjp |itjodSn|i|ijo+|id|ijp|id|ijSdS(Nii(scard1sranksACEscard2ssuit(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch.s cCsfSdS(N((s_((spysol.pysgetHighlightPilesStacks.s( s__name__s __module__sPictureGallery_Hints Hint_Classs createGames startGames isGameWons fillStacksshallHighlightMatchsgetHighlightPilesStacks(((spysol.pysPictureGallery.s     sPicture Gallerys Braid_HintcBstZRS(N(s__name__s __module__(((spysol.pys Braid_Hint.ssBraid_FoundationcBstZdZdZRS(Nc KsHt|dddddtddtti|||||f|dS(Nsmodi sdiris base_ranksmax_move( s kwdefaultscapsNO_RANKsapplysAbstractFoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.pys__init__.s"cCsti||| odSn|i odSn|ii}|djo7|id|id|df}|ddfjSn*|idi ||i i |di jSdS(Niiscardsi( sAbstractFoundationStacks acceptsCardss_s from_stackscardssgamesgetFoundationDirs stack_dirs getRankDirscard_dirsrankscapsmod(s_s from_stackscardss stack_dirscard_dir((spysol.pys acceptsCards.s  #(s__name__s __module__s__init__s acceptsCards(((spysol.pysBraid_Foundation.s sBraid_BraidStackcBstZddZRS(Nic Csti|||||iiii|_|iiii } |og|_ d}d| dti|}d}x|t|D]C}tt|ti|d}|i i|||}qWn(d | d| d| d | f|_ dS( Ni f0.40000000000000002iiif0.45000000000000001f0.34999999999999998f0.55000000000000004(s OpenStacks__init__s_sxsysgamesappsimagess CARD_YOFFSETsCARDWsCWssines CARD_XOFFSETsnsmathspisdxslast_xsrangesisintsroundssinsappend( s_sxsysgamessineslast_xsisnsdxsCW((spysol.pys__init__.s  #(s__name__s __module__s__init__(((spysol.pysBraid_BraidStack.ssBraid_RowStackcBstZdZdZRS(NcCsE|i o|iiiio#|iid|iii|ndS(Ni(s_scardssgamesssbraidsmoveMove(s_((spysol.pys fillStack.scCs|iiiiSdS(N(s_sgamesappsimagessgetBraidBottom(s_((spysol.pysgetBottomImage.s(s__name__s __module__s fillStacksgetBottomImage(((spysol.pysBraid_RowStack.s sBraid_ReserveStackcBstZdZdZRS(NcCsK||iiijp||iiijodSnti|||SdS(Ni( s from_stacks_sgamesssbraidsrowss ReserveStacks acceptsCardsscards(s_s from_stackscards((spysol.pys acceptsCards/s,cCs|iiiiSdS(N(s_sgamesappsimagessgetTalonBottom(s_((spysol.pysgetBottomImage/s(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysBraid_ReserveStack/s sBraidcBsktZeZdZeZdZdZdZdZ dZ dZ dZ d Z d ZRS( Nic Cst||if\}}td|id|i|id|i}|i d|i |i |i |t |_|idt |i |i f\}}xstdD]e}|iit|d|i |||iit|d|i |||d |i}qW|i |i}xtdD]}|iit||||iit||i |||iit|||i||iit||i ||i||d|i }q3W|i |i d d|i f\}}t||||_|i d |i |i |id df\}}t|||d d |_|i|id t|i||id||i dd|ii _!||i }t"||||_#|i|i#d |i d|i }|i }xftdD]X}|i$it%|||||i$it%||i |||||i}q Wt|i||i|i d|dddt&dd|i|i _'|ig|i#g|i(_)|i$|i|i(_*|ig|i|i#g|i(_+dS(Niiii sbraidif0.5f4.5iiis max_roundsssssanchorssisnsfonts canvas_cardscardw(,sLayouts_ssslsmaxsYSs BRAID_CARDSsYOFFSETshssetSizesXSsXMsYMsNones base_cardsaddattrsxsysrangesisrowssappendsBraid_RowStacksBraid_ReserveStacksBraid_BraidStacksbraidsWasteTalonStackstalons createTexts MfxCanvasTextscanvassCWstextssroundss WasteStackswastes foundationssBraid_FoundationsgetFontsinfossgs talonstackss openstackss dropstacks(s_sishslsssysx((spysol.pys createGame /sV/%  '' ##*'2    & 'cCs}d|it|ii}}x/||it|i i jo|d}q$W||||f\||<||<|SdS(Nii( s_s BRAID_CARDSslensssrowssnsmscardsssuitsgameinfossuits(s_scardssmsn((spysol.pys _shuffleHook4/s ! "cCst|_|i|ix<t|iD]+}|ii i d|ii gddq-W|ii i dd|ii i d|_|ii d|ii}|i|ii |id|ii ||ix&|ii D]}|ii|i_qW|ii idS(Nsrowssframesiiii(sNones_s base_cards updateTextsstartDealSamplesranges BRAID_CARDSsissstalonsdealRowsbraidscardss foundationsssuitsto_stacksflipMovesmoveMovesrankscaps base_ranks dealCards(s_sisto_stackss((spysol.pys startGame:/s    )  cCsJ|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchI/scCsfSdS(N((s_((spysol.pysgetHighlightPilesStacksL/scCsC|i|ii|_x&|iiD]}|ii|i _ q#WdS(N( s_scardssgamesloadinfos base_card_ids base_cardsss foundationssrankscaps base_rank(s_sgamess((spysol.pys_restoreGameHookN/s cCs)|iidt|i|i_dS(Ns base_card_id(s_sloadinfosaddattrsNonespsloads base_card_id(s_sp((spysol.pys _loadGameHookR/scCs|i|iidS(N(spsdumps_s base_cardsid(s_sp((spysol.pys _saveGameHookU/scCs|idjp |ii odSn|i o d}nV|i|ii}|i}|djo|d}n|djo|d}n|iii d|dS(Niss Ascendingis Descendingstext( s_spreviewstextssinfos base_cardstsRANKSsranksgetFoundationDirsdirsconfig(s_sdirst((spysol.pys updateTextW/s     (s__name__s __module__s Braid_Hints Hint_Classs BRAID_CARDSsRANKSs createGames _shuffleHooks startGamesshallHighlightMatchsgetHighlightPilesStackss_restoreGameHooks _loadGameHooks _saveGameHooks updateText(((spysol.pysBraid/s )       s LongBraidcBstZdZRS(Ni(s__name__s __module__s BRAID_CARDS(((spysol.pys LongBraidd/sis Long Braids Spider_HintcBs tZdZdZdZRS(NicCsdSdS(Ni((s_((spysol.pys_preferHighRankMovesl/scCsti||||| odSn|i|d|}|i ||ot |i djodSn|di |i di jo:t |djp|di |di jodSqn|i djot |djodSndSndSdS(Nis stackcardsii(sSpiderType_Hints shallMovePiles_srstspilesrpiles ClonedStacksrrs acceptsCardsslenscardsssuitslevel(s_srstspilesrpilesrr((spysol.pys shallMovePilen/s. #(s__name__s __module__sBONUS_SAME_SUIT_MOVEs_preferHighRankMovess shallMovePile(((spysol.pys Spider_Hintj/s sSpider_SS_FoundationcBstZedZdZRS(Nc KsNt|dddtddddddtti|||||f|dS( Nsdiris base_ranks min_accepti s max_acceptsmax_movei( s kwdefaultscapsKINGsapplysAbstractFoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.pys__init__}/scCs?ti||| odSnt||ii|iiSdS(Ni( sAbstractFoundationStacks acceptsCardss_s from_stackscardssisSameSuitSequencescapsmodsdir(s_s from_stackscards((spysol.pys acceptsCards/s(s__name__s __module__sANY_SUITs__init__s acceptsCards(((spysol.pysSpider_SS_Foundation|/s sSpider_AC_FoundationcBstZdZRS(NcCs?ti||| odSnt||ii|iiSdS(Ni( sAbstractFoundationStacks acceptsCardss_s from_stackscardssisAlternateColorSequencescapsmodsdir(s_s from_stackscards((spysol.pys acceptsCards/s(s__name__s __module__s acceptsCards(((spysol.pysSpider_AC_Foundation/ssSpider_RowStackcBstZdZRS(NcCs~t|idjotdfSn|id}x<|D]4}||j o|i||o|dfSq8q8WtdfSdS(Ni ii(slens_scardssNonesstackssss acceptsCards(s_sstacksssscards((spysol.pys canDropCards/s  (s__name__s __module__s canDropCards(((spysol.pysSpider_RowStack/ss RelaxedSpidercBsDtZeiZeZeZe Z e Z dZ dZdZRS(Nc Ks_t||if\}}t|ddddddddt|i|f||i|i d|i d|i |ii i |ii i ||_ |iio+t|iii |iii ||_nx?|iiD]1}|ii|i|i |i |d tqWx9|iiD]+}|ii|i|i |i |q"W|idS( Nsrowsi swasteistextsis playcardsissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsyswastes WasteStacks foundationssrsappendsFoundation_ClasssANY_SUITsrowssRowStack_Classs defaultAll(s_slayoutslsssr((spysol.pys createGame/s"* + / )cCsx0tdD]"}|iiiddddq W|i|ii}|d|d|d|df}|iiid|dd|iiidS( Nisflipisframesiii srows( srangesis_ssstalonsdealRowsstartDealSamplesrowssr(s_sisrowssr((spysol.pys startGame/s    "cCsC|id|ii|ijp|id|ii|ijSdS(Ni(scard1sranksstack1scapsmodscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch/s(s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_ClasssSpider_SS_FoundationsFoundation_ClasssSpider_RowStacksRowStack_Classs Spider_Hints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pys RelaxedSpider/s  sSpidercBstZdZRS(NcCsKti| odSnx'|iiD]}|i odSq&q&WdSdS(Nii(s RelaxedSpiders canDealCardss_sssrowssrscards(s_sr((spysol.pys canDealCards/s   (s__name__s __module__s canDealCards(((spysol.pysSpider/ssBlackWidow_RowStackcBstZdZRS(NcCsti||SdS(N(sSpider_RowStacks canDropCardss_sstacks(s_sstacks((spysol.pys canDropCards/s(s__name__s __module__s canDropCards(((spysol.pysBlackWidow_RowStack/ss BlackWidowcBstZeZRS(N(s__name__s __module__sBlackWidow_RowStacksRowStack_Class(((spysol.pys BlackWidow/ssGroundForADivorce_TaloncBstZddZRS(NicCsf|ioTtd|iii}| o|iiid }n|id|d|SndSdS(NcCs|iS(N(srscards(sr((spysol.pys/sisrowsssoundi(s_scardssfiltersgamesssrowss dealRowAvailssound(s_ssoundsrows((spysol.pys dealCards/s  (s__name__s __module__s dealCards(((spysol.pysGroundForADivorce_Talon/ssGroundForADivorcecBsStZeiZeZeede ddZ ee ddZ dZ dZRS(Ns base_ranksmodi cCsti|dddS(Ns playcardsi(s RelaxedSpiders createGames_(s_((spysol.pys createGame/scCsKx*tdD]}|iiiddq W|i|iiidS(Nisframesi(srangesis_ssstalonsdealRowsstartDealSample(s_si((spysol.pys startGame/s   (s__name__s __module__sLayouts harpLayouts Layout_MethodsGroundForADivorce_Talons Talon_Classs StackWrappersSpider_SS_FoundationsANY_RANKsFoundation_ClasssSpider_RowStacksRowStack_Classs createGames startGame(((spysol.pysGroundForADivorce/s   sGrandmothersGamecBs#tZeiZdZdZRS(NcCsti|dddS(Ns playcardsi(s RelaxedSpiders createGames_(s_((spysol.pys createGame/scCsKx*tdD]}|iiiddq W|i|iiidS(Nisframesi(srangesis_ssstalonsdealRowsstartDealSample(s_si((spysol.pys startGame/s   (s__name__s __module__sLayouts harpLayouts Layout_Methods createGames startGame(((spysol.pysGrandmothersGame/s  s SpiderettecBstZdZdZRS(NcCsti|dddddS(Nsrowsis playcardsi(sSpiders createGames_(s_((spysol.pys createGame/scCspxOtdt|iiD]2}|iiid|ii|ddddqW|i|iiidS(Nisrowssflipisframes( srangeslens_sssrowssistalonsdealRowsstartDealSample(s_si((spysol.pys startGame/s 0 (s__name__s __module__s createGames startGame(((spysol.pys Spiderette/s sBabySpiderettecBstZeZRS(N(s__name__s __module__sBlackWidow_RowStacksRowStack_Class(((spysol.pysBabySpiderette/ss WillOTheWispcBstZdZRS(NcCsQx0tdD]"}|iiiddddq W|i|iiidS(Nisflipisframes(srangesis_ssstalonsdealRowsstartDealSample(s_si((spysol.pys startGame/s    (s__name__s __module__s startGame(((spysol.pys WillOTheWisp/ss SimpleSimoncBs tZeZdZdZRS(NcCsti|dddddS(Nsrowsi stextsi(sSpiders createGames_(s_((spysol.pys createGame/scCsjxIdddddddfD],}|iiid|ii| d d qW|i|iiidS( Ni iiiiiisrowssframesi(sls_ssstalonsdealRowsrowssstartDealSample(s_sl((spysol.pys startGame/s * (s__name__s __module__sInitialDealTalonStacks Talon_Classs createGames startGame(((spysol.pys SimpleSimon/s sRachelcBs2tZeeddZeZdZdZRS(Ns max_roundsicCs#ti|dddddddS(Nswasteisrowsistexts(s RelaxedSpiders createGames_(s_((spysol.pys createGame/scCs.|i|iii|iiidS(N(s_sstartDealSamplessstalonsdealRows dealCards(s_((spysol.pys startGame/s ( s__name__s __module__s StackWrappersWasteTalonStacks Talon_Classs RK_RowStacksRowStack_Classs createGames startGame(((spysol.pysRachel/s sScorpion_RowStackcBstZeiZRS(N(s__name__s __module__sSpider_RowStacks canDropCards(((spysol.pysScorpion_RowStack/ssScorpioncBs>tZeedeZdZdZdZdZ RS(Ns base_rankcCsti|dddddS(Nsrowsis playcardsi(s RelaxedSpiders createGames_(s_((spysol.pys createGame0scCsxxddddddfD]^}|iiid|ii| dddd|iiid|ii|ddddqW|i|iiidS(Niisrowssflipsframesi(sis_ssstalonsdealRowsrowssstartDealSample(s_si((spysol.pys startGame0s ,0 cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch 0scCsfSdS(N((s_((spysol.pysgetHighlightPilesStacks 0s( s__name__s __module__s StackWrappersScorpion_RowStacksKINGsRowStack_Classs createGames startGamesshallHighlightMatchsgetHighlightPilesStacks(((spysol.pysScorpion/s    sWaspcBstZeZdZRS(NcCsxxddddddfD]^}|iiid|ii| dddd|iiid|ii|ddddqW|i|iiidS(Niisrowssflipsframesi(sis_ssstalonsdealRowsrowssstartDealSample(s_si((spysol.pys startGame0s ,0 (s__name__s __module__sScorpion_RowStacksRowStack_Classs startGame(((spysol.pysWasp0ssRougeEtNoir_RowStackcBstZdZRS(NcCs|i otdfSnxg|D]_}xV|id|idfD]:}||j o|i||o|t|fSqAqAWq WtdfSdS(Niii(s_scardssNonesstackssss acceptsCardsslen(s_sstacksssscards((spysol.pys canDropCards0s  (s__name__s __module__s canDropCards(((spysol.pysRougeEtNoir_RowStack0ss RougeEtNoircBs5tZeiZeZeZdZ dddZ RS(Nc Kst||if\}}t|ddddddddt|i|f||i|i d|i d|i |ii i |ii i ||_ |iio+t|iii |iii ||_nxRtd D]D}|ii|}|iit|i |i |d |d dqWxJtd D]<}|ii|d }|iit|i |i |q5Wx9|iiD]+}|ii|i|i |i |qW|i|SdS( Nsrowsi swasteistextsis playcardsiissuitsmax_move(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsyswastes WasteStacksrangesis foundationssrsappendsAC_FoundationStacksSpider_AC_FoundationsrowssRowStack_Classs defaultAll(s_slayoutsislsssr((spysol.pys createGame#0s("* + 2 & ) iic CsxVtdt|iiD]9}|iiid|ii| d|ddd|qW|i |iiid|iid d|dS(Nisrowssflipsframesisreversei( srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSample(s_sflipsreversesi((spysol.pys startGame50s 7 ( s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_ClasssRougeEtNoir_RowStacksRowStack_Classs createGames startGame(((spysol.pys RougeEtNoir0s   sRelaxed Spideri1s Black WidowisGround for a DivorceirsGrandmother's Gameii/sBaby Spiderettei0sWill o' the Wispi2s Simple Simoniiis Rouge et NoirsFreeCell_RowStackcBs#tZdZdZdZRS(NcCst|iiid}t|iii}|djo|d}nx3|djo |djo|d}|d}qLW|SdS(Niiii( sgetNumberOfFreeStackss_sgamesssreservessmax_movesrowssnsto_stack_ncards(s_sto_stack_ncardssmax_movesn((spysol.pys _getMaxMoveS0s  cCs6|id}t||joti||SdS(Ni(s_s _getMaxMovesmax_moveslenscardss AC_RowStacks canMoveCards(s_scardssmax_move((spysol.pys canMoveCards\0scCsB|it|i}t||joti|||SdS(N(s_s _getMaxMoveslenscardssmax_moves AC_RowStacks acceptsCardss from_stack(s_s from_stackscardssmax_move((spysol.pys acceptsCards_0s(s__name__s __module__s _getMaxMoves canMoveCardss acceptsCards(((spysol.pysFreeCell_RowStackR0s sFreeCellcBsPtZeiZeZeZe Z e e ddZ dZdZdZRS(NicKs]t||if\}}t|ddddddt|i|f||i|i d|i d|i |ii i |ii i ||_ xB|iiD]4}|ii|i|i |i |d|iqWx9|iiD]+}|ii|i|i |i |qWx6|iiD](}|iit|i |i |q#W|idS( Nsrowsisreservesistextsiissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsys foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classsreservess ReserveStacks defaultAll(s_slayoutslsssr((spysol.pys createGameh0s* 2 ) &cCsx*tdD]}|iiiddq W|i|iii|ii}|iiid|d t |iii djpt dS(Nisframesisrowsi( srangesis_ssstalonsdealRowsstartDealSamplesrowssrslenscardssAssertionError(s_sisr((spysol.pys startGameu0s   cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch}0s(s__name__s __module__sLayoutsfreeCellLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssFreeCell_RowStacksRowStack_ClasssFreeCellSolverWrappersFreeCellType_Hints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pysFreeCellb0s  sRelaxedFreeCellcBs#tZeZeedddZRS(Nii(s__name__s __module__s AC_RowStacksRowStack_ClasssFreeCellSolverWrappersFreeCellType_Hints Hint_Class(((spysol.pysRelaxedFreeCell0ssForeCellcBs#tZeedeZdZRS(Ns base_rankcCsx*tdD]}|iiiddq W|i|iii|iiid|iit|iii djpt dS(Nisframesisrows( srangesis_ssstalonsdealRowsstartDealSamplesreservesslenscardssAssertionError(s_si((spysol.pys startGame0s  (s__name__s __module__s StackWrappersFreeCell_AC_RowStacksKINGsRowStack_Classs startGame(((spysol.pysForeCell0ss StalactitescBs_tZeededdddZeeddddZeZ d Z d Z d Z RS( Nssuitsmodi s min_cardsismax_moves max_accepticCsti|dddS(Nsreservesi(sFreeCells createGames_(s_((spysol.pys createGame0scCsx*tdD]}|iiiddq W|i|iii|iiid|iit|iii djpt |i t dS(Nisframesisrows( srangesis_ssstalonsdealRowsstartDealSamples foundationsslenscardssAssertionErrors_restoreGameHooksNone(s_si((spysol.pys startGame0s  #cCs1x*|iiD]}|idi|i_q WdS(Ni(s_sss foundationsscardssrankscaps base_rank(s_sgamess((spysol.pys_restoreGameHook0s ( s__name__s __module__s StackWrappersRK_FoundationStacksANY_SUITsFoundation_Classs BasicRowStacksRowStack_ClasssFreeCellType_Hints Hint_Classs createGames startGames_restoreGameHook(((spysol.pys Stalactites0s   sRelaxed FreeCelli.iMsBakersGame_RowStackcBs#tZdZdZdZRS(NcCst|iiid}t|iii}|djo|d}nx3|djo |djo|d}|d}qLW|SdS(Niiii( sgetNumberOfFreeStackss_sgamesssreservessmax_movesrowssnsto_stack_ncards(s_sto_stack_ncardssmax_movesn((spysol.pys _getMaxMove0s  cCs6|id}t||joti||SdS(Ni(s_s _getMaxMovesmax_moveslenscardss SS_RowStacks canMoveCards(s_scardssmax_move((spysol.pys canMoveCards0scCsB|it|i}t||joti|||SdS(N(s_s _getMaxMoveslenscardssmax_moves SS_RowStacks acceptsCardss from_stack(s_s from_stackscardssmax_move((spysol.pys acceptsCards0s(s__name__s __module__s _getMaxMoves canMoveCardss acceptsCards(((spysol.pysBakersGame_RowStack0s s BakersGamecBs8tZeiZeZeZdZ dZ dZ RS(NcKs]t||if\}}t|ddddddt|i|f||i|i d|i dt |ii i |ii i ||_ xB|iiD]4}|iiit|i |i |d|iqWx9|iiD]+}|ii|i|i |i |qWx9|iiD]+}|iiit|i |i |q W|idS( Nsrowsisreservesistextsiissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizesInitialDealTalonStackstalonsxsys foundationssrsappendsSS_FoundationStackssuitsrowssRowStack_Classsreservess ReserveStacks defaultAll(s_slayoutslsssr((spysol.pys createGame0s' 2 ) )cCsx*tdD]}|iiiddq W|i|iii|ii}|iiid|d t |iii djpt dS(Nisframesisrowsi( srangesis_ssstalonsdealRowsstartDealSamplesrowssrslenscardssAssertionError(s_sisr((spysol.pys startGame0s   cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch0s( s__name__s __module__sLayoutsfreeCellLayouts Layout_MethodsBakersGame_RowStacksRowStack_ClasssFreeCellType_Hints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pys BakersGame0s   sKingOnlyBakersGamecBstZeedeZRS(Ns base_rank(s__name__s __module__s StackWrappersFreeCell_SS_RowStacksKINGsRowStack_Class(((spysol.pysKingOnlyBakersGame0ssEightOffcBs tZdddZdZRS(Nic Cs*t||if\}}td|i|idd|i}t||}|i |i ||i |i|i||i|i |d|i d|if\} }x@tdD]2}|iit| |||| |i } qW|i |||i d||if\} }x@t|D]2}|ii|i| ||| |i } q/W|i |||i d|i|if\} }x=t|D]/}|i it| ||| |i } qW|i|i d||idddft|i |i||_|idS(Niiiiii?B(sLayouts_ssslsmaxsYSsYOFFSETshsrowssreservessmaxrowsssetSizesXMsXSsYMsxsysrangesis foundationssappendsSS_FoundationStacksRowStack_Classsheights ReserveStacks setRegionsCHsInitialDealTalonStackstalonsdefaultStackGroups( s_srowssreservessishslsssmaxrowssysx((spysol.pys createGame0s,(3+ / 2 *cCsx*tdD]}|iiiddq W|i|iii|ii}|iiid|d|d|d|dgt |iii djpt dS(Nisframesisrowsiii( srangesis_ssstalonsdealRowsstartDealSamplesreservessrslenscardssAssertionError(s_sisr((spysol.pys startGame0s   2(s__name__s __module__s createGames startGame(((spysol.pysEightOff0ssSeahavenTowerscBstZdZdZRS(NcCst||if\}}td|id|i}|i|i d|i |i |i||i |i f\}}x?tdD]1}|iit||d|i ||qWxTtdD]F}ddddf|}|iit|||i |||qW|i |i |if\}}x@tdD]2}|ii|i|||||i }qAW|i|id ||i d d d ft|i |i|i||_|i|i|i|i_|ig|i_|i|i|i_|i|i_ dS( Niii ii iiiiii?B(!sLayouts_ssslsmaxsYSsYOFFSETshssetSizesXMsXSsYMsxsysrangesisreservessappends ReserveStackssuits foundationssSS_FoundationStacksrowssRowStack_Classs setRegionsInitialDealTalonStacksheightstalonssgs openstackss talonstackss dropstackss reservestacks(s_sishssuitslsssysx((spysol.pys createGame0s,, / . *"cCsx*tdD]}|iiiddq W|i|iii|iiid|iidd!t|iii djpt dS(Nisframesisrowsii( srangesis_ssstalonsdealRowsstartDealSamplesreservesslenscardssAssertionError(s_si((spysol.pys startGame1s  #(s__name__s __module__s createGames startGame(((spysol.pysSeahavenTowers0s sRelaxedSeahavenTowerscBstZeZRS(N(s__name__s __module__sKingSS_RowStacksRowStack_Class(((spysol.pysRelaxedSeahavenTowers 1ssPenguincBshtZdZeZeZdddZdZdZ dZ dZ dZ d Z d ZRS( Niic Cs]t||if\}}td|i|idd|i}t||}|i |i |d|i |i||it|_|i|i |if\} }xLtdD]>}|iit| |||dddd||i}qW|i|i| |id d d d f|i |||i d |if\} }xFt|D]8}|ii|i| ||dd| |i } q[W|i |||i d |i|if\} }x=t|D]/}|i it| ||| |i } qW|i|i d ||id d d ft|i d|||_ |i!dS( Niiiismodi smax_moveiiii?B("sLayouts_ssslsmaxsYSsYOFFSETshsrowssreservessmaxrowsssetSizesXMsXSsYMsNones base_cardswidthsxsysrangesis foundationssappendsSS_FoundationStacks setRegionsCWsRowStack_Classsheights ReserveStacksCHsInitialDealTalonStackstalonsdefaultStackGroups( s_srowssreservessishslsssmaxrowssysx((spysol.pys createGame1s0(0  +*+ %2 *cCs!|i||didSdS(NicCs|i|jdfS(Ni(scsrank(scsrank((spysol.pys)1s(s_s_shuffleHookMoveToTopscardssrank(s_scards((spysol.pys _shuffleHook(1scCs#|iiid|_|ixtdD]}|iii}|i |ii jpt |ii |i |ii}|i|ii|id|ii|ddq-Wx*tdD]}|iiiddqW|i|iiit|iiidjpt dS(Niiisframesii(s_ssstalonscardss base_cards _updateStackssrangesisgetCardscsranksAssertionErrors foundationsssuitsgameinfosdeckssto_stacksflipMovesmoveMovesdealRowsstartDealSampleslen(s_scsisto_stack((spysol.pys startGame*1s  #  cCsJ|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch81scCs$|i|ii|_|idS(N(s_scardssgamesloadinfos base_card_ids base_cards _updateStacks(s_sgame((spysol.pys_restoreGameHook;1scCs)|iidt|i|i_dS(Ns base_card_id(s_sloadinfosaddattrsNonespsloads base_card_id(s_sp((spysol.pys _loadGameHook>1scCs|i|iidS(N(spsdumps_s base_cardsid(s_sp((spysol.pys _saveGameHookA1scCs^x&|iiD]}|ii|i_q Wx.|iiD] }|iidd|i_q6WdS(Nii (s_sss foundationss base_cardsrankscaps base_ranksrows(s_ss((spysol.pys _updateStacksC1s   (s__name__s __module__s GAME_VERSIONs SS_RowStacksRowStack_ClasssFreeCellType_Hints Hint_Classs createGames _shuffleHooks startGamesshallHighlightMatchs_restoreGameHooks _loadGameHooks _saveGameHooks _updateStacks(((spysol.pysPenguin1s      i-s Baker's GameisKing Only Baker's Gameis Eight OffsSeahaven TowerssRelaxed Seahaven Towersi@sEiffelTower_RowStackcBstZdZdZRS(Nc Cs/ti||||ddddd|_dS(Nsmax_moveis max_accepti(s OpenStacks__init__s_sxsysgames CARD_YOFFSET(s_sxsysgame((spysol.pys__init__U1s"cCsBti||| odSn|idi|didjSdS(Niii (s OpenStacks acceptsCardss_s from_stackscardssrank(s_s from_stackscards((spysol.pys acceptsCardsX1s(s__name__s __module__s__init__s acceptsCards(((spysol.pysEiffelTower_RowStackT1s s EiffelTowercBsDtZeZeZdZdZdZe dZ dZ RS(NcCst||if\}}|i|id|i|id|i|i}xddfddfddfddfd d fd d ffD]o}|i|d|i}xAt |d D]/}|iit|||||i}qW||i}qW|id|i}|id |id}|i||||_|i|id ||i}|i|||d d|_|i|id |idS(Nf8.5iif2.5iif1.5iif0.5issss max_rounds(sLayouts_ssslssetSizesXMsXSsYMsYSsysdsxsrangesisrowssappendsEiffelTower_RowStacks Waste_Classswastes createTexts Talon_ClassstalonsdefaultStackGroups(s_sdsislsssysx((spysol.pys createGame_1s&, = cCs.|i|iii|iiidS(N(s_sstartDealSamplessstalonsdealRows dealCards(s_((spysol.pys startGameq1s cCs9t|iiidjot|iiidjSdS(Ni(slens_ssstalonscardsswaste(s_((spysol.pys isGameWonu1scCsffffSdS(N((s_sevent((spysol.pys getAutoStacksw1scCs|i|idjSdS(Ni (scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchy1s( s__name__s __module__sWasteTalonStacks Talon_Classs WasteStacks Waste_Classs createGames startGames isGameWonsNones getAutoStackssshallHighlightMatch(((spysol.pys EiffelTower\1s    sStrictEiffelTowercBstZeeddZRS(Ns max_cardsi(s__name__s __module__s StackWrappers WasteStacks Waste_Class(((spysol.pysStrictEiffelTower{1sis Eiffel TowersMatriarchy_WastecBstZdZRS(NcCs>ti||iiiio|iiiindS(N(s WasteStacks updateTexts_sgamessstalons_updateMaxRounds(s_((spysol.pys updateText1s (s__name__s __module__s updateText(((spysol.pysMatriarchy_Waste1ssMatriarchy_TaloncBsktZddddddddd d d d d dddddfZd Zd ZddZdZRS(Niiiiiiii i i i cCs/|i}d|_|iii}xddddfD]}t||dit||di}t||dit||di}||d jpt ||d jo|id|_q4|d jp |d jo|id|_q4q4W|id jo d |_n||ijSdS( Ni iiiiiii ii ii( s_s max_roundssoldsgamesssrowssislenscardssl1sl2sAssertionError(s_srowssoldsisl2sl1((spysol.pys_updateMaxRounds1s  ,, cCs|io|in|i o|iiii odSn|i|id}|djpt t |i|jp|i|i jSdS(Nii( s_s_updateMaxRoundss updateTextscardssgamessswastesDEALsroundsncardssAssertionErrorslens max_rounds(s_sncards((spysol.pys canDealCards1s icCs|i|id}|djpt|iii}d}d}x||jo xy||jok|i }| oPn|i pt|ii ||iid||dddd|d}qVW||jot|idjogt|idjpt|i|ijp |djpt|ii||d|d}qFqFW|i|ijpt||jptt|iiiidjpt|SdS(Niisframesisshadows update_flags(s_sDEALsroundsncardssAssertionErrorsgamessswastesns update_flagssgetCardscardsface_upsflipMovesmoveMoveslenscardss max_roundss turnStackMove(s_ssoundsncardss update_flagssnscardswaste((spysol.pys dealCards1s2   "#'&cCs|iidjodSnti|ddd|i|if}|ii i d|d|i |id}|ii i d|dS(Nis update_roundsis Round %d/%dstextsDeal %d( s_sgamespreviewsWasteTalonStacks updateTextsrounds max_roundsststextssroundssconfigsDEALsmisc(s_st((spysol.pys updateText1s(s__name__s __module__sDEALs_updateMaxRoundss canDealCardss dealCardss updateText(((spysol.pysMatriarchy_Talon1s <   sMatriarchy_UpRowStackcBstZdZdZRS(NcCsKti||||d|dtdddddddd |i |_dS( Nssuits base_ranksmodi sdiris min_cardss max_cardsi ( s SS_RowStacks__init__s_sxsysgamessuitsKINGs CARD_YOFFSET(s_sxsysgamessuit((spysol.pys__init__1scCs |iiii|iiSdS(N(s_sgamesappsimagess getSuitBottomscapssuit(s_((spysol.pysgetBottomImage1s(s__name__s __module__s__init__sgetBottomImage(((spysol.pysMatriarchy_UpRowStack1s sMatriarchy_DownRowStackcBstZdZdZRS(NcCs>ti||||d|dtddddddd d dS( Nssuits base_ranksmodi sdiris min_cardsis max_cardsi (s SS_RowStacks__init__s_sxsysgamessuitsQUEEN(s_sxsysgamessuit((spysol.pys__init__1scCs |iiii|iiSdS(N(s_sgamesappsimagess getSuitBottomscapssuit(s_((spysol.pysgetBottomImage1s(s__name__s __module__s__init__sgetBottomImage(((spysol.pysMatriarchy_DownRowStack1s s MatriarchycBs;tZeZdZdZdZdZdZRS(Nc Csit||if\}}td|idd|i|idd}|i d|i |i ||i ||i d||i |f\}} } |i | |if\}}xDtdD]6}|iit||||d||i }qW|i | f\}}xDtdD]6}|iit||||d||i }qW||i d| |id|if\}}||id}t||||_|i|id| |id}t|||dt|_ |i|i d t!|i"|||id d |i i#_$t!|i"||d d d t%d|i i#_&|i'dS(Nii iii issss max_roundssnnsanchorsnscentersfonts canvas_large((sLayouts_ssslsmaxsYSsYOFFSETsCHshssetSizesXSsXMsYMsheightscentersc1sc2sxsysrangesisrowssappendsMatriarchy_UpRowStacksMatriarchy_DownRowStacksCWstxsMatriarchy_Wasteswastes createTextsMatriarchy_TalonsVARIABLE_REDEALSstalons MfxCanvasTextscanvasstextssroundssgetFontsmiscsdefaultStackGroups( s_sxscenterstxsishslsssysc2sc1((spysol.pys createGame1s60)& # #/ "  cCs|i|ddSdS(NcCs|idj|ifS(Ni (scsrankssuit(sc((spysol.pys1si(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook1scCs;|i|iii|iid|iiidS(Ni(s_sstartDealSamplessstalonsdealRowsrowss dealCards(s_((spysol.pys startGame1s cCs9t|iiidjot|iiidjSdS(Ni(slens_ssstalonscardsswaste(s_((spysol.pys isGameWon1scCsm|i|ittjodSn|i|ijo3|idd|ijp|idd|ijSdS(Niii (scard1srankscard2sQUEENsKINGssuit(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch1s( s__name__s __module__sCautiousDefaultHints Hint_Classs createGames _shuffleHooks startGames isGameWonsshallHighlightMatch(((spysol.pys Matriarchy1s     isCalculation_HintcBstZdZRS(NcCs||iiijot|djptd}t|i djo |t |i di d}n|i di |i di jo%d|i di t|i }nR|i di |i di jo d}n'||i di |i di d}||fSdS(Nii0uiiii'i N(srs_sgamessswasteslenspilesAssertionErrorsscorestscardssKINGsrankscolor(s_sscorescolorsrstspilesrpile((spysol.pys_getMoveWasteScore1s0 !%! &(s__name__s __module__s_getMoveWasteScore(((spysol.pysCalculation_Hint1ssBetsyRoss_FoundationcBstZdZRS(NcCs|iidjodSn|iiot|idjo*|ii}|iii dt |qt|i|ii jo|iii ddq|idi |ii |ii}|iii dt |ndS(Niistextsi(s_sgamespreviewstextssmiscslenscardsscaps base_ranksranksconfigsRANKSs max_cardssdirsmod(s_srank((spysol.pys updateText2s  $(s__name__s __module__s updateText(((spysol.pysBetsyRoss_Foundation2ssCalculation_FoundationcBstZdZRS(NcCs |iiii|iiSdS(N(s_sgamesappsimagess getLetterscaps base_rank(s_((spysol.pysgetBottomImage2s(s__name__s __module__sgetBottomImage(((spysol.pysCalculation_Foundation2ssCalculation_RowStackcBstZdZdZRS(NcCsIti||| odSn||iiijot|djSdS(Nii( s BasicRowStacks acceptsCardss_s from_stackscardssgamessswasteslen(s_s from_stackscards((spysol.pys acceptsCards2scCs|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage2s(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysCalculation_RowStack2s s CalculationcBs2tZeZdZdZdZdZRS(Nc Cst||if\}}td|id|i}|id|i |i |i |id||i |i dd}||i f\}}xtdD]}t|||d|dd d |d } |ii| t|i||id||id d dtdd|i| i_||i }qWdddd}t|i||i ||idd|d ddtd|i_|}|i |id}xItdD];}|iit|||dd dd ||i }qW|i|id|ddf|i }t |||dd |_!|i"|i!d||i}t#|||dd |_$|i%dS(Niif5.5iiis base_ranksmodi sdirisanchorsnsfonts canvas_cardscardws1: A 2 3 4 5 6 7 8 9 T J Q K s2: 2 4 6 8 T Q A 3 5 7 9 J K s3: 3 6 9 Q 2 5 8 J A 4 7 T K s4: 4 8 Q 3 7 J 2 6 T A 5 9 Kstextsws canvas_fixedsmax_moves max_acceptii?Bs max_roundssnns max_cards(&sLayouts_ssslsmaxsYSsYOFFSETshssetSizesXSsXMsYMsx0sxsysrangesisCalculation_Foundationsstacks foundationssappends MfxCanvasTextscanvassCWsgetFontstextssmiscshelpsCHsrowssCalculation_RowStacks setRegionsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups( s_shelpsishslsssysxsx0sstack((spysol.pys createGame2s80 (!'' (  cCswtgd}xQ|D]H}|idjo||itjo|||i<|i|qqW|i||SdS(Nii(sNonestopcardsscardsscsranksremovesreverse(s_scardsscstopcards((spysol.pys _shuffleHook<2s $  cCs:|i|iiid|ii|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss dealCards(s_((spysol.pys startGameD2s cCsfSdS(N((s_((spysol.pysgetHighlightPilesStacksH2s(s__name__s __module__sCalculation_Hints Hint_Classs createGames _shuffleHooks startGamesgetHighlightPilesStacks(((spysol.pys Calculation2s    s HopscotchcBstZdZRS(NcCstgd}xa|D]X}|idjo!|idjo||itjo|||i<|i|qqW|i||SdS(Niii(sNonestopcardsscardsscssuitsranksremovesreverse(s_scardsscstopcards((spysol.pys _shuffleHookK2s 4  (s__name__s __module__s _shuffleHook(((spysol.pys HopscotchJ2ss BetsyRosscBstZdZdZRS(Nc Cst||if\}}|id|i|i|i|idd|i|i|idd}||if\}}x[t dD]M}t|||d|ddd d d d }|ii|||i}qW|}|i|id}xt dD]}t|||dd|dd d d|dddd d }t|i||id||idddtdd|i|i_|ii|||i}qWdddd}t|i||i||idd|dddtd|i_|i}t|||dd|_|i|id||i}t||||_|i|id|idS(Nf5.5iiiis base_ranks max_cardsismax_moveis max_acceptsmodi sdiri sanchorsssfonts canvas_cardscardws1: 2 3 4 5 6 7 8 9 T J Q K s2: 4 6 8 T Q A 3 5 7 9 J K s3: 6 9 Q 2 5 8 J A 4 7 T K s4: 8 Q 3 7 J 2 6 T A 5 9 Kstextsws canvas_fixeds max_roundssnnsss( sLayouts_ssslssetSizesXSsXMsYMsYSsx0sxsysrangesisBetsyRoss_Foundationsstacks foundationssappends MfxCanvasTextscanvassCWsgetFontstextssmiscshelpsCHsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups( s_shelpsislsssysxsx0sstack((spysol.pys createGameT2s<7  *!''  cCstgd}x|D]}|idjo||itjo|||i<|i|q|iddddfjoEd|idd}||tjo|||<|i|qqqW|i||SdS(Niiiiiii(sNonestopcardsscardsscsranksremovesisreverse(s_scardsscstopcardssi((spysol.pys _shuffleHooku2s $   (s__name__s __module__s createGames _shuffleHook(((spysol.pys BetsyRossS2s !ii^is Betsy Rosss Canfield_HintcBstZdZRS(NcCs9ti|||||||\}}|d|fSdS(Ni( sCautiousDefaultHints_getMovePileScores_sscorescolorsrstspilesrpile(s_sscorescolorsrstspilesrpile((spysol.pys_getMoveWasteScore2s'(s__name__s __module__s_getMoveWasteScore(((spysol.pys Canfield_Hint2ssCanfield_AC_RowStackcBstZdZRS(NcCsh||iiijo;t|djot|t|ijodSqQnti|||SdS(Nii( s from_stacks_sgamesssrowsslenscardss AC_RowStacksbasicAcceptsCards(s_s from_stackscards((spysol.pysbasicAcceptsCards2s/ (s__name__s __module__sbasicAcceptsCards(((spysol.pysCanfield_AC_RowStack2ssCanfield_SS_RowStackcBstZdZRS(NcCsh||iiijo;t|djot|t|ijodSqQnti|||SdS(Nii( s from_stacks_sgamesssrowsslenscardss SS_RowStacksbasicAcceptsCards(s_s from_stackscards((spysol.pysbasicAcceptsCards2s/ (s__name__s __module__sbasicAcceptsCards(((spysol.pysCanfield_SS_RowStack2ssCanfield_RK_RowStackcBstZdZRS(NcCsh||iiijo;t|djot|t|ijodSqQnti|||SdS(Nii( s from_stacks_sgamesssrowsslenscardss RK_RowStacksbasicAcceptsCards(s_s from_stackscards((spysol.pysbasicAcceptsCards2s/ (s__name__s __module__sbasicAcceptsCards(((spysol.pysCanfield_RK_RowStack2ssCanfieldcBstZeZeeddZeZe Z dZ dZ dZ ddddZd Zd Zd Zd Zd ZdZdZRS(Nsmodi iiiiic CsIt||if\} } |ii}td| id| i} |i | i dt|d|| i | i | i| id| t|_| i | if\}}t|||d|d|| _| i| id|| i }t|||| _| i| id|| i }xftdD]X} xOt|D]A} || i }| ii|i|||| dd d d qCWq0W|d|joC| i td \}}}}||| i ||f\}}n@| i td\}}}}||||| if\}}t%d d| i&}t(|i)||d|d||i*_+| i | i| idf\}}| i,i|i-|||d| i,d _.|i/djo t0| id| i,d _.n| i d| i | i }x@t|D]2} | i i|i1||||| i }qW| i2dS(Niiiis max_roundssnum_dealsssmodi smax_moveisses canvas_cardscardwsanchorsfonti ii(3sLayouts_ssslsgameinfosdeckssmaxsYSsYOFFSETshssetSizesXMsrowssXSsYMsNones base_cardsxsysWasteTalonStacks max_roundssnum_dealstalons createTexts WasteStackswastesrangesisjs foundationssappendsFoundation_Classs getTextAttrstxstystastfsgetFontsCWsfonts MfxCanvasTextscanvasstextssinfosreservessReserveStack_Classs CARD_YOFFSETsINITIAL_RESERVE_FACEUPsminsRowStack_ClasssdefaultStackGroups(s_srowss max_roundssnum_dealsfontstxstystfstasishsjslsssysxsdecks((spysol.pys createGame2sH H !     6%!'#  cCsW|idjodSn|i o d}nt|ii}|iiid|dS(Nisstext( s_spreviews base_cardstsRANKSsrankstextssinfosconfig(s_st((spysol.pys updateText2s   c Cs|it|_|i|iii|_x&|iiD]}|ii |i _ q?W|ii |i i}|ii|io(|i idjpt|d}n|i|ii|id|ii|ii||ixgt|iD]V}|io|i|iin|id|ii|iidddddqW|iidio|i|iidn|iiidd|iiidS(Niisframesisshadowsreverse(s_sstartDealSamplesNones base_cards updateTextssstalonsgetCards foundationssrankscaps base_rankssuitsgameinfosdeckssnscardssAssertionErrorsflipMovesmoveMovesrangesINITIAL_RESERVE_CARDSsisINITIAL_RESERVE_FACEUPsreservess canFlipCardsdealRows dealCards(s_sisssn((spysol.pys startGame2s.    #  3cCs||iijo |iio|iou|i o|iidioR|iididi o|iidin|iidi d|qqn3||iijo|i o|iqndS(Niii( sstacks_sssrowssreservessFILL_EMPTY_ROWSscardssface_upsflipMovesmoveMoves canFlipCard(s_sstack((spysol.pys fillStack2s  & cCsJ|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch2scCsC|i|ii|_x&|iiD]}|ii|i _ q#WdS(N( s_scardssgamesloadinfos base_card_ids base_cardsss foundationssrankscaps base_rank(s_sgamess((spysol.pys_restoreGameHook2s cCs)|iidt|i|i_dS(Ns base_card_id(s_sloadinfosaddattrsNonespsloads base_card_id(s_sp((spysol.pys _loadGameHook2scCs|i|iidS(N(spsdumps_s base_cardsid(s_sp((spysol.pys _saveGameHook2s(s__name__s __module__sSS_FoundationStacksFoundation_Classs StackWrappersCanfield_AC_RowStacksRowStack_Classs OpenStacksReserveStack_Classs Canfield_Hints Hint_ClasssINITIAL_RESERVE_CARDSsINITIAL_RESERVE_FACEUPsFILL_EMPTY_ROWSs createGames updateTexts startGames fillStacksshallHighlightMatchs_restoreGameHooks _loadGameHooks _saveGameHook(((spysol.pysCanfield2s#     sSuperiorCanfieldcBstZdZdZRS(Nii(s__name__s __module__sINITIAL_RESERVE_FACEUPsFILL_EMPTY_ROWS(((spysol.pysSuperiorCanfield2ssRainfallcBstZdZRS(NcCsti|dddddS(Ns max_roundsisnum_deali(sCanfields createGames_(s_((spysol.pys createGame3s(s__name__s __module__s createGame(((spysol.pysRainfall3ssRainbowcBs#tZeeddZdZRS(Nsmodi cCsti|dddddS(Ns max_roundsisnum_deal(sCanfields createGames_(s_((spysol.pys createGame3s(s__name__s __module__s StackWrappersCanfield_RK_RowStacksRowStack_Classs createGame(((spysol.pysRainbow3ss StorehousecBsGtZeeddZdZdZdZdZdZ RS(Nsmodi cCsti|dddddS(Ns max_roundsisnum_deali(sCanfields createGames_(s_((spysol.pys createGame 3scCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys 3s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook 3scCs;|i|iiid|iid ti|dS(Nsrowsi(s_sstartDealSamplessstalonsdealRows foundationssCanfields startGame(s_((spysol.pys startGame 3s  cCsJ|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch3scCsdS(N((s_((spysol.pys updateText3s( s__name__s __module__s StackWrappersCanfield_SS_RowStacksRowStack_Classs createGames _shuffleHooks startGamesshallHighlightMatchs updateText(((spysol.pys Storehouse3s     s ChameleoncBs2tZeeddZdZdZdZRS(Nsmodi i cCs#ti|dddddddS(Nsrowsis max_roundsisnum_deal(sCanfields createGames_(s_((spysol.pys createGame3scCs7|idd|ijp|idd|ijSdS(Nii (scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch3s(s__name__s __module__s StackWrappersCanfield_RK_RowStacksRowStack_ClasssINITIAL_RESERVE_CARDSs createGamesshallHighlightMatch(((spysol.pys Chameleon3s sDoubleCanfieldcBstZdZRS(NcCsti|dddS(Nsrowsi(sCanfields createGames_(s_((spysol.pys createGame3s(s__name__s __module__s createGame(((spysol.pysDoubleCanfield3ss AmericanToadcBs/tZeeddZdZdZdZRS(Nsmodi iicCs#ti|dddddddS(Nsrowsis max_roundsisnum_deali(sCanfields createGames_(s_((spysol.pys createGame$3s(s__name__s __module__s StackWrappersCanfield_SS_RowStacksRowStack_ClasssINITIAL_RESERVE_CARDSsINITIAL_RESERVE_FACEUPs createGame(((spysol.pys AmericanToad 3ssVariegatedCanfieldcBsAtZeZdZdZdZdZdZdZ RS(NicCsti|dddddS(Nsrowsis max_roundsi(sCanfields createGames_(s_((spysol.pys createGame)3scCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys,3s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook+3scCs;|i|iiid|iid ti|dS(Nsrowsi(s_sstartDealSamplessstalonsdealRows foundationssCanfields startGame(s_((spysol.pys startGame-3s  cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch13scCsdS(N((s_((spysol.pys updateText43s( s__name__s __module__sCanfield_AC_RowStacksRowStack_ClasssINITIAL_RESERVE_FACEUPs createGames _shuffleHooks startGamesshallHighlightMatchs updateText(((spysol.pysVariegatedCanfield&3s    sEagleWing_ReserveStackcBstZdZRS(NcCs)t|idjo|idi SdS(Nii(slens_scardssface_up(s_((spysol.pys canFlipCard73s(s__name__s __module__s canFlipCard(((spysol.pysEagleWing_ReserveStack63ss EagleWingcBs5tZeeddddddZeZdZRS(Nsmodi smax_moveis max_cardsic Cst||if\}}|i|id|i|i|id|it |_ |i|if\} } t | | |dddd|_|i|id| |i} t| | ||_|i|idxZtdD]L}|i|d|i} |ii|i| | ||dd d d qW|it d \}}} }| ||i| |f\}}td d|i}t|i ||d| d||i!_"|id|i}x~tdD]p}|i||dj|i} |ddddddddf||i$} |i%i|i&| | |qW|id|i|f\} } |i'i|i(| | ||i|i'd d|i)dS(Ni is max_roundsisnum_dealissssmodi smax_moveisses canvas_cardscardwsanchorsfontiif0.20000000000000001f0.40000000000000002f0.59999999999999998(*sLayouts_ssslssetSizesXMsXSsYMsYSsNones base_cardsxsysWasteTalonStackstalons createTexts WasteStackswastesrangesis foundationssappendsFoundation_Classs getTextAttrstxstystastfsgetFontsCWsfonts MfxCanvasTextscanvasstextssinfosrysCHsrowssRowStack_ClasssreservessReserveStack_ClasssdefaultStackGroups( s_sfontstxstysislsrystfsssysxsta((spysol.pys createGame<3s63 !  2!' -# (s__name__s __module__s StackWrappers SS_RowStacksRowStack_ClasssEagleWing_ReserveStacksReserveStack_Classs createGame(((spysol.pys EagleWing93siiiesSuperior Canfieldicilids Straight Upi+sKansasijsDouble Canfieldigs American ToadifsVariegated Canfieldips Eagle Wings Golf_HintcBstZdZRS(Nc CsP|i}x@|iiD]2}|i|ii\}}| oqn|djpt |i |d|i |i dgf}d|itf\}}x|iiD]}|i oqn||jo |i |d|i d }n|io|d}q|i|do|d}qqW|i|||||qWdS(Nis stackcardsii'idi(s_sgamessgs dropstackssrs canDropCardssss foundationsswsncardssAssertionErrors ClonedStackscardsswwsidsNonesscorescolorsts canFlipCardsaddHint( s_sncardsscolorswwsgamesrstswsscore((spysol.pys computeHintsm3s(  )     (s__name__s __module__s computeHints(((spysol.pys Golf_Hintl3ss Golf_TaloncBstZdZRS(NcCs+ti| odSn|ii SdS(Ni(sWasteTalonStacks canDealCardss_sgames isGameWon(s_((spysol.pys canDealCards3s(s__name__s __module__s canDealCards(((spysol.pys Golf_Talon3ss Golf_WastecBstZdZdZRS(NcKs9t|ddddtti||||f|dS(Nsmax_moveis max_accepti( s kwdefaultscapsapplys WasteStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__3scCsti||| odSn|idi|dif\}}|ii djo|t jodSqqn|d|i i |jp|d|i i |jSdS(Niii( s WasteStacks acceptsCardss_s from_stackscardssranksr1sr2sgames getStrictnesssKINGscapsmod(s_s from_stackscardssr1sr2((spysol.pys acceptsCards3s#  (s__name__s __module__s__init__s acceptsCards(((spysol.pys Golf_Waste3s s Golf_RowStackcBstZdZRS(NcCs|i|SdS(N(s_sdoubleclickHandlersevent(s_sevent((spysol.pys clickHandler3s(s__name__s __module__s clickHandler(((spysol.pys Golf_RowStack3ssGolfcBsMtZeZeZdZdZdZdZ dZ e dZ RS(NcCst|dd|if\}}d|i|id|if\}}|d|i|jot ||d|_n|i |d|i |i |i|id|i f\}}x=tdD]/}|iit|||||i}qW|i|i|i f\}}t|||dd |_|i|id ||i}|i||||_|i|i_|i|id |ii|i|ig|i_|ig|i_|i|i_dS( NsXOFFSETi iii4iis max_roundsisnn( sLayouts_ssslsXSsXMsw1sw2sXOFFSETsintssetSizesYSsYMsxsysrangesisrowssappends Golf_RowStacksheights Golf_Talonstalons createTexts Waste_Classswastes CARD_XOFFSETs foundationsssgs openstackss talonstackss dropstacks(s_slsisssw2sw1sysx((spysol.pys createGame3s*!'#  cCs[x*tdD]}|iiiddq W|i|iii|iiidS(Nisframesi(srangesis_ssstalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame3s   cCs1x&|iiD]}|iodSq q WdSdS(Nii(s_sssrowssrscards(s_sr((spysol.pys isGameWon3s    cCs/|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch3scCsfSdS(N((s_((spysol.pysgetHighlightPilesStacks3scCsA|tjo|iifffSn|ii|iiffSdS(N(seventsNones_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks3s ( s__name__s __module__s Golf_Wastes Waste_Classs Golf_Hints Hint_Classs createGames startGames isGameWonsshallHighlightMatchsgetHighlightPilesStackssNones getAutoStacks(((spysol.pysGolf3s     s DeadKingGolfcBstZdZdZRS(NcCsdSdS(Ni((s_((spysol.pys getStrictness3scCs5|itjodSnti|||||SdS(Ni( scard1sranksKINGsGolfsshallHighlightMatchs_sstack1sstack2scard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch3s(s__name__s __module__s getStrictnesssshallHighlightMatch(((spysol.pys DeadKingGolf3s s RelaxedGolfcBs#tZeeddZdZRS(Nsmodi cCs7|idd|ijp|idd|ijSdS(Nii (scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch3s(s__name__s __module__s StackWrappers Golf_Wastes Waste_ClasssshallHighlightMatch(((spysol.pys RelaxedGolf3ssElevator_RowStackcBsVtZdddddddddddddddddddddfZdZRS(NiiiiiicCs|iii|if\}}|idt|f\}}}x^||joP|||}|d}x1t |||D]}||iodSq{q{WqBWdSdS(Nii(s_sgamesssrowssSTEPsrsstepsidslensisnslsrangesjscards(s_sisjslsnsstepsr((spysol.pysbasicIsBlocked3s!  (s__name__s __module__sSTEPsbasicIsBlocked(((spysol.pysElevator_RowStack3sEsElevatorcBstZdZdZRS(NcCst||if\}}|id|i|id|i|ixt dD]~}|id||id}|i||id}xAt |dD]/}|iit|||||i}qWqTW|i|if\}}t|||dd|_|i|id||i}|i||||_|i|id|ii|i|ig|i_|ig|i_|i|i_dS( Ni iiiiis max_roundssss(sLayouts_ssslssetSizesXSsXMsYSsYMsrangesisxsysjsrowssappendsElevator_RowStacks Golf_Talonstalons createTexts Waste_Classswastes foundationsssgs openstackss talonstackss dropstacks(s_sisjssslsysx((spysol.pys createGame3s(,  cCsd|i|iiid|iid dd|iiid|iid|iiidS(Nsrowsisflipi(s_sstartDealSamplessstalonsdealRowsrowss dealCards(s_((spysol.pys startGame3s & (s__name__s __module__s createGames startGame(((spysol.pysElevator3s sTriPeaks_RowStackcBshtZdddddddddddddddddddddddddddfZRS(Niiii i i(s__name__s __module__sSTEP(((spysol.pysTriPeaks_RowStack3ssTriPeakscBsMtZdZdZdZeZdZdZdZdZ RS(Nc Cst|dd|if\}}|id|i|id|i|ih|_ xt dD]}xddfddfddfddfddfddffD]f}|id|d|d|id}|i|d|id}|iit|||qWqcW|id|idf\}}x=t dD]/}|iit|||||i}qAW|i|i|if\}}t|||d d|_|i|id ||i}|i||||_|i|i_|i|id |ii|it|i|id |id d d dtd|i _!|ig|i"_#|ig|i"_$|i|i"_%dS(NsXOFFSETi iiiiiis max_roundssnnisanchorssesfonts canvas_large(&sLayouts_ssslssetSizesXSsXMsYSsYMstalon_card_idssrangesisdsxsysrowssappendsTriPeaks_RowStacks Golf_RowStacksheights Golf_Talonstalons createTexts Waste_ClassswastesXOFFSETs CARD_XOFFSETs foundationss MfxCanvasTextscanvasswidthsgetFontstextssscoressgs openstackss talonstackss dropstacks(s_sdsissslsysx((spysol.pys createGame3s8!,  =($   cCs|i|iiid|iid dd|iiid|iidh|_x'|iiiD]}d|i|i a4si(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHook`4scCsgx*tdD]}|iiiddq W|i|iii|iiid|iidS(Nisframesisrows(srangesis_ssstalonsdealRowsstartDealSamples foundations(s_si((spysol.pys startGameb4s   cCsA|tjoff|iifSnf|ii|iifSdS(N(seventsNones_ssgs dropstacks(s_sevent((spysol.pys getAutoStacksh4s ( s__name__s __module__s StackWrappersBlackHole_RowStacksRowStack_Classs Golf_Hints Hint_Classs createGames _shuffleHooks startGamesNones getAutoStacks(((spysol.pys BlackHoleC4s    i$isDead King Golfis Relaxed Golfi(is Tri Peaksibs Black HolesGrandfathersClock_HintcBstZdZRS(NcCsd|fSdS(Ni`g(scolor(s_sscorescolorsrstsncards((spysol.pys_getDropCardScorez4s(s__name__s __module__s_getDropCardScore(((spysol.pysGrandfathersClock_Hinty4ssGrandfathersClockcBsGtZeZdZdZdZdZdZe dZ RS(Nc CsEt|dd|if\}}td|id|i|idd|i}|i d|i |i |i d|xt dD]r}|i |i ||f\}} xIt dD];}|iit|| |ddd d||i }qWqW|i ||id} |i|id d d ||i d| f|i|idd | ||i dd fd d fdd fddfddfddfddfg}xEt t|D]1}|id ||d d||dfqW|i |i ||if\} }xt dD]}|dd}tt| d||d |i }tt|d||d|i} ddd df|d} |iit|| || d|ddddd q(Wt|i |i |i!|i||_"|i|i|i#_$|i"g|i#_%|i|i#_&dS(NsXOFFSETi iii iismax_moves max_acceptii?Bif0.14999999999999999f0.5f2.5f1.5f2.8500000000000001i if6.5f-1.5s base_ranksmodi ('sLayouts_ssslsmaxsYSsCHsYOFFSETsdhssetSizesXSsXMsYMsrangesisxsysjsrowssappends RK_RowStacks setRegionsdslensx0sy0sintsroundssuits foundationssSS_FoundationStacksInitialDealTalonStackswidthsheightstalonssgs openstackss talonstackss dropstacks( s_sy0sdsdhsisjslsssxsysx0ssuit((spysol.pys createGame~4s>!3)   (..</# )))c Csddddddddf\}}}}d|d|d|d|d|d|d |d |d |d |d |d|f }g}x=|D]4}|i|jo|i ||i |qqW|i d||SdS(Nii iiiiiiiii i i i cCst|i|iS(N(scmpsbsranksa(sasb((spysol.pys4s( sCsSsHsDsidssclocksscardsscsidsappendsremovessort( s_scardssCsDsHscsidssSsclocks((spysol.pys _shuffleHook4s.Z cCsp|idddx*tdD]}|iiiddq W|iii|iiid|iidS(Nsgrandfathersclocksloopiisframesisrows(s_s playSamplesrangesissstalonsdealRows foundations(s_si((spysol.pys startGame4s  cCs/|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch4scCsfSdS(N((s_((spysol.pysgetHighlightPilesStacks4scCsffffSdS(N((s_sevent((spysol.pys getAutoStacks4s( s__name__s __module__sGrandfathersClock_Hints Hint_Classs createGames _shuffleHooks startGamesshallHighlightMatchsgetHighlightPilesStackssNones getAutoStacks(((spysol.pysGrandfathersClock|4s    isGrandfather's Clocks Numerica_HintcBstZdZRS(NcCs||iiijot|djptd}t|i djo |t |i di d}n|i di |i di jo%d|i di t|i }nR|i di |i di jo d}n'||i di |i di d}||fSdS(Nii0uiiii'i N(srs_sgamessswasteslenspilesAssertionErrorsscorestscardssKINGsrankscolor(s_sscorescolorsrstspilesrpile((spysol.pys_getMoveWasteScore4s0 !%! &(s__name__s __module__s_getMoveWasteScore(((spysol.pys Numerica_Hint4ssNumerica_RowStackcBstZdZdZRS(NcCsIti||| odSn||iiijot|djSdS(Nii( s BasicRowStacks acceptsCardss_s from_stackscardssgamessswasteslen(s_s from_stackscards((spysol.pys acceptsCards4scCs|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage4s(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysNumerica_RowStack4s sNumericacBsGtZeZeedeZddZdZ dZ dZ RS(Nssuitic CsUt||if\}}td|id|i}|i|i d||i |i |i |i||i |i dd}||d|i d|i f\}}xFtdD]8}|ii|i|||d|||i }qW||i |if\}}xCt|D]5}|i it|||dd||i }q!W|i|i ||i d|d d f|i }t|||d d|_t|i||id||i d d |ii_||i}t|||d d|_|i|i |i _!|ig|ig|i _"|i |ig|i _#dS(Niif1.5iissuits max_acceptii?Bs max_roundssanchorsss max_cards($sLayouts_ssslsmaxsYSsYOFFSETshssetSizesXMsrowssXSsYMsx0sxsysrangesis foundationssappendsFoundation_ClasssNumerica_RowStacks setRegionsWasteTalonStackstalons MfxCanvasTextscanvassCWstextssncardss WasteStackswastessgs openstackss talonstackss dropstacks( s_srowssishslsssysxsx0((spysol.pys createGame4s27( % "*   cCs|i|iiidS(N(s_sstartDealSamplessstalons dealCards(s_((spysol.pys startGame4s cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch4scCsfSdS(N((s_((spysol.pysgetHighlightPilesStacks4s( s__name__s __module__s Numerica_Hints Hint_Classs StackWrappersRK_FoundationStacksANY_SUITsFoundation_Classs createGames startGamesshallHighlightMatchsgetHighlightPilesStacks(((spysol.pysNumerica4s    s LadyBettycBstZeZdZRS(NcCsti|dddS(Nsrowsi(sNumericas createGames_(s_((spysol.pys createGame4s(s__name__s __module__sSS_FoundationStacksFoundation_Classs createGame(((spysol.pys LadyBetty4sis Sir Tommyis Lady Bettys Yukon_HintcBstZdZdZdZRS(Ni(#idcCsti|||||||\} }| |}d|jo djnpt |i }|ouxr|D]f} |i|d| g} xE|D]=} | i|| go!|d} | d|d}PqqWqpWn|||fSdS(Nii's stackcardsiid(sYukonType_Hints_getMovePileScores_sscorescolorsrstspilesrpilesssbonussAssertionErrorsgetPilestpilescrs ClonedStacksrrscts acceptsCardssd(s_sscorescolorsrstspilesrpilestpilesbonussrrsdssscrsct((spysol.pys_getMovePileScore4s' %  (s__name__s __module__sBONUS_FLIP_CARDsBONUS_CREATE_EMPTY_ROWs_getMovePileScore(((spysol.pys Yukon_Hint4ssYukoncBsYtZeiZeZeZe e de Z e ZdZdZdZdZRS(Ns base_rankc Ks(t||if\}}t|ddddt|i|f||i|i d|i d|i |ii i |ii i ||_ xH|iiD]:}|ii|i|i |i |d|iddqWx9|iiD]+}|ii|i|i |i |qW|i|SdS(Nsrowsistextsiissuitsmax_move(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsys foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_slayoutslsssr((spysol.pys createGame 5s* ' ) cCsxOtdt|iiD]2}|iiid|ii|ddddqWx@tdD]2}|iiid|iidddddq_W|i|iiit|iii djpt dS(Nisrowssflipisframesi( srangeslens_sssrowssistalonsdealRowsstartDealSamplescardssAssertionError(s_si((spysol.pys startGame5s0 0 cCsfSdS(N((s_((spysol.pysgetHighlightPilesStacks5scCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch 5s(s__name__s __module__sLayouts yukonLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_Classs StackWrappersYukon_AC_RowStacksKINGsRowStack_Classs Yukon_Hints Hint_Classs createGames startGamesgetHighlightPilesStackssshallHighlightMatch(((spysol.pysYukon5s   sRussianSolitairecBs#tZeedeZdZRS(Ns base_rankcCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch%5s(s__name__s __module__s StackWrappersYukon_SS_RowStacksKINGsRowStack_ClasssshallHighlightMatch(((spysol.pysRussianSolitaire#5ssOdessacBstZdZRS(NcCsx0tdD]"}|iiiddddq Wx*tdD]}|iiiddq@Wx=tdD]/}|iiid|iidd!ddqmW|i|iiit|iii djpt dS( Nisflipisframesisrowsii( srangesis_ssstalonsdealRowsrowssstartDealSampleslenscardssAssertionError(s_si((spysol.pys startGame)5s    - (s__name__s __module__s startGame(((spysol.pysOdessa(5ssAlaska_RowStackcBstZdZRS(NcCsb|i|ijoK|i|ii|ii|ijp$|i|ii|ii|ijSdS(N(sc1ssuitsc2sranks_scapsdirsmod(s_sc1sc2((spysol.pys _isSequence45s(s__name__s __module__s _isSequence(((spysol.pysAlaska_RowStack35ssAlaskacBstZeedeZRS(Ns base_rank(s__name__s __module__s StackWrappersAlaska_RowStacksKINGsRowStack_Class(((spysol.pysAlaska85ssChineseDisciplinecBs)tZeiZeZdZdZRS(NcCsti|ddddSdS(Nswasteistextsi(sYukons createGames_(s_((spysol.pys createGame=5scCsxxddddddfD]^}|iiid|ii| dddd |iiid|ii|dd dd qW|i|iiidS( Niiiisrowssflipisframesi(sis_ssstalonsdealRowsrowssstartDealSample(s_si((spysol.pys startGame?5s ,0 ( s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_Classs createGames startGame(((spysol.pysChineseDiscipline:5s  sChineseSolitairecBstZeZRS(N(s__name__s __module__sYukon_AC_RowStacksRowStack_Class(((spysol.pysChineseSolitaireE5ssQueeniecBs/tZeiZeZdZdddZRS(NcCsti|ddddSdS(Nswasteistextsi(sYukons createGames_(s_((spysol.pys createGameJ5sic Cs|xUtdt|iiD]8}|iiid|ii|d|ddd|qW|i |iiid|dS(Nisrowssflipsframesisreverse( srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSample(s_sflipsreversesi((spysol.pys startGameL5s 6 ( s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_Classs createGames startGame(((spysol.pysQueenieG5s  sRushdikecBs/tZeiZeZdZdddZRS(NcCsti|ddddSdS(Nswasteistextsi(sRussianSolitaires createGames_(s_((spysol.pys createGameT5siic Cs|xUtdt|iiD]8}|iiid|ii|d|ddd|qW|i |iiid|dS(Nisrowssflipsframesisreverse( srangeslens_sssrowssistalonsdealRowsflipsreversesstartDealSample(s_sflipsreversesi((spysol.pys startGameV5s 6 ( s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsDealRowTalonStacks Talon_Classs createGames startGame(((spysol.pysRushdikeQ5s  s RussianPointcBstZdZRS(NcCs|ii}xSddddddfD]9}|iiid||t||!ddddq%W|i|iiidS(Niiisrowssflipisframes( s_sssrowssrsistalonsdealRowslensstartDealSample(s_sisr((spysol.pys startGame\5s  7 (s__name__s __module__s startGame(((spysol.pys RussianPoint[5ssAbacus_FoundationcBstZdZRS(Nc KsLt|d|ddd|dddtti|||||f|dS(Ns base_ranksmodi sdirismax_movei( s kwdefaultscapssuitsapplysSS_FoundationStacks__init__s_sxsysgame(s_sxsysgamessuitscap((spysol.pys__init__c5s&(s__name__s __module__s__init__(((spysol.pysAbacus_Foundationb5ssAbacus_RowStackcBstZdZRS(NcCsI|id df\}}|i|ijo|i|||ijSdS(Nii (sc1ssuitsdirsmodsc2srank(s_sc1sc2sdirsmod((spysol.pys _isSequenceg5s(s__name__s __module__s _isSequence(((spysol.pysAbacus_RowStackf5ssAbacuscBs>tZeZeZdZdZdddZdZ RS(Nc Cseti|}dddd}t|i|i|i|i d|dddt d |i _dS( Ns#Club: A 2 3 4 5 6 7 8 9 T J Q K s#Spade: 2 4 6 8 T Q A 3 5 7 9 J K s#Heart: 3 6 9 Q 2 5 8 J A 4 7 T K s"Diamond: 4 8 Q 3 7 J 2 6 T A 5 9 Kstextsanchorsswsfonts canvas_fixed( sRushdikes createGames_slshelps MfxCanvasTextscanvassXMsheightsYMsgetFontstexts(s_shelpsl((spysol.pys createGamem5s"cCs|i|dSdS(NcCs"|iddddfj|ifS(Niiii*(scsidssuit(sc((spysol.pysw5s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHookv5sic Cs|iiid|iiddxUtdt|iiD]8}|iiid|ii|d|ddd|q>W|i |iiid|dS(Nsrowssframesiisflipsreverse( s_ssstalonsdealRows foundationssrangeslensrowssisflipsreversesstartDealSample(s_sflipsreversesi((spysol.pys startGamex5s "6 cCsd|id df\}}|i|ijo3|i|||ijp|i|||ijSdS(Nii (scard1ssuitsdirsmodscard2srank(s_sstack1scard1sstack2scard2smodsdir((spysol.pysshallHighlightMatch~5s( s__name__s __module__sAbacus_FoundationsFoundation_ClasssAbacus_RowStacksRowStack_Classs createGames _shuffleHooks startGamesshallHighlightMatch(((spysol.pysAbacusj5s  iisRussian SolitaireiisCastlesInSpaincBsGtZeiZeZeZe Z e Z dZ dddfdZRS(Nc Ks't||if\}}t|ddddt|i|f||i|i d|i d|i |ii i |ii i ||_ x?|iiD]1}|ii|i|i |i ||iqWxE|iiD]7}|ii|i|i |i |ddddqW|idS( Nsrowsi s playcardsi iismax_moves max_accept(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsys foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_slayoutslsssr((spysol.pys createGame5s* / icCsKx*|D]"}|iiid|ddqW|i|iiidS(Nsflipsframesi(sflipsfs_ssstalonsdealRowsstartDealSample(s_sflipsf((spysol.pys startGame5s   (s__name__s __module__sLayoutsbakersDozenLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_Classs AC_RowStacksRowStack_ClasssCautiousDefaultHints Hint_Classs createGames startGame(((spysol.pysCastlesInSpain5s  sMartha_RowStackcBstZdZRS(NcCs=ti||| odSn|ipt|djSdS(Nii(s AC_RowStacks acceptsCardss_s from_stackscardsslen(s_s from_stackscards((spysol.pys acceptsCards5s(s__name__s __module__s acceptsCards(((spysol.pysMartha_RowStack5ssMarthacBs/tZeeZdZdZdZRS(NcCsti|dddddS(Nsrowsi s playcardsi (sCastlesInSpains createGames_(s_((spysol.pys createGame5scCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys5s(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHook5scCs<ti|ddddf|iiid|iidS(Nsflipiisrows(sCastlesInSpains startGames_ssstalonsdealRows foundations(s_((spysol.pys startGame5s(s__name__s __module__sFullStackWrappersMartha_RowStacksRowStack_Classs createGames _shuffleHooks startGame(((spysol.pysMartha5s   s BakersDozencBs5tZeedeZdZdZdZRS(Ns base_rankcCsdt|iif\}}g}x9|D]1}|i t jo|i |n|d}q+Wxr|D]j}||}xW||joI||i t jo'||||f\||<||5si(s BakersDozens _shuffleHooks_scardss_shuffleHookMoveToBottom(s_scards((spysol.pys _shuffleHook5scCsti|dddddfxwtdD]i}|iiid}|i t jpt |i |ii|i d|ii|ii|iq,Wt|iiidjpt dS(Nsflipiiii(sCastlesInSpains startGames_srangesissstalonscardsscsranksACEsAssertionErrorsflipMovesmoveMoves foundationsssuitslen(s_scsi((spysol.pys startGame5s *(s__name__s __module__s createGames _shuffleHooks startGame(((spysol.pys GoodMeasure5s  s Cruel_TaloncBstZdZddZRS(NcCs=|iio|iiidjodSn|ii SdS(Nidi(s_sgamesdemosmovessindexs isGameWon(s_((spysol.pys canDealCards5s#ic Cs3t|iii} d}t|idjptt |iii}|i xT|D]L} xCt t| iD],}|d}|iid| |ddq{Wq_Wt|i|jpt|djodSn|ii||df\}}dg| }|d| } x<| djo.||d||<|d| }| d} q!Wxt | D]}t|||}ddf|ddj} x=t |D]/}|iid||iii|d| qW||}|djoPqjqjW|t|ijo djnpt|SdS(Niisframesii(slens_sgamesssrowsslrs num_cardsscardssAssertionErrorslistsreversesrsrangesismoveMoves nextRoundMovesnsdeals extra_cardssminsksframessj( s_ssoundsrowssdealsisksjs num_cardssnsrslrs extra_cardssframes((spysol.pys dealCards5sF  $     -   .(s__name__s __module__s canDealCardss dealCards(((spysol.pys Cruel_Talon5s sCruelcBsGtZeeddZeedeZdZdZ dZ RS(Ns max_roundsis base_rankcCsti|dddS(Nsrowsi (sCastlesInSpains createGames_(s_((spysol.pys createGame5scCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys6s(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHook5scCs<ti|ddddf|iiid|iidS(Nsflipisrows(sCastlesInSpains startGames_ssstalonsdealRows foundations(s_((spysol.pys startGame6s( s__name__s __module__s StackWrappers Cruel_Talons Talon_Classs SS_RowStacksNO_RANKsRowStack_Classs createGames _shuffleHooks startGame(((spysol.pysCruel5s   iSsCastles in SpainiTis Baker's DozeniUsSpanish PatienceiVs Good MeasureihsFan_HintcBstZRS(N(s__name__s __module__(((spysol.pysFan_Hint6ssFancBsVtZeZeZeZeZ ddddfddZ dZ dZ dZ RS(Niii c Cs)t|dd|if\}}td|i|i|d|i}t d|i|}|dd@}|i |i t|||i dt||i|i ||i f\} }xjt|iiD]V}xMtdD]?}|ii|i| ||d|| ||ii} qWqWxtt|D]}|i ||if\} }xnt||D]\}|i| ||d dd d} |id f\| _| _|i i| | |} quWqBW|i|i|i|if\} }|i | |||_!|i"|SdS( NsXOFFSETi iiiiissuitsmax_moves max_accepti(#sLayouts_ssslsmaxsXSs playcardssXOFFSETswsminssetSizesXMsrowssYMslensYSsxsysrangesgameinfosdeckssjsis foundationssappendsFoundation_ClasssRowStack_Classsstacks CARD_XOFFSETs CARD_YOFFSETswidthsheights Talon_ClassstalonsdefaultStackGroups( s_srowss playcardssisjslssswsysxsstack((spysol.pys createGame6s2!(9 %!& cCs~x:tdD],}|iiid|iid ddq W|i|iiit|iii djpt dS(Nisrowsisframesi( srangesis_ssstalonsdealRowsrowssstartDealSampleslenscardssAssertionError(s_si((spysol.pys startGame-6s  * cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch36scCsfSdS(N((s_((spysol.pysgetHighlightPilesStacks66s(s__name__s __module__sInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssKingSS_RowStacksRowStack_ClasssFan_Hints Hint_Classs createGames startGamesshallHighlightMatchsgetHighlightPilesStacks(((spysol.pysFan6s  sScotchPatiencecBs tZeZeedeZRS(Ns base_rank(s__name__s __module__sAC_FoundationStacksFoundation_Classs StackWrappers RK_RowStacksNO_RANKsRowStack_Class(((spysol.pysScotchPatience86ssShamrocks_RowStackcBstZdZRS(NcCsti||| odSn|id|df\}}|i|id|ii jp|i|id|ii jSdS(Niii( s BasicRowStacks acceptsCardss_s from_stackscardssc1sc2srankscapsmod(s_s from_stackscardssc2sc1((spysol.pys acceptsCards<6s(s__name__s __module__s acceptsCards(((spysol.pysShamrocks_RowStack;6ss ShamrockscBs tZeededdZRS(Ns base_ranks max_cardsi(s__name__s __module__s StackWrappersShamrocks_RowStacksNO_RANKsRowStack_Class(((spysol.pys ShamrocksA6ssLaBelleLucie_TaloncBs;tZdZddZdZdZddZRS(NcCs%|i|ijo|ii SdS(N(s_srounds max_roundssgames isGameWon(s_((spysol.pys canDealCardsD6sicCsm|i}|djodSn|i|o|iin|i|o|iin|SdS(Ni( s_s redealCards1sns redealCards2ssoundsgamesstartDealSamples redealCards3s stopSamples(s_ssoundsn((spysol.pys dealCardsF6s    cCst|idjptd}x]|iiiD]L}|io<|t|i}|ii t|i||ddq3q3Wt|i|jpt|SdS(Nisframes( slens_scardssAssertionErrors num_cardssgamesssrowssrsmoveMove(s_srs num_cards((spysol.pys redealCards1Q6s -cCsO|i|ijpt|ipt|ii||ii|dS(N(s_srounds max_roundssAssertionErrorscardssgamesshuffleStackMoves nextRoundMove(s_((spysol.pys redealCards2Z6sicCs|iii}tt|idt|}xt dD]}|d|dd|ddf|}dddf|}xY|| D]M}|idi|jo|ii|n|iid||d|qWq>WdS(Niiiiiisframes(s_sgamesssrowss to_stackssminslenscardssnsrangesisjsframessrsface_upsflipMovesmoveMove(s_sface_ups to_stackssjsnsisrsframes((spysol.pys redealCards3_6s" ' (s__name__s __module__s canDealCardss dealCardss redealCards1s redealCards2s redealCards3(((spysol.pysLaBelleLucie_TalonC6s   s LaBelleLuciecBs,tZeeddZeedeZRS(Ns max_roundsis base_rank(s__name__s __module__s StackWrappersLaBelleLucie_Talons Talon_Classs SS_RowStacksNO_RANKsRowStack_Class(((spysol.pys LaBelleLuciei6ssSuperFlowerGardencBstZeedeZRS(Ns base_rank(s__name__s __module__s StackWrappers RK_RowStacksNO_RANKsRowStack_Class(((spysol.pysSuperFlowerGardenl6ssThreeShufflesAndADraw_RowStackcBs tZdddZdZRS(Nic Cs|i|iiidf\}}||j o'ti|||d|d|dSn|i }|o|i djo |djpt|i|ddB|id||d|d||i|ddB|i|ddBdp|i o|id d d n|djo d }n|id||d|d||i|i}|id||d|d||i|dS( Nisframessshadowiiiii@sdropspriorityii(s_sgamesssreservessrsto_stacks SS_RowStacksmoveMovesncardssframessshadows _canDrawCardsfs draw_donesAssertionErrorsupdateStackMovesdemos playSamples enterStatesS_FILLs old_states leaveState( s_sncardssto_stacksframessshadowsfs old_statesgamesr((spysol.pysmoveMoveo6s$"  +  cCst|idjoc|idd!}xP|iii|iiiD].}||j o|i||o|SqCqCWnt SdS(Niii( slens_scardsspilesgamesss foundationssrowss acceptsCardssNone(s_ssspile((spysol.pys _canDrawCard6s (s__name__s __module__smoveMoves _canDrawCard(((spysol.pysThreeShufflesAndADraw_RowStackn6ss"ThreeShufflesAndADraw_ReserveStackcBs,tZdZdZdZdZRS(NcCsiti||| odSn||iiij odSn|iip |i odSndSdS(Nii( s ReserveStacks acceptsCardss_s from_stackscardssgamesssrowss draw_dones _canDrawCard(s_s from_stackscards((spysol.pys acceptsCards6scCs1||iijpt|ii |i_dS(N(sundos_sgames draw_donesAssertionError(s_sundosflags((spysol.pys updateModel6scCsd|iidjp|iitjodSnddf|iidj}|iiid|dS(NisXsDrawistext( s_sgamespreviewstextssmiscsNones draw_donestsconfig(s_st((spysol.pys updateText6s&cCsti||i p|iidjodSn|iii}|i|i d|i |i df\}}t |ii ||dd|i_dS(Niisanchorscenter(s ReserveStacks prepareViews_s is_visiblesgamespreviewsappsimagessxsCARDWsysCARDHs MfxCanvasTextscanvasstextssmisc(s_sysimagessx((spysol.pys prepareView6s  .(s__name__s __module__s acceptsCardss updateModels updateTexts prepareView(((spysol.pys"ThreeShufflesAndADraw_ReserveStack6s   sThreeShufflesAndADrawcBsGtZeedeZdZdZdZdZ dZ RS(Ns base_rankcCsqti|}|i}|idi|idif\}}|ii t ||||i d|_ dS(Niii( s LaBelleLucies createGames_slsssrowssxsysreservessappends"ThreeShufflesAndADraw_ReserveStacksdefaultStackGroupss draw_done(s_slsssysx((spysol.pys createGame6s  & cCs.d|_|iiditi|dS(Ni(s_s draw_donesssreservess updateTexts LaBelleLucies startGame(s_((spysol.pys startGame6s cCs|ii|_dS(N(sgamesloadinfos draw_dones_(s_sgame((spysol.pys_restoreGameHook6scCs|iid|idS(Ns draw_done(s_sloadinfosaddattrspsload(s_sp((spysol.pys _loadGameHook6scCs|i|idS(N(spsdumps_s draw_done(s_sp((spysol.pys _saveGameHook6s( s__name__s __module__s StackWrappersThreeShufflesAndADraw_RowStacksNO_RANKsRowStack_Classs createGames startGames_restoreGameHooks _loadGameHooks _saveGameHook(((spysol.pysThreeShufflesAndADraw6s     sTrefoilcBs;tZdZeeddZdZdZdZRS(Nis min_cardsicCs#ti|dddddfSdS(Nsrowsii(sFans createGames_(s_((spysol.pys createGame6scCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys6s(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHook6scCsgx*tdD]}|iiiddq W|i|iii|iiid|iidS(Nisframesisrows(srangesis_ssstalonsdealRowsstartDealSamples foundations(s_si((spysol.pys startGame6s   ( s__name__s __module__s GAME_VERSIONs StackWrappersSS_FoundationStacksFoundation_Classs createGames _shuffleHooks startGame(((spysol.pysTrefoil6s   sIntelligence_TaloncBs&tZeiZdZddZRS(NcCst|idjpt|iiid}t|i}|ii t|i||ddxh|iii D]W}|t|i}x;|io0|ii d||dd|ii |qWqtWt|i|jptt d|ipt|SdS(NisframesicCs|i S(N(scsface_up(sc((spysol.pys6s( slens_scardssAssertionErrorsgamesssreservessrs num_cardssmoveMovesrowssflipMovesforall(s_srs num_cards((spysol.pys redealCards16s% icCsx^|iiiD]M}xDt|idjo-|i|gdd|i odSqqWqW|iit|i||iii ddddS(Nisframesii( s_sgamesssrowssrslenscardss dealToStackssmoveMovesreserves(s_sface_upsr((spysol.pys redealCards36s (s__name__s __module__s TalonStacksdealToStacksOrFoundationss dealToStackss redealCards1s redealCards3(((spysol.pysIntelligence_Talon6s  sIntelligence_RowStackcBstZdZdZRS(NcCsti||| odSn|ipt|id|df\}}|i|ijodSn|i |i d|i i jp|i |i d|i i jSdS(Niii( s BasicRowStacks acceptsCardss_s from_stackscardssAssertionErrorsc1sc2ssuitsrankscapsmod(s_s from_stackscardssc2sc1((spysol.pys acceptsCards6scCsS|i oD|iiid}|io#|id|||fddqOndS(Nisrowsssoundi(s_scardssgamesssreservessrsdealRow(s_sr((spysol.pys fillStack6s  (s__name__s __module__s acceptsCardss fillStack(((spysol.pysIntelligence_RowStack6s sIntelligence_ReserveStackcBstZdZeiZRS(NcCsdSdS(Ni((s_((spysol.pys canFlipCard6s(s__name__s __module__s canFlipCards TalonStacksdealToStacksOrFoundationss dealToStacks(((spysol.pysIntelligence_ReserveStack6s s IntelligencecBs>tZeeddZeedeZdZdZ RS(Ns max_roundsis base_rankc Csti|}|i}|ii|i|iif\}}|i i t |||dddddd|i |i dd|i dS(Nsmax_moveis max_accepts max_cardsi?Bssw(sFans createGames_slssstalonsxsXSsysreservessappendsIntelligence_ReserveStacks createTextsdefaultStackGroups(s_slsssysx((spysol.pys createGame6s  %.cCsw|ii}x$tdD]}|iddqW|i|i|it|i ||ii ddddS(Nisframesi( s_ssstalonsrangesisdealRowsstartDealSamplesmoveMoveslenscardssreserves(s_sistalon((spysol.pys startGame6s    ( s__name__s __module__s StackWrappersIntelligence_Talons Talon_ClasssIntelligence_RowStacksNO_RANKsRowStack_Classs createGames startGame(((spysol.pys Intelligence6s i8s Midnight OiliWsScotch Patiencei9isLa Belle LucieisSuper Flower GardenisThree Shuffles and a DrawiXisBeleagueredCastleType_HintcBstZRS(N(s__name__s __module__(((spysol.pysBeleagueredCastleType_Hint 7ssStreetsAndAlleyscBs#tZeZddZdZRS(Ni c Cst|dd|if\}}td|i|i|d|i}|i } | |d|i } | |id|i }|||i } |i| |id|i| |if\}}xFtdD]8}|iit||||dd||i}qWx| |if||iffD]y\}}xjtdD]\}t|||ddd d} |idf\| _| _|ii| ||i}qDWq+W|i|i|i|if\}}t||||_ |i!dS( NsXOFFSETi iiiismax_moveis max_accept("sLayouts_ssslsmaxsXSs playcardssXOFFSETswsXMsx0sx1sx2sx3ssetSizesYMsYSsxsysrangesis foundationssappendsSS_FoundationStacks RK_RowStacksstacks CARD_XOFFSETs CARD_YOFFSETsrowsswidthsheightsInitialDealTalonStackstalonsdefaultStackGroups( s_s playcardssislsyssswsxsx2sx3sx0sx1sstack((spysol.pys createGame7s.!(  %  &cCsx*tdD]}|iiiddq W|ix$tdD]}|iiiqDWt|iii djpt dS(Nisframesii( srangesis_ssstalonsdealRowsstartDealSamples dealRowAvailslenscardssAssertionError(s_si((spysol.pys startGame$7s   (s__name__s __module__sBeleagueredCastleType_Hints Hint_Classs createGames startGame(((spysol.pysStreetsAndAlleys 7s sBeleagueredCastlecBstZdZdZRS(NcCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys-7s(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHook,7scCsx*tdD]}|iiiddq W|ix$tdD]}|iiiqDW|iiid|iit|iii djpt dS(Nisframesiisrows( srangesis_ssstalonsdealRowsstartDealSamples foundationsslenscardssAssertionError(s_si((spysol.pys startGame.7s   (s__name__s __module__s _shuffleHooks startGame(((spysol.pysBeleagueredCastle+7s sCitadelcBstZdZdZRS(NcCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys87s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook77scCsd}|ii}|i|id|iid|x|iox|iiD]}|i |xe|iiD]>}|i ||ido|i d||d|PqrqrW|i d||d||i oPqRqRWq;WdS(Nisrowssframesii( sframess_ssstalonsstartDealSamplesdealRows foundationsscardssrowssrsflipMoves acceptsCardssmoveMove(s_sframesstalonsssr((spysol.pys startGame97s"        (s__name__s __module__s _shuffleHooks startGame(((spysol.pysCitadel67s sFortress_RowStackcBstZdZRS(NcCsti||| odSn|io|idi|dijodSn|idi|dif\}}|d|i i |jp|d|i i |jSndSdS(Niii( s BasicRowStacks acceptsCardss_s from_stackscardsssuitsranksr1sr2scapsmod(s_s from_stackscardssr1sr2((spysol.pys acceptsCardsJ7s #7(s__name__s __module__s acceptsCards(((spysol.pysFortress_RowStackI7ssFortresscBsGtZeiZeZeZe e ddZ e Z dZdZRS(Ns max_acceptic Ksft||if\}}t|ddddddddt|i|f||i|i d|i d|i |ii i |ii i ||_ |iio+t|iii |iii ||_nxB|iiD]4}|ii|i|i |i |d |iqWx9|iiD]+}|ii|i|i |i |q%W|i|SdS( Nsrowsi swasteistextss playcardsiissuit(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes Talon_Classstalonsxsyswastes WasteStacks foundationssrsappendsFoundation_ClassssuitsrowssRowStack_Classs defaultAll(s_slayoutslsssr((spysol.pys createGameY7s"* + 2 ) cCsx*tdD]}|iiiddq W|ix$tdD]}|iiiqDWt|iii djpt dS(Nisframesi( srangesis_ssstalonsdealRowsstartDealSamples dealRowAvailslenscardssAssertionError(s_si((spysol.pys startGameg7s   (s__name__s __module__sLayoutsklondikeLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_Classs StackWrappersFortress_RowStacksRowStack_ClasssBeleagueredCastleType_Hints Hint_Classs createGames startGame(((spysol.pysFortressS7s  sChessboard_FoundationcBstZdZdZRS(NcKsBt|ddddddtti|||||f|dS(Nsmodi s min_cardsismax_movei( s kwdefaultscapsapplysSS_FoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.pys__init__o7scCs|i ot|djp |di odSn|di|iijodSnx@|iii D]/}|io|di |idi jSqgqgWdSnt i |||SdS(Nii(s_scardsslensface_upssuitscaps base_suitsgamesss foundationssranksSS_FoundationStacks acceptsCardss from_stack(s_s from_stackscardsss((spysol.pys acceptsCardsr7s " #(s__name__s __module__s__init__s acceptsCards(((spysol.pysChessboard_Foundationn7s sChessboard_RowStackcBstZdZRS(NcCsg|iioti||Snx5|iiiD]$}|ioti||Sq1q1Wt dfSdS(Ni( s_sgamesdemosFortress_RowStacks canDropCardssstackssss foundationsscardssNone(s_sstacksss((spysol.pys canDropCards~7s  (s__name__s __module__s canDropCards(((spysol.pysChessboard_RowStack}7ss ChessboardcBs8tZeZeeddddZdZdZRS(Ns max_acceptismodi cCs~ti|}|i|iidd\}}}}t dd|i }t|i||i|d|d||i_dS(Nises canvas_cardscardwsanchorsfont(sFortresss createGames_sls getTextAttrsss foundationsstxstystastfsgetFontsCWsfonts MfxCanvasTextscanvassXMstextssinfo(s_stxstyslstfsfontsta((spysol.pys createGame7s(cCsr|idjodSnd}x7|iiD])}|iot|idi}Pq+q+W|ii i d|dS(Nisistext( s_spreviewstsss foundationsscardssRANKSsrankstextssinfosconfig(s_ssst((spysol.pys updateText7s   ( s__name__s __module__sChessboard_FoundationsFoundation_Classs StackWrappersChessboard_RowStacksRowStack_Classs createGames updateText(((spysol.pys Chessboard7s isStreets and Alleysi"sBeleaguered CastleiiisUnionSquare_FoundationcBstZdZRS(NcCsuti||| odSnt|idjo"|didt|ijSn|dit|ijSdS(Nii i(sAbstractFoundationStacks acceptsCardss_s from_stackscardsslensrank(s_s from_stackscards((spysol.pys acceptsCards7s "(s__name__s __module__s acceptsCards(((spysol.pysUnionSquare_Foundation7ssUnionSquare_RowStackcBs#tZdZdZdZRS(Nc KsTt|dddddtddddtti||||f|d|_ dS( Nsmodi sdiris base_ranks max_acceptismax_move( s kwdefaultscapsANY_RANKsapplys OpenStacks__init__s_sxsysgames CARD_YOFFSET(s_sxsysgamescap((spysol.pys__init__7scCsti||| odSn|i odSn|di|idijodSnt|idjo6|di|idi}|djp |djSnR|idi|idi|i i }|idi||i i |dijSdS(Niii( s OpenStacks acceptsCardss_s from_stackscardsssuitslensrankscard_dirscapsmods stack_dir(s_s from_stackscardss stack_dirscard_dir((spysol.pys acceptsCards7s (cCs|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage7s(s__name__s __module__s__init__s acceptsCardssgetBottomImage(((spysol.pysUnionSquare_RowStack7s  s UnionSquarecBs2tZeZdZdZdZdZRS(Nc Cst|dd|if\}}|i|id|i|id|i|i|if\}}t |||dd|_ |i |i d||i}t||||_|i |idxntdD]`}d|i}x=tdD]/}|iit|||||i}qW||i}qWd |i|if\}}xhtdD]Z}t||||d d d d d d}|i |d|ii|||i}qbW|idS(NsYMii is max_roundsissiismax_moveisdirs max_cardsissw(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysWasteTalonStackstalons createTexts WasteStackswastesrangesisjsrowssappendsUnionSquare_RowStacksUnionSquare_Foundationsstacks foundationssdefaultStackGroups(s_sisjslsssysxsstack((spysol.pys createGame7s2!,     cCs.|i|iii|iiidS(N(s_sstartDealSamplessstalonsdealRows dealCards(s_((spysol.pys startGame7s cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch7scCsfSdS(N((s_((spysol.pysgetHighlightPilesStacks7s(s__name__s __module__sCautiousDefaultHints Hint_Classs createGames startGamesshallHighlightMatchsgetHighlightPilesStacks(((spysol.pys UnionSquare7s    i#s Union SquaresWindmill_FoundationcBstZdZRS(NcCs>|iitjo|iiiitSnti |SdS(N( s_scaps base_ranksACEsgamesappsimagess getLettersRK_FoundationStacksgetBottomImage(s_((spysol.pysgetBottomImage7s(s__name__s __module__sgetBottomImage(((spysol.pysWindmill_Foundation7ssWindmill_RowStackcBstZdZRS(NcCs6ti||| odSn||iiijSdS(Ni(s ReserveStacks acceptsCardss_s from_stackscardssgamessswaste(s_s from_stackscards((spysol.pys acceptsCards7s(s__name__s __module__s acceptsCards(((spysol.pysWindmill_RowStack7ssWindmillcBsJtZdZdZdZdZdZdZedZ RS(Nc Csxt|dd|if\}}|id|i|id|i|i|i|i}|i}t |||dd|_ |i |i d||i}t||||_|i |id||i|f\}}xdd fddfd dfddfd dfd dfdd fdd ffD]R}||d |i||d|if\}}|iit|||q1W|d|i|d|if\}}|iit|||d d ddddxddfd dfddfd dffD]^}||d |i||d|if\}}|iit|||dtddqW|idS(NsXMiiis max_roundsisssiiiismodi s min_cardss max_cardsi4f0.59999999999999998f3.3999999999999999s base_ranksdiri(sLayouts_ssslssetSizesXSsXMsYSsYMsxsysWasteTalonStackstalons createTexts WasteStackswastesx0sy0sdsrowssappendsWindmill_RowStacks foundationssWindmill_FoundationsKINGsdefaultStackGroups(s_sy0sdslsssysxsx0((spysol.pys createGame7s.!3   O0 (+0cCsBx#|D]}|idjoPqqW|i|||gSdS(Ni(scardsscsidsremove(s_scardssc((spysol.pys _shuffleHook8s   cCsQ|i|iiid|iidf|iii|iiidS(Nsrowsi(s_sstartDealSamplessstalonsdealRows foundationss dealCards(s_((spysol.pys startGame8s #cCst|idjox||iijo |iiio|iiiq||iijo |iiio|iii d|qndS(Nii( slensstackscardss_ssswastestalons dealCardssrowssmoveMove(s_sstack((spysol.pys fillStack 8s ##cCs/|id|ijp|id|ijSdS(Ni(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch8scCsfSdS(N((s_((spysol.pysgetHighlightPilesStacks8scCsffffSdS(N((s_sevent((spysol.pys getAutoStacks8s( s__name__s __module__s createGames _shuffleHooks startGames fillStacksshallHighlightMatchsgetHighlightPilesStackssNones getAutoStacks(((spysol.pysWindmill7s      is Pyramid_HintcBstZdZRS(NcCs-||iiif}ti|||SdS(N(srowss_sgamessstalons DefaultHintsstep010s dropstacks(s_s dropstackssrows((spysol.pysstep0108s(s__name__s __module__sstep010(((spysol.pys Pyramid_Hint8ssPyramid_StackMethodscBs8tZdZdZdddZdddZRS(NcCs|iodSn||jp|i pt|djodSn|id}|io&|dio|di|idjSdS(Niiii (s_sbasicIsBlockeds from_stackscardsslenscsface_upsrank(s_s from_stackscardssc((spysol.pys acceptsCards 8s  + cCs|i odSn|id}|io|itjo |i oA|iiddd|i d|ii i ddddSndSdS(Niisautodropspriorityiissound( s_scardsscsface_upsranksKINGsbasicIsBlockedsgames playSamples playMoveMovesss foundations(s_seventsc((spysol.pys_dropKingClickHandler'8s  (#icCs|iiddd|djo|i||idgpt|ii|ii }|ii i d}|ii|||d|d||ii|||d|d||ii||i|idS( Nsdroppairspriorityiiiisframessshadow(s_sgames playSamplesns acceptsCardss other_stackscardssAssertionErrors enterStatesS_FILLs old_statesss foundationssfsmoveMovesframessshadows leaveStates fillStack(s_sns other_stacksframessshadowsfs old_state((spysol.pys _dropPairMove08s1"" cCsf||iiijo0|ii|||d|d||i n|i ||ddd|dS(Nsframessshadowi( sto_stacks_sgamesss foundationssmoveMovesncardssframessshadows fillStacks _dropPairMove(s_sncardssto_stacksframessshadow((spysol.pysmoveMove:8s"(s__name__s __module__s acceptsCardss_dropKingClickHandlers _dropPairMovesmoveMove(((spysol.pysPyramid_StackMethods8s   sPyramid_FoundationcBstZdZRS(NcCs4ti||| odSn|ditjSdS(Ni(sAbstractFoundationStacks acceptsCardss_s from_stackscardssranksKING(s_s from_stackscards((spysol.pys acceptsCardsA8s(s__name__s __module__s acceptsCards(((spysol.pysPyramid_Foundation@8ss Pyramid_TaloncBs#tZdZdZdZRS(NcCs,|i|odSnti||SdS(Ni(s_s_dropKingClickHandlerseventsFaceUpWasteTalonStacks clickHandler(s_sevent((spysol.pys clickHandlerF8scCs+ti| odSn|ii SdS(Ni(sFaceUpWasteTalonStacks canDealCardss_sgames isGameWon(s_((spysol.pys canDealCardsJ8scCsh|ioP|id}x@|D]4}||j o|i||o|dfSqqWntdfSdS(Niii(s_scardssstackssss acceptsCardssNone(s_sstacksscardsss((spysol.pys canDropCardsN8s   (s__name__s __module__s clickHandlers canDealCardss canDropCards(((spysol.pys Pyramid_TalonE8s  s Pyramid_WastecBstZdZRS(NcCs,|i|odSnti||SdS(Ni(s_s_dropKingClickHandlersevents WasteStacks clickHandler(s_sevent((spysol.pys clickHandlerV8s(s__name__s __module__s clickHandler(((spysol.pys Pyramid_WasteU8ssPyramid_RowStackcBshtZdZdddddddddddddddddddddfZdZd ZRS( Nc Cs/ti||||ddddd|_dS(Ns max_acceptis max_cardsi(s OpenStacks__init__s_sxsysgames CARD_YOFFSET(s_sxsysgame((spysol.pys__init__[8s"iiiiiicCs|iii|if\}}|idf\}}x^|djoP|||}|d}x1t |||D]}||i odSqoqoWq6WdSdS(Niii( s_sgamesssrowssSTEPsrsstepsidsisnsrangesjscards(s_sisjsnsstepsr((spysol.pysbasicIsBlocked_8s  cCs,|i|odSnti||SdS(Ni(s_s_dropKingClickHandlersevents OpenStacks clickHandler(s_sevent((spysol.pys clickHandleri8s(s__name__s __module__s__init__sSTEPsbasicIsBlockeds clickHandler(((spysol.pysPyramid_RowStackZ8s E sPyramidcBs8tZeZddZdZedZdZRS(Nic CsMt||if\}}|i|id|i|id|ixt dD]~}|id||id} |i||id} xAt |dD]/}|iit| | || |i} qWqTW|i|if\} } t| | |ddd d|_|i|id |i|id \}}} }t|i||d | |ii_| |i} t| | |d d|_|i|id |i|i|if\} } |i it!| | |d t"dddt#dddd|ig|ig|i$_%|i|i$i%|i$_&|i|i$i%|i$_'dS(Ni iiiiis max_roundsis max_acceptssesnesanchorssuitsdiris base_ranksmax_moves max_cardsi4((sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisxsysjsrowssappendsPyramid_RowStacks Pyramid_Talonstalons createTexts getTextAttrstxstystastfs MfxCanvasTextscanvasstextssroundss Pyramid_Wasteswasteswidths foundationssPyramid_FoundationsANY_SUITsANY_RANKssgs talonstackss openstackss dropstacks( s_srowsstxstysisjslstfsssxsysta((spysol.pys createGameo8s2, !!$ cCs.|i|iii|iiidS(N(s_sstartDealSamplessstalonsdealRows dealCards(s_((spysol.pys startGame8s cCs|ii|iiffSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks8scCs|i|idjSdS(Ni (scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch8s( s__name__s __module__s Pyramid_Hints Hint_Classs createGames startGamesNones getAutoStackssshallHighlightMatch(((spysol.pysPyramidm8s    sRelaxedPyramidcBstZdZRS(NcCs&t|iit|iijSdS(N(sgetNumberOfFreeStackss_sssrowsslen(s_((spysol.pys isGameWon8s(s__name__s __module__s isGameWon(((spysol.pysRelaxedPyramid8ssThirteencBstZdZdZRS(NcCst||if\}}|id|i|id|i|ixt dD]}|id||id}|i|i||id}xAt |dD]/}|iit|||||i}qWqTW|i|if\}}t|||dd|_|i|id||i}t||||_|i|idd|i_|i|i|if\}}|iit|||d td d d td d dd|ig|ig|i_|i|ii|i_|i|ii|i_dS(Niiiiis max_roundsssissuitsdiris base_ranksmax_moves max_cardsi?B( sLayouts_ssslssetSizesXSsXMsYSsYMsrangesisxsysjsrowssappendsPyramid_RowStacksWasteTalonStackstalons createTexts Pyramid_Wasteswastes CARD_XOFFSETswidths foundationssPyramid_FoundationsANY_SUITsANY_RANKssgs talonstackss openstackss dropstacks(s_sisjssslsysx((spysol.pys createGame8s0,   cCsd|i|iiid|iid dd|iiid|iid|iiidS(Nsrowsisflipi(s_sstartDealSamplessstalonsdealRowsrowss dealCards(s_((spysol.pys startGame8s & (s__name__s __module__s createGames startGame(((spysol.pysThirteen8s i&isRelaxed PyramidsPileOn_RowStackcBstZdZRS(NcCs|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage8s(s__name__s __module__sgetBottomImage(((spysol.pysPileOn_RowStack8ssPileOncBs5tZeZddZdZdZdZRS(Nic Cst|dd|if\}}td|i|i|d|id|i}|i |id||i d|i |i }xtdD]}|i}xtdD]x}t|||dddd} |idf\| _| _|ii| ||}|d jo |djoPqqW||i }qW|i|i|i|i f\}}t||||_|i|i_|ig|i_|i|i_dS( NsXOFFSETiiiisdiris max_cardsi( sLayouts_ssslsmaxsXSs playcardssXOFFSETsXMswssetSizesYMsYSsysrangesisxsjsPileOn_RowStacksstacks CARD_XOFFSETs CARD_YOFFSETsrowssappendswidthsheightsInitialDealTalonStackstalonssgs openstackss talonstackss dropstacks( s_s playcardssisjslssswsxsysstack((spysol.pys createGame8s*!3)      &cCs|iid }x0tdD]"}|iiid|ddqW|i|iiid|t |iii djpt dS(Ni isrowssframesi( s_sssrowssrsrangesistalonsdealRowsstartDealSampleslenscardssAssertionError(s_sisr((spysol.pys startGame8s   cCs_xT|iiD]F}|io6t|idjp|i|i odSqSq q WdSdS(Niii(s_sssrowssrscardsslens _isSequence(s_sr((spysol.pys isGameWon8s   *cCs|i|ijSdS(N(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch8s(s__name__s __module__s DefaultHints Hint_Classs createGames startGames isGameWonsshallHighlightMatch(((spysol.pysPileOn8s    i)s Bristol_HintcBs#tZdZdZdZdZRS(NicCsr||iiij o8|d}t|t|ijod|fSqOnt i |||||||SdS(Ni'i(srs_sgamesssreservessscoreslenspilescardsscolorsCautiousDefaultHints_getMovePileScorestsrpile(s_sscorescolorsrstspilesrpile((spysol.pys_getMovePileScore8s  (s__name__s __module__sBONUS_CREATE_EMPTY_ROWsBONUS_CAN_DROP_ALL_CARDSsBONUS_CAN_CREATE_EMPTY_ROWs_getMovePileScore(((spysol.pys Bristol_Hint8ss Bristol_TaloncBstZddZRS(NicCs#|id|iiid|SdS(Nsrowsssound(s_s dealRowAvailsgamesssreservesssound(s_ssound((spysol.pys dealCards8s(s__name__s __module__s dealCards(((spysol.pys Bristol_Talon8ssBristolcBs2tZeiZeZdZdZdZ RS(Nc KsMt|dd|if\}}|i|id|i|id|i|id|i|if\}}xCt dD]5}|i it|||dd||i}q}Wxt dD]}|i|dd|id}xyt dD]k}|i|d|id}t|||d tdd }|idf\|_|_|ii|qWqW|id|i|id|if\}}t||||_|i|id xIt dD];}||i}|iit|||d dd dqW|i |i|i_|ig|i_|i|i|i_ dS(NsXOFFSETi iiismax_moveiis base_rankissws max_accepts max_cardsi?B(!sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsRK_FoundationStacksjs RK_RowStacksNO_RANKsstacksXOFFSETs CARD_XOFFSETs CARD_YOFFSETsrowss Bristol_Talonstalons createTextsreservess ReserveStackssgs openstackss talonstackss dropstacks( s_slayoutsisjslsssxsysstack((spysol.pys createGame8s4!,# "   .  ,cCsdt|iif\}}g}x=|d D]1}|i t jo|i |n|d}q/Wxr|D]j}||}xW||joI||i t jo'||||f\||<||f9ssrowsssound(sfilters_sgamesssrowss dealRowAvailssound(s_ssoundsrows((spysol.pys dealCardse9s(s__name__s __module__s dealCards(((spysol.pysRussianAces_Talond9ss RussianAcescBstZeZRS(N(s__name__s __module__sRussianAces_Talons Talon_Class(((spysol.pys RussianAcesj9ssPerpetualMotion_TaloncBstZdZddZRS(NcCs=|iio|iiidjodSn|ii SdS(Nii(s_sgamesdemosmovessindexs isGameWon(s_((spysol.pys canDealCardsm9s#icCs|ioti|d|Sn|it|if\}}t|i i }|i xe|D]]}xT|ioI|d}|i d||dd|idio|i|qlqlWqcWt|i|jptti|d|SdS(Nssoundisframesii(s_scardssDealRowTalonStacks dealCardsssoundsgameslens num_cardsslistsssrowssreversesrsmoveMovesface_upsflipMovesAssertionError(s_ssoundsrowss num_cardssgamesr((spysol.pys dealCardsq9s    (s__name__s __module__s canDealCardss dealCards(((spysol.pysPerpetualMotion_Talonl9s sPerpetualMotion_FoundationcBstZdZRS(NcCs3ti||| odSnt|ddSdS(Nisdir(sAbstractFoundationStacks acceptsCardss_s from_stackscardssisRankSequence(s_s from_stackscards((spysol.pys acceptsCards9s(s__name__s __module__s acceptsCards(((spysol.pysPerpetualMotion_Foundation9ssPerpetualMotion_RowStackcBstZdZRS(NcCs|i}| pt|djotdfSnx<|D]4}||j o|i||o|dfSq<q<WtdfSdS(Nii(s_sgetPilespileslensNonesstackssss acceptsCards(s_sstacksssspile((spysol.pys canDropCards9s  (s__name__s __module__s canDropCards(((spysol.pysPerpetualMotion_RowStack9ssPerpetualMotioncBs#tZdZdZdZRS(NcKsct||if\}}|i|id|i|id|i|i|if\}}t |||dd|_ |i |i d|d|id}xItdD];}|iit|||dd d t||i}qW|id |i}t|||td td d dd dddd}|i |d|ii||idS(Niis max_roundsisssiisdiris base_rankis max_cardsi4smax_moves min_accepts max_accept(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysPerpetualMotion_Talonstalons createTextsrangesisrowssappendsPerpetualMotion_RowStacksNO_RANKsPerpetualMotion_FoundationsANY_SUITsANY_RANKsstacks foundationssdefaultStackGroups(s_slayoutsislsstacksssxsy((spysol.pys createGame9s", ( cCs|i|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_((spysol.pys startGame9s cCs|i|ijSdS(N(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch9s(s__name__s __module__s createGames startGamesshallHighlightMatch(((spysol.pysPerpetualMotion9s  isAces UpsIdiot's Delightiis Russian AcesisPerpetual Motions First Laws Montana_HintcBstZdZRS(Nc Cs|i}|i|i|if\}}}td|ii} x<|iiD].}|i oqOnt |i djo|i di pt |i d|i gf\}}} |i|djo|ii|id} nt} |i|joqOnxw| D]o} |i|| || oP| o| i od|i| i di}nd}|i|d|| q q WqOWdS(NcCs|i S(N(ssscards(ss((spysol.pys9siiii@iP(s_sgamesRLENsRSTEPsRBASEsfiltersssrowssfreerowssrscardsslensface_upsAssertionErrorscspilesrpilesidsleftsNonesranksts shallMovePilesKsscoresaddHint( s_scsscoresRSTEPsRLENsRBASEsgamesrspilestsrpilesfreerowssleft((spysol.pys computeHints9s* !  ."(s__name__s __module__s computeHints(((spysol.pys Montana_Hint9ss Montana_TaloncBs&tZdZddZdZRS(NcCs%|i|ijo|ii SdS(N(s_srounds max_roundssgames isGameWon(s_((spysol.pys canDealCards9sicCs|i} | i| i| if\}}}d} t|idjpt| i i }g}t gd} x[tdD]M}||}||}|io|idi|jo d|idif\}} ndtf\}} xt|D]} ||| }|oK|i p/|idi| jp|idi|| jo d}qYn| oa|i|| |t jo|| |}|ii|i|||dddd||i}qWq]W|i|id|id}|i||i|i |dd |_|io|iit|n|idS( NsXMiis max_acceptis max_cardsis max_roundsi(sLayouts_ssslssetSizesXMsRSTEPsXSsYMsYSsrangesisxsysjsrowssappendsRowStack_Classs Talon_ClasssheightstalonsRBASEs internalssInvisibleStacksdefaultStackGroups(s_sisjssslsysx((spysol.pys createGame :s!/ #+( cCsd}xtdD]}|iiid}|it jo&|iii d|ii ddq|djo |djo|i d}n|iii d|ii |fd|qWt|iiidjptdS(Nii4isrowssframesi'i(sframessrangesis_ssstalonscardsscsranksACEsdealRows internalssstartDealSamplesrowsslensAssertionError(s_scsisframes((spysol.pys startGame:s &  -cCs|ii}xtd|i|iD]}||i odSn||idi}xqt|idD]\}|||}|i p2|idi |i |jp|idi|jodSqjqjWq%WdSdS(Niii( s_sssrowssrangesRLENsRSTEPsiscardsssuitsjsrsranksRBASE(s_srowssisjsrssuit((spysol.pys isGameWon":s @cCsfSdS(N((s_((spysol.pysgetHighlightPilesStacks-:scCs|iif|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks/:scCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch1:scCsO|io=|i|idjo|idi|ijodSqGndSdS(Niii(s from_stackscardssids_sRSTEPsranksRBASE(s_sncardss from_stacksto_stack((spysol.pysgetQuickPlayScore4:s 1 (s__name__s __module__s Montana_Talons Talon_ClasssMontana_RowStacksRowStack_Classs Montana_Hints Hint_ClasssRLENsRSTEPsRBASEs createGames startGames isGameWonsgetHighlightPilesStackssNones getAutoStackssshallHighlightMatchsgetQuickPlayScore(((spysol.pysMontana:s   s Spaces_TaloncBstZdZRS(NcCs]g}xLt|djo8|iii|}||j o|i|q q W|SdS(Ni( sspacesslens_sgamesrandomschoicesstackssrsappend(s_sstackssgapssspacessr((spysol.pysgetRedealSpaces::s(s__name__s __module__sgetRedealSpaces(((spysol.pys Spaces_Talon9:ssSpacescBstZeZRS(N(s__name__s __module__s Spaces_Talons Talon_Class(((spysol.pysSpacesA:ssBlueMooncBs)tZdddf\ZZZdZRS(Ni8iicCsd}d}xtdD]y}|ddjo|d}n|djo|id}n|iiid|ii |fd||d}qWt |iii djpt t d |ii }d}x5|D]-}|id||ii ||d}qWdS( Nii4iii'isrowssframescCs|io|iditjS(Ni(srscardssranksACE(sr((spysol.pysQ:s(sframessjsrangesis_sstartDealSamplessstalonsdealRowsrowsslenscardssAssertionErrorsfiltersace_rowssrsmoveMove(s_sisjsrsframessace_rows((spysol.pys startGameE:s$    )#(s__name__s __module__sRLENsRSTEPsRBASEs startGame(((spysol.pysBlueMoonC:ssRedMooncBstZdZdZRS(NcCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pysX:s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHookW:scCsd}|ii}|iiid|d|d|d|dfd|xjtdD]\}|djo|i d}n|dd }|iiid|||d !d|qWWdS( Nisrowsiii*sframesiiii ( sframess_sssrowssrstalonsdealRowsrangesisstartDealSamplesn(s_sisnsrsframes((spysol.pys startGameY:s 8    (s__name__s __module__s _shuffleHooks startGame(((spysol.pysRedMoonV:s i5ssisncardssGapsiti?s Blue MooniusRed MoonsPasDeDeux_HintcBstZdZdZRS(NcCsXd}|i|idjo|d}n|i|idjo|d}n|SdS(Nii i(sdscardsranksstacksidssuit(s_sstackscardsd((spysol.pys getDistancen:s cCs>g}x<|iiiD]+} | i| io|i| PqqWx|D]} |i| | id}| i d| i df\}}t |ddt d|d|d} x}| D]u} |iii| }|| joqn|i| | ipt|i||id}|i|| id} |i| |id} ddf\}}|iiiidjoddf\}}n|ii|idi d}no||iiiijo|d}nt|||||| || d}|d jo|i|d| |qqWqLWdS( Nii i4iiiiii(srowss_sgamesssrs canMoveCardsscardssappends getDistancesr1_dsidscolumnsrowsranges stack_idssists acceptsCardssAssertionErrorst1_dsr2_dst2_dsrwstwstalonsroundscswastesintsscoresaddHint(s_scsrowssscorescolumnstwsrwst1_dstsisrsr2_ds stack_idsst2_dsr1_dsrow((spysol.pys computeHintsu:s:   +  , (s__name__s __module__s getDistances computeHints(((spysol.pysPasDeDeux_Hintm:s sPasDeDeux_WastecBstZdZRS(NcCsdSdS(Ni((s_((spysol.pys canFlipCard:s(s__name__s __module__s canFlipCard(((spysol.pysPasDeDeux_Waste:ssPasDeDeux_RowStackcBsPtZdZdZdddZdddZdZeedZRS(NcCsti|| odSn|iiii odSn|iiiid}|io+|di |i jo|di |i jSdS(Nii( s ReserveStacks canMoveCardss_scardssgamessswastescsface_upssuitsrank(s_scardssc((spysol.pys canMoveCards:s cCs6ti||| odSn|ii||SdS(Ni(s ReserveStacks acceptsCardss_s from_stackscardssgames isNeighbour(s_s from_stackscards((spysol.pys acceptsCards:sicCs|djo||iiijptt|idjpt|i ||dddd|iii i o|iii i n;|iii idipt|ii|iii dS(Nisframesisshadowi(sncardssto_stacks_sgamesssrowssAssertionErrorslenscardss _swapPairMovestalons canDealCardss dealCardsswastesface_upsflipMove(s_sncardssto_stacksframessshadow((spysol.pysmoveMove:s*!cCs|i}|i|i}|iid}|i|||dd|i|||d|d||i|||dd|i |dS(Nisframessshadow(s_sgames enterStatesS_FILLs old_statesss internalssswapsmoveMovesns other_stacksframessshadows leaveState(s_sns other_stacksframessshadows old_statesgamesswap((spysol.pys _swapPairMove:s cCs'|id}|iiii|SdS(Ni (s_sidssuitsgamesappsimagess getSuitBottom(s_ssuit((spysol.pysgetBottomImage:s cCsqxf|iiiD]U}|i|io<|i||io!|it |i|dSnPqqWdSdS(Nii( s_sgamesssrowssrs canMoveCardsscardss acceptsCardss playMoveMoveslen(s_sevents from_stackss to_stackssr((spysol.pysquickPlayHandler:s ( s__name__s __module__s canMoveCardss acceptsCardssmoveMoves _swapPairMovesgetBottomImagesNonesquickPlayHandler(((spysol.pysPasDeDeux_RowStack:s     s PasDeDeuxcBsPtZeZdZdZdZedZdZ dZ dZ RS(Nc Cst|dd|if\}}|i|id|i|id|ixt dD]s}xjt dD]\}|i||i|i||if\}}|iit|||ddddqmWqZW|id|i|i|if\}}t|||d d|_|i|id t|i||i|d d |ii_||i}t|||d d|_|i|id|iit||idS(NsXMii is max_acceptis max_cardsis max_roundsssesanchorsnwsmax_moveissw(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappendsPasDeDeux_RowStackswidthsheightsWasteTalonStackstalons createTexts MfxCanvasTextscanvasstextssroundssPasDeDeux_Wasteswastes internalssInvisibleStacksdefaultStackGroups(s_sisjssslsysx((spysol.pys createGame:s$!,  .0* " cCs|idS(N(s_sshuffleSeparateDecks(s_((spysol.pysshuffle:scCs4|i|iiidd|iiidS(Nsframesi(s_sstartDealSamplessstalonsdealRows dealCards(s_((spysol.pys startGame:s cCsff|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks:scCsxu|iiD]g}t|idjodSn|id}|i|idjp|i |idjodSq q WdSdS(Niiii ( s_sssrowssrslenscardsscssuitsidsrank(s_scsr((spysol.pys isGameWon:s  . cCs[|id|idf\}}|id|idf\}}||jp ||jSdS(Ni (sstack1sidscolumn1srow1sstack2scolumn2srow2(s_sstack1sstack2srow1srow2scolumn1scolumn2((spysol.pys isNeighbour:s  cCs|iidffSdS(Ni(s_sssrows(s_((spysol.pysgetHighlightPilesStacks:s( s__name__s __module__sPasDeDeux_Hints Hint_Classs createGamesshuffles startGamesNones getAutoStackss isGameWons isNeighboursgetHighlightPilesStacks(((spysol.pys PasDeDeux:s      is Pas de DeuxsRoyalCotillion_FoundationcBstZdZRS(NcCsM|iidjo|iiiidSn|iiii|iiSdS(Ni( s_scaps base_ranksgamesappsimagess getLetters getSuitBottoms base_suit(s_((spysol.pysgetBottomImage:s(s__name__s __module__sgetBottomImage(((spysol.pysRoyalCotillion_Foundation:ssRoyalCotillioncBs>tZeZdZdZdZdZedZ RS(Nc Cspt||if\}}|i|id|i|id|ixYt dD]K}|i||i|if\}}|i it|||ddqTWxt dD]}|id|i|i||if\}}|ii|i||||dddd||i}|ii|i||||ddddd d qWxt dD]q}xht dD]Z}|i|d |i|i||if\}}|iit|||ddqwWqdW|i|i|i|if\}}t|||d d |_|i|id ||i}t||||_|i|id|idS(Ni is max_acceptisdirismodi s base_rankiis max_roundssswsse(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisxsysrowssappends BasicRowStacks foundationssFoundation_Classsjsreservess ReserveStacksheightsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_sisjssslsysx((spysol.pys createGame:s2, #& .. 8  2*& cCsg|iiid|iidd|ix$tdD]}|iiiq9W|iiidS(Nsrowssframesii( s_ssstalonsdealRowsreservessstartDealSamplesrangesis dealCards(s_si((spysol.pys startGame;s "  cCs|i o|i|i}||iijo |iiio|iii n>||ii jo |iiio|iii d|n|i |ndS(Ni( sstackscardss_s enterStatesS_FILLs old_statessswastestalons dealCardssreservessmoveMoves leaveState(s_sstacks old_state((spysol.pys fillStack ;s ##cCsfSdS(N((s_((spysol.pysgetHighlightPilesStacks;scCsM|tjo|iif|iifSn |ii|ii|iifSdS(N(seventsNones_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks;s ( s__name__s __module__sRoyalCotillion_FoundationsFoundation_Classs createGames startGames fillStacksgetHighlightPilesStackssNones getAutoStacks(((spysol.pysRoyalCotillion:s     s OddAndEvencBstZdZdZRS(Nc Cs<t||if\}}|i|id|i|id|i|i|if\}}xOt dD]A}|i i|i||||dddd||i}qlWxUt dD]G}|i i|i||||dddddd||i}qWxt dD]}|idd f||i|i|d|if\}}xMt dd f|D]5}|iit|||d d ||i}qoWqW|i|i|if\}}t|||d d|_|i|id||i}t||||_|i|id|idS(Niisdirismodi s base_rankiiis max_acceptis max_roundssnn(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsFoundation_Classsjsreservess ReserveStacksheightsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_sisjslsssysx((spysol.pys createGame;s2, . 4 <" cCs:|i|iiid|ii|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRowsreservess dealCards(s_((spysol.pys startGame/;s (s__name__s __module__s createGames startGame(((spysol.pys OddAndEven;s sKingdomcBs)tZeZdZdZdZRS(NcCst||if\}}|i|id|i|id|i|i|if\}}xCt dD]5}|i i|i|||t||i}qlW|i||if\}}xCt dD]5}|iit|||dd||i}qW|id|i|d|idf\}}t|||dd|_|i|id ||i}t||||_|i|id |idS( Niis max_acceptiiis max_roundsisswsse(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsFoundation_ClasssANY_SUITsreservess ReserveStacksWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_sislsssysx((spysol.pys createGame5;s&, " "/ cCs|i|ddSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pysH;si(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHookG;scCs]|i|iiid|iidf|iiid|ii|iiidS(Nsrowsi(s_sstartDealSamplessstalonsdealRows foundationssreservess dealCards(s_((spysol.pys startGameI;s #(s__name__s __module__sRK_FoundationStacksFoundation_Classs createGames _shuffleHooks startGame(((spysol.pysKingdom3;s  sAlhambra_WastecBstZdZRS(NcCsti||| odSn|i odSn|id|df\}}|i|ijo?|id|i i |ijp|id|i i |ijSdS(Niii( s WasteStacks acceptsCardss_s from_stackscardssc1sc2ssuitsrankscapsmod(s_s from_stackscardssc2sc1((spysol.pys acceptsCardsO;s  (s__name__s __module__s acceptsCards(((spysol.pysAlhambra_WasteN;ssAlhambracBs#tZdZdZdZRS(NcCs t||if\}}|i|id|i|id|i|i|if\}}xIt dD];}|i it|||d|dd||i}qlWxUt dD]G}|i it|||d|dddtdd||i}qW|i||if\}}xCt dD]5}|iit|||d d||i}q,W|id |i|d |if\}}t|||d d |_|i|id ||i}t|||ddd d|_|i|id|ii|i|idS(Niissuitsmax_moveis base_ranksdiris max_acceptiis max_roundssswsmodi isse(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis foundationssappendsSS_FoundationStacksKINGsreservess BasicRowStacksWasteTalonStackstalons createTextsAlhambra_WasteswastesrowssdefaultStackGroups(s_sislsssysx((spysol.pys createGameW;s2, ( ! "+ !cCs|i|ddSdS(NcCs5|idjo|iddfj|i|iffS(Nii (scsdecksrankssuit(sc((spysol.pyso;si(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHookn;scCs|iiid|iiddx6tdD](}|iiid|iiddq/W|i|iiid|iidS(Nsrowssframesii( s_ssstalonsdealRows foundationssrangesisreservessstartDealSample(s_si((spysol.pys startGamep;s " & (s__name__s __module__s createGames _shuffleHooks startGame(((spysol.pysAlhambraV;s  sCarpetcBs)tZeZdZdZdZRS(Nc Cst||if\}}|i|id|i|id|ixyt dD]k}xbt dD]T}|i|d|i|i||if\}}|iit|||qgWqTWxt dD]}ddfddfddfddff|\}}|i||i|i||if\}}|ii|i||||qW|i|if\}}t|||dd|_|i|id ||i}t||||_|i|id |idS( Ni iiiiiis max_roundssse(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappends ReserveStacksdxsdys foundationssFoundation_ClasssWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups( s_sisjssslsdxsdysysx((spysol.pys createGamex;s(,  2$ 4.& cCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys;s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook;scCsJ|i|iiid|ii|iii|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss dealCards(s_((spysol.pys startGame;s (s__name__s __module__sSS_FoundationStacksFoundation_Classs createGames _shuffleHooks startGame(((spysol.pysCarpetv;s  i6sRoyal Cotillioni7s Odd and EveniiiasOsmosis_FoundationcBstZdZRS(NcCsti||| odSnt|djpttdf\}}xL|i i i D];}t|i|jo|t|if\}}q[q[Wt|i|jo3|di |it|ii jodSqndSdS(Niii(sAbstractFoundationStacks acceptsCardss_s from_stackscardsslensAssertionErrorsNonesmax_ss max_cardssgamesss foundationssrank(s_s from_stackscardssssmax_ss max_cards((spysol.pys acceptsCards;s#' (s__name__s __module__s acceptsCards(((spysol.pysOsmosis_Foundation;ssOsmosiscBs#tZdddZddZRS(Niic Cst|dd|if\}}|i|id|i|id|i|i|if\}}xjt dD]\}t |||dddd}|idf\|_|_|ii|||i}qrW|id |i|if\}}xmt dD]_}t||||d tdd}|idf\|_|_|ii|||i}qW|i|i|i|if\}}t|||d |d ||_|i|id ||i}t||||_|i|id |idS(NsXOFFSETi iismax_moveis max_acceptiis base_ranks max_roundssnum_dealssw( sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesis RK_RowStacksstacksXOFFSETs CARD_XOFFSETs CARD_YOFFSETsrowssappendsOsmosis_FoundationsANY_RANKs foundationsswidthsWasteTalonStacks max_roundssnum_dealstalons createTexts WasteStackswastesdefaultStackGroups( s_s max_roundssnum_dealsislsssysxsstack((spysol.pys createGame;s.!, # !&! icCs|iii}|i|ii}|ii |}|i |i |ii|i d|ii|x*tdD]}|iiid|qxW|iii|iiidS(Niisflip(s_ssstalonsgetCards base_cardssuitsgameinfosdeckssns foundationssto_stacksstartDealSamplesflipMovesmoveMovesrangesisdealRowsflips dealCards(s_sflipsisto_stacksns base_card((spysol.pys startGame;s  (s__name__s __module__s createGames startGame(((spysol.pysOsmosis;ssPeekcBstZdZRS(NcCsti|dddS(Nsflipi(sOsmosiss startGames_(s_((spysol.pys startGame;s(s__name__s __module__s startGame(((spysol.pysPeek;si;i<sMonteCarlo_HintcBstZRS(N(s__name__s __module__(((spysol.pysMonteCarlo_Hint;ssMonteCarlo_TaloncBstZdZddZRS(NcCs\d}x;|iiiD]*}|i o d}q|odSqqW|o t|iSdS(Nii(sfrees_sgamesssrowssrscardsslen(s_srsfree((spysol.pys canDealCards;s   icCsW|ii|iiiddB|ii}|ii|iiiddB|SdS(Niii(s_sgamesupdateStackMovessstalonsfillEmptyStackssn(s_ssoundsn((spysol.pys dealCards;s  (s__name__s __module__s canDealCardss dealCards(((spysol.pysMonteCarlo_Talon;s sMonteCarlo_RowStackcBs/tZdZdddZdddZRS(NcCs\ti||| odSn|idi|dijodSn|ii||SdS(Nii(s OpenStacks acceptsCardss_s from_stackscardssranksgames isNeighbour(s_s from_stackscards((spysol.pys acceptsCards;s icCsw|djo||iiijpt|io |i||ddd|n t i |||d|d|dS(Nisframesisshadow( sncardssto_stacks_sgamesssrowssAssertionErrorscardss _dropPairMovesshadows BasicRowStacksmoveMovesframes(s_sncardssto_stacksframessshadow((spysol.pysmoveMove;s*  cCs|i}|i|i}|iid}|i|ii ddB|i o|i dddn|i |||d|d||i |||d|d||i|i|iio|in|i|ii d dB|i|dS( Niiisdroppairspriorityisframessshadowi(s_sgames enterStatesS_FILLs old_statesss foundationssfsupdateStackMovestalonsdemos playSamplesmoveMovesnsframessshadows other_stacks fillStacksFILL_STACKS_AFTER_DROPsfillEmptyStackss leaveState(s_sns other_stacksframessshadowsfs old_statesgame((spysol.pys _dropPairMove;s     (s__name__s __module__s acceptsCardssmoveMoves _dropPairMove(((spysol.pysMonteCarlo_RowStack;s s MonteCarlocBsktZeZeeddZeZe Z dZ dZ dZ edZdZdZdZRS( Ns max_accepticCst||if\}}|i|id|i|id|ixt dD]}xyt dD]k}|i||i|i||if\}}|ii|i|||ddddddd tqgWqTW|id |id|if\}}|ii|i|||d td ddd d t|i|idd|d|i}|i|||dd|_|i|iddd|idS(Nf6.5is max_acceptis max_cardsisdiris base_ranki ssuitsmax_movei4ssss max_roundss text_formats%D(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappendsRowStack_ClasssNO_RANKs foundationssFoundation_ClasssANY_SUITsANY_RANKs createTexts Talon_ClassstalonsdefaultStackGroups(s_sisjssslsysx((spysol.pys createGame<s$,  . 'cCs|i|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_((spysol.pys startGame<s cCsff|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks<scCs|i|ijSdS(N(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch<sc Csd|ijo djnod|ijo djn odSn|id}|i|i}|djo|dddddfjSnM|djo|d dd ddfjSn#|d ddd ddddfjSdS( Niiiiiiiiii(sstack1sidsstack2scolumnsdiff(s_sstack1sstack2scolumnsdiff((spysol.pys isNeighbour<sC   c CsBddf\}}|ix|iiD]}t|idjpt |i o|d}q)|djo7|i |i |}|i d||ddddq)q)W|djovxs|iiD]a}|i oP|iii oPn|i|ii|i d|ii||d}qqWn|i|SdS(Niisframesisshadow(sfreesns_sstartDealSamplesssrowssrslenscardssAssertionErrors allstackssidsto_stacksmoveMovestalonsflipMoves stopSamples(s_sfreesnsrsto_stack((spysol.pysfillEmptyStacks&<s*    '    (s__name__s __module__sMonteCarlo_Talons Talon_Classs StackWrappersAbstractFoundationStacksFoundation_ClasssMonteCarlo_RowStacksRowStack_ClasssMonteCarlo_Hints Hint_ClasssFILL_STACKS_AFTER_DROPs createGames startGamesNones getAutoStackssshallHighlightMatchs isNeighboursfillEmptyStacks(((spysol.pys MonteCarlo;s     sMonacocBstZRS(N(s__name__s __module__(((spysol.pysMonaco:<ssWeddings_TaloncBstZdZRS(NcCsd}x|iiiD]t}|i o d}q|i}x5|djo|ii |di o|d}q=W||ijodSqqW|o t |iSdS(Niii( sfrees_sgamesssrowssrscardssidsks allstacksslen(s_sksrsfree((spysol.pys canDealCards=<s   & (s__name__s __module__s canDealCards(((spysol.pysWeddings_Talon<<ssWeddingscBstZeZdZRS(Nc Cs|ddf\}}|ix|iiD]}t|idjpt |i o|d}q)|i }x2|djo|i |di o|d}qqW||i jo0|i |}|id||ddddq)q)W|djovxs|iiD]a}|i oP|iii oPn|i|ii|id|ii||d}qqWn|i|SdS(Niiisframesisshadow(sfreesns_sstartDealSamplesssrowssrslenscardssAssertionErrorsidsks allstackssto_stacksmoveMovestalonsflipMoves stopSamples(s_sksto_stacksnsrsfree((spysol.pysfillEmptyStacksK<s2    # '    (s__name__s __module__sWeddings_Talons Talon_ClasssfillEmptyStacks(((spysol.pysWeddingsI<ss SimpleCarlocBs#tZdZedZdZRS(NicCsffffSdS(N((s_sevent((spysol.pys getAutoStackse<scCsCd|ijo djnod|ijo djnSdS(Nii(sstack1sidsstack2(s_sstack1sstack2((spysol.pys isNeighbourg<s(s__name__s __module__sFILL_STACKS_AFTER_DROPsNones getAutoStackss isNeighbour(((spysol.pys SimpleCarloc<s s SimplePairscBs#tZdZdZdZRS(NcCst||if\}}|i|id|i|id|ixt dD]}xt dD]}|id|d|id|id|d|idf\}}|ii|i|||dddddd d tqgWqTW|i|id|idf\}}t|||d d|_|i|id |d |i}|ii|i|||dtdd ddd t|i|id d |idS(Niiiiis max_accepts max_cardssdiris base_ranks max_roundssssissuitsmax_movei4(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappendsRowStack_ClasssNO_RANKs TalonStackstalons createTexts foundationssFoundation_ClasssANY_SUITsANY_RANKsdefaultStackGroups(s_sisjssslsysx((spysol.pys createGamej<s$,  F 'cCs}||iijoft|idjot|iiidjo0|i|ii|id|ii|qyndS(Nii( sstacks_sssrowsslenscardsstalonsflipMovesmoveMove(s_sstack((spysol.pys fillStack{<s2cCsCd|ijo djnod|ijo djnSdS(Nii(sstack1sidsstack2(s_sstack1sstack2((spysol.pys isNeighbour<s(s__name__s __module__s createGames fillStacks isNeighbour(((spysol.pys SimplePairsi<s  sNeighbour_FoundationcBstZdZRS(NcCs4ti||| odSn|ditjSdS(Ni(sAbstractFoundationStacks acceptsCardss_s from_stackscardssranksKING(s_s from_stackscards((spysol.pys acceptsCards<s(s__name__s __module__s acceptsCards(((spysol.pysNeighbour_Foundation<ssNeighbour_RowStackcBs;tZdZdZdddZdZdZRS(NcCs`ti||| odSn|idi|didjodSn|ii||SdS(Niii (s OpenStacks acceptsCardss_s from_stackscardssranksgames isNeighbour(s_s from_stackscards((spysol.pys acceptsCards<s "cCs,|i|odSnti||SdS(Ni(s_s_dropKingClickHandlerseventsMonteCarlo_RowStacks clickHandler(s_sevent((spysol.pys clickHandler<sicCs|djpt|iditjo@||iii jptt i |||d|d|n ti |||d|d|dS(Niisframessshadow(sncardssAssertionErrors_scardssranksKINGsto_stacksgamesss foundationss BasicRowStacksmoveMovesframessshadowsMonteCarlo_RowStack(s_sncardssto_stacksframessshadow((spysol.pysmoveMove<s #cCs|i odSn|id}|io|itjo |i oA|iiddd|i d|ii i ddddSndSdS(Niisautodropspriorityiissound( s_scardsscsface_upsranksKINGsbasicIsBlockedsgames playSamples playMoveMovesss foundations(s_seventsc((spysol.pys_dropKingClickHandler<s  (#cCsd|i o|iiiio?|ii|ii}|iiii |ii |ndS(N( s_scardssgamessstalons canDealCardss enterStatesS_FILLs old_states dealCardss leaveState(s_s old_state((spysol.pys fillStack<s!(s__name__s __module__s acceptsCardss clickHandlersmoveMoves_dropKingClickHandlers fillStack(((spysol.pysNeighbour_RowStack<s    s NeighbourcBs/tZeZeZdZedZdZ RS(NicCsf|iiffSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks<scCs|i|idjSdS(Ni (scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch<s( s__name__s __module__sNeighbour_FoundationsFoundation_ClasssNeighbour_RowStacksRowStack_ClasssFILL_STACKS_AFTER_DROPsNones getAutoStackssshallHighlightMatch(((spysol.pys Neighbour<s  sFourteen_RowStackcBstZdZRS(NcCsBti||| odSn|idi|didjSdS(Niii (s OpenStacks acceptsCardss_s from_stackscardssrank(s_s from_stackscards((spysol.pys acceptsCards<s(s__name__s __module__s acceptsCards(((spysol.pysFourteen_RowStack<ssFourteencBsMtZeeddZeZdZdZdZ e dZ dZ RS(Ns max_accepticCst||if\}}|i|id|i|id|ixddfD]}xyt dD]k}|i||i|i||if\}}|ii|i|||ddddd dd tqgWqTW|id|i|if\}}|ii|i|||d tddd d d t|i|idd|i|i|i|if\}}t||||_|idS(Niiif2.5ismax_moveis max_acceptsdirs base_rankssuits max_cardsi4sss(sLayouts_ssslssetSizesXMsXSsYMsYSsisrangesjsxsysrowssappendsRowStack_ClasssNO_RANKs foundationssFoundation_ClasssANY_SUITsANY_RANKs createTextswidthsheightsInitialDealTalonStackstalonsdefaultStackGroups(s_sisjslsssxsy((spysol.pys createGame<s",  . #&cCskx*tdD]}|iiiddq W|i|iii|iiid|iid dS(Nisframesisrowsi(srangesis_ssstalonsdealRowsstartDealSamplesrows(s_si((spysol.pys startGame<s   cCsff|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks<scCs|i|idjSdS(Ni (scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch<s( s__name__s __module__s StackWrappersAbstractFoundationStacksFoundation_ClasssFourteen_RowStacksRowStack_ClasssFILL_STACKS_AFTER_DROPs createGames startGamesNones getAutoStackssshallHighlightMatch(((spysol.pysFourteen<s   sNestor_RowStackcBstZdZRS(NcCs>ti||| odSn|idi|dijSdS(Nii(s OpenStacks acceptsCardss_s from_stackscardssrank(s_s from_stackscards((spysol.pys acceptsCards<s(s__name__s __module__s acceptsCards(((spysol.pysNestor_RowStack<ssNestorcBsVtZeeddZeZdZdZdZ dZ e dZ dZ RS(Ns max_accepticCst||if\}}|i|id|i|id|ixnt dD]`}|i||i|if\}}|i i|i|||dddddddtqTWx}t dD]o}|i|d |i|id |if\}}|i i|i|||dddddddtqW|i|i|i|if\}}|ii|i|||d tddd d dt|i|idd|i|i|if\}}t||||_|idS(Niismax_moveis max_acceptsdiris base_rankiissuits max_cardsi4snn(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesjsxsysrowssappendsRowStack_ClasssNO_RANKswidthsheights foundationssFoundation_ClasssANY_SUITsANY_RANKs createTextsInitialDealTalonStackstalonsdefaultStackGroups(s_sjssslsysx((spysol.pys createGame<s*, #  2 &cCs|SdS(N(scards(s_scards((spysol.pys _shuffleHook<scCs[x:tdD],}|iiid|iid ddq W|i|iiidS(Nisrowsisframesi(srangesis_ssstalonsdealRowsrowssstartDealSample(s_si((spysol.pys startGame<s  * cCsff|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks<scCs|i|ijSdS(N(scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch<s(s__name__s __module__s StackWrappersAbstractFoundationStacksFoundation_ClasssNestor_RowStacksRowStack_ClasssFILL_STACKS_AFTER_DROPs createGames _shuffleHooks startGamesNones getAutoStackssshallHighlightMatch(((spysol.pysNestor<s    sDerLetzteMonarch_FoundationcBstZdZRS(NcCs]|tjoti|||iSnti||| odSn||iiijSdS(Ni( scardssNonesSS_FoundationStacks acceptsCardss_s from_stacksgamesssreserves(s_s from_stackscards((spysol.pys acceptsCards<s  (s__name__s __module__s acceptsCards(((spysol.pysDerLetzteMonarch_Foundation<ssDerLetzteMonarch_RowStackcBsAtZdZdZdZdddZdddZRS(NcCstdfSdS(Ni(sNone(s_sstacks((spysol.pys canDropCards=scCsRti||| odSn|ii|| odSn|itj SdS(Ni( s ReserveStacks acceptsCardss_s from_stackscardssgames isNeighbours _getDropStacksNone(s_s from_stackscards((spysol.pys acceptsCards=s cCst|idjotSnx2|iiiD]!}|i|to|Sq.q.Wx*|iiiD]}|i o|SqcqcWtSdS(Ni( slens_scardssNonesgamesss foundationss acceptsCardssreserves(s_ss((spysol.pys _getDropStack =s   icCsg|djo||iiijptt|idjpt|i ||dddddS(Nisframesisshadowi( sncardssto_stacks_sgamesssrowssAssertionErrorslenscardss_handlePairMove(s_sncardssto_stacksframessshadow((spysol.pysmoveMove=s*cCs|i}|i|i}|i}|tj pt |i |||d|d||i |||dd|i|dS(Nsframessshadowi(s_sgames enterStatesS_FILLs old_states other_stacks _getDropStacksssNonesAssertionErrorsmoveMovesnsframessshadows leaveState(s_sns other_stacksframessshadowsss old_statesgame((spysol.pys_handlePairMove=s  (s__name__s __module__s canDropCardss acceptsCardss _getDropStacksmoveMoves_handlePairMove(((spysol.pysDerLetzteMonarch_RowStack=s    sDerLetzteMonarch_ReserveStackcBstZdZRS(NcCs|i|SdS(N(s_sdoubleclickHandlersevent(s_sevent((spysol.pys clickHandler!=s(s__name__s __module__s clickHandler(((spysol.pysDerLetzteMonarch_ReserveStack =ssDerLetzteMonarchcBsAtZdZdZdZedZdZdZRS(Nc Cst|dd|if\}}|i|id|i|id|ixt dD]w}xnt dD]`}|i||i|i|d|if\}}|iit|||ddddqmWqZWx]t dD]O}|i|d|i|if\}}|iit|||dd qWx`t dD]R}|i|d |i|if\}}|iit||||d d qBWt|i|i||_|ig|i_|i|i|i_|i|i|i_|i|i_dS( NsXMii iis max_accepts max_cardsiiismax_move(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappendsDerLetzteMonarch_RowStacksreservessDerLetzteMonarch_ReserveStacks foundationssDerLetzteMonarch_FoundationsInitialDealTalonStackstalonssgs talonstackss openstackss dropstackss reservestacks(s_sisjssslsysx((spysol.pys createGame$=s*!,  20 '& ')cCsT|iiid|iid dd|i|iiid|iiddS(Nsrowsi'sframesi(s_ssstalonsdealRowsrowssstartDealSample(s_((spysol.pys startGame6=s& cCs>d}x'|iiD]}|t|i}qW|djSdS(Nii3(scs_sss foundationsslenscards(s_scss((spysol.pys isGameWon:=s  cCsf|iiffSdS(N(s_sssreserves(s_sevent((spysol.pys getAutoStacks?=scCsdSdS(NsDer letzte Monarch((s_((spysol.pysgetDemoInfoTextA=scCsd|ijo djnod|ijo djn odSn|id}|i|i}|djo|dddfjSn;|djo|dddfjSn|ddddfjSdS(Nii3i iii i(sstack1sidsstack2scolumnsdiff(s_sstack1sstack2scolumnsdiff((spysol.pys isNeighbourC=sC   ( s__name__s __module__s createGames startGames isGameWonsNones getAutoStackssgetDemoInfoTexts isNeighbour(((spysol.pysDerLetzteMonarch#=s      iYs Monte CarloiiiZs Simple Carloi[s Simple Pairsi\i`iisDer letzte Monarchs RoyalEastcBs;tZeZdZdZdZdZdZRS(Nc Cst||if\}}|i|id|i|id|it |_ xt dD]}ddfddfddfddff|\}}|id|d|id|id|d|idf\}}t||||ddd d}d|_|ii|q]Wxt dD]}ddfddfddfddfddff|\}}|id|d|id|id|d|idf\}}t|||ddd d}d|_|ii|q(W|i|id |idf\}}t|||d d|_|i|id ||i}t||||_|i|id |idS( Nf5.5iiiiismodi smax_moveis max_roundssss(sLayouts_ssslssetSizesXMsXSsYMsYSsNones base_cardsrangesisdxsdysxsysSS_FoundationStacksstacks CARD_YOFFSETs foundationssappends RK_RowStacksrowssWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups( s_sxsislsssdxsdysysstack((spysol.pys createGameb=s0,  4F!  =F ' cCs|iiid|_x&|iiD]}|ii|i_q#W|iii }|ii|i |i i }|i|ii|id|ii|dd|i|iii|iiidS(Niisframesi(s_ssstalonscardss base_cards foundationssrankscaps base_ranksgetCardscssuitsgameinfosdeckssto_stacksflipMovesmoveMovesstartDealSamplesdealRows dealCards(s_sssto_stacksc((spysol.pys startGamey=s  cCsC|i|ii|_x&|iiD]}|ii|i _ q#WdS(N( s_scardssgamesloadinfos base_card_ids base_cardsss foundationssrankscaps base_rank(s_sgamess((spysol.pys_restoreGameHook=s cCs)|iidt|i|i_dS(Ns base_card_id(s_sloadinfosaddattrsNonespsloads base_card_id(s_sp((spysol.pys _loadGameHook=scCs|i|iidS(N(spsdumps_s base_cardsid(s_sp((spysol.pys _saveGameHook=s( s__name__s __module__sCautiousDefaultHints Hint_Classs createGames startGames_restoreGameHooks _loadGameHooks _saveGameHook(((spysol.pys RoyalEast`=s    i]s Royal Easts TamOShantercBs&tZdZdZedZRS(Nc Csot||if\}}|i|id|i|id|i|i|if\}}t |||dd|_ |i |i dxWtdD]I}|i|d|i|if\}}|iit|||qWxwtdD]i}|i|d|i|i|if\}}|iit|||dddd ||i}qW|idS( Niis max_roundsisssismax_moves max_accepti(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysDealRowTalonStackstalons createTextsrangesis foundationssappendsRK_FoundationStacksrowss BasicRowStacksdefaultStackGroups(s_sislsssysx((spysol.pys createGame=s, '  .(cCs|i|iiidS(N(s_sstartDealSamplessstalonsdealRow(s_((spysol.pys startGame=s cCsff|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks=s(s__name__s __module__s createGames startGamesNones getAutoStacks(((spysol.pys TamOShanter=s  s AuldLangSynecBstZdZdZRS(NcCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys=s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook=scCs@|iiid|iidd|i|iiidS(Nsrowssframesi(s_ssstalonsdealRows foundationssstartDealSample(s_((spysol.pys startGame=s" (s__name__s __module__s _shuffleHooks startGame(((spysol.pys AuldLangSyne=s sStrategy_FoundationcBstZdZRS(NcCs?ti||| odSnt|iiiidjSdS(Ni( sSS_FoundationStacks acceptsCardss_s from_stackscardsslensgamessstalon(s_s from_stackscards((spysol.pys acceptsCards=s(s__name__s __module__s acceptsCards(((spysol.pysStrategy_Foundation=ssStrategy_RowStackcBs5tZdZdZdZdZdZRS(NcCsIti||| odSn||iiijot|djSdS(Nii( s BasicRowStacks acceptsCardss_s from_stackscardssgamessstalonslen(s_s from_stackscards((spysol.pys acceptsCards=scCs/|iiiiodSnti||SdS(Ni(s_sgamessstalonscardss BasicRowStacks canMoveCards(s_scards((spysol.pys canMoveCards=scCsH|iiiio!|iiiid|dSnti||SdS(Ni( s_sgamessstalonscardss playMoveMoves BasicRowStacks clickHandlersevent(s_sevent((spysol.pys clickHandler=scCsH|iiiio!|iiiid|dSnti||SdS(Ni( s_sgamessstalonscardss playMoveMoves BasicRowStacksdoubleclickHandlersevent(s_sevent((spysol.pysdoubleclickHandler=scCs|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage=s(s__name__s __module__s acceptsCardss canMoveCardss clickHandlersdoubleclickHandlersgetBottomImage(((spysol.pysStrategy_RowStack=s     sStrategycBs#tZdZdZdZRS(Nc Csqt||if\}}|i|id|i|id|i|i|if\}}t ||||_ |i |i dxctdD]U}|i|d|i|if\}}|iit|||d|ddqWxstdD]e}|i||i|i|if\}}|iit|||ddd d||i}qW|idS( Niisseissuitsmax_moveiis max_accept(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysOpenTalonStackstalons createTextsrangesis foundationssappendsStrategy_FoundationsrowssStrategy_RowStacksdefaultStackGroups(s_sislsssysx((spysol.pys createGame=s, ', *(cCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pys=s(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHook=scCs:|i|iiid|ii|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss fillStack(s_((spysol.pys startGame=s (s__name__s __module__s createGames _shuffleHooks startGame(((spysol.pysStrategy=s  sInterregnum_FoundationcBstZdZRS(NcCsdti||| odSnt|idjo|i|idjSn||iii jSdS(Nii i( sRK_FoundationStacks acceptsCardss_s from_stackscardsslensidsgamesssrows(s_s from_stackscards((spysol.pys acceptsCards=s (s__name__s __module__s acceptsCards(((spysol.pysInterregnum_Foundation=ss InterregnumcBsStZdZddZdZedZdZdZdZ d Z RS( Niic Cst||if\}}|i|itd||i|i d|i t |_ xYt dD]K}|i||i|i f\}}|iit|||ddqfWxft dD]X}|i||i|i |i f\}}|iit|||ddddqWxzt |D]l}|id |d||id |i d |i f\}}|iit|||dddd q+Wt|i|i|i|i ||_|i|id |idS( Ni iis max_acceptismodi smax_moveiisnn(sLayouts_ssslssetSizesXMsmaxsrowssXSsYMsYSsNones base_cardssrangesisxsysreservessappends ReserveStacks foundationssInterregnum_Foundations RK_RowStacksDealRowTalonStackswidthsheightstalons createTextsdefaultStackGroups(s_srowssislsssxsy((spysol.pys createGame=s$5  #& *, >,)cCs|ig|_xtdD]}|ii|iii|i|i dd|ii |i _ |i |ii|id|ii|ii|q W|iiidS(Niii (s_sstartDealSamples base_cardssrangesisappendssstalonsgetCardsranks foundationsscaps base_ranksflipMovesmoveMovesreservessdealRow(s_si((spysol.pys startGame=s   ('cCsff|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacks=scCs7|idd|ijp|idd|ijSdS(Nii (scard1srankscard2(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch=scCswtgd|_x`tdD]R}|ii|}|i ||i|<|i|i dd|i i |i _qWdS(Niii (sNones_s base_cardssrangesisgamesloadinfos base_card_idssidscardssranksss foundationsscaps base_rank(s_sgamesisid((spysol.pys_restoreGameHook>s  cCsGg}x'tdD]}|i|iqW|iid|dS(Nis base_card_ids( sidssrangesisappendspsloads_sloadinfosaddattr(s_spsisids((spysol.pys _loadGameHook>s  cCs(x!|iD]}|i|iq WdS(N(s_s base_cardsscspsdumpsid(s_spsc((spysol.pys _saveGameHook >s ( s__name__s __module__s GAME_VERSIONs createGames startGamesNones getAutoStackssshallHighlightMatchs_restoreGameHooks _loadGameHooks _saveGameHook(((spysol.pys Interregnum=s     is Tam O'Shanteri_sAuld Lang Syneii{sDoublets_FoundationcBstZdZRS(NcCsmti||| odSn|io<d|idid|ii|dijodSqendSdS(Niiii(sAbstractFoundationStacks acceptsCardss_s from_stackscardssrankscapsmod(s_s from_stackscards((spysol.pys acceptsCards>s  0 (s__name__s __module__s acceptsCards(((spysol.pysDoublets_Foundation>ssDoubletscBsGtZeZdZdZdZdZdZe dZ RS(NcCs=t||if\}}|i|id|i|id|ixddfddfddfddfddfddfddffD]n\}}|id|d|id|id|d|idf\}}|i it|||qWddf\}}|id|d|id|id|d|idf\}}|iit|||tdddd d dd d |i|idd |i|id|idf\}}t|||dd|_|i|id ||i}t||||_|i|id |idS(Nf5.5iiiiisdirsmodi smax_moves max_cardsi0sssis max_rounds(sLayouts_ssslssetSizesXMsXSsYMsYSsdxsdysxsysrowssappends ReserveStacks foundationssDoublets_FoundationsANY_SUITs createTextsWasteTalonStackstalons WasteStackswastesdefaultStackGroups(s_slsssdxsdysysx((spysol.pys createGame >s&,F F F ' cCsggf\}}xb|D]Y}|i||itjo|i|q|i|t|djoPqqW|||SdS(Ni( skingsstopcardsscardsscsremovesranksKINGsappendslen(s_scardsscstopcardsskings((spysol.pys _shuffleHook3>s   cCsJ|i|iii|iiid|ii|iiidS(Nsrows(s_sstartDealSamplessstalonsdealRows foundationss dealCards(s_((spysol.pys startGame>>s cCsI|iiip |iiiodSnt|iididjSdS(Nii0(s_ssstalonscardsswasteslens foundations(s_((spysol.pys isGameWonC>s cCs||iijo|i o|i|i}|iiio|iii d|n>|ii i o*|ii i |iii d|n|i |ndS(Ni(sstacks_sssrowsscardss enterStatesS_FILLs old_stateswastesmoveMovestalons canDealCardss dealCardss leaveState(s_sstacks old_state((spysol.pys fillStackG>scCsff|iifSdS(N(s_ssgs dropstacks(s_sevent((spysol.pys getAutoStacksP>s( s__name__s __module__sCautiousDefaultHints Hint_Classs createGames _shuffleHooks startGames isGameWons fillStacksNones getAutoStacks(((spysol.pysDoublets>s    iosSiebenBisAs_HintcBstZdZRS(Nc Cs]|i}td|ii} x5|iiD]'}|i oq.nt |i djo|i di pt |i d|i gf\}}}|i|iii\}}|oPdtf\} }|i| ||||\} }|i| ||||nxG| D]?}|i||||o d} |i| d||qqWq.WdS(NcCs|i S(N(ssscards(ss((spysol.pysW>siiiiP(s_sgamesfiltersssrowssfreerowsssgs dropstackssrscardsslensface_upsAssertionErrorscspilesrpiles canDropCardss foundationsstsncardssNonesscorescolors_getDropCardScoresaddHints shallMovePile( s_scsncardsscolorsgamesrspilestsrpilesfreerowssscore((spysol.pys computeHintsU>s$   ."!(s__name__s __module__s computeHints(((spysol.pysSiebenBisAs_HintT>ssSiebenBisAs_FoundationcBstZdZRS(NcCsti||| odSn||iiij odSn|iddjodSnt |iii|ididjSdS(Nii i( sSS_FoundationStacks acceptsCardss_s from_stackscardssgamesssrowssidslen(s_s from_stackscards((spysol.pys acceptsCardsg>s(s__name__s __module__s acceptsCards(((spysol.pysSiebenBisAs_Foundationf>ssSiebenBisAs_RowStackcBstZdZdZRS(NcCs;ti||| odSn|iddjot|iii|id}|ioA|idi |di jo#|idi dd|di jodSqn|idddjot|iii|id}|ioA|idi |di jo#|idi dd|di jodSq3ndSdS(Nii iii ( s BasicRowStacks acceptsCardss_s from_stackscardssidsgamesssrowsssuitsrank(s_s from_stackscardsss((spysol.pys acceptsCardsp>sN N cCs|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage|>s(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysSiebenBisAs_RowStacko>s s SiebenBisAscBs tZeZdZdZRS(Nc Cst||if\}}|i|id|i|id|ixt dD]w}xnt dD]`}|i||i|i|d|if\}}|iit|||ddddqgWqTWx]t dD]O}|i|d|i|if\}}|iit|||dd qWxwt dD]i}|i|d|i|id|if\}}|iit||||d d d d dd q<Wt|i|i|i||_|idS(Ni iiis max_accepts max_cardsiiis base_rankismodi smax_move(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappendsSiebenBisAs_RowStacksreservess ReserveStacks foundationssSiebenBisAs_FoundationsInitialDealTalonStacksheightstalonsdefaultStackGroups(s_sisjssslsysx((spysol.pys createGame>s$,  20 '& 25"cCs|i|iii|iiid|iitd|ii}x5|D]-}|i d||ii |i di qUWdS(NsrowscCs|ididjS(Nii(srscardssrank(sr((spysol.pys>sii(s_sstartDealSamplessstalonsdealRowsreservessfiltersrowssstackssrsmoveMoves foundationsscardsssuit(s_srsstacks((spysol.pys startGame>s (s__name__s __module__sSiebenBisAs_Hints Hint_Classs createGames startGame(((spysol.pys SiebenBisAs~>s s Maze_RowStackcBs#tZdZeiZdZRS(NcCsBti||| odSn|iii|idd}|io|idi |di jo|idi d|di jodSn|idi t jo|di t jodSqn|iii|idd}|ioL|idi |di jo|idi d|di jodSq:ndSdS(Niii6i( s BasicRowStacks acceptsCardss_s from_stackscardssgamesssrowssidssuitsranksQUEENsACE(s_s from_stackscardsss((spysol.pys acceptsCards>s @+  @ cCs|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage>s(s__name__s __module__s acceptsCardssStacksprepareInvisibleBottoms prepareBottomsgetBottomImage(((spysol.pys Maze_RowStack>s  sMazecBs/tZdZeZdZdZdZRS(Nic Cs(t|dddd|if\}}|i|id|i|id|ixt dD]s}xjt dD]\}|i||i|i||if\}}|iit|||ddddqsWq`Wt|i|id|i|i||_|iit||idS( NsXMisYMi is max_acceptis max_cards(sLayouts_ssslssetSizesXMsXSsYMsYSsrangesisjsxsysrowssappends Maze_RowStacksInitialDealTalonStackswidthsheightstalons internalssInvisibleStacksdefaultStackGroups(s_sisjssslsysx((spysol.pys createGame>s',  .0-cCsd}xtdD]}|djoqn|iiid}|it jo&|iii d|ii ddq|djo |djo|i d}n|iii d|ii |fd|qWt|iiidjptdS(Nii6i4isrowssframesi$(sframessrangesis_ssstalonscardsscsranksKINGsdealRows internalssstartDealSamplesrowsslensAssertionError(s_scsisframes((spysol.pys startGame>s  &  -cCs\td|ii}t|djodSnd}no;x*||iditjo|d}qCW||}nx|d|d|d|dfD]}||}||d }|i |i d d jodSn|iditjp|idit jodSnt|||d!}| pt|d d odSqqWdSdS( NcCs|iS(N(ssscards(ss((spysol.pys>si0iiii ii$i i6sdir(sfilters_sssrowsslensiscardssranksACEsjsr1sr2sidsQUEENsgetPileFromStacksspilesisSameSuitSequence(s_srowssr1sisjsr2spile((spysol.pys isGameWon>s*# . (s__name__s __module__s GAME_VERSIONsSiebenBisAs_Hints Hint_Classs createGames startGames isGameWon(((spysol.pysMaze>s  ivs Sieben bis AsisDieBoeseSieben_TaloncBstZdZddZRS(NcCs$t|ip|i|ijSdS(N(slens_scardssrounds max_rounds(s_((spysol.pys canDealCards>sicCs|ioti|d|Sn|it|if\}}xk|ii D]]}xT|ioI|d}|idi o|i |n|i d||ddqUWqLWt|i|jpt|o|in|i||i|t|ii }||d@}xF|io;t|i|jo d}n|id|| }qW|o|in|SdS(Nssoundiisframesisflip(s_scardssDieKoenigsbergerin_Talons dealCardsssoundsgameslens num_cardssssrowssrsface_upsflipMovesmoveMovesAssertionErrorsstartDealSamplesshuffleStackMoves nextRoundMovesnsflipsdealRows stopSamples(s_ssoundsflips num_cardssnsgamesr((spysol.pys dealCards>s6    "     (s__name__s __module__s canDealCardss dealCards(((spysol.pysDieBoeseSieben_Talon>s sDieBoeseSiebencBstZddZdZRS(Nic Csit||if\}}|i|itd||i|i d|i x`t dD]R}|i||i|i f\}}|iit||||dddq]Wxjt |D]\}|id|d||id|i |i f\}}|iit|||qWt|i|i|i |dd|_|i|id|idS(Niiismax_moveis max_roundssse(sLayouts_ssslssetSizesXMsmaxsrowssXSsYMsYSsrangesisxsys foundationssappendsDieRussische_Foundations AC_RowStacksDieBoeseSieben_Talonsheightstalons createTextsdefaultStackGroups(s_srowssislsssxsy((spysol.pys createGame>s5 #- : (cCsJ|ix9dddddddfD]}|iiid|q&WdS(Niisflip(s_sstartDealSamplesflipssstalonsdealRow(s_sflip((spysol.pys startGame?s (s__name__s __module__s createGames startGame(((spysol.pysDieBoeseSieben>s ixsDie bse Siebens Terrace_TaloncBstZdZRS(NcCs/|iidjodSnti|SdS(Ni(s_sgamesgetStatesWasteTalonStacks canDealCards(s_((spysol.pys canDealCards?s(s__name__s __module__s canDealCards(((spysol.pys Terrace_Talon ?ssTerrace_AC_FoundationcBstZdZdZRS(NcKsBt|ddddddtti|||||f|dS(Nsmodi s min_cardsismax_movei( s kwdefaultscapsapplysAC_FoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.pys__init__?scCs|iidjoct|djp |di odSn|di|iijodSn||ii i jSnt i |||SdS(Nii(s_sgamesgetStateslenscardssface_upssuitscaps base_suits from_stacksssrowssAC_FoundationStacks acceptsCards(s_s from_stackscards((spysol.pys acceptsCards?s"(s__name__s __module__s__init__s acceptsCards(((spysol.pysTerrace_AC_Foundation?s sTerrace_SS_FoundationcBstZdZdZRS(NcKsBt|ddddddtti|||||f|dS(Nsmodi s min_cardsismax_movei( s kwdefaultscapsapplysSS_FoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.pys__init__?scCs|iidjoct|djp |di odSn|di|iijodSn||ii i jSnt i |||SdS(Nii(s_sgamesgetStateslenscardssface_upssuitscaps base_suits from_stacksssrowssSS_FoundationStacks acceptsCards(s_s from_stackscards((spysol.pys acceptsCards"?s"(s__name__s __module__s__init__s acceptsCards(((spysol.pysTerrace_SS_Foundation?s sTerrace_RowStackcBs2tZdZdZdddZdZRS(NcKs9t|ddddtti||||f|dS(Nsmodi smax_movei( s kwdefaultscapsapplys AC_RowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__+?scCsS|iidjodSn||iiijodSnti|||SdS(Ni( s_sgamesgetStates from_stacksssreservess AC_RowStacks acceptsCardsscards(s_s from_stackscards((spysol.pys acceptsCards.?s icCs2|ii}|djo'ti|||d|d|dSn||ii i jpt |djpt |ii i i pt |ii|||d|d|x-|ii i D]}|idi|i_qWtd|ii i}|ii iid|dd|ii iidS(NisframessshadowicCs|i S(N(ssscards(ss((spysol.pys??ssrowsssound(s_sgamesgetStatesstates AC_RowStacksmoveMovesncardssto_stacksframessshadowsss foundationssAssertionErrorswastescardssrankscaps base_ranksfiltersrowssfreerowsstalonsdealRows dealCards(s_sncardssto_stacksframessshadowsssstatesfreerows((spysol.pysmoveMove4?s "cCs|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImageB?s(s__name__s __module__s__init__s acceptsCardssmoveMovesgetBottomImage(((spysol.pysTerrace_RowStack*?s  sTerracecBsntZeZeZeZeZ dZ ddddZ dZ dZ dZdZd Zd ZRS( Ni i ic Csxt|dd|if\}}t|d}|d|id|||idf\}} td|i d|i } |i |i||i|i|id|i | t|_|i||if\} } t| | |d|d ||_|i|id | |i} t| | ||_|i|id d d | d|i} |i| | |} |i| _|i| d |ii | |i|| |i f\} } xJt!dD]<}|i#i |i$| | |d|d| |i} qW|i| | |i f\} } x@t!|D]2}|ii |i%| | || |i} q4W|i&dS(NsXOFFSETii iiiis max_roundssnum_dealsswsses text_formats%Dssuit('sLayouts_ssslsmaxsrowssmaxrowssXSsw1sw2sYSsYOFFSETshssetSizesXMsYMsNones base_cardsxsys Terrace_Talons max_roundssnum_dealstalons createTexts WasteStackswastesReserveStack_ClasssstacksXOFFSETs CARD_XOFFSETsreservessappendsrangesis foundationssFoundation_ClasssRowStack_ClasssdefaultStackGroups(s_srowss max_roundssnum_dealsw1sislsssmaxrowsshsysxsstacksw2((spysol.pys createGameJ?s8!07 !    )  cCs1x&|iiD]}|iodSq q WdSdS(Nii(s_sss foundationsscards(s_ss((spysol.pysgetStatee?s    cCsd|ix3t|iD]"}|iiid|iiqW|iiid|ii d dS(Nsrowsi( s_sstartDealSamplesrangesINITIAL_RESERVE_CARDSsissstalonsdealRowsreservessrows(s_si((spysol.pys startGamej?s   cCs|i o|i|i}||iijo |iiio|iii n>||ii jo |iiio|iii d|n|i |ndS(Ni( sstackscardss_s enterStatesS_FILLs old_statessswastestalons dealCardssrowssmoveMoves leaveState(s_sstacks old_state((spysol.pys fillStacko?s ##cCs-x&|iiD]}|ii|i_q WdS(N(s_sss foundationssgamesloadinfos base_rankscap(s_sgamess((spysol.pys_restoreGameHookw?s cCs|iid|idS(Ns base_rank(s_sloadinfosaddattrspsload(s_sp((spysol.pys _loadGameHookz?scCsMt}x3|iiD]%}|io|idi}PqqW|i|dS(Ni( sNO_RANKs base_ranks_sss foundationsscardssrankspsdump(s_spsss base_rank((spysol.pys _saveGameHook|?s   (s__name__s __module__sTerrace_AC_FoundationsFoundation_ClasssTerrace_RowStacksRowStack_Classs OpenStacksReserveStack_ClasssCautiousDefaultHints Hint_ClasssINITIAL_RESERVE_CARDSs createGamesgetStates startGames fillStacks_restoreGameHooks _loadGameHooks _saveGameHook(((spysol.pysTerraceD?s     sGeneralsPatiencecBstZeZdZRS(Ni (s__name__s __module__sTerrace_SS_FoundationsFoundation_ClasssINITIAL_RESERVE_CARDS(((spysol.pysGeneralsPatience?ssBlondesAndBrunettescBs tZdZdZdZRS(Ni cCs|ix3t|iD]"}|iiid|iiqW|iii|iii }x#|ii D]}|i |i _qoW|iiid|ii d|if|iiidS(Nsrowsi(s_sstartDealSamplesrangesINITIAL_RESERVE_CARDSsissstalonsdealRowsreservessgetCardscs foundationssrankscaps base_rankssuits dealCards(s_sisssc((spysol.pys startGame?s   *cCsdSdS(Ni((s_((spysol.pysgetState?s(s__name__s __module__sINITIAL_RESERVE_CARDSs startGamesgetState(((spysol.pysBlondesAndBrunettes?s s FallingStarcBstZdZRS(Ni (s__name__s __module__sINITIAL_RESERVE_CARDS(((spysol.pys FallingStar?sisQueen of ItalyisGeneral's PatienceisBlondes and Brunettesis Falling StarsPokerSquare_RowStackcBstZdZeZRS(NcCs@|i o!|iiiid|dSnti||SdS(Ni( s_scardssgamessstalons playMoveMoves ReserveStacks clickHandlersevent(s_sevent((spysol.pys clickHandler?s (s__name__s __module__s clickHandlersrightclickHandler(((spysol.pysPokerSquare_RowStack?s s PokerSquarecBsntZeZeeddZeZdZ dZ dZ dZ edZ dZd Zd ZRS( Nsmax_moveiidcCsTt||if\}} d}|i|id|if\}} |i djot |i || dddddd } | i}|dd }|d |d}|d|ijo+d }| id |i | |i} nt |i || dddd} | idd }t |i || dddddd|i_|iiidd}ntd|i|} |i|i| d|id|id|idx|tdD]n}xetdD]W}|i| ||i|i||if\}} | ii|i|| |qWqW|i|if\}} |i|| || _|i | id|| i!it"||i djo8|ii#dgxwdddddfD]`}|i$| i|dd \}}}}t |i |d|d|} |ii(i| qWxmtddD]\}|i$| i|dd\}}}}t |i ||d|} |ii(i| q@Wt |i |id|idddt)d |i_*n| i} | d d!| dd!!| d!d"!| d"d!| dd!| d | d d| d d!| d d"| d df| d| dd| dd!| dd"| ddf| d| dd| dd!| dd"| ddf| d | d d| d d!| d d"| d df| d| dd| dd!| dd"| ddfg |_,t-t.|i,|_,|i/|SdS(#Nsssiisanchorsnwstexts*Royal Flush Straight Flush Four of a Kind sFull House Flush Straight s!Three of a Kind Two Pair One Pairiiseis100 75 50 25 20 15 10 5 2s0 is0i ii2ishandsii iiiiisswsfonts canvas_largei i(0sLayouts_ssslstasXMsYMsYSsxsyspreviews MfxCanvasTextscanvasstsbboxsbbshsmovestextssmiscsmaxsXSswssetSizesrangesisjsrowssappendsRowStack_Classs Talon_Classstalons createTexts internalssInvisibleStacksaddattrs getTextAttrstxstystfshandssgetFontsscoresrs poker_handssmapstuplesdefaultStackGroups(s_stxstystfsbbsishsjslsssrstswsysxsta((spysol.pys createGame?sf#  8  2'((" J cCs=|id|ii|iiddd|iiidS(Niisframes(s_smoveMovessstalons internalss fillStack(s_((spysol.pys startGame?s)cCs3t|iiidjo|i|ijSdS(Ni(slens_ssstalonscardss getGameScores WIN_SCORE(s_((spysol.pys isGameWon?scCsffffSdS(N((s_sevent((spysol.pys getAutoStacks?scCsW|idjodSnd}dgd}xtdD]}|i|i|\}}d|jo djno||d||| o)| djodd fSndd fSndd fSn| odd fSnt |djo|i|d djoddfSn|d djo-|ddjoddfSnddfSn|ddjoddfSnddfSnd dfSdS(Nii iiii iiidiKiiii2iiiii ii(s same_ranks same_suitsranksshandssscardssrankssuitsappendsstraightscountsmaxsminsdssort( s_shandsdsrankss same_ranksranks same_suitssssuitsstraight((spysol.pys getHandScore@sJ   &  '  (s__name__s __module__sOpenTalonStacks Talon_Classs StackWrappersPokerSquare_RowStacksRowStack_ClasssNones Hint_Classs WIN_SCOREs createGames startGames isGameWons getAutoStackss updateTexts getGameScores getHandScore(((spysol.pys PokerSquare?s 8     sPokerShuffle_RowStackcBs&tZdddZdddZRS(NicCsg|djo||iiijptt|idjpt|i ||dddddS(Nisframesisshadowi( sncardssto_stacks_sgamesssrowssAssertionErrorslenscardss _swapPairMove(s_sncardssto_stacksframessshadow((spysol.pysmoveMove+@s*cCs|i}|i|i}|iid}|i|||dd|i|||d|d||i|||dd|i |dS(Nisframessshadow(s_sgames enterStatesS_FILLs old_statesss internalssswapsmoveMovesns other_stacksframessshadows leaveState(s_sns other_stacksframessshadows old_statesgamesswap((spysol.pys _swapPairMove/@s (s__name__s __module__smoveMoves _swapPairMove(((spysol.pysPokerShuffle_RowStack*@ss PokerShufflecBsGtZeZeeddddZdZdZdZ dZ RS( Ns max_acceptis max_cardsiicCs?ti|}|iiiiod|iiii_ndS(Ns%D( s PokerSquares createGames_slssstalonstextssncardss text_format(s_sl((spysol.pys createGame;@scCsG|id|ii|iiddd|i|iiidS(Niisframes(s_smoveMovessstalons internalssstartDealSamplesdealRow(s_((spysol.pys startGame?@s) cCsdSdS(Ni((s_((spysol.pys checkForWinC@s( s__name__s __module__sInitialDealTalonStacks Talon_Classs StackWrappersPokerShuffle_RowStacksRowStack_Classs WIN_SCOREs createGames startGames checkForWin(((spysol.pys PokerShuffle7@s   is Poker Squareis Poker ShufflesDerKatzenschwanzcBsDtZeedeZdddZdZdZdZ RS(Ns base_ranki ic Cst|dd|if\}}t||} |i|i | d|i |i d|i d|i |i }ggf\} }x1t|D]#}| id|i|i qWx5td|D]#}| i|i|idqW|i | ||i d|i f\} } x=t|D]/}|iit| | || |i } q*W|i | ||i d|i |i f\} } |i|iddd | |i dfxXt|D]J}|i| | |} | | _|| _|ii| | |i } qW|i | |i |i f\} } xetdD]W}xAtdD]3}|iit| ||i | |d |qWW| |i } qDW|i|ii| |i ddd | fd d t!|i"d |i d|i#|i ||_$|i%dS(NsXOFFSETi iiiiihii?Bssuitspriorityii(&sLayouts_ssslsmaxsrowssreservessmaxrowsssetSizesXMsXSsYMsYSsYOFFSETs playcardssxoffsetsyoffsetsrangesisappendsXOFFSETsxsys ReserveStacks setRegionsRowStack_Classsstacks CARD_XOFFSETs CARD_YOFFSETssuits foundationssSS_FoundationStacksCWsInitialDealTalonStackswidthsheightstalonsdefaultStackGroups(s_srowssreservess playcardssissuitslsyoffsetsssxoffsetsmaxrowssxsysstack((spysol.pys createGameM@sJ!0  + 2*   #  131cCs|id}x|iiiop|iiiditjo&|ii|io|d}qfn|iii d|ii|gddqWdS(Niiisrowssframesi( s_sstartDealSamplesissstalonscardssranksKINGsrowssdealRow(s_si((spysol.pys startGamem@s cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1scolorscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchu@sc Cstdf\}}x|D]}|io ||j o2|idi|d|idi |d}n!|i|d|i |d}||jo||f\}}qqW|SdS(Niɚ;ii( sNonesclosestscdistsstackssstackscardss dragstacksxscxsyscysdist( s_scxscysstackss dragstacksdistsclosestsstackscdist((spysol.pys_getClosestStackx@s2  ( s__name__s __module__s StackWrappers AC_RowStacksNO_RANKsRowStack_Classs createGames startGamesshallHighlightMatchs_getClosestStack(((spysol.pysDerKatzenschwanzK@s   s DieSchlangecBs2tZeedeZeZdZdZ RS(Ns base_rankcCsti|dddddS(Nsrowsi sreservesi(sDerKatzenschwanzs createGames_(s_((spysol.pys createGame@scCs|id}x|iiio|iiid}|itjoD|ii |i d}|io|ii |i dd}qnC|it jo|ii |io|d}n|ii |}|iiid|fddqWdS(Niiiisrowssframesi(s_sstartDealSamplesissstalonscardsscsranksACEs foundationsssuitsto_stacksKINGsrowssdealRow(s_scsisto_stack((spysol.pys startGame@s  #$( s__name__s __module__s StackWrappersFreeCell_AC_RowStacksNO_RANKsRowStack_ClasssFreeCellType_Hints Hint_Classs createGames startGame(((spysol.pys DieSchlange@s isDer Katzenschwanzis Die SchlangesNapoleon_TaloncBstZRS(N(s__name__s __module__(((spysol.pysNapoleon_Talon@ssNapoleon_FoundationcBstZRS(N(s__name__s __module__(((spysol.pysNapoleon_Foundation@ssNapoleon_RowStackcBs#tZdZdZdZRS(NcKs?t|ddddddtti||||f|dS(Nsmodi smax_moveis max_accept( s kwdefaultscapsapplys BasicRowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__@scCsti||| odSn|i odSn|id|df\}}|i|ijodSn|i|id|i i jp|i|id|i i jSdS(Niii( s OpenStacks acceptsCardss_s from_stackscardssc1sc2ssuitsrankscapsmod(s_s from_stackscardssc2sc1((spysol.pys acceptsCards@s cCs|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImage@s(s__name__s __module__s__init__s acceptsCardssgetBottomImage(((spysol.pysNapoleon_RowStack@s  sNapoleon_ReserveStackcBstZdZRS(NcKs9t|ddddtti||||f|dS(Nsmax_moveis max_accepti( s kwdefaultscapsapplys BasicRowStacks__init__s_sxsysgame(s_sxsysgamescap((spysol.pys__init__@s(s__name__s __module__s__init__(((spysol.pysNapoleon_ReserveStack@ssNapoleon_SingleFreeCellcBstZdZdZRS(NcCsti|||SdS(N(s ReserveStacks acceptsCardss_s from_stackscards(s_s from_stackscards((spysol.pys acceptsCards@scCsJ|iiidio|iiidiodSnti||SdS(Nii i(s_sgamesssrowsscardss ReserveStacks canMoveCards(s_scards((spysol.pys canMoveCards@s.(s__name__s __module__s acceptsCardss canMoveCards(((spysol.pysNapoleon_SingleFreeCell@s sNapoleon_FreeCellcBstZdZRS(NcCs:|iii|idiodSnti||SdS(Nii(s_sgamesssrowssidscardss ReserveStacks canMoveCards(s_scards((spysol.pys canMoveCards@s(s__name__s __module__s canMoveCards(((spysol.pysNapoleon_FreeCell@ssDerKleineNapoleoncBs8tZddZdZdZdZdZRS(Nic Cst||if\}}|i|iddd|id|i|id|id|i|idd|i} | |i|i} | |i|i}|i}xYt dD]K}|iit| |||iit|||||i}qW|i|i}|djoX|iit| |||iit||||iit| ||n|iit| |i|||iit||i|||iit| |||iit|||| |if\}}x@t dD]2}|iit||||||i}qW|djo|i|i}n|i|i}t||||_xo|iD]d}|id@djo#d|i gdd g|_nd|igddg|_d|_qW|i dS( Niii iiiii i(!sLayouts_ssslssetSizesXMsXSsYMsYSsx0sx1sx2sysrangesisrowssappendsNapoleon_RowStacksheightsreservessNapoleon_ReserveStacksNapoleon_SingleFreeCellsNapoleon_FreeCellsxs foundationssNapoleon_FoundationsNapoleon_Talonstalonsrsids CARD_XOFFSETs CARD_YOFFSETsdefaultStackGroups( s_sreservessxsrsislsysssx2sx0sx1((spysol.pys createGame@sHJ    ##   # cCs'|di}|i||dSdS(NicCs|i|j|ifS(N(scsrankssuit(scsrank((spysol.pys@s(scardssranks_s_shuffleHookMoveToBottom(s_scardssrank((spysol.pys _shuffleHook@s cCsx:tdD],}|iiid|iid ddq W|i|iiid|iid x4tdD]&}|iiid|iidqtW|iiidddS(Nisrowsisframesisncards( srangesis_ssstalonsdealRowsrowssstartDealSamples dealBaseCards(s_si((spysol.pys startGame@s *   $cCsJ|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch@scCs|idjp |ii odSnd}|iid}|ioZt |idi }|i }|djo|d}q|djo|d}qn|iii d|dS(Nisis Ascendingis Descendingstext(s_spreviewstextssinfostsss foundationssfscardssRANKSsranksgetFoundationDirsdirsconfig(s_sdirstsf((spysol.pys updateText@s    (s__name__s __module__s createGames _shuffleHooks startGamesshallHighlightMatchs updateText(((spysol.pysDerKleineNapoleon@s  %   sDerFreieNapoleoncBstZddZRS(NicCst||if\} } | idddd| i} | it| d| i} |i | i d| i d| i | i | | i d| i d| i }| i | i} xDtdD]6} | i | | i }| iit|| |qWxAtdD]3} || | i }| iit|| |q W|i| id| | i dddf| i } |djo+| iit|| i d| |n@| iit|| || iit|| i | || i d| i }x@td D]2}| iit|| |||| i }q W| i| id d \}}}}t"d d | i#}t%|i&|| i |d|d||i'_(| i |i)| if\}} t*|| || _+| i,dS(Niiiii iii?Biisses canvas_cardscardwsanchorsfont(-sLayouts_ssslsCHsYOFFSETshsYSsmaxssetSizesXMsXSsYMsx1sysrangesjsxsrowssappendsNapoleon_RowStacksNapoleon_ReserveStacks setRegionsreservessNapoleon_SingleFreeCellsNapoleon_FreeCellsis foundationssNapoleon_Foundations getTextAttrstxstystastfsgetFontsCWsfonts MfxCanvasTextscanvasstextssinfosheightsNapoleon_TalonstalonsdefaultStackGroups(s_sreservessfontstxstystfstasx1sishsjslsssysx((spysol.pys createGame@s> 0    *  +# %.(s__name__s __module__s createGame(((spysol.pysDerFreieNapoleon@ssNapoleoncBstZdZRS(NcCsti|dddS(Nsreservesi(sDerKleineNapoleons createGames_(s_((spysol.pys createGameAs(s__name__s __module__s createGame(((spysol.pysNapoleonAss FreeNapoleoncBstZdZRS(NcCsti|dddS(Nsreservesi(sDerFreieNapoleons createGames_(s_((spysol.pys createGame As(s__name__s __module__s createGame(((spysol.pys FreeNapoleonAsisDer kleine NapoleonisDer freie Napoleoniis Free NapoleonsLarasGame_HintcBstZRS(N(s__name__s __module__(((spysol.pysLarasGame_Hint*AssLarasGame_TaloncBs;tZeddddZddddZddZRS(NiiicCs|tjo|iii}n|ii|ii}|i||||}t |idjoN|iid||iiid||iid||iiid|n|ii||dSdS(Niisframes(srowssNones_sgamesss enterStatesS_DEALs old_states dealToStackssflipsreversesframesstempslenscardssmoveMoveswastes leaveState(s_srowssflipsreversesframesstemps old_state((spysol.pysdealRow-As %)cCs)t|idjodSnx|D]}t|idjodSn|ii pt||j pt|o|i i |n|i i d||d||ii |ijoGt|idjodSn|i i d||i iid|n|ii tjolt|idjodSn|i i d||i iid||i i d||i iid|n|ii tjp)|ii tjp|ii tjoGt|idjodSn|i i d||i iid|q%q%Wt|SdS(Niisframesi(slens_scardssstackssrsgetCardsface_upsAssertionErrorsflipsgamesflipMovesmoveMovesframessranksidssswastesACEsJACKsQUEENsKING(s_sstackssflipsreversesframessr((spysol.pys dealToStacks6As2)%)B-c Csd}|iii}|iou|ii}xt |ii D]o}t |iii |idjoF|iid|iii ||iii|iiddddqAqAW|ii||iid||iii dddddt |iii|id}xnt t |iii|iD]J}|iid|iii||iii ||dddddq6W||i_nJ|io|i|ijo,t |i}|ii||ddn|SdS(Niisframesisshadows update_flags(s num_cardss_sgamessswastescardssgetCardsranks curr_ranksranges NUMRESERVESsislensreservessmoveMovesrowssold_ranksflipMoves res_beginsrounds max_roundss turnStackMove(s_ssounds res_beginsis num_cardsswastes curr_rank((spysol.pys dealCardsOAs& #J/ #H(s__name__s __module__sNonesdealRows dealToStackss dealCards(((spysol.pysLarasGame_Talon,As sLarasGame_RowStackcBstZdZRS(NcKs,tti||||f|d|_dS(Ni( sapplys OpenStacks__init__s_sxsysgamescaps CARD_YOFFSET(s_sxsysgamescap((spysol.pys__init__bAs(s__name__s __module__s__init__(((spysol.pysLarasGame_RowStackaAssLarasGame_ReserveStackcBstZRS(N(s__name__s __module__(((spysol.pysLarasGame_ReserveStackeAss LarasGamecBs}tZeZdZdZdZdZdZddZ dZ d Z dd Z d Z d Zd ZRS(Nic Cst|dd|if\}}|i|i|i|id|id|i d|_ |i|i}|i|i }x~t dD]p}|iit|||dd||i}|d jp |d jo!|i|i}||i }qqW|i}|i}xLt d D]>}|iit||||d d d t||i }qW|i|i|i}|i}x@t d D]2}|iit||||||i}qWxt dD]t}|i|id||i f\}}xDt |idD]/}|iit|||||i}qWqW|id|i}|id|i }t|||dd|_|i|id||i}t||||_|i|i|i_|ig|ig|i_|i|i|ig|i_dS(NsXOFFSETi iiii smax_moveiii sdiris base_rankiis max_roundssse( sLayouts_ssslssetSizesXMs NUMRESERVESsXSsYMsYSsold_ranksxsysrangesisrowssappendsLarasGame_RowStacks foundationssSS_FoundationStacksKINGsreservessLarasGame_ReserveStacksLarasGame_Talonstalons createTexts WasteStackswastessgs openstackss talonstackss dropstacks(s_sislsssysx((spysol.pys createGamejAsP!3  "    +   ' cCsd}xatdD]S}|iii oPn|djo|id}n|iiid|qW|i t |ii i|ii |iidddS(Niiisframes( sframessrangesis_ssstalonscardssstartDealSamplesdealRowsmoveMoveslenswaste(s_sframessi((spysol.pys startGameAs    cCsB|i|ijo+|id|ijp|id|ijSdS(Ni(scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchAscCsfSdS(N((s_((spysol.pysgetHighlightPilesStacksAsicCsdSdS(Ni((s_ssound((spysol.pys _autoDealAscCsdSdS(Ni((s_((spysol.pyscanUndoAscCsdSdS(Ni((s_((spysol.pys canSaveGameAscCs|idS(N(s_snotYetImplemented(s_sfilenamesbinmode((spysol.pyssaveGameAscCs|ii|_dS(N(sgamesloadinfosold_ranks_(s_sgame((spysol.pys_restoreGameHookAscCs)|iidd|i|i_dS(Nsold_ranki(s_sloadinfosaddattrspsloadsold_rank(s_sp((spysol.pys _loadGameHookAscCs|i|idS(N(spsdumps_sold_rank(s_sp((spysol.pys _saveGameHookAs(s__name__s __module__sLarasGame_Hints Hint_Classs NUMRESERVESs createGames startGamesshallHighlightMatchsgetHighlightPilesStackss _autoDealscanUndos canSaveGamessaveGames_restoreGameHooks _loadGameHooks _saveGameHook(((spysol.pys LarasGamegAs $        i%s Lara's GamesSanibelcBs\tZeiZeeddZeeddZ e Z e Z dZdZdZRS(Ns max_roundsismax_moveicCs#ti|dddddddS(Nsrowsi swasteis playcardsi(sGypsys createGames_(s_((spysol.pys createGameAscCsx0tdD]"}|iiiddddq Wx*tdD]}|iiiddq@W|i|iii|iiidS(Nisflipisframesi(srangesis_ssstalonsdealRowsstartDealSamples dealCards(s_si((spysol.pys startGameAs    cCsfSdS(N((s_((spysol.pysgetHighlightPilesStacksAs(s__name__s __module__sLayoutsklondikeLayouts Layout_Methods StackWrappersWasteTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssYukon_AC_RowStacksRowStack_Classs Yukon_Hints Hint_Classs createGames startGamesgetHighlightPilesStacks(((spysol.pysSanibelAs   isFlower_FoundationStackcBs#tZdZdZdZRS(NcKsBt|dddddttti|||||f|dS(Ns max_cardsi smax_moveis base_rank( s kwdefaultscapsANY_RANKsapplysAbstractFoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.pys__init__AscCsxtt|dD]}||i||dijodSn||idjo?||i||dif\}}|djo d}qn%|i ||||d\}}|d|jodSqqWt |SdS(Niii i( srangeslensssisrankssuitsasbs_sswapTrashCardss cardsFaceUp(s_sssasbsi((spysol.pysisOonsooSequenceAs$ $ cCs|i|if\}}|djo |djp|djo |djoddf\}}n?|djo |djp|djo |djo d}n||fSdS(Niiii(scardassuitscardbsasb(s_scardascardbsasb((spysol.pysswapTrashCardsAs 44 (s__name__s __module__s__init__sisOonsooSequencesswapTrashCards(((spysol.pysFlower_FoundationStackAs  sFlowerClock_FoundationcBstZdZRS(NcCs|i|| odSn|i}| o|didjSn|di|dij odSn|di}|di}|djo d}n|d|jSdS(Niiii( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksisj(s_s from_stackscardssisjs stackcards((spysol.pys acceptsCardsAs     (s__name__s __module__s acceptsCards(((spysol.pysFlowerClock_FoundationAssGaji_FoundationcBstZdZdZRS(NcKs;tti|||||f||ii i i |_ dS(N( sapplysFlower_FoundationStacks__init__s_sxsysgamessuitscapsappsimagess CARD_YOFFSET(s_sxsysgamessuitscap((spysol.pys__init__As"cCsd|i|| odSn|i}|di|dijo |didd|dijSdS(Niiii (s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsrank(s_s from_stackscardss stackcards((spysol.pys acceptsCardsAs (s__name__s __module__s__init__s acceptsCards(((spysol.pysGaji_FoundationAs sPagoda_FoundationcBstZdZRS(NcCs|i|| odSn|i}| o,|didjo|di|ijSn|di|dij odSn|di}|di}|djo d}nt |djo||djSnGt |djo)|djo d}n||djSn ||jSdS(Niiii( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksidsisjslen(s_s from_stackscardssisjs stackcards((spysol.pys acceptsCardsAs$ ,      (s__name__s __module__s acceptsCards(((spysol.pysPagoda_FoundationAssSamuri_FoundationcBs#tZdZdZdZRS(NcKs<tti|||||f||ii i i |_ dS(N( sapplysFlower_FoundationStacks__init__s_sxsysgamessuitscapsappsimagess CARD_YOFFSET(s_sxsysgamessuitscap((spysol.pys__init__Bs"cCs|i|| odSn|i}| o,|didjo|di|ijSn|di}|djo d}n|di|dijo|di|djSdS(Niiii( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksidsi(s_s from_stackscardssis stackcards((spysol.pys acceptsCards Bs ,   cCs|iiiiSdS(N(s_sgamesappsimagessgetTalonBottom(s_((spysol.pysgetBottomImageBs(s__name__s __module__s__init__s acceptsCardssgetBottomImage(((spysol.pysSamuri_FoundationBs  sMatsuKiri_FoundationcBs#tZdZdZdZRS(NcKs[t|ddddddtti|||||f||ii i i d|_ dS(Ns max_cardsi0s min_acceptis max_accepti (s kwdefaultscapsapplysAbstractFoundationStacks__init__s_sxsysgamessuitsappsimagessCARDHs CARD_YOFFSET(s_sxsysgamessuitscap((spysol.pys__init__Bs"cCs|i|| odSn|i}|i| odSn| o)|didjo|didjSn|did|dijSdS(Niii(s_sbasicAcceptsCardss from_stackscardss stackcardssisOonsooSequencessuitsrank(s_s from_stackscardss stackcards((spysol.pys acceptsCardsBs )cCs|iiiidSdS(Ni(s_sgamesappsimagess getLetter(s_((spysol.pysgetBottomImage%Bs(s__name__s __module__s__init__s acceptsCardssgetBottomImage(((spysol.pysMatsuKiri_FoundationBs  sGreatWall_FoundationcBstZdZdZRS(NcKsKt|ddddddtti|||||f|d|_ dS(Ns max_cardsi$s min_accepti s max_accepti( s kwdefaultscapsapplysFlower_FoundationStacks__init__s_sxsysgamessuits CARD_YOFFSET(s_sxsysgamessuitscap((spysol.pys__init__(Bs"cCs|i|| odSn|i}|didjodSnx;tdD]-}||i|i ddjodSqNqNWt |ddSdS(Nii iisdir( s_sbasicAcceptsCardss from_stackscardss stackcardssranksrangesissuitsidsisRankSequence(s_s from_stackscardssis stackcards((spysol.pys acceptsCards,Bs   (s__name__s __module__s__init__s acceptsCards(((spysol.pysGreatWall_Foundation'Bs sGreatWall_BuildStackcBstZdZdZRS(NcKsUt|ddddtti|||||f||ii i i d|_ dS(Ns max_cardsi smax_movei (s kwdefaultscapsapplysFlower_FoundationStacks__init__s_sxsysgamessuitsappsimagessCARDHs CARD_YOFFSET(s_sxsysgamessuitscap((spysol.pys__init__7Bs"cCs|i|| odSn|i}|o+|di|didjodSqsn|didjodSnx1|D])}|i|iddjodSqzqzWt |ddSdS(Niiiisdir( s_sbasicAcceptsCardss from_stackscardss stackcardssrankscssuitsidsisRankSequence(s_s from_stackscardsscs stackcards((spysol.pys acceptsCards;Bs   (s__name__s __module__s__init__s acceptsCards(((spysol.pysGreatWall_BuildStack6Bs sFourWinds_FoundationcBstZdZRS(NcCs|i|| odSn|i}|di|ijodSn| o|didjSn|did|dijSdS(Niii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsidsrank(s_s from_stackscardss stackcards((spysol.pys acceptsCardsIBs (s__name__s __module__s acceptsCards(((spysol.pysFourWinds_FoundationHBssFlower_OpenStackcBs#tZdZdZdZRS(NcKsBt|ddddtti||||f|||_ dS(Nsmax_movei?Bs max_accept( s kwdefaultscapsapplys OpenStacks__init__s_sxsysgamesyoffsets CARD_YOFFSET(s_sxsysgamesyoffsetscap((spysol.pys__init__TBscCsxtt|dD]}||i||dijodSn||idjo?||i||dif\}}|djo d}qn%|i ||||d\}}|d|jodSqqWdSdS(Niii i( srangeslensssisrankssuitsasbs_sswapTrashCards(s_sssasbsi((spysol.pysisOonsooSequenceXBs$ $ cCs|i|if\}}|djo |djp|djo |djoddf\}}n?|djo |djp|djo |djo d}n||fSdS(Niiiii(scardassuitscardbsasb(s_scardascardbsasb((spysol.pysswapTrashCardseBs 44 (s__name__s __module__s__init__sisOonsooSequencesswapTrashCards(((spysol.pysFlower_OpenStackSBs  sFlowerClock_RowStackcBstZdZRS(NcCsY|i|| odSn|i}| odSn|didd|dijSdS(Niiii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuit(s_s from_stackscardss stackcards((spysol.pys acceptsCardsmBs  (s__name__s __module__s acceptsCards(((spysol.pysFlowerClock_RowStacklBss Gaji_RowStackcBstZdZRS(NcCs|i|| odSn|i}| odSn||didjo|didjp%|didjo|didjodSn$|di|dijodSn|i|d|d\}}|d|jSdS(Niii i( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksswapTrashCardssasb(s_s from_stackscardssasbs stackcards((spysol.pys acceptsCardsuBs P (s__name__s __module__s acceptsCards(((spysol.pys Gaji_RowStacktBssMatsukiri_RowStackcBstZdZRS(NcCsa|i|| odSn|i}| o|didjSn|i|d|dgSdS(Niii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsisOonsooSequence(s_s from_stackscardss stackcards((spysol.pys acceptsCardsBs  (s__name__s __module__s acceptsCards(((spysol.pysMatsukiri_RowStackBssOonsoo_RowStackcBstZdZRS(NcCs|i|| odSn|i}|i| odSn| o|didjSn|di|dijodSn|i|d|dgSdS(Niii(s_sbasicAcceptsCardss from_stackscardss stackcardssisOonsooSequencessuitsrank(s_s from_stackscardss stackcards((spysol.pys acceptsCardsBs (s__name__s __module__s acceptsCards(((spysol.pysOonsoo_RowStackBssSamuri_RowStackcBstZdZRS(NcCs|i|| odSn|i}| o|didjSn|di}|djo d}n|di|dijo|di|djSdS(Niiii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsisrank(s_s from_stackscardssis stackcards((spysol.pys acceptsCardsBs    (s__name__s __module__s acceptsCards(((spysol.pysSamuri_RowStackBssGreatWall_RowStackcBstZdZRS(NcCs|i|| odSn|i}| o|didjSn|di|dijo$|didd|dijSn|i|d|d\}}|d|jSdS(Niiii ( s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsranksswapTrashCardssasb(s_s from_stackscardssasbs stackcards((spysol.pys acceptsCardsBs $ (s__name__s __module__s acceptsCards(((spysol.pysGreatWall_RowStackBssFourWinds_RowStackcBstZdZdZRS(NcCsp|i|| odSn|i}| odSn|di|dijo|did|dijSdS(Niii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsrank(s_s from_stackscardss stackcards((spysol.pys acceptsCardsBs  cCs|iiiiSdS(N(s_sgamesappsimagessgetReserveBottom(s_((spysol.pysgetBottomImageBs(s__name__s __module__s acceptsCardssgetBottomImage(((spysol.pysFourWinds_RowStackBs sAbstractFlowerGamec Bs;tZddddddddd d d d f Zd ZRS(NsPinesPlumsCherrysWisteriasIrissRosesCloversMoonsMumsMaplesRainsPhoenixcCs|i|ijodSn|i|if\}}|djo d}n|djo d}n|d|jp|d|jSdS(Niii(scard1srankscard2ssuitsasb(s_sstack1scard1sstack2scard2sasb((spysol.pysshallHighlightMatchBs    (s__name__s __module__sSUITSsshallHighlightMatch(((spysol.pysAbstractFlowerGameBs*s FlowerClockcBs8tZdZdZdZdZedZRS(Nc Cs_t||if\}}tdd|i} |i|i|i d|i |i dddddddd d d d d df }d d dddddddd d df }|i|i d}|id} xtdD]}||||i } | |||i }|iit| ||tt|i| |id||i ddd| d|i|} qWxtdD]}|i|i |i |df\}} xPtdD]B}|iit|| |d|iddd||i }qWq~W|i |idd|i ddft!|i"|i |i#|i ||_$|i%dS(Ns canvas_cardscardwf10.5f5.5iif2.5iiif-2.5f0.25f0.75f1.8999999999999999if3.5f3.75ii sanchorscentersfontstextf2.7000000000000002isyoffsets max_cardsii?B(&sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsxoffsetsyoffsetsxsCHsysrangesisx0sy0s foundationssappendsFlowerClock_FoundationsANY_SUITs MfxCanvasTextscanvassSUITSstsjsrowssFlowerClock_RowStacks setRegionsInitialDealTalonStackswidthsheightstalonsdefaultStackGroups( s_sy0sjsislsyoffsetsssxoffsetsxsysx0sfontst((spysol.pys createGameBs4,**  !  ' " &)cCst|iiidjptx*tdD]}|iiiddq0W|i |iiit|iiidjptdS(Ni0isframesi( slens_ssstalonscardssAssertionErrorsrangesisdealRowsstartDealSample(s_si((spysol.pys startGameBs#  cCs_xT|iiD]F}t|idjodSn|idi|ijodSq q WdSdS(Niii(s_sss foundationssislenscardssranksid(s_si((spysol.pys isGameWonBs  cCsdSdS(Ni((s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchBscCsM|tjo|iif|iifSn |ii|ii|iifSdS(N(seventsNones_ssgs dropstacks(s_sevent((spysol.pys getAutoStacksBs (s__name__s __module__s createGames startGames isGameWonsshallHighlightMatchsNones getAutoStacks(((spysol.pys FlowerClockBs     sGajicBs,tZdZdZdZdZRS(Nc Cst||if\}}|i|id|id|id|id|i}|i}|i i t |||d||id}|i i t |||d||id}xPtdD]B}|ii t|||d |idd d||i}qW|i|i|i|idd d |i|iddd f|d}|i i t |||d||id}|i i t |||dt|i|i|i|i||_|idS(Nii iiii iisyoffsets max_cardsi ii?Bii(sLayouts_ssslssetSizesXMsXSsYMsYSsxsys foundationssappendsGaji_Foundationsrangesisrowss Gaji_RowStacksCHs setRegionsInitialDealTalonStackswidthsheightstalonsdefaultStackGroups(s_sislsssysx((spysol.pys createGameBs(4   " C )cCsttttg}xa|D]X}||i oC|idjo |idj o|||i<|i|qrqqW||SdS(Ni i(sNonestopcardsscardsscssuitsranksremove(s_scardsscstopcards((spysol.pys _shuffleHookCs! c Csat|iiidjptx*tdD]}|iiiddq0W|i |ii }|iiid|d|d|d|d|d |d f|iiid|d|d|d |d f|iiid|d|d f|ii }|iiid|d|d|d|d ft|iiidjptdS( Ni0isframesisrowsiiiiii( slens_ssstalonscardssAssertionErrorsrangesisdealRowsstartDealSamplesrowssrs foundations(s_sisr((spysol.pys startGame Cs#   @2$ 2cCsH||iijo1|io|idi o|i|qDndS(Ni(sstacks_sssrowsscardssface_upsflipMove(s_sstack((spysol.pys fillStackCs(s__name__s __module__s createGames _shuffleHooks startGames fillStack(((spysol.pysGajiBs   sOonsoocBs,tZdZdZdZdZRS(NcCslt||if\}}|i|id|id|i|id|i|id}|i}xJt dD]<}|i it|||d|i||id}quW||id}||id}xJt dD]<}|i it|||d|i||id}qW|i}|i}t||||_|i|id |idS( Niiif1.5syoffsetf1.1000000000000001f2.5f6.5999999999999996sss(sLayouts_ssslssetSizesXMsXSsYMsYSsxsysrangesisrowssappendsOonsoo_RowStacksYOFFSETsDealRowTalonStackstalons createTextsdefaultStackGroups(s_sislsssysx((spysol.pys createGameCs&0  % %  cCs]t|iiidjpt|iiidddd|i|iiidS(Ni0sflipisframes( slens_ssstalonscardssAssertionErrorsdealRowsstartDealSamples dealCards(s_((spysol.pys startGame0Cs# cCsz|iiiodSnxW|iiD]I}t|idjp"t|i p|i|i odSq%q%WdSdS(Niii(s_ssstalonscardssrowsslens cardsFaceUpsisOonsooSequence(s_ss((spysol.pys isGameWon5Cs ; cCsH||iijo1|io|idi o|i|qDndS(Ni(sstacks_sssrowsscardssface_upsflipMove(s_sstack((spysol.pys fillStackW|i |iii t|iiidjptdS(Ni0iisflipisframes( slens_ssstalonscardssAssertionErrors updateTextsrangesisdealRowsstartDealSample(s_si((spysol.pys startGame Ds'    cCsH||iijo1|io|idi o|i|qDndS(Ni(sstacks_sssrowsscardssface_upsflipMove(s_sstack((spysol.pys fillStackDscCsJ|i|ijo3|idd|ijp|idd|ijSdS(Nii (scard1ssuitscard2srank(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchDs(s__name__s __module__s createGames updateTexts startGames fillStacksshallHighlightMatch(((spysol.pys GreatWallCs  3  s FourWindscBs,tZdZdZdZdZRS(Nc Cst||if\}}tdd|i} |id|id|i d|i dddd d d d d f}|i d}|i } ddddf}ddddf}xtdD]}||||i} | |||i }|iit| |||t|i| |id||i dddd| d||} qWddddf}ddddf}xtdD]}||||i} | |||i }|iit| ||ddddddt|i| |id||i dddd| d||d} qW|i|i||i| |i d||idd| |i ddf|d|i}| d|i } t|| |ddd d|_|i |id!||i}t!|| ||_"|i |i"d!|i#dS("Ns canvas_cardscardwiiisNorthsEastsSouthsWestsNWsNEsSEsSWif2.5iisanchorscentersfontstextf1.25f3.75f0.75syoffseti s max_cardss max_acceptif0.65000000000000002snum_deals max_roundssss($sLayouts_ssslsgetFontsCWsfontssetSizesXSsYSsYMsTEXTSsXMsxsysxoffsetsyoffsetsrangesisx0sy0s foundationssappendsFourWinds_Foundations MfxCanvasTextscanvasstsrowssFourWinds_RowStacks setRegionsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups( s_sy0sislsyoffsetsTEXTSsssxoffsetsxsysx0sfontst((spysol.pys createGameDsD)   %  %$O! cCsAt|iiidjpt|i|iiidS(Ni0(slens_ssstalonscardssAssertionErrorsstartDealSamples dealCards(s_((spysol.pys startGameDs(s_s_shuffleHookMoveToTopscards(s_scards((spysol.pys _shuffleHookDscCsN|ix=tt|iD]&}|iiid|ii d q WdS(Nsrowsi( s_sstartDealSamplesrangeslenscardssissstalonsdealRowsrows(s_si((spysol.pys startGameDs cCs*t|iidit|ijSdS(Ni(slens_sssrowsscards(s_((spysol.pys isGameWonDs(s__name__s __module__sHanoiPuzzle_RowStacksRowStack_Classs _shuffleHooks startGames isGameWon(((spysol.pys HanoiPuzzle4Ds  s HanoiPuzzle5cBstZRS(N(s__name__s __module__(((spysol.pys HanoiPuzzle5Dss HanoiPuzzle6cBstZRS(N(s__name__s __module__(((spysol.pys HanoiPuzzle6Dsi|sTower of HanoyssuitsisHanoi Puzzle 4srules_filenameshanoipuzzle.htmlisHanoi Puzzle 5isHanoi Puzzle 6sHexADeck_FoundationStackcBstZdZRS(NcKs<t|ddddtti|||||f|dS(Nsmax_moveis max_cardsi ( s kwdefaultscapsapplysSS_FoundationStacks__init__s_sxsysgamessuit(s_sxsysgamessuitscap((spysol.pys__init__Ds(s__name__s __module__s__init__(((spysol.pysHexADeck_FoundationStackDssHexATrump_FoundationcBstZdZRS(NcCs`|i|| odSnx9|iiid D]$}t|idjodSq0q0WdSdS(Niiii(s_sbasicAcceptsCardss from_stackscardssgamesss foundationsslen(s_s from_stackscardsss((spysol.pys acceptsCardsDs (s__name__s __module__s acceptsCards(((spysol.pysHexATrump_FoundationDssHexADeck_OpenStackcBstZdZRS(NcKs<t|ddtti||||f|||_ dS(Nsmax_movei?B( s kwdefaultscapsapplys OpenStacks__init__s_sxsysgamesyoffsets CARD_YOFFSET(s_sxsysgamesyoffsetscap((spysol.pys__init__Ds(s__name__s __module__s__init__(((spysol.pysHexADeck_OpenStackDss Bits_RowStackcBstZdZRS(NcCs|i|| odSn|i}|p|didjodSn|id}x8|ii i |d|i!D]}|i odSqsqsW|ii i |idi d|id?d|di ddjSdS(Niiiii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsidsisgamesssrowssrs foundationssrank(s_s from_stackscardssis stackcardssr((spysol.pys acceptsCardsDs    (s__name__s __module__s acceptsCards(((spysol.pys Bits_RowStackDssBytes_RowStackcBstZdZRS(NcCs|i|| odSn|i}|p|didjodSn|id}|d}x<|ii i d|d|i!D]}|i odSqqW|ii i |idi |di jSdS(Niiiii(s_sbasicAcceptsCardss from_stackscardss stackcardsssuitsidsisgamesssrowssrs foundationssrank(s_s from_stackscardssis stackcardssrsid((spysol.pys acceptsCardsDs   "  (s__name__s __module__s acceptsCards(((spysol.pysBytes_RowStackDssHexAKlon_RowStackcBstZdZRS(NcCsXti|||odSn|i}| p%|didjp|didjSdS(Niiii(s AC_RowStacks acceptsCardss_s from_stackscardss stackcardsssuit(s_s from_stackscardss stackcards((spysol.pys acceptsCardsDs (s__name__s __module__s acceptsCards(((spysol.pysHexAKlon_RowStackDss BitsNBytescBs;tZdZdZdZdZdZdZRS(NicCst||if\}}tdd|i}|i|id|i d|i |i d|i }xt dD]}|id|i d}xUt dD]G}|iit|||ddddd |d d ||i }qW||i }qvW|i }xt dD]}|id |i d }xUt d D]G}|iit|||ddddd td d ||i }q>W||i }qW|id |i }|i }xRt dD]D}|iit||||ddd d dd||i }qW|i|id d ddf|i}|i }t|||dd dd |_|i|id||i |i d }t||||_|i|id|idS(Ns canvas_cardscardwiiis max_cardsis max_accepts base_suitsmax_moveiiismodi?Bsnum_deals max_roundssss(sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsysrangesjsxsisrowssappends Bits_RowStacksBytes_RowStacksANY_SUITs foundationssSS_FoundationStacks setRegionsWasteTalonStackstalons createTexts WasteStackswastesdefaultStackGroups(s_sisjslsssxsysfont((spysol.pys createGameDsN0          !cCstgdtgdf\}}x|D]}|idj o||i oud}x2tdD]$}|i ||jo d}qaqaW| o.|||i<|i ||i<|i |qqq(q(W||}|i |SdS(Niii( sNonestopcardssranksscardsscssuitshaveranksrangesisranksremovesreverse(s_scardssistopcardssranksscshaverank((spysol.pys _shuffleHookDs"     cCs]t|iiidjpt|i|iiid|ii|iii dS(NiDsrows( slens_ssstalonscardssAssertionErrorsstartDealSamplesdealRows foundationss dealCards(s_((spysol.pys startGameEs# cCs2x'|iiD]}|i odSq q WdSdS(Nii(s_sssrowsscards(s_ss((spysol.pys isGameWon Es    cCsdSdS(Ni((s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchEs(s__name__s __module__s GAME_VERSIONs createGames _shuffleHooks startGames isGameWonsshallHighlightMatch(((spysol.pys BitsNBytesDs  #   sHexAKloncBs)tZeZdZdZdZRS(NcCs$t||if\}}tdd|i}|i|i|i d|i |i d|i}|i }t|||dddd|_|i|id ||i }t||||_|i|id |i|i d }xRtd D]D}|iit||||d d dd dd ||i }qW|iit|||d d d dddd |i}|i d |i }x[tdD]M}|iit|||dddddtdddd||i }qW|i|id||i dddf|idS(Ns canvas_cardscardwiisnum_dealis max_roundsisssiismodismax_moves max_cardsiics max_accepts base_suits base_rankiii?B(sLayouts_ssslsgetFontsCWsfontssetSizesXMsXSsYMsYSsxsysWasteTalonStackstalons createTexts WasteStackswastesrangesis foundationssappendsSS_FoundationStacksHexATrump_FoundationsrowssHexAKlon_RowStacksANY_SUITs setRegionsdefaultStackGroups(s_sislsssxsysfont((spysol.pys createGameEs8,  !     *cCst|iiidjptxPtt|iiD]6}|iii d|ii|dddddq<W|i |iii |iii dS(NiDsrowsisflipisframes( slens_ssstalonscardssAssertionErrorsrangesrowssisdealRowsstartDealSamples dealCards(s_si((spysol.pys startGame-Es#4 cCsdSdS(Ni((s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatch4Es(s__name__s __module__sCautiousDefaultHints Hint_Classs createGames startGamesshallHighlightMatch(((spysol.pysHexAKlonEs  is Bits n Bytesstrumpsis Hex A KlonsMemory_RowStackcBs>tZdZdddZeZeZdZdZRS(NcCs|i}t|idjp|idiodSn|itjo*|iddd|i||_n*t|iidjo|iidipt |id|iidf\}}|i|ii ||o|i d|in|iddd|id|_|id|iid|i|ii|id|ii|ii|id |it|_|iidSdS( Niisflipspriorityiismovesf0.5f0.20000000000000001(s_sgameslenscardssface_ups other_stacksNones playSamplesflipMovesAssertionErrorsc1sc2s cardsMatchs _dropPairMovesscores updateStatussmovessindexs updateTextscanvassupdate_idletasksssleeps finishMove(s_seventsgamesc2sc1((spysol.pys clickHandler=Es2 '  4#          icCs@|i}|iddd|id|_|id|_dS(Nsdroppairspriorityiii(s_sgames playSamples closed_cardssscore(s_sns other_stacksframessshadowsgame((spysol.pys _dropPairMoveYEs cCsdSdS(Ni((s_sevent((spysol.pyscontrolclickHandler`EscCsdSdS(Ni((s_sevent((spysol.pysshiftclickHandlerbEs(s__name__s __module__s clickHandlers _dropPairMovesrightclickHandlersdoubleclickHandlerscontrolclickHandlersshiftclickHandler(((spysol.pysMemory_RowStackEsiii'i'(s_sgamesfiltersssrowssstacksstsSTEPSsdxsdysmapsgetspossrscardss acceptsCardssapps miscrandomsrandintsscoresaddHint(s_sscoresgamesrstsdxsdysstacks((spysol.pys computeHintsEs  .*(s__name__s __module__s computeHints(((spysol.pys Pegged_HintEssPegged_RowStackcBs;tZdZdZdddZdZdZRS(NcCs6ti||| odSn|i|tj SdS(Ni(s ReserveStacks acceptsCardss_s from_stackscardss_getMiddleStacksNone(s_s from_stackscards((spysol.pys acceptsCardsFscCstdfSdS(Ni(sNone(s_sstacks((spysol.pys canDropCardsFsicCs|i|}|ii|ii}|iii d}|ii |||dd|ii ddd|ii |||ddd||ii||i|idS(Nisframessdropspriorityiisshadow(sto_stacks_getMiddleStacks_s other_stacksgames enterStatesS_FILLs old_statesss foundationssfsmoveMovesncardss playSamplesshadows leaveStates fillStack(s_sncardssto_stacksframessshadowsfs other_stacks old_state((spysol.pysmoveMoveFs" cCs|id|id|id|idf\}}|iii||f otSn|ii i|id|d|id|df}| p|i otSn|SdS(Niii( s from_stacksposs_sdxsdysgamesSTEP_MAPsgetsNonesmapssscards(s_s from_stacksssdxsdy((spysol.pys_getMiddleStackFs69cCs ti|||i|_dS(N(s ReserveStacks copyModels_sclonespos(s_sclone((spysol.pys copyModelFs(s__name__s __module__s acceptsCardss canDropCardssmoveMoves_getMiddleStacks copyModel(((spysol.pysPegged_RowStackEs    sPeggedcBstZeZddfddfddfddffZdddddddfZdZdZd Zd Z e d Z d Z d Z RS(Niiiiiiic Csmt||if\}} t|i}}|id|jp|id|jo|d}n|i|i ||i |i t |i|i h|_xtt |iD]}|i|} xt| D]}|| d|}|i ||i d|i ||i f\} } t| | |}|d|f|_| ii|||i|iOFsii(sGames getWinStatuss_swonsstatussupdatedsfiltersgamesssrowssstacksslensAssertionErrorsidsEMPTY_STACK_IDsU_WON(s_sstatussupdatedswonsstacks((spysol.pys getWinStatusLFs c Csg}x|iiD]}|i oqn|i\}}x|iD]\}}|i i ||||f}|o|i oN|i i ||d||df}|o|io|i|qqDqDWqW|dffSdS(Nii(srowss_sssrscardsspossrxsrysSTEPSsdxsdysmapsgetsmsappend( s_srowssmsrxsrysssrsdxsdy((spysol.pysgetHighlightPilesStacksTFs    ((s__name__s __module__s Pegged_Hints Hint_ClasssSTEPSsROWSsEMPTY_STACK_IDs createGames startGames isGameWonsNones getAutoStackss getWinStatussgetHighlightPilesStacks(((spysol.pysPeggedFs*    s PeggedCross1cBs#tZdddddddfZRS(Nii(s__name__s __module__sROWS(((spysol.pys PeggedCross1aFss PeggedCross2c Bs)tZdddddddddf ZRS(Nii (s__name__s __module__sROWS(((spysol.pys PeggedCross2cFss Pegged6x6cBs&tZdZddddddfZRS(Nii(s__name__s __module__sEMPTY_STACK_IDsROWS(((spysol.pys Pegged6x6eFss Pegged7x7cBs#tZdddddddfZRS(Ni(s__name__s __module__sROWS(((spysol.pys Pegged7x7hFssPeggedTriangle1cBs_tZddfddfddfddfddfddffZdddddfZdZRS( Niiiiiiii(s__name__s __module__sSTEPSsROWSsEMPTY_STACK_ID(((spysol.pysPeggedTriangle1jFs<sPeggedTriangle2cBs tZddddddfZRS(Niiiiii(s__name__s __module__sROWS(((spysol.pysPeggedTriangle2nFsc Csid}x|iD]}||}qWt|||tidddhd|t||if\}}t|ddddt|i|f||i|i d|i dxb|ii D]T}dd|i d j}|i i|i|i|i||i d |d |qrWx9|iiD]+}|ii|i|i|i|qW|i|iii|iii||_|idS( Nsrowsis playcardsiiiiiismods max_cards(sLayouts_sssls kwdefaultslayoutsapplys Layout_MethodssetSizessizes foundationssrssuitsnsappendsFoundation_ClasssxsysrowssRowStack_Classs Talon_Classstalons defaultAll(s_slayoutslsnsssr((spysol.pys createGamelHs $ )*iicCst|iiidjptx*|D]"}|iiid|ddq*W|i |iii|oC|iiid|ii dd!|iiid|ii n!|iiid|ii d dS(NiNsflipsframesisrowsii( slens_ssstalonscardssAssertionErrorsflipsfsdealRowsstartDealSamples foundationssrows(s_sflips foundationssf((spysol.pys startGameyHs#  # cCsb|id|ijp|id|ijo0|idjp |idjp|i|ijSdS(Nii(scard1srankscard2ssuitscolor(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchHs(s__name__s __module__sLayoutsbakersDozenLayouts Layout_MethodsInitialDealTalonStacks Talon_ClasssSS_FoundationStacksFoundation_ClasssCavalier_RowStacksRowStack_Classs createGames startGamesshallHighlightMatch(((spysol.pysCavaliergHs   sFiveAcescBstZdZdZRS(NcCs|i|dSdS(NcCs|idj|ifS(Ni(scsrankssuit(sc((spysol.pysHs(s_s_shuffleHookMoveToBottomscards(s_scards((spysol.pys _shuffleHookHscCsti|dddS(Ns foundationsi(sCavaliers startGames_(s_((spysol.pys startGameHs(s__name__s __module__s _shuffleHooks startGame(((spysol.pysFiveAcesHs sWickedcBsPtZeeddZeedddddeZeZ dZ dZ RS( Ns max_roundsismax_moveis max_accepts base_rankcCs&ti|ddddfdddS(Nsflipis foundations(sCavaliers startGames_(s_((spysol.pys startGameHscCsB|id|ijp|id|ijo|i|ijSdS(Ni(scard1srankscard2ssuit(s_sstack1scard1sstack2scard2((spysol.pysshallHighlightMatchHs( s__name__s __module__s StackWrappers Wicked_Talons Talon_Classs SS_RowStacksNO_RANKsRowStack_ClasssCautiousDefaultHints Hint_Classs startGamesshallHighlightMatch(((spysol.pysWickedHs  sNastycBs&tZeedddddeZRS(Nsmax_moveis max_accepts base_rank(s__name__s __module__s StackWrappersNasty_RowStacksANY_RANKsRowStack_Class(((spysol.pysNastyHsc Cs`|tiBtiBtiB}t||||||dt ddt d}t ||SdS(Nsranksistrumpsi(s game_typesGIs GT_TAROCKs GT_CONTRIBs GT_ORIGINALsGameInfosids gameclasssnamesdeckssredealssrangesgis registerGame(sids gameclasssnames game_typesdeckssredealssgi((spysol.pysrHs  isWheel of FortuneisImperial Trumpsiiis Fifteen plusiiisDouble Grasshopperiiis Five AcesiisPysolScrolledCanvascBs2tZdZdZedZedZRS(NcCsHtti||if|||_|iidddddddS(Nsrowiscolumnsstickysnews(sapplys MfxCanvass__init__s_sframeskwscanvassgrid(s_skw((spysol.pys createCanvasHs cCsr|iio d|_n|iid|d||iid|d||iiddd||fdS(Niswidthsheights scrollregioni(s_scanvasswinfo_ismappedsresize_pendingsframesconfigswidthsheight(s_swidthsheight((spysol.pyssetInitialSizeHs  cCsdS(N((s_sw((spysol.pysbindHbarHscCsdS(N((s_sw((spysol.pysbindVbarHs(s__name__s __module__s createCanvasssetInitialSizesNonesbindHbarsbindVbar(((spysol.pysPysolScrolledCanvasHs   sOptionscBs/tZdZedZdZdZRS(NcCs\t|_d|_d|_d|_d|_d|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_g|_ d|_!t"|_#t"|_$d|_%d|_&|i'|i(dS(Nisunknownis#008200if1.5i()s VERSION_TUPLEs_s version_tuplessavedsplayersconfirmsupdate_player_statss autofaceupsautodropsautodeals quickplaysundos bookmarksshintshighlight_pilesshighlight_cardsshighlight_sameranks tablecolors animationssshadowsshades hint_sleeps demo_sleeps demo_logos demo_scorestoolbars toolbar_sizes statusbarssounds sound_modessound_sample_volumessound_music_volumes recent_gameids last_gameidsNones last_players last_save_dirs game_holdeds wm_maximizeds setDefaultss setConstants(s_((spysol.pys__init__HsL                                     cCsVdddf\}}}|o.|i|i|if\}}}n|djo d|_n t |_d}d|jo djnpd|jo djno d}nhd|df<t i |df<t i d df<t id df<t id df<t id df<t id df<t id df<|_dS( NiisFade_Green.ppmsOxymoroni iXs2000ssKintengus Vienna 2Ks Hex A DecksDashavatara Ganjifa(sswsshssdstopswinfo_screenwidthswinfo_screenheightswinfo_screendepths_stabletile_namesNonescsCSIs TYPE_FRENCHs TYPE_HANAFUDAs TYPE_TAROCKs TYPE_HEXADECKsTYPE_MUGHAL_GANJIFAsTYPE_NAVAGRAHA_GANJIFAsTYPE_DASHAVATARA_GANJIFAscardset(s_stopsswscsshssd((spysol.pys setDefaultsHs.   < cCsd|_d|_d|_d|_d|_d|_d|_tdf|_ d|_ tdtdf|_ d|_ tdtdf|_ d|_td jod|_d|_d|_ndS( Niif2.0f1.0f1.5s#ffc000s#0000ffs#303030sPyJongg(s_s win_animationstoolbar_reliefs dragcursorsmagnetic_mousesmagnetic_mouse_timesraise_card_sleepshighlight_piles_sleepsNoneshighlight_piles_colorsshighlight_cards_sleepshighlight_cards_colorsshighlight_samerank_sleepshighlight_samerank_colorsshintarrow_colorsPACKAGEshighlight_sameranksshadowsshade(s_((spysol.pys setConstantsHs"             cCs.t}t|i|i|i|SdS(N(sOptionssopts merge_dicts__dict__s_s setConstants(s_sopt((spysol.pyscopy Is  (s__name__s __module__s__init__sNones setDefaultss setConstantsscopy(((spysol.pysOptionsHs '  s StatisticscBsGtZdZdZdZdZdZdZdZRS(NcCs^t|_d|_h|_h|_h|_h|_h|_h|_ h|_ d|_ dS(Ni( s VERSION_TUPLEs_s version_tuplessavedsstatss demo_statss prev_gamessall_prev_gamess session_gamess total_balancessession_balancesgameid_balance(s_((spysol.pys__init__Is         cCs tSdS(N(s Statistics(s_((spysol.pysnewIscCs|i||i||i||i||ii| odSn|djo|i|=ng|i|d\}}|i||\}}||||f|i|d1Is(sgamesshas_keysplayersgameidsfilter(s_splayersgamessgameid((spysol.pys__resetPrevGames+Is   cCsN|ii|}|tjoh}|i|IsK( s__name__s __module__s__init__snews resetStatss_Statistics__resetPrevGamessgetStatss updateStatss updateLog(((spysol.pys StatisticsIs    sCommentscBs,tZdZdZdZdZRS(NcCst|_d|_h|_dS(Ni(s VERSION_TUPLEs_s version_tuplessavedscomments(s_((spysol.pys__init__NIs  cCs tSdS(N(sComments(s_((spysol.pysnewRIscCs,t}d||f}t||i|t=|_?t@}| o d}n|d }||i_Atdddtdtdddtdddt|_Btd t|_Cd|_DdS(!NsApplication.__init__iisbordersdemoslogossredealsshadesstatssprogressshomesconfigspluginss savegamessmaintsopts options.datsstatistics.datsholdgames holdgame.datscommentss comments.datsntsunknownisidsrandoms loadedgames startdemoscardsetsbookmarksloadgame(EsTimers_s starttimersGAME_DBsgdbsOptionssoptscopys startup_opts StatisticssstatssCommentsscommentss splashscreensdebugsNonestopstop_bgs top_cursorsmenubarstoolbarscanvass statusbarsgames dataloadersaudiosimagesssubsampled_imagessStructsgimagess progress_bgsprogress_imagessCardsetManagerscardset_managerscardsets TileManagerstabletile_managerstabletile_indexs SampleManagerssample_managers MusicManagers music_managersmusic_playlistsintrososspathsnormpaths gethomedirshomes getprefdirsPACKAGEsconfigsjoinsdns__dict__sitemssksvsfnsnamesnormcases LCRandom64s gamerandoms miscrandoms getusernamesplayersnextgames commandlines demo_counter(s_splayershomesconfigsksv((spysol.pys__init__]Is                              $        cCs|ii|_y|iWnnXy|iWnnX|i|iio|ii|i_ n|i i d}|i |}|iidjo |ii ot}y|i|ii|}Wn t}nX|om|i |iijo |iio2|iid|i_d|i_||i_qW|it|nt}n|iio |ii oNy4|i|ii||i_d|iii_Wqt|i_qXnd|i_|it|t}t||i|_t|i|_|ii |ii|i!|ii"}t$|id|d|ii"|_%|i%i&|ii'|i%i |ii%|i(i)o|i(i)i*ddnt+|i|_,|i,i-dddd|i.|i/d dz^xWnoO|i0tj pt1|ii |ii2f\}}dtf\|i_ |i_2|i3|||iioc|ii djpt1y;d|ii_|ii4|ii|ii |i_WqqXn|i5|ii djoPn|ii0|i0j o-|i6|ii0d |ii d d d q|i7|ii qWWd||i_y|i8WnnXy|i9WnnXy|i:WnnXy|i;WnnXy|i<i=WnnXXdS(Niisdirssizesstepsfillsbothsexpandsforcesidsupdateii(>s_soptscopys startup_optsloadStatisticss loadCommentss getGameClasss last_gameidsnextgamesidsgdbsgetGamesIdSortedByNames constructGamestmpgames game_holdeds loadedgamesNonesgames _loadGamesfnsholdgamesgstatssholdedsloadedsdestructs commandlinesloadgames PysolMenubarstopsmenubarsPysolStatusbars statusbarsshowsgetToolbarImagesDirs toolbar_sizesdirs PysolToolbarstoolbars setReliefstoolbar_reliefsintrosprogresssupdatesPysolScrolledCanvasscanvasspackssetTilestabletile_indexscardsetsAssertionErrorsrandomsrunGames _saveGamesfreeGames loadCardsetsrequestCompatibleCardsetTypes wm_save_states saveOptionsssaveStatisticss saveCommentssaudiosdestroy(s_stmpgamesrandomsgamesdirsid((spysol.pysmainloopIs! #      $   - cCs|ii||i|}|tjoRd}t}|i|}|tjo&|ii d}|i|}q~n|i |}|o t |t ijo |djpt|tj o |i|jpt|i||_|ii|d|i_|ii||ii o |ii o7|idjo ||i_||i_dSqsn|ii|i|ii|i|i|iid|iix:no2y|iii |Wqt!j oPqXqW|iii"d||iid3|ii#|ii|i$i%o0|i$i%i&t'|i$i%t|i$_%nd}|ii)tj o6d|i*_+|ii,|ii)t'|ii)nY|iitj o|ii-|iin,d|i*_+|ii.d|ddd}t|i_)t|i_|i/pt0d@onU|i1djoDt2|d d d d}|djo|od|i_qqnd|_1|iio*d|i_|ii4|ii5n(|o |ii6d|ii*_7nd|i_|ii8dS( Niiisplayerisrandomsautoplayistimeouti Nssound(9s_stops connectApps getGameClasssidsgsNonesrandomsgdbsgetGamesIdSortedByNames getGameInfosgistypestypess ClassTypesAssertionErrors constructGamesgames setSelectedsbusyscreatesnextgames startdemosbookmarksrequestCompatibleCardsetSizesmenubars connectGamestoolbars updateStatussoptsplayers recent_gameidsremoves ValueErrorsinsertsupdateRecentGamesMenusintrosprogresssdestroysdestructsautoplays loadedgamesstatssgameid_balances restoreGamesrestoreGameFromBookmarksnewGamesdebugsbundles splashscreens helpAboutsstatuss startDemoscreateDemoInfoTextsautoPlays player_movessmainloop(s_sidsrandomsstatussgsgisautoplay((spysol.pysrunGameIs  1$                  cCs|iitt|iitt|i|ii|ii|i o|i i t |i nt|_ |i i tdS(N( s_stoolbars connectGamesNonesmenubarsunbind_destroyscanvassdeleteAllItemssupdate_idletaskssgamesdestructstops connectApp(s_((spysol.pysfreeGameBJs      scCsdS(N((s_sinfo((spysol.pysdumpMemMJscCs[|ioM|ii}|djod|i_qW|djod|i_qWndS(Nszoomedisnormali(s_stopswm_statesssopts wm_maximized(s_ss((spysol.pys wm_save_stateOJs    cCsi|iio0|iiit|iit|i_n|iot|i|iindS(N( s_sintrosprogresssdestroysdestructsNonestops wm_withdraws busyUpdate(s_((spysol.pys wm_withdrawVJs   cCsRtiidd}|iiit|i i d||iiit|i i d||iii|i i d||iii|i i d||iii|i i d||iii|i i d||iii|i i d |d}x6d d fD](}|ii i|i i ||q"WdS( Nsimagesslogossjoker07_40_774sjoker08_40_774sjoker07_50_774sjoker08_50_774sjoker11_100_774s joker10_100spysol_40sstopsignsredeal( sosspathsjoinsdirs_sgimagesslogossappends loadImages dataloaders findImagesfsredeal(s_sdirsf((spysol.pys loadImages1^Js((""""" cCstiidd}x?dddddfD](}|iii|i i ||q+Wtiidd}x3d fD](}|ii i|i i ||qvWdS( Nsimagessdemosdemo01sdemo02sdemo03sdemo04sdemo05sstatssbarchart( sosspathsjoinsdirsfs_sgimagessdemosappends dataloaders findImagesstats(s_sdirsf((spysol.pys loadImages2jJs& cCsdS(N((s_((spysol.pys loadImages3qJscCsx|iiiD]\}}t|tijoxst t |D]_}t||ti jo?t ||||<|iio|iiiddqqHqHWt||ii||| q&WntM|iNiOdjoS|iAtB| dtd?dd@|i i dAtdBdddd f}d Sn|iPt'}|i*iQiRd}|oD|iSiT|d}|o|d o|iUdC|d qIn| o|iSiRd}n|iSiMdjp| otV|dDSn|iW}tY}|i*i[|_GdE|_)t'|_\|i]||i^|i*i_oBx?|i`D]-}|i*i_|iajo|ib|_cPqqWn|id|ie|i(if||i(igt'jod|i*_hnt-o |i(ii otdFGHd }n|i(ij|i(igo|iki`} | otm| |_n|ioip|innoYxV|inD]G}tris|i)dGjo(|init||iniud|Pq q Wn|i(iv|inqm ndH|_w|ix|iy o'|izi{d|izi{d f|_yn|iA| oti)d&jo t-t'jono&|i*ihot|i}dIti~t|io!d }tt'jo d } q2 ntt'jo tdJGHn tdKGHtiin| o9| itB| dtdLddMddNddOf}nA|o9| itB| dtdLddPddNddOf}ndQt}|i*i[}|icdjo dR}nt|| d|dS|d|iwdT|iy|i_|i|i|i|ii}|i|dU|dVd  oWxT|iSi`D]1}|i|i|dU|dVd oPq q WtV|dDSndSdS(WNismusics screenshotsstilesshtmls license.htmlis --nopluginsisgamesspluginsss s --nosounds classNamesbgscursorsntii,sWM_DELETE_WINDOWiiistitles init errorstextsg requires a minimum screen resolution of 640x480 with 256 colors. Please change your display settings.sbitmapserrorsstringssQuitswidthi i@sheightiXsposixs#d9d9d9s backgroundsactiveBackgrounds*fonts Helvetica -12i<smacs60sButtonsCanvass CheckbuttonsEntrysFramesLabelsListboxs MenubuttonsMessages RadiobuttonsScales ScrollbarsTexts*s *backgrounds*activeBackgrounds installation errors1No games were found !!! Main data directory is: s Please check your s installation.sbacknameisNones8: could not connect to pysolsoundserver, sound disabled.s bye_for_nows#c0c0c0slinuxs1: Python thread module not found, sound disabled.s4: pysolsoundserver module not found, sound disabled.s installation problemskYour Python installation is compiled without thread support. Sounds and background music will be disabled.swarningsOKsYThe pysolsoundserver module was not found. Sounds and background music will be disabled.s Welcome to s#008200scolorsimagessprogresssupdate(sossmakedirssappsdnsconfigsmkdirspathsjoins savegamessfs DataLoadersargss dataloadersdirspluginss loadPluginss wm_commands opt_nosoundssyss executablesprogsnormpathsargv0sisfilesabspathsas commandlinesloadgamesMfxRootsPACKAGEstopscgetstop_bgs top_cursors loadOptionssEnvErrorsexs warn_threadswarn_pysolsoundserversNonesaudiosnamesopts sound_modesWin32AudioClientspysolsoundserversPysolSoundServerModuleClients startServersservers isinstancesdestroysAbstractAudioClientswm_groupswm_titlesVERSIONs wm_iconnames wm_minsizes wm_protocolswmDeleteWindowswinfo_screenwidthswinfo_screenheightswinfo_screendepthsswsshssds wm_withdraws MfxDialogsdsmins wm_set_iconsfindIconscolors tk_setPalettes option_addsprioritysclassesscslensgdbsgetGamesIdSortedByNames initCardsetsscardsetsgetscardset_managers getByNamesupdateCardbacksfatal_no_cardsetsstabletile_managersmanagersTilestiles tablecolorsfilenamesregisters initTilesstabletile_namesgetAllsbasenamesindexstabletile_indexs initSampless initMusics connectServersaudiodevssounds connectedsupdateSettingss music_managersmusicslistsmusic_playlists miscrandomsshufflesmsstringslowersremovesinsertsplayContinuousMusics progress_bgs loadImages1sprogress_imagessgimagesslogossressearchsplatformsIsthreadsstdoutsflushsupdatestitlesPysolProgressBarsintrosprogresss loadImages2s loadImages3s loadImages4s loadCardsetsreset(sappsargssclassessargv0scardsetscolorswarn_pysolsoundserversmanagersexs warn_threadstopsprioritys opt_nosoundsmusicsprogsprogresss wm_commandsmstilesascsdsfsswsshstitlesdirssd((spysol.pys pysol_initLs&)))@  "    #  $     *'  4-#                        ' %0         3       cCs|itj o|iit|in|i|itj o|iit|in|itj o|iit|in|itj ot|in|i }t|t}|tj o&y|iWnnXt|ndS(N( sappsaudiosNonesdestroysdestructs wm_withdrawscanvasstoolbarsmenubarstop(sappstop((spysol.pys pysol_exitDMs*       c Cst}y2t||}|djo|Sn|iWntj o}dGHntj o}|i ont |i }t |o|dt |}nt |i dtddd|dd fd d }nXyt|WnnXdSdS( NisExiting on SIGINT.s: stitles internal errorstexts*Internal errror. Please report this bug: sstringssQuitsbitmapserror(s Applicationsapps pysol_initsargssrsmainloopsKeyboardInterruptsexs StandardErrorstopsstrs __class__sts MfxDialogsPACKAGEsds pysol_exit(sargssdsappsrsexst((spysol.pys pysol_mainZMs.     cCsottd o dt_nttd o tt_nttd o dt_ntid djo2tid d jod ttifGHd Sqnt t djpt t d jovt d dddfjodtt t fGHd Snttid pttid odtfGHd Sq=ndddjo tdnt|}|SdS(Nsplatformsunknowns executablesdefpathsisjavais1.5.2s-%s needs Python 1.5.2 or better (you have %s)istkiis+%s needs Tcl/Tk 8.0 or better (you have %s)s wm_aspects tag_lowersQ%s: please update the Python-Tk bindings (aka Tkinter) to version 1.5.2 or betterii i s -1 % 13 != 12(shasattrssyssplatformsNones executablesossdefpathsversionsPACKAGEslens tkversionsAssertionErrorstknamesstrsTkintersWmsCanvass Exceptions pysol_mainsargssr(sargssr((spysol.pysmainqMs,     (    (sPACKAGEs PACKAGE_URLsosssyssbundlesnameshasattrsplatformsversionsexits __builtin__sglobsmathsoperatorsresstringsstructstimestypess formattershtmllibs cStringIOsStringIOsUserDictsUserListsmacfssMACFSs ImportErrorsexs tracebacks print_excscPicklesPicklers UnpicklersUnpicklingErrorspicklesNonesthreadspysolsoundserversargvspathsasisdirsinsertswin32apispysolfreecellsolversTkintersCanvasstkColorChoosers tkFileDialogsTclErrorsVERSIONs VERSION_DATEs VERSION_MAJORs VERSION_MINORs VERSION_TUPLEs StringTypess StringTypes UnicodeTypesustrsindicesstranges range_lensreversesirangescountsexistssforallstruthsboolssgnsIOErrorsOSErrorserrorsEnvErrors ExceptionsSubclassResponsibilitysstaticsifelses merge_dictslatin1_to_asciishtmlentitydefs_islatin1_to_htmlshexifys getusernames gethomedirs getprefdirsclocksuclockssleepsusleepsdestructsStructs kwdefaultsKwStructsunpicklesspawnvsspawnvps __SOUND_MIXERsspawnSystemSoundMixersspawnSystemDisplaySettingssopenURLs PysolRandoms LCRandom64s LCRandom31sWHRandomsconstructRandomsSUITSsCOLORSsRANKSsACEsJACKsQUEENsKINGsANY_SUITs ANY_COLORsANY_RANKsNO_SUITsNO_COLORsNO_RANKs NO_REDEALsUNLIMITED_REDEALSsVARIABLE_REDEALSsCARDSETsIMAGE_EXTENSIONSsget_version_tuplesTimers DataLoaderscyclopssResourcesResourceManagersCSIs CardsetConfigsCardsetsCardsetManagersTiles TileManagersSamples SampleManagersMusics MusicManagersGIsGameInfoExceptionsGameInfos GameManagersGAME_DBs registerGamesloadGamesAbstractAudioClientsPysolSoundServerModuleClientsWin32AudioClients Misc__destroysCanvas__tag_binds Canvas__xviewsCanvas__xview_movetosCanvas__xview_scrolls Canvas__yviewsCanvas__yview_movetosCanvas__yview_scrolls Wm__wm_statesText__xview_movetosText__xview_scrollsText__yview_movetosText__yview_scrollsMiscsdestroystag_bindsxviews xview_movetos xview_scrollsyviews yview_movetos yview_scrollsWmswm_statesstatesTextsCanvasItem__bboxs Group__bboxsCanvasItem__binds Group__bindsCanvasItem__unbinds Group__unbindsCanvasItem__tkraisesCanvasItem__lowersGroup__tkraises Group__lowers CanvasItemsbboxsGroupsbindsunbindstkraiseslowersCallWrapper____call__s CallWrappers__call__stknames tkversionssplitsstrs_tkinters TK_VERSIONsmsmapsintstuples TK_DASH_PATCHs EVENT_HANDLEDsEVENT_PROPAGATEs CURSOR_DRAGs CURSOR_WATCHsCENTERs ANCHOR_CENTERsNsANCHOR_NsNWs ANCHOR_NWsNEs ANCHOR_NEsSsANCHOR_SsSWs ANCHOR_SWsSEs ANCHOR_SEsWsANCHOR_WsEsANCHOR_Es getFont_cachesgetFonts wm_withdraws wm_deiconifyswm_maps wm_set_iconscompiles__wm_get_geometry_reswm_get_geometrys setTransients makeToplevelsmakeHelpToplevels __getWidgetXYs__mfx_bindingss__mfx_wm_protocolssunbind_destroysafters after_idles after_cancels makeImages loadImages copyImages fillImages createImagesMfxCanvasGroups ImageItemsMfxCanvasImagesLines MfxCanvasLines RectanglesMfxCanvasRectangles CanvasTexts MfxCanvasTexts MfxCanvass BooleanVarsMfxCheckMenuItemsIntVarsMfxRadioMenuItemsTksMfxRoots_ToplevelDialogs MfxDialogsMfxExceptionDialogsMfxSimpleSlidersMfxSimpleEntrys MfxTooltipsMfxScrolledCanvassMfxScrolledTextsMfxReadonlyScrolledTexts DumbWriters tkHTMLWriters HTMLParsers tkHTMLParsers tkHTMLViewersDisplayTextDialogsEditTextDialogsPlayerOptionsDialogsDemoOptionsDialogsHintOptionsDialogsSoundOptionsDialogs AboutDialogs helpAboutshelpAboutSimples helpCreditsshelp_html_indexshelpHTMLsStatus_StatsDialogsPysolStatsFormattersPysolMenubarActionssPysolToolbarActionss _MfxToolbars PysolToolbars _MfxStatusbarsPysolStatusbarsPysolProgressBarsMenus MfxMenubarsMfxMenus PysolMenubarsMfxTreeBaseNodes MfxTreeLeafs MfxTreeNodesMfxTreeInCanvassSelectDialogTreeLeafsSelectDialogTreeNodesSelectDialogTreeDatasSelectDialogTreeCanvassSelectDialogPreviewCanvassSelectGameLeafsSelectGameNodesSelectGameDatasSelectGameTreeWithPreviewsSelectGameTreesSelectGameDialogsSelectGameDialogWithPreviewsSelectCardsetLeafsSelectCardsetNodesSelectCardsetDatasSelectCardsetByTypeDatasSelectCardsetTreesSelectCardsetByTypeTreesSelectCardsetDialogWithPreviews$SelectCardsetByTypeDialogWithPreviewsSelectTileLeafsSelectTileNodesSelectTileDatasSelectTileTreesSelectTileDialogWithPreviewsSingleGame_StatsDialogs"AllGames_StatsDialogScrolledCanvassAllGames_StatsDialogsFullLog_StatsDialogsSessionLog_StatsDialogs AbstractCards_HideableCard_1s_HideableCard_2s _HideableCards _OneImageCards_OneImageCardWithHideByConfigs _TwoImageCards_TwoImageCardWithHideItemsCardsImagesCardbacksImagessSubsampledImagess AtomicMoves AMoveMoves AFlipMovesATurnStackMovesNEW_ATurnStackMovesAUpdateStackMovesAUpdateStackModelMovesAUpdateStackViewMovesANextRoundMoves ASaveSeedMovesAShuffleStackMoves cardsFaceUps cardsFaceDownsisRankSequencesisAlternateColorSequencesisSameColorSequencesisSameSuitSequencesisAnySuitButOwnSequencesgetNumberOfFreeStackssgetPileFromStackssStacksDealRow_StackMethodssDealBaseCard_StackMethodss TalonStacksDealRowTalonStacksInitialDealTalonStacks OpenStacksAbstractFoundationStacksSS_FoundationStacksRK_FoundationStacksAC_FoundationStacksSequenceStack_StackMethodss BasicRowStacksSequenceRowStacks AC_RowStacks SC_RowStacks SS_RowStacks RK_RowStacksFreeCell_AC_RowStacksFreeCell_SS_RowStacksSpider_AC_RowStacksSpider_SS_RowStacksYukon_AC_RowStacksYukon_SS_RowStacksKingAC_RowStacksKingSS_RowStacksKingRK_RowStacks WasteStacksWasteTalonStacksFaceUpWasteTalonStacksOpenTalonStacks ReserveStacksInvisibleStacks StackWrappersWeakStackWrappersFullStackWrappers HintInterfaces AbstractHints DefaultHintsCautiousDefaultHintsKlondikeType_HintsYukonType_HintsFreeCellType_Hints GolfType_HintsSpiderType_HintsFreeCellSolverWrappersGames _LayoutStacksLayoutsKlondikes VegasKlondikesCasinoKlondikesKlondikeByThreessThumbAndPouch_RowStacks ThumbAndPouchsWhitehead_RowStacks Whiteheads SmallHarps Eastcliffs Easthavens Westcliffs WesthavensPasSeuls BlindAlleyssSomersetsCanisters AgnesSorelsEightTimesEights AchtmalAchtsBatsford_ReserveStacksBatsfords Stonewalls FlowerGardens KingAlbertsRaglansBrigades Jane_TalonsJanesAgnesBernauer_Talons AgnesBernauers GT_KLONDIKEsGT_SCOREsGT_GYPSYsGT_OPENs GT_RAGLANsGypsysGiant_FoundationsGiants Irmgard_TalonsIrmgardsDieKoenigsbergerin_TalonsDieKoenigsbergerinsDieRussische_FoundationsDieRussische_RowStacks DieRussischesMissMilligan_ReserveStacks MissMilligansNomads MilliganCells MilliganHarpsCarltons LexingtonHarps Brunswicks MississippisGriffonsBlockades GT_2DECK_TYPEs GT_CONTRIBs GT_ORIGINALsGT_YUKONsFortyThieves_Hints FortyThievessBusyAcessLimiteds Courtyards WaningMoonsLucassDeucessCoronas Quadrangles FortyAndEights LittleFortysStreetssMarias NumberTens RankAndFiles TripleLines RedAndBlacksZebrasIndian_RowStacksIndians MidshipmansNapoleonsExiles DoubleRails SingleRailsGT_FORTY_THIEVESsDiplomatsLadyPalksCongresssDoubleKlondikesDoubleKlondikeByThreess GargantuasBigHarpsStepssPictureGallery_HintsPictureGallery_FoundationsPictureGallery_TableauStacksPictureGallery_RowStacksPictureGallerys Braid_HintsBraid_FoundationsBraid_BraidStacksBraid_RowStacksBraid_ReserveStacksBraids LongBraids GT_NAPOLEONs Spider_HintsSpider_SS_FoundationsSpider_AC_FoundationsSpider_RowStacks RelaxedSpidersSpidersBlackWidow_RowStacks BlackWidowsGroundForADivorce_TalonsGroundForADivorcesGrandmothersGames SpiderettesBabySpiderettes WillOTheWisps SimpleSimonsRachelsScorpion_RowStacksScorpionsWaspsRougeEtNoir_RowStacks RougeEtNoirs GT_SPIDERs GT_RELAXEDsFreeCell_RowStacksFreeCellsRelaxedFreeCellsForeCells Stalactitess GT_FREECELLsBakersGame_RowStacks BakersGamesKingOnlyBakersGamesEightOffsSeahavenTowerssRelaxedSeahavenTowerssPenguinsEiffelTower_RowStacks EiffelTowersStrictEiffelTowersGT_PAIRING_TYPEsMatriarchy_WastesMatriarchy_TalonsMatriarchy_UpRowStacksMatriarchy_DownRowStacks MatriarchysCalculation_HintsBetsyRoss_FoundationsCalculation_FoundationsCalculation_RowStacks Calculations Hopscotchs BetsyRosss GT_1DECK_TYPEs Canfield_HintsCanfield_AC_RowStacksCanfield_SS_RowStacksCanfield_RK_RowStacksCanfieldsSuperiorCanfieldsRainfallsRainbows Storehouses ChameleonsDoubleCanfields AmericanToadsVariegatedCanfieldsEagleWing_ReserveStacks EagleWings GT_CANFIELDs Golf_Hints Golf_Talons Golf_Wastes Golf_RowStacksGolfs DeadKingGolfs RelaxedGolfsElevator_RowStacksElevatorsTriPeaks_RowStacksTriPeakssBlackHole_FoundationsBlackHole_RowStacks BlackHolesGT_GOLFsGrandfathersClock_HintsGrandfathersClocks Numerica_HintsNumerica_RowStacksNumericas LadyBettys GT_NUMERICAs Yukon_HintsYukonsRussianSolitairesOdessasAlaska_RowStacksAlaskasChineseDisciplinesChineseSolitairesQueeniesRushdikes RussianPointsAbacus_FoundationsAbacus_RowStacksAbacussCastlesInSpainsMartha_RowStacksMarthas BakersDozensSpanishPatiences GoodMeasures Cruel_TalonsCruelsGT_BAKERS_DOZENsFan_HintsFansScotchPatiencesShamrocks_RowStacks ShamrockssLaBelleLucie_Talons LaBelleLuciesSuperFlowerGardensThreeShufflesAndADraw_RowStacks"ThreeShufflesAndADraw_ReserveStacksThreeShufflesAndADrawsTrefoilsIntelligence_TalonsIntelligence_RowStacksIntelligence_ReserveStacks Intelligences GT_FAN_TYPEsBeleagueredCastleType_HintsStreetsAndAlleyssBeleagueredCastlesCitadelsFortress_RowStacksFortresssChessboard_FoundationsChessboard_RowStacks ChessboardsGT_BELEAGUERED_CASTLEsUnionSquare_FoundationsUnionSquare_RowStacks UnionSquaresWindmill_FoundationsWindmill_RowStacksWindmills Pyramid_HintsPyramid_StackMethodssPyramid_Foundations Pyramid_Talons Pyramid_WastesPyramid_RowStacksPyramidsRelaxedPyramidsThirteensPileOn_RowStacksPileOns Bristol_Hints Bristol_TalonsBristols BelvederesAcesUp_FoundationsAcesUp_RowStacksAcesUpsFortunessRussianAces_Talons RussianAcessPerpetualMotion_TalonsPerpetualMotion_FoundationsPerpetualMotion_RowStacksPerpetualMotions Montana_Hints Montana_TalonsMontana_RowStacksMontanas Spaces_TalonsSpacessBlueMoonsRedMoons GT_MONTANAsPasDeDeux_HintsPasDeDeux_WastesPasDeDeux_RowStacks PasDeDeuxsGT_SEPARATE_DECKSsRoyalCotillion_FoundationsRoyalCotillions OddAndEvensKingdomsAlhambra_WastesAlhambrasCarpetsOsmosis_FoundationsOsmosissPeeksMonteCarlo_HintsMonteCarlo_TalonsMonteCarlo_RowStacks MonteCarlosMonacosWeddings_TalonsWeddingss SimpleCarlos SimplePairssNeighbour_FoundationsNeighbour_RowStacks NeighboursFourteen_RowStacksFourteensNestor_RowStacksNestorsDerLetzteMonarch_FoundationsDerLetzteMonarch_RowStacksDerLetzteMonarch_ReserveStacksDerLetzteMonarchs RoyalEasts TamOShanters AuldLangSynesStrategy_FoundationsStrategy_RowStacksStrategysInterregnum_Foundations InterregnumsDoublets_FoundationsDoubletssSiebenBisAs_HintsSiebenBisAs_FoundationsSiebenBisAs_RowStacks SiebenBisAss Maze_RowStacksMazesDieBoeseSieben_TalonsDieBoeseSiebens Terrace_TalonsTerrace_AC_FoundationsTerrace_SS_FoundationsTerrace_RowStacksTerracesGeneralsPatiencesBlondesAndBrunettess FallingStars GT_TERRACEsPokerSquare_RowStacks PokerSquaresPokerShuffle_RowStacks PokerShuffles GT_POKER_TYPEsDerKatzenschwanzs DieSchlangesNapoleon_TalonsNapoleon_FoundationsNapoleon_RowStacksNapoleon_ReserveStacksNapoleon_SingleFreeCellsNapoleon_FreeCellsDerKleineNapoleonsDerFreieNapoleonsNapoleons FreeNapoleonsLarasGame_HintsLarasGame_TalonsLarasGame_RowStacksLarasGame_ReserveStacks LarasGamesSanibelsFlower_FoundationStacksFlowerClock_FoundationsGaji_FoundationsPagoda_FoundationsSamuri_FoundationsMatsuKiri_FoundationsGreatWall_FoundationsGreatWall_BuildStacksFourWinds_FoundationsFlower_OpenStacksFlowerClock_RowStacks Gaji_RowStacksMatsukiri_RowStacksOonsoo_RowStacksSamuri_RowStacksGreatWall_RowStacksFourWinds_RowStacksAbstractFlowerGames FlowerClocksGajisOonsoosPagodas MatsuKirisSamuris GreatWalls FourWindssrs GT_HANAFUDAsTowerOfHanoy_HintsTowerOfHanoy_RowStacks TowerOfHanoysHanoiPuzzle_RowStacks HanoiPuzzle4s HanoiPuzzle5s HanoiPuzzle6sGT_PUZZLE_TYPEsrangesHexADeck_FoundationStacksHexATrump_FoundationsHexADeck_OpenStacks Bits_RowStacksBytes_RowStacksHexAKlon_RowStacks BitsNBytessHexAKlons GT_HEXADECKsMemory_RowStacksMemory24sMemory30sMemory40sConcentration_RowStacks Concentrations GT_MEMORYs Pegged_HintsPegged_RowStacksPeggeds PeggedCross1s PeggedCross2s Pegged6x6s Pegged7x7sPeggedTriangle1sPeggedTriangle2s Wicked_TalonsImperialTrump_FoundationsPonytail_FoundationsTarock_OpenStacksTarock_AC_RowStacks Skiz_RowStacksPagat_RowStacksTrumpWild_RowStacksTrumpOnly_RowStacksExcuse_RowStacksWheelOfFortune_RowStacksPonytail_PonytailStacksPonytail_RowStacksPonytail_ReserveStacksCavalier_RowStacksNasty_RowStacksTarock_GameMethodssAbstractTarockGamesWheelOfFortunesImperialTrumpssPagatsSkizs FifteenPlussExcuses GrasshoppersDoubleGrasshoppersPonytailsCavaliersFiveAcessWickedsNastys GT_TAROCKsPysolScrolledCanvassOptionss StatisticssCommentss Applicationsfatal_no_cardsetss pysol_inits pysol_exits pysol_mainsmain(sFan_HintsCanvassPerpetualMotionsFortress_RowStacksTowerOfHanoy_HintsFreeCell_RowStacksSelectGameTreeWithPreviewsSelectGameLeafsChessboard_RowStacks createImagesPeeksAShuffleStackMovesBabySpiderettesThreeShufflesAndADraw_RowStacksSubclassResponsibilitysSelectDialogTreeDatasRussianSolitairesPagodas BelvederesPysolStatsFormattersSequenceRowStacks LCRandom31s LittleFortysOpenTalonStacks SingleRails Golf_TalonsDieRussische_RowStacksgetFontsstringsEagleWing_ReserveStacksANCHOR_Es _HideableCards MusicManagersANCHOR_NsAlaskasANCHOR_SsVERSIONsANCHOR_WsAlaska_RowStacksGIsSubsampledImagess Spider_Hints AgnesSorelsKingdomsMatriarchy_DownRowStacks LaBelleLuciesNapoleons BlackWidowsindicess makeToplevelsGroup__tkraisesCarpets pysol_inits WillOTheWisps __getWidgetXYsFourWinds_RowStacks DieRussisches WasteStacksNO_COLORsJanes Canvas__yviewsSomersets pysol_exits PeggedCross1s PeggedCross2sPagatsYukonType_Hints getprefdirsUserLists TileManagers _MfxToolbars Spaces_TalonsNapoleon_TalonsDisplayTextDialogsNeighbour_FoundationsMemory24sIntelligence_RowStacksNO_SUITsDoubletssExcuse_RowStacksSelectTileDialogWithPreviewspysolfreecellsolvers_HideableCard_1s AuldLangSynesUnionSquare_RowStacks BlackHolespathsNumerica_RowStackshexifys wm_withdrawsStringIOs FourWindss Intelligences SmallHarpsAlhambra_WastesDieBoeseSiebensFortunessFourteen_RowStacksPyramid_StackMethodssKlondikeByThreessunbind_destroys Terrace_Talons ANCHOR_SEs FortyAndEights DefaultHintsCanvas__yview_scrollsSUITSsCOLORSsPyramid_RowStacksSelectDialogTreeLeafs ANCHOR_SWssgnsSpider_AC_RowStacks EagleWingsMissMilligan_ReserveStacks LadyBettysGreatWall_RowStacks Wicked_TalonsBytes_RowStacks cardsFaceDownsSelectDialogTreeNodesCanistersKingRK_RowStacksYukon_AC_RowStacksAUpdateStackModelMoves__wm_get_geometry_resGameInfoExceptions AMoveMoves PasDeDeuxsPACKAGEs wm_set_icons fillImagesRoyalCotillion_FoundationsAcesUpsFreeCell_AC_RowStacks Jane_TalonsPokerShuffle_RowStacks RelaxedGolfsPysolSoundServerModuleClientsCitadelsSamurisNastys_ToplevelDialogsDerLetzteMonarch_FoundationsPyramidsCardsets SiebenBisAssQUEENs ANCHOR_NWsAC_FoundationStacks CURSOR_WATCHs Group__bboxs RedAndBlacks RelaxedSpiderspicklesText__yview_scrolls ANCHOR_NEs AtomicMovesStructs Montana_HintsScotchPatiencesCanvasItem__bindsHexAKlon_RowStacksSelectDialogTreeCanvassOonsoos VegasKlondikesSiebenBisAs_HintsRushdikes Spiderettes LongBraids Westhavens HintInterfaces__mfx_bindingss TowerOfHanoysSpanishPatiences helpCreditss NO_REDEALsDieRussische_Foundations ReserveStacksStacksSamuri_RowStacks MfxMenubars MidshipmansLucassRainfallsaftersCSIsPileOnsCavaliers EastcliffsSelectCardsetDatasStreetsAndAlleysstypessAbstractFoundationStacksATurnStackMoves LexingtonHarpsBraid_ReserveStacks EasthavensossEditTextDialogsCanvas__xview_movetos MilliganCellsTrumpOnly_RowStacksPeggedTriangle2sCalculation_RowStacksYukons Mississippis merge_dicts helpAboutsMonacosPerpetualMotion_Talons Misc__destroys range_lens SimpleSimonsAbstractFlowerGamesRK_FoundationStacksStrictEiffelTowersOptionssSeahavenTowerssCanfields Brunswicks after_cancels MfxTreeLeafsText__xview_movetosDoubleKlondikesGaji_FoundationsExcusesFortyThieves_Hints NeighboursCanvasItem__bboxsWheelOfFortune_RowStacks AFlipMovesCanvas__tag_binds KingAlbertsmains BakersGamesPonytail_RowStacksTriPeakssBigHarpsANY_RANKs PysolRandomsWHRandomsAUpdateStackViewMovesCanfield_RK_RowStacksStepss Golf_HintsPerpetualMotion_FoundationsTarock_AC_RowStacksDerLetzteMonarch_RowStacksInterregnum_FoundationsSkizsMfxMenus PokerShuffles CalculationsPictureGallery_HintsSpider_SS_RowStacksWhitehead_RowStacks Bristol_TalonsIntelligence_TalonsPicklersRainbows Canfield_Hintslatin1_to_htmls tkHTMLViewersLarasGame_Hintsstaticsexs FlowerGardensisSameColorSequences SimplePairss Wm__wm_statesMatsukiri_RowStacksMfxCheckMenuItemsPysolProgressBarsBeleagueredCastlesGrandfathersClock_Hints CourtyardsresGajis FreeNapoleonsRelaxedPyramidsBetsyRoss_FoundationsWasteTalonStacksCastlesInSpainsPasDeDeux_Hints StackWrappersmaths RoyalEastsTkintersNapoleon_FreeCellsmacfssNapoleon_ReserveStacksFullStackWrappersJACKs MfxCanvassMfxRadioMenuItems PACKAGE_URLs EVENT_HANDLEDsDoubleCanfieldstrangesthreadswm_get_geometrysKingOnlyBakersGamesForeCells tracebacksEiffelTower_RowStacks FifteenPlussGAME_DBsHexADeck_FoundationStacks Maze_RowStacksGiantsFlowerClock_RowStacksSelectTileNodesYukon_SS_RowStacksIndiansKwStructsDerKleineNapoleonsCardsetManagersTilesFiveAcessNestorsspawnvpsFreeCellType_HintsusleepsDerKatzenschwanzsPonytail_FoundationsCongresssImperialTrump_FoundationsAlhambras GreatWalls MatriarchysFortresssSpider_AC_FoundationsTerrace_RowStacksSessionLog_StatsDialogsCavalier_RowStacksasUnpicklingErrorsGeneralsPatiences SimpleCarlosHintOptionsDialogsPagat_RowStacksAllGames_StatsDialogsRelaxedFreeCells CardsetConfigslatin1_to_asciis RussianPointsShamrocks_RowStacksSpacessSingleGame_StatsDialogsZebrasbindsIntelligence_ReserveStacks ConcentrationsSelectCardsetDialogWithPreviews UnionSquaresWin32AudioClients RougeEtNoirs TK_DASH_PATCHsThreeShufflesAndADrawsPictureGallerysTarock_GameMethodssWindmill_RowStacksMfxCanvasRectanglesRoyalCotillions ShamrockssGriffonsAcesUp_RowStacksMazesgetNumberOfFreeStackssStrategy_FoundationsOdessasDealRow_StackMethodssSuperFlowerGardensMatriarchy_UpRowStacksIrmgards CURSOR_DRAGs HanoiPuzzle5s DieSchlanges MonteCarlosCalculation_FoundationsAbstractTarockGamesMfxScrolledTextsMfxScrolledCanvassspawnvsisRankSequencesRANKSsglobsGrandfathersClocks Pyramid_Hints Group__unbinds kwdefaultsOsmosis_FoundationsSelectCardsetNodesWheelOfFortunesUnionSquare_FoundationsGameInfosPysolToolbarActionss pysol_mainsBlondesAndBrunettessmsdestructsMfxTreeBaseNodesSampleshelpHTMLsThirteensAbstractAudioClientsInvisibleStacksMonteCarlo_RowStacksLaBelleLucie_Talonsfatal_no_cardsetss RankAndFiles tkFileDialogs UnpicklersCommentssTriPeaks_RowStacksMatriarchy_WastesBraid_BraidStacksCanvasItem__unbindsSuperiorCanfieldsSelectCardsetTrees RussianAcessEVENT_PROPAGATEsPonytailsWindmillsPysolScrolledCanvassDerFreieNapoleonsCanvasItem__tkraisesCanvasItem__lowers MatsuKirisGames MfxDialogs HanoiPuzzle4sFourteensPerpetualMotion_RowStacksPegged_RowStacksSelectGameDialogWithPreviewsSpider_SS_FoundationsPyramid_FoundationsPenguins VERSION_TUPLEsPasDeDeux_Wastes MilliganHarpsPagoda_FoundationsPasDeDeux_RowStacksmakeHelpToplevelsMatriarchy_TalonsBatsfordsCruels EiffelTowersGolfs MissMilligans loadImages Gaji_RowStacks FortyThievess FallingStars formattersSiebenBisAs_RowStacksGreatWall_BuildStacks RK_RowStacksSelectGameTreeswm_mapsDieKoenigsbergerinsHexATrump_FoundationsEightOffs Skiz_RowStacksMonteCarlo_Talons GoodMeasures WhiteheadsDealBaseCard_StackMethodssBlackHole_RowStacksexistssScorpionsFullLog_StatsDialogsThumbAndPouch_RowStacks DeadKingGolfs Storehouses"ThreeShufflesAndADraw_ReserveStacks SC_RowStacksMfxTreeInCanvassloadGamesFourWinds_FoundationsBlackWidow_RowStacks setTransients Pegged_Hints Canvas__xviews Golf_RowStacksPysolMenubarActionss ThumbAndPouchs AchtmalAchts ANY_COLORs QuadranglesTrumpWild_RowStacksRedMoons Stonewalls_HideableCard_2s DoubleRails VERSION_DATEs AC_RowStacksAUpdateStackMoves AbstractCardsAbacus_RowStacksreversesUNLIMITED_REDEALSsSpiders AmericanToadsPictureGallery_RowStacksforalls AgnesBernauersBraid_Foundations _LayoutStacks StatisticssDiplomats$SelectCardsetByTypeDialogWithPreviewsSiebenBisAs_FoundationsgetPileFromStackssFaceUpWasteTalonStacksMusicsPileOn_RowStacksget_version_tuplesMfxCanvasImages OpenStacks _OneImageCardsWindmill_FoundationsWeddings_TalonsKlondikesBlueMoonsEnvErrorsMfxSimpleEntrysNomadsMfxSimpleSlidersFreeCellSolverWrappersCardsLarasGame_RowStacksHexADeck_OpenStacksMfxRootsTerrace_AC_Foundations cardsFaceUpsQueeniesDeucessMatsuKiri_FoundationsCanfield_AC_RowStacksElevator_RowStacksFreeCell_SS_RowStacksNapoleon_RowStacks BetsyRosssSpiderType_Hints VERSION_MAJORsWasps_OneImageCardWithHideByConfigsRachels AbstractHintsGreatWall_Foundations NumberTensOonsoo_RowStacksOsmosiss BitsNBytessKlondikeType_HintsBlockadesStatus_StatsDialogsElevatorsStrategys tkHTMLWritersTarock_OpenStacks GolfType_HintsSS_FoundationStacksPeggedsDieBoeseSieben_TalonsTrefoilsDemoOptionsDialogsCalculation_Hints HopscotchsNapoleon_SingleFreeCellsBatsford_ReserveStacks Montana_TalonsRelaxedSeahavenTowerss BasicRowStacksCautiousDefaultHintsDerLetzteMonarch_ReserveStacksResources Group__bindssyssunpicklesBristols wm_deiconifysFlower_FoundationStacksIMAGE_EXTENSIONSsLimiteds Bristol_Hints TripleLinesCanfield_SS_RowStacks DataLoadersSelectTileLeafsPeggedTriangle1s HanoiPuzzle6sCarltonshtmllibsGrandmothersGamesTerracesFlower_OpenStacksTowerOfHanoy_RowStacksSamuri_FoundationsAcesUp_FoundationsLadyPalksPasSeuls Chessboards Numerica_HintsChineseDisciplinesImperialTrumpssBrigadesisAnySuitButOwnSequencesstructsDerLetzteMonarchsconstructRandoms__mfx_wm_protocolss registerGames Pyramid_Wastes Irmgard_TalonsBeleagueredCastleType_Hints getFont_cachesSelectCardsetLeafsPlayerOptionsDialogsMemory_RowStacks SS_RowStacks Pegged7x7sCoronaspysolsoundservers Braid_HintsCallWrapper____call__sLarasGame_ReserveStacks TamOShantersiranges WestcliffsChineseSolitaires SampleManagers PysolToolbarsSelectCardsetByTypeTreesResourceManagersFreeCells GrasshoppersBakersGame_RowStacksAbacus_Foundations FlowerClocks OddAndEvensDealRowTalonStacksNEW_ATurnStackMovesisSameSuitSequencesMemory40sGroundForADivorcesSoundOptionsDialogs Cruel_TalonsMartha_RowStacks ASaveSeedMovesSequenceStack_StackMethodssMonteCarlo_HintsConcentration_RowStacksspawnSystemDisplaySettingssMfxCanvasGroupsMontana_RowStacksGiant_FoundationsAgnesBernauer_TalonsKingSS_RowStacks copyImagesSelectGameDatasKINGs VERSION_MINORs Pegged6x6sisAlternateColorSequencesCanvas__yview_movetosMontanasifelsesSelectGameNodesText__xview_scrollsNeighbour_RowStacksANextRoundMovesUserDictsInitialDealTalonStacksTimersMemory30sPokerSquare_RowStacks StalactitessrsBlackHole_Foundations getusernameshelpAboutSimplesspawnSystemSoundMixersTerrace_SS_FoundationsMACFSs LCRandom64sImagess"AllGames_StatsDialogScrolledCanvasswin32apisACEsPysolStatusbars Interregnums __builtin__s Golf_WastesNumericasNestor_RowStacksPictureGallery_TableauStacksoperatorsMarthasNO_RANKs ChameleonsTclErrorsDoubleGrasshoppersSelectDialogPreviewCanvass TalonStacks BlindAlleyssSanibelsSpider_RowStacks MfxCanvasTextsNasty_RowStacks LarasGamesDoubleKlondikeByThreessStrategy_RowStacksFansKingAC_RowStacks _TwoImageCardsBusyAcess after_idles Gargantuas_TwoImageCardWithHideItemsSelectCardsetByTypeDatasScorpion_RowStacks Pyramid_TalonscountsChessboard_FoundationstknamesCARDSETs ApplicationsStreetss Yukon_HintsCanvas__xview_scrollsRougeEtNoir_RowStacksBraid_RowStackscyclopss tkversionsLarasGame_Talons BakersDozensVARIABLE_REDEALSsRaglansCasinoKlondikes Bits_RowStacksLayouts MfxCanvasLinesPonytail_ReserveStacksIndian_RowStacksPonytail_PonytailStacks gethomedirsSelectTileTreesWickedsSelectTileDatasDieKoenigsbergerin_TalonsMfxExceptionDialogsImagesCardbacks ANCHOR_CENTERs _MfxStatusbars WaningMoons makeImages tkHTMLParsersboolsText__yview_movetosAbacuss MfxTooltipsMarias PokerSquaresNapoleonsExilesMfxReadonlyScrolledTextsopenURLsNapoleon_Foundations Group__lowers AboutDialogsHexAKlonsbundlesDoublets_FoundationsPictureGallery_FoundationsWeakStackWrappersHanoiPuzzle_RowStacksRussianAces_TalonstkColorChoosersSelectGameDialogs MfxTreeNodesANY_SUITsustrsFlowerClock_FoundationsWeddingssVariegatedCanfieldsuclocksGypsysGroundForADivorce_TalonstimesBraidsEightTimesEights GameManagers PysolMenubar((spysol.pys?+s   H              (                            *    5    -    [ }_1U;N   w>                                                             '           {'V\ ?h ,"\ &h{9O=G K"\C]4;cT )    5,         DTd  %  i4i         '    %!<     .! ;  5]        :9)  / /_     , D*4 #       $ &&    ".!"% 1 "     05   #()-  "=  #+--4 / % %  ?   7A5E!!       .-#;5P- ###           A& + +(V ++7 F      0!++$682"  #####T<!