// File: /workspace/github_cpp_makefile_star2_O1/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 $0x98, %rsp
movq %rsi, %r14
incq %r14
movzbl -0x1(%r14), %eax
cmpl $0x20, %eax
je 0x3ce2
cmpl $0x9, %eax
je 0x3ce2
cmpb $0x23, %al
sete %al
testb %dl, %al
je 0x4052
movq %rdi, 0x8(%rsp)
xorps %xmm0, %xmm0
leaq 0x60(%rsp), %rbx
movaps %xmm0, (%rbx)
xorl %r13d, %r13d
movq %r13, 0x10(%rbx)
leaq 0x10(%rsp), %r15
movq %r13, 0x10(%r15)
movaps %xmm0, (%r15)
movq %r14, (%rbx)
movq %r13, 0x8(%rbx)
movq %r14, 0x10(%rbx)
movl $0x10, %edi
callq 0x21d0
xorps %xmm0, %xmm0
movups %xmm0, (%rax)
movq %rax, (%r15)
movq %r13, 0x8(%r15)
movq %rbx, 0x10(%r15)
movq %r15, %rdi
callq 0x367d
cmpl $0x23, (%rax)
jne 0x4527
movq %rax, %r15
movq 0x8(%rax), %r12
leaq 0x9fd4(%rip), %rsi      # 0xdd3e
movq %r12, %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x2da2
testb %al, %al
jne 0x3db0
movl $0x18, %r13d
leaq 0x12c18(%rip), %rbx     # 0x169a0
movq %r13, %rbp
addq $0x10, %r13
cmpq $0x78, %r13
je 0x3dab
movq (%rbp,%rbx), %rsi
movq %r12, %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x2da2
testb %al, %al
je 0x3d88
movl -0x8(%rbp,%rbx), %r13d
incl %r13d
cmpl $0x6, %r13d
movq 0x8(%rsp), %rbx
ja 0x460c
leaq 0x95fb(%rip), %rax      # 0xd3c4
movslq (%rax,%r13,4), %rcx
addq %rax, %rcx
jmpq *%rcx
cmpb $0x1, 0x14(%rbx)
jne 0x44bd
leaq 0x10(%rsp), %rdi
callq 0x367d
cmpl $0x23, (%rax)
jne 0x3dfc
movq 0x8(%rax), %rdi
callq 0x2d3b
movb $0x1, %bpl
cmpl $0x1, %eax
je 0x3e0d
leaq 0x10(%rsp), %rdi
movl $0x1, %esi
callq 0x36fe
xorl %ebp, %ebp
leaq 0x10(%rsp), %rdi
callq 0x367d
cmpl $0x23, (%rax)
jne 0x4647
movq %rax, %r15
movl $0xa0, %edi
callq 0x21d0
movq %rax, %r14
xorl %eax, %eax
movq %rax, (%r14)
movb $0x0, 0x8(%r14)
movl $0x0, 0x18(%r14)
xorps %xmm0, %xmm0
movups %xmm0, 0x20(%r14)
movups %xmm0, 0x30(%r14)
movups %xmm0, 0x40(%r14)
movups %xmm0, 0x50(%r14)
movups %xmm0, 0x60(%r14)
movups %xmm0, 0x70(%r14)
movups %xmm0, 0x80(%r14)
movups %xmm0, 0x90(%r14)
movq $0x0, 0x30(%rsp)
movq %rax, 0x10(%r14)
movq 0x8(%r15), %rdi
callq 0x3a4c
movq %rax, (%r14)
movb %bpl, 0x8(%r14)
leaq 0x10(%rsp), %rdi
callq 0x367d
cmpl $0x6, (%rax)
jne 0x449a
movq %r14, %rax
addq $0x20, %rax
movq %rax, 0x78(%rsp)
leaq 0x10(%rsp), %r15
movq %r14, 0x28(%rsp)
movq %r15, %rdi
callq 0x367d
movl (%rax), %eax
cmpl $0x3, %eax
je 0x3ed6
cmpl $0x7, %eax
je 0x400b
jmp 0x454e
movq %r15, %rdi
callq 0x367d
cmpl $0x9, (%rax)
jne 0x453d
cmpb $0x1, 0x1c(%rax)
je 0x453d
movq 0x8(%rax), %rdi
callq 0x2250
movl 0x18(%r14), %ebp
leal 0x1(%rbp), %ecx
cmpl %ecx, %eax
jne 0x4568
cmpl $0x11, %ebp
jae 0x4579
movl %ecx, 0x18(%r14)
movq %r15, %rdi
callq 0x367d
movq %rax, 0x38(%rsp)
movl (%rax), %eax
cmpl $0x7, %eax
je 0x400b
cmpl $0x8, %eax
je 0x3ff5
cmpl $0x1a, %eax
jne 0x462b
xorl %r14d, %r14d
movq %r15, %rdi
callq 0x367d
movq %rax, %r13
testl %r14d, %r14d
jne 0x3fae
movl (%r13), %eax
addl $-0x7, %eax
cmpl $0x1, %eax
ja 0x3fae
movq 0x20(%rsp), %rax
movq 0x38(%rsp), %rcx
movslq 0x14(%rcx), %rcx
movq (%rax), %rdi
addq %rcx, %rdi
movslq 0x10(%r13), %rsi
subq %rcx, %rsi
callq 0x4eb8
movq 0x78(%rsp), %rcx
movq %rax, (%rcx,%rbp,8)
movl $0x9, %r12d
xorl %r14d, %r14d
cmpl $0x7, (%r13)
jne 0x3fd9
movl $0x1, %esi
movq %r15, %rdi
callq 0x36fe
movb $0x1, %al
movq %rax, 0x30(%rsp)
jmp 0x3fd9
movl (%r13), %edi
xorl %ecx, %ecx
cmpl $0x6, %edi
sete %sil
xorl %eax, %eax
cmpl $0x7, %edi
sete %dl
testl %edi, %edi
je 0x4516
movb %sil, %cl
addl %ecx, %r14d
movb %dl, %al
subl %eax, %r14d
xorl %r12d, %r12d
testl %r12d, %r12d
je 0x3f43
cmpl $0x9, %r12d
jne 0x3feb
xorl %r12d, %r12d
movq 0x28(%rsp), %r14
testl %r12d, %r12d
jne 0x401e
testb $0x1, 0x30(%rsp)
movl $0x0, %r12d
movl $0x7, %eax
cmovnel %eax, %r12d
jmp 0x401e
movl $0x1, %esi
movq %r15, %rdi
callq 0x36fe
movl $0x7, %r12d
testl %r12d, %r12d
je 0x3eb9
cmpl $0x7, %r12d
jne 0x44fc
leaq 0x10(%rsp), %rdi
callq 0x367d
cmpl $0x7, (%rax)
jne 0x4630
movq 0x20(%rsp), %rcx
addq $0x14, %rax
jmp 0x44a3
decq %r14
xorl %r13d, %r13d
xorl %ebp, %ebp
movb $0x0, 0x60(%rsp)
movq %rdi, %r12
movq %r14, %rsi
leaq 0x60(%rsp), %rdx
callq 0x46f3
movq %rax, %r15
movb 0x60(%rsp), %bl
cmpb $0x1, %bl
jne 0x409f
testq %r13, %r13
je 0x4088
movq %r13, %rdi
callq 0x21a0
leal 0x1(%rbp), %esi
cmpl $0x100, %ebp            # imm = 0x100
jge 0x4501
movq %r15, %r13
movl %esi, %ebp
movq %r15, %r14
testb %bl, %bl
movq %r12, %rdi
jne 0x405a
testq %r13, %r13
je 0x44e7
movq %r13, %rdi
callq 0x21a0
jmp 0x44e7
cmpb $0x1, 0x14(%rbx)
jne 0x44bd
leaq 0x10(%rsp), %r15
movq %r15, %rdi
callq 0x367d
movq %rax, %r14
movq %r15, %rdi
callq 0x367d
cmpl $0x23, (%r14)
jne 0x45c2
cmpl $0x0, (%rax)
jne 0x45c2
movq 0x8(%r14), %rsi
movq %rbx, %rdi
callq 0x4eeb
testb %al, %al
jne 0x44bd
movq 0x8(%r14), %rsi
movl 0x10(%rbx), %edx
incl %edx
leaq 0xa272(%rip), %rdi      # 0xe387
jmp 0x4640
leaq 0x10(%rsp), %rdi
callq 0x367d
cmpl $0x0, (%rax)
jne 0x45b1
movl 0x18(%rbx), %eax
testl %eax, %eax
jle 0x45d3
decl %eax
movl %eax, 0x18(%rbx)
movb 0x1c(%rbx,%rax,8), %al
movb %al, 0x14(%rbx)
jmp 0x44bd
leaq 0x10(%rsp), %r15
movq %r15, %rdi
callq 0x367d
movq %rax, %r14
movq %r15, %rdi
callq 0x367d
cmpl $0x23, (%r14)
jne 0x45a0
cmpl $0x0, (%rax)
jne 0x45a0
movq %rbx, %r15
movl 0x18(%rbx), %ebx
cmpq $0x10, %rbx
jae 0x45e9
movq 0x8(%r14), %rsi
movq %r15, %rdi
callq 0x50b9
testq %rax, %rax
setne %al
leaq 0x1(%rbx), %rcx
movl %ecx, 0x18(%r15)
andb 0x14(%r15), %al
movb %al, 0x24(%r15,%rbx,8)
movl 0x10(%r15), %ecx
movl %ecx, 0x28(%r15,%rbx,8)
movb %al, 0x14(%r15)
jmp 0x44bd
cmpb $0x1, 0x14(%rbx)
jne 0x446e
movslq 0x14(%r15), %rax
addq %rax, %r14
movq %rbx, %rdi
movq %r14, %rsi
xorl %edx, %edx
callq 0x3cce
testq %rax, %rax
movq %rbx, %r13
je 0x4658
movq %rax, %r14
xorps %xmm0, %xmm0
leaq 0x40(%rsp), %rbx
movaps %xmm0, (%rbx)
xorl %r12d, %r12d
movq %r12, 0x10(%rbx)
leaq 0x80(%rsp), %r15
movq %r12, 0x10(%r15)
movaps %xmm0, (%r15)
movq %rax, (%rbx)
movq %r12, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movl $0x10, %edi
callq 0x21d0
xorps %xmm0, %xmm0
movups %xmm0, (%rax)
movq %rax, (%r15)
movq %r12, 0x8(%r15)
movq %rbx, 0x10(%r15)
movl 0x10(%r13), %eax
movl %eax, 0xc(%rbx)
movq %r15, %rdi
callq 0x5ea4
testq %rax, %rax
je 0x4678
movq %rax, %r15
movq %rax, %rdi
callq 0x4f51
testq %rax, %rax
je 0x468b
movq %rax, %r12
movq %rax, %rdi
callq 0x4fd1
movl %eax, %ebp
movq %r15, %rdi
callq 0x5032
movq %r12, %rdi
callq 0x507f
leaq 0x80(%rsp), %rdi
callq 0x3634
xorps %xmm0, %xmm0
movaps %xmm0, 0x40(%rsp)
movq $0x0, 0x50(%rsp)
movq %r14, %rdi
callq 0x21a0
movq 0x8(%rsp), %rbx
jmp 0x4470
cmpb $0x1, 0x14(%rbx)
jne 0x44bd
leaq 0x10(%rsp), %rdi
callq 0x367d
cmpl $0x23, (%rax)
jne 0x466a
movq %rax, %r15
leaq 0x10(%rsp), %rdi
callq 0x367d
movl (%rax), %ecx
testl %ecx, %ecx
je 0x43ec
cmpl $0x1a, %ecx
jne 0x469e
movslq 0x14(%rax), %rax
addq %rax, %r14
movq %rbx, %rdi
movq %r14, %rsi
xorl %edx, %edx
callq 0x3cce
testq %rax, %rax
movq %rbx, %rbp
je 0x46ac
movq %rax, %r14
xorps %xmm0, %xmm0
leaq 0x40(%rsp), %rbx
movaps %xmm0, (%rbx)
xorl %r13d, %r13d
movq %r13, 0x10(%rbx)
leaq 0x80(%rsp), %r12
movq %r13, 0x10(%r12)
movaps %xmm0, (%r12)
movq %rax, (%rbx)
movq %r13, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movl $0x10, %edi
callq 0x21d0
xorps %xmm0, %xmm0
movups %xmm0, (%rax)
movq %rax, (%r12)
movq %r13, 0x8(%r12)
movq %rbx, 0x10(%r12)
movl 0x10(%rbp), %eax
movl %eax, 0xc(%rbx)
movq %r12, %rdi
callq 0x5ea4
testq %rax, %rax
je 0x46ba
movq %rax, %r12
movq %rax, %rdi
callq 0x4f51
testq %rax, %rax
je 0x46cd
movq %rax, %r13
movq %rax, %rdi
callq 0x5109
movl (%r13), %eax
cmpl $0x4, %eax
movq 0x8(%rsp), %rbx
jne 0x439f
movq 0x8(%r13), %rax
movl 0x8(%rax), %eax
cmpl $0x1, %eax
jne 0x46e0
movq %r13, %rdi
callq 0x51df
movl %eax, 0x9c(%rbx)
movq %r12, %rdi
callq 0x5032
movq %r13, %rdi
callq 0x507f
leaq 0x80(%rsp), %rdi
callq 0x3634
xorps %xmm0, %xmm0
movaps %xmm0, 0x40(%rsp)
movq $0x0, 0x50(%rsp)
movq %r14, %rdi
callq 0x21a0
movl $0xa0, %edi
callq 0x21d0
movq %rax, %r14
xorl %eax, %eax
movq %rax, (%r14)
movb $0x0, 0x8(%r14)
movl $0x0, 0x18(%r14)
xorps %xmm0, %xmm0
movups %xmm0, 0x20(%r14)
movups %xmm0, 0x30(%r14)
movups %xmm0, 0x40(%r14)
movups %xmm0, 0x50(%r14)
movups %xmm0, 0x60(%r14)
movups %xmm0, 0x70(%r14)
movups %xmm0, 0x80(%r14)
movups %xmm0, 0x90(%r14)
movq %rax, 0x10(%r14)
movq 0x8(%r15), %rdi
callq 0x3a4c
movq %rax, (%r14)
movl 0x9c(%rbx), %edi
callq 0x523a
movq %rax, 0x10(%r14)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x3a84
incl 0x9c(%rbx)
jmp 0x44bd
xorl %ebp, %ebp
movl 0x18(%rbx), %eax
cmpq $0x10, %rax
jae 0x45e4
leaq 0x1(%rax), %rcx
movl %ecx, 0x18(%rbx)
andb 0x14(%rbx), %bpl
movb %bpl, 0x24(%rbx,%rax,8)
movl 0x10(%rbx), %ecx
movl %ecx, 0x28(%rbx,%rax,8)
movb %bpl, 0x14(%rbx)
jmp 0x44bd
movq 0x20(%rsp), %rcx
addq $0x10, %rax
movslq (%rax), %rdi
addq (%rcx), %rdi
callq 0x3a4c
movq %rax, 0x10(%r14)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x3a84
leaq 0x10(%rsp), %rdi
callq 0x3634
xorps %xmm0, %xmm0
movaps %xmm0, 0x60(%rsp)
movq $0x0, 0x70(%rsp)
leaq 0x8c72(%rip), %rdi      # 0xd151
callq 0x3a4c
movq %rax, %r15
movq %r15, %rax
addq $0x98, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
xorl %r15d, %r15d
jmp 0x44e7
movl 0x10(%r12), %edx
incl %edx
leaq 0x994c(%rip), %rdi      # 0xde5b
xorl %eax, %eax
callq 0x34a8
movl 0x10(%rbx), %esi
incl %esi
leaq 0x9d01(%rip), %rdi      # 0xe223
jmp 0x46ec
movq 0x8(%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x99af(%rip), %rdi      # 0xdee7
jmp 0x46ec
movl 0x10(%rbx), %esi
incl %esi
leaq 0x9b7e(%rip), %rdi      # 0xe0c7
jmp 0x46ec
testl %eax, %eax
jne 0x458a
movq 0x8(%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x9a88(%rip), %rdi      # 0xdfeb
jmp 0x46ec
movl 0x10(%rbx), %esi
incl %esi
leaq 0x9be0(%rip), %rdi      # 0xe154
jmp 0x46ec
movl 0x10(%rbx), %esi
incl %esi
leaq 0x9c41(%rip), %rdi      # 0xe1c6
jmp 0x46ec
movq 0x8(%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x9ac0(%rip), %rdi      # 0xe05b
jmp 0x46ec
movl 0x10(%rbx), %esi
incl %esi
leaq 0x9f5d(%rip), %rdi      # 0xe509
jmp 0x46ec
movl 0x10(%rbx), %esi
incl %esi
leaq 0x9f9d(%rip), %rdi      # 0xe55a
jmp 0x46ec
movl 0x10(%rbx), %esi
incl %esi
leaq 0x9d68(%rip), %rdi      # 0xe336
jmp 0x46ec
movl 0x10(%rbx), %esi
incl %esi
leaq 0x9fd7(%rip), %rdi      # 0xe5b6
jmp 0x46ec
movl 0x10(%rbx), %esi
jmp 0x45ed
movl 0x10(%r15), %esi
incl %esi
leaq 0x9ec2(%rip), %rdi      # 0xe4b8
jmp 0x46ec
movl 0x10(%rbx), %edx
incl %edx
leaq 0x9942(%rip), %rdi      # 0xdf49
movq %r12, %rsi
jmp 0x4640
leaq 0xa1e4(%rip), %rdi      # 0xe7f7
leaq 0x92bf(%rip), %rsi      # 0xd8d9
leaq 0xa1dc(%rip), %rcx      # 0xe7fd
movl $0xa4c, %edx            # imm = 0xA4C
callq 0x20f0
movq 0x38(%rsp), %rax
movq 0x8(%rax), %rsi
movl 0x10(%rbx), %edx
incl %edx
leaq 0x9c6a(%rip), %rdi      # 0xe2aa
xorl %eax, %eax
callq 0x34a8
movl 0x10(%rbx), %esi
incl %esi
leaq 0x9940(%rip), %rdi      # 0xdf93
jmp 0x46ec
movl 0x10(%r13), %esi
incl %esi
leaq 0x9d75(%rip), %rdi      # 0xe3da
jmp 0x46ec
movl 0x10(%rbx), %esi
incl %esi
leaq 0x9f97(%rip), %rdi      # 0xe60d
jmp 0x46ec
movq 0x8(%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x9da2(%rip), %rdi      # 0xe42b
jmp 0x46ec
movq 0x8(%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x9dd7(%rip), %rdi      # 0xe473
jmp 0x46ec
movl 0x10(%rbx), %esi
incl %esi
leaq 0xa0f3(%rip), %rdi      # 0xe79d
jmp 0x46ec
movl 0x10(%rbp), %esi
incl %esi
leaq 0x9fa5(%rip), %rdi      # 0xe65d
jmp 0x46ec
movq 0x8(%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0x9fe5(%rip), %rdi      # 0xe6b0
jmp 0x46ec
movq 0x8(%rsp), %rax
movl 0x10(%rax), %esi
incl %esi
leaq 0xa01c(%rip), %rdi      # 0xe6fa
jmp 0x46ec
movl 0x10(%rbx), %esi
incl %esi
leaq 0xa055(%rip), %rdi      # 0xe741
xorl %eax, %eax
callq 0x34a8