// File: /workspace/github_c_makefile_star2_O3/System-Glitch[P]ESGILinter-C/src/parsing_operations.c
// Function: parse_operation
type_t parse_operation(char *line, int line_index, scope_t *scope, messages_t *messages) {
	type_t type;
	type_t left_operand_type;
	type_t right_operand_type;
	type_t *ptr_type;
	scope_t *root_scope       = get_root_scope(scope);
	char *line_wo_comment     = str_remove_comments(line);
	arraylist_t *declarations = NULL;
	char *tmp_line            = NULL;
	char *left_operand        = NULL;
	char *right_operand       = NULL;
	const char *operator      = NULL;
	char *occurrence          = NULL;
	char *tmp                 = NULL;
	int   index_operator      =  0;
	int   left_operand_length = -1;
	int   right_operand_index = -1;
	int   length              = strlen(line_wo_comment);
	int   operator_length     = -1;
	int   rank                = -1;
	int   index_colon         =  0;
	char  has_colon           =  0;

	type.name = strduplicate("NULL");
	type.is_pointer = 0;
	type.is_literal = 0;


	tmp = remove_parenthesis(line_wo_comment, length);
	if(tmp != NULL) {
		free(line_wo_comment);
		line_wo_comment = tmp;
		length = strlen(line_wo_comment);
	}

	while((index_colon = strindexof(line_wo_comment + index_colon + 1, ':')) != -1) {
		if(!check_quotes(line_wo_comment, line_wo_comment + index_colon, length)) {
			has_colon = 1;
			break;
		}
	}

	if(has_colon) {
		//Maybe it's ternary condition
		type = parse_ternary_condition(line_wo_comment, length, line_index, scope, messages);
		if(strcmp(type.name, "NULL")) {
			free(line_wo_comment);
			return type;
		}
	} else if(starts_with_return(line_wo_comment, length)) {
		free(line_wo_comment);
		return type;
	}

	while((operator = known_operators[index_operator++]) != NULL) { //Find operator
		tmp_line = line_wo_comment;
		operator_length = strlen(operator);
		occurrence = strstr(line_wo_comment, operator);
		if(occurrence != NULL) {

			//Check if inside quotes
			while(check_quotes(line_wo_comment, occurrence, length) || check_parenthesis(line_wo_comment, occurrence, length)) {
				occurrence = strstr(occurrence + 1, operator);
				if(occurrence == NULL) break;
			}

			if(occurrence == NULL) continue;

			if(!strcmp(operator, "*") || !strcmp(operator, "&")) {

				//Check if not function declaration
				for(size_t i = 0 ; i < root_scope->functions->size ; i++) {
					if(((function_t*)arraylist_get(root_scope->functions, i))->line == line_index) {
						free(line_wo_comment);
						return type;
					}
				}

				while(is_operator_first(tmp_line, length, occurrence)) {
					tmp_line = occurrence + operator_length;
					occurrence = strstr(tmp_line, operator);
					if(occurrence == NULL)
						break;
				}
			} else if(is_operator_first(tmp_line, length, occurrence)) {
				free(line_wo_comment);
				return type;
			}

			if(occurrence == NULL) continue;

			//Split
			left_operand_length = occurrence - line_wo_comment;
			right_operand_index = left_operand_length + strlen(operator);
			left_operand        = strsubstr(line_wo_comment, 0, left_operand_length);
			right_operand       = strsubstr(line_wo_comment, right_operand_index, length - right_operand_index);

			//Check operator spacing
			if(messages->operator_spacing != NULL) {
				if((*(occurrence - 1) != ' ' || *(occurrence + operator_length) != ' ') && strcmp(right_operand, operator)) {
					arraylist_add(messages->operator_spacing, strduplicate((char*)operator));
				}
			}

			//If left operation is variable declaration
			declarations = get_variables_from_declaration(line_index, line);
			if(declarations != NULL && declarations->size > 0) {
				parse_declarations(declarations, scope, line_index, messages);

				free(type.name);
				type.name = strduplicate(((field_t*)arraylist_get(declarations, 0))->type.name);

				field_list_free(declarations);

				//Find var declaration in scope
				left_operand_type = find_variable_type_from_line(scope, line_index);

			} else {
				
				left_operand_type  = parse_operand(left_operand, line_index, scope, messages);
				right_operand_type = parse_operand(right_operand, line_index, scope, messages);

				if(strcmp(left_operand_type.name,"NULL") && strcmp(right_operand_type.name,"NULL")) {

					if(messages->wrong_assignment != NULL && is_assignation(operator) &&
						!type_equals(&left_operand_type, &right_operand_type)) {

						add_wrong_type_message(messages->wrong_assignment, &left_operand_type, &right_operand_type);
					}

					if(is_comparison(operator)) { //Type is int
						free(type.name);
						type.name = strduplicate("int");
						type.is_pointer = 0;
					} else if(right_operand_type.is_pointer || left_operand_type.is_pointer) {
						ptr_type = right_operand_type.is_pointer > left_operand_type.is_pointer ? &right_operand_type : &left_operand_type;
						free(type.name);
						type.name = strduplicate(ptr_type->name);
						type.is_pointer = ptr_type->is_pointer;
					} else {
						rank = get_highest_rank(right_operand_type.name, left_operand_type.name);
						if(rank != -1) {
							free(type.name);
							type.name = strduplicate((char*)type_rank[rank]);
							type.is_pointer = 0;
						}
					}
				}
				free(right_operand_type.name);
				free(left_operand_type.name);
			}

			//TODO detect forbidden operations (2 * &ptr , void + something, int - ptr)

			free(left_operand);
			free(right_operand);
			break;
		}
	}

	free(line_wo_comment);

	return type;	
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x88, %rsp
movq %rcx, 0x50(%rsp)
movl %esi, 0xc(%rsp)
movq %rdi, %r15
movq %rdx, 0x48(%rsp)
movq %rdx, %rdi
callq 0x69cf
movq %rax, 0x58(%rsp)
movq %r15, %rdi
callq 0x7c54
movq %rax, %rbx
movq %rax, %rdi
callq 0x20b0
movq %rax, %r13
leaq 0x77b4(%rip), %rdi      # 0xe8b0
callq 0x7dc1
movq %rax, %r12
movq %rbx, %rdi
movl %r13d, %esi
callq 0x843c
testq %rax, %rax
je 0x712d
movq %rax, %r14
movq %rbx, %rdi
callq 0x2030
movq %r14, %rdi
callq 0x20b0
movq %rax, %r13
movq %r14, %rbx
leaq 0x1(%rbx), %r14
xorl %ebp, %ebp
movq %rbx, 0x40(%rsp)
movslq %ebp, %rdi
addq %r14, %rdi
movl $0x3a, %esi
callq 0x7fba
cmpl $-0x1, %eax
je 0x71fa
movl %eax, %ebp
movslq %eax, %rsi
addq %rbx, %rsi
movq %rbx, %rdi
movl %r13d, %edx
callq 0x82dc
testb %al, %al
jne 0x7138
leaq 0x7741(%rip), %rdi      # 0xe8b0
callq 0x7dc1
movq %rax, %r12
movq %rbx, %rdi
movl $0x3f, %esi
callq 0x20c0
testq %rax, %rax
je 0x71cc
movq %rax, %r14
movq %rbx, %rdi
movq %r14, %rsi
movl %r13d, %edx
callq 0x82dc
testb %al, %al
jne 0x71b4
movq %rbx, %rdi
movq %r14, %rsi
movl %r13d, %edx
callq 0x832d
testb %al, %al
je 0x763d
incq %r14
movq %r14, %rdi
movl $0x3f, %esi
callq 0x20c0
movq %rax, %r14
testq %rax, %rax
jne 0x718c
xorl %r14d, %r14d
leaq 0x76da(%rip), %rsi      # 0xe8b0
movq %r12, %rdi
callq 0x2120
testl %eax, %eax
jne 0x79eb
movl %r14d, 0x18(%rsp)
movq %r15, 0x38(%rsp)
movq %r12, 0x10(%rsp)
movslq %r13d, %r15
jmp 0x7254
movq %r15, 0x38(%rsp)
movslq %r13d, %r15
xorl %ecx, %ecx
movq %rcx, %rbx
movq 0x40(%rsp), %rax
movsbl (%rax,%rcx), %edi
callq 0x7f3a
leaq 0x1(%rbx), %rcx
cmpq %r15, %rbx
jge 0x7222
testb %al, %al
jne 0x7204
movq 0x40(%rsp), %rbx
leaq (%rbx,%rcx), %rdi
decq %rdi
leaq 0x75c8(%rip), %rsi      # 0xe7fd
movl $0x6, %edx
callq 0x2070
testl %eax, %eax
je 0x756f
movq %r12, 0x10(%rsp)
movl $0x0, 0x18(%rsp)
leaq 0x767d(%rip), %r12      # 0xe8d8
movl $0x1, %eax
movq %rax, 0x20(%rsp)
movq %r12, %rdi
callq 0x20b0
movq %rax, 0x78(%rsp)
movq %rbx, %rdi
movq %r12, %rsi
callq 0x21c0
testq %rax, %rax
je 0x72bf
movq %rax, %rbp
movq %rbx, %rdi
movq %rbp, %rsi
movl %r13d, %edx
callq 0x82dc
testb %al, %al
jne 0x72a9
movq %rbx, %rdi
movq %rbp, %rsi
movl %r13d, %edx
callq 0x832d
testb %al, %al
je 0x72de
incq %rbp
movq %rbp, %rdi
movq %r12, %rsi
callq 0x21c0
movq %rax, %rbp
testq %rax, %rax
jne 0x7285
movq 0x20(%rsp), %rcx
leaq 0xb8b5(%rip), %rax      # 0x12b80
movq (%rax,%rcx,8), %r12
leaq 0x1(%rcx), %rax
cmpq $0x1e, %rcx
jne 0x7260
jmp 0x762e
movzbl (%r12), %eax
cmpl $0x26, %eax
je 0x72f1
cmpl $0x2a, %eax
jne 0x76b3
cmpb $0x0, 0x1(%r12)
jne 0x76b3
movq 0x58(%rsp), %rax
movq 0x10(%rax), %rdi
cmpq $0x0, 0x8(%rdi)
je 0x7337
xorl %r14d, %r14d
movq %r14, %rsi
callq 0x6d0c
movl 0xc(%rsp), %ecx
cmpl %ecx, 0x28(%rax)
je 0x76e8
incq %r14
movq 0x58(%rsp), %rax
movq 0x10(%rax), %rdi
cmpq 0x8(%rdi), %r14
jb 0x7310
movslq 0x78(%rsp), %rax
movq %rax, 0x70(%rsp)
movq %rbx, %r14
decq %r14
xorl %ebx, %ebx
movsbl 0x1(%r14), %edi
incq %r14
callq 0x7f3a
cmpq %r15, %rbx
jge 0x7362
incq %rbx
testb %al, %al
jne 0x7349
cmpq %rbp, %r14
jne 0x738c
movq %rbp, %r14
addq 0x70(%rsp), %r14
movq %r14, %rdi
movq %r12, %rsi
callq 0x21c0
movq %rax, %rbp
testq %rax, %rax
movq 0x40(%rsp), %rbx
jne 0x7344
jmp 0x72bf
movq 0x40(%rsp), %rbx
movl %ebp, %r14d
subl %ebx, %r14d
movq %r12, %rdi
callq 0x20b0
leal (%rax,%r14), %r15d
movq %rbx, %rdi
xorl %esi, %esi
movl %r14d, %edx
callq 0x7e1a
movq %rax, 0x20(%rsp)
subl %r15d, %r13d
movq %rbx, %rdi
movl %r15d, %esi
movl %r13d, %edx
callq 0x7e1a
movq %rax, 0x58(%rsp)
movq 0x50(%rsp), %r13
movq 0x38(%r13), %r14
testq %r14, %r14
je 0x740f
cmpb $0x20, -0x1(%rbp)
jne 0x73eb
movslq 0x78(%rsp), %rax
cmpb $0x20, (%rbp,%rax)
je 0x740f
movq 0x58(%rsp), %rdi
movq %r12, %rsi
callq 0x2120
testl %eax, %eax
je 0x740f
movq %r12, %rdi
callq 0x7dc1
movq %r14, %rdi
movq %rax, %rsi
callq 0x6c26
movl 0xc(%rsp), %edi
movq 0x38(%rsp), %rsi
callq 0x8934
testq %rax, %rax
je 0x757f
movq %rax, %r14
cmpq $0x0, 0x8(%rax)
je 0x757f
xorl %r15d, %r15d
movq 0x50(%rsp), %r12
movq %r14, %rdi
movq %r15, %rsi
callq 0x6d0c
movq 0x8(%rax), %rdi
testq %rdi, %rdi
je 0x74fa
movq %rax, %r13
movl 0xc(%rsp), %esi
movq 0x48(%rsp), %rdx
movq %r12, %rcx
callq 0x70b0
movq %rax, %rbp
movq %rax, 0x28(%rsp)
movq %rdx, 0x30(%rsp)
movq %rax, %rdi
leaq 0x7431(%rip), %rsi      # 0xe8b0
callq 0x2120
testl %eax, %eax
jne 0x74aa
movq 0x8(%r13), %rdi
movl 0xc(%rsp), %esi
movq 0x48(%rsp), %rdx
movq %r12, %rcx
callq 0xb780
movq %rax, %rbp
movq %rax, 0x28(%rsp)
movq %rdx, 0x30(%rsp)
cmpq $0x0, 0x20(%r12)
je 0x74f0
movq %rbp, %rdi
leaq 0x73f4(%rip), %rsi      # 0xe8b0
callq 0x2120
testl %eax, %eax
je 0x74f0
addq $0x10, %r13
movq %r13, %rdi
leaq 0x28(%rsp), %rsi
callq 0x686e
testb %al, %al
jne 0x74f0
movq 0x50(%rsp), %rax
movq 0x20(%rax), %rdi
movq %r13, %rsi
leaq 0x28(%rsp), %rdx
callq 0x7b2a
movq 0x28(%rsp), %rdi
callq 0x2030
incq %r15
cmpq 0x8(%r14), %r15
jb 0x743c
movq 0x10(%rsp), %rdi
callq 0x2030
movq %r14, %rdi
xorl %esi, %esi
callq 0x6d0c
movq 0x10(%rax), %rdi
callq 0x7dc1
movq %rax, %r12
movq %r14, %rdi
callq 0x6953
movq 0x48(%rsp), %rax
movq 0x18(%rax), %rdi
cmpq $0x0, 0x8(%rdi)
je 0x7565
xorl %r14d, %r14d
movq %r14, %rsi
callq 0x6d0c
movl 0xc(%rsp), %ecx
cmpl %ecx, 0x20(%rax)
je 0x7565
incq %r14
movq 0x48(%rsp), %rax
movq 0x18(%rax), %rdi
cmpq 0x8(%rdi), %r14
jb 0x7542
movl 0x18(%rsp), %r14d
jmp 0x79d7
movq %rbx, %rdi
callq 0x2030
xorl %r14d, %r14d
jmp 0x79f3
movq 0x20(%rsp), %rdi
movl 0xc(%rsp), %ebp
movl %ebp, %esi
movq 0x48(%rsp), %r14
movq %r14, %rdx
movq %r13, %rcx
callq 0x7ac3
movq %rax, %r15
movq %rax, 0x28(%rsp)
movq %rdx, 0x30(%rsp)
movq 0x58(%rsp), %rdi
movl %ebp, %esi
movq %r14, %rdx
movq %r13, %rcx
callq 0x7ac3
movq %rax, %r14
movq %rax, 0x60(%rsp)
movq %rdx, 0x68(%rsp)
leaq 0x72e3(%rip), %rsi      # 0xe8b0
movq %r15, %rdi
callq 0x2120
testl %eax, %eax
je 0x76a4
leaq 0x72cc(%rip), %rsi      # 0xe8b0
movq %r14, %rdi
callq 0x2120
testl %eax, %eax
je 0x76a4
cmpq $0x0, 0x20(%r13)
je 0x7725
leaq 0x72af(%rip), %rdi      # 0xe8b5
leaq 0xb70b(%rip), %r14      # 0x12d18
movq %r12, %rsi
callq 0x2120
testl %eax, %eax
je 0x76ff
movq (%r14), %rdi
addq $0x8, %r14
testq %rdi, %rdi
jne 0x760d
jmp 0x7725
movq 0x10(%rsp), %r12
movl 0x18(%rsp), %r14d
jmp 0x79eb
movq %r15, 0x38(%rsp)
movq %r14, %rdi
movl $0x3a, %esi
callq 0x20c0
testq %rax, %rax
je 0x7697
movq %rax, %r15
movq %rbx, %rdi
movq %r15, %rsi
movl %r13d, %edx
callq 0x82dc
testb %al, %al
jne 0x767f
movq %rbx, %rdi
movq %r15, %rsi
movl %r13d, %edx
callq 0x832d
testb %al, %al
je 0x77c1
incq %r15
movq %r15, %rdi
movl $0x3a, %esi
callq 0x20c0
movq %rax, %r15
testq %rax, %rax
jne 0x7657
xorl %r14d, %r14d
movq 0x38(%rsp), %r15
jmp 0x71cf
movq 0x10(%rsp), %r12
movl 0x18(%rsp), %r14d
jmp 0x79c3
xorl %ecx, %ecx
movq %rcx, %rbx
movq 0x40(%rsp), %rax
movsbl (%rax,%rcx), %edi
callq 0x7f3a
leaq 0x1(%rbx), %rcx
cmpq %r15, %rbx
jge 0x76d3
testb %al, %al
jne 0x76b5
movq 0x40(%rsp), %rbx
leaq (%rbx,%rcx), %rax
decq %rax
cmpq %rbp, %rax
jne 0x7391
movq %rbx, %rdi
callq 0x2030
movq 0x10(%rsp), %r12
movl 0x18(%rsp), %r14d
jmp 0x79f3
leaq 0x28(%rsp), %rdi
leaq 0x60(%rsp), %rsi
callq 0x686e
testb %al, %al
jne 0x7725
movq 0x20(%r13), %rdi
leaq 0x28(%rsp), %rsi
leaq 0x60(%rsp), %rdx
callq 0x7b2a
leaq 0x71ac(%rip), %rdi      # 0xe8d8
leaq 0xb655(%rip), %r14      # 0x12d88
movq %r12, %rsi
callq 0x2120
testl %eax, %eax
je 0x77a0
movq (%r14), %rdi
addq $0x8, %r14
testq %rdi, %rdi
jne 0x7733
movb 0x68(%rsp), %bl
movb 0x30(%rsp), %bpl
movl %ebx, %eax
orb %bpl, %al
movl 0x18(%rsp), %r14d
je 0x7982
movq 0x10(%rsp), %rdi
callq 0x2030
cmpb %bpl, %bl
leaq 0x60(%rsp), %rax
leaq 0x28(%rsp), %rcx
cmovgq %rax, %rcx
movq (%rcx), %rdi
leaq 0x68(%rsp), %rax
leaq 0x30(%rsp), %rbx
cmovgq %rax, %rbx
callq 0x7dc1
movq %rax, %r12
movb (%rbx), %r14b
jmp 0x79be
movq 0x10(%rsp), %rdi
callq 0x2030
leaq 0x7162(%rip), %rdi      # 0xe913
callq 0x7dc1
movq %rax, %r12
xorl %r14d, %r14d
jmp 0x79c3
movq %r12, 0x10(%rsp)
subl %ebx, %r14d
subl %ebx, %r15d
leal -0x1(%r14), %edx
movq %rbx, %rdi
xorl %esi, %esi
callq 0x7e1a
movq %rax, 0x70(%rsp)
leaq 0x70cf(%rip), %r12      # 0xe8b5
movl $0x1, %eax
movq %rax, 0x20(%rsp)
movq %rbx, %rdi
movq %r12, %rsi
callq 0x21c0
testq %rax, %rax
je 0x7847
movq %rax, %rbp
cmpb $0x3d, 0x1(%rax)
je 0x7847
movq %rbx, %rdi
movq %rbp, %rsi
movl %r13d, %edx
callq 0x82dc
testb %al, %al
jne 0x7831
movq %rbx, %rdi
movq %rbp, %rsi
movl %r13d, %edx
callq 0x832d
testb %al, %al
je 0x7a0c
incq %rbp
movq %rbp, %rdi
movq %r12, %rsi
callq 0x21c0
movq %rax, %rbp
testq %rax, %rax
jne 0x7809
movq 0x20(%rsp), %rcx
leaq 0xb4bd(%rip), %rax      # 0x12d10
movq (%rax,%rcx,8), %r12
leaq 0x1(%rcx), %rax
cmpq $0xc, %rcx
jne 0x77eb
leal 0x1(%r14), %esi
notl %r14d
addl %r15d, %r14d
movq %rbx, %rdi
movl %r14d, %edx
callq 0x7e1a
movq %rax, %r12
leal 0x1(%r15), %esi
notl %r15d
addl %r13d, %r15d
movq %rbx, %rdi
movl %r15d, %edx
callq 0x7e1a
movq %rax, %r14
movq %r12, 0x20(%rsp)
movq %r12, %rdi
movl 0xc(%rsp), %ebp
movl %ebp, %esi
movq 0x48(%rsp), %r12
movq %r12, %rdx
movq 0x50(%rsp), %r15
movq %r15, %rcx
callq 0x7ac3
movq %rax, 0x28(%rsp)
movq %rdx, 0x18(%rsp)
movq %rdx, 0x30(%rsp)
movq %r14, 0x78(%rsp)
movq %r14, %rdi
movq %rax, %r14
movl %ebp, %esi
movq %r12, %rdx
movq %r15, %rcx
callq 0x7ac3
movq %rax, %r12
movq %rdx, %r15
movq %rax, 0x60(%rsp)
movq %rdx, 0x68(%rsp)
leaq 0x6fbe(%rip), %rsi      # 0xe8b0
movq %r14, %rdi
callq 0x2120
testl %eax, %eax
je 0x7a23
leaq 0x6fa7(%rip), %rsi      # 0xe8b0
movq %r12, %rdi
callq 0x2120
testl %eax, %eax
je 0x7a23
movq 0x70(%rsp), %rdi
movl 0xc(%rsp), %esi
movq 0x48(%rsp), %rdx
movq 0x50(%rsp), %rcx
callq 0x7ac3
movq %rax, 0x80(%rsp)
movq %r12, %rdi
movq %r14, %rsi
callq 0x7ba9
cmpl $-0x1, %eax
je 0x7a32
movl %eax, %ebp
movq 0x10(%rsp), %rdi
callq 0x2030
movslq %ebp, %rax
leaq 0xb31d(%rip), %rcx      # 0x12c80
movq (%rcx,%rax,8), %rdi
callq 0x7dc1
movzbl %r15b, %ecx
movzbl 0x18(%rsp), %r14d
cmpb %r14b, %cl
cmovgl %ecx, %r14d
jmp 0x7a3a
movq 0x60(%rsp), %rdi
movq 0x28(%rsp), %rsi
callq 0x7ba9
cmpl $-0x1, %eax
movq 0x10(%rsp), %r12
je 0x79be
movl %eax, %ebp
movq %r12, %rdi
callq 0x2030
movslq %ebp, %rax
leaq 0xb2d1(%rip), %rcx      # 0x12c80
movq (%rcx,%rax,8), %rdi
callq 0x7dc1
movq %rax, %r12
xorl %r14d, %r14d
movq 0x40(%rsp), %rbx
movq 0x60(%rsp), %rdi
callq 0x2030
movq 0x28(%rsp), %rdi
callq 0x2030
movq 0x20(%rsp), %rdi
callq 0x2030
movq 0x58(%rsp), %rdi
callq 0x2030
movq %rbx, %rdi
callq 0x2030
movzbl %r14b, %edx
movq %r12, %rax
addq $0x88, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq 0x70(%rsp), %rdi
callq 0x2030
xorl %r14d, %r14d
movq 0x10(%rsp), %r12
jmp 0x769a
xorl %r14d, %r14d
movq 0x38(%rsp), %r15
movq 0x20(%rsp), %rbp
jmp 0x7a8b
xorl %r14d, %r14d
movq 0x10(%rsp), %rax
movq %rax, 0x10(%rsp)
leaq 0x28(%rsp), %rdi
leaq 0x60(%rsp), %rsi
callq 0x686e
testb %al, %al
movq 0x38(%rsp), %r15
movq 0x20(%rsp), %rbp
jne 0x7a79
movq 0x50(%rsp), %rax
movq 0x30(%rax), %rdi
testq %rdi, %rdi
je 0x7a79
leaq 0x28(%rsp), %rsi
leaq 0x60(%rsp), %rdx
callq 0x7b2a
movq 0x80(%rsp), %rdi
callq 0x2030
movq 0x60(%rsp), %r12
movq %r12, %rdi
callq 0x2030
movq 0x28(%rsp), %rdi
callq 0x2030
movq 0x70(%rsp), %rdi
callq 0x2030
movq %rbp, %rdi
callq 0x2030
movq 0x78(%rsp), %rdi
callq 0x2030
movq 0x10(%rsp), %r12
jmp 0x71cf