// File: /workspace/github_c_makefile_star2_O0/Ihsoh[P]ilang/compiler/preprocessor/line.c
// Function: expand_with_params_rstr
static void _expand_with_params_rstr(
	ResizableString *rstr,
	PPGeneratorContext *genctx,
	const char *src,
	int len,
	Map *params
) {
	assert(rstr);
	assert(genctx);
	assert(src);

	// 创建一个Lexer用于解析普通行。
	// 这些普通行内包含一些宏调用，需要把它们识别出来，并在后续将它们展开。
	LexerContext *ctx = lexer_new_context(
		genctx->psrctx->lexctx->file,
		src,
		len,
		_matchers
	);

	// 需要把PPGeneratorContext的实例传递给Lexer。
	//
	// 其中一个作用是被用于LEXER_MATCHER(func_macro_call)中，用于判断一个标识符
	// 是否已经被定义为函数宏。
	ctx->data = genctx;

	lexer_parse_first(ctx);

	LexerToken *token;
	while ((token = lexer_next_token(ctx)) != NULL) {
		switch (token->type) {
			case _TOKEN_SPACE:
			case _TOKEN_LITERAL_CHAR:
			case _TOKEN_LITERAL_STRING:
			case _TOKEN_PNCT:
			case _TOKEN_TEXT: {
				// 如果为以下的任意一项，将直接原样疏忽：
				//		1、空白
				//		2、字符常量
				//		3、字符串常量
				//		4、普通标点符号
				//		5、普通文本（非##、#、函数宏调用、标识符）
				rstr_append_with_raw(rstr, token->content, token->len);

				break;
			}
			case _TOKEN_PNCT_POUND: {
				// 
				ResizableString rstr_id;
				LexerToken *tk_id = lexer_next_token(ctx);
				if (tk_id == NULL
						|| tk_id->type != _TOKEN_IDENTIFIER) {
					_SYNERR_TOKEN(genctx, token, "expect identifier.");
				}
				rstr_init_with_raw(&rstr_id, tk_id->content, tk_id->len);

				rstr_append_with_char(rstr, '\"');

				if (params != NULL
						&& map_exists_key(params, &rstr_id)) {
					ResizableString *rstr_val = map_get(params, &rstr_id);
					rstr_append_with_rstr(rstr, rstr_val);
				} else {
					_expand_macro_rstr(rstr, genctx, tk_id->content, tk_id->len);
				}
				
				rstr_append_with_char(rstr, '\"');
				break;
			}
			case _TOKEN_IDENTIFIER: {
				ResizableString rstr_id;
				rstr_init_with_raw(&rstr_id, token->content, token->len);

				if (params != NULL
						&& map_exists_key(params, &rstr_id)) {
					ResizableString *rstr_val = map_get(params, &rstr_id);
					rstr_append_with_rstr(rstr, rstr_val);
				} else {
					_expand_macro_rstr(rstr, genctx, token->content, token->len);
				}

				rstr_free(&rstr_id);
				break;
			}
			case _TOKEN_FUNC_MACRO_CALL: {
				ResizableString rstr_id;
				rstr_init(&rstr_id);

				ResizableString rstr_param_values;
				rstr_init(&rstr_param_values);

				int idx = 0;
				for (; idx < token->len; idx++) {
					if (token->content[idx] != '(') {
						rstr_append_with_char(&rstr_id, token->content[idx]);
					} else {
						break;
					}
				}

				for (; idx < token->len; idx++) {
					rstr_append_with_char(&rstr_param_values, token->content[idx]);
				}
			
				PPGeneratorFuncMacro *macro = map_get(genctx->map_kv_with_params, &rstr_id);

				Map map_params;
				map_init(
					&map_params,
					map_rstr_comparer, map_rstr_comparer,
					(MapReleaser) rstr_delete, (MapReleaser) rstr_delete
				);

				LinkedList llst_param_values;
				llst_init(
					&llst_param_values, NULL, (LinkedListReleaser) rstr_delete
				);
				
				
				int params_idx = 1;	// 跳过'('。
				#define	_GET_PARAMS_CHAR(i)	((i) >= RSTR_LEN(&rstr_param_values) ? -1 : RSTR_CHAR(&rstr_param_values, i))

				int paren_left_count = 1;
				ResizableString *rstr_param = rstr_new();
				while (_GET_PARAMS_CHAR(params_idx) != -1) {
					if (_GET_PARAMS_CHAR(params_idx) == ',') {
						if (paren_left_count > 1) {
							rstr_append_with_char(rstr_param, _GET_PARAMS_CHAR(params_idx));
						} else if (paren_left_count == 1) {
							if (RSTR_LEN(rstr_param) == 0) {
								_SYNERR_TOKEN(genctx, token, "macro call parameter cannot be empty.");
							}
							llst_append(&llst_param_values, rstr_param);
							rstr_param = rstr_new();
						} else {
							assert(0);
							break;
						}
					} else if (_GET_PARAMS_CHAR(params_idx) == '(') {
						rstr_append_with_char(rstr_param, _GET_PARAMS_CHAR(params_idx));
						++paren_left_count;
					} else if (_GET_PARAMS_CHAR(params_idx) == ')') {
						if (paren_left_count > 1) {
							--paren_left_count;
							rstr_append_with_char(rstr_param, _GET_PARAMS_CHAR(params_idx));
						} else if (paren_left_count == 1) {
							if (RSTR_LEN(rstr_param) > 0) {
								llst_append(&llst_param_values, rstr_param);
								rstr_param = NULL;
							} else {
								if (LLST_LEN(&llst_param_values) != 0) {
									_SYNERR_TOKEN(genctx, token, "macro call parameter cannot be empty.");
								}
							}
							break;
						} else {
							assert(0);
							break;
						}
					} else {
						rstr_append_with_char(rstr_param, _GET_PARAMS_CHAR(params_idx));
					}

					++params_idx;
				}
				if (rstr_param != NULL) {
					rstr_delete(rstr_param);
					rstr_param = NULL;
				}

				#undef	_GET_PARAMS_CHAR


				if (macro->params.count != llst_param_values.count) {
					_SYNERR_TOKEN(genctx, token, "function macro parameter count not matched.");
				}

				LinkedListNode *node_param_name = macro->params.head;
				LinkedListNode *node_param_value = llst_param_values.head;
				while (node_param_name != NULL) {
					ResizableString *rstr_param_name = (ResizableString *) node_param_name->data;
					ResizableString *rstr_param_value = (ResizableString *) node_param_value->data;

					ResizableString *rstr_expanded_param_value = rstr_new();

					ResizableString rstr_tmp;
					rstr_init(&rstr_tmp);
					rstr_trim_ex(&rstr_tmp, rstr_param_value, RSTR_SPACE_CHAR_COMPARER);

					_expand_with_params_rstr(
						rstr_expanded_param_value,
						genctx,
						RSTR_CSTR(&rstr_tmp),
						RSTR_LEN(&rstr_tmp),
						params
					);

					rstr_free(&rstr_tmp);

					map_set(
						&map_params,
						rstr_param_name,
						rstr_expanded_param_value,
						true
					);

					node_param_name = node_param_name->next;
					node_param_value = node_param_value->next;
				}

				_expand_with_params_rstr(
					rstr, genctx, RSTR_CSTR(&(macro->body)), RSTR_LEN(&(macro->body)), &map_params
				);

				llst_free(&llst_param_values, true);
				
				map_free(&map_params, false, true);

				rstr_free(&rstr_id);

				rstr_free(&rstr_param_values);

				break;
			}
			default: {
				assert(0);
			}
		}
	}

	lexer_free_context(ctx);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x230, %rsp            # imm = 0x230
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movl %ecx, -0x1c(%rbp)
movq %r8, -0x28(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x41c37
jmp 0x41c56
leaq 0x5ee1(%rip), %rdi      # 0x47b1f
leaq 0xe0af(%rip), %rsi      # 0x4fcf4
movl $0x19d, %edx            # imm = 0x19D
leaq 0xe1a3(%rip), %rcx      # 0x4fdf4
callq 0xa0b0
cmpq $0x0, -0x10(%rbp)
je 0x41c5f
jmp 0x41c7e
leaq 0xcf5e(%rip), %rdi      # 0x4ebc4
leaq 0xe087(%rip), %rsi      # 0x4fcf4
movl $0x19e, %edx            # imm = 0x19E
leaq 0xe17b(%rip), %rcx      # 0x4fdf4
callq 0xa0b0
cmpq $0x0, -0x18(%rbp)
je 0x41c87
jmp 0x41ca6
leaq 0x632e(%rip), %rdi      # 0x47fbc
leaq 0xe05f(%rip), %rsi      # 0x4fcf4
movl $0x19f, %edx            # imm = 0x19F
leaq 0xe153(%rip), %rcx      # 0x4fdf4
callq 0xa0b0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rsi
movl -0x1c(%rbp), %edx
leaq 0x1d76f(%rip), %rcx     # 0x5f430
callq 0xb170
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x2080(%rax)
movq -0x30(%rbp), %rdi
callq 0xc260
movq -0x30(%rbp), %rdi
callq 0xb950
movq %rax, -0x38(%rbp)
cmpq $0x0, %rax
je 0x4284e
movq -0x38(%rbp), %rax
movl (%rax), %eax
movq %rax, -0x160(%rbp)
subq $0x22, %rax
ja 0x4282a
movq -0x160(%rbp), %rax
leaq 0xdf4a(%rip), %rcx      # 0x4fc68
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rdi
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rsi
movq -0x38(%rbp), %rax
movl 0x4(%rax), %edx
callq 0xffa0
jmp 0x42849
movq -0x30(%rbp), %rdi
callq 0xb950
movq %rax, -0x50(%rbp)
cmpq $0x0, -0x50(%rbp)
je 0x41d61
movq -0x50(%rbp), %rax
cmpl $0x20, (%rax)
je 0x41d80
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x50(%rax), %rax
movq -0x10(%rbp), %rcx
movq (%rcx), %rdi
movq -0x38(%rbp), %rsi
leaq 0xd697(%rip), %rdx      # 0x4f415
callq *%rax
movq -0x50(%rbp), %rax
movq 0x8(%rax), %rsi
movq -0x50(%rbp), %rax
movl 0x4(%rax), %edx
leaq -0x48(%rbp), %rdi
callq 0xfef0
movq -0x8(%rbp), %rdi
movl $0x22, %esi
callq 0xfeb0
cmpq $0x0, -0x28(%rbp)
je 0x41de0
movq -0x28(%rbp), %rdi
leaq -0x48(%rbp), %rsi
callq 0xd8f0
testb $0x1, %al
jne 0x41dc0
jmp 0x41de0
movq -0x28(%rbp), %rdi
leaq -0x48(%rbp), %rsi
callq 0xd750
movq %rax, -0x58(%rbp)
movq -0x8(%rbp), %rdi
movq -0x58(%rbp), %rsi
callq 0x10110
jmp 0x41dfc
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x50(%rbp), %rax
movq 0x8(%rax), %rdx
movq -0x50(%rbp), %rax
movl 0x4(%rax), %ecx
callq 0x41890
movq -0x8(%rbp), %rdi
movl $0x22, %esi
callq 0xfeb0
jmp 0x42849
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rsi
movq -0x38(%rbp), %rax
movl 0x4(%rax), %edx
leaq -0x68(%rbp), %rdi
callq 0xfef0
cmpq $0x0, -0x28(%rbp)
je 0x41e61
movq -0x28(%rbp), %rdi
leaq -0x68(%rbp), %rsi
callq 0xd8f0
testb $0x1, %al
jne 0x41e41
jmp 0x41e61
movq -0x28(%rbp), %rdi
leaq -0x68(%rbp), %rsi
callq 0xd750
movq %rax, -0x70(%rbp)
movq -0x8(%rbp), %rdi
movq -0x70(%rbp), %rsi
callq 0x10110
jmp 0x41e7d
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rdx
movq -0x38(%rbp), %rax
movl 0x4(%rax), %ecx
callq 0x41890
leaq -0x68(%rbp), %rdi
callq 0x10320
jmp 0x42849
leaq -0x80(%rbp), %rdi
callq 0xfca0
leaq -0x90(%rbp), %rdi
callq 0xfca0
movl $0x0, -0x94(%rbp)
movl -0x94(%rbp), %eax
movq -0x38(%rbp), %rcx
cmpl 0x4(%rcx), %eax
jge 0x41f04
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rax
movslq -0x94(%rbp), %rcx
movsbl (%rax,%rcx), %eax
cmpl $0x28, %eax
je 0x41eef
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rax
movslq -0x94(%rbp), %rcx
leaq -0x80(%rbp), %rdi
movsbl (%rax,%rcx), %esi
callq 0xfeb0
jmp 0x41ef1
jmp 0x41f04
jmp 0x41ef3
movl -0x94(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x94(%rbp)
jmp 0x41eaa
jmp 0x41f06
movl -0x94(%rbp), %eax
movq -0x38(%rbp), %rcx
cmpl 0x4(%rcx), %eax
jge 0x41f45
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rax
movslq -0x94(%rbp), %rcx
leaq -0x90(%rbp), %rdi
movsbl (%rax,%rcx), %esi
callq 0xfeb0
movl -0x94(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x94(%rbp)
jmp 0x41f06
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
leaq -0x80(%rbp), %rsi
callq 0xd750
movq %rax, -0xa0(%rbp)
leaq -0xe8(%rbp), %rdi
leaq -0x3400b(%rip), %rdx    # 0xdf60
leaq -0x31bd2(%rip), %r8     # 0x103a0
movq %rdx, %rsi
movq %r8, %rcx
callq 0xd210
leaq -0x110(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
leaq -0x31bef(%rip), %rdx    # 0x103a0
callq 0xc760
movl $0x1, -0x114(%rbp)
movl $0x1, -0x118(%rbp)
callq 0x101f0
movq %rax, -0x120(%rbp)
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x41fcf
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x164(%rbp)
jmp 0x42036
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x41fea
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x168(%rbp)
jmp 0x4202a
cmpq $0x0, -0x88(%rbp)
jne 0x42004
leaq 0x588c(%rip), %rax      # 0x47887
movq %rax, -0x170(%rbp)
jmp 0x42012
movq -0x88(%rbp), %rax
movq %rax, -0x170(%rbp)
movq -0x170(%rbp), %rax
movslq -0x114(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movl %eax, -0x168(%rbp)
movl -0x168(%rbp), %eax
movl %eax, -0x164(%rbp)
movl -0x164(%rbp), %eax
cmpl $-0x1, %eax
je 0x425ee
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x42060
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x174(%rbp)
jmp 0x420c7
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x4207b
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x178(%rbp)
jmp 0x420bb
cmpq $0x0, -0x88(%rbp)
jne 0x42095
leaq 0x57fb(%rip), %rax      # 0x47887
movq %rax, -0x180(%rbp)
jmp 0x420a3
movq -0x88(%rbp), %rax
movq %rax, -0x180(%rbp)
movq -0x180(%rbp), %rax
movslq -0x114(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movl %eax, -0x178(%rbp)
movl -0x178(%rbp), %eax
movl %eax, -0x174(%rbp)
movl -0x174(%rbp), %eax
cmpl $0x2c, %eax
jne 0x42206
cmpl $0x1, -0x118(%rbp)
jle 0x4218a
movq -0x120(%rbp), %rax
movq %rax, -0x188(%rbp)
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x4210c
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x18c(%rbp)
jmp 0x42173
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x42127
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x190(%rbp)
jmp 0x42167
cmpq $0x0, -0x88(%rbp)
jne 0x42141
leaq 0x574f(%rip), %rax      # 0x47887
movq %rax, -0x198(%rbp)
jmp 0x4214f
movq -0x88(%rbp), %rax
movq %rax, -0x198(%rbp)
movq -0x198(%rbp), %rax
movslq -0x114(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movl %eax, -0x190(%rbp)
movl -0x190(%rbp), %eax
movl %eax, -0x18c(%rbp)
movq -0x188(%rbp), %rdi
movl -0x18c(%rbp), %eax
movsbl %al, %esi
callq 0xfeb0
jmp 0x42201
cmpl $0x1, -0x118(%rbp)
jne 0x421e0
movq -0x120(%rbp), %rax
cmpl $0x0, 0x4(%rax)
jne 0x421bf
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x50(%rax), %rax
movq -0x10(%rbp), %rcx
movq (%rcx), %rdi
movq -0x38(%rbp), %rsi
leaq 0xdc98(%rip), %rdx      # 0x4fe55
callq *%rax
movq -0x120(%rbp), %rsi
leaq -0x110(%rbp), %rdi
callq 0xc920
callq 0x101f0
movq %rax, -0x120(%rbp)
jmp 0x421ff
leaq 0x527e(%rip), %rdi      # 0x47465
leaq 0xdb06(%rip), %rsi      # 0x4fcf4
movl $0x21d, %edx            # imm = 0x21D
leaq 0xdbfa(%rip), %rcx      # 0x4fdf4
callq 0xa0b0
jmp 0x42201
jmp 0x425da
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x42221
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x19c(%rbp)
jmp 0x42288
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x4223c
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x1a0(%rbp)
jmp 0x4227c
cmpq $0x0, -0x88(%rbp)
jne 0x42256
leaq 0x563a(%rip), %rax      # 0x47887
movq %rax, -0x1a8(%rbp)
jmp 0x42264
movq -0x88(%rbp), %rax
movq %rax, -0x1a8(%rbp)
movq -0x1a8(%rbp), %rax
movslq -0x114(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movl %eax, -0x1a0(%rbp)
movl -0x1a0(%rbp), %eax
movl %eax, -0x19c(%rbp)
movl -0x19c(%rbp), %eax
cmpl $0x28, %eax
jne 0x42350
movq -0x120(%rbp), %rax
movq %rax, -0x1b0(%rbp)
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x422c0
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x1b4(%rbp)
jmp 0x42327
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x422db
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x1b8(%rbp)
jmp 0x4231b
cmpq $0x0, -0x88(%rbp)
jne 0x422f5
leaq 0x559b(%rip), %rax      # 0x47887
movq %rax, -0x1c0(%rbp)
jmp 0x42303
movq -0x88(%rbp), %rax
movq %rax, -0x1c0(%rbp)
movq -0x1c0(%rbp), %rax
movslq -0x114(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movl %eax, -0x1b8(%rbp)
movl -0x1b8(%rbp), %eax
movl %eax, -0x1b4(%rbp)
movq -0x1b0(%rbp), %rdi
movl -0x1b4(%rbp), %eax
movsbl %al, %esi
callq 0xfeb0
movl -0x118(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x118(%rbp)
jmp 0x425d8
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x4236b
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x1c4(%rbp)
jmp 0x423d2
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x42386
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x1c8(%rbp)
jmp 0x423c6
cmpq $0x0, -0x88(%rbp)
jne 0x423a0
leaq 0x54f0(%rip), %rax      # 0x47887
movq %rax, -0x1d0(%rbp)
jmp 0x423ae
movq -0x88(%rbp), %rax
movq %rax, -0x1d0(%rbp)
movq -0x1d0(%rbp), %rax
movslq -0x114(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movl %eax, -0x1c8(%rbp)
movl -0x1c8(%rbp), %eax
movl %eax, -0x1c4(%rbp)
movl -0x1c4(%rbp), %eax
cmpl $0x29, %eax
jne 0x42531
cmpl $0x1, -0x118(%rbp)
jle 0x424a7
movl -0x118(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x118(%rbp)
movq -0x120(%rbp), %rax
movq %rax, -0x1d8(%rbp)
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x42426
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x1dc(%rbp)
jmp 0x4248d
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x42441
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x1e0(%rbp)
jmp 0x42481
cmpq $0x0, -0x88(%rbp)
jne 0x4245b
leaq 0x5435(%rip), %rax      # 0x47887
movq %rax, -0x1e8(%rbp)
jmp 0x42469
movq -0x88(%rbp), %rax
movq %rax, -0x1e8(%rbp)
movq -0x1e8(%rbp), %rax
movslq -0x114(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movl %eax, -0x1e0(%rbp)
movl -0x1e0(%rbp), %eax
movl %eax, -0x1dc(%rbp)
movq -0x1d8(%rbp), %rdi
movl -0x1dc(%rbp), %eax
movsbl %al, %esi
callq 0xfeb0
jmp 0x4252c
cmpl $0x1, -0x118(%rbp)
jne 0x4250d
movq -0x120(%rbp), %rax
cmpl $0x0, 0x4(%rax)
jle 0x424dd
movq -0x120(%rbp), %rsi
leaq -0x110(%rbp), %rdi
callq 0xc920
movq $0x0, -0x120(%rbp)
jmp 0x42508
cmpq $0x0, -0x100(%rbp)
je 0x42506
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x50(%rax), %rax
movq -0x10(%rbp), %rcx
movq (%rcx), %rdi
movq -0x38(%rbp), %rsi
leaq 0xd951(%rip), %rdx      # 0x4fe55
callq *%rax
jmp 0x42508
jmp 0x425ee
leaq 0x4f51(%rip), %rdi      # 0x47465
leaq 0xd7d9(%rip), %rsi      # 0x4fcf4
movl $0x232, %edx            # imm = 0x232
leaq 0xd8cd(%rip), %rcx      # 0x4fdf4
callq 0xa0b0
jmp 0x425d6
movq -0x120(%rbp), %rax
movq %rax, -0x1f0(%rbp)
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x4255a
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x1f4(%rbp)
jmp 0x425c1
movl -0x114(%rbp), %eax
cmpl -0x8c(%rbp), %eax
jl 0x42575
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl %eax, -0x1f8(%rbp)
jmp 0x425b5
cmpq $0x0, -0x88(%rbp)
jne 0x4258f
leaq 0x5301(%rip), %rax      # 0x47887
movq %rax, -0x200(%rbp)
jmp 0x4259d
movq -0x88(%rbp), %rax
movq %rax, -0x200(%rbp)
movq -0x200(%rbp), %rax
movslq -0x114(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movl %eax, -0x1f8(%rbp)
movl -0x1f8(%rbp), %eax
movl %eax, -0x1f4(%rbp)
movq -0x1f0(%rbp), %rdi
movl -0x1f4(%rbp), %eax
movsbl %al, %esi
callq 0xfeb0
jmp 0x425d8
jmp 0x425da
movl -0x114(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x114(%rbp)
jmp 0x41fb4
cmpq $0x0, -0x120(%rbp)
je 0x4260f
movq -0x120(%rbp), %rdi
callq 0x103a0
movq $0x0, -0x120(%rbp)
movq -0xa0(%rbp), %rax
movq 0x10(%rax), %rax
cmpq -0x100(%rbp), %rax
je 0x42642
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x50(%rax), %rax
movq -0x10(%rbp), %rcx
movq (%rcx), %rdi
movq -0x38(%rbp), %rsi
leaq 0xd83b(%rip), %rdx      # 0x4fe7b
callq *%rax
movq -0xa0(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x128(%rbp)
movq -0x110(%rbp), %rax
movq %rax, -0x130(%rbp)
cmpq $0x0, -0x128(%rbp)
je 0x4277e
movq -0x128(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x138(%rbp)
movq -0x130(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x140(%rbp)
callq 0x101f0
movq %rax, -0x148(%rbp)
leaq -0x158(%rbp), %rdi
callq 0xfca0
movq -0x140(%rbp), %rsi
leaq -0x158(%rbp), %rdi
leaq -0x312b0(%rip), %rdx    # 0x11410
callq 0x11730
movq -0x148(%rbp), %rax
movq %rax, -0x210(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x208(%rbp)
cmpq $0x0, -0x150(%rbp)
jne 0x426f8
leaq 0x5198(%rip), %rax      # 0x47887
movq %rax, -0x218(%rbp)
jmp 0x42706
movq -0x150(%rbp), %rax
movq %rax, -0x218(%rbp)
movq -0x208(%rbp), %rsi
movq -0x210(%rbp), %rdi
movq -0x218(%rbp), %rdx
movl -0x154(%rbp), %ecx
movq -0x28(%rbp), %r8
callq 0x41c10
leaq -0x158(%rbp), %rdi
callq 0x10320
movq -0x138(%rbp), %rsi
movq -0x148(%rbp), %rdx
leaq -0xe8(%rbp), %rdi
movl $0x1, %ecx
callq 0xd460
movq -0x128(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x128(%rbp)
movq -0x130(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x130(%rbp)
jmp 0x42661
movq -0x8(%rbp), %rax
movq %rax, -0x228(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x220(%rbp)
movq -0xa0(%rbp), %rax
cmpq $0x0, 0x30(%rax)
jne 0x427b2
leaq 0x50de(%rip), %rax      # 0x47887
movq %rax, -0x230(%rbp)
jmp 0x427c4
movq -0xa0(%rbp), %rax
movq 0x30(%rax), %rax
movq %rax, -0x230(%rbp)
movq -0x220(%rbp), %rsi
movq -0x228(%rbp), %rdi
movq -0x230(%rbp), %rdx
movq -0xa0(%rbp), %rax
movl 0x2c(%rax), %ecx
leaq -0xe8(%rbp), %r8
callq 0x41c10
leaq -0x110(%rbp), %rdi
movl $0x1, %esi
callq 0xc870
leaq -0xe8(%rbp), %rdi
xorl %esi, %esi
movl $0x1, %edx
callq 0xd360
leaq -0x80(%rbp), %rdi
callq 0x10320
leaq -0x90(%rbp), %rdi
callq 0x10320
jmp 0x42849
leaq 0x4c34(%rip), %rdi      # 0x47465
leaq 0xd4bc(%rip), %rsi      # 0x4fcf4
movl $0x277, %edx            # imm = 0x277
leaq 0xd5b0(%rip), %rcx      # 0x4fdf4
callq 0xa0b0
jmp 0x41ce2
movq -0x30(%rbp), %rdi
callq 0xb590
addq $0x230, %rsp            # imm = 0x230
popq %rbp
retq