// File: /workspace/github_cpp_makefile_star2_O3/jeffchan[P]blockchain-parser/BlockChain.cpp
// Function: BitcoinTransactionFactory::reportCounts()
void reportCounts(void)
	{
		if ( mTransactionCount )
		{
			printf("%s transactions.\r\n", formatNumber(mTransactionCount) );
			printf("%s inputs.\r\n", formatNumber(mTotalInputCount) );
			printf("%s outputs.\r\n", formatNumber(mTotalOutputCount) );
			printf("%s addresses.\r\n", formatNumber(mAddresses.size()) );

			enum StatType
			{
				ST_ZERO,
				ST_DUST,
				ST_LESSONE,
				ST_LESSTEN,
				ST_LESS_HUNDRED,
				ST_LESS_THOUSAND,
				ST_LESS_TEN_THOUSAND,
				ST_LESS_HUNDRED_THOUSAND,
				ST_GREATER_HUNDRED_THOUSAND,
				ST_LAST
			};
			uint32_t counts[ST_LAST];
			uint64_t balances[ST_LAST];
			for (uint32_t i=0; i<ST_LAST; i++)
			{
				counts[i] = 0;
				balances[i] = 0;
			}

			for (uint32_t i=0; i<mAddresses.size(); i++)
			{
				BitcoinAddress *ba = mAddresses.getKey(i);
				uint64_t balance = ba->mTotalReceived-ba->mTotalSent;
				uint32_t btc = (uint32_t)(balance/ONE_BTC);
				if ( balance == 0 )
				{
					counts[ST_ZERO]++;
				}
				else if ( balance < ONE_MBTC )
				{
					counts[ST_DUST]++;
					balances[ST_DUST]+=balance;
				}
				else if ( balance < ONE_BTC )
				{
					counts[ST_LESSONE]++;
					balances[ST_LESSONE]+=balance;
				}
				else if ( btc < 10 )
				{
					counts[ST_LESSTEN]++;
					balances[ST_LESSTEN]+=btc;
				}
				else if ( btc < 100 )
				{
					counts[ST_LESS_HUNDRED]++;
					balances[ST_LESS_HUNDRED]+=btc;
				}
				else if ( btc < 1000 )
				{
					counts[ST_LESS_THOUSAND]++;
					balances[ST_LESS_THOUSAND]+=btc;
				}
				else if ( btc < 10000 )
				{
					counts[ST_LESS_TEN_THOUSAND]++;
					balances[ST_LESS_TEN_THOUSAND]+=btc;
				}
				else if ( btc < 100000 )
				{
					counts[ST_LESS_HUNDRED_THOUSAND]++;
					balances[ST_LESS_HUNDRED_THOUSAND]+=btc;
				}
				else
				{
					counts[ST_GREATER_HUNDRED_THOUSAND]++;
					balances[ST_GREATER_HUNDRED_THOUSAND]+=btc;
				}
			}
			printf("Found %s addresses which have ever been used.\r\n", formatNumber(mAddresses.size()) );

			printf("Found %s addresses with a zero balance.\r\n", formatNumber( counts[ST_ZERO]) );

			printf("Found %s 'dust' addresses (less than 1mbtc) with a total balance of %0.5f BTC\r\n", 
				formatNumber( counts[ST_DUST] ), 
				(float)balances[ST_DUST] / ONE_BTC );

			printf("Found %s addresses with a balance greater than 1mbtc but less than 1btc, total balance %0.5f\r\n",
				formatNumber(counts[ST_LESSONE]),
				(float)balances[ST_LESSONE]/ONE_BTC );

			printf("Found %s addresses with a balance greater than 1btc but less than 10btc, total btc: %s\r\n",
				formatNumber(counts[ST_LESSTEN]),
				formatNumber((uint32_t)balances[ST_LESSTEN]));

			printf("Found %s addresses with a balance greater than 10btc but less than 100btc, total: %s\r\n",
				formatNumber(counts[ST_LESS_HUNDRED]),
				formatNumber((uint32_t)balances[ST_LESS_HUNDRED]));

			printf("Found %s addresses with a balance greater than 100btc but less than 1,000btc, total: %s\r\n",
				formatNumber(counts[ST_LESS_THOUSAND]),
				formatNumber((uint32_t)balances[ST_LESS_THOUSAND]));

			printf("Found %s addresses with a balance greater than 1,000btc but less than 10,000btc, total: %s\r\n",
				formatNumber(counts[ST_LESS_TEN_THOUSAND]),
				formatNumber((uint32_t)balances[ST_LESS_TEN_THOUSAND]));

			printf("Found %s addresses with a balance greater than 10,000btc but less than 100,000btc, total: %s\r\n",
				formatNumber(counts[ST_LESS_HUNDRED_THOUSAND]),
				formatNumber((uint32_t)balances[ST_LESS_HUNDRED_THOUSAND]));

			printf("Found %s addresses with a balance greater than 100,000btc, total: %s\r\n",
				formatNumber(counts[ST_GREATER_HUNDRED_THOUSAND]),
				formatNumber((uint32_t)balances[ST_GREATER_HUNDRED_THOUSAND]));


		}
	}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x68, %rsp
