// File: /workspace/github_cpp_makefile_star2_O3/exrd[P]neteruhsp/neteruhsp/neteruhsp.cc
// Function: neteruhsp::prepro_line(neteruhsp::prepro_context_t*, char const*, bool)
char* prepro_line( prepro_context_t* pctx, const char* line, bool enable_preprocessor )
{
	// 最初の空白をスキップ
	while ( line[0] == ' ' || line[0] == '\t' )
	{ ++line; }

	// 普通の行なら展開
	if ( !enable_preprocessor || line[0] != '#' )
	{
		static constexpr int MAX_REPLACE_LOOP = 256;
		int replaced_loop = 0;

		char* res = nullptr;
		char* holded = nullptr;

		// 展開があるならずっとループ
		for ( ; ; )
		{
			bool is_replaced = false;
			res = prepro_line_expand( pctx, line, &is_replaced );
			if ( !is_replaced )
			{
				break;
			}
			if ( holded != nullptr )
			{
				destroy_string( holded );
				holded = nullptr;
			}
			holded = res;
			line = res;

			++replaced_loop;
			if ( replaced_loop > MAX_REPLACE_LOOP )
			{
				raise_error( "マクロの再起展開が上限数（%d）を突破しました、マクロが無限ループしてる可能性があります@@ %d行目", replaced_loop, pctx->line_ + 1 );
				return nullptr;
			}
		}

		if ( holded != nullptr )
		{
			destroy_string( holded );
			holded = nullptr;
		}
		return res;
	}

	// 最初の#はスキップ
	++line;

	tokenize_context_t tokenize_ctx{};
	parse_context_t parse_ctx{};
	initialize_tokenize_context( &tokenize_ctx, line );
	initialize_parse_context( &parse_ctx, tokenize_ctx );

	{
		auto* const st = read_token( parse_ctx );

		if ( st->tag_ != TOKEN_IDENTIFIER )
		{
			raise_error( "プリプロセス：# の後に識別子でないトークンが検出されました@@ %d行目", pctx->line_ + 1 );
			return nullptr;
		}

		const auto pptag = query_preprocessor( st->content_ );
		if ( pptag == PREPRO_UNKNOWN )
		{
			raise_error( "プリプロセス：想定外のプリプロセッサ（%s）@@ %d行目", st->content_, pctx->line_ + 1 );
			return nullptr;
		}

		switch ( pptag )
		{
			case PREPRO_DEFINE:
			{
				if ( pctx->is_current_region_valid_ )
				{
					bool is_ctype = false;
					{
						const auto* const it = read_token( parse_ctx );
						if ( it->tag_ == TOKEN_IDENTIFIER && query_keyword( it->content_ ) == KEYWORD_CTYPE )
						{
							is_ctype = true;
						}
						else
						{
							unread_token( parse_ctx );
						}
					}

					const auto* const nit = read_token( parse_ctx );
					if ( nit->tag_ != TOKEN_IDENTIFIER )
					{
						raise_error( "プリプロセス：define に失敗：識別子名が見つかりません@@ %d行目", pctx->line_ + 1 );
						return nullptr;
					}

					auto* const nmacro = create_macro();
					nmacro->name_ = create_string( nit->content_ );
					nmacro->is_ctype_ = is_ctype;

					const auto* const rt = read_token( parse_ctx );
					if ( rt->tag_ == TOKEN_LPARENTHESIS )
					{
						// パラメータあり
						bool is_break = false;

						for ( ; ; )
						{
							const auto* const ct = read_token( parse_ctx );
							if ( ct->tag_ == TOKEN_EOF )
							{
								raise_error( "プリプロセス：define に失敗：パラメータのパース中に行末に到達しました@@ %d行目", pctx->line_ + 1 );
								return nullptr;
							}
							if ( ct->tag_ == TOKEN_RPARENTHESIS )
							{
								// 何もパラメータがない、おわり
								unread_token( parse_ctx );
								break;
							}
							if ( ct->tag_ != TOKEN_PP_ARG_INDICATOR )
							{
								raise_error( "プリプロセス：define に失敗：パラメータは%%から始まる必要があります@@ %d行目", pctx->line_ + 1 );
								return nullptr;
							}

							const auto* const it = read_token( parse_ctx );
							if ( it->tag_ != TOKEN_INTEGER || it->left_space_ )
							{
								raise_error( "プリプロセス：define に失敗：パラメータ%%のあと、スペースなしで数値を入れる必要があります@@ %d行目", pctx->line_ + 1 );
								return nullptr;
							}

							const auto itidx = atoi( it->content_ );
							if ( itidx != nmacro->param_num_ + 1 )
							{
								raise_error( "プリプロセス：define に失敗：パラメータ%%は順番に定義する必要があります@@ %d行目", pctx->line_ + 1 );
								return nullptr;
							}

							if ( nmacro->param_num_ > MACRO_PARAM_MAX )
							{
								raise_error( "プリプロセス：define に失敗：パラメータ%%の数が多すぎます@@ %d行目", pctx->line_ + 1 );
								return nullptr;
							}

							auto& nparam = nmacro->params_[nmacro->param_num_];
							++nmacro->param_num_;

							const auto* const at = read_token( parse_ctx );
							if ( at->tag_ == TOKEN_ASSIGN )
							{
								// デフォルト値あり
								int parenthesis_depth = 0;
								for ( ; ; )
								{
									const auto* const nt = read_token( parse_ctx );
									if ( parenthesis_depth == 0 && ( nt->tag_ == TOKEN_RPARENTHESIS || nt->tag_ == TOKEN_COMMA ) )
									{
										// ここまで食って終わり
										nparam.default_param_ = create_string( parse_ctx.tokenize_context_->script_ + at->cursor_end_, nt->cursor_begin_ - at->cursor_end_ );

										if ( nt->tag_ == TOKEN_RPARENTHESIS )
										{
											is_break = true;
											unread_token( parse_ctx );
										}
										break;
									}
									if ( nt->tag_ == TOKEN_LPARENTHESIS )
									{
										++parenthesis_depth;
									}
									if ( nt->tag_ == TOKEN_RPARENTHESIS )
									{
										--parenthesis_depth;
									}
									if ( nt->tag_ == TOKEN_EOF )
									{
										raise_error( "プリプロセス：define に失敗：パラメータ%%のデフォルト値を取得中、文末まで到達しました@@ %d行目", pctx->line_ + 1 );
										return nullptr;
									}
								}
							}
							else
							{
								// デフォルト値なし
								if ( at->tag_ == TOKEN_RPARENTHESIS )
								{
									unread_token( parse_ctx );
									break;
								}
								if ( at->tag_ != TOKEN_COMMA )
								{
									raise_error( "プリプロセス：define に失敗：パラメータ%%の定義の後に不明なトークンを読み込みました（%s）@@ %d行目", at->content_, pctx->line_ + 1 );
									return nullptr;
								}
							}

							if ( is_break )
							{ break; }
						}

						// 残り
						const auto* const lrt = read_token( parse_ctx );
						if ( lrt->tag_ != TOKEN_RPARENTHESIS )
						{
							raise_error( "プリプロセス：define に失敗：パラメータ%%の定義の後に不明なトークンを読み込みました（%s）@@ %d行目", lrt->content_, pctx->line_ + 1 );
							return nullptr;
						}
						nmacro->replacing_ = create_string( parse_ctx.tokenize_context_->script_ + lrt->cursor_end_ );
					}
					else
					{
						// パラメータなし
						nmacro->replacing_ = create_string( parse_ctx.tokenize_context_->script_ + rt->cursor_begin_ );
					}

					prepro_register_macro( pctx, nmacro );
				}
				break;
			}
			case PREPRO_UNDEF:
			{
				if ( pctx->is_current_region_valid_ )
				{
					auto* const it = read_token( parse_ctx );
					auto* const et = read_token( parse_ctx );
					if ( it->tag_ != TOKEN_IDENTIFIER || et->tag_ != TOKEN_EOF )
					{
						raise_error( "プリプロセス：undef に失敗：構文が間違っています@@ %d行目", pctx->line_ + 1 );
						return nullptr;
					}
					if ( !prepro_erase_macro( pctx, it->content_ ) )
					{
						raise_error( "プリプロセス：undef に失敗：（%s）が見つかりません@@ %d行目", it->content_, pctx->line_ + 1 );
						return nullptr;
					}
				}
				break;
			}
			case PREPRO_IF:
			{
				bool is_valid = false;
				if ( pctx->is_current_region_valid_ )
				{
					const auto* const rest_top = line + st->cursor_end_;
					auto* rest_pp = prepro_line( pctx, rest_top, false );
					if ( rest_pp == nullptr )
					{
						raise_error( "プリプロセス：if に失敗：式のプリプロセスに失敗@@ %d行目", pctx->line_ + 1 );
						return nullptr;
					}

					tokenize_context_t etoken_ctx{};
					parse_context_t eparse_ctx{};
					initialize_tokenize_context( &etoken_ctx, rest_pp );
					initialize_parse_context( &eparse_ctx, etoken_ctx );

					etoken_ctx.line_ = pctx->line_;// ラインを同期

					auto* east = parse_expression( eparse_ctx );
					if ( east == nullptr )
					{
						raise_error( "プリプロセス：if に失敗：式のパースに失敗@@ %d行目", pctx->line_ + 1 );
						return nullptr;
					}

					auto* ev = evaluate_ast_immediate( east );
					if ( ev == nullptr )
					{
						raise_error( "プリプロセス：if に失敗：式の評価に失敗@@ %d行目", pctx->line_ + 1 );
						return nullptr;
					}

					is_valid = value_calc_boolean( *ev );

					destroy_ast_node( east );
					destroy_value( ev );

					uninitialize_parse_context( &eparse_ctx );
					uninitialize_tokenize_context( &etoken_ctx );
					destroy_string( rest_pp );
				}
				else
				{
					// 何も食わずに判断
					is_valid = false;
				}

				if ( pctx->pp_region_idx_ >= PP_DIRECTIVE_MAX )
				{
					raise_error( "プリプロセス：ifdef に失敗：if ネストが深すぎます@@ %d行目", pctx->line_ + 1 );
					return nullptr;
				}
				++pctx->pp_region_idx_;
				auto& directive = pctx->pp_region_[pctx->pp_region_idx_];
				directive.is_valid_ = ( pctx->is_current_region_valid_ && is_valid );
				directive.line_ = pctx->line_;
				pctx->is_current_region_valid_ = directive.is_valid_;
				break;
			}
			case PREPRO_IFDEF:
			{
				auto* const it = read_token( parse_ctx );
				auto* const et = read_token( parse_ctx );
				if ( it->tag_ != TOKEN_IDENTIFIER || et->tag_ != TOKEN_EOF )
				{
					raise_error( "プリプロセス：ifdef に失敗：構文が間違っています@@ %d行目", pctx->line_ + 1 );
					return nullptr;
				}
				const bool has_macro = ( prepro_find_macro( pctx, it->content_ ) != nullptr );
				if ( pctx->pp_region_idx_ >= PP_DIRECTIVE_MAX )
				{
					raise_error( "プリプロセス：ifdef に失敗：if ネストが深すぎます@@ %d行目", pctx->line_ + 1 );
					return nullptr;
				}
				++pctx->pp_region_idx_;
				auto& directive = pctx->pp_region_[pctx->pp_region_idx_];
				directive.is_valid_ = ( pctx->is_current_region_valid_ && has_macro );
				directive.line_ = pctx->line_;
				pctx->is_current_region_valid_ = directive.is_valid_;
				break;
			}
			case PREPRO_ENDIF:
			{
				auto* const et = read_token( parse_ctx );
				if ( et->tag_ != TOKEN_EOF )
				{
					raise_error( "プリプロセス：endif に失敗：endif後に余計なトークンを検出@@ %d行目", pctx->line_ + 1 );
					return nullptr;
				}
				if ( pctx->pp_region_idx_ <= 0 )
				{
					raise_error( "プリプロセス：endif に失敗：if ネストがされいてません@@ %d行目", pctx->line_ + 1 );
					return nullptr;
				}
				--pctx->pp_region_idx_;
				pctx->is_current_region_valid_ = pctx->pp_region_[pctx->pp_region_idx_].is_valid_;
				break;
			}
			case PREPRO_ENUM:
			{
				if ( pctx->is_current_region_valid_ )
				{
					auto* const it = read_token( parse_ctx );
					if ( it->tag_ != TOKEN_IDENTIFIER )
					{
						raise_error( "プリプロセス：enum に失敗：構文が間違っています@@ %d行目", pctx->line_ + 1 );
						return nullptr;
					}
					auto* const at = read_token( parse_ctx );
					if ( at->tag_ == TOKEN_ASSIGN )
					{
						const auto* const rest_top = line + at->cursor_end_;
						auto* rest_pp = prepro_line( pctx, rest_top, false );
						if ( rest_pp == nullptr )
						{
							raise_error( "プリプロセス：enum に失敗：式のプリプロセスに失敗@@ %d行目", pctx->line_ + 1 );
							return nullptr;
						}

						tokenize_context_t etoken_ctx{};
						parse_context_t eparse_ctx{};
						initialize_tokenize_context( &etoken_ctx, rest_pp );
						initialize_parse_context( &eparse_ctx, etoken_ctx );

						etoken_ctx.line_ = pctx->line_;// ラインを同期

						auto* east = parse_expression( eparse_ctx );
						if ( east == nullptr )
						{
							raise_error( "プリプロセス：enum に失敗：式のパースに失敗@@ %d行目", pctx->line_ + 1 );
							return nullptr;
						}

						auto* ev = evaluate_ast_immediate( east );
						if ( ev == nullptr )
						{
							raise_error( "プリプロセス：enum に失敗：式の評価に失敗@@ %d行目", pctx->line_ + 1 );
							return nullptr;
						}

						value_isolate( *ev );
						if ( value_get_primitive_tag( *ev ) != VALUE_INT )
						{
							raise_error( "プリプロセス：enum に失敗：評価後の値がintではありません@@ %d行目", pctx->line_ + 1 );
							return nullptr;
						}

						pctx->enum_next_ = value_calc_int( *ev );

						destroy_ast_node( east );
						destroy_value( ev );

						uninitialize_parse_context( &eparse_ctx );
						uninitialize_tokenize_context( &etoken_ctx );
						destroy_string( rest_pp );
					}
					else
					{
						if ( at->tag_ != TOKEN_EOF )
						{
							raise_error( "プリプロセス：enum に失敗：enum後に余計なトークンを検出@@ %d行目", pctx->line_ + 1 );
							return nullptr;
						}
					}

					// 登録
					auto* const nm = create_macro();
					nm->name_ = create_string( it->content_ );
					nm->replacing_ = create_string_from( pctx->enum_next_ );
					prepro_register_macro( pctx, nm );
					++pctx->enum_next_;
				}
				break;
			}
			default: assert( false ); break;
		}
	}

	uninitialize_parse_context( &parse_ctx );
	uninitialize_tokenize_context( &tokenize_ctx );

	return create_string( "" );
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x78, %rsp
movq %rsi, %r14
movq %rdi, %r13
incq %r14
movzbl -0x1(%r14), %eax
cmpl $0x20, %eax
je 0x3bf0
cmpl $0x9, %eax
je 0x3bf0
cmpb $0x23, %al
sete %al
testb %dl, %al
je 0x3e36
leaq 0x20(%rsp), %rbx
movq %r14, (%rbx)
xorl %r15d, %r15d
movq %r15, 0x8(%rbx)
movq %r14, 0x10(%rbx)
movl $0x1, %edi
movl $0x10, %esi
callq 0x20f0
leaq 0x8(%rsp), %rdi
movq %rax, (%rdi)
movq %r15, 0x8(%rdi)
movq %rbx, 0x10(%rdi)
callq 0x3619
cmpl $0x23, (%rax)
jne 0x43d2
movq %rax, %r15
movq 0x8(%rax), %r12
leaq 0x906f(%rip), %rsi      # 0xcccc
movq %r12, %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x2d26
testb %al, %al
je 0x3eb4
cmpb $0x1, 0x14(%r13)
jne 0x4302
leaq 0x8(%rsp), %rdi
callq 0x3619
cmpl $0x23, (%rax)
jne 0x3c9c
movq 0x8(%rax), %rdi
callq 0x2cbf
movb $0x1, %bl
cmpl $0x1, %eax
je 0x3cad
leaq 0x8(%rsp), %rdi
movl $0x1, %esi
callq 0x3669
xorl %ebx, %ebx
leaq 0x8(%rsp), %rdi
callq 0x3619
cmpl $0x23, (%rax)
jne 0x43e4
movq %rax, %r15
movl $0xa0, %edi
callq 0x21d0
movq %rax, %r14
movl $0x0, 0x18(%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x20(%rax)
movups %xmm0, 0x30(%rax)
movups %xmm0, 0x40(%rax)
movups %xmm0, 0x50(%rax)
movups %xmm0, 0x60(%rax)
movups %xmm0, 0x70(%rax)
movups %xmm0, 0x80(%rax)
movups %xmm0, 0x90(%rax)
movq $0x0, 0x10(%rax)
movq 0x8(%r15), %rdi
callq 0x3992
movq %rax, (%r14)
movb %bl, 0x8(%r14)
leaq 0x8(%rsp), %rdi
callq 0x3619
cmpl $0x6, (%rax)
jne 0x3f6b
movq %r13, (%rsp)
movq %r14, %rax
addq $0x20, %rax
movq %rax, 0x38(%rsp)
xorl %ebp, %ebp
leaq 0x8(%rsp), %r15
movl %ebp, %r13d
movq %r15, %rdi
callq 0x3619
movl (%rax), %eax
cmpl $0x3, %eax
jne 0x425d
movq %r15, %rdi
callq 0x3619
cmpl $0x9, (%rax)
jne 0x436e
cmpb $0x1, 0x1c(%rax)
je 0x436e
movq 0x8(%rax), %rdi
callq 0x2250
movl %eax, %ebp
leal 0x1(%r13), %eax
cmpl %eax, %ebp
jne 0x4380
cmpl $0x11, %r13d
jae 0x4392
movl %ebp, 0x18(%r14)
movq %r15, %rdi
callq 0x3619
movq %rax, %r12
movl (%rax), %eax
cmpl $0x8, %eax
je 0x3d42
cmpl $0x1a, %eax
jne 0x42af
movl %r13d, %eax
movq %rax, 0x40(%rsp)
xorl %ebx, %ebx
movq %r15, %rdi
callq 0x3619
movq %rax, %r13
testl %ebx, %ebx
sete %cl
movl (%rax), %eax
leal -0x7(%rax), %edx
cmpl $0x2, %edx
setb %dl
andb %cl, %dl
cmpb $0x1, %dl
je 0x3dfc
xorl %ecx, %ecx
cmpl $0x6, %eax
sete %cl
addl %ecx, %ebx
xorl %ecx, %ecx
cmpl $0x7, %eax
sete %cl
subl %ecx, %ebx
testl %eax, %eax
jne 0x3dbd
jmp 0x433e
movq 0x18(%rsp), %rax
movslq 0x14(%r12), %rcx
movq (%rax), %rdi
addq %rcx, %rdi
movslq 0x10(%r13), %rsi
subq %rcx, %rsi
callq 0x4b1e
movq 0x38(%rsp), %rcx
movq 0x40(%rsp), %rdx
movq %rax, (%rcx,%rdx,8)
cmpl $0x7, (%r13)
jne 0x3d42
jmp 0x42b8
decq %r14
leaq 0x20(%rsp), %r15
movb $0x0, (%r15)
movq %r13, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x4535
movq %rax, %r14
cmpb $0x1, (%r15)
jne 0x432c
movl $0x101, %ebx            # imm = 0x101
xorl %edi, %edi
leaq 0x20(%rsp), %r15
movq %r14, %r12
testq %rdi, %rdi
je 0x3e76
callq 0x21a0
decl %ebx
je 0x4355
movb $0x0, 0x20(%rsp)
movq %r13, %rdi
movq %r12, %rsi
movq %r15, %rdx
callq 0x4535
movq %rax, %r14
cmpb $0x0, 0x20(%rsp)
movq %r12, %rdi
jne 0x3e69
testq %r12, %r12
je 0x432c
movq %r12, %rdi
callq 0x21a0
jmp 0x432c
movq %r13, (%rsp)
movl $0x18, %r13d
leaq 0x11adb(%rip), %rbx     # 0x159a0
movq %r13, %rbp
addq $0x10, %r13
cmpq $0x78, %r13
je 0x3ee8
movq (%rbp,%rbx), %rsi
movq %r12, %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x2d26
testb %al, %al
je 0x3ec5
movl -0x8(%rbp,%rbx), %eax
incl %eax
cmpl $0x6, %eax
ja 0x446b
leaq 0x8486(%rip), %rcx      # 0xc384
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
movq (%rsp), %r13
jmpq *%rax
cmpb $0x1, 0x14(%r13)
jne 0x4302
leaq 0x8(%rsp), %r15
movq %r15, %rdi
callq 0x3619
movq %rax, %r14
movq %r15, %rdi
callq 0x3619
cmpl $0x23, (%r14)
jne 0x4432
cmpl $0x0, (%rax)
jne 0x4432
movq 0x8(%r14), %rsi
movq %r13, %rdi
callq 0x4b51
testb %al, %al
jne 0x4302
movq 0x8(%r14), %rsi
movl 0x10(%r13), %edx
incl %edx
leaq 0x93af(%rip), %rdi      # 0xd315
jmp 0x43cb
movq 0x18(%rsp), %rcx
addq $0x10, %rax
jmp 0x42e8
leaq 0x8(%rsp), %rdi
callq 0x3619
cmpl $0x0, (%rax)
jne 0x4420
movl 0x18(%r13), %eax
testl %eax, %eax
jle 0x4444
decl %eax
movl %eax, 0x18(%r13)
movb 0x1c(%r13,%rax,8), %al
jmp 0x400a
leaq 0x8(%rsp), %r15
movq %r15, %rdi
callq 0x3619
movq %rax, %r14
movq %r15, %rdi
callq 0x3619
cmpl $0x23, (%r14)
jne 0x43f6
cmpl $0x0, (%rax)
jne 0x43f6
movl 0x18(%r13), %ebx
cmpq $0xf, %rbx
ja 0x4408
movq 0x8(%r14), %rsi
movq %r13, %rdi
callq 0x4d12
testq %rax, %rax
setne %al
leaq 0x1(%rbx), %rcx
movl %ecx, 0x18(%r13)
andb 0x14(%r13), %al
movb %al, 0x24(%r13,%rbx,8)
movl 0x10(%r13), %ecx
movl %ecx, 0x28(%r13,%rbx,8)
movb %al, 0x14(%r13)
jmp 0x4302
cmpb $0x1, 0x14(%r13)
jne 0x427f
movslq 0x14(%r15), %rax
addq %rax, %r14
movq %r13, %rdi
movq %r14, %rsi
xorl %edx, %edx
callq 0x3bdc
testq %rax, %rax
je 0x448a
movq %rax, %r14
leaq 0x60(%rsp), %rbx
movq %rax, (%rbx)
movl $0x0, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movl $0x1, %edi
movl $0x10, %esi
callq 0x20f0
leaq 0x48(%rsp), %rdi
movq %rax, (%rdi)
movq $0x0, 0x8(%rdi)
movq %rbx, 0x10(%rdi)
movl 0x10(%r13), %eax
movl %eax, 0xc(%rbx)
callq 0x5aa6
testq %rax, %rax
je 0x44ae
movq %rax, %r15
movq %rax, %rdi
callq 0x4ba1
testq %rax, %rax
je 0x44c0
movq %rax, %r12
movq %rax, %rdi
callq 0x4c2a
movl %eax, %ebp
movq %r15, %rdi
callq 0x4c8b
movq %r12, %rdi
callq 0x4cd8
leaq 0x48(%rsp), %rdi
callq 0x35d0
movq %r14, %rdi
callq 0x21a0
jmp 0x4281
cmpb $0x1, 0x14(%r13)
jne 0x4302
leaq 0x8(%rsp), %rdi
callq 0x3619
cmpl $0x23, (%rax)
jne 0x449c
movq %rax, %r15
leaq 0x8(%rsp), %rdi
callq 0x3619
movl (%rax), %ecx
testl %ecx, %ecx
je 0x41e9
cmpl $0x1a, %ecx
jne 0x44d2
movslq 0x14(%rax), %rax
addq %rax, %r14
movq %r13, %rdi
movq %r14, %rsi
xorl %edx, %edx
callq 0x3bdc
testq %rax, %rax
je 0x44e4
movq %rax, %r14
leaq 0x60(%rsp), %rbx
movq %rax, (%rbx)
movl $0x0, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movl $0x1, %edi
movl $0x10, %esi
callq 0x20f0
leaq 0x48(%rsp), %rdi
movq %rax, (%rdi)
movq $0x0, 0x8(%rdi)
movq %rbx, 0x10(%rdi)
movl 0x10(%r13), %eax
movl %eax, 0xc(%rbx)
callq 0x5aa6
testq %rax, %rax
je 0x44f6
movq %rax, %r12
movq %rax, %rdi
callq 0x4ba1
testq %rax, %rax
je 0x450b
movq %rax, %r13
movq %rax, %rdi
callq 0x4d52
movl (%r13), %eax
cmpl $0x4, %eax
jne 0x41a9
movq 0x8(%r13), %rax
movl 0x8(%rax), %eax
cmpl $0x1, %eax
jne 0x4520
movq %r13, %rdi
callq 0x4e28
movq (%rsp), %rbx
movl %eax, 0x9c(%rbx)
movq %r12, %rdi
callq 0x4c8b
movq %r13, %rdi
movq %rbx, %r13
callq 0x4cd8
leaq 0x48(%rsp), %rdi
callq 0x35d0
movq %r14, %rdi
callq 0x21a0
movl $0xa0, %edi
callq 0x21d0
movq %rax, %r14
movb $0x0, 0x8(%rax)
movl $0x0, 0x18(%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x20(%rax)
movups %xmm0, 0x30(%rax)
movups %xmm0, 0x40(%rax)
movups %xmm0, 0x50(%rax)
movups %xmm0, 0x60(%rax)
movups %xmm0, 0x70(%rax)
movups %xmm0, 0x80(%rax)
movups %xmm0, 0x90(%rax)
movq 0x8(%r15), %rdi
callq 0x3992
movq %rax, (%r14)
movl 0x9c(%r13), %edi
callq 0x4e83
movq %rax, 0x10(%r14)
movq %r13, %rdi
movq %r14, %rsi
callq 0x39ca
incl 0x9c(%r13)
jmp 0x4302
cmpl $0x7, %eax
je 0x42b8
testl %eax, %eax
jne 0x43a4
movq (%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x8cff(%rip), %rdi      # 0xcf79
jmp 0x434e
xorl %ebp, %ebp
movl 0x18(%r13), %eax
cmpq $0x10, %rax
jae 0x4408
leaq 0x1(%rax), %rcx
movl %ecx, 0x18(%r13)
andb 0x14(%r13), %bpl
movb %bpl, 0x24(%r13,%rax,8)
movl 0x10(%r13), %ecx
movl %ecx, 0x28(%r13,%rax,8)
movb %bpl, 0x14(%r13)
jmp 0x4302
cmpl $0x7, %eax
jne 0x43b6
leaq 0x8(%rsp), %r15
movl $0x1, %esi
movq %r15, %rdi
callq 0x3669
movq %r15, %rdi
callq 0x3619
cmpl $0x7, (%rax)
jne 0x441a
movq 0x18(%rsp), %rcx
addq $0x14, %rax
movq (%rsp), %r13
movslq (%rax), %rdi
addq (%rcx), %rdi
callq 0x3992
movq %rax, 0x10(%r14)
movq %r13, %rdi
movq %r14, %rsi
callq 0x39ca
leaq 0x8(%rsp), %rdi
callq 0x35d0
xorps %xmm0, %xmm0
movaps %xmm0, 0x20(%rsp)
movq $0x0, 0x30(%rsp)
leaq 0x7dec(%rip), %rdi      # 0xc110
callq 0x3992
movq %rax, %r14
movq %r14, %rax
addq $0x78, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq (%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x8e63(%rip), %rdi      # 0xd1b1
xorl %eax, %eax
callq 0x344d
movl 0x10(%r13), %edx
incl %edx
leaq 0x8a87(%rip), %rdi      # 0xcde9
movl $0x101, %esi            # imm = 0x101
xorl %eax, %eax
callq 0x344d
movq (%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x8cd7(%rip), %rdi      # 0xd055
jmp 0x434e
movq (%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x8d52(%rip), %rdi      # 0xd0e2
jmp 0x434e
movq (%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x8db2(%rip), %rdi      # 0xd154
jmp 0x434e
movq (%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x8c35(%rip), %rdi      # 0xcfe9
jmp 0x434e
movq 0x8(%r12), %rsi
movq (%rsp), %rax
movl 0x10(%rax), %edx
incl %edx
leaq 0x8e6d(%rip), %rdi      # 0xd238
xorl %eax, %eax
callq 0x344d
movl 0x10(%r13), %esi
incl %esi
leaq 0x8a96(%rip), %rdi      # 0xce75
jmp 0x434e
movl 0x10(%r13), %esi
incl %esi
leaq 0x8b30(%rip), %rdi      # 0xcf21
jmp 0x434e
movl 0x10(%r13), %esi
incl %esi
leaq 0x9094(%rip), %rdi      # 0xd497
jmp 0x434e
movl 0x10(%r13), %esi
incl %esi
leaq 0x9031(%rip), %rdi      # 0xd446
jmp 0x434e
movq 0x8(%rax), %rsi
jmp 0x43bb
movl 0x10(%r13), %esi
incl %esi
leaq 0x90bb(%rip), %rdi      # 0xd4e8
jmp 0x434e
movl 0x10(%r13), %esi
incl %esi
leaq 0x8e85(%rip), %rdi      # 0xd2c4
jmp 0x434e
movl 0x10(%r13), %esi
incl %esi
leaq 0x90f3(%rip), %rdi      # 0xd544
jmp 0x434e
movl 0x10(%r13), %edx
incl %edx
leaq 0x8a74(%rip), %rdi      # 0xced7
movq %r12, %rsi
jmp 0x43cb
leaq 0x9313(%rip), %rdi      # 0xd785
leaq 0x8420(%rip), %rsi      # 0xc899
leaq 0x930b(%rip), %rcx      # 0xd78b
movl $0xa4c, %edx            # imm = 0xA4C
callq 0x20e0
movl 0x10(%r13), %esi
incl %esi
leaq 0x8ed1(%rip), %rdi      # 0xd368
jmp 0x434e
movl 0x10(%r13), %esi
incl %esi
leaq 0x90f2(%rip), %rdi      # 0xd59b
jmp 0x434e
movl 0x10(%r13), %esi
incl %esi
leaq 0x8efe(%rip), %rdi      # 0xd3b9
jmp 0x434e
movl 0x10(%r13), %esi
incl %esi
leaq 0x8f34(%rip), %rdi      # 0xd401
jmp 0x434e
movl 0x10(%r13), %esi
incl %esi
leaq 0x924c(%rip), %rdi      # 0xd72b
jmp 0x434e
movl 0x10(%r13), %esi
incl %esi
leaq 0x90fa(%rip), %rdi      # 0xd5eb
jmp 0x434e
movq (%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x9138(%rip), %rdi      # 0xd63e
jmp 0x434e
movq (%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x916d(%rip), %rdi      # 0xd688
jmp 0x434e
movq (%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x919f(%rip), %rdi      # 0xd6cf
jmp 0x434e