// File: /workspace/github_cpp_makefile_star2_O3/ShootMe[P]Klondike-Solver/Solitaire.cpp
// Function: Solitaire::GameDiagramPysol[abi:cxx11]()
string Solitaire::GameDiagramPysol() {
	stringstream ss;
	ss << "Foundations: H-" << RANKS[piles[FOUNDATION4H].Size()] << " C-" << RANKS[piles[FOUNDATION1C].Size()] << " D-" << RANKS[piles[FOUNDATION2D].Size()] << " S-" << RANKS[piles[FOUNDATION3S].Size()];
	ss << "\nTalon: ";

	Pile & waste = piles[WASTE];
	int size = waste.UpSize();
	for (int j = size - 1; j >= 0; j--) {
		Card c = waste.Up(j);
		char rank = RANKS[c.Rank];
		char suit = c.Suit != NONE ? SUITS[c.Suit] : 'X';
		ss << rank << suit << ' ';
	}
	ss << "==> ";

	Pile & stock = piles[STOCK];
	size = stock.UpSize();
	for (int j = size - 1; j >= 0; j--) {
		Card c = stock.Up(j);
		char rank = RANKS[c.Rank];
		char suit = c.Suit != NONE ? SUITS[c.Suit] : 'X';
		ss << rank << suit << ' ';
	}
	ss << "<==";

	for (int i = TABLEAU1; i <= TABLEAU7; i++) {
		ss << "\n:";
		Pile & p = piles[i];
		size = p.DownSize();
		for (int j = 0; j < size; j++) {
			Card c = p.Down(j);
			char rank = RANKS[c.Rank];
			char suit = c.Suit != NONE ? SUITS[c.Suit] : 'X';
			ss << " <" << rank << suit << ">";
		}
		size = p.UpSize();
		for (int j = 0; j < size; j++) {
			Card c = p.Up(j);
			char rank = RANKS[c.Rank];
			char suit = c.Suit != NONE ? SUITS[c.Suit] : 'X';
			ss << ' ' << rank << suit;
		}
	}

	return ss.str();
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x1a8, %rsp            # imm = 0x1A8
movq %rsi, %r12
movq %rdi, 0x10(%rsp)
leaq 0x20(%rsp), %rdi
callq 0x2130
leaq 0x30(%rsp), %rdi
leaq 0x250d(%rip), %rsi      # 0xa92e
movl $0xf, %edx
callq 0x2200
leaq 0x1610(%r12), %rdi
callq 0x3a66
cltq
leaq 0x243f(%rip), %rcx      # 0xa880
movb (%rax,%rcx), %al
leaq 0x7(%rsp), %rsi
movb %al, (%rsi)
movl $0x1, %edx
leaq 0x30(%rsp), %rdi
callq 0x2200
movq %rax, %rbx
leaq 0x24da(%rip), %rsi      # 0xa93e
movl $0x3, %edx
movq %rax, %rdi
callq 0x2200
leaq 0x128c(%r12), %rdi
callq 0x3a66
cltq
leaq 0x23f9(%rip), %rcx      # 0xa880
movb (%rax,%rcx), %al
leaq 0x7(%rsp), %rsi
movb %al, (%rsi)
movl $0x1, %edx
movq %rbx, %rdi
callq 0x2200
movq %rax, %rbx
leaq 0x249a(%rip), %rsi      # 0xa942
movl $0x3, %edx
movq %rax, %rdi
callq 0x2200
leaq 0x13b8(%r12), %rdi
callq 0x3a66
cltq
leaq 0x23b5(%rip), %rcx      # 0xa880
movb (%rax,%rcx), %al
leaq 0x7(%rsp), %rsi
movb %al, (%rsi)
movl $0x1, %edx
movq %rbx, %rdi
callq 0x2200
movq %rax, %rbx
leaq 0x245a(%rip), %rsi      # 0xa946
movl $0x3, %edx
movq %rax, %rdi
callq 0x2200
leaq 0x14e4(%r12), %rdi
callq 0x3a66
cltq
leaq 0x2371(%rip), %rcx      # 0xa880
movb (%rax,%rcx), %al
leaq 0x7(%rsp), %rsi
movb %al, (%rsi)
movl $0x1, %edx
movq %rbx, %rdi
callq 0x2200
leaq 0x241d(%rip), %rsi      # 0xa94a
movl $0x8, %edx
leaq 0x30(%rsp), %rdi
callq 0x2200
leaq 0x800(%r12), %rdi
movq %rdi, 0x18(%rsp)
callq 0x3a76
movl %eax, %ebx
testl %eax, %eax
jle 0x85df
incl %ebx
movl $0xff, %r13d
leaq 0x7(%rsp), %r15
leaq 0x2401(%rip), %rbp      # 0xa96d
leal -0x2(%rbx), %esi
movq 0x18(%rsp), %rdi
callq 0x3ab4
movq %rax, %rcx
andq %r13, %rcx
movb $0x58, %r14b
cmpq %r13, %rcx
je 0x858b
movb (%rcx,%rbp), %r14b
movzbl %ah, %eax
leaq 0x22eb(%rip), %rcx      # 0xa880
movb (%rax,%rcx), %al
movb %al, 0x7(%rsp)
movl $0x1, %edx
leaq 0x30(%rsp), %rdi
movq %r15, %rsi
callq 0x2200
movb %r14b, 0x7(%rsp)
movl $0x1, %edx
movq %rax, %rdi
movq %r15, %rsi
callq 0x2200
movb $0x20, 0x7(%rsp)
movl $0x1, %edx
movq %rax, %rdi
movq %r15, %rsi
callq 0x2200
decl %ebx
cmpl $0x1, %ebx
ja 0x856c
leaq 0x236d(%rip), %rsi      # 0xa953
movl $0x4, %edx
leaq 0x30(%rsp), %rdi
callq 0x2200
addq $0x1160, %r12           # imm = 0x1160
movq %r12, %rdi
callq 0x3a76
movl %eax, %ebx
testl %eax, %eax
jle 0x8693
incl %ebx
movl $0xff, %r13d
leaq 0x7(%rsp), %r15
leaq 0x234b(%rip), %rbp      # 0xa96d
leal -0x2(%rbx), %esi
movq %r12, %rdi
callq 0x3ab4
movq %rax, %rcx
andq %r13, %rcx
movb $0x58, %r14b
cmpq %r13, %rcx
je 0x863f
movb (%rcx,%rbp), %r14b
movzbl %ah, %eax
leaq 0x2237(%rip), %rcx      # 0xa880
movb (%rax,%rcx), %al
movb %al, 0x7(%rsp)
movl $0x1, %edx
leaq 0x30(%rsp), %rdi
movq %r15, %rsi
callq 0x2200
movb %r14b, 0x7(%rsp)
movl $0x1, %edx
movq %rax, %rdi
movq %r15, %rsi
callq 0x2200
movb $0x20, 0x7(%rsp)
movl $0x1, %edx
movq %rax, %rdi
movq %r15, %rsi
callq 0x2200
decl %ebx
cmpl $0x1, %ebx
ja 0x8622
leaq 0x22be(%rip), %rsi      # 0xa958
movl $0x3, %edx
leaq 0x30(%rsp), %rdi
callq 0x2200
movl $0x1, %eax
movq %rax, 0x8(%rsp)
leaq 0x7(%rsp), %rbp
movl $0x2, %edx
leaq 0x30(%rsp), %rdi
leaq 0x2293(%rip), %rsi      # 0xa95c
callq 0x2200
imulq $0x12c, 0x8(%rsp), %r12 # imm = 0x12C
addq 0x18(%rsp), %r12
movq %r12, %rdi
callq 0x3a6e
movl %eax, %r15d
testl %eax, %eax
jle 0x8789
xorl %r13d, %r13d
movq %r12, %rdi
movl %r13d, %esi
callq 0x3a9c
movq %rax, %rcx
movl $0xff, %edx
andq %rdx, %rcx
movb $0x58, %r14b
cmpq %rdx, %rcx
je 0x871b
leaq 0x2256(%rip), %rdx      # 0xa96d
movb (%rcx,%rdx), %r14b
movzbl %ah, %eax
leaq 0x215b(%rip), %rcx      # 0xa880
movb (%rax,%rcx), %bl
movl $0x2, %edx
leaq 0x30(%rsp), %rdi
leaq 0x2226(%rip), %rsi      # 0xa95f
callq 0x2200
movb %bl, 0x7(%rsp)
movl $0x1, %edx
leaq 0x30(%rsp), %rdi
movq %rbp, %rsi
callq 0x2200
movb %r14b, 0x7(%rsp)
movl $0x1, %edx
movq %rax, %rdi
movq %rbp, %rsi
callq 0x2200
movl $0x1, %edx
movq %rax, %rdi
leaq 0x21ea(%rip), %rsi      # 0xa962
callq 0x2200
incl %r13d
cmpl %r13d, %r15d
jne 0x86f2
movq %r12, %rdi
callq 0x3a76
movl %eax, %r15d
testl %eax, %eax
jle 0x881d
xorl %r13d, %r13d
movq %r12, %rdi
movl %r13d, %esi
callq 0x3ab4
movq %rax, %rcx
movl $0xff, %edx
andq %rdx, %rcx
movb $0x58, %r14b
cmpq %rdx, %rcx
je 0x87c8
leaq 0x21a9(%rip), %rdx      # 0xa96d
movb (%rcx,%rdx), %r14b
movzbl %ah, %eax
leaq 0x20ae(%rip), %rcx      # 0xa880
movb (%rax,%rcx), %bl
movb $0x20, 0x7(%rsp)
movl $0x1, %edx
leaq 0x30(%rsp), %rdi
movq %rbp, %rsi
callq 0x2200
movb %bl, 0x7(%rsp)
movl $0x1, %edx
movq %rax, %rdi
movq %rbp, %rsi
callq 0x2200
movb %r14b, 0x7(%rsp)
movl $0x1, %edx
movq %rax, %rdi
movq %rbp, %rsi
callq 0x2200
incl %r13d
cmpl %r13d, %r15d
jne 0x879f
movq 0x8(%rsp), %rax
incq %rax
movq %rax, 0x8(%rsp)
cmpq $0x8, %rax
jne 0x86b8
leaq 0x38(%rsp), %rsi
movq 0x10(%rsp), %rdi
callq 0x2280
movq 0x576e(%rip), %rsi      # 0xdfb8
leaq 0x20(%rsp), %rdi
callq 0x2150
leaq 0xa0(%rsp), %rdi
callq 0x20a0
movq 0x10(%rsp), %rax
addq $0x1a8, %rsp            # imm = 0x1A8
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x8890
jmp 0x8890
jmp 0x8890
jmp 0x8890
jmp 0x8890
jmp 0x8890
jmp 0x8890
jmp 0x8890
jmp 0x8890
jmp 0x8890
jmp 0x8890
jmp 0x8890
movq %rax, %rbx
movq 0x571e(%rip), %rsi      # 0xdfb8
leaq 0x20(%rsp), %rdi
callq 0x2150
leaq 0xa0(%rsp), %rdi
callq 0x20a0
movq %rbx, %rdi
callq 0x22e0