// File: /workspace/github_cpp_makefile_star2_O2/rpavlik[P]edid-decode/parse-cta-block.cpp
// Function: edid_state::cta_hdmi_block(unsigned char const*, unsigned int)
void edid_state::cta_hdmi_block(const unsigned char *x, unsigned length)
{
	unsigned len_vic, len_3d;

	if (length < 4) {
		fail("Empty Data Block with length %u.\n", length);
		return;
	}
	printf("    Source physical address: %x.%x.%x.%x\n", x[3] >> 4, x[3] & 0x0f,
	       x[4] >> 4, x[4] & 0x0f);

	if (length < 6)
		return;

	if (x[5] & 0x80)
		printf("    Supports_AI\n");
	if (x[5] & 0x40)
		printf("    DC_48bit\n");
	if (x[5] & 0x20)
		printf("    DC_36bit\n");
	if (x[5] & 0x10)
		printf("    DC_30bit\n");
	if (x[5] & 0x08)
		printf("    DC_Y444\n");
	/* two reserved bits */
	if (x[5] & 0x01)
		printf("    DVI_Dual\n");

	if (length < 7)
		return;

	printf("    Maximum TMDS clock: %u MHz\n", x[6] * 5);
	if (x[6] * 5 > 340)
		fail("HDMI VSDB Max TMDS rate is > 340.\n");

	if (length < 8)
		return;

	if (x[7] & 0x0f) {
		printf("    Supported Content Types:\n");
		if (x[7] & 0x01)
			printf("      Graphics\n");
		if (x[7] & 0x02)
			printf("      Photo\n");
		if (x[7] & 0x04)
			printf("      Cinema\n");
		if (x[7] & 0x08)
			printf("      Game\n");
	}

	unsigned b = 8;
	if (x[7] & 0x80) {
		hdmi_latency(x[b], x[b + 1], false);

		if (x[7] & 0x40) {
			if (x[b] == x[b + 2] &&
			    x[b + 1] == x[b + 3])
				warn("Progressive and Interlaced latency values are identical, no need for both.\n");
			b += 2;
			hdmi_latency(x[b], x[b + 1], true);
		}
		b += 2;
	}

	if (!(x[7] & 0x20))
		return;

	bool mask = false;
	bool formats = false;

	printf("    Extended HDMI video details:\n");
	if (x[b] & 0x80)
		printf("      3D present\n");
	if ((x[b] & 0x60) == 0x20) {
		printf("      All advertised VICs are 3D-capable\n");
		formats = true;
	}
	if ((x[b] & 0x60) == 0x40) {
		printf("      3D-capable-VIC mask present\n");
		formats = true;
		mask = true;
	}
	switch (x[b] & 0x18) {
	case 0x00: break;
	case 0x08:
		   printf("      Base EDID image size is aspect ratio\n");
		   break;
	case 0x10:
		   printf("      Base EDID image size is in units of 1 cm\n");
		   break;
	case 0x18:
		   printf("      Base EDID image size is in units of 5 cm\n");
		   base.max_display_width_mm *= 5;
		   base.max_display_height_mm *= 5;
		   printf("        Recalculated image size: %u cm x %u cm\n",
			  base.max_display_width_mm / 10, base.max_display_height_mm / 10);
		   break;
	}
	b++;
	len_vic = (x[b] & 0xe0) >> 5;
	len_3d = (x[b] & 0x1f) >> 0;
	b++;

	if (len_vic) {
		unsigned i;

		printf("      HDMI VICs:\n");
		for (i = 0; i < len_vic; i++) {
			unsigned char vic = x[b + i];
			const struct timings *t;

			if (vic && vic <= ARRAY_SIZE(edid_hdmi_mode_map)) {
				std::string suffix = "HDMI VIC " + std::to_string(vic);
				cta.supported_hdmi_vic_codes |= 1 << (vic - 1);
				t = find_vic_id(edid_hdmi_mode_map[vic - 1]);
				print_timings("        ", t, suffix.c_str());
			} else {
				printf("         Unknown (HDMI VIC %u)\n", vic);
				fail("Unknown HDMI VIC %u.\n", vic);
			}
		}

		b += len_vic;
	}

	if (!len_3d)
		return;

	if (formats) {
		/* 3D_Structure_ALL_15..8 */
		if (x[b] & 0x80)
			printf("      3D: Side-by-side (half, quincunx)\n");
		if (x[b] & 0x01)
			printf("      3D: Side-by-side (half, horizontal)\n");
		/* 3D_Structure_ALL_7..0 */
		b++;
		if (x[b] & 0x40)
			printf("      3D: Top-and-bottom\n");
		if (x[b] & 0x20)
			printf("      3D: L + depth + gfx + gfx-depth\n");
		if (x[b] & 0x10)
			printf("      3D: L + depth\n");
		if (x[b] & 0x08)
			printf("      3D: Side-by-side (full)\n");
		if (x[b] & 0x04)
			printf("      3D: Line-alternative\n");
		if (x[b] & 0x02)
			printf("      3D: Field-alternative\n");
		if (x[b] & 0x01)
			printf("      3D: Frame-packing\n");
		b++;
		len_3d -= 2;
	}

	if (mask) {
		int max_idx = -1;
		unsigned i;

		printf("      3D VIC indices that support these capabilities:\n");
		/* worst bit ordering ever */
		for (i = 0; i < 8; i++)
			if (x[b + 1] & (1 << i)) {
				print_vic_index("        ", i, "");
				max_idx = i;
			}
		for (i = 0; i < 8; i++)
			if (x[b] & (1 << i)) {
				print_vic_index("        ", i + 8, "");
				max_idx = i + 8;
			}
		b += 2;
		len_3d -= 2;
		if (max_idx >= (int)cta.preparsed_svds[0].size())
			fail("HDMI 3D VIC indices max index %d > %u (#SVDs).\n",
			     max_idx + 1, cta.preparsed_svds[0].size());
	}

	/*
	 * list of nibbles:
	 * 2D_VIC_Order_X
	 * 3D_Structure_X
	 * (optionally: 3D_Detail_X and reserved)
	 */
	if (!len_3d)
		return;

	unsigned end = b + len_3d;
	int max_idx = -1;

	printf("      3D VIC indices with specific capabilities:\n");
	while (b < end) {
		unsigned char idx = x[b] >> 4;
		std::string s;

		if (idx > max_idx)
			max_idx = idx;
		switch (x[b] & 0x0f) {
		case 0: s = "frame packing"; break;
		case 1: s = "field alternative"; break;
		case 2: s = "line alternative"; break;
		case 3: s = "side-by-side (full)"; break;
		case 4: s = "L + depth"; break;
		case 5: s = "L + depth + gfx + gfx-depth"; break;
		case 6: s = "top-and-bottom"; break;
		case 8:
			s = "side-by-side";
			switch (x[b + 1] >> 4) {
			case 0x00: s += ", any subsampling"; break;
			case 0x01: s += ", horizontal"; break;
			case 0x02: case 0x03: case 0x04: case 0x05:
				   s += ", not in use";
				   fail("not-in-use 3D_Detail_X value 0x%02x.\n",
					x[b + 1] >> 4);
				   break;
			case 0x06: s += ", all quincunx combinations"; break;
			case 0x07: s += ", quincunx odd/left, odd/right"; break;
			case 0x08: s += ", quincunx odd/left, even/right"; break;
			case 0x09: s += ", quincunx even/left, odd/right"; break;
			case 0x0a: s += ", quincunx even/left, even/right"; break;
			default:
				   s += ", reserved";
				   fail("reserved 3D_Detail_X value 0x%02x.\n",
					x[b + 1] >> 4);
				   break;
			}
			break;
		default:
			s = "unknown (";
			s += utohex(x[b] & 0x0f) + ")";
			fail("Unknown 3D_Structure_X value 0x%02x.\n", x[b] & 0x0f);
			break;
		}
		print_vic_index("        ", idx, s.c_str());
		if ((x[b] & 0x0f) >= 8)
			b++;
		b++;
	}
	if (max_idx >= (int)cta.preparsed_svds[0].size())
		fail("HDMI 2D VIC indices max index %d > %u (#SVDs).\n",
		     max_idx + 1, cta.preparsed_svds[0].size());
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x88, %rsp
movl %edx, %ebp
cmpl $0x3, %edx
ja 0xcec7
leaq 0x172a4(%rip), %rsi     # 0x2414f
xorl %edi, %edi
movl %ebp, %edx
xorl %eax, %eax
addq $0x88, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x362c
movq %rsi, %r14
movq %rdi, %r12
movzbl 0x3(%rsi), %edx
movl %edx, %esi
shrl $0x4, %esi
andl $0xf, %edx
movzbl 0x4(%r14), %r8d
movl %r8d, %ecx
shrl $0x4, %ecx
andl $0xf, %r8d
leaq 0x17410(%rip), %rdi     # 0x242ff
xorl %eax, %eax
callq 0x3030
cmpl $0x6, %ebp
jb 0xd6d1
movb 0x5(%r14), %al
testb %al, %al
jns 0xcf17
leaq 0x1a6be(%rip), %rdi     # 0x275cc
callq 0x33b0
movb 0x5(%r14), %al
testb $0x40, %al
je 0xcf2b
leaq 0x1a6ba(%rip), %rdi     # 0x275dc
callq 0x33b0
movb 0x5(%r14), %al
testb $0x20, %al
je 0xcf3f
leaq 0x1a6b3(%rip), %rdi     # 0x275e9
callq 0x33b0
movb 0x5(%r14), %al
testb $0x10, %al
je 0xcf53
leaq 0x1a6ac(%rip), %rdi     # 0x275f6
callq 0x33b0
movb 0x5(%r14), %al
testb $0x8, %al
je 0xcf67
leaq 0x1a6a5(%rip), %rdi     # 0x27603
callq 0x33b0
movb 0x5(%r14), %al
testb $0x1, %al
je 0xcf77
leaq 0x1a69d(%rip), %rdi     # 0x2760f
callq 0x33b0
cmpl $0x6, %ebp
je 0xd6d1
movzbl 0x6(%r14), %eax
leal (%rax,%rax,4), %esi
leaq 0x1739a(%rip), %rdi     # 0x24329
xorl %eax, %eax
callq 0x3030
cmpb $0x45, 0x6(%r14)
jb 0xcfad
leaq 0x173a5(%rip), %rsi     # 0x24349
xorl %edi, %edi
xorl %eax, %eax
callq 0x362c
cmpl $0x8, %ebp
jb 0xd6d1
movb 0x7(%r14), %al
testb $0xf, %al
je 0xd01e
leaq 0x1a657(%rip), %rdi     # 0x2761c
callq 0x33b0
movb 0x7(%r14), %al
testb $0x1, %al
je 0xcfe2
leaq 0x1a660(%rip), %rdi     # 0x27639
callq 0x33b0
movb 0x7(%r14), %al
testb $0x2, %al
je 0xcff6
leaq 0x1a65b(%rip), %rdi     # 0x27648
callq 0x33b0
movb 0x7(%r14), %al
testb $0x4, %al
je 0xd00a
leaq 0x1a653(%rip), %rdi     # 0x27654
callq 0x33b0
movb 0x7(%r14), %al
testb $0x8, %al
je 0xd01e
leaq 0x1a64c(%rip), %rdi     # 0x27661
callq 0x33b0
movb 0x7(%r14), %al
testb %al, %al
js 0xd026
pushq $0x8
jmp 0xd086
movzbl 0x8(%r14), %esi
movzbl 0x9(%r14), %edx
xorl %ecx, %ecx
callq 0xcc9e
movb 0x7(%r14), %al
testb $0x40, %al
jne 0xd043
pushq $0xa
jmp 0xd086
movb 0x8(%r14), %cl
movb 0xa(%r14), %al
cmpb %al, %cl
jne 0xd070
movb 0x9(%r14), %dl
movl %ecx, %eax
cmpb 0xb(%r14), %dl
jne 0xd070
leaq 0x1730a(%rip), %rsi     # 0x2436c
pushq $0x1
popq %rdi
xorl %eax, %eax
callq 0x362c
movb 0xa(%r14), %al
movzbl 0xb(%r14), %edx
movzbl %al, %esi
pushq $0x1
popq %rcx
callq 0xcc9e
movb 0x7(%r14), %al
pushq $0xc
popq %rbx
testb $0x20, %al
je 0xd6d1
leaq 0x1a5d6(%rip), %rdi     # 0x2766c
callq 0x33b0
movl %ebx, %eax
movq %rax, %rbx
movb (%r14,%rax), %al
testb %al, %al
jns 0xd0b8
leaq 0x1a5de(%rip), %rdi     # 0x2768d
callq 0x33b0
movb (%r14,%rbx), %al
movl %eax, %ecx
andb $0x60, %cl
cmpb $0x20, %cl
sete %bpl
jne 0xd0d6
leaq 0x1a5d1(%rip), %rdi     # 0x2769e
callq 0x33b0
movb (%r14,%rbx), %al
movl %eax, %ecx
andb $0x60, %cl
movb %cl, 0xb(%rsp)
cmpb $0x40, %cl
jne 0xd0f7
leaq 0x1a5dc(%rip), %rdi     # 0x276c7
callq 0x33b0
movb (%r14,%rbx), %al
movb $0x1, %bpl
movb %bpl, 0xa(%rsp)
shrb $0x3, %al
andb $0x3, %al
movzbl %al, %eax
leaq 0x13725(%rip), %rcx     # 0x20830
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0x1a5fd(%rip), %rdi     # 0x27718
jmp 0xd124
leaq 0x1a5c5(%rip), %rdi     # 0x276e9
callq 0x33b0
jmp 0xd178
leaq 0x1a611(%rip), %rdi     # 0x27743
callq 0x33b0
imull $0x5, 0x174(%r12), %eax
movl %eax, 0x174(%r12)
imull $0x5, 0x178(%r12), %ecx
movl %ecx, 0x178(%r12)
pushq $0xa
popq %rdi
xorl %edx, %edx
divl %edi
movl %eax, %esi
movl %ecx, %eax
xorl %edx, %edx
divl %edi
leaq 0x17249(%rip), %rdi     # 0x243b8
movl %eax, %edx
xorl %eax, %eax
callq 0x3030
movq %rbx, %rax
movzbl 0x1(%r14,%rbx), %r13d
addq $0x2, %rax
cmpb $0x20, %r13b
jb 0xd2a7
movq %r12, 0x38(%rsp)
movl %r13d, 0xc(%rsp)
movq %r14, %r15
movl %r13d, %r14d
shrl $0x5, %r14d
leaq 0x1a5c8(%rip), %rdi     # 0x27772
movq %rax, %r12
callq 0x33b0
movq %r12, 0x10(%rsp)
movq %r15, 0x40(%rsp)
addq %r15, %r12
leaq 0x48(%rsp), %r15
xorl %r13d, %r13d
cmpq %r13, %r14
je 0xd290
movzbl (%r12,%r13), %ebp
leal -0x1(%rbp), %eax
cmpb $0x3, %al
ja 0xd266
movq %r15, %rdi
movl %ebp, %esi
callq 0x11ea0
leaq 0x18(%rsp), %rdi
leaq 0x171f2(%rip), %rsi     # 0x243e8
movq %r15, %rdx
callq 0xbafb
movq %r15, %rbx
movq %r15, %rdi
callq 0x3130
decl %ebp
pushq $0x1
popq %rax
movl %ebp, %ecx
shll %cl, %eax
movq 0x38(%rsp), %r15
orl %eax, 0x2d8(%r15)
leaq 0x16d6b(%rip), %rax     # 0x23f90
movzbl (%rbp,%rax), %edi
callq 0xbf2b
movq 0x18(%rsp), %rcx
movl $0x1, (%rsp)
movq %r15, %rdi
leaq 0x1224e(%rip), %rsi     # 0x1f493
movq %rax, %rdx
leaq 0xda3a(%rip), %r8       # 0x1ac89
xorl %r9d, %r9d
callq 0x3af0
leaq 0x18(%rsp), %rdi
callq 0x3130
movq %rbx, %r15
jmp 0xd288
leaq 0x17185(%rip), %rdi     # 0x243f2
movl %ebp, %esi
xorl %eax, %eax
callq 0x3030
xorl %edi, %edi
leaq 0x17193(%rip), %rsi     # 0x24412
movl %ebp, %edx
xorl %eax, %eax
callq 0x362c
incq %r13
jmp 0xd1c7
addl 0x10(%rsp), %r14d
movl %r14d, %eax
movq 0x38(%rsp), %r12
movl 0xc(%rsp), %r13d
movq 0x40(%rsp), %r14
andl $0x1f, %r13d
je 0xd6d1
cmpb $0x0, 0xa(%rsp)
je 0xd387
movq %rax, %rbx
movl %eax, %r15d
movb (%r14,%r15), %al
testb %al, %al
jns 0xd2da
leaq 0x1a4b2(%rip), %rdi     # 0x27783
callq 0x33b0
movb (%r14,%r15), %al
testb $0x1, %al
je 0xd2ea
leaq 0x1a4c6(%rip), %rdi     # 0x277ab
callq 0x33b0
movb 0x1(%r14,%r15), %al
testb $0x40, %al
je 0xd304
leaq 0x1a4db(%rip), %rdi     # 0x277d5
callq 0x33b0
movb 0x1(%r14,%r15), %al
testb $0x20, %al
je 0xd319
leaq 0x1a4df(%rip), %rdi     # 0x277ee
callq 0x33b0
movb 0x1(%r14,%r15), %al
testb $0x10, %al
je 0xd32e
leaq 0x1a4f0(%rip), %rdi     # 0x27814
callq 0x33b0
movb 0x1(%r14,%r15), %al
testb $0x8, %al
je 0xd343
leaq 0x1a4ef(%rip), %rdi     # 0x27828
callq 0x33b0
movb 0x1(%r14,%r15), %al
testb $0x4, %al
je 0xd358
leaq 0x1a4f8(%rip), %rdi     # 0x27846
callq 0x33b0
movb 0x1(%r14,%r15), %al
testb $0x2, %al
je 0xd36d
leaq 0x1a4fe(%rip), %rdi     # 0x27861
callq 0x33b0
movb 0x1(%r14,%r15), %al
testb $0x1, %al
je 0xd37d
leaq 0x1a505(%rip), %rdi     # 0x2787d
callq 0x33b0
movq %rbx, %rax
addl $0x2, %eax
addl $-0x2, %r13d
cmpb $0x40, 0xb(%rsp)
jne 0xd46b
movl %r13d, 0xc(%rsp)
leaq 0x1a4f7(%rip), %rdi     # 0x27895
movq %rax, %rbx
callq 0x33b0
movq %rbx, 0x10(%rsp)
movl %ebx, %ebx
xorl %r15d, %r15d
pushq $-0x1
popq %rbp
leaq 0xd8cf(%rip), %r13      # 0x1ac89
cmpl $0x8, %r15d
je 0xd3ec
movzbl 0x1(%r14,%rbx), %eax
btl %r15d, %eax
jae 0xd3e7
movq %r12, %rdi
leaq 0x120bd(%rip), %rsi     # 0x1f493
movl %r15d, %edx
movq %r13, %rcx
xorl %r8d, %r8d
callq 0xc638
movl %r15d, %ebp
incl %r15d
jmp 0xd3ba
movq %r12, %r15
xorl %r12d, %r12d
leaq 0xd890(%rip), %r13      # 0x1ac89
cmpl $0x8, %r12d
je 0xd42b
movzbl (%r14,%rbx), %eax
btl %r12d, %eax
jae 0xd426
leal 0x8(%r12), %ebp
movq %r15, %rdi
leaq 0x1207a(%rip), %rsi     # 0x1f493
movl %ebp, %edx
movq %r13, %rcx
xorl %r8d, %r8d
callq 0xc638
incl %r12d
jmp 0xd3f9
movq 0x10(%rsp), %rax
addl $0x2, %eax
movl 0xc(%rsp), %r13d
addl $-0x2, %r13d
movq %r15, %r12
movq 0x8e8(%r15), %rcx
subq 0x8e0(%r15), %rcx
cmpl %ecx, %ebp
jl 0xd46b
incl %ebp
leaq 0x16fce(%rip), %rsi     # 0x24428
xorl %edi, %edi
movl %ebp, %edx
movq %rax, %rbx
xorl %eax, %eax
callq 0x362c
movq %rbx, %rax
testl %r13d, %r13d
je 0xd6d1
pushq $-0x1
popq %rbp
addl %eax, %r13d
leaq 0x1a44a(%rip), %rdi     # 0x278cb
movq %rax, %rbx
callq 0x33b0
movl %r13d, 0xc(%rsp)
cmpl %r13d, %ebx
jae 0xd6a9
movq %rbx, %rax
movq %rbx, 0x10(%rsp)
movl %eax, %r13d
movzbl (%r14,%r13), %eax
leaq 0x28(%rsp), %rcx
movq %rcx, 0x18(%rsp)
andq $0x0, 0x20(%rsp)
movl %eax, %r15d
shrl $0x4, %r15d
movb $0x0, 0x28(%rsp)
cmpl %r15d, %ebp
cmovlel %r15d, %ebp
andl $0xf, %eax
cmpl $0x8, %eax
ja 0xd4f5
leaq 0x13367(%rip), %rcx     # 0x20840
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
leaq 0x16f7f(%rip), %rsi     # 0x24466
jmpq *%rax
leaq 0x16f68(%rip), %rsi     # 0x24458
jmp 0xd5fb
leaq 0x18(%rsp), %rdi
leaq 0x170d5(%rip), %rsi     # 0x245d6
callq 0x3460
movzbl (%r14,%r13), %esi
andl $0xf, %esi
leaq 0x68(%rsp), %rbx
movq %rbx, %rdi
callq 0x4e28
leaq 0x48(%rsp), %rdi
movq %rbx, %rsi
leaq 0x19383(%rip), %rdx     # 0x268ad
callq 0x75a4
leaq 0x18(%rsp), %rdi
leaq 0x48(%rsp), %rbx
movq %rbx, %rsi
callq 0x3480
movq %rbx, %rdi
callq 0x3130
leaq 0x68(%rsp), %rdi
callq 0x3130
movb (%r14,%r13), %al
andb $0xf, %al
leaq 0x17080(%rip), %rsi     # 0x245e0
jmp 0xd5d4
leaq 0x1a28f(%rip), %rsi     # 0x277f8
jmp 0xd5fb
leaq 0x16f28(%rip), %rsi     # 0x2449d
jmp 0xd5fb
leaq 0x18(%rsp), %rdi
leaq 0x16f26(%rip), %rsi     # 0x244ac
callq 0x3460
movzbl 0x1(%r13,%r14), %eax
shrl $0x4, %eax
cmpl $0xa, %eax
ja 0xd684
leaq 0x132c0(%rip), %rcx     # 0x20864
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
leaq 0x16f07(%rip), %rsi     # 0x244b9
jmpq *%rax
leaq 0x18(%rsp), %rdi
leaq 0x16f18(%rip), %rsi     # 0x244d8
callq 0x3450
movb 0x1(%r14,%r13), %al
shrb $0x4, %al
leaq 0x16f11(%rip), %rsi     # 0x244e5
movzbl %al, %edx
xorl %edi, %edi
xorl %eax, %eax
callq 0x362c
jmp 0xd605
leaq 0x16e8f(%rip), %rsi     # 0x24478
jmp 0xd5fb
leaq 0x16e97(%rip), %rsi     # 0x24489
jmp 0xd5fb
leaq 0x1a223(%rip), %rsi     # 0x2781e
leaq 0x18(%rsp), %rdi
callq 0x3460
movq 0x18(%rsp), %rcx
movq %r12, %rdi
leaq 0x11e7f(%rip), %rsi     # 0x1f493
movl %r15d, %edx
xorl %r8d, %r8d
callq 0xc638
movzbl (%r14,%r13), %eax
btl $0x3, %eax
movq 0x10(%rsp), %rbx
adcl $0x1, %ebx
leaq 0x18(%rsp), %rdi
callq 0x3130
movl 0xc(%rsp), %r13d
jmp 0xd48e
leaq 0x16f1b(%rip), %rsi     # 0x24566
jmp 0xd678
leaq 0x16ed3(%rip), %rsi     # 0x24527
jmp 0xd678
leaq 0x16e6e(%rip), %rsi     # 0x244cb
jmp 0xd678
leaq 0x16ea5(%rip), %rsi     # 0x2450b
jmp 0xd678
leaq 0x16f17(%rip), %rsi     # 0x24586
jmp 0xd678
leaq 0x16ece(%rip), %rsi     # 0x24546
leaq 0x18(%rsp), %rdi
callq 0x3450
jmp 0xd605
leaq 0x18(%rsp), %rdi
leaq 0x16f17(%rip), %rsi     # 0x245a7
callq 0x3450
movb 0x1(%r14,%r13), %al
shrb $0x4, %al
leaq 0x16f0e(%rip), %rsi     # 0x245b2
jmp 0xd5d4
movq 0x8e8(%r12), %rcx
subq 0x8e0(%r12), %rcx
cmpl %ecx, %ebp
jl 0xd6d1
incl %ebp
leaq 0x16f40(%rip), %rsi     # 0x24606
xorl %edi, %edi
movl %ebp, %edx
xorl %eax, %eax
callq 0x362c
addq $0x88, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0xd70f
movq %rax, %rbx
leaq 0x48(%rsp), %rdi
callq 0x3130
jmp 0xd6f7
movq %rax, %rbx
leaq 0x68(%rsp), %rdi
callq 0x3130
jmp 0xd712
movq %rax, %rbx
leaq 0x48(%rsp), %rdi
jmp 0xd717
jmp 0xd70f
movq %rax, %rbx
leaq 0x18(%rsp), %rdi
callq 0x3130
movq %rbx, %rdi
callq 0x3430