OPTION	DOTNAME
.text$	SEGMENT ALIGN(64) 'CODE'

ALIGN	16
_x86_64_AES_encrypt	PROC PRIVATE
	xor	eax,DWORD PTR[r15]
	xor	ebx,DWORD PTR[4+r15]
	xor	ecx,DWORD PTR[8+r15]
	xor	edx,DWORD PTR[12+r15]

	mov	r13d,DWORD PTR[240+r15]
	sub	r13d,1
	jmp	$L$enc_loop
ALIGN	16
$L$enc_loop::

	movzx	esi,al
	movzx	edi,bl
	movzx	ebp,cl
	mov	r10d,DWORD PTR[rsi*8+r14]
	mov	r11d,DWORD PTR[rdi*8+r14]
	mov	r12d,DWORD PTR[rbp*8+r14]

	movzx	esi,bh
	movzx	edi,ch
	movzx	ebp,dl
	xor	r10d,DWORD PTR[3+rsi*8+r14]
	xor	r11d,DWORD PTR[3+rdi*8+r14]
	mov	r8d,DWORD PTR[rbp*8+r14]

	movzx	esi,dh
	shr	ecx,16
	movzx	ebp,ah
	xor	r12d,DWORD PTR[3+rsi*8+r14]
	shr	edx,16
	xor	r8d,DWORD PTR[3+rbp*8+r14]

	shr	ebx,16
	lea	r15,QWORD PTR[16+r15]
	shr	eax,16

	movzx	esi,cl
	movzx	edi,dl
	movzx	ebp,al
	xor	r10d,DWORD PTR[2+rsi*8+r14]
	xor	r11d,DWORD PTR[2+rdi*8+r14]
	xor	r12d,DWORD PTR[2+rbp*8+r14]

	movzx	esi,dh
	movzx	edi,ah
	movzx	ebp,bl
	xor	r10d,DWORD PTR[1+rsi*8+r14]
	xor	r11d,DWORD PTR[1+rdi*8+r14]
	xor	r8d,DWORD PTR[2+rbp*8+r14]

	mov	edx,DWORD PTR[12+r15]
	movzx	edi,bh
	movzx	ebp,ch
	mov	eax,DWORD PTR[r15]
	xor	r12d,DWORD PTR[1+rdi*8+r14]
	xor	r8d,DWORD PTR[1+rbp*8+r14]

	mov	ebx,DWORD PTR[4+r15]
	mov	ecx,DWORD PTR[8+r15]
	xor	eax,r10d
	xor	ebx,r11d
	xor	ecx,r12d
	xor	edx,r8d
	sub	r13d,1
	jnz	$L$enc_loop
	movzx	esi,al
	movzx	edi,bl
	movzx	ebp,cl
	movzx	r10d,BYTE PTR[2+rsi*8+r14]
	movzx	r11d,BYTE PTR[2+rdi*8+r14]
	movzx	r12d,BYTE PTR[2+rbp*8+r14]

	movzx	esi,dl
	movzx	edi,bh
	movzx	ebp,ch
	movzx	r8d,BYTE PTR[2+rsi*8+r14]
	mov	edi,DWORD PTR[rdi*8+r14]
	mov	ebp,DWORD PTR[rbp*8+r14]

	and	edi,00000ff00h
	and	ebp,00000ff00h

	xor	r10d,edi
	xor	r11d,ebp
	shr	ecx,16

	movzx	esi,dh
	movzx	edi,ah
	shr	edx,16
	mov	esi,DWORD PTR[rsi*8+r14]
	mov	edi,DWORD PTR[rdi*8+r14]

	and	esi,00000ff00h
	and	edi,00000ff00h
	shr	ebx,16
	xor	r12d,esi
	xor	r8d,edi
	shr	eax,16

	movzx	esi,cl
	movzx	edi,dl
	movzx	ebp,al
	mov	esi,DWORD PTR[rsi*8+r14]
	mov	edi,DWORD PTR[rdi*8+r14]
	mov	ebp,DWORD PTR[rbp*8+r14]

	and	esi,000ff0000h
	and	edi,000ff0000h
	and	ebp,000ff0000h

	xor	r10d,esi
	xor	r11d,edi
	xor	r12d,ebp

	movzx	esi,bl
	movzx	edi,dh
	movzx	ebp,ah
	mov	esi,DWORD PTR[rsi*8+r14]
	mov	edi,DWORD PTR[2+rdi*8+r14]
	mov	ebp,DWORD PTR[2+rbp*8+r14]

	and	esi,000ff0000h
	and	edi,0ff000000h
	and	ebp,0ff000000h

	xor	r8d,esi
	xor	r10d,edi
	xor	r11d,ebp

	movzx	esi,bh
	movzx	edi,ch
	mov	edx,DWORD PTR[((16+12))+r15]
	mov	esi,DWORD PTR[2+rsi*8+r14]
	mov	edi,DWORD PTR[2+rdi*8+r14]
	mov	eax,DWORD PTR[((16+0))+r15]

	and	esi,0ff000000h
	and	edi,0ff000000h

	xor	r12d,esi
	xor	r8d,edi

	mov	ebx,DWORD PTR[((16+4))+r15]
	mov	ecx,DWORD PTR[((16+8))+r15]
	xor	eax,r10d
	xor	ebx,r11d
	xor	ecx,r12d
	xor	edx,r8d
DB	0f3h,0c3h

_x86_64_AES_encrypt	ENDP

ALIGN	16
_x86_64_AES_encrypt_compact	PROC PRIVATE
	lea	r8,QWORD PTR[128+r14]
	mov	edi,DWORD PTR[((0-128))+r8]
	mov	ebp,DWORD PTR[((32-128))+r8]
	mov	r10d,DWORD PTR[((64-128))+r8]
	mov	r11d,DWORD PTR[((96-128))+r8]
	mov	edi,DWORD PTR[((128-128))+r8]
	mov	ebp,DWORD PTR[((160-128))+r8]
	mov	r10d,DWORD PTR[((192-128))+r8]
	mov	r11d,DWORD PTR[((224-128))+r8]
	jmp	$L$enc_loop_compact
ALIGN	16
$L$enc_loop_compact::
	xor	eax,DWORD PTR[r15]
	xor	ebx,DWORD PTR[4+r15]
	xor	ecx,DWORD PTR[8+r15]
	xor	edx,DWORD PTR[12+r15]
	lea	r15,QWORD PTR[16+r15]
	movzx	r10d,al
	movzx	r11d,bl
	movzx	r12d,cl
	movzx	r10d,BYTE PTR[r10*1+r14]
	movzx	r11d,BYTE PTR[r11*1+r14]
	movzx	r12d,BYTE PTR[r12*1+r14]

	movzx	r8d,dl
	movzx	esi,bh
	movzx	edi,ch
	movzx	r8d,BYTE PTR[r8*1+r14]
	movzx	r9d,BYTE PTR[rsi*1+r14]
	movzx	r13d,BYTE PTR[rdi*1+r14]

	movzx	ebp,dh
	movzx	esi,ah
	shr	ecx,16
	movzx	ebp,BYTE PTR[rbp*1+r14]
	movzx	esi,BYTE PTR[rsi*1+r14]
	shr	edx,16

	movzx	edi,cl
	shl	r9d,8
	shl	r13d,8
	movzx	edi,BYTE PTR[rdi*1+r14]
	xor	r10d,r9d
	xor	r11d,r13d

	movzx	r9d,dl
	shr	eax,16
	shr	ebx,16
	movzx	r13d,al
	shl	ebp,8
	shl	esi,8
	movzx	r9d,BYTE PTR[r9*1+r14]
	movzx	r13d,BYTE PTR[r13*1+r14]
	xor	r12d,ebp
	xor	r8d,esi

	movzx	ebp,bl
	movzx	esi,dh
	shl	edi,16
	movzx	ebp,BYTE PTR[rbp*1+r14]
	movzx	esi,BYTE PTR[rsi*1+r14]
	xor	r10d,edi

	movzx	edi,ah
	shr	ecx,8
	shr	ebx,8
	movzx	edi,BYTE PTR[rdi*1+r14]
	movzx	edx,BYTE PTR[rcx*1+r14]
	movzx	ecx,BYTE PTR[rbx*1+r14]
	shl	r9d,16
	shl	r13d,16
	shl	ebp,16
	xor	r11d,r9d
	xor	r12d,r13d
	xor	r8d,ebp

	shl	esi,24
	shl	edi,24
	shl	edx,24
	xor	r10d,esi
	shl	ecx,24
	xor	r11d,edi
	mov	eax,r10d
	mov	ebx,r11d
	xor	ecx,r12d
	xor	edx,r8d
	cmp	r15,QWORD PTR[16+rsp]
	je	$L$enc_compact_done
	mov	esi,eax
	mov	edi,ebx
	and	esi,080808080h
	and	edi,080808080h
	mov	r10d,esi
	mov	r11d,edi
	shr	r10d,7
	lea	r8d,DWORD PTR[rax*1+rax]
	shr	r11d,7
	lea	r9d,DWORD PTR[rbx*1+rbx]
	sub	esi,r10d
	sub	edi,r11d
	and	r8d,0fefefefeh
	and	r9d,0fefefefeh
	and	esi,01b1b1b1bh
	and	edi,01b1b1b1bh
	mov	r10d,eax
	mov	r11d,ebx
	xor	r8d,esi
	xor	r9d,edi

	xor	eax,r8d
	xor	ebx,r9d
	mov	esi,ecx
	mov	edi,edx
	rol	eax,24
	rol	ebx,24
	and	esi,080808080h
	and	edi,080808080h
	xor	eax,r8d
	xor	ebx,r9d
	mov	r12d,esi
	mov	ebp,edi
	ror	r10d,16
	ror	r11d,16
	shr	r12d,7
	lea	r8d,DWORD PTR[rcx*1+rcx]
	xor	eax,r10d
	xor	ebx,r11d
	shr	ebp,7
	lea	r9d,DWORD PTR[rdx*1+rdx]
	ror	r10d,8
	ror	r11d,8
	sub	esi,r12d
	sub	edi,ebp
	xor	eax,r10d
	xor	ebx,r11d

	and	r8d,0fefefefeh
	and	r9d,0fefefefeh
	and	esi,01b1b1b1bh
	and	edi,01b1b1b1bh
	mov	r12d,ecx
	mov	ebp,edx
	xor	r8d,esi
	xor	r9d,edi

	xor	ecx,r8d
	xor	edx,r9d
	rol	ecx,24
	rol	edx,24
	xor	ecx,r8d
	xor	edx,r9d
	mov	esi,DWORD PTR[r14]
	ror	r12d,16
	ror	ebp,16
	mov	edi,DWORD PTR[64+r14]
	xor	ecx,r12d
	xor	edx,ebp
	mov	r8d,DWORD PTR[128+r14]
	ror	r12d,8
	ror	ebp,8
	mov	r9d,DWORD PTR[192+r14]
	xor	ecx,r12d
	xor	edx,ebp
	jmp	$L$enc_loop_compact
ALIGN	16
$L$enc_compact_done::
	xor	eax,DWORD PTR[r15]
	xor	ebx,DWORD PTR[4+r15]
	xor	ecx,DWORD PTR[8+r15]
	xor	edx,DWORD PTR[12+r15]
DB	0f3h,0c3h

_x86_64_AES_encrypt_compact	ENDP
PUBLIC	AES_encrypt

ALIGN	16
PUBLIC	asm_AES_encrypt

asm_AES_encrypt::
AES_encrypt	PROC PUBLIC
	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
	mov	QWORD PTR[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_AES_encrypt::
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8


	push	rbx
	push	rbp
	push	r12
	push	r13
	push	r14
	push	r15


	mov	r10,rsp
	lea	rcx,QWORD PTR[((-63))+rdx]
	and	rsp,-64
	sub	rcx,rsp
	neg	rcx
	and	rcx,03c0h
	sub	rsp,rcx
	sub	rsp,32

	mov	QWORD PTR[16+rsp],rsi
	mov	QWORD PTR[24+rsp],r10
$L$enc_prologue::

	mov	r15,rdx
	mov	r13d,DWORD PTR[240+r15]

	mov	eax,DWORD PTR[rdi]
	mov	ebx,DWORD PTR[4+rdi]
	mov	ecx,DWORD PTR[8+rdi]
	mov	edx,DWORD PTR[12+rdi]

	shl	r13d,4
	lea	rbp,QWORD PTR[r13*1+r15]
	mov	QWORD PTR[rsp],r15
	mov	QWORD PTR[8+rsp],rbp


	lea	r14,QWORD PTR[(($L$AES_Te+2048))]
	lea	rbp,QWORD PTR[768+rsp]
	sub	rbp,r14
	and	rbp,0300h
	lea	r14,QWORD PTR[rbp*1+r14]

	call	_x86_64_AES_encrypt_compact

	mov	r9,QWORD PTR[16+rsp]
	mov	rsi,QWORD PTR[24+rsp]
	mov	DWORD PTR[r9],eax
	mov	DWORD PTR[4+r9],ebx
	mov	DWORD PTR[8+r9],ecx
	mov	DWORD PTR[12+r9],edx

	mov	r15,QWORD PTR[rsi]
	mov	r14,QWORD PTR[8+rsi]
	mov	r13,QWORD PTR[16+rsi]
	mov	r12,QWORD PTR[24+rsi]
	mov	rbp,QWORD PTR[32+rsi]
	mov	rbx,QWORD PTR[40+rsi]
	lea	rsp,QWORD PTR[48+rsi]
$L$enc_epilogue::
	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
	mov	rsi,QWORD PTR[16+rsp]
	DB	0F3h,0C3h		;repret
$L$SEH_end_AES_encrypt::
AES_encrypt	ENDP

ALIGN	16
_x86_64_AES_decrypt	PROC PRIVATE
	xor	eax,DWORD PTR[r15]
	xor	ebx,DWORD PTR[4+r15]
	xor	ecx,DWORD PTR[8+r15]
	xor	edx,DWORD PTR[12+r15]

	mov	r13d,DWORD PTR[240+r15]
	sub	r13d,1
	jmp	$L$dec_loop
ALIGN	16
$L$dec_loop::

	movzx	esi,al
	movzx	edi,bl
	movzx	ebp,cl
	mov	r10d,DWORD PTR[rsi*8+r14]
	mov	r11d,DWORD PTR[rdi*8+r14]
	mov	r12d,DWORD PTR[rbp*8+r14]

	movzx	esi,dh
	movzx	edi,ah
	movzx	ebp,dl
	xor	r10d,DWORD PTR[3+rsi*8+r14]
	xor	r11d,DWORD PTR[3+rdi*8+r14]
	mov	r8d,DWORD PTR[rbp*8+r14]

	movzx	esi,bh
	shr	eax,16
	movzx	ebp,ch
	xor	r12d,DWORD PTR[3+rsi*8+r14]
	shr	edx,16
	xor	r8d,DWORD PTR[3+rbp*8+r14]

	shr	ebx,16
	lea	r15,QWORD PTR[16+r15]
	shr	ecx,16

	movzx	esi,cl
	movzx	edi,dl
	movzx	ebp,al
	xor	r10d,DWORD PTR[2+rsi*8+r14]
	xor	r11d,DWORD PTR[2+rdi*8+r14]
	xor	r12d,DWORD PTR[2+rbp*8+r14]

	movzx	esi,bh
	movzx	edi,ch
	movzx	ebp,bl
	xor	r10d,DWORD PTR[1+rsi*8+r14]
	xor	r11d,DWORD PTR[1+rdi*8+r14]
	xor	r8d,DWORD PTR[2+rbp*8+r14]

	movzx	esi,dh
	mov	edx,DWORD PTR[12+r15]
	movzx	ebp,ah
	xor	r12d,DWORD PTR[1+rsi*8+r14]
	mov	eax,DWORD PTR[r15]
	xor	r8d,DWORD PTR[1+rbp*8+r14]

	xor	eax,r10d
	mov	ebx,DWORD PTR[4+r15]
	mov	ecx,DWORD PTR[8+r15]
	xor	ecx,r12d
	xor	ebx,r11d
	xor	edx,r8d
	sub	r13d,1
	jnz	$L$dec_loop
	lea	r14,QWORD PTR[2048+r14]
	movzx	esi,al
	movzx	edi,bl
	movzx	ebp,cl
	movzx	r10d,BYTE PTR[rsi*1+r14]
	movzx	r11d,BYTE PTR[rdi*1+r14]
	movzx	r12d,BYTE PTR[rbp*1+r14]

	movzx	esi,dl
	movzx	edi,dh
	movzx	ebp,ah
	movzx	r8d,BYTE PTR[rsi*1+r14]
	movzx	edi,BYTE PTR[rdi*1+r14]
	movzx	ebp,BYTE PTR[rbp*1+r14]

	shl	edi,8
	shl	ebp,8

	xor	r10d,edi
	xor	r11d,ebp
	shr	edx,16

	movzx	esi,bh
	movzx	edi,ch
	shr	eax,16
	movzx	esi,BYTE PTR[rsi*1+r14]
	movzx	edi,BYTE PTR[rdi*1+r14]

	shl	esi,8
	shl	edi,8
	shr	ebx,16
	xor	r12d,esi
	xor	r8d,edi
	shr	ecx,16

	movzx	esi,cl
	movzx	edi,dl
	movzx	ebp,al
	movzx	esi,BYTE PTR[rsi*1+r14]
	movzx	edi,BYTE PTR[rdi*1+r14]
	movzx	ebp,BYTE PTR[rbp*1+r14]

	shl	esi,16
	shl	edi,16
	shl	ebp,16

	xor	r10d,esi
	xor	r11d,edi
	xor	r12d,ebp

	movzx	esi,bl
	movzx	edi,bh
	movzx	ebp,ch
	movzx	esi,BYTE PTR[rsi*1+r14]
	movzx	edi,BYTE PTR[rdi*1+r14]
	movzx	ebp,BYTE PTR[rbp*1+r14]

	shl	esi,16
	shl	edi,24
	shl	ebp,24

	xor	r8d,esi
	xor	r10d,edi
	xor	r11d,ebp

	movzx	esi,dh
	movzx	edi,ah
	mov	edx,DWORD PTR[((16+12))+r15]
	movzx	esi,BYTE PTR[rsi*1+r14]
	movzx	edi,BYTE PTR[rdi*1+r14]
	mov	eax,DWORD PTR[((16+0))+r15]

	shl	esi,24
	shl	edi,24

	xor	r12d,esi
	xor	r8d,edi

	mov	ebx,DWORD PTR[((16+4))+r15]
	mov	ecx,DWORD PTR[((16+8))+r15]
	lea	r14,QWORD PTR[((-2048))+r14]
	xor	eax,r10d
	xor	ebx,r11d
	xor	ecx,r12d
	xor	edx,r8d
DB	0f3h,0c3h

_x86_64_AES_decrypt	ENDP

ALIGN	16
_x86_64_AES_decrypt_compact	PROC PRIVATE
	lea	r8,QWORD PTR[128+r14]
	mov	edi,DWORD PTR[((0-128))+r8]
	mov	ebp,DWORD PTR[((32-128))+r8]
	mov	r10d,DWORD PTR[((64-128))+r8]
	mov	r11d,DWORD PTR[((96-128))+r8]
	mov	edi,DWORD PTR[((128-128))+r8]
	mov	ebp,DWORD PTR[((160-128))+r8]
	mov	r10d,DWORD PTR[((192-128))+r8]
	mov	r11d,DWORD PTR[((224-128))+r8]
	jmp	$L$dec_loop_compact

ALIGN	16
$L$dec_loop_compact::
	xor	eax,DWORD PTR[r15]
	xor	ebx,DWORD PTR[4+r15]
	xor	ecx,DWORD PTR[8+r15]
	xor	edx,DWORD PTR[12+r15]
	lea	r15,QWORD PTR[16+r15]
	movzx	r10d,al
	movzx	r11d,bl
	movzx	r12d,cl
	movzx	r10d,BYTE PTR[r10*1+r14]
	movzx	r11d,BYTE PTR[r11*1+r14]
	movzx	r12d,BYTE PTR[r12*1+r14]

	movzx	r8d,dl
	movzx	esi,dh
	movzx	edi,ah
	movzx	r8d,BYTE PTR[r8*1+r14]
	movzx	r9d,BYTE PTR[rsi*1+r14]
	movzx	r13d,BYTE PTR[rdi*1+r14]

	movzx	ebp,bh
	movzx	esi,ch
	shr	ecx,16
	movzx	ebp,BYTE PTR[rbp*1+r14]
	movzx	esi,BYTE PTR[rsi*1+r14]
	shr	edx,16

	movzx	edi,cl
	shl	r9d,8
	shl	r13d,8
	movzx	edi,BYTE PTR[rdi*1+r14]
	xor	r10d,r9d
	xor	r11d,r13d

	movzx	r9d,dl
	shr	eax,16
	shr	ebx,16
	movzx	r13d,al
	shl	ebp,8
	shl	esi,8
	movzx	r9d,BYTE PTR[r9*1+r14]
	movzx	r13d,BYTE PTR[r13*1+r14]
	xor	r12d,ebp
	xor	r8d,esi

	movzx	ebp,bl
	movzx	esi,bh
	shl	edi,16
	movzx	ebp,BYTE PTR[rbp*1+r14]
	movzx	esi,BYTE PTR[rsi*1+r14]
	xor	r10d,edi

	movzx	edi,ch
	shl	r9d,16
	shl	r13d,16
	movzx	ebx,BYTE PTR[rdi*1+r14]
	xor	r11d,r9d
	xor	r12d,r13d

	movzx	edi,dh
	shr	eax,8
	shl	ebp,16
	movzx	ecx,BYTE PTR[rdi*1+r14]
	movzx	edx,BYTE PTR[rax*1+r14]
	xor	r8d,ebp

	shl	esi,24
	shl	ebx,24
	shl	ecx,24
	xor	r10d,esi
	shl	edx,24
	xor	ebx,r11d
	mov	eax,r10d
	xor	ecx,r12d
	xor	edx,r8d
	cmp	r15,QWORD PTR[16+rsp]
	je	$L$dec_compact_done

	mov	rsi,QWORD PTR[((256+0))+r14]
	shl	rbx,32
	shl	rdx,32
	mov	rdi,QWORD PTR[((256+8))+r14]
	or	rax,rbx
	or	rcx,rdx
	mov	rbp,QWORD PTR[((256+16))+r14]
	mov	rbx,rax
	mov	rdx,rcx
	and	rbx,rsi
	and	rdx,rsi
	mov	r9,rbx
	mov	r12,rdx
	shr	r9,7
	lea	r8,QWORD PTR[rax*1+rax]
	shr	r12,7
	lea	r11,QWORD PTR[rcx*1+rcx]
	sub	rbx,r9
	sub	rdx,r12
	and	r8,rdi
	and	r11,rdi
	and	rbx,rbp
	and	rdx,rbp
	xor	rbx,r8
	xor	rdx,r11
	mov	r8,rbx
	mov	r11,rdx

	and	rbx,rsi
	and	rdx,rsi
	mov	r10,rbx
	mov	r13,rdx
	shr	r10,7
	lea	r9,QWORD PTR[r8*1+r8]
	shr	r13,7
	lea	r12,QWORD PTR[r11*1+r11]
	sub	rbx,r10
	sub	rdx,r13
	and	r9,rdi
	and	r12,rdi
	and	rbx,rbp
	and	rdx,rbp
	xor	rbx,r9
	xor	rdx,r12
	mov	r9,rbx
	mov	r12,rdx

	and	rbx,rsi
	and	rdx,rsi
	mov	r10,rbx
	mov	r13,rdx
	shr	r10,7
	xor	r8,rax
	shr	r13,7
	xor	r11,rcx
	sub	rbx,r10
	sub	rdx,r13
	lea	r10,QWORD PTR[r9*1+r9]
	lea	r13,QWORD PTR[r12*1+r12]
	xor	r9,rax
	xor	r12,rcx
	and	r10,rdi
	and	r13,rdi
	and	rbx,rbp
	and	rdx,rbp
	xor	r10,rbx
	xor	r13,rdx

	xor	rax,r10
	xor	rcx,r13
	xor	r8,r10
	xor	r11,r13
	mov	rbx,rax
	mov	rdx,rcx
	xor	r9,r10
	xor	r12,r13
	shr	rbx,32
	shr	rdx,32
	xor	r10,r8
	xor	r13,r11
	rol	eax,8
	rol	ecx,8
	xor	r10,r9
	xor	r13,r12

	rol	ebx,8
	rol	edx,8
	xor	eax,r10d
	xor	ecx,r13d
	shr	r10,32
	shr	r13,32
	xor	ebx,r10d
	xor	edx,r13d

	mov	r10,r8
	mov	r13,r11
	shr	r10,32
	shr	r13,32
	rol	r8d,24
	rol	r11d,24
	rol	r10d,24
	rol	r13d,24
	xor	eax,r8d
	xor	ecx,r11d
	mov	r8,r9
	mov	r11,r12
	xor	ebx,r10d
	xor	edx,r13d

	mov	rsi,QWORD PTR[r14]
	shr	r8,32
	shr	r11,32
	mov	rdi,QWORD PTR[64+r14]
	rol	r9d,16
	rol	r12d,16
	mov	rbp,QWORD PTR[128+r14]
	rol	r8d,16
	rol	r11d,16
	mov	r10,QWORD PTR[192+r14]
	xor	eax,r9d
	xor	ecx,r12d
	mov	r13,QWORD PTR[256+r14]
	xor	ebx,r8d
	xor	edx,r11d
	jmp	$L$dec_loop_compact
ALIGN	16
$L$dec_compact_done::
	xor	eax,DWORD PTR[r15]
	xor	ebx,DWORD PTR[4+r15]
	xor	ecx,DWORD PTR[8+r15]
	xor	edx,DWORD PTR[12+r15]
DB	0f3h,0c3h

_x86_64_AES_decrypt_compact	ENDP
PUBLIC	AES_decrypt

ALIGN	16
PUBLIC	asm_AES_decrypt

asm_AES_decrypt::
AES_decrypt	PROC PUBLIC
	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
	mov	QWORD PTR[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_AES_decrypt::
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8


	push	rbx
	push	rbp
	push	r12
	push	r13
	push	r14
	push	r15


	mov	r10,rsp
	lea	rcx,QWORD PTR[((-63))+rdx]
	and	rsp,-64
	sub	rcx,rsp
	neg	rcx
	and	rcx,03c0h
	sub	rsp,rcx
	sub	rsp,32

	mov	QWORD PTR[16+rsp],rsi
	mov	QWORD PTR[24+rsp],r10
$L$dec_prologue::

	mov	r15,rdx
	mov	r13d,DWORD PTR[240+r15]

	mov	eax,DWORD PTR[rdi]
	mov	ebx,DWORD PTR[4+rdi]
	mov	ecx,DWORD PTR[8+rdi]
	mov	edx,DWORD PTR[12+rdi]

	shl	r13d,4
	lea	rbp,QWORD PTR[r13*1+r15]
	mov	QWORD PTR[rsp],r15
	mov	QWORD PTR[8+rsp],rbp


	lea	r14,QWORD PTR[(($L$AES_Td+2048))]
	lea	rbp,QWORD PTR[768+rsp]
	sub	rbp,r14
	and	rbp,0300h
	lea	r14,QWORD PTR[rbp*1+r14]
	shr	rbp,3
	add	r14,rbp

	call	_x86_64_AES_decrypt_compact

	mov	r9,QWORD PTR[16+rsp]
	mov	rsi,QWORD PTR[24+rsp]
	mov	DWORD PTR[r9],eax
	mov	DWORD PTR[4+r9],ebx
	mov	DWORD PTR[8+r9],ecx
	mov	DWORD PTR[12+r9],edx

	mov	r15,QWORD PTR[rsi]
	mov	r14,QWORD PTR[8+rsi]
	mov	r13,QWORD PTR[16+rsi]
	mov	r12,QWORD PTR[24+rsi]
	mov	rbp,QWORD PTR[32+rsi]
	mov	rbx,QWORD PTR[40+rsi]
	lea	rsp,QWORD PTR[48+rsi]
$L$dec_epilogue::
	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
	mov	rsi,QWORD PTR[16+rsp]
	DB	0F3h,0C3h		;repret
$L$SEH_end_AES_decrypt::
AES_decrypt	ENDP
PUBLIC	private_AES_set_encrypt_key

ALIGN	16
private_AES_set_encrypt_key	PROC PUBLIC
	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
	mov	QWORD PTR[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_private_AES_set_encrypt_key::
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8


	push	rbx
	push	rbp
	push	r12
	push	r13
	push	r14
	push	r15
	sub	rsp,8
$L$enc_key_prologue::

	call	_x86_64_AES_set_encrypt_key

	mov	r15,QWORD PTR[8+rsp]
	mov	r14,QWORD PTR[16+rsp]
	mov	r13,QWORD PTR[24+rsp]
	mov	r12,QWORD PTR[32+rsp]
	mov	rbp,QWORD PTR[40+rsp]
	mov	rbx,QWORD PTR[48+rsp]
	add	rsp,56
$L$enc_key_epilogue::
	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
	mov	rsi,QWORD PTR[16+rsp]
	DB	0F3h,0C3h		;repret
$L$SEH_end_private_AES_set_encrypt_key::
private_AES_set_encrypt_key	ENDP


ALIGN	16
_x86_64_AES_set_encrypt_key	PROC PRIVATE
	mov	ecx,esi
	mov	rsi,rdi
	mov	rdi,rdx

	test	rsi,-1
	jz	$L$badpointer
	test	rdi,-1
	jz	$L$badpointer

	lea	rbp,QWORD PTR[$L$AES_Te]
	lea	rbp,QWORD PTR[((2048+128))+rbp]


	mov	eax,DWORD PTR[((0-128))+rbp]
	mov	ebx,DWORD PTR[((32-128))+rbp]
	mov	r8d,DWORD PTR[((64-128))+rbp]
	mov	edx,DWORD PTR[((96-128))+rbp]
	mov	eax,DWORD PTR[((128-128))+rbp]
	mov	ebx,DWORD PTR[((160-128))+rbp]
	mov	r8d,DWORD PTR[((192-128))+rbp]
	mov	edx,DWORD PTR[((224-128))+rbp]

	cmp	ecx,128
	je	$L$10rounds
	cmp	ecx,192
	je	$L$12rounds
	cmp	ecx,256
	je	$L$14rounds
	mov	rax,-2
	jmp	$L$exit

$L$10rounds::
	mov	rax,QWORD PTR[rsi]
	mov	rdx,QWORD PTR[8+rsi]
	mov	QWORD PTR[rdi],rax
	mov	QWORD PTR[8+rdi],rdx

	shr	rdx,32
	xor	ecx,ecx
	jmp	$L$10shortcut
ALIGN	4
$L$10loop::
	mov	eax,DWORD PTR[rdi]
	mov	edx,DWORD PTR[12+rdi]
$L$10shortcut::
	movzx	esi,dl
	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	movzx	esi,dh
	shl	ebx,24
	xor	eax,ebx

	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	shr	edx,16
	movzx	esi,dl
	xor	eax,ebx

	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	movzx	esi,dh
	shl	ebx,8
	xor	eax,ebx

	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	shl	ebx,16
	xor	eax,ebx

	xor	eax,DWORD PTR[((1024-128))+rcx*4+rbp]
	mov	DWORD PTR[16+rdi],eax
	xor	eax,DWORD PTR[4+rdi]
	mov	DWORD PTR[20+rdi],eax
	xor	eax,DWORD PTR[8+rdi]
	mov	DWORD PTR[24+rdi],eax
	xor	eax,DWORD PTR[12+rdi]
	mov	DWORD PTR[28+rdi],eax
	add	ecx,1
	lea	rdi,QWORD PTR[16+rdi]
	cmp	ecx,10
	jl	$L$10loop

	mov	DWORD PTR[80+rdi],10
	xor	rax,rax
	jmp	$L$exit

$L$12rounds::
	mov	rax,QWORD PTR[rsi]
	mov	rbx,QWORD PTR[8+rsi]
	mov	rdx,QWORD PTR[16+rsi]
	mov	QWORD PTR[rdi],rax
	mov	QWORD PTR[8+rdi],rbx
	mov	QWORD PTR[16+rdi],rdx

	shr	rdx,32
	xor	ecx,ecx
	jmp	$L$12shortcut
ALIGN	4
$L$12loop::
	mov	eax,DWORD PTR[rdi]
	mov	edx,DWORD PTR[20+rdi]
$L$12shortcut::
	movzx	esi,dl
	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	movzx	esi,dh
	shl	ebx,24
	xor	eax,ebx

	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	shr	edx,16
	movzx	esi,dl
	xor	eax,ebx

	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	movzx	esi,dh
	shl	ebx,8
	xor	eax,ebx

	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	shl	ebx,16
	xor	eax,ebx

	xor	eax,DWORD PTR[((1024-128))+rcx*4+rbp]
	mov	DWORD PTR[24+rdi],eax
	xor	eax,DWORD PTR[4+rdi]
	mov	DWORD PTR[28+rdi],eax
	xor	eax,DWORD PTR[8+rdi]
	mov	DWORD PTR[32+rdi],eax
	xor	eax,DWORD PTR[12+rdi]
	mov	DWORD PTR[36+rdi],eax

	cmp	ecx,7
	je	$L$12break
	add	ecx,1

	xor	eax,DWORD PTR[16+rdi]
	mov	DWORD PTR[40+rdi],eax
	xor	eax,DWORD PTR[20+rdi]
	mov	DWORD PTR[44+rdi],eax

	lea	rdi,QWORD PTR[24+rdi]
	jmp	$L$12loop
$L$12break::
	mov	DWORD PTR[72+rdi],12
	xor	rax,rax
	jmp	$L$exit

$L$14rounds::
	mov	rax,QWORD PTR[rsi]
	mov	rbx,QWORD PTR[8+rsi]
	mov	rcx,QWORD PTR[16+rsi]
	mov	rdx,QWORD PTR[24+rsi]
	mov	QWORD PTR[rdi],rax
	mov	QWORD PTR[8+rdi],rbx
	mov	QWORD PTR[16+rdi],rcx
	mov	QWORD PTR[24+rdi],rdx

	shr	rdx,32
	xor	ecx,ecx
	jmp	$L$14shortcut
ALIGN	4
$L$14loop::
	mov	eax,DWORD PTR[rdi]
	mov	edx,DWORD PTR[28+rdi]
$L$14shortcut::
	movzx	esi,dl
	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	movzx	esi,dh
	shl	ebx,24
	xor	eax,ebx

	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	shr	edx,16
	movzx	esi,dl
	xor	eax,ebx

	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	movzx	esi,dh
	shl	ebx,8
	xor	eax,ebx

	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	shl	ebx,16
	xor	eax,ebx

	xor	eax,DWORD PTR[((1024-128))+rcx*4+rbp]
	mov	DWORD PTR[32+rdi],eax
	xor	eax,DWORD PTR[4+rdi]
	mov	DWORD PTR[36+rdi],eax
	xor	eax,DWORD PTR[8+rdi]
	mov	DWORD PTR[40+rdi],eax
	xor	eax,DWORD PTR[12+rdi]
	mov	DWORD PTR[44+rdi],eax

	cmp	ecx,6
	je	$L$14break
	add	ecx,1

	mov	edx,eax
	mov	eax,DWORD PTR[16+rdi]
	movzx	esi,dl
	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	movzx	esi,dh
	xor	eax,ebx

	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	shr	edx,16
	shl	ebx,8
	movzx	esi,dl
	xor	eax,ebx

	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	movzx	esi,dh
	shl	ebx,16
	xor	eax,ebx

	movzx	ebx,BYTE PTR[((-128))+rsi*1+rbp]
	shl	ebx,24
	xor	eax,ebx

	mov	DWORD PTR[48+rdi],eax
	xor	eax,DWORD PTR[20+rdi]
	mov	DWORD PTR[52+rdi],eax
	xor	eax,DWORD PTR[24+rdi]
	mov	DWORD PTR[56+rdi],eax
	xor	eax,DWORD PTR[28+rdi]
	mov	DWORD PTR[60+rdi],eax

	lea	rdi,QWORD PTR[32+rdi]
	jmp	$L$14loop
$L$14break::
	mov	DWORD PTR[48+rdi],14
	xor	rax,rax
	jmp	$L$exit

$L$badpointer::
	mov	rax,-1
$L$exit::
DB	0f3h,0c3h

_x86_64_AES_set_encrypt_key	ENDP
PUBLIC	private_AES_set_decrypt_key

ALIGN	16
private_AES_set_decrypt_key	PROC PUBLIC
	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
	mov	QWORD PTR[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_private_AES_set_decrypt_key::
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8


	push	rbx
	push	rbp
	push	r12
	push	r13
	push	r14
	push	r15
	push	rdx
$L$dec_key_prologue::

	call	_x86_64_AES_set_encrypt_key
	mov	r8,QWORD PTR[rsp]
	cmp	eax,0
	jne	$L$abort

	mov	r14d,DWORD PTR[240+r8]
	xor	rdi,rdi
	lea	rcx,QWORD PTR[r14*4+rdi]
	mov	rsi,r8
	lea	rdi,QWORD PTR[rcx*4+r8]
ALIGN	4
$L$invert::
	mov	rax,QWORD PTR[rsi]
	mov	rbx,QWORD PTR[8+rsi]
	mov	rcx,QWORD PTR[rdi]
	mov	rdx,QWORD PTR[8+rdi]
	mov	QWORD PTR[rdi],rax
	mov	QWORD PTR[8+rdi],rbx
	mov	QWORD PTR[rsi],rcx
	mov	QWORD PTR[8+rsi],rdx
	lea	rsi,QWORD PTR[16+rsi]
	lea	rdi,QWORD PTR[((-16))+rdi]
	cmp	rdi,rsi
	jne	$L$invert

	lea	rax,QWORD PTR[(($L$AES_Te+2048+1024))]

	mov	rsi,QWORD PTR[40+rax]
	mov	rdi,QWORD PTR[48+rax]
	mov	rbp,QWORD PTR[56+rax]

	mov	r15,r8
	sub	r14d,1
ALIGN	4
$L$permute::
	lea	r15,QWORD PTR[16+r15]
	mov	rax,QWORD PTR[r15]
	mov	rcx,QWORD PTR[8+r15]
	mov	rbx,rax
	mov	rdx,rcx
	and	rbx,rsi
	and	rdx,rsi
	mov	r9,rbx
	mov	r12,rdx
	shr	r9,7
	lea	r8,QWORD PTR[rax*1+rax]
	shr	r12,7
	lea	r11,QWORD PTR[rcx*1+rcx]
	sub	rbx,r9
	sub	rdx,r12
	and	r8,rdi
	and	r11,rdi
	and	rbx,rbp
	and	rdx,rbp
	xor	rbx,r8
	xor	rdx,r11
	mov	r8,rbx
	mov	r11,rdx

	and	rbx,rsi
	and	rdx,rsi
	mov	r10,rbx
	mov	r13,rdx
	shr	r10,7
	lea	r9,QWORD PTR[r8*1+r8]
	shr	r13,7
	lea	r12,QWORD PTR[r11*1+r11]
	sub	rbx,r10
	sub	rdx,r13
	and	r9,rdi
	and	r12,rdi
	and	rbx,rbp
	and	rdx,rbp
	xor	rbx,r9
	xor	rdx,r12
	mov	r9,rbx
	mov	r12,rdx

	and	rbx,rsi
	and	rdx,rsi
	mov	r10,rbx
	mov	r13,rdx
	shr	r10,7
	xor	r8,rax
	shr	r13,7
	xor	r11,rcx
	sub	rbx,r10
	sub	rdx,r13
	lea	r10,QWORD PTR[r9*1+r9]
	lea	r13,QWORD PTR[r12*1+r12]
	xor	r9,rax
	xor	r12,rcx
	and	r10,rdi
	and	r13,rdi
	and	rbx,rbp
	and	rdx,rbp
	xor	r10,rbx
	xor	r13,rdx

	xor	rax,r10
	xor	rcx,r13
	xor	r8,r10
	xor	r11,r13
	mov	rbx,rax
	mov	rdx,rcx
	xor	r9,r10
	xor	r12,r13
	shr	rbx,32
	shr	rdx,32
	xor	r10,r8
	xor	r13,r11
	rol	eax,8
	rol	ecx,8
	xor	r10,r9
	xor	r13,r12

	rol	ebx,8
	rol	edx,8
	xor	eax,r10d
	xor	ecx,r13d
	shr	r10,32
	shr	r13,32
	xor	ebx,r10d
	xor	edx,r13d

	mov	r10,r8
	mov	r13,r11
	shr	r10,32
	shr	r13,32
	rol	r8d,24
	rol	r11d,24
	rol	r10d,24
	rol	r13d,24
	xor	eax,r8d
	xor	ecx,r11d
	mov	r8,r9
	mov	r11,r12
	xor	ebx,r10d
	xor	edx,r13d


	shr	r8,32
	shr	r11,32

	rol	r9d,16
	rol	r12d,16

	rol	r8d,16
	rol	r11d,16

	xor	eax,r9d
	xor	ecx,r12d

	xor	ebx,r8d
	xor	edx,r11d
	mov	DWORD PTR[r15],eax
	mov	DWORD PTR[4+r15],ebx
	mov	DWORD PTR[8+r15],ecx
	mov	DWORD PTR[12+r15],edx
	sub	r14d,1
	jnz	$L$permute

	xor	rax,rax
$L$abort::
	mov	r15,QWORD PTR[8+rsp]
	mov	r14,QWORD PTR[16+rsp]
	mov	r13,QWORD PTR[24+rsp]
	mov	r12,QWORD PTR[32+rsp]
	mov	rbp,QWORD PTR[40+rsp]
	mov	rbx,QWORD PTR[48+rsp]
	add	rsp,56
$L$dec_key_epilogue::
	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
	mov	rsi,QWORD PTR[16+rsp]
	DB	0F3h,0C3h		;repret
$L$SEH_end_private_AES_set_decrypt_key::
private_AES_set_decrypt_key	ENDP
PUBLIC	AES_cbc_encrypt

ALIGN	16
EXTERN	OPENSSL_ia32cap_P:NEAR
PUBLIC	asm_AES_cbc_encrypt

asm_AES_cbc_encrypt::
AES_cbc_encrypt	PROC PUBLIC
	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
	mov	QWORD PTR[16+rsp],rsi
	mov	rax,rsp
$L$SEH_begin_AES_cbc_encrypt::
	mov	rdi,rcx
	mov	rsi,rdx
	mov	rdx,r8
	mov	rcx,r9
	mov	r8,QWORD PTR[40+rsp]
	mov	r9,QWORD PTR[48+rsp]


	cmp	rdx,0
	je	$L$cbc_epilogue
	pushfq
	push	rbx
	push	rbp
	push	r12
	push	r13
	push	r14
	push	r15
$L$cbc_prologue::

	cld
	mov	r9d,r9d

	lea	r14,QWORD PTR[$L$AES_Te]
	cmp	r9,0
	jne	$L$cbc_picked_te
	lea	r14,QWORD PTR[$L$AES_Td]
$L$cbc_picked_te::

	mov	r10d,DWORD PTR[OPENSSL_ia32cap_P]
	cmp	rdx,512
	jb	$L$cbc_slow_prologue
	test	rdx,15
	jnz	$L$cbc_slow_prologue
	bt	r10d,28
	jc	$L$cbc_slow_prologue


	lea	r15,QWORD PTR[((-88-248))+rsp]
	and	r15,-64


	mov	r10,r14
	lea	r11,QWORD PTR[2304+r14]
	mov	r12,r15
	and	r10,0FFFh
	and	r11,0FFFh
	and	r12,0FFFh

	cmp	r12,r11
	jb	$L$cbc_te_break_out
	sub	r12,r11
	sub	r15,r12
	jmp	$L$cbc_te_ok
$L$cbc_te_break_out::
	sub	r12,r10
	and	r12,0FFFh
	add	r12,320
	sub	r15,r12
ALIGN	4
$L$cbc_te_ok::

	xchg	r15,rsp

	mov	QWORD PTR[16+rsp],r15
$L$cbc_fast_body::
	mov	QWORD PTR[24+rsp],rdi
	mov	QWORD PTR[32+rsp],rsi
	mov	QWORD PTR[40+rsp],rdx
	mov	QWORD PTR[48+rsp],rcx
	mov	QWORD PTR[56+rsp],r8
	mov	DWORD PTR[((80+240))+rsp],0
	mov	rbp,r8
	mov	rbx,r9
	mov	r9,rsi
	mov	r8,rdi
	mov	r15,rcx

	mov	eax,DWORD PTR[240+r15]

	mov	r10,r15
	sub	r10,r14
	and	r10,0fffh
	cmp	r10,2304
	jb	$L$cbc_do_ecopy
	cmp	r10,4096-248
	jb	$L$cbc_skip_ecopy
ALIGN	4
$L$cbc_do_ecopy::
	mov	rsi,r15
	lea	rdi,QWORD PTR[80+rsp]
	lea	r15,QWORD PTR[80+rsp]
	mov	ecx,240/8
	DD	090A548F3h

	mov	DWORD PTR[rdi],eax
$L$cbc_skip_ecopy::
	mov	QWORD PTR[rsp],r15

	mov	ecx,18
ALIGN	4
$L$cbc_prefetch_te::
	mov	r10,QWORD PTR[r14]
	mov	r11,QWORD PTR[32+r14]
	mov	r12,QWORD PTR[64+r14]
	mov	r13,QWORD PTR[96+r14]
	lea	r14,QWORD PTR[128+r14]
	sub	ecx,1
	jnz	$L$cbc_prefetch_te
	lea	r14,QWORD PTR[((-2304))+r14]

	cmp	rbx,0
	je	$L$FAST_DECRYPT


	mov	eax,DWORD PTR[rbp]
	mov	ebx,DWORD PTR[4+rbp]
	mov	ecx,DWORD PTR[8+rbp]
	mov	edx,DWORD PTR[12+rbp]

ALIGN	4
$L$cbc_fast_enc_loop::
	xor	eax,DWORD PTR[r8]
	xor	ebx,DWORD PTR[4+r8]
	xor	ecx,DWORD PTR[8+r8]
	xor	edx,DWORD PTR[12+r8]
	mov	r15,QWORD PTR[rsp]
	mov	QWORD PTR[24+rsp],r8

	call	_x86_64_AES_encrypt

	mov	r8,QWORD PTR[24+rsp]
	mov	r10,QWORD PTR[40+rsp]
	mov	DWORD PTR[r9],eax
	mov	DWORD PTR[4+r9],ebx
	mov	DWORD PTR[8+r9],ecx
	mov	DWORD PTR[12+r9],edx

	lea	r8,QWORD PTR[16+r8]
	lea	r9,QWORD PTR[16+r9]
	sub	r10,16
	test	r10,-16
	mov	QWORD PTR[40+rsp],r10
	jnz	$L$cbc_fast_enc_loop
	mov	rbp,QWORD PTR[56+rsp]
	mov	DWORD PTR[rbp],eax
	mov	DWORD PTR[4+rbp],ebx
	mov	DWORD PTR[8+rbp],ecx
	mov	DWORD PTR[12+rbp],edx

	jmp	$L$cbc_fast_cleanup


ALIGN	16
$L$FAST_DECRYPT::
	cmp	r9,r8
	je	$L$cbc_fast_dec_in_place

	mov	QWORD PTR[64+rsp],rbp
ALIGN	4
$L$cbc_fast_dec_loop::
	mov	eax,DWORD PTR[r8]
	mov	ebx,DWORD PTR[4+r8]
	mov	ecx,DWORD PTR[8+r8]
	mov	edx,DWORD PTR[12+r8]
	mov	r15,QWORD PTR[rsp]
	mov	QWORD PTR[24+rsp],r8

	call	_x86_64_AES_decrypt

	mov	rbp,QWORD PTR[64+rsp]
	mov	r8,QWORD PTR[24+rsp]
	mov	r10,QWORD PTR[40+rsp]
	xor	eax,DWORD PTR[rbp]
	xor	ebx,DWORD PTR[4+rbp]
	xor	ecx,DWORD PTR[8+rbp]
	xor	edx,DWORD PTR[12+rbp]
	mov	rbp,r8

	sub	r10,16
	mov	QWORD PTR[40+rsp],r10
	mov	QWORD PTR[64+rsp],rbp

	mov	DWORD PTR[r9],eax
	mov	DWORD PTR[4+r9],ebx
	mov	DWORD PTR[8+r9],ecx
	mov	DWORD PTR[12+r9],edx

	lea	r8,QWORD PTR[16+r8]
	lea	r9,QWORD PTR[16+r9]
	jnz	$L$cbc_fast_dec_loop
	mov	r12,QWORD PTR[56+rsp]
	mov	r10,QWORD PTR[rbp]
	mov	r11,QWORD PTR[8+rbp]
	mov	QWORD PTR[r12],r10
	mov	QWORD PTR[8+r12],r11
	jmp	$L$cbc_fast_cleanup

ALIGN	16
$L$cbc_fast_dec_in_place::
	mov	r10,QWORD PTR[rbp]
	mov	r11,QWORD PTR[8+rbp]
	mov	QWORD PTR[((0+64))+rsp],r10
	mov	QWORD PTR[((8+64))+rsp],r11
ALIGN	4
$L$cbc_fast_dec_in_place_loop::
	mov	eax,DWORD PTR[r8]
	mov	ebx,DWORD PTR[4+r8]
	mov	ecx,DWORD PTR[8+r8]
	mov	edx,DWORD PTR[12+r8]
	mov	r15,QWORD PTR[rsp]
	mov	QWORD PTR[24+rsp],r8

	call	_x86_64_AES_decrypt

	mov	r8,QWORD PTR[24+rsp]
	mov	r10,QWORD PTR[40+rsp]
	xor	eax,DWORD PTR[((0+64))+rsp]
	xor	ebx,DWORD PTR[((4+64))+rsp]
	xor	ecx,DWORD PTR[((8+64))+rsp]
	xor	edx,DWORD PTR[((12+64))+rsp]

	mov	r11,QWORD PTR[r8]
	mov	r12,QWORD PTR[8+r8]
	sub	r10,16
	jz	$L$cbc_fast_dec_in_place_done

	mov	QWORD PTR[((0+64))+rsp],r11
	mov	QWORD PTR[((8+64))+rsp],r12

	mov	DWORD PTR[r9],eax
	mov	DWORD PTR[4+r9],ebx
	mov	DWORD PTR[8+r9],ecx
	mov	DWORD PTR[12+r9],edx

	lea	r8,QWORD PTR[16+r8]
	lea	r9,QWORD PTR[16+r9]
	mov	QWORD PTR[40+rsp],r10
	jmp	$L$cbc_fast_dec_in_place_loop
$L$cbc_fast_dec_in_place_done::
	mov	rdi,QWORD PTR[56+rsp]
	mov	QWORD PTR[rdi],r11
	mov	QWORD PTR[8+rdi],r12

	mov	DWORD PTR[r9],eax
	mov	DWORD PTR[4+r9],ebx
	mov	DWORD PTR[8+r9],ecx
	mov	DWORD PTR[12+r9],edx

ALIGN	4
$L$cbc_fast_cleanup::
	cmp	DWORD PTR[((80+240))+rsp],0
	lea	rdi,QWORD PTR[80+rsp]
	je	$L$cbc_exit
	mov	ecx,240/8
	xor	rax,rax
	DD	090AB48F3h


	jmp	$L$cbc_exit


ALIGN	16
$L$cbc_slow_prologue::

	lea	rbp,QWORD PTR[((-88))+rsp]
	and	rbp,-64

	lea	r10,QWORD PTR[((-88-63))+rcx]
	sub	r10,rbp
	neg	r10
	and	r10,03c0h
	sub	rbp,r10

	xchg	rbp,rsp

	mov	QWORD PTR[16+rsp],rbp
$L$cbc_slow_body::




	mov	QWORD PTR[56+rsp],r8
	mov	rbp,r8
	mov	rbx,r9
	mov	r9,rsi
	mov	r8,rdi
	mov	r15,rcx
	mov	r10,rdx

	mov	eax,DWORD PTR[240+r15]
	mov	QWORD PTR[rsp],r15
	shl	eax,4
	lea	rax,QWORD PTR[rax*1+r15]
	mov	QWORD PTR[8+rsp],rax


	lea	r14,QWORD PTR[2048+r14]
	lea	rax,QWORD PTR[((768-8))+rsp]
	sub	rax,r14
	and	rax,0300h
	lea	r14,QWORD PTR[rax*1+r14]

	cmp	rbx,0
	je	$L$SLOW_DECRYPT


	test	r10,-16
	mov	eax,DWORD PTR[rbp]
	mov	ebx,DWORD PTR[4+rbp]
	mov	ecx,DWORD PTR[8+rbp]
	mov	edx,DWORD PTR[12+rbp]
	jz	$L$cbc_slow_enc_tail


ALIGN	4
$L$cbc_slow_enc_loop::
	xor	eax,DWORD PTR[r8]
	xor	ebx,DWORD PTR[4+r8]
	xor	ecx,DWORD PTR[8+r8]
	xor	edx,DWORD PTR[12+r8]
	mov	r15,QWORD PTR[rsp]
	mov	QWORD PTR[24+rsp],r8
	mov	QWORD PTR[32+rsp],r9
	mov	QWORD PTR[40+rsp],r10

	call	_x86_64_AES_encrypt_compact

	mov	r8,QWORD PTR[24+rsp]
	mov	r9,QWORD PTR[32+rsp]
	mov	r10,QWORD PTR[40+rsp]
	mov	DWORD PTR[r9],eax
	mov	DWORD PTR[4+r9],ebx
	mov	DWORD PTR[8+r9],ecx
	mov	DWORD PTR[12+r9],edx

	lea	r8,QWORD PTR[16+r8]
	lea	r9,QWORD PTR[16+r9]
	sub	r10,16
	test	r10,-16
	jnz	$L$cbc_slow_enc_loop
	test	r10,15
	jnz	$L$cbc_slow_enc_tail
	mov	rbp,QWORD PTR[56+rsp]
	mov	DWORD PTR[rbp],eax
	mov	DWORD PTR[4+rbp],ebx
	mov	DWORD PTR[8+rbp],ecx
	mov	DWORD PTR[12+rbp],edx

	jmp	$L$cbc_exit

ALIGN	4
$L$cbc_slow_enc_tail::
	mov	r11,rax
	mov	r12,rcx
	mov	rcx,r10
	mov	rsi,r8
	mov	rdi,r9
	DD	09066A4F3h

	mov	rcx,16
	sub	rcx,r10
	xor	rax,rax
	DD	09066AAF3h

	mov	r8,r9
	mov	r10,16
	mov	rax,r11
	mov	rcx,r12
	jmp	$L$cbc_slow_enc_loop


ALIGN	16
$L$SLOW_DECRYPT::
	shr	rax,3
	add	r14,rax

	mov	r11,QWORD PTR[rbp]
	mov	r12,QWORD PTR[8+rbp]
	mov	QWORD PTR[((0+64))+rsp],r11
	mov	QWORD PTR[((8+64))+rsp],r12

ALIGN	4
$L$cbc_slow_dec_loop::
	mov	eax,DWORD PTR[r8]
	mov	ebx,DWORD PTR[4+r8]
	mov	ecx,DWORD PTR[8+r8]
	mov	edx,DWORD PTR[12+r8]
	mov	r15,QWORD PTR[rsp]
	mov	QWORD PTR[24+rsp],r8
	mov	QWORD PTR[32+rsp],r9
	mov	QWORD PTR[40+rsp],r10

	call	_x86_64_AES_decrypt_compact

	mov	r8,QWORD PTR[24+rsp]
	mov	r9,QWORD PTR[32+rsp]
	mov	r10,QWORD PTR[40+rsp]
	xor	eax,DWORD PTR[((0+64))+rsp]
	xor	ebx,DWORD PTR[((4+64))+rsp]
	xor	ecx,DWORD PTR[((8+64))+rsp]
	xor	edx,DWORD PTR[((12+64))+rsp]

	mov	r11,QWORD PTR[r8]
	mov	r12,QWORD PTR[8+r8]
	sub	r10,16
	jc	$L$cbc_slow_dec_partial
	jz	$L$cbc_slow_dec_done

	mov	QWORD PTR[((0+64))+rsp],r11
	mov	QWORD PTR[((8+64))+rsp],r12

	mov	DWORD PTR[r9],eax
	mov	DWORD PTR[4+r9],ebx
	mov	DWORD PTR[8+r9],ecx
	mov	DWORD PTR[12+r9],edx

	lea	r8,QWORD PTR[16+r8]
	lea	r9,QWORD PTR[16+r9]
	jmp	$L$cbc_slow_dec_loop
$L$cbc_slow_dec_done::
	mov	rdi,QWORD PTR[56+rsp]
	mov	QWORD PTR[rdi],r11
	mov	QWORD PTR[8+rdi],r12

	mov	DWORD PTR[r9],eax
	mov	DWORD PTR[4+r9],ebx
	mov	DWORD PTR[8+r9],ecx
	mov	DWORD PTR[12+r9],edx

	jmp	$L$cbc_exit

ALIGN	4
$L$cbc_slow_dec_partial::
	mov	rdi,QWORD PTR[56+rsp]
	mov	QWORD PTR[rdi],r11
	mov	QWORD PTR[8+rdi],r12

	mov	DWORD PTR[((0+64))+rsp],eax
	mov	DWORD PTR[((4+64))+rsp],ebx
	mov	DWORD PTR[((8+64))+rsp],ecx
	mov	DWORD PTR[((12+64))+rsp],edx

	mov	rdi,r9
	lea	rsi,QWORD PTR[64+rsp]
	lea	rcx,QWORD PTR[16+r10]
	DD	09066A4F3h

	jmp	$L$cbc_exit

ALIGN	16
$L$cbc_exit::
	mov	rsi,QWORD PTR[16+rsp]
	mov	r15,QWORD PTR[rsi]
	mov	r14,QWORD PTR[8+rsi]
	mov	r13,QWORD PTR[16+rsi]
	mov	r12,QWORD PTR[24+rsi]
	mov	rbp,QWORD PTR[32+rsi]
	mov	rbx,QWORD PTR[40+rsi]
	lea	rsp,QWORD PTR[48+rsi]
$L$cbc_popfq::
	popfq
$L$cbc_epilogue::
	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
	mov	rsi,QWORD PTR[16+rsp]
	DB	0F3h,0C3h		;repret
$L$SEH_end_AES_cbc_encrypt::
AES_cbc_encrypt	ENDP
ALIGN	64
$L$AES_Te::
	DD	0a56363c6h,0a56363c6h
	DD	0847c7cf8h,0847c7cf8h
	DD	0997777eeh,0997777eeh
	DD	08d7b7bf6h,08d7b7bf6h
	DD	00df2f2ffh,00df2f2ffh
	DD	0bd6b6bd6h,0bd6b6bd6h
	DD	0b16f6fdeh,0b16f6fdeh
	DD	054c5c591h,054c5c591h
	DD	050303060h,050303060h
	DD	003010102h,003010102h
	DD	0a96767ceh,0a96767ceh
	DD	07d2b2b56h,07d2b2b56h
	DD	019fefee7h,019fefee7h
	DD	062d7d7b5h,062d7d7b5h
	DD	0e6abab4dh,0e6abab4dh
	DD	09a7676ech,09a7676ech
	DD	045caca8fh,045caca8fh
	DD	09d82821fh,09d82821fh
	DD	040c9c989h,040c9c989h
	DD	0877d7dfah,0877d7dfah
	DD	015fafaefh,015fafaefh
	DD	0eb5959b2h,0eb5959b2h
	DD	0c947478eh,0c947478eh
	DD	00bf0f0fbh,00bf0f0fbh
	DD	0ecadad41h,0ecadad41h
	DD	067d4d4b3h,067d4d4b3h
	DD	0fda2a25fh,0fda2a25fh
	DD	0eaafaf45h,0eaafaf45h
	DD	0bf9c9c23h,0bf9c9c23h
	DD	0f7a4a453h,0f7a4a453h
	DD	0967272e4h,0967272e4h
	DD	05bc0c09bh,05bc0c09bh
	DD	0c2b7b775h,0c2b7b775h
	DD	01cfdfde1h,01cfdfde1h
	DD	0ae93933dh,0ae93933dh
	DD	06a26264ch,06a26264ch
	DD	05a36366ch,05a36366ch
	DD	0413f3f7eh,0413f3f7eh
	DD	002f7f7f5h,002f7f7f5h
	DD	04fcccc83h,04fcccc83h
	DD	05c343468h,05c343468h
	DD	0f4a5a551h,0f4a5a551h
	DD	034e5e5d1h,034e5e5d1h
	DD	008f1f1f9h,008f1f1f9h
	DD	0937171e2h,0937171e2h
	DD	073d8d8abh,073d8d8abh
	DD	053313162h,053313162h
	DD	03f15152ah,03f15152ah
	DD	00c040408h,00c040408h
	DD	052c7c795h,052c7c795h
	DD	065232346h,065232346h
	DD	05ec3c39dh,05ec3c39dh
	DD	028181830h,028181830h
	DD	0a1969637h,0a1969637h
	DD	00f05050ah,00f05050ah
	DD	0b59a9a2fh,0b59a9a2fh
	DD	00907070eh,00907070eh
	DD	036121224h,036121224h
	DD	09b80801bh,09b80801bh
	DD	03de2e2dfh,03de2e2dfh
	DD	026ebebcdh,026ebebcdh
	DD	06927274eh,06927274eh
	DD	0cdb2b27fh,0cdb2b27fh
	DD	09f7575eah,09f7575eah
	DD	01b090912h,01b090912h
	DD	09e83831dh,09e83831dh
	DD	0742c2c58h,0742c2c58h
	DD	02e1a1a34h,02e1a1a34h
	DD	02d1b1b36h,02d1b1b36h
	DD	0b26e6edch,0b26e6edch
	DD	0ee5a5ab4h,0ee5a5ab4h
	DD	0fba0a05bh,0fba0a05bh
	DD	0f65252a4h,0f65252a4h
	DD	04d3b3b76h,04d3b3b76h
	DD	061d6d6b7h,061d6d6b7h
	DD	0ceb3b37dh,0ceb3b37dh
	DD	07b292952h,07b292952h
	DD	03ee3e3ddh,03ee3e3ddh
	DD	0712f2f5eh,0712f2f5eh
	DD	097848413h,097848413h
	DD	0f55353a6h,0f55353a6h
	DD	068d1d1b9h,068d1d1b9h
	DD	000000000h,000000000h
	DD	02cededc1h,02cededc1h
	DD	060202040h,060202040h
	DD	01ffcfce3h,01ffcfce3h
	DD	0c8b1b179h,0c8b1b179h
	DD	0ed5b5bb6h,0ed5b5bb6h
	DD	0be6a6ad4h,0be6a6ad4h
	DD	046cbcb8dh,046cbcb8dh
	DD	0d9bebe67h,0d9bebe67h
	DD	04b393972h,04b393972h
	DD	0de4a4a94h,0de4a4a94h
	DD	0d44c4c98h,0d44c4c98h
	DD	0e85858b0h,0e85858b0h
	DD	04acfcf85h,04acfcf85h
	DD	06bd0d0bbh,06bd0d0bbh
	DD	02aefefc5h,02aefefc5h
	DD	0e5aaaa4fh,0e5aaaa4fh
	DD	016fbfbedh,016fbfbedh
	DD	0c5434386h,0c5434386h
	DD	0d74d4d9ah,0d74d4d9ah
	DD	055333366h,055333366h
	DD	094858511h,094858511h
	DD	0cf45458ah,0cf45458ah
	DD	010f9f9e9h,010f9f9e9h
	DD	006020204h,006020204h
	DD	0817f7ffeh,0817f7ffeh
	DD	0f05050a0h,0f05050a0h
	DD	0443c3c78h,0443c3c78h
	DD	0ba9f9f25h,0ba9f9f25h
	DD	0e3a8a84bh,0e3a8a84bh
	DD	0f35151a2h,0f35151a2h
	DD	0fea3a35dh,0fea3a35dh
	DD	0c0404080h,0c0404080h
	DD	08a8f8f05h,08a8f8f05h
	DD	0ad92923fh,0ad92923fh
	DD	0bc9d9d21h,0bc9d9d21h
	DD	048383870h,048383870h
	DD	004f5f5f1h,004f5f5f1h
	DD	0dfbcbc63h,0dfbcbc63h
	DD	0c1b6b677h,0c1b6b677h
	DD	075dadaafh,075dadaafh
	DD	063212142h,063212142h
	DD	030101020h,030101020h
	DD	01affffe5h,01affffe5h
	DD	00ef3f3fdh,00ef3f3fdh
	DD	06dd2d2bfh,06dd2d2bfh
	DD	04ccdcd81h,04ccdcd81h
	DD	0140c0c18h,0140c0c18h
	DD	035131326h,035131326h
	DD	02fececc3h,02fececc3h
	DD	0e15f5fbeh,0e15f5fbeh
	DD	0a2979735h,0a2979735h
	DD	0cc444488h,0cc444488h
	DD	03917172eh,03917172eh
	DD	057c4c493h,057c4c493h
	DD	0f2a7a755h,0f2a7a755h
	DD	0827e7efch,0827e7efch
	DD	0473d3d7ah,0473d3d7ah
	DD	0ac6464c8h,0ac6464c8h
	DD	0e75d5dbah,0e75d5dbah
	DD	02b191932h,02b191932h
	DD	0957373e6h,0957373e6h
	DD	0a06060c0h,0a06060c0h
	DD	098818119h,098818119h
	DD	0d14f4f9eh,0d14f4f9eh
	DD	07fdcdca3h,07fdcdca3h
	DD	066222244h,066222244h
	DD	07e2a2a54h,07e2a2a54h
	DD	0ab90903bh,0ab90903bh
	DD	08388880bh,08388880bh
	DD	0ca46468ch,0ca46468ch
	DD	029eeeec7h,029eeeec7h
	DD	0d3b8b86bh,0d3b8b86bh
	DD	03c141428h,03c141428h
	DD	079dedea7h,079dedea7h
	DD	0e25e5ebch,0e25e5ebch
	DD	01d0b0b16h,01d0b0b16h
	DD	076dbdbadh,076dbdbadh
	DD	03be0e0dbh,03be0e0dbh
	DD	056323264h,056323264h
	DD	04e3a3a74h,04e3a3a74h
	DD	01e0a0a14h,01e0a0a14h
	DD	0db494992h,0db494992h
	DD	00a06060ch,00a06060ch
	DD	06c242448h,06c242448h
	DD	0e45c5cb8h,0e45c5cb8h
	DD	05dc2c29fh,05dc2c29fh
	DD	06ed3d3bdh,06ed3d3bdh
	DD	0efacac43h,0efacac43h
	DD	0a66262c4h,0a66262c4h
	DD	0a8919139h,0a8919139h
	DD	0a4959531h,0a4959531h
	DD	037e4e4d3h,037e4e4d3h
	DD	08b7979f2h,08b7979f2h
	DD	032e7e7d5h,032e7e7d5h
	DD	043c8c88bh,043c8c88bh
	DD	05937376eh,05937376eh
	DD	0b76d6ddah,0b76d6ddah
	DD	08c8d8d01h,08c8d8d01h
	DD	064d5d5b1h,064d5d5b1h
	DD	0d24e4e9ch,0d24e4e9ch
	DD	0e0a9a949h,0e0a9a949h
	DD	0b46c6cd8h,0b46c6cd8h
	DD	0fa5656ach,0fa5656ach
	DD	007f4f4f3h,007f4f4f3h
	DD	025eaeacfh,025eaeacfh
	DD	0af6565cah,0af6565cah
	DD	08e7a7af4h,08e7a7af4h
	DD	0e9aeae47h,0e9aeae47h
	DD	018080810h,018080810h
	DD	0d5baba6fh,0d5baba6fh
	DD	0887878f0h,0887878f0h
	DD	06f25254ah,06f25254ah
	DD	0722e2e5ch,0722e2e5ch
	DD	0241c1c38h,0241c1c38h
	DD	0f1a6a657h,0f1a6a657h
	DD	0c7b4b473h,0c7b4b473h
	DD	051c6c697h,051c6c697h
	DD	023e8e8cbh,023e8e8cbh
	DD	07cdddda1h,07cdddda1h
	DD	09c7474e8h,09c7474e8h
	DD	0211f1f3eh,0211f1f3eh
	DD	0dd4b4b96h,0dd4b4b96h
	DD	0dcbdbd61h,0dcbdbd61h
	DD	0868b8b0dh,0868b8b0dh
	DD	0858a8a0fh,0858a8a0fh
	DD	0907070e0h,0907070e0h
	DD	0423e3e7ch,0423e3e7ch
	DD	0c4b5b571h,0c4b5b571h
	DD	0aa6666cch,0aa6666cch
	DD	0d8484890h,0d8484890h
	DD	005030306h,005030306h
	DD	001f6f6f7h,001f6f6f7h
	DD	0120e0e1ch,0120e0e1ch
	DD	0a36161c2h,0a36161c2h
	DD	05f35356ah,05f35356ah
	DD	0f95757aeh,0f95757aeh
	DD	0d0b9b969h,0d0b9b969h
	DD	091868617h,091868617h
	DD	058c1c199h,058c1c199h
	DD	0271d1d3ah,0271d1d3ah
	DD	0b99e9e27h,0b99e9e27h
	DD	038e1e1d9h,038e1e1d9h
	DD	013f8f8ebh,013f8f8ebh
	DD	0b398982bh,0b398982bh
	DD	033111122h,033111122h
	DD	0bb6969d2h,0bb6969d2h
	DD	070d9d9a9h,070d9d9a9h
	DD	0898e8e07h,0898e8e07h
	DD	0a7949433h,0a7949433h
	DD	0b69b9b2dh,0b69b9b2dh
	DD	0221e1e3ch,0221e1e3ch
	DD	092878715h,092878715h
	DD	020e9e9c9h,020e9e9c9h
	DD	049cece87h,049cece87h
	DD	0ff5555aah,0ff5555aah
	DD	078282850h,078282850h
	DD	07adfdfa5h,07adfdfa5h
	DD	08f8c8c03h,08f8c8c03h
	DD	0f8a1a159h,0f8a1a159h
	DD	080898909h,080898909h
	DD	0170d0d1ah,0170d0d1ah
	DD	0dabfbf65h,0dabfbf65h
	DD	031e6e6d7h,031e6e6d7h
	DD	0c6424284h,0c6424284h
	DD	0b86868d0h,0b86868d0h
	DD	0c3414182h,0c3414182h
	DD	0b0999929h,0b0999929h
	DD	0772d2d5ah,0772d2d5ah
	DD	0110f0f1eh,0110f0f1eh
	DD	0cbb0b07bh,0cbb0b07bh
	DD	0fc5454a8h,0fc5454a8h
	DD	0d6bbbb6dh,0d6bbbb6dh
	DD	03a16162ch,03a16162ch
DB	063h,07ch,077h,07bh,0f2h,06bh,06fh,0c5h
DB	030h,001h,067h,02bh,0feh,0d7h,0abh,076h
DB	0cah,082h,0c9h,07dh,0fah,059h,047h,0f0h
DB	0adh,0d4h,0a2h,0afh,09ch,0a4h,072h,0c0h
DB	0b7h,0fdh,093h,026h,036h,03fh,0f7h,0cch
DB	034h,0a5h,0e5h,0f1h,071h,0d8h,031h,015h
DB	004h,0c7h,023h,0c3h,018h,096h,005h,09ah
DB	007h,012h,080h,0e2h,0ebh,027h,0b2h,075h
DB	009h,083h,02ch,01ah,01bh,06eh,05ah,0a0h
DB	052h,03bh,0d6h,0b3h,029h,0e3h,02fh,084h
DB	053h,0d1h,000h,0edh,020h,0fch,0b1h,05bh
DB	06ah,0cbh,0beh,039h,04ah,04ch,058h,0cfh
DB	0d0h,0efh,0aah,0fbh,043h,04dh,033h,085h
DB	045h,0f9h,002h,07fh,050h,03ch,09fh,0a8h
DB	051h,0a3h,040h,08fh,092h,09dh,038h,0f5h
DB	0bch,0b6h,0dah,021h,010h,0ffh,0f3h,0d2h
DB	0cdh,00ch,013h,0ech,05fh,097h,044h,017h
DB	0c4h,0a7h,07eh,03dh,064h,05dh,019h,073h
DB	060h,081h,04fh,0dch,022h,02ah,090h,088h
DB	046h,0eeh,0b8h,014h,0deh,05eh,00bh,0dbh
DB	0e0h,032h,03ah,00ah,049h,006h,024h,05ch
DB	0c2h,0d3h,0ach,062h,091h,095h,0e4h,079h
DB	0e7h,0c8h,037h,06dh,08dh,0d5h,04eh,0a9h
DB	06ch,056h,0f4h,0eah,065h,07ah,0aeh,008h
DB	0bah,078h,025h,02eh,01ch,0a6h,0b4h,0c6h
DB	0e8h,0ddh,074h,01fh,04bh,0bdh,08bh,08ah
DB	070h,03eh,0b5h,066h,048h,003h,0f6h,00eh
DB	061h,035h,057h,0b9h,086h,0c1h,01dh,09eh
DB	0e1h,0f8h,098h,011h,069h,0d9h,08eh,094h
DB	09bh,01eh,087h,0e9h,0ceh,055h,028h,0dfh
DB	08ch,0a1h,089h,00dh,0bfh,0e6h,042h,068h
DB	041h,099h,02dh,00fh,0b0h,054h,0bbh,016h
DB	063h,07ch,077h,07bh,0f2h,06bh,06fh,0c5h
DB	030h,001h,067h,02bh,0feh,0d7h,0abh,076h
DB	0cah,082h,0c9h,07dh,0fah,059h,047h,0f0h
DB	0adh,0d4h,0a2h,0afh,09ch,0a4h,072h,0c0h
DB	0b7h,0fdh,093h,026h,036h,03fh,0f7h,0cch
DB	034h,0a5h,0e5h,0f1h,071h,0d8h,031h,015h
DB	004h,0c7h,023h,0c3h,018h,096h,005h,09ah
DB	007h,012h,080h,0e2h,0ebh,027h,0b2h,075h
DB	009h,083h,02ch,01ah,01bh,06eh,05ah,0a0h
DB	052h,03bh,0d6h,0b3h,029h,0e3h,02fh,084h
DB	053h,0d1h,000h,0edh,020h,0fch,0b1h,05bh
DB	06ah,0cbh,0beh,039h,04ah,04ch,058h,0cfh
DB	0d0h,0efh,0aah,0fbh,043h,04dh,033h,085h
DB	045h,0f9h,002h,07fh,050h,03ch,09fh,0a8h
DB	051h,0a3h,040h,08fh,092h,09dh,038h,0f5h
DB	0bch,0b6h,0dah,021h,010h,0ffh,0f3h,0d2h
DB	0cdh,00ch,013h,0ech,05fh,097h,044h,017h
DB	0c4h,0a7h,07eh,03dh,064h,05dh,019h,073h
DB	060h,081h,04fh,0dch,022h,02ah,090h,088h
DB	046h,0eeh,0b8h,014h,0deh,05eh,00bh,0dbh
DB	0e0h,032h,03ah,00ah,049h,006h,024h,05ch
DB	0c2h,0d3h,0ach,062h,091h,095h,0e4h,079h
DB	0e7h,0c8h,037h,06dh,08dh,0d5h,04eh,0a9h
DB	06ch,056h,0f4h,0eah,065h,07ah,0aeh,008h
DB	0bah,078h,025h,02eh,01ch,0a6h,0b4h,0c6h
DB	0e8h,0ddh,074h,01fh,04bh,0bdh,08bh,08ah
DB	070h,03eh,0b5h,066h,048h,003h,0f6h,00eh
DB	061h,035h,057h,0b9h,086h,0c1h,01dh,09eh
DB	0e1h,0f8h,098h,011h,069h,0d9h,08eh,094h
DB	09bh,01eh,087h,0e9h,0ceh,055h,028h,0dfh
DB	08ch,0a1h,089h,00dh,0bfh,0e6h,042h,068h
DB	041h,099h,02dh,00fh,0b0h,054h,0bbh,016h
DB	063h,07ch,077h,07bh,0f2h,06bh,06fh,0c5h
DB	030h,001h,067h,02bh,0feh,0d7h,0abh,076h
DB	0cah,082h,0c9h,07dh,0fah,059h,047h,0f0h
DB	0adh,0d4h,0a2h,0afh,09ch,0a4h,072h,0c0h
DB	0b7h,0fdh,093h,026h,036h,03fh,0f7h,0cch
DB	034h,0a5h,0e5h,0f1h,071h,0d8h,031h,015h
DB	004h,0c7h,023h,0c3h,018h,096h,005h,09ah
DB	007h,012h,080h,0e2h,0ebh,027h,0b2h,075h
DB	009h,083h,02ch,01ah,01bh,06eh,05ah,0a0h
DB	052h,03bh,0d6h,0b3h,029h,0e3h,02fh,084h
DB	053h,0d1h,000h,0edh,020h,0fch,0b1h,05bh
DB	06ah,0cbh,0beh,039h,04ah,04ch,058h,0cfh
DB	0d0h,0efh,0aah,0fbh,043h,04dh,033h,085h
DB	045h,0f9h,002h,07fh,050h,03ch,09fh,0a8h
DB	051h,0a3h,040h,08fh,092h,09dh,038h,0f5h
DB	0bch,0b6h,0dah,021h,010h,0ffh,0f3h,0d2h
DB	0cdh,00ch,013h,0ech,05fh,097h,044h,017h
DB	0c4h,0a7h,07eh,03dh,064h,05dh,019h,073h
DB	060h,081h,04fh,0dch,022h,02ah,090h,088h
DB	046h,0eeh,0b8h,014h,0deh,05eh,00bh,0dbh
DB	0e0h,032h,03ah,00ah,049h,006h,024h,05ch
DB	0c2h,0d3h,0ach,062h,091h,095h,0e4h,079h
DB	0e7h,0c8h,037h,06dh,08dh,0d5h,04eh,0a9h
DB	06ch,056h,0f4h,0eah,065h,07ah,0aeh,008h
DB	0bah,078h,025h,02eh,01ch,0a6h,0b4h,0c6h
DB	0e8h,0ddh,074h,01fh,04bh,0bdh,08bh,08ah
DB	070h,03eh,0b5h,066h,048h,003h,0f6h,00eh
DB	061h,035h,057h,0b9h,086h,0c1h,01dh,09eh
DB	0e1h,0f8h,098h,011h,069h,0d9h,08eh,094h
DB	09bh,01eh,087h,0e9h,0ceh,055h,028h,0dfh
DB	08ch,0a1h,089h,00dh,0bfh,0e6h,042h,068h
DB	041h,099h,02dh,00fh,0b0h,054h,0bbh,016h
DB	063h,07ch,077h,07bh,0f2h,06bh,06fh,0c5h
DB	030h,001h,067h,02bh,0feh,0d7h,0abh,076h
DB	0cah,082h,0c9h,07dh,0fah,059h,047h,0f0h
DB	0adh,0d4h,0a2h,0afh,09ch,0a4h,072h,0c0h
DB	0b7h,0fdh,093h,026h,036h,03fh,0f7h,0cch
DB	034h,0a5h,0e5h,0f1h,071h,0d8h,031h,015h
DB	004h,0c7h,023h,0c3h,018h,096h,005h,09ah
DB	007h,012h,080h,0e2h,0ebh,027h,0b2h,075h
DB	009h,083h,02ch,01ah,01bh,06eh,05ah,0a0h
DB	052h,03bh,0d6h,0b3h,029h,0e3h,02fh,084h
DB	053h,0d1h,000h,0edh,020h,0fch,0b1h,05bh
DB	06ah,0cbh,0beh,039h,04ah,04ch,058h,0cfh
DB	0d0h,0efh,0aah,0fbh,043h,04dh,033h,085h
DB	045h,0f9h,002h,07fh,050h,03ch,09fh,0a8h
DB	051h,0a3h,040h,08fh,092h,09dh,038h,0f5h
DB	0bch,0b6h,0dah,021h,010h,0ffh,0f3h,0d2h
DB	0cdh,00ch,013h,0ech,05fh,097h,044h,017h
DB	0c4h,0a7h,07eh,03dh,064h,05dh,019h,073h
DB	060h,081h,04fh,0dch,022h,02ah,090h,088h
DB	046h,0eeh,0b8h,014h,0deh,05eh,00bh,0dbh
DB	0e0h,032h,03ah,00ah,049h,006h,024h,05ch
DB	0c2h,0d3h,0ach,062h,091h,095h,0e4h,079h
DB	0e7h,0c8h,037h,06dh,08dh,0d5h,04eh,0a9h
DB	06ch,056h,0f4h,0eah,065h,07ah,0aeh,008h
DB	0bah,078h,025h,02eh,01ch,0a6h,0b4h,0c6h
DB	0e8h,0ddh,074h,01fh,04bh,0bdh,08bh,08ah
DB	070h,03eh,0b5h,066h,048h,003h,0f6h,00eh
DB	061h,035h,057h,0b9h,086h,0c1h,01dh,09eh
DB	0e1h,0f8h,098h,011h,069h,0d9h,08eh,094h
DB	09bh,01eh,087h,0e9h,0ceh,055h,028h,0dfh
DB	08ch,0a1h,089h,00dh,0bfh,0e6h,042h,068h
DB	041h,099h,02dh,00fh,0b0h,054h,0bbh,016h
	DD	000000001h,000000002h,000000004h,000000008h
	DD	000000010h,000000020h,000000040h,000000080h
	DD	00000001bh,000000036h,080808080h,080808080h
	DD	0fefefefeh,0fefefefeh,01b1b1b1bh,01b1b1b1bh
ALIGN	64
$L$AES_Td::
	DD	050a7f451h,050a7f451h
	DD	05365417eh,05365417eh
	DD	0c3a4171ah,0c3a4171ah
	DD	0965e273ah,0965e273ah
	DD	0cb6bab3bh,0cb6bab3bh
	DD	0f1459d1fh,0f1459d1fh
	DD	0ab58faach,0ab58faach
	DD	09303e34bh,09303e34bh
	DD	055fa3020h,055fa3020h
	DD	0f66d76adh,0f66d76adh
	DD	09176cc88h,09176cc88h
	DD	0254c02f5h,0254c02f5h
	DD	0fcd7e54fh,0fcd7e54fh
	DD	0d7cb2ac5h,0d7cb2ac5h
	DD	080443526h,080443526h
	DD	08fa362b5h,08fa362b5h
	DD	0495ab1deh,0495ab1deh
	DD	0671bba25h,0671bba25h
	DD	0980eea45h,0980eea45h
	DD	0e1c0fe5dh,0e1c0fe5dh
	DD	002752fc3h,002752fc3h
	DD	012f04c81h,012f04c81h
	DD	0a397468dh,0a397468dh
	DD	0c6f9d36bh,0c6f9d36bh
	DD	0e75f8f03h,0e75f8f03h
	DD	0959c9215h,0959c9215h
	DD	0eb7a6dbfh,0eb7a6dbfh
	DD	0da595295h,0da595295h
	DD	02d83bed4h,02d83bed4h
	DD	0d3217458h,0d3217458h
	DD	02969e049h,02969e049h
	DD	044c8c98eh,044c8c98eh
	DD	06a89c275h,06a89c275h
	DD	078798ef4h,078798ef4h
	DD	06b3e5899h,06b3e5899h
	DD	0dd71b927h,0dd71b927h
	DD	0b64fe1beh,0b64fe1beh
	DD	017ad88f0h,017ad88f0h
	DD	066ac20c9h,066ac20c9h
	DD	0b43ace7dh,0b43ace7dh
	DD	0184adf63h,0184adf63h
	DD	082311ae5h,082311ae5h
	DD	060335197h,060335197h
	DD	0457f5362h,0457f5362h
	DD	0e07764b1h,0e07764b1h
	DD	084ae6bbbh,084ae6bbbh
	DD	01ca081feh,01ca081feh
	DD	0942b08f9h,0942b08f9h
	DD	058684870h,058684870h
	DD	019fd458fh,019fd458fh
	DD	0876cde94h,0876cde94h
	DD	0b7f87b52h,0b7f87b52h
	DD	023d373abh,023d373abh
	DD	0e2024b72h,0e2024b72h
	DD	0578f1fe3h,0578f1fe3h
	DD	02aab5566h,02aab5566h
	DD	00728ebb2h,00728ebb2h
	DD	003c2b52fh,003c2b52fh
	DD	09a7bc586h,09a7bc586h
	DD	0a50837d3h,0a50837d3h
	DD	0f2872830h,0f2872830h
	DD	0b2a5bf23h,0b2a5bf23h
	DD	0ba6a0302h,0ba6a0302h
	DD	05c8216edh,05c8216edh
	DD	02b1ccf8ah,02b1ccf8ah
	DD	092b479a7h,092b479a7h
	DD	0f0f207f3h,0f0f207f3h
	DD	0a1e2694eh,0a1e2694eh
	DD	0cdf4da65h,0cdf4da65h
	DD	0d5be0506h,0d5be0506h
	DD	01f6234d1h,01f6234d1h
	DD	08afea6c4h,08afea6c4h
	DD	09d532e34h,09d532e34h
	DD	0a055f3a2h,0a055f3a2h
	DD	032e18a05h,032e18a05h
	DD	075ebf6a4h,075ebf6a4h
	DD	039ec830bh,039ec830bh
	DD	0aaef6040h,0aaef6040h
	DD	0069f715eh,0069f715eh
	DD	051106ebdh,051106ebdh
	DD	0f98a213eh,0f98a213eh
	DD	03d06dd96h,03d06dd96h
	DD	0ae053eddh,0ae053eddh
	DD	046bde64dh,046bde64dh
	DD	0b58d5491h,0b58d5491h
	DD	0055dc471h,0055dc471h
	DD	06fd40604h,06fd40604h
	DD	0ff155060h,0ff155060h
	DD	024fb9819h,024fb9819h
	DD	097e9bdd6h,097e9bdd6h
	DD	0cc434089h,0cc434089h
	DD	0779ed967h,0779ed967h
	DD	0bd42e8b0h,0bd42e8b0h
	DD	0888b8907h,0888b8907h
	DD	0385b19e7h,0385b19e7h
	DD	0dbeec879h,0dbeec879h
	DD	0470a7ca1h,0470a7ca1h
	DD	0e90f427ch,0e90f427ch
	DD	0c91e84f8h,0c91e84f8h
	DD	000000000h,000000000h
	DD	083868009h,083868009h
	DD	048ed2b32h,048ed2b32h
	DD	0ac70111eh,0ac70111eh
	DD	04e725a6ch,04e725a6ch
	DD	0fbff0efdh,0fbff0efdh
	DD	05638850fh,05638850fh
	DD	01ed5ae3dh,01ed5ae3dh
	DD	027392d36h,027392d36h
	DD	064d90f0ah,064d90f0ah
	DD	021a65c68h,021a65c68h
	DD	0d1545b9bh,0d1545b9bh
	DD	03a2e3624h,03a2e3624h
	DD	0b1670a0ch,0b1670a0ch
	DD	00fe75793h,00fe75793h
	DD	0d296eeb4h,0d296eeb4h
	DD	09e919b1bh,09e919b1bh
	DD	04fc5c080h,04fc5c080h
	DD	0a220dc61h,0a220dc61h
	DD	0694b775ah,0694b775ah
	DD	0161a121ch,0161a121ch
	DD	00aba93e2h,00aba93e2h
	DD	0e52aa0c0h,0e52aa0c0h
	DD	043e0223ch,043e0223ch
	DD	01d171b12h,01d171b12h
	DD	00b0d090eh,00b0d090eh
	DD	0adc78bf2h,0adc78bf2h
	DD	0b9a8b62dh,0b9a8b62dh
	DD	0c8a91e14h,0c8a91e14h
	DD	08519f157h,08519f157h
	DD	04c0775afh,04c0775afh
	DD	0bbdd99eeh,0bbdd99eeh
	DD	0fd607fa3h,0fd607fa3h
	DD	09f2601f7h,09f2601f7h
	DD	0bcf5725ch,0bcf5725ch
	DD	0c53b6644h,0c53b6644h
	DD	0347efb5bh,0347efb5bh
	DD	07629438bh,07629438bh
	DD	0dcc623cbh,0dcc623cbh
	DD	068fcedb6h,068fcedb6h
	DD	063f1e4b8h,063f1e4b8h
	DD	0cadc31d7h,0cadc31d7h
	DD	010856342h,010856342h
	DD	040229713h,040229713h
	DD	02011c684h,02011c684h
	DD	07d244a85h,07d244a85h
	DD	0f83dbbd2h,0f83dbbd2h
	DD	01132f9aeh,01132f9aeh
	DD	06da129c7h,06da129c7h
	DD	04b2f9e1dh,04b2f9e1dh
	DD	0f330b2dch,0f330b2dch
	DD	0ec52860dh,0ec52860dh
	DD	0d0e3c177h,0d0e3c177h
	DD	06c16b32bh,06c16b32bh
	DD	099b970a9h,099b970a9h
	DD	0fa489411h,0fa489411h
	DD	02264e947h,02264e947h
	DD	0c48cfca8h,0c48cfca8h
	DD	01a3ff0a0h,01a3ff0a0h
	DD	0d82c7d56h,0d82c7d56h
	DD	0ef903322h,0ef903322h
	DD	0c74e4987h,0c74e4987h
	DD	0c1d138d9h,0c1d138d9h
	DD	0fea2ca8ch,0fea2ca8ch
	DD	0360bd498h,0360bd498h
	DD	0cf81f5a6h,0cf81f5a6h
	DD	028de7aa5h,028de7aa5h
	DD	0268eb7dah,0268eb7dah
	DD	0a4bfad3fh,0a4bfad3fh
	DD	0e49d3a2ch,0e49d3a2ch
	DD	00d927850h,00d927850h
	DD	09bcc5f6ah,09bcc5f6ah
	DD	062467e54h,062467e54h
	DD	0c2138df6h,0c2138df6h
	DD	0e8b8d890h,0e8b8d890h
	DD	05ef7392eh,05ef7392eh
	DD	0f5afc382h,0f5afc382h
	DD	0be805d9fh,0be805d9fh
	DD	07c93d069h,07c93d069h
	DD	0a92dd56fh,0a92dd56fh
	DD	0b31225cfh,0b31225cfh
	DD	03b99acc8h,03b99acc8h
	DD	0a77d1810h,0a77d1810h
	DD	06e639ce8h,06e639ce8h
	DD	07bbb3bdbh,07bbb3bdbh
	DD	0097826cdh,0097826cdh
	DD	0f418596eh,0f418596eh
	DD	001b79aech,001b79aech
	DD	0a89a4f83h,0a89a4f83h
	DD	0656e95e6h,0656e95e6h
	DD	07ee6ffaah,07ee6ffaah
	DD	008cfbc21h,008cfbc21h
	DD	0e6e815efh,0e6e815efh
	DD	0d99be7bah,0d99be7bah
	DD	0ce366f4ah,0ce366f4ah
	DD	0d4099feah,0d4099feah
	DD	0d67cb029h,0d67cb029h
	DD	0afb2a431h,0afb2a431h
	DD	031233f2ah,031233f2ah
	DD	03094a5c6h,03094a5c6h
	DD	0c066a235h,0c066a235h
	DD	037bc4e74h,037bc4e74h
	DD	0a6ca82fch,0a6ca82fch
	DD	0b0d090e0h,0b0d090e0h
	DD	015d8a733h,015d8a733h
	DD	04a9804f1h,04a9804f1h
	DD	0f7daec41h,0f7daec41h
	DD	00e50cd7fh,00e50cd7fh
	DD	02ff69117h,02ff69117h
	DD	08dd64d76h,08dd64d76h
	DD	04db0ef43h,04db0ef43h
	DD	0544daacch,0544daacch
	DD	0df0496e4h,0df0496e4h
	DD	0e3b5d19eh,0e3b5d19eh
	DD	01b886a4ch,01b886a4ch
	DD	0b81f2cc1h,0b81f2cc1h
	DD	07f516546h,07f516546h
	DD	004ea5e9dh,004ea5e9dh
	DD	05d358c01h,05d358c01h
	DD	0737487fah,0737487fah
	DD	02e410bfbh,02e410bfbh
	DD	05a1d67b3h,05a1d67b3h
	DD	052d2db92h,052d2db92h
	DD	0335610e9h,0335610e9h
	DD	01347d66dh,01347d66dh
	DD	08c61d79ah,08c61d79ah
	DD	07a0ca137h,07a0ca137h
	DD	08e14f859h,08e14f859h
	DD	0893c13ebh,0893c13ebh
	DD	0ee27a9ceh,0ee27a9ceh
	DD	035c961b7h,035c961b7h
	DD	0ede51ce1h,0ede51ce1h
	DD	03cb1477ah,03cb1477ah
	DD	059dfd29ch,059dfd29ch
	DD	03f73f255h,03f73f255h
	DD	079ce1418h,079ce1418h
	DD	0bf37c773h,0bf37c773h
	DD	0eacdf753h,0eacdf753h
	DD	05baafd5fh,05baafd5fh
	DD	0146f3ddfh,0146f3ddfh
	DD	086db4478h,086db4478h
	DD	081f3afcah,081f3afcah
	DD	03ec468b9h,03ec468b9h
	DD	02c342438h,02c342438h
	DD	05f40a3c2h,05f40a3c2h
	DD	072c31d16h,072c31d16h
	DD	00c25e2bch,00c25e2bch
	DD	08b493c28h,08b493c28h
	DD	041950dffh,041950dffh
	DD	07101a839h,07101a839h
	DD	0deb30c08h,0deb30c08h
	DD	09ce4b4d8h,09ce4b4d8h
	DD	090c15664h,090c15664h
	DD	06184cb7bh,06184cb7bh
	DD	070b632d5h,070b632d5h
	DD	0745c6c48h,0745c6c48h
	DD	04257b8d0h,04257b8d0h
DB	052h,009h,06ah,0d5h,030h,036h,0a5h,038h
DB	0bfh,040h,0a3h,09eh,081h,0f3h,0d7h,0fbh
DB	07ch,0e3h,039h,082h,09bh,02fh,0ffh,087h
DB	034h,08eh,043h,044h,0c4h,0deh,0e9h,0cbh
DB	054h,07bh,094h,032h,0a6h,0c2h,023h,03dh
DB	0eeh,04ch,095h,00bh,042h,0fah,0c3h,04eh
DB	008h,02eh,0a1h,066h,028h,0d9h,024h,0b2h
DB	076h,05bh,0a2h,049h,06dh,08bh,0d1h,025h
DB	072h,0f8h,0f6h,064h,086h,068h,098h,016h
DB	0d4h,0a4h,05ch,0cch,05dh,065h,0b6h,092h
DB	06ch,070h,048h,050h,0fdh,0edh,0b9h,0dah
DB	05eh,015h,046h,057h,0a7h,08dh,09dh,084h
DB	090h,0d8h,0abh,000h,08ch,0bch,0d3h,00ah
DB	0f7h,0e4h,058h,005h,0b8h,0b3h,045h,006h
DB	0d0h,02ch,01eh,08fh,0cah,03fh,00fh,002h
DB	0c1h,0afh,0bdh,003h,001h,013h,08ah,06bh
DB	03ah,091h,011h,041h,04fh,067h,0dch,0eah
DB	097h,0f2h,0cfh,0ceh,0f0h,0b4h,0e6h,073h
DB	096h,0ach,074h,022h,0e7h,0adh,035h,085h
DB	0e2h,0f9h,037h,0e8h,01ch,075h,0dfh,06eh
DB	047h,0f1h,01ah,071h,01dh,029h,0c5h,089h
DB	06fh,0b7h,062h,00eh,0aah,018h,0beh,01bh
DB	0fch,056h,03eh,04bh,0c6h,0d2h,079h,020h
DB	09ah,0dbh,0c0h,0feh,078h,0cdh,05ah,0f4h
DB	01fh,0ddh,0a8h,033h,088h,007h,0c7h,031h
DB	0b1h,012h,010h,059h,027h,080h,0ech,05fh
DB	060h,051h,07fh,0a9h,019h,0b5h,04ah,00dh
DB	02dh,0e5h,07ah,09fh,093h,0c9h,09ch,0efh
DB	0a0h,0e0h,03bh,04dh,0aeh,02ah,0f5h,0b0h
DB	0c8h,0ebh,0bbh,03ch,083h,053h,099h,061h
DB	017h,02bh,004h,07eh,0bah,077h,0d6h,026h
DB	0e1h,069h,014h,063h,055h,021h,00ch,07dh
	DD	080808080h,080808080h,0fefefefeh,0fefefefeh
	DD	01b1b1b1bh,01b1b1b1bh,0,0
DB	052h,009h,06ah,0d5h,030h,036h,0a5h,038h
DB	0bfh,040h,0a3h,09eh,081h,0f3h,0d7h,0fbh
DB	07ch,0e3h,039h,082h,09bh,02fh,0ffh,087h
DB	034h,08eh,043h,044h,0c4h,0deh,0e9h,0cbh
DB	054h,07bh,094h,032h,0a6h,0c2h,023h,03dh
DB	0eeh,04ch,095h,00bh,042h,0fah,0c3h,04eh
DB	008h,02eh,0a1h,066h,028h,0d9h,024h,0b2h
DB	076h,05bh,0a2h,049h,06dh,08bh,0d1h,025h
DB	072h,0f8h,0f6h,064h,086h,068h,098h,016h
DB	0d4h,0a4h,05ch,0cch,05dh,065h,0b6h,092h
DB	06ch,070h,048h,050h,0fdh,0edh,0b9h,0dah
DB	05eh,015h,046h,057h,0a7h,08dh,09dh,084h
DB	090h,0d8h,0abh,000h,08ch,0bch,0d3h,00ah
DB	0f7h,0e4h,058h,005h,0b8h,0b3h,045h,006h
DB	0d0h,02ch,01eh,08fh,0cah,03fh,00fh,002h
DB	0c1h,0afh,0bdh,003h,001h,013h,08ah,06bh
DB	03ah,091h,011h,041h,04fh,067h,0dch,0eah
DB	097h,0f2h,0cfh,0ceh,0f0h,0b4h,0e6h,073h
DB	096h,0ach,074h,022h,0e7h,0adh,035h,085h
DB	0e2h,0f9h,037h,0e8h,01ch,075h,0dfh,06eh
DB	047h,0f1h,01ah,071h,01dh,029h,0c5h,089h
DB	06fh,0b7h,062h,00eh,0aah,018h,0beh,01bh
DB	0fch,056h,03eh,04bh,0c6h,0d2h,079h,020h
DB	09ah,0dbh,0c0h,0feh,078h,0cdh,05ah,0f4h
DB	01fh,0ddh,0a8h,033h,088h,007h,0c7h,031h
DB	0b1h,012h,010h,059h,027h,080h,0ech,05fh
DB	060h,051h,07fh,0a9h,019h,0b5h,04ah,00dh
DB	02dh,0e5h,07ah,09fh,093h,0c9h,09ch,0efh
DB	0a0h,0e0h,03bh,04dh,0aeh,02ah,0f5h,0b0h
DB	0c8h,0ebh,0bbh,03ch,083h,053h,099h,061h
DB	017h,02bh,004h,07eh,0bah,077h,0d6h,026h
DB	0e1h,069h,014h,063h,055h,021h,00ch,07dh
	DD	080808080h,080808080h,0fefefefeh,0fefefefeh
	DD	01b1b1b1bh,01b1b1b1bh,0,0
DB	052h,009h,06ah,0d5h,030h,036h,0a5h,038h
DB	0bfh,040h,0a3h,09eh,081h,0f3h,0d7h,0fbh
DB	07ch,0e3h,039h,082h,09bh,02fh,0ffh,087h
DB	034h,08eh,043h,044h,0c4h,0deh,0e9h,0cbh
DB	054h,07bh,094h,032h,0a6h,0c2h,023h,03dh
DB	0eeh,04ch,095h,00bh,042h,0fah,0c3h,04eh
DB	008h,02eh,0a1h,066h,028h,0d9h,024h,0b2h
DB	076h,05bh,0a2h,049h,06dh,08bh,0d1h,025h
DB	072h,0f8h,0f6h,064h,086h,068h,098h,016h
DB	0d4h,0a4h,05ch,0cch,05dh,065h,0b6h,092h
DB	06ch,070h,048h,050h,0fdh,0edh,0b9h,0dah
DB	05eh,015h,046h,057h,0a7h,08dh,09dh,084h
DB	090h,0d8h,0abh,000h,08ch,0bch,0d3h,00ah
DB	0f7h,0e4h,058h,005h,0b8h,0b3h,045h,006h
DB	0d0h,02ch,01eh,08fh,0cah,03fh,00fh,002h
DB	0c1h,0afh,0bdh,003h,001h,013h,08ah,06bh
DB	03ah,091h,011h,041h,04fh,067h,0dch,0eah
DB	097h,0f2h,0cfh,0ceh,0f0h,0b4h,0e6h,073h
DB	096h,0ach,074h,022h,0e7h,0adh,035h,085h
DB	0e2h,0f9h,037h,0e8h,01ch,075h,0dfh,06eh
DB	047h,0f1h,01ah,071h,01dh,029h,0c5h,089h
DB	06fh,0b7h,062h,00eh,0aah,018h,0beh,01bh
DB	0fch,056h,03eh,04bh,0c6h,0d2h,079h,020h
DB	09ah,0dbh,0c0h,0feh,078h,0cdh,05ah,0f4h
DB	01fh,0ddh,0a8h,033h,088h,007h,0c7h,031h
DB	0b1h,012h,010h,059h,027h,080h,0ech,05fh
DB	060h,051h,07fh,0a9h,019h,0b5h,04ah,00dh
DB	02dh,0e5h,07ah,09fh,093h,0c9h,09ch,0efh
DB	0a0h,0e0h,03bh,04dh,0aeh,02ah,0f5h,0b0h
DB	0c8h,0ebh,0bbh,03ch,083h,053h,099h,061h
DB	017h,02bh,004h,07eh,0bah,077h,0d6h,026h
DB	0e1h,069h,014h,063h,055h,021h,00ch,07dh
	DD	080808080h,080808080h,0fefefefeh,0fefefefeh
	DD	01b1b1b1bh,01b1b1b1bh,0,0
DB	052h,009h,06ah,0d5h,030h,036h,0a5h,038h
DB	0bfh,040h,0a3h,09eh,081h,0f3h,0d7h,0fbh
DB	07ch,0e3h,039h,082h,09bh,02fh,0ffh,087h
DB	034h,08eh,043h,044h,0c4h,0deh,0e9h,0cbh
DB	054h,07bh,094h,032h,0a6h,0c2h,023h,03dh
DB	0eeh,04ch,095h,00bh,042h,0fah,0c3h,04eh
DB	008h,02eh,0a1h,066h,028h,0d9h,024h,0b2h
DB	076h,05bh,0a2h,049h,06dh,08bh,0d1h,025h
DB	072h,0f8h,0f6h,064h,086h,068h,098h,016h
DB	0d4h,0a4h,05ch,0cch,05dh,065h,0b6h,092h
DB	06ch,070h,048h,050h,0fdh,0edh,0b9h,0dah
DB	05eh,015h,046h,057h,0a7h,08dh,09dh,084h
DB	090h,0d8h,0abh,000h,08ch,0bch,0d3h,00ah
DB	0f7h,0e4h,058h,005h,0b8h,0b3h,045h,006h
DB	0d0h,02ch,01eh,08fh,0cah,03fh,00fh,002h
DB	0c1h,0afh,0bdh,003h,001h,013h,08ah,06bh
DB	03ah,091h,011h,041h,04fh,067h,0dch,0eah
DB	097h,0f2h,0cfh,0ceh,0f0h,0b4h,0e6h,073h
DB	096h,0ach,074h,022h,0e7h,0adh,035h,085h
DB	0e2h,0f9h,037h,0e8h,01ch,075h,0dfh,06eh
DB	047h,0f1h,01ah,071h,01dh,029h,0c5h,089h
DB	06fh,0b7h,062h,00eh,0aah,018h,0beh,01bh
DB	0fch,056h,03eh,04bh,0c6h,0d2h,079h,020h
DB	09ah,0dbh,0c0h,0feh,078h,0cdh,05ah,0f4h
DB	01fh,0ddh,0a8h,033h,088h,007h,0c7h,031h
DB	0b1h,012h,010h,059h,027h,080h,0ech,05fh
DB	060h,051h,07fh,0a9h,019h,0b5h,04ah,00dh
DB	02dh,0e5h,07ah,09fh,093h,0c9h,09ch,0efh
DB	0a0h,0e0h,03bh,04dh,0aeh,02ah,0f5h,0b0h
DB	0c8h,0ebh,0bbh,03ch,083h,053h,099h,061h
DB	017h,02bh,004h,07eh,0bah,077h,0d6h,026h
DB	0e1h,069h,014h,063h,055h,021h,00ch,07dh
	DD	080808080h,080808080h,0fefefefeh,0fefefefeh
	DD	01b1b1b1bh,01b1b1b1bh,0,0
DB	65,69,83,32,102,111,114,32,120,56,54,95,54,52,44,32
DB	67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97
DB	112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103
DB	62,0
ALIGN	64
EXTERN	__imp_RtlVirtualUnwind:NEAR

ALIGN	16
block_se_handler	PROC PRIVATE
	push	rsi
	push	rdi
	push	rbx
	push	rbp
	push	r12
	push	r13
	push	r14
	push	r15
	pushfq
	sub	rsp,64

	mov	rax,QWORD PTR[120+r8]
	mov	rbx,QWORD PTR[248+r8]

	mov	rsi,QWORD PTR[8+r9]
	mov	r11,QWORD PTR[56+r9]

	mov	r10d,DWORD PTR[r11]
	lea	r10,QWORD PTR[r10*1+rsi]
	cmp	rbx,r10
	jb	$L$in_block_prologue

	mov	rax,QWORD PTR[152+r8]

	mov	r10d,DWORD PTR[4+r11]
	lea	r10,QWORD PTR[r10*1+rsi]
	cmp	rbx,r10
	jae	$L$in_block_prologue

	mov	rax,QWORD PTR[24+rax]
	lea	rax,QWORD PTR[48+rax]

	mov	rbx,QWORD PTR[((-8))+rax]
	mov	rbp,QWORD PTR[((-16))+rax]
	mov	r12,QWORD PTR[((-24))+rax]
	mov	r13,QWORD PTR[((-32))+rax]
	mov	r14,QWORD PTR[((-40))+rax]
	mov	r15,QWORD PTR[((-48))+rax]
	mov	QWORD PTR[144+r8],rbx
	mov	QWORD PTR[160+r8],rbp
	mov	QWORD PTR[216+r8],r12
	mov	QWORD PTR[224+r8],r13
	mov	QWORD PTR[232+r8],r14
	mov	QWORD PTR[240+r8],r15

$L$in_block_prologue::
	mov	rdi,QWORD PTR[8+rax]
	mov	rsi,QWORD PTR[16+rax]
	mov	QWORD PTR[152+r8],rax
	mov	QWORD PTR[168+r8],rsi
	mov	QWORD PTR[176+r8],rdi

	jmp	$L$common_seh_exit
block_se_handler	ENDP


ALIGN	16
key_se_handler	PROC PRIVATE
	push	rsi
	push	rdi
	push	rbx
	push	rbp
	push	r12
	push	r13
	push	r14
	push	r15
	pushfq
	sub	rsp,64

	mov	rax,QWORD PTR[120+r8]
	mov	rbx,QWORD PTR[248+r8]

	mov	rsi,QWORD PTR[8+r9]
	mov	r11,QWORD PTR[56+r9]

	mov	r10d,DWORD PTR[r11]
	lea	r10,QWORD PTR[r10*1+rsi]
	cmp	rbx,r10
	jb	$L$in_key_prologue

	mov	rax,QWORD PTR[152+r8]

	mov	r10d,DWORD PTR[4+r11]
	lea	r10,QWORD PTR[r10*1+rsi]
	cmp	rbx,r10
	jae	$L$in_key_prologue

	lea	rax,QWORD PTR[56+rax]

	mov	rbx,QWORD PTR[((-8))+rax]
	mov	rbp,QWORD PTR[((-16))+rax]
	mov	r12,QWORD PTR[((-24))+rax]
	mov	r13,QWORD PTR[((-32))+rax]
	mov	r14,QWORD PTR[((-40))+rax]
	mov	r15,QWORD PTR[((-48))+rax]
	mov	QWORD PTR[144+r8],rbx
	mov	QWORD PTR[160+r8],rbp
	mov	QWORD PTR[216+r8],r12
	mov	QWORD PTR[224+r8],r13
	mov	QWORD PTR[232+r8],r14
	mov	QWORD PTR[240+r8],r15

$L$in_key_prologue::
	mov	rdi,QWORD PTR[8+rax]
	mov	rsi,QWORD PTR[16+rax]
	mov	QWORD PTR[152+r8],rax
	mov	QWORD PTR[168+r8],rsi
	mov	QWORD PTR[176+r8],rdi

	jmp	$L$common_seh_exit
key_se_handler	ENDP


ALIGN	16
cbc_se_handler	PROC PRIVATE
	push	rsi
	push	rdi
	push	rbx
	push	rbp
	push	r12
	push	r13
	push	r14
	push	r15
	pushfq
	sub	rsp,64

	mov	rax,QWORD PTR[120+r8]
	mov	rbx,QWORD PTR[248+r8]

	lea	r10,QWORD PTR[$L$cbc_prologue]
	cmp	rbx,r10
	jb	$L$in_cbc_prologue

	lea	r10,QWORD PTR[$L$cbc_fast_body]
	cmp	rbx,r10
	jb	$L$in_cbc_frame_setup

	lea	r10,QWORD PTR[$L$cbc_slow_prologue]
	cmp	rbx,r10
	jb	$L$in_cbc_body

	lea	r10,QWORD PTR[$L$cbc_slow_body]
	cmp	rbx,r10
	jb	$L$in_cbc_frame_setup

$L$in_cbc_body::
	mov	rax,QWORD PTR[152+r8]

	lea	r10,QWORD PTR[$L$cbc_epilogue]
	cmp	rbx,r10
	jae	$L$in_cbc_prologue

	lea	rax,QWORD PTR[8+rax]

	lea	r10,QWORD PTR[$L$cbc_popfq]
	cmp	rbx,r10
	jae	$L$in_cbc_prologue

	mov	rax,QWORD PTR[8+rax]
	lea	rax,QWORD PTR[56+rax]

$L$in_cbc_frame_setup::
	mov	rbx,QWORD PTR[((-16))+rax]
	mov	rbp,QWORD PTR[((-24))+rax]
	mov	r12,QWORD PTR[((-32))+rax]
	mov	r13,QWORD PTR[((-40))+rax]
	mov	r14,QWORD PTR[((-48))+rax]
	mov	r15,QWORD PTR[((-56))+rax]
	mov	QWORD PTR[144+r8],rbx
	mov	QWORD PTR[160+r8],rbp
	mov	QWORD PTR[216+r8],r12
	mov	QWORD PTR[224+r8],r13
	mov	QWORD PTR[232+r8],r14
	mov	QWORD PTR[240+r8],r15

$L$in_cbc_prologue::
	mov	rdi,QWORD PTR[8+rax]
	mov	rsi,QWORD PTR[16+rax]
	mov	QWORD PTR[152+r8],rax
	mov	QWORD PTR[168+r8],rsi
	mov	QWORD PTR[176+r8],rdi

$L$common_seh_exit::

	mov	rdi,QWORD PTR[40+r9]
	mov	rsi,r8
	mov	ecx,154
	DD	0a548f3fch


	mov	rsi,r9
	xor	rcx,rcx
	mov	rdx,QWORD PTR[8+rsi]
	mov	r8,QWORD PTR[rsi]
	mov	r9,QWORD PTR[16+rsi]
	mov	r10,QWORD PTR[40+rsi]
	lea	r11,QWORD PTR[56+rsi]
	lea	r12,QWORD PTR[24+rsi]
	mov	QWORD PTR[32+rsp],r10
	mov	QWORD PTR[40+rsp],r11
	mov	QWORD PTR[48+rsp],r12
	mov	QWORD PTR[56+rsp],rcx
	call	QWORD PTR[__imp_RtlVirtualUnwind]

	mov	eax,1
	add	rsp,64
	popfq
	pop	r15
	pop	r14
	pop	r13
	pop	r12
	pop	rbp
	pop	rbx
	pop	rdi
	pop	rsi
	DB	0F3h,0C3h		;repret
cbc_se_handler	ENDP

.text$	ENDS
.pdata	SEGMENT READONLY ALIGN(4)
ALIGN	4
	DD	imagerel $L$SEH_begin_AES_encrypt
	DD	imagerel $L$SEH_end_AES_encrypt
	DD	imagerel $L$SEH_info_AES_encrypt

	DD	imagerel $L$SEH_begin_AES_decrypt
	DD	imagerel $L$SEH_end_AES_decrypt
	DD	imagerel $L$SEH_info_AES_decrypt

	DD	imagerel $L$SEH_begin_private_AES_set_encrypt_key
	DD	imagerel $L$SEH_end_private_AES_set_encrypt_key
	DD	imagerel $L$SEH_info_private_AES_set_encrypt_key

	DD	imagerel $L$SEH_begin_private_AES_set_decrypt_key
	DD	imagerel $L$SEH_end_private_AES_set_decrypt_key
	DD	imagerel $L$SEH_info_private_AES_set_decrypt_key

	DD	imagerel $L$SEH_begin_AES_cbc_encrypt
	DD	imagerel $L$SEH_end_AES_cbc_encrypt
	DD	imagerel $L$SEH_info_AES_cbc_encrypt

.pdata	ENDS
.xdata	SEGMENT READONLY ALIGN(8)
ALIGN	8
$L$SEH_info_AES_encrypt::
DB	9,0,0,0
	DD	imagerel block_se_handler
	DD	imagerel $L$enc_prologue,imagerel $L$enc_epilogue

$L$SEH_info_AES_decrypt::
DB	9,0,0,0
	DD	imagerel block_se_handler
	DD	imagerel $L$dec_prologue,imagerel $L$dec_epilogue

$L$SEH_info_private_AES_set_encrypt_key::
DB	9,0,0,0
	DD	imagerel key_se_handler
	DD	imagerel $L$enc_key_prologue,imagerel $L$enc_key_epilogue

$L$SEH_info_private_AES_set_decrypt_key::
DB	9,0,0,0
	DD	imagerel key_se_handler
	DD	imagerel $L$dec_key_prologue,imagerel $L$dec_key_epilogue

$L$SEH_info_AES_cbc_encrypt::
DB	9,0,0,0
	DD	imagerel cbc_se_handler

.xdata	ENDS
END