movq %rdi, %rbx
movl 0x2000010(%rdi), %edi
testl %edi, %edi
je 0x10258
callq 0xb535
leaq 0x854c(%rip), %rdi      # 0x1856c
movq %rax, %rsi
xorl %eax, %eax
callq 0x2050
movl 0x2000014(%rbx), %edi
callq 0xb535
leaq 0x8c50(%rip), %rdi      # 0x18c8c
movq %rax, %rsi
xorl %eax, %eax
callq 0x2050
movl 0x2000018(%rbx), %edi
callq 0xb535
leaq 0x8c41(%rip), %rdi      # 0x18c99
movq %rax, %rsi
xorl %eax, %eax
callq 0x2050
movl 0x2000000(%rbx), %edi
callq 0xb535
leaq 0x8c33(%rip), %rdi      # 0x18ca7
movq %rax, %rsi
xorl %eax, %eax
callq 0x2050
movl 0x2000000(%rbx), %edi
testq %rdi, %rdi
je 0x10267
movq 0x2000008(%rbx), %rax
movq %rax, -0x78(%rbp)
movq %rdi, -0x88(%rbp)
movq %rdi, %rax
shlq $0x4, %rax
leaq (%rax,%rax,4), %rax
movq %rax, -0x70(%rbp)
xorl %r10d, %r10d
movq $0x0, -0x58(%rbp)
movl $0x0, -0x44(%rbp)
movq $0x0, -0x50(%rbp)
xorl %ebx, %ebx
xorl %edx, %edx
xorl %r14d, %r14d
xorl %r9d, %r9d
xorl %r11d, %r11d
xorl %esi, %esi
xorl %r12d, %r12d
xorl %edi, %edi
xorl %ecx, %ecx
xorl %eax, %eax
movl $0x0, -0x2c(%rbp)
xorl %r15d, %r15d
movl $0x0, -0x30(%rbp)
movl $0x0, -0x68(%rbp)
movq %r9, -0x40(%rbp)
movq %rdx, -0x38(%rbp)
movl %r14d, %r8d
movl %r11d, %r9d
movl %r12d, %r11d
movq %rdi, %r12
movl %ecx, %edi
movq %rax, %rcx
movq %r15, %r13
movq -0x78(%rbp), %rax
movq 0x28(%rax,%r10), %r14
movq 0x20(%rax,%r10), %r15
movq %r14, %rax
subq %r15, %rax
movabsq $-0x543388ee7b9e3103, %rdx # imm = 0xABCC77118461CEFD
mulq %rdx
subq %r15, %r14
jne 0x10145
incl -0x68(%rbp)
movq %r13, %r15
movq %rcx, %rax
jmp 0x1015b
cmpq $0x1869f, %r14          # imm = 0x1869F
movq %r13, %r15
movq %rcx, %rax
ja 0x10184
incl -0x44(%rbp)
addq %r14, -0x58(%rbp)
movl %edi, %ecx
movq %r12, %rdi
movl %r11d, %r12d
movl %r9d, %r11d
movq -0x40(%rbp), %r9
movl %r8d, %r14d
movq -0x38(%rbp), %rdx
addq $0x50, %r10
cmpq %r10, -0x70(%rbp)
jne 0x100f8
jmp 0x10232
cmpq $0x5f5e0ff, %r14        # imm = 0x5F5E0FF
movl %edi, %ecx
ja 0x10197
incl %ebx
addq %r14, -0x50(%rbp)
jmp 0x1015d
shrq $0x1a, %rdx
cmpl $0x9, %edx
movq %r12, %rdi
ja 0x101c2
movl %r8d, %r14d
incl %r14d
andl $0xf, %edx
movq -0x38(%rbp), %r8
addq %rdx, %r8
movq %r8, %rdx
movl %r11d, %r12d
movl %r9d, %r11d
movq -0x40(%rbp), %r9
jmp 0x10171
cmpl $0x63, %edx
movl %r11d, %r12d
movl %r8d, %r14d
ja 0x101df
movl %r9d, %r11d
incl %r11d
andl $0x7f, %edx
movq -0x40(%rbp), %r9
addq %rdx, %r9
jmp 0x1016d
cmpl $0x3e7, %edx            # imm = 0x3E7
movl %r9d, %r11d
ja 0x101f8
incl %r12d
andl $0x3ff, %edx            # imm = 0x3FF
addq %rdx, %rsi
jmp 0x10229
cmpl $0x270f, %edx           # imm = 0x270F
ja 0x1020d
incl %ecx
andl $0x3fff, %edx           # imm = 0x3FFF
addq %rdx, %rdi
jmp 0x10229
cmpl $0x1869f, %edx          # imm = 0x1869F
ja 0x10223
incl -0x2c(%rbp)
andl $0x1ffff, %edx          # imm = 0x1FFFF
addq %rdx, %rax
jmp 0x10229
incl -0x30(%rbp)
addq %rdx, %r15
movq -0x40(%rbp), %r9
jmp 0x1016d
movl %ebx, -0x7c(%rbp)
movq %rdx, %r10
movl %r14d, %ebx
movq %r9, %r8
movq -0x58(%rbp), %r9
movq %rax, %rdx
testq %r9, %r9
js 0x102d1
cvtsi2ss %r9, %xmm0
jmp 0x102e7
addq $0x68, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movl $0x0, -0x44(%rbp)
xorps %xmm0, %xmm0
movss %xmm0, -0x5c(%rbp)
xorl %r13d, %r13d
movl $0x0, -0x64(%rbp)
movl $0x0, -0x50(%rbp)
xorl %r12d, %r12d
movl $0x0, -0x78(%rbp)
movl $0x0, -0x2c(%rbp)
movl $0x0, -0x30(%rbp)
movss %xmm0, -0x60(%rbp)
xorl %r14d, %r14d
movq $0x0, -0x40(%rbp)
movq $0x0, -0x58(%rbp)
movq $0x0, -0x70(%rbp)
movq $0x0, -0x38(%rbp)
xorl %r15d, %r15d
xorl %ebx, %ebx
jmp 0x10352
movq %r9, %rax
shrq %rax
andl $0x1, %r9d
orq %rax, %r9
cvtsi2ss %r9, %xmm0
addss %xmm0, %xmm0
movl -0x30(%rbp), %r14d
movl -0x2c(%rbp), %r13d
movq -0x50(%rbp), %r9
testq %r9, %r9
js 0x102ff
cvtsi2ss %r9, %xmm1
jmp 0x10315
movq %r9, %rax
shrq %rax
andl $0x1, %r9d
orq %rax, %r9
cvtsi2ss %r9, %xmm1
addss %xmm1, %xmm1
movss %xmm1, -0x60(%rbp)
movl %r14d, -0x30(%rbp)
movl %r13d, -0x2c(%rbp)
movq %rdx, -0x38(%rbp)
movl %ecx, -0x78(%rbp)
movq %rdi, -0x70(%rbp)
movq %rsi, -0x58(%rbp)
movl %r11d, -0x50(%rbp)
movq %r8, -0x40(%rbp)
movl %ebx, -0x64(%rbp)
movq %r10, %r14
movl -0x7c(%rbp), %r13d
movq -0x88(%rbp), %rdi
movl -0x68(%rbp), %ebx
movss %xmm0, -0x5c(%rbp)
callq 0xb535
leaq 0x8959(%rip), %rdi      # 0x18cb7
movq %rax, %rsi
xorl %eax, %eax
callq 0x2050
movl %ebx, %edi
callq 0xb535
leaq 0x8971(%rip), %rdi      # 0x18ce7
movq %rax, %rsi
xorl %eax, %eax
callq 0x2050
movl -0x44(%rbp), %edi
callq 0xb535
movss -0x5c(%rbp), %xmm0
divss 0x737b(%rip), %xmm0     # 0x17710
cvtss2sd %xmm0, %xmm0
leaq 0x8971(%rip), %rdi      # 0x18d11
movq %rax, %rsi
movb $0x1, %al
callq 0x2050
movl %r13d, %edi
callq 0xb535
movss -0x60(%rbp), %xmm0
divss 0x7351(%rip), %xmm0     # 0x17710
cvtss2sd %xmm0, %xmm0
leaq 0x8997(%rip), %rdi      # 0x18d61
movq %rax, %rsi
movb $0x1, %al
callq 0x2050
movl -0x64(%rbp), %edi
callq 0xb535
movq %rax, %rbx
movl %r14d, %edi
callq 0xb535
leaq 0x89d2(%rip), %rdi      # 0x18dc0
movq %rbx, %rsi
movq %rax, %rdx
xorl %eax, %eax
callq 0x2050
movl -0x50(%rbp), %edi
callq 0xb535
movq %rax, %rbx
movq -0x40(%rbp), %rdi
callq 0xb535
leaq 0x8a03(%rip), %rdi      # 0x18e19
movq %rbx, %rsi
movq %rax, %rdx
xorl %eax, %eax
callq 0x2050
movl %r12d, %edi
callq 0xb535
movq %rax, %rbx
movq -0x58(%rbp), %rdi
callq 0xb535
leaq 0x8a32(%rip), %rdi      # 0x18e70
movq %rbx, %rsi
movq %rax, %rdx
xorl %eax, %eax
callq 0x2050
movl -0x78(%rbp), %edi
callq 0xb535
movq %rax, %rbx
movq -0x70(%rbp), %rdi
callq 0xb535
leaq 0x8a64(%rip), %rdi      # 0x18eca
movq %rbx, %rsi
movq %rax, %rdx
xorl %eax, %eax
callq 0x2050
movl -0x2c(%rbp), %edi
callq 0xb535
movq %rax, %rbx
movq -0x38(%rbp), %rdi
callq 0xb535
leaq 0x8a99(%rip), %rdi      # 0x18f27
movq %rbx, %rsi
movq %rax, %rdx
xorl %eax, %eax
callq 0x2050
movl -0x30(%rbp), %edi
callq 0xb535
movq %rax, %rbx
movl %r15d, %edi
callq 0xb535
leaq 0x8ad1(%rip), %rdi      # 0x18f86
movq %rbx, %rsi
movq %rax, %rdx
xorl %eax, %eax
addq $0x68, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2050