Thirty hands an hour.
When you're dealing a real-money game of No Limit Texas Hold'em, that's what you're shooting for. Thirty hands an hour, or roughly one hand every two minutes, like clockwork. Two minutes to wash, shuffle, cut the cards, deal them out in two concentric rings. Two minutes to gently coax a table of beer-drinking adults through four rounds of betting, keeping your sanity in the midst of two and three-way all-ins, split pots and side pots, pot bets and string bets, kills, half-kills, straddles, and other inventions of bored-out-of-their-mind poker players.
"Run it twice, dealer."
After a while, it becomes automatic. You get to where you can eyeball a stack of chips and tell it's one chip short of twenty. You get to where you can cut three, five, eight chips from a stack in one clean motion. Your dealing improves, as your hands learn the curt yet unhurried, almost lazy rhythm of high-throughput dealing. Wash, shuffle, shuffle, shuffle, cut, don't forget the deck guard, go. Two months before you were sending cards flying over the table rails in curlicues, now you're tossing them with pinpoint accuracy.
Like shuriken.
The rituals of the poker table are a kind of language, and as a fluent speaker of this language, you don't stop and think about what the individual words mean, or whether the grammar is correct. The words and the meaning they convey are one and the same. To hear the words is to understand them, but at the poker table, your "words" are bets, actions, the casual tossing of two useless cards into the muck, the spill of meaningful color we call the flop, the turn, the river, whatever. Symbols. Grammar. Inflection. Punctuation.
Language.
Think of a Texas Hold'em hand as a seven-letter word built from a 52-card alphabet. Consonants and vowels. In combination, they have meaning. One of your jobs as a poker dealer is to figure out when one person's "word" is better than another person's, and push the pot accordingly. As a poker player, you have to take things a step further. You have to understand the word. Not just its specific meaning, its denotation; but its connotations, associations, nuance, history. And you have to do all of this in the blink of an eye, automatically, without thinking.
It's almost robotic.

Speaking of robots, this is the kind of stuff at which poker robots excel:
These terms are often used interchangeably, but I like to give them specific meanings.
And of course, it goes without saying that robust hand evaluation is the stepping-stone to a mature poker A.I. If your poker bot can't do this...

...it's fighting with one arm tied behind its back.
That, by the way, is a screenshot of Andrew Prock's PokerStove, a poker calculator capable of performing hand vs. hand-range analysis across multiple opponents, using exhaustive exploration or Monte Carlo simulation. There are many such tools out there, but PokerStove is the most popular, and probably the most functional, of the lot. PokerStove is free, so if you haven't already done so, I suggest downloading it and getting familiar with how it works.
Because we're going to teach our poker bots and related tools how to do what PokerStove does.
Notice I said hand vs. hand-range analysis. The "range" part is crucial, because in poker, rarely are we able to put our opponents on specific hands. Instead, we assign them a range of hands, and narrow that range as the hand progresses. In order to compute our equity, we have to figure out how well our known hand fares not against another known hand, but against the range of hands we believe our opponent has. This is what's referred to as subjective all-in equity or SAIE.
I like Michael Maurer's definition:
SAIE is a player's pot equity given particular beliefs about the possible hands of the opponent(s) and assuming no further betting.
Provided we follow it with Andrew Prock's note in the PokerStove FAQ:
This is not the chance that a hand will win the pot. Rather it is the fraction of the pot that a hand will win on average over many repeated trials, including split pots. The equity for a hand is calculated by dividing the number of "pots" that the hand won by the number outcomes considered. Because two players can split a pot, a player can win fractional pots. Thus, it is possible for a hand to have non-zero equity despite the fact that it cannot win.
For example, in the above screen shot of PokerStove, we can see that the equity of pocket Jacks versus two opponents is around 36%, if we assign each of those opponents a range of [any pair; any AQ or better]. If you took this situation and played it out a million times, you'd find that on average, you'd win 36% of the pot (assuming no further betting, and assuming nobody folds).
This is a useful number to have.
It takes into account the fact that, if one of your opponent has Aces, and the other has Kings, you're equity is lower—only 15%. It takes into account the fact that, if one opponent has AK (any AK) and the other has AQ (any AQ), your equity is higher—about 44%. SAIE provides a sort of weighted average of how your hand fares against each of the hands in your opponents' range, taking into account the likelihood of each specific opponent holding. You see, it's quite a bit easier for an opponent to have AK (12 combinations) than it is for him to have AA (only 6 combinations). And the mathematics need to allow for that.
Once again: this is not the same thing as your chance of winning the pot! Another example should make this clear.

Here, Player 0's chance of winning the pot is only 11%, but his equity is around 57%. This is because most of the time—whenever a 4 or higher falls on the river—the hand is going to be tied. But when a 3 or 2 falls on the river, Player 0 wins with Four Aces and a Four kicker, which beats Player 1's Four Aces and a Three Kicker.
And although Player 1's pot equity is 44%, he has zero chance of winning the pot outright.
That's a contrived situation, but an illustrative one. By thinking in terms of pot equity, rather than chance of winning the pot, we neatly fold all those messy tie-game situations into our mathematics.
Believe it or not, calculating SAIE is easy. Calculating it efficiently may not be.
It all hinges on hand comparison: the ability to compare two or more poker hands and determine the winner. If you can do that, all you have to do is programmatically deal out large numbers of hands and start tallying wins, losses, and ties. When it comes to dealing those hands out programmatically, you have two options:
Typically in the game of Hold'em, we use Monte Carlo simulation for preflop matchups, and exhaustive exploration for matchups on the flop or later. You'll notice PokerStove has a radio button allowing you to specify which technique to use although, as Andrew Prock notes:
Monte Carlo simulations work very well for most practical problems, and enumeration driven software is only going to be of interest to the true poker geeks who must have all of their i's dotted and t's crossed. Of course, I'm one of those geeks :)
Whether you're a geek or not, you're going to need throughput: the ability to evaluate large numbers of hands quickly. If you're going to be randomly generating, or consecutively enumerating, millions of hands, you can't afford to do four bubble sorts, nine redundant array copies, a Google search, and send off 3 emails every time you evaluate one of those millions of hands.
You've got to optimize.
(Remember, this is something poker bots and other tools need to do in real time, at multiple tables, on various and sundry hardware.)
So it's got to be fast.
I don't mean 2,000 hands per second fast. That's not fast, that's slow. I mean fast like a bat out of hell. Fast like the wind. Fast like the Flash. Speedy Gonzales. Run Forest Run! fast. Or even—dare I say it—as fast as that paragon of speed and grace, the Roadrunner.

MEEP-MEEP!
And the best part?
This is not a wheel you have to reinvent. Highly-optimized hand evaluation code is already written, and is publically available in multiple languages (C, C++, C#, Java, and Python, among others) with support for multiple poker variants (Hold'em, Omaha, Stud) provided you know where to look.
Some people collect butterflies, leaves, flowers; others collect coins, marbles and shot-glasses.
Me? I collect open-source poker code.
If it's code, and if it's about the game of poker, and if it's freely available, I want a copy. Even if the code is written in a language I'll never use. Even if it's slower, messier, or buggier than my existing code. A lot of clever people have devoted a lot of time and energy to building robust poker hand evaluators, you see, and I want to leverage their hard work.
So every time I stumble across a new specimen, I collect it. I haul it out to the garage, open my toolbox, and start hammering away. I clean up the code, throw it into a Visual Studio project or who knows, I might even crack open my Eclipse IDE and do some Java work. Whatever.
There is no "one size fits all" poker hand evaluator, so I want a hand evaluation library which incorporates multiple evaluators within it, all of them written by other people.
Here are just a few (all of which we'll be covering in detail):
So instead of thinking of your poker hand evaluator as a single tool, think in terms of building a poker hand evaluation toolset; a collection of code which can be applied to the specific problems you're facing. Even within the relatively narrow context of an online poker bot, there's a lot of wiggle room. Are you building a multi-table online Texas Hold'em poker bot? If so, you need a fast 7-card evaluator. Are you building something which needs to support Hold'em as well as Omaha and 7-Card Stud. You need a good generic evaluator. And so forth.
If you think of poker hand evaluation as a smorgasbord, rather than a single component, you'll be doing yourself a favor.
Now, I know what you're thinking: where's the code? Where are the algorithms?
Well, it turns out that poker hand recognition, comparison, enumeration, and evaluation are such complex topics, it's impossible to fit them all into a single post, and at the same time, provide and explain the source code for a dozen different pre-existing evaluators. So I've broken these off into a set of background articles, to be published shortly:
Today, I just wanted to introduce the subject, and tell you how you can make some money by writing hand evaluation code.
Coding the Wheel, in conjunction with a site to be named shortly, will be presenting an award of X dollars (we're not quite sure what X will be yet, but it will be hundreds of dollars, rather than thousands or tens) to the person or persons who can produce a substantial improvement to the hand evaluation code we'll be presenting.
In addition, that person's solution will be highlighted, with full credit, or anonymously if preferred, in a dedicated post on Coding the Wheel and possibly some other sites as well.
There are only a few requirements:
Full rules to follow. Stay tuned!
122 comment(s)
First!
The Poker Chesney on Friday, August 22, 2008Nice intro James, this article is worth it just for the links to 3rd-party hand evaluators. I'd seen a few of those but not all of them. Looking fwd to the contest...
Anonymous on Friday, August 22, 2008In addition to exhaustive exploration and Monte Carlo-style simulation, you can use precomputed lookups for diff situations (as you probably know) but I think PokerStove uses preflop lookup tables, for certain matchups anyway.
CodifyTheChad on Friday, August 22, 2008Nice to see you back - you know, these postings will make a great book!
Also - the link http://www.codingthewheel.com/how-i-built-a-working-poker-bot doesn't work...
Terry Smith on Friday, August 22, 2008I'm definitely gonna have a go at the hand evaluator "competition", you gotta love algorithms. :D
ehsanul on Friday, August 22, 2008I guess your latest few articles didn't get enough juice so you had to pump out another poker one. anyone that has taken your first ones to heart and have started making a bot will benefit zilch from this article.
it sounds like you have a half-working bot and you want to pay someone to come up with your algorithms for you. try rentacoder
Bismark on Friday, August 22, 2008Sorry Bismark, it ain't so. The reading public will have a very hard time suprassing the mentioned algorithms. Some of them are completely awesome.
Terry Smith on Friday, August 22, 2008Bismark, go troll elsewhere please. If you've read any of the articles you would see how much one could gain by implementing this into their homebrew poker bot.
Adam on Friday, August 22, 2008Do you have an arbitrary environment to test it in?
Jordan on Friday, August 22, 2008James I agree with Jordan's question. How will you test the solutions? Will you run them on a dedicated machine? Enumerating all hands, generating random hands, both?
I suggest using the 2+2 method. Test the evaluator by enumerating all hands, then test it again by spawning 1 million random hands. Run each evaluator three times. Take the best result.
Anonymous on Friday, August 22, 2008I AM ALL OVER THIS CONTEST. YOU GUYS MIGHT AS WELL JUST PAY ME THE MONEY NOW ;)
Anonymous on Friday, August 22, 2008Given a test environment that I can build, I might be able to tweak my program a little bit more.
Jordan on Saturday, August 23, 2008While AI/algorithms are really cool and I couldn't wait to dive into them, I can't help but feel we left the input/output section a bit too early. I still am unable to get the hole cards or all the table state from the current hand on pokerstars. My poor bot is still blind.
Anonymous on Saturday, August 23, 2008yeah, I haven't started on that (yet). I haven't finished reading Windows via C/C++ by Richter. So I'm reading the book, and programming the calculators. That way I don't get too bored on one task. There's top down, and bottom up... but for some reason I'm doing both. Just gotta make sure it meets in the middle.
I already win at poker, so I think I can make a decent AI later on. This project will definitely strengthen both poker and programming skills, and you can never get too much of either.
Does anyone know how they catch WoW bots these days? I was thinking that might be even more fun. I just wish there was a guide to the history of the cat-and-mouse regarding WoW.
Jordan on Saturday, August 23, 2008This is a hand evaluator contest that we ran. All java sources are up for download and prepared with the same example so easy to get them running (and no half working stuff). I don't think anyone can beat RayW 7-card evaluator, in any language or by any approach, so the topic is pretty much closed. http://pokerai.org/pf3/viewtopic.php?f=3&t=16
Indiana on Saturday, August 23, 2008hi james,
- ¿Because create your own detoured.dll, because we do not use that comes with Detours ?
- ¿Detourcreatewithdll have to be in a dll.?
alex on Saturday, August 23, 2008Hi guys, thanks, and a few things.
James Devlin on Saturday, August 23, 2008We still have a ton of botting-mechanics stuff to do. So we're not leaving this topic (DLL injection, hooking, scraping, stealth, etc.) by any means. We'll be doing some contests here as well.
Indiana is right: Very hard to beat the RayW evaluator. But prior to the RayW evaluator, people were saying the same thing wrt the poker-eval evaluator. And how well is RayW optimized for multi-core?
More importantly, most of the evaluators don't support SAIE computation and so far as I know this has never been benchmarked, at least not making use of very fast core reference evaluators.
Bismarck, the point you're missing is that the RayW and poker-eval evaluators are all we need. We don't need to get any faster. We can use those evaluators as-is and we can use them for the next 10 years. So this is really more of a "for-fun" thing, and a way of paying our respects to some clever work.
And with regard to testing... typical deal: known, isolated hardware, single and multi-core, using multiple testing strategies, and the full source code for all tests and reference evaluators will be provided ahead of time for anybody that cares to take this on.
"And how well is RayW optimized for multi-core?" -- RayW code is just a table lookup, you can't go any faster than that. It runs for 146,000,000 evaluatons per second. On a multi-core, for full evaluation purposes, you can lookup in several threads, and that's pretty much all you have to do. This isn't available as coding, but is a possible extension that one can easily do.
For a single hand evaluation there is no way to speed this up, as it's really mostly a table lookup, and this is pretty much a "single instruction operation".
P.S. By the way, there is another contest we run since some time with 1k$ reward, for preflop SAIE: http://www.pokerai.org/pf3/viewtopic.php?f=3&t=869
Indiana on Saturday, August 23, 2008I'm guessing as usual (never have time to lookup/check my statements) But a shouldn't a algorithm running in L1 cache should be faster than a lookup table?!
Nyx on Saturday, August 23, 2008The porting to C actually achieved 450m+ evaluatons per second. This means that it took less than half of a second to run ALL possible 7-card evaluations.
Indiana on Saturday, August 23, 2008[i]>P.S. By the way, there is another contest we run since some time with 1k$ reward, for preflop SAIE[/i]
Looks like a good contest! But it's for known matchups correct? (i.e., N players with known hole cards)
The more common situation in play is SAIE vs. multiple opponents with multiple [b]hand ranges[/b]. For example, try running a PokerStove simulation with Ah Ad vs. 9 random hands and watch it bog down.
Is the deadline for your contest still Sept. 15th?
[i]>RayW code is just a table lookup, you can't go any faster than that[/i]
I agree it's tough. Here's the typical usage:
That's an increment, deref, add, array lookup, and store. Then the final bit-shift or mask to extract the hand category or its rank within the category. Not "single operation" but pretty darn fast.
James Devlin on Saturday, August 23, 2008i've looked at all (okay, almost all) of these evaluators and one thing i never seen any benchmarks for is p. senzee's 7-card evaluator (see link) with the 52c7 table etc. anybody have stats on this?
and I agree with nyx. l1 cache should (might) be the fastest way to go..and other working set optimizations.
Anonymous on Saturday, August 23, 2008oh and also, cactus kev talks about being approached by one of the major poker software co's and asked for his algorithm, and whether it could be ported to 7-card. whatever became of that?
Anonymous on Saturday, August 23, 2008All seems very complex. Putting people on a range of hands is hard at the best of times let alone getting a robot that can always do the correct +EV move.
Poker is Rigged | Forums on Saturday, August 23, 2008Hey James, can you tell how many tables u use to play when playing 30 Hands a hour? c u popo.
popo on Saturday, August 23, 2008Angry, I don't think Senzee's 7-card evaluator is faster than the 2+2's lookup. I read that entire thread and lol. Can 1 programmer do any better? But I would like to see some hand vs. hand-range benchmarks which use that evaluator..
Angry on Saturday, August 23, 2008I understand you're just doing an intro here but I really hope the next two parts are hard-hitting like parts 4-7 were. I would say the best posts of the series are 1, 4, 5, 6, and 7. So far.
Anonymous on Saturday, August 23, 2008To win at poker, you don't have to make +EV decisions all the time. All you have to do is make less theoretical mistakes than your opponents make.
Jordan on Sunday, August 24, 20088 bits a card, 7 cards, and the size of the data pool isn't really an issue.. Can we do this thing with pointer arithmetic, theoretically? There would be 64 C 7 = 621,216,192 64-bit pointers. Find the base pointer, add it up. Using 64 cards instead of a standard deck of 52 side-steps complex combinatorial arithmetic. We're speaking the poker language, but also the computer language.
Step #1. Convert the seven cards into a 448 bit number (7 conjoined 64-bit twins) Step #2. Find the base pointer. Step #3. Add the pointers together.
This is after you have everything already stored. We waste raw memory for quick arithmetic. Am I wrong?
Jordan on Sunday, August 24, 2008actually, a 64-bit number would hold an entire deck. Duh
Jordan on Sunday, August 24, 2008Jordan, isn't that similar to what the 2+2 evaluator does ie, start with the 1st card, look it up in a 52-element array. From that array element, you have 51 vectors to the next array element/next card. And so forth, each card in the hand mapping to another 52-element subarray until you get to the last card, and there's your equiv. class. Is that similar to what you're suggesting
The Poker Chesney on Sunday, August 24, 2008I'm not explaining very well, but I do have an idea that should save time compared to the
int p = HR[53 + *pCards++]; p = HR[p + *pCards++]; p = HR[p + *pCards++]; p = HR[p + *pCards++]; p = HR[p + *pCards++]; p = HR[p + *pCards++]; return HR[p + *pCards++];
but, I'm going to finish it before I say anything more in case there is some contest money. :-) I'll run some tests. Does anyone have a slick method of generating every single combo for test data? I mean, something cool! Something better than nested loops! I'm going to check out boost.
Jordan on Sunday, August 24, 2008When does contest end?
Jordan on Sunday, August 24, 2008Hey! What's wrong with nested loops?
Anonymous on Monday, August 25, 2008James, I respect you and based on your articles I can tell you're just a smart guy who loves the game of poker and programming. Okay? Now let me tell you the problem I have with Coding the Wheel.
You had a huge (unheard of) success with the first post in this series, and you did what anybody would do: you turned those initial readers into a community. Fair enough. I don't blame you for this. If I though you were some sort of scam artist, I might, but I don't.
Now you're happily writing away about every aspect of botting from the mechanical and, with this post it looks like you'll be turning to the A.I. You've got anywhere between the #1 and #20 spot for "poker bot" on Google. Occasionally, you're ranking higher for that term than MSNBC articles, than WinHold'em, etc.
And your site is how many months old?
Now I'm sure, in your head, you don't think you're doing any harm. As you state before, you're not necessarily giving out any information that's not already out there (actually with some of the DLL injection stuff I think you have, but that's beside the point).
But I want you to consider what it means when every poker-bot-wannabe-script-kiddie stumbles across your site and sees, aha.. so THAT'S how they do it. This post is a prime example: take a script kiddie who probably never would've written anything more complex than a basic hand evaluator and tell him Hey! You can get the world's most powerful SAIE hand evaluation code for free! Just check out these links and if that doesn't help, wait a couple posts and I'll give you the source code!
It has the effect of turning incidental botting enthusiasts who never would've done much harm into guys that actually have the tools to get, okay maybe not a WINNING bot up and running, but a foldbot, a trashbot, whatever.
and all this at a time when we're trying to deal with UIGEA and regulation....
Furthermore, since you're not actually selling a botting product, there's no way for the sites to fight back. Your code and ideas will be taken and converted into a hundred different tools, each with a different name, a different set of goals. The sites can't spend time chasing down hobbyist bots, but it's the hobbyist bots that will ultimately ruin the game, not the big commercial bots (most of which are crap anyway).
So as a guy who enjoys your writing, I have to say: it's okay to give up the botting series and just write about normal stuff. Your community will stay with you. And don't you get tired of hashing this stuff out endlessly?
My favorite post of yours to date? The short, random ones about random computer/technology subjects. Not the botting posts, although those are interesting.
Give what I've said some thought and think about drawing the botting series to a close. You've done a good job so far, no need to knock it out of the ballpark.
Anonymous on Monday, August 25, 2008From what I've seen the online game is already somewhat ruined, and good rittens (coming from a mid-stake live player)! It's frustrating since poker isn't what it was 5 years ago, understood. But, in my humble opinion, online poker deviates from what truly is poker. Besides, every wanna-be math kid has already given poker a try, and many of them made it (although many more of them did not).
Besides that, online poker sites don't do nearly enough to protect the players from bots. They should either make bots legal and regulated (Vegas style), or ban them altogether and use more sophisticated agreed-upon spyware to keep them out.
Furthermore, there is a lot of different directions one can go with this. I'm actually constructing a simulator, and don't take much use so far out of the articles themselves, but from books on the STL and boost, and Windows C++. Just because I learn all of these techniques taught on this site, it doesn't automatically mean I start rolling out bots.
And even still! It's going to be damn difficult to make one win. But, I think the grossest part of it all is that THE PUBLIC IS UNAWARE!!!
Now, you want to keep all of these secrets to yourself. I respect that too. But lets face it, a large chunk of the bots will get caught unless the builder has extensive knowledge on a large variety of topics. AI is an important topic that REALLY HAS NO VENUE so far, except for like airport security facial recognition, and biometrics. If you want truly intelligent machines in the future, I think that the best way is survival of the fittest.
I've played against bots 6 tabling $50-$100 sit 'n gos on Stars. He had an avatar of a man on an easy chair (looking for the conservative image) and played a very binary game. I always figured him as a bot. I never emailed Stars. You know what I did? I STOLE HIS BLINDS! And I'd also call him if he was committed to push on like the button or something. It was also fairly trivial. Of course he was a regular, but that didn't stop me from REGULARLY STEALING HIS BLINDS!
Of course, he might have just been the biggest most predictable nit in the world, but somehow I doubt it. And realistically, it doesn't make a difference, bot/nit mean just about the same thing to me.
Besides, this all could have reasonably been predicted as soon as the poker literature was kept out. The elite secrets of poker are few and far between. It is inevitable.
Jordan on Monday, August 25, 2008I agree that you should give the input and output stage methods and leave most of the rest of it alone. I actually want to figure this out on my own but my windows skills are weak (I'm getting the Windows via C/C++ book tomorrow). So it's great to have the very windows specific stuff from the input and output stages in there.
One thing I've realize is it's way better to get the input stage and logic going with a test app. Play some real hands, store all game text and other stuff to files. Then have a test app send that stuff to your bot like the poker client would. You can test pretty well doing that without having to debug your bot while the live PokerStars is running.
Anonymous on Tuesday, August 26, 2008question about detection...
can't a poker client detect that the detoured.dll is in its working directory? that would be a telltale sign there's a bot. PokerTracker and the like don't do that.
I'm going to change the signature and name of that dll in my bot(if it works).
Anonymous on Tuesday, August 26, 2008detours, or whichever support injection lib you use... isn't in the poker-site's working directory/folder. You compile an app that includes a dll that will be in your dir. When you run your app you'll inject your dll into the poker-sites address space. dll injections happen all the time on a PC. They could potentially determine that something is loaded into their address space... if they knew what to look for, and if they cared enough to look.
There are a few hundred poker-sites. Of all of then... there are just two that care enough to look. But they look for big name known botting apps, and some stat collection apps, and some sundry other poker support software that they deem to be in violation of their site guidelines.
A homegrown bot that may or may not work some day, that may or may not break even some day, that could have one name today and a different name tomorrow... just isn't a real threat... and just isn't worth their time. And we've all used different programming techniquesto get our code-projects working.
Now if you make a super great bot, and sell a few thousand copies of it, and it gets used in collusion rings and such... then, maybe, it will be worth their time. But worry about that then. In the meantime maybe your code-project in progress just needs to get semi-working first.
DMonPoker on Wednesday, August 27, 2008Hi, James.
There are some voices asking you to stop the bot series. Well, I ask you not to do it.
Since I discovered this site, a month ago, I have:
And, in a near future, I'll learn to simulate human behaviour.
It's been all because of this series. Please, keep on it.
Anonymous on Wednesday, August 27, 2008Yeah, I've learned a lot so far. I encourage you to keep going as well. I look forward to your writings every day.
Jordan on Wednesday, August 27, 2008To the anonymous guy who says...
[quote]... it's the hobbyist bots that will ultimately ruin the game, not the big commercial bots (most of which are crap anyway).[/quote]
I don't get this. I don't see the connection between bot proliferation and the ruination of the game. Crappy bots will add to the pot for players and add to the rake for poker rooms.
Edward on Wednesday, August 27, 2008[i]> Give what I've said some thought and think about drawing the botting series to a close.[/i]
I get this kind of advice a lot and it overestimates the effect of sites like CTW on the online poker industry. And it underestimates how interesting this stuff is to certain people (like me).
Jordan, Edward, DMonPoker's comments are worth reading about why it doesn't really matter.
James Devlin on Wednesday, August 27, 2008>[i]Give what I've said some thought and think about drawing the botting series to a close.[i]
Why? James' posts are fantastic to read and really draw you into the subject where most sites fail miserably. If the online poker industry fails because X number of people learn to make a homebrew bot from this site, they have more problems than just this. If the online poker industry is never challenged it will become stagnant, stale, and eventually fall apart. Challenging forces them to come up with new strategies, new ideas, and ultimately brand new inventions that might never have come about.
Nothing but good can come from this site!
Adam on Wednesday, August 27, 2008Yeah, of course I agree w/ you Adam. I'd also add that since poker is not so strong right now, it's not such a bad idea to "retool". I wouldn't say retool or GTFO, but ya you know, retool. :-)
Jordan on Thursday, August 28, 2008oh, and my idea for the contest wound up being really foolish (surprise surprise) maybe nested loops will do after all.
Jordan on Thursday, August 28, 2008I made an algorithm, long ago, for my own use. It evaluates the hands just like a human could do: orders the 7 cards from bigger to lower (qsort), look if the first two cards are a pair, then look if the third card makes a third-of-a-kind or not; then look if the 4th card makes a four-of-a-kind or double pairs, and so forth.
It means that, once the cards are ordered, I only have to look each card once to know which hand it is and get its value. So, there are no nested loops and everything is done in a single step.
It's not slow: about 1.2M hands per second (in C), and was enough for my needs so far. Could be improved (making it return faster when having hands that are more probable, things like that), but it simply was good enough.
I'm not going to try to win the contest; I really don't think I can play against the above algorithms (which I hadn't heard about before). But I will stop using my own algorithm and use the winner instead. :-D
Anonymous on Thursday, August 28, 2008mine takes a 64-bit unsigned integer, and returns a 16-bit integer. There is one bit for each card. Barry Greenstein has one on his site, but it's not very efficient. It's TLC, lol.
I only have to cycle through the 64-bits one time, and then I have all the information on where the pairs, trips, quads, straights, flushes are. It wouldn't take too much modification to turn it into a low.
So, if you had 7 cards, you'd pass it like this Eval( 1 << card[0], 1 << card[1], 1 << card[2], 1 << card[3], 1 << card[4], 1 << card[5], 1 << card[6]);
No repeats! Huzzah!
I also have one of the traditional way, an array of cards. I don't know how memory works exactly, but my thinking is that you could have a 64-bit pointer to 16-bit unsigned integers and have it work insanely fast.
Jordan on Thursday, August 28, 2008The catch is there isn't enough space in RAM to hold 2^52 64 bit pointers. But it might be useful to send messages this way from process to process. Didn't say it was a good idea, but it is an idea. :-P
Jordan on Thursday, August 28, 2008jordan that's similar to what pokersource uses, a 52-bit bitfield one bit per card. then a bunch of masks and bitwise manipulations. it can be very fast but the 2+2 approach (cards are whole numbers 1-52) is i think even faster...
Anonymous on Saturday, August 30, 2008Do they do something like this?
&00000000000000001000110100000110000000000000001000000000010000000
where the memory location IS the bits that represent the cards? I'm no expert by any means, but if that could be done in RAM, that would boost things significantly.
Jordan on Sunday, August 31, 2008what I find most promising are the suggestions in the 2+2 thread which were never implemented. Tweaking the size of the lookup table.. 130MBs seems puny. Surely we could get more speed by doubling the size of that table, or etc finding the right memory size vs. speed ratio for max performance.
Ed K. on Sunday, August 31, 2008Ed, I couldn't agree with you more. Memory is the closest thing you get to a free lunch. Obviously, you can't look-up table all of it, but I would think we could test a few different engines to see what works best.
There's going to be some choices on how you want to allocate the memory best. A chunk needs to be given to the look-up tables for fast look-up, the AI, and the mechanics.
Jordan on Sunday, August 31, 2008So, what's up with the contest???
Adrian20XX on Sunday, August 31, 2008Thanks for the hand evaluator links. There were a few of those that I hadn't previously stumbled across :)
I look forward to seeing the contest results and the next article in the series.
[url=http://www.icmbot.com]poker bot[/url]
poker bot on Monday, September 01, 2008some of the above evaluators are hard to build, for me at least.. just spend 4 hours trying tobuild the 2+2 / ray w. evaluator. finally got it but... sheesh.any idea when's the next post coming?
Anonymous on Thursday, September 04, 2008Cactus Kevs 5 card eval and Senzee's fast eval modification (both in ANSI C) is relatively easy to build or port to another language .
PokerSource is quite difficult/complex to port. It has a C# interface, but I have no idea how to add some of the exports I need. It was quite difficult, but possible to build the dll with the 64 built in exports. Unfortunately it won't work with the C# api, as it uses some exports which weren't in the resulting dll. (And I'm not good at c++, so I were unable to add the missing exports)
Nyx on Thursday, September 04, 2008I don't know when/if the next one is coming. But, I'm confident that reading all of this material that in a couple of years I could make one. Bots don't really matter though to the poker community.
1) If it walks and talks like a duck, it might as well be a duck. 2) 90% of bots are doomed to be failures. (guesstimate) 3) Isn't the attitude against bots eerily similar to the attitude against professionals? Professionals were unwelcome as they ciphened profit from the game. 4) Bots have their place in the poker culture, too. 5) Scientific advancement is often motivated by a buck. I strongly feel that these pet projects by intelligentsia to make cute bots that talk back is pointless and vain. We need bots that MAKE DECISIONS.
In this century, bots are going to become the new minority. Already we get a sneak peak at how they will be scapegoated.
Jordan on Thursday, September 04, 2008Bots will always win in the long run, in any bot vs. human interaction. Their saving grace is that, unlike in the movies, bots and a.i. will create an unheard of quality of life for people in the new era. What's of value is intelligence. Whether it's packaged in the bot or in the brain is irrelevant to the point. But until that point is actually realized it will be go badly for some. No bots allowed, in this and other industries, until we get to the point to where denying people compute AI is like denying them air.
jqmx on Friday, September 05, 2008On September 10, 2008 I became aware of this series of articles. I made it up to part 4, got everything building successfully using boost in a Windows Vista 32 OS, but...after opening the Pokertime client and starting XPokerBot, nothing appeared in the XPokerBot GUI.
I saw someone else post about this problem and Mr. Devlin's reply was to wait for upcoming articles. I quickly scanned all the 8 articles and found no solution other than a reminder that nothing is tested to work in Vista. Maybe I missed something? Can someone point me to the solution for nothing appearing in the XPokerBot GUI under Vista?
Thanks.
Left Behind on Friday, September 12, 2008Really like the articles you have presented, the $50,000 dollar question is... when the series is complete will you be making the bot (minus your strategies for it) available for download / purchase ? Not everyone is as skilled as you obviously are in the coding arena and no matter how much effort is put in, nothing seems to stick. Obviously if is not going to be available then you will miss a trick because some other enterprising individual will use your advice to sell a reasonable replica of your work.
Damn Noobs on Friday, September 12, 2008I think it would defeat the purpose of these articles to eventually release a completed bot. It will be far more effective to explain components and different ways those components can interact, along with some strategies on how to fly under the radar.
James Devlin is in the process of seeding the poker AI gene pool. Our job is to go forth and multiply, mutate and evolve. The fittest will survive and prosper.
The model is Evolution, not Creationism.
Charles Darwin on Saturday, September 13, 2008@Damn Noobs
That's silly. The point of this is not to sell the bot, nor to provide it free for script kiddies to use without understanding how it works. Point of the blog is extending knowledge.
"Not everyone is as skilled as you obviously are in the coding arena and no matter how much effort is put in, nothing seems to stick."
I couldn't disagree with you more. Put enough effort in, and you'll sure reap the benefits. You just have to keep at it. You'll never learn anything with an attitude like that, in our outside of the coding arena.
ehsanul on Saturday, September 13, 2008In the monitor bot, in the XPokerbot.Hook.cpp, you left a comment saying you would get rid a global variables. How would you get rid of them?
Dave on Friday, September 19, 2008James is right. I ran bots for a living for over four years and the poker-eval code is all you will ever need. I had to tweak a few things to give me certain specific information I wanted but anything else is overkill and a waste of cpu time. Strategy/AI is everything and this is where you will spend 95% of your coding time so save your brain cells for that and leave perfect hand evaluation to the Will Hunting wannabees. If you plan to be a bot runner you will have plenty of more important stuff to tackle.
Buy enough coffee to hold you over for at least a year while you work on strategy. I swear I kept the local Starbucks from filing bankruptcy while coding bot strategy.
Shalako on Wednesday, September 24, 2008It's all very well creating super fast enumeration code, but surely an accurate evaluator fed with a few million random (Monte Carlo) hands will yield a usable win % in a substantially faster time? As stated above, CPU time is better spent far more important decisions. In fact, i believe that a more efficient starting point for a bot is to actually IGNORE the cards and concentrate on player profiling and psychological and positional strategies...
Anonymous on Thursday, September 25, 2008I created a rather complicated player profiling system but found the bot didnt use it often enough to warrant all of the extra work and cpu usage. My bots played limit so its multiway most of the time and profiling is much less effective (at least in my opinion.) In fact it was very rare that the bot deviated from its basic strategy based on a player profile. In many cases you will not have enough data to make a correct decision anyway. You will need quite a bit of data in order to make a correct decision over 50% of the time. In NL I can see profiling to be much more important as you can isolate effectively and keep the game shorthanded or HU post flop against a weak opponet.
Many of the bot runners I knew spent way too much time on player profiling. The other mistake I saw was testing their bot against other bots. The only way to test a bot is to but it in the ring against real human opponents. You will lose money during this process and its unavoidable. Bot debugging can get frustrating and time consuming. My bot folded the nuts on the river many times before I got it all debugged. The only way to make money is to lose money for awhile. It took about 250k hands before I was happy with its play and performance and it began to make money. Have plenty of coffee on hand while your pouring over the thousands of hand histories each day.
Shalako on Thursday, September 25, 2008from start to finish how long would it take to make your bot ,how many hours did it take to buils
joe on Saturday, September 27, 2008Hi Joe. Mine took about two years and hundreds of hours before I was happy with it. You can get a simple bot playing the nut hands in just a week however. If you want to make a NL SNG bot I think it would not take that long. Many bot runners I know of are making bots for these games. Many SNG bot strategies are Jam or Fold from what I understand. Not nearly as much programming would be required for these as I believe they are mostly preflop strategies.
My experience was with limit bots and the reason it took me so long is that I had to get help from a pro to correct the mistakes. This of course took a huge amount of time.
I think a NL Cash bot would be the most challenging and probably the most difficult bot to attempt. This is where player profiling and all that would be really be needed. A system of putting people on a range of hands and comparing them to the board cards and their betting could get complicated but not difficult at all. All of this could be done with a rules based system which many people might not agree with. You could test a system like this in observe mode and fine tune it before putting the bot into live play and not risk a dime.
Shalako on Tuesday, September 30, 2008Great Post
http://www.poker-bots.com/
Poker Bot on Monday, October 13, 2008This has been a very eye-opening series of posts so far, but I would really love to get some more info on stealth and other things like that. For example, I don't think much has been done to address natural mouse movements, etc.
Jimbo on Saturday, November 22, 2008Hi james... and big thanks for your work !!!
in part 4, you promised updates for xpokerbot.zip, including compatilibility with other rooms like poker star... Is this project to publish release is still up to date ? i am very interested in this code because , i am not familiar with hooking... and c++ too
I wrote my own poker bot, using your code, and without you, i won't have the idea to begin this mad project... thanks a lot... it works pretty good, but i need to adjust its playing strategy... If you are interested, i have piece of code in C# to evaluate multiple odds opponants (monte carlo) using hash table in less than 2 seconds for a complete board and 9 opp...
BRZ Corp on Thursday, December 18, 2008this is an awesome series, are you still posting?
Anonymous on Thursday, January 15, 2009This ia an awesome series....Thanks a million James.
I have a quick question has anyone been able to get text out from the chat box in Poker Stars. If anyone has could you please tell me the process used...I have been trying to follow this whole series but not being a programmer myself don't know what tools to use. I know James has done a good job but it's too much info in a short span to grasp.
I loved the series though and am trying this out.
Anyone who has been sucessful could you please share the wisdon. PLEASE.
AB on Tuesday, February 03, 2009Nice job!
We did something similar too, you can download the free trial and check it out! http://www.pokerbot-smart.com/
No Limit Poker Bot on Sunday, March 01, 2009Awesome
Poker Bot on Monday, March 09, 2009Very well written James, you should write a small book on this botting subject sometime :) Keep up the good work!
pokersniffer on Saturday, March 14, 2009Great, But I have finished all you done. My English is poor, My work is in chinese. Here is screeshot: [url]http://www.eepoker.cn/eepoker/screenshot.jpg[/url] Have some more utility my website: [url=http://www.eepoker.cn]eepoker(????)![/url] ???????,??????????????????
EE on Thursday, April 02, 2009So sad this series actually ends... please apply your genius to other fields and blog about it. thx.
California Poker Casinos on Wednesday, April 22, 2009I am awaiting the contestants' entries. This has been a very entertaining series of posts to follow. Keep up the good work!
PlayersOnly Rakeback on Thursday, April 23, 2009Is this series over? I hope not!
Anonymous on Friday, April 24, 2009Personally I'd like to see how to create dragable windows(controls?) into the client window like the ones you see that have the HUD displays. This is most likely a trivial thing to accomplish - unless you have no idea where to start...
Anonymous on Tuesday, May 05, 2009Thank you for one of the most enjoyable and inspirational coding articles I have ever read. Your articles inspire me to challenge myself with my programming.
As noted in another one of your articles, Pokerstars no longer uses DrawText and ExtTextOut to populate the chat window:
quote: "I regret to be the bearer of bad tidings, but this was the purpose and intent of the change -- to deny malicious third party developers access to hooking 'DrawText' to extract data from the dealer chat window. We have completely avoided the use of 'DrawText' and 'ExtTextOut' in favor of a proprietary internal solution, and as such the contents of the chat cannot be extracted any longer."
With this change, it's no longer possible to program the "input" portion of the bot as you described in your tutorial articles. Will you have the time or the inclination to update us on a new method to "read" the chat window?
Thanks again!
PokerCoder on Wednesday, May 20, 2009This is intense man. You should write another blog about collusion and how it is done with all of the technical stuff included. I would really like to read that.
PKR Bonus Code on Wednesday, May 27, 2009is anybody making money with this pokerbots. i would love to hear about more hear. this is an awesome blog.
poker on Wednesday, May 27, 2009With all that information you get you should be able to create a good winning poker bot at low stake tables or even higher.
Thanks for sharing
Poker Bot on Tuesday, June 02, 2009This is really interesting stuff, it seems like you are on track to building serious competitor. I really do wonder sometimes how many bots are operating out there in the poker rooms. Anyways good luck and keep up the good work.
John
Poker Online on Sunday, July 12, 2009Just a few words of comfort for those of you building bots. Do you think people would be selling them if they actually worked? No - unless you think there are charitable people who love helping cheats :O)
They would hide them like gold dust.
Personally I find I play better totally unaided.
Here is a thought, though you bot only needs to be 5% acurate cos you have to bet a 5% rake, I can get about 5% or very close unaided which means your bot can't win.
Try a simpler program in cash games which calculates how much each player wins, quite easy to write, you could do it in a week starting from scratch, code it up as you play.
You will find the only winner is a player with the same name on ever table,he is called................MR RAKE.
alternatively look at the poker sites profits and chuck in th ehuge running costs :O)
Big Bren on Monday, July 27, 2009Since you built this a lot of sites have been cracking down on programs that run over their software. Has this affected you? Also, everytime sites update their software does this cause the bot software to stop working? The reason I ask is many poker sites are constantly updating.
Fuzion Poker on Friday, August 28, 2009How would you recommend going about extracting hole card data from a client like Absolute Poker, for example. The hole card info isn't available in the chat window, nor does it get written to any kind of log file in real time. I've used all kinds of monitoring software and I can't determine where in memory this info is being stored. any ideas?
chris on Friday, September 18, 2009Hi, This is a great set of articles! I'm very interested in making a roulette bot and I know the same concepts apply for reading the information from the roulette client. If anybody else is making a roulette bot please post and let know...
mariiikar on Thursday, October 08, 2009hi, just to mention i built my bot purely from vb6 and without hooks. That was about 2 years ago, it took me about 2 months to get a simple semi auto bot running, but i have been programming over 25 yrs so.. its a hobby, if anyone needs a programmer in this area, please email me. Danny7202@Boltblue.com
Dan on Friday, October 23, 2009Man I hope the high you get from teaching newbies GDI hooking is worth it. I'm glad this stuff is all 4-5 years out of date, but still kinda sucks that you're giving all these idiots a leg up.
Anonymous on Monday, October 26, 2009Hi everyone,
I would like to congratulate James Devlin because your web site is really amazing. From the technical point of view, it is 7 stars, not 5. It is outstanding.
Right now, I would like to find someone to cooperate with me on a poker software project whose goal is to improve SNG table selection (Pokerstars). As James Devlin states, table selection is very, very important and I need to improve that area. What I am looking for is someone that is able to develop a software that retrieves the content of any listbox on Pokerstars. I have already developed ALL the software needed to evaluate if we should or should not register on each specific tournament taking into account some statistic criteria ....
If you are interested, please post your email on a comment and I will contact you afterward.
Poker of Aces on Monday, November 23, 2009Hey Poker of Aces, I work on another Poker project. I focus on cash games. But maybe we could exchange some knowledge and how to investigate new Poker rooms.
Feel free to write me an email: Klabautermann176@web.de
Klabautermann on Thursday, November 26, 2009Cool it works very good.
Unibet on Monday, December 14, 2009I see you have no update on this series for a while... do you plan to write more?
thanks.
Daniel on Wednesday, February 17, 2010Hello, I'm a new guy in this industry, this is my first reading about any poker related journal. so I found this very much helpful. Your explanations with charts & good pictures let me realize the whole thing very well.
Atanu Ghosal on Saturday, March 27, 2010Go ahead, get inspired and come up with more articles please.
Bots on Monday, April 26, 2010no more time or ambition...
http://cgi.ebay.com/Windows-Via-C-C-Jeffrey-Richter-2007-Hardcover-/130394940039?cmd=ViewItem&pt=USNonfictionBook&hash=item1e5c24e287
pjdk28 on Wednesday, May 26, 2010I am guessing the way (never had time to research and check out my review), but no algorithm that runs the L1 cache is faster than the lookup table?!
logo design
Summer on Wednesday, June 30, 2010The service, which debuted in NCR parts the Bay Area ATM Parts earlier this year, allows Diebold Parts Wells Fargo customers Delarue Parts to have ATM receipts go electronically Wincor Partsinto their online banking inbox or a personal email account Heavy Construction Machinery and equipment will Construction Equipment likewise be in high demand to Concrete Mixer support construction projects Concrete Mixing Plants initiated by the Saudi Concrete Mixing Station Government, which has allocated up to $400bn in the next five years Concrete Machine to build a Hydraulic cylinder, healthcare, infrastructure, transport and communications facilities.Wipro Linear actuator Infrastructure Engineering, a Bangalore, Hydraulic power pack India-based manufacturer of hydraulic cylinders, has signed an Hydraulic pump agreement with the Wujin Grow lights Hi-tech Industrial Zone in Changzhou, China, to set up a large Hydraulic power units manufacturing facility there.Supplement have proven effective in Softgels treating depressed patients who do not also suffer from an Health food anxiety disorder, a study involving Montreal researchers Dietary Supplement Manufacturer has found.The study Mold explored the effectiveness of fighting depression with Omega 3 Softgels rather than anti-depressant Spirulina Tablet drugs such as Prozac or Multivitamin tablet Paxil."Many of these (alternative) treatments have not been adequately Vitamin E Softgel evaluated," said Francois Lesperance, director Bee Propolis Softgel of the study and head of psychiatry at the Universite Nutritional Supplement de Montreal hospital centre.for Fish oil softgel,Evening Primrose Oil Softgel,Liquid Calcium Softgels and Multivitamin Softgels,How about ofOMEGA 3 and Nutritional food,Vintage Chic rocks at Ray Ban sunglasses Glasto, so team old band tees with Ray Ban denim cutt-offs and slouchy shirts.The government yesterday distributed compact fluorescent lamps (CFL), popularly known as energy saving bulbs, to electricity consumers free of cost as part of its move on energy conservation in the wake of Energy saving lamps nagging power Energy saving lamp crisis.A total of 55 lakh bulbs were distributed Energy saving bulbs among the consumers in Energy saving bulb selected areas of 27 districts Grow light including capital Dhaka.In the capital, Dhaka Power Distribution DVD Ripper Company Ltd (DPDC) and Dhaka Metal halide lamp Electric Supply Company Ltd (DESCO) distributed the Metal halide lamps,Metal halide bulb in different selected Metal halide bulbs areas.Other distribution entities like Power High pressure sodium bulb Development Board, Rural High pressure sodium lamp Electrification Board and West Compact fluorescent lamp Zone Power Distribution Company Ltd distributed the bulbs Halogen bulbto their respective consumers in other Hid ballastdistricts.The indexed feed means Fire hose that users can view the full Fire hoses conversation, making it Interactive whiteboard and Teaching apparatus easier to see what is being Electronic whiteboard said rather than just Embroidered Fabrics seeing one keyword tweet and Textile fabric having to reconstruct the conversation Textile fabrics through manual hunting. With some 65 million Cord embroidery fabric tweets a day, and growing, advanced ways of finding information will become Cord embroidery important features for social tools.Embroidered Fabric,Police went through one of Tarpaulin Port-au-Prince's biggest and crowded settlements PVC Tarpaulin in search of the PVC covers criminals. Some of the men captured are suspected of escaping Truck tarps a Port-au-Prince national Heavy duty tarps penitentiary. The penitentiary walls cracked during the magnitude-7 PVC Fabric quake enabling the men to escape. All the inmates Waterproof tarp fled from the dangerously overcrowded prison, where the Tarps vast majority were held awaiting prosecution. In addition, to Casual product assist with the delivery of Zungui's retail Microfiber cloth growth strategy, a Chief Operating Printing Officer position will be added to Custom hockey jerseys the management team in China."Montreal canadiens On behalf of everyone in women's hockey, I am truly honored," the Toronto Team Canada jerseys native said. "As a kid I went to the Vintage jerseys Hall and was in awe of those who had been Replica jerseys inducted. I am delighted to be able Replica NHL jerseysto join them."Ciccarelli played 19 NHL seasons NHL jerseys with five teams, recording Edge card 608 goals and 592 assists in 1,232 dstt card games. In nine seasons with R4 card the Minnesota North Stars, he led the team in scoring five times.that was Diego Maradona, the human vuvuzela on the sidelines at this World Cup, Carbon fiber hood and this is Low, a jazzy sax riff. When he does arrive Carbon fiber rear spoiler.As the “Solar Miner VII” made its way up the hill to the state Capitol, to become the fourth team to check Carbon fiber body kit in, the team of students got ready Carbon mazda mx5 hard top. Once it reached its spot in the circle drive, they lifted the top of the hats car off to let driver Jeremy Clemens Needle Felt from Branson out. He’d been behind the Filter Fabric wheel for about six hours, but passed Liquid Filter Bag Stanford’s car on the leg of Industrial Fabrics the race change Dust Collector Filter Bag. only theFlexible Tub and Tubs,except Mold and Plastic mould for the пресс-форма and Плесень translation.Manufactured by dedicated Full lace wigs,experts who use only Front lace wigs the finest human hair for all their lace wigs and hair extensions, Owigs are Lace front wigsproviding the videos to ensure Lace wigs customers can see for themselves Oil Painting just how stylish, natural looking Silicone wristbands and Lanyards real their range of hair extensions Square Steeland lace wigs can be. Deandra Jones Square Steel Pipeisn't going to let a scaled-back budget Steel Flatscale back her family's plans Roofing Nailfor a fun-filled summer. "We're just going to Steel Wire Ropeapproach things a little differently," she said as SNS active protection systemshe placed an oversized ball atop Decorative Wire Mesha toy-stuffed Target shopping cart one Crimped Wire Meshday last week. "Instead of going to where the fun is, we're going to make the Collet chuck and Cut Wire
jia890302 on Thursday, July 08, 2010nice article. keep post like this...
Fendi replica watches on Tuesday, July 20, 2010Wow,good! I love what you wrote. I think we can make friends.
vibram fivefingers on Thursday, July 22, 2010PerformingGraham for sale that will create a one-wayswiss watches backlink to your website whichMaurice Lacroix watches is a good point to have. It is Patek Philippe watchesa time-consuming Tag Heuer for saleprocess even though it produces good outcomes U-boat for saleand works. You can also swiss watchespost comments on blogs alongMaurice Lacroix watches together with your link, but make sureGraham watches these blogs are do-follow, which dolce & gabbana handbagsindicates the link that youreplica coach handbags simply post will probably be replica handbagscounted by the search engines jimmy choo replicaas a backlink.There are many thingsversace replica handbags that contribute to online businessjuicy couture replica failure, and the lack of good action thomas wyldeis surely one of the deadliest business-killersdolce gabbana handbags on the net. Take action like by no means chloe handbags replicaprior to, and don’t get struck by analysis paralysisburberry replica. Your achievement lies in your rapid actionchanel replica and how well you apply numerous strategies.
replica watches on Saturday, July 24, 2010nike air jordan 2010 nike air jordan 5 nike air jordan 3 nike air jordan 11 cheap nike air jordan 2 nike air jordan 1 nike air jordan shoes discount nike air jordan shoes nike air jordan 6 wholesale nike air jordan 1 discount nike air jordan 6 nike air jordan 7 nike air jordan 8 top quality nike air jordan shoes 23 nike air jordan 21 nike air jordan 22 nike air jordan 6 rings cheap nike air jordan 22 nike air lebron james shoes nike air lebron james shoes nike air jordan 2010 nike air joredan lebron james nike air jordan 2009 discount nike air jordan 2009 nike lebron james wholesale nike air jordan 2010 cheap nike air jordan 2009 discount nike air jordan 19 cheap nike air jordan 3 discount nike air jordan 18 brand nike air jordan 12 wholesale nike air jordan 2 nike air jordan 13 nike air jordan 14 nike air jordan 6 rings discount jordan shoes7 discount jordan shoes1 jordan shoes2010 jordan shoes 6 rings cheap jordan shoes2 discountjordan shoes3 discount jordan shoes4 jordan shoes uk23 jordan shoes classic bw22 cheap jordan shoes 21 ltd discount jordan shoes20 discountjordan shoes19 jordan shoes 18 uk nike air jordan shoes 17 cheap nike air jordan shoes 16 discount air jordan shoes 15 discount air jordan shoes 14 nike air jordan shoes 3 uk nike air jordan shoes 13 cheap nike air jordan shoes 11 discount air jordan shoes 6 discount jordan shoes 10 nike air jordan shoes 8 nike air jordan shoes 7 cheap louis vuitton bags cheap kobe bryant shoes cheap lebron james shoes .
cheapjordan on Saturday, July 24, 2010I will keep visiting this blog very often. Blu ray to iPad /
ipad converter on Sunday, July 25, 2010The variety links of london items bearing depends on the occasion. You are plain, but you are elegant. links of London sweetie braceletIf presence a groove, especially nightfall outfit, you are allowed to be very gentle in truth. What you should do is to links of london charms choose some delicate sweetie bracelets with your subtle sensation of fashion on Christmas Day, Easter, Halloween and Valentines Day. Discovering links of London friendship bracelet on the net is an excellent choice for your needs and can also assure you may benefit from the best insurance coverage at the best price tag. The links of London braceletis one kind of those brands that basically level the start a time honored design and style and design untreated. links of london necklace and links of london earringswill be the consultant of level and higher personal taste; so many people contain the hopes for donning links of London sweetie bracelets. Nevertheless, in the large price, so most of us cannot pay the big money. links of London friendship bracelets charm bracelets links of london sale charm bracelet silver friendship bracelets links of london charm bracelet
links of london on Monday, July 26, 2010ed hardy, cheap ed hardy, ed hardy clothing, ed hardy outlet, ed hardy jeans, ed hardy bags, ed hardy swimwear, ed hardy shirts, ed hardy tee, ed hardy caps, ed hardy purse, ed hardy board shorts, ed hardy shoes, ed hardy for men, ed hardy for women, ed hardy jeans for women.
cheap ed hardy on Tuesday, July 27, 2010ed hardy, cheap ed hardy, ed hardy clothing, ed hardy outlet, ed hardy jeans, ed hardy bags, ed hardy swimwear, ed hardy shirts, ed hardy tee, ed hardy caps, ed hardy purse, ed hardy board shorts, ed hardy shoes, ed hardy for men, ed hardy for women, ed hardy jeans for women.
cheap ed hardy on Tuesday, July 27, 2010Life will change what you are but not who you are;
Blu-ray Ripper on Thursday, July 29, 2010Marry a person who likes talking; because when you get old, you’ll find that chatting to be a great advantage
blu-ray ripper on Thursday, July 29, 2010Authentic Louis vuitton sale are listed on eBay everyday This is a ... out the more juicy obvious fakes... and will do my best to help you
Louis vuitton Bags cooperation with Mikhail Gorbachev, the first and the last president of the USSR, produced one of the best advertising
sale4louisvuitton.com Supply Cheap Fake Handbags, fashion designer Replica Louis vuitton, All Kinds of Bags,Purse,Wallet at low price.You will get the best quality
louisvuitton4 on Thursday, July 29, 2010I like your article. Will always support you!He is quite a good reading. i'd appreciate it. time to realize his.
blu-ray ripper on Thursday, July 29, 2010Your article is very appealing to me.I like this article, this article that i learned a lot of knowledge.
Video Converter on Thursday, July 29, 2010Wholesale NFL Jerseys
Cheap NFL Jerseys
NFL Jerseys
NFL Football Jerseys
Women NFL Jerseys
Kid NFL Jerseys
Super Bowl Jerseys
Super Bowl NFL Jerseys
Throwback Jerseys
Throwback NFL Jerseys
Cheap Throwback Jerseys
Wholesale Throwback Jerseys
Cheap Super Bowl Jerseys
Wholesale Super Bowl Jerseys
youth nfl jerseys wholesale
youth nfl jerseys cheap
nfl youth jerseys
Baltimore Ravens Jerseys
Chicago Bears Jerseys
Cincinnati Bengals Jerseys
Denver Broncos Jerseys
Dallas Cowboys Jerseys
Green Bay Packers Jerseys
Indianapolis Colts Jerseys
Minnesota Vikings Jerseys
New England Patriots Jerseys
New Orleans Saints Jerseys
New York Jets Jerseys
Arizona Cardinals Jerseys
Buffalo Bills Jerseys
Atlanta Falcons Jerseys
Carolina Panthers Jerseys
Cleveland Browns Jerseys
Houston Texans Jerseys
Detroit Lions Jerseys
Jacksonville Jaguars Jerseys
Kansas City Chiefs Jerseys
Miami Dolphins Jerseys
New York Giants Jerseys
Philadelphia Eagles Jerseys
San Francisco 49ers Jerseys
Oakland Raiders Jerseys
Seattle Seahawks Jerseys
Pittsburgh Steelers Jerseys
St Louis Rams Jerseys
San Diego Chargers Jerseys
Tampa Bay Buccaneers Jerseys
Tennessee Titans Jerseys
Washington Redskins Jerseys
Ray Lewis Jerseys
Ed Reed Jerseys
Joe Flacco Jerseys
Terrell Suggs Jerseys
Dick Butkus Jerseys
Greg Olsen Jerseys
Matt Forte Jerseys
Devin Hester Jerseys
Walter Payton Jerseys
Brian Urlacher Jerseys
Lance Briggs Jerseys
Jay Cutler Jerseys
Carson Palmer Jerseys
Rey Maualuga Jerseys
Chad Johnson Jerseys
Demarcus Ware Jerseys
Jason Witten Jerseys
Terrell Owens Jerseys
Felix Jones Jerseys
Marion Barber Navy Jerseys
Marion Barber Jerseys
Emmitt Smith Jerseys
Miles Austin Jerseys
Roger Staubach Jerseys
Troy Aikman Jerseys
Tony Romo Jerseys
Eddie Royal Jerseys
Brandon Marshall Jerseys
Aaron Rodgers Jerseys
A.J. Hawk Jerseys
Donald Driver Jerseys
Greg Jennings Jerseys
Peyton Manning Jerseys
Dallas Clark Jerseys
Robert Mathis Jerseys
Marvin Harrison Jerseys
Drew Brees Jerseys
Marques Colston Jerseys
Pierre Thomas Jerseys
Reggie Bush Jerseys
Jeremy Shockey Jerseys
Tarvaris Jackson Jerseys
Adrian Peterson Jerseys
Jared Allen Jerseys
Mark Sanchez Jerseys
Thomas Jones Jerseys
Leon Washington Jerseys
Brett Favre Jerseys
buynflshop on Thursday, July 29, 2010Top questions and answers about Best-lv bags. Find 70 questions and answers about Best-Louis-Vuitton-Replica at Ask.com Read more.
Louis Vuitton Wallets Louis Vuitton online shop, cheap & discount lv at bestlouisvuitton.com.
http://www.sale4louisvuitton.com/ supplies the best replica Louis Vuitton handbag. ... Friend link : replica watches
replica handbags Louis Vuitton Handbags replica bags Hermes
The current system of factory Louis Vuitton Speedy Bag is destroying our environment, and in many ways our
communities.
louis vuitton on Thursday, July 29, 2010Pool Temperature Madera Jobs Madera Pest Control Madera Dentist Merced Dentist Visalia Dentist Modesto Dentist Fresno Limousine Fresno Granite briefcases leather leather briefcases prospect solution | prospect solutions | prospectsolution | prospectsolutions | prospectsolution.com prospect solution | prospect solutions | prospectsolution | prospectsolutions | prospectsolution.com prospect solution | prospect solutions | prospectsolution | prospectsolutions | prospectsolution.com
carmi on Friday, July 30, 2010essay essay writing essay writing service essay writing service uk
jane on Friday, July 30, 2010Go and catch your louis vuitton handbags from here, we will do our best to serve for you; If you're looking for Air Jordan shoes, you may have realized it is a difficult task to find them. We strive to provide you with information on online shoe stores that carry authentic Nike Air jordan shoes; nike shoes unlike a lot of regular running shoes, its flexibility provides a world of comfort on the run or while walking around, buying it from our mall and you will benefit a lot; When it comes to retro, cool designs Adidas does a great job with every sneaker release. At Sole Heaven, we have a really impressive arsenal of adidas shoes to do just the job; It is time for the Gucci fans to make some changes, please treat yourself with a different classic gucci handbags here, that will be a great surprise; Where can you find ugg boots for sale? Learn how smart buyers look for uggs for sale. Find the best online offers for directions.
nike shoes on Friday, July 30, 2010