kIfinityPrice equ 0x0FFFFFFF

;* Call: ***************************************************************
;lzma_compress(
;	const void* source,
;	void* destination,
;	unsigned length,
;	void* workmem)
lzma_compress:
	push	ebp
	mov	ebp,esp
	and	esp,0xFFFFFFF8
	sub	esp,12
	push	ebx
	push	esi
	push	edi
	push	2
	pop	esi
	xor	ebx,ebx
	mov	[esp+20],esi
	mov	[g_FastPos],bl
	mov	byte [g_FastPos+1],1
	mov	[esp+16],esi
;----------------------------------------------------------
.labl_00:
	mov	ecx,[esp+16]
	xor	edi,edi
	sar	ecx,1
	dec	ecx
	inc	edi
	shl	edi,cl
	cmp	edi,ebx
	jbe	.labl_01

	mov	eax,[esp+20]
	push	edi
	push	dword [esp+20]
	lea	eax,[eax+g_FastPos]
	push	eax
	call	_memset
	add	esp,12
	add	[esp+20],edi
;----------------------------------------------------------
.labl_01:
	inc	dword [esp+16]
	cmp	dword [esp+16],20
	jl	.labl_00

	mov	edi,[ebp+20]
	push	3
	pop	eax
	mov	ecx,edi
	and	ecx,eax
	mov	edx,128
	mov	[_numFastBytes],edx
	mov	[_posStateBits],esi
	mov	[_posStateMask],eax
	mov	[_numLiteralContextBits],eax
	mov	[_numLiteralPosStateBits],ebx
	mov	[_writeEndMark],bl
	mov	[_finished],bl
	je	.labl_02

	sub	edi,ecx
	add	edi,4
;----------------------------------------------------------
.labl_02:
;CLiteralEncoder_Create
	mov	[_numPrevBits],eax
	mov	eax,[_dictionarySize]
	mov	[_posEncoders],edi
	add	edi,0x6000
	inc	eax
	mov	[_numPosBits],ebx
	mov	[_posMask],ebx
;MatchFinder_Create
	mov	[_matchMaxLen],edx
	mov	[_cyclicBufferSize],eax
	mov	[_hash],edi
	mov	dword [_cutValue],0xFF
	call	CEncoder_Init
	call	FillPosSlotPrices
	call	FillDistancesPrices
	call	FillAlignPrices
	push	127
	pop	esi
	mov	[_lenEncoder+0xC88C],esi
	mov	[esp+16],ebx
;----------------------------------------------------------
.labl_03:
	push	dword [esp+16]
	mov	eax,_lenEncoder
	call	CPriceTableEncoder_UpdateTable
	inc	dword [esp+16]
	cmp	dword [esp+16],4
	jb	.labl_03

	mov	[_repMatchLenEncoder+0xC88C],esi
	xor	esi,esi
;----------------------------------------------------------
.labl_04:
	push	esi
	mov	eax,_repMatchLenEncoder
	call	CPriceTableEncoder_UpdateTable
	inc	esi
	cmp	esi,4
	jb	.labl_04

	mov	eax,[ebp+8]
	mov	esi,[ebp+12]
	dec	eax
	mov	[_buffer],eax
	mov	eax,[ebp+16]
	inc	eax
	mov	[_streamPos],eax
	mov	ecx,0x110000
	xor	eax,eax
	mov	[lastPosSlotFillingPos],ebx
	mov	[lastPosSlotFillingPos+4],ebx
	mov	[nowPos64],ebx
	mov	[nowPos64+4],ebx
	mov	[pack_length],esi
	mov	dword [_pos],1
	rep	stosd	
	mov	[pack_pos],ebx
;----------------------------------------------------------
;MatchFinder_Init
.labl_08:
	push	8
	mov	eax,ebx
	pop	ecx
;----------------------------------------------------------
.labl_07:
	test	al,1
	je	.labl_05

	shr	eax,1
	xor	eax,0xEDB88320
	jmp	.labl_06
;----------------------------------------------------------
.labl_05:
	shr	eax,1
;----------------------------------------------------------
.labl_06:
	dec	ecx
	jne	.labl_07

	mov	[crc_table+ebx*4],eax
	inc	ebx
	cmp	ebx,256
	jb	.labl_08
;----------------------------------------------------------
.labl_09:
	call	CodeOneBlock
	test	al,al
	jne	.labl_09

	mov	eax,[pack_length]
	pop	edi
	sub	eax,esi
	pop	esi
	pop	ebx
	mov	esp,ebp
	pop	ebp
	ret	16
;*****************************************************************************

;* Call: ***************************************************************
_memset:
	push	edi
	mov	edi,[esp+8]
	mov	al,[esp+12]
	mov	ecx,[esp+16]
	rep	stosb	
	pop	edi
	ret	
;*****************************************************************************

;* Call: ***************************************************************
CEncoder_Init:
;RangeEncoder_Init
	and	dword [low],0
	and	dword [low+4],0
	or	dword [_range],0xFFFFFFFF
	push	ebx
	push	esi
	push	edi
	xor	eax,eax
	mov	edi,_repDistances
	stosd	
	stosd	
	xor	ebx,ebx
	stosd	
	inc	ebx
;CBaseState_Init
	mov	byte [_state],0
	mov	byte [_previousByte],0
	stosd
	mov	[_cacheSize],ebx
	mov	byte [_cache],0
	xor	ecx,ecx
;----------------------------------------------------------
.labl_00:
	mov	eax,ebx
	shl	eax,cl
	push	8
	pop	edx
	sub	edx,ecx
	lea	esi,[Models+eax*4]
	shl	edx,6
;----------------------------------------------------------
.labl_01:
	mov	edi,eax
	shl	edi,6
	shr	edi,cl
	add	edi,edx
	mov	[esi],edi
	add	esi,4
	dec	eax
	jne	.labl_01

	inc	ecx
	cmp	ecx,9
	jl	.labl_00

	push	12
	pop	edx
	mov	esi,1024
	mov	eax,esi
	mov	ecx,edx
	mov	edi,_isRepG2
	rep	stosd
	mov	ecx,edx
	mov	edi,_isRepG1
	rep	stosd	
	mov	ecx,edx
	mov	edi,_isRepG0
	rep	stosd	
	mov	ecx,edx
	mov	edi,_isRep
	rep	stosd	
	xor	ecx,ecx
;----------------------------------------------------------
.labl_02:
	lea	edi,[ecx+_isRep0Long]
	mov	eax,esi
	stosd
	stosd
	stosd
	stosd
	lea	edi,[ecx+_isMatch]
	mov	eax,esi
	stosd
	stosd
	stosd
	add	ecx,64
	cmp	ecx,768
	stosd
	jl	.labl_02

	mov	eax,[_numPrevBits]
	mov	ecx,[_numPosBits]
	add	ecx,eax
	mov	eax,ebx
	shl	eax,cl
	test	eax,eax
	jbe	.labl_04

	xor	edx,edx
	mov	ebx,eax
;----------------------------------------------------------
.labl_03:
	mov	eax,[_posEncoders]
	lea	edi,[edx+eax]
	mov	ecx,768
	mov	eax,esi
	add	edx,3072
	dec	ebx
	rep	stosd	
	jne	.labl_03
;----------------------------------------------------------
.labl_04:
	mov	edi,_posSlotEncoder
;----------------------------------------------------------
.labl_05:
	push	6
	pop	ecx
	mov	eax,edi
	call	CBitTreeEncoder_Init
	add	edi,1028
	cmp	edi,lastPosSlotFillingPos
	jl	.labl_05

	push	114
	mov	eax,esi
	pop	ecx
	mov	edi,_literalEncoder
	mov	esi,_lenEncoder
	rep	stosd
	call	CPriceTableEncoder_Init
	mov	esi,_repMatchLenEncoder
	call	CPriceTableEncoder_Init
	push	4
	pop	ecx
	mov	eax,_posAlignEncoder
	call	CBitTreeEncoder_Init
	pop	edi
	xor	eax,eax
	pop	esi
	mov	byte [_longestMatchWasFound],0
	mov	[_optimumEndIndex],eax
	mov	[_optimumCurrentIndex],eax
	mov	[_additionalOffset],eax
	pop	ebx
	ret	
;*****************************************************************************

;* Call: ***************************************************************
CodeOneBlock:
	sub	esp,0x2C
	cmp	byte [_finished],0
	push	ebx
	push	ebp
	push	esi
	push	edi
	je	.labl_01
;----------------------------------------------------------
.labl_00:
	xor	al,al
	jmp	.labl_28
;----------------------------------------------------------
.labl_01:
	mov	ebp,[nowPos64]
	mov	edi,[nowPos64+4]
	mov	eax,ebp
	or	eax,edi
	mov	byte [_finished],1
	mov	[esp+52],ebp
	mov	[esp+56],edi
	jne	.labl_04

	mov	eax,[_streamPos]
	sub	eax,[_pos]
	jne	.labl_03

	push	5
	pop	esi
;----------------------------------------------------------
.labl_02:
	call	RangeEncoder_ShiftLow
	dec	esi
	jne	.labl_02

	jmp	.labl_00
;----------------------------------------------------------
.labl_03:
	call	ReadMatchDistances
	movzx	esi,byte [_state]
	mov	edx,esi
	shl	edx,6
	xor	edi,edi
	push	edi
	add	edx,_isMatch
	call	CMyBitEncoder_Encode
	mov	al,[esi+LiteralNextStates]
	mov	ecx,[_pos]
	mov	[_state],al
	mov	eax,[_buffer]
	sub	eax,[_additionalOffset]
	mov	bl,[eax+ecx]
	mov	al,[_previousByte]
	mov	[esp+24],bl
	push	dword [esp+24]
	push	edi
	call	CState_IsCharState
	imul	eax,eax,3072
	add	eax,[_posEncoders]
	push	eax
	call	CLiteralEncoder2_Encode
	dec	dword [_additionalOffset]
	xor	ebp,ebp
	inc	ebp
	mov	[_previousByte],bl
	mov	[nowPos64],ebp
	mov	[nowPos64+4],edi
;----------------------------------------------------------
.labl_04:
	mov	eax,[_streamPos]
	sub	eax,[_pos]
	jne	.labl_06

	push	5
	pop	esi
;----------------------------------------------------------
.labl_05:
	call	RangeEncoder_ShiftLow
	dec	esi
	jne	.labl_05

	jmp	.labl_00
;----------------------------------------------------------
.labl_06:
	lea	eax,[esp+20]
	push	eax
	lea	eax,[esp+20]
	push	eax
	mov	ebx,ebp
	push	ebp
	and	ebx,3
	call	GetOptimum
	cmp	dword [esp+20],1
	jne	.labl_09

	cmp	dword [esp+16],0xFFFFFFFF
	jne	.labl_09

	movzx	eax,byte [_state]
	shl	eax,4
	add	eax,ebx
	push	0
	lea	edx,[_isMatch+eax*4]
	call	CMyBitEncoder_Encode
	mov	eax,[_buffer]
	mov	esi,[_additionalOffset]
	mov	ebx,[_pos]
	sub	eax,esi
	mov	al,[eax+ebx]
	mov	[esp+24],al
	mov	al,[_previousByte]
	push	ebp
	call	CState_IsCharState
	imul	eax,eax,3072
	add	eax,[_posEncoders]
	cmp	byte [_state],7
	push	dword [esp+24]
	jb	.labl_07

	mov	ecx,[_buffer]
	sub	ecx,[_repDistances]
	sub	ecx,esi
	mov	cl,[ecx+ebx-1]
	mov	[esp+52],cl
	push	dword [esp+52]
	push	eax
	call	CLiteralEncoder2_EncodeMatched
	jmp	.labl_08
;----------------------------------------------------------
.labl_07:
	push	eax
	call	CLiteralEncoder2_Encode
;----------------------------------------------------------
.labl_08:
	movzx	eax,byte [_state]
	mov	al,[eax+LiteralNextStates]
	mov	[_state],al
	mov	al,[esp+24]
	jmp	.labl_24
;----------------------------------------------------------
.labl_09:
	movzx	edi,byte [_state]
	mov	eax,edi
	shl	eax,4
	add	eax,ebx
	shl	eax,2
	push	1
	lea	edx,[eax+_isMatch]
	mov	[esp+40],eax
	call	CMyBitEncoder_Encode
	cmp	dword [esp+16],4
	jnb	.labl_17

	mov	esi,edi
	shl	esi,2
	push	1
	lea	edx,[esi+_isRep]
	call	CMyBitEncoder_Encode
	cmp	dword [esp+16],0
	lea	edx,[esi+_isRepG0]
	jne	.labl_10

	push	0
	call	CMyBitEncoder_Encode
	mov	edx,[esp+36]
	xor	eax,eax
	cmp	dword [esp+20],1
	lea	edx,[edx+_isRep0Long]
	setne	al
	jmp	.labl_12
;----------------------------------------------------------
.labl_10:
	push	1
	call	CMyBitEncoder_Encode
	cmp	dword [esp+16],1
	lea	edx,[esi+_isRepG1]
	jne	.labl_11

	push	0
	jmp	.labl_13
;----------------------------------------------------------
.labl_11:
	push	1
	call	CMyBitEncoder_Encode
	mov	eax,[esp+16]
	add	eax,0xFFFFFFFE
	lea	edx,[esi+_isRepG2]
;----------------------------------------------------------
.labl_12:
	push	eax
;----------------------------------------------------------
.labl_13:
	call	CMyBitEncoder_Encode
	mov	eax,[esp+20]
	cmp	eax,1
	jne	.labl_14

	mov	al,[edi+ShortRepNextStates]
	jmp	.labl_15
;----------------------------------------------------------
.labl_14:
	add	eax,0xFFFFFFFE
	mov	esi,_repMatchLenEncoder
	call	CPriceTableEncoder_Encode
	mov	al,[edi+RepNextStates]
;----------------------------------------------------------
.labl_15:
	mov	[_state],al
	mov	eax,[esp+16]
	mov	ecx,[_repDistances+eax*4]
	test	eax,eax
	je	.labl_23
;----------------------------------------------------------
.labl_16:
	dec	eax
	mov	edx,[_repDistances+eax*4]
	mov	[_repDistances+4+eax*4],edx
	jne	.labl_16

	mov	[_repDistances],ecx
	jmp	.labl_23
;----------------------------------------------------------
.labl_17:
	push	0
	lea	edx,[_isRep+edi*4]
	call	CMyBitEncoder_Encode
	mov	al,[edi+MatchNextStates]
	mov	edi,[esp+20]
	mov	[_state],al
	add	edi,0xFFFFFFFE
	mov	eax,edi
	mov	esi,_lenEncoder
	call	CPriceTableEncoder_Encode
	sub	dword [esp+16],4
	mov	eax,[esp+16]
	call	GetPosSlot
	cmp	dword [esp+20],6
	mov	ebx,eax
	jb	.labl_18

	push	3
	pop	edi
;----------------------------------------------------------
.labl_18:
	imul	edi,edi,1028
	push	ebx
	add	edi,_posSlotEncoder
	call	cm_pr_16
	cmp	ebx,4
	jb	.labl_21

	mov	esi,[esp+16]
	xor	eax,eax
	inc	eax
	mov	ecx,ebx
	mov	edi,ebx
	and	edi,eax
	shr	ecx,1
	dec	ecx
	or	edi,2
	shl	edi,cl
	sub	esi,edi
	cmp	ebx,14
	jnb	.labl_20

	mov	[esp+32],esi
	mov	[esp+28],eax
	test	ecx,ecx
	jle	.labl_21

	mov	[esp+36],ecx
;----------------------------------------------------------
.labl_19:
	mov	edx,[esp+28]
	mov	esi,[esp+32]
	sub	edx,ebx
	add	edx,edi
	and	esi,1
	push	esi
	lea	edx,[_numLiteralContextBits+edx*4]
	call	CMyBitEncoder_Encode
	mov	eax,[esp+28]
	shr	dword [esp+32],1
	dec	dword [esp+36]
	lea	eax,[esi+eax*2]
	mov	[esp+28],eax
	jne	.labl_19

	jmp	.labl_21
;----------------------------------------------------------
.labl_20:
	lea	eax,[ecx-4]
	mov	ecx,esi
	shr	ecx,4
	push	ecx
	call	RangeEncoder_EncodeDirectBits
	and	esi,0xF
	push	esi
	call	CBitTreeEncoder_ReverseEncode
	dec	dword [_alignPriceCount]
	jne	.labl_21

	call	FillAlignPrices
;----------------------------------------------------------
.labl_21:
	mov	eax,_repDistances+12
;----------------------------------------------------------
.labl_22:
	mov	ecx,[eax-4]
	mov	[eax],ecx
	sub	eax,4
	cmp	eax,_repDistances
	jne	.labl_22

	mov	eax,[esp+16]
	mov	[_repDistances],eax
;----------------------------------------------------------
.labl_23:
	mov	eax,[_buffer]
	mov	esi,[_additionalOffset]
	mov	ebx,[_pos]
	mov	ecx,[esp+20]
	mov	edi,[nowPos64+4]
	sub	eax,esi
	add	eax,ebx
	mov	al,[eax+ecx-1]
;----------------------------------------------------------
.labl_24:
	sub	esi,[esp+20]
	add	ebp,[esp+20]
	mov	[_previousByte],al
	adc	edi,0
	mov	eax,ebp
	sub	eax,[lastPosSlotFillingPos]
	mov	ecx,edi
	sbb	ecx,[lastPosSlotFillingPos+4]
	mov	[_additionalOffset],esi
	mov	[nowPos64],ebp
	mov	[nowPos64+4],edi
	mov	[esp+40],ecx
	jne	.labl_25

	cmp	eax,512
	jb	.labl_26
;----------------------------------------------------------
.labl_25:
	call	FillPosSlotPrices
	call	FillDistancesPrices
	mov	[lastPosSlotFillingPos],ebp
	mov	[lastPosSlotFillingPos+4],edi
;----------------------------------------------------------
.labl_26:
	test	esi,esi
	jne	.labl_06

	mov	eax,[_streamPos]
	sub	eax,ebx
	je	.labl_29

	mov	ecx,ebp
	sub	ecx,[esp+52]
	mov	eax,edi
	sbb	eax,[esp+56]
	test	eax,eax
	ja	.labl_27

	jb	.labl_06

	cmp	ecx,0x1000
	jb	.labl_06
;----------------------------------------------------------
.labl_27:
	mov	byte [_finished],0
	mov	al,1
;----------------------------------------------------------
.labl_28:
	pop	edi
	pop	esi
	pop	ebp
	pop	ebx
	add	esp,44
	ret	
;----------------------------------------------------------
.labl_29:
	push	5
	pop	esi
;----------------------------------------------------------
.labl_30:
	call	RangeEncoder_ShiftLow
	dec	esi
	jne	.labl_30

	jmp	.labl_00
;*****************************************************************************

;* Call: ***************************************************************
GetOptimum:
	push	ebp
	mov	ebp,esp
	mov	ecx,[_optimumCurrentIndex]
	sub	esp,116
	push	esi
	cmp	[_optimumEndIndex],ecx
	je	.labl_00

	mov	eax,ecx
	imul	eax,eax,40
	add	eax,state.State
	mov	edx,[eax+16]
	mov	eax,[eax+20]
	mov	esi,edx
	sub	esi,ecx
	mov	ecx,[ebp+16]
	mov	[ecx],esi
	mov	ecx,[ebp+12]
	mov	[ecx],eax
	mov	[_optimumCurrentIndex],edx
	jmp	.labl_76
;----------------------------------------------------------
.labl_00:
	push	edi
	xor	edi,edi
	cmp	byte [_longestMatchWasFound],0
	mov	[_optimumEndIndex],edi
	mov	[_optimumCurrentIndex],edi
	jne	.labl_01

	call	ReadMatchDistances
	jmp	.labl_02
;----------------------------------------------------------
.labl_01:
	mov	eax,[_longestMatchLength]
	mov	byte [_longestMatchWasFound],0
;----------------------------------------------------------
.labl_02:
	push	ebx
	mov	ebx,[ebp+8]
	mov	[ebp-16],eax
	mov	eax,ebx
	shl	eax,2
	mov	[ebp-76],eax
;----------------------------------------------------------
.labl_03:
	mov	esi,edi
	shl	esi,2
	mov	eax,[esi+_repDistances]
	push	eax
	mov	[ebp+esi-100],eax
	push	dword 0xFFFFFFFF
	mov	eax,273
	call	GetMatchLen
	mov	[ebp+esi-116],eax
	test	edi,edi
	je	.labl_04

	mov	ecx,[ebp-76]
	cmp	eax,[ebp+ecx-116]
	jbe	.labl_05
;----------------------------------------------------------
.labl_04:
	mov	ebx,edi
	mov	[ebp-76],esi
;----------------------------------------------------------
.labl_05:
	inc	edi
	cmp	edi,4
	jb	.labl_03

	mov	eax,[ebp+ebx*4-116]
	mov	ecx,128
	mov	[ebp-68],eax
	cmp	eax,ecx
	jb	.labl_06

	mov	ecx,[ebp+12]
	mov	[ecx],ebx
	jmp	.labl_07
;----------------------------------------------------------
.labl_06:
	cmp	[ebp-16],ecx
	jb	.labl_08

	mov	eax,[distances+512]
	mov	ecx,[ebp+12]
	add	eax,4
	mov	[ecx],eax
	mov	eax,[ebp-16]
;----------------------------------------------------------
.labl_07:
	mov	ecx,[ebp+16]
	mov	[ecx],eax
	dec	eax
	call	MovePos
	jmp	.labl_75
;----------------------------------------------------------
.labl_08:
	mov	ecx,[_buffer]
	mov	eax,[_pos]
	mov	dl,[eax+ecx-1]
	sub	eax,[_repDistances]
	mov	bl,[_state]
	mov	[state.State],bl
	mov	al,[eax+ecx-2]
	mov	[ebp-52],al
	mov	eax,[ebp+8]
	and	eax,3
	movzx	ecx,bl
	shl	ecx,4
	add	ecx,eax
	mov	esi,[_isMatch+ecx*4]
	mov	[ebp-28],eax
	cmp	bl,7
	sbb	al,al
	mov	[ebp-48],dl
	push	dword [ebp-48]
	inc	al
	push	dword [ebp-52]
	movzx	eax,al
	push	eax
	push	dword [ebp+8]
	mov	al,[_previousByte]
	mov	[ebp-76],esi
	call	CLiteralEncoder_GetPrice
	or	dword [state.BackPrev+40],0xFFFFFFFF
	and	dword [state.PosPrev+40],0
	shr	esi,2
	add	eax,[Models+esi*4]
	mov	byte [state.Prev1IsChar+40],0
	mov	[state.Price+40],eax
	lea	esi,[ebp-100]
	mov	edi,state.Backs
	movsd	
	movsd	
	mov	eax,2048
	mov	ecx,eax
	sub	ecx,[ebp-76]
	movsd	
	shr	ecx,2
	mov	edx,[Models+ecx*4]
	movzx	ecx,bl
	movsd	
	mov	esi,[_isRep+ecx*4]
	sub	eax,esi
	shr	eax,2
	mov	edi,[Models+eax*4]
	mov	al,[ebp-48]
	add	edi,edx
	mov	[ebp-76],edx
	cmp	[ebp-52],al
	jne	.labl_09

	push	dword [ebp-28]
	mov	al,bl
	call	GetRepLen1Price
	add	eax,edi
	cmp	eax,[state.Price+40]
	jnb	.labl_09

	and	dword [state.BackPrev+40],0
	mov	[state.Price+40],eax
	mov	byte [state.Prev1IsChar+40],0
;----------------------------------------------------------
.labl_09:
	push	2
	pop	eax
	cmp	[ebp-16],eax
	jnb	.labl_10

	mov	eax,[ebp+12]
	mov	ecx,[state.BackPrev+40]
	mov	[eax],ecx
	mov	eax,[ebp+16]
	mov	dword [eax],1
	jmp	.labl_75
;----------------------------------------------------------
.labl_10:
	mov	ecx,[ebp-16]
	shr	esi,2
	mov	esi,[Models+esi*4]
	add	esi,[ebp-76]
	mov	[ebp-76],esi
	cmp	ecx,[ebp-68]
	ja	.labl_11

	and	dword [ebp-16],0
;----------------------------------------------------------
.labl_11:
	mov	[ebp-24],eax
	cmp	[ebp-16],eax
	jb	.labl_13

	mov	esi,state.BackPrev+40*2
;----------------------------------------------------------
.labl_12:
	mov	eax,[ebp-24]
	mov	edx,[distances+eax*4]
	push	dword [ebp-28]
	and	dword [esi-4],0
	lea	ecx,[edx+4]
	mov	[esi],ecx
	call	GetPosLenPrice
	add	eax,[ebp-76]
	inc	dword [ebp-24]
	mov	[esi-8],eax
	mov	eax,[ebp-24]
	mov	byte [esi-19],0
	add	esi,40
	cmp	eax,[ebp-16]
	jbe	.labl_12
;----------------------------------------------------------
.labl_13:
	mov	ecx,[ebp-16]
	cmp	ecx,[ebp-68]
	jnb	.labl_14

	mov	ecx,[ebp-68]
	mov	[ebp-16],ecx
;----------------------------------------------------------
.labl_14:
	cmp	[ebp-24],ecx
	ja	.labl_16

	mov	eax,[ebp-24]
	sub	ecx,[ebp-24]
	imul	eax,eax,40
	add	eax,state.Price
	inc	ecx
;----------------------------------------------------------
.labl_15:
	mov	dword [eax],kIfinityPrice
	add	eax,40
	dec	ecx
	jne	.labl_15
;----------------------------------------------------------
.labl_16:
	and	dword [ebp-24],0
;----------------------------------------------------------
.labl_17:
	mov	eax,[ebp-24]
	mov	eax,[ebp+eax*4-116]
	push	2
	pop	ecx
	mov	[ebp-32],ecx
	cmp	eax,ecx
	jb	.labl_20

	mov	esi,state.Price+40*2
;----------------------------------------------------------
.labl_18:
	push	dword [ebp-28]
	mov	edx,[ebp-24]
	movzx	eax,bl
	push	eax
	mov	eax,[ebp-32]
	call	GetRepPrice
	add	eax,edi
	cmp	eax,[esi]
	jnb	.labl_19

	and	dword [esi+4],0
	mov	[esi],eax
	mov	eax,[ebp-24]
	mov	[esi+8],eax
	mov	byte [esi-11],0
;----------------------------------------------------------
.labl_19:
	inc	dword [ebp-32]
	mov	eax,[ebp-24]
	mov	ecx,[ebp-32]
	add	esi,40
	cmp	ecx,[ebp+eax*4-116]
	jbe	.labl_18
;----------------------------------------------------------
.labl_20:
	inc	dword [ebp-24]
	cmp	dword [ebp-24],4
	jb	.labl_17

	mov	eax,[ebp-16]
	xor	ecx,ecx
	inc	ecx
	mov	[ebp-8],eax
	mov	[ebp-12],ecx
	cmp	eax,ecx
	je	.labl_74
;----------------------------------------------------------
.labl_21:
	mov	edi,[ebp-12]
	inc	dword [ebp+8]
	mov	ebx,edi
	imul	ebx,ebx,40
	mov	dl,[ebx+state.Prev1IsChar]
	mov	esi,[ebx+state.PosPrev]
	test	dl,dl
	je	.labl_25

	dec	esi
	cmp	byte [ebx+state.Prev2],0
	je	.labl_23

	mov	eax,[ebx+state.PosPrev2]
	imul	eax,eax,40
	cmp	dword [ebx+state.BackPrev2],4
	mov	al,[eax+state.State]
	movzx	eax,al
	jnb	.labl_22

	mov	al,[eax+RepNextStates]
	jmp	.labl_24
;----------------------------------------------------------
.labl_22:
	mov	al,[eax+MatchNextStates]
	jmp	.labl_24
;----------------------------------------------------------
.labl_23:
	mov	eax,esi
	imul	eax,eax,40
	mov	al,[eax+state.State]
;----------------------------------------------------------
.labl_24:
	movzx	eax,al
	mov	cl,[eax+LiteralNextStates]
	jmp	.labl_26
;----------------------------------------------------------
.labl_25:
	mov	eax,esi
	imul	eax,eax,40
	mov	cl,[eax+state.State]
;----------------------------------------------------------
.labl_26:
	dec	edi
	cmp	esi,edi
	jne	.labl_29

	cmp	dword [ebx+state.BackPrev],0
	movzx	eax,cl
	jne	.labl_27

	mov	al,[eax+ShortRepNextStates]
	jmp	.labl_28
;----------------------------------------------------------
.labl_27:
	mov	al,[eax+LiteralNextStates]
;----------------------------------------------------------
.labl_28:
	mov	[ebp-20],al
	jmp	.labl_35
;----------------------------------------------------------
.labl_29:
	test	dl,dl
	je	.labl_31

	cmp	byte [ebx+state.Prev2],0
	je	.labl_31

	mov	esi,[ebx+state.PosPrev2]
	mov	eax,[ebx+state.BackPrev2]
	movzx	ecx,cl
;----------------------------------------------------------
.labl_30:
	mov	cl,[ecx+RepNextStates]
	jmp	.labl_32
;----------------------------------------------------------
.labl_31:
	mov	eax,[ebx+state.BackPrev]
	movzx	ecx,cl
	cmp	eax,4
	jb	.labl_30

	mov	cl,[ecx+MatchNextStates]
;----------------------------------------------------------
.labl_32:
	imul	esi,esi,40
	add	esi,state.State
	mov	[ebp-20],cl
	mov	edx,esi
	cmp	eax,4
	jnb	.labl_34

	mov	ecx,[edx+eax*4+24]
	xor	esi,esi
	inc	esi
	mov	[ebp-100],ecx
	cmp	eax,esi
	jb	.labl_33

	lea	esi,[edx+24]
	mov	ecx,eax
	lea	edi,[ebp-96]
	rep	movsd	
	lea	esi,[eax+1]
	cmp	esi,4
	jnb	.labl_35
;----------------------------------------------------------
.labl_33:
	push	4
	lea	edx,[edx+esi*4+24]
	pop	ecx
	lea	edi,[ebp+esi*4-100]
	sub	ecx,esi
	mov	esi,edx
	rep	movsd	
	jmp	.labl_35
;----------------------------------------------------------
.labl_34:
	add	eax,0xFFFFFFFC
	mov	[ebp-100],eax
	lea	esi,[edx+24]
	lea	edi,[ebp-96]
	movsd	
	movsd	
	movsd	
;----------------------------------------------------------
.labl_35:
	mov	al,[ebp-20]
	mov	[ebx+state.State],al
	lea	edi,[ebx+state.Backs]
	lea	esi,[ebp-100]
	movsd	
	movsd	
	movsd	
	movsd	
	call	ReadMatchDistances
	mov	[ebp-44],eax
	cmp	eax,128
	jnb	.labl_73

	mov	eax,[ebx+state.Price]
	mov	edi,[_pos]
	mov	esi,[ebp+8]
	mov	[ebp-72],eax
	mov	eax,[_buffer]
	lea	eax,[edi+eax-1]
	mov	cl,[eax]
	mov	[ebp-48],cl
	push	dword [ebp-48]
	mov	ecx,eax
	sub	ecx,[ebp-100]
	and	esi,3
	mov	cl,[ecx-1]
	mov	[ebp-52],cl
	movzx	ecx,byte [ebp-20]
	push	dword [ebp-52]
	mov	[ebp-64],ecx
	shl	ecx,4
	add	ecx,esi
	mov	ecx,[_isMatch+ecx*4]
	cmp	byte [ebp-20],7
	mov	[ebp-76],ecx
	sbb	cl,cl
	inc	cl
	movzx	ecx,cl
	push	ecx
	push	dword [ebp+8]
	mov	[ebp-40],eax
	mov	al,[eax-1]
	mov	[ebp-28],esi
	call	CLiteralEncoder_GetPrice
	mov	esi,eax
	mov	eax,[ebp-76]
	shr	eax,2
	add	esi,[Models+eax*4]
	mov	byte [ebp-1],0
	add	esi,[ebp-72]
	cmp	esi,[ebx+state.Price+40]
	jnb	.labl_36

	mov	eax,[ebp-12]
	or	dword [ebx+state.BackPrev+40],0xFFFFFFFF
	mov	[ebx+state.Price+40],esi
	mov	[ebx+state.PosPrev+40],eax
	mov	byte [ebx+state.Prev1IsChar+40],0
	mov	byte [ebp-1],1
;----------------------------------------------------------
.labl_36:
	mov	edx,[ebp-64]
	mov	edx,[_isRep+edx*4]
	mov	ecx,2048
	mov	eax,ecx
	sub	eax,[ebp-76]
	sub	ecx,edx
	shr	eax,2
	mov	eax,[Models+eax*4]
	add	eax,[ebp-72]
	shr	ecx,2
	mov	ecx,[Models+ecx*4]
	add	ecx,eax
	mov	[ebp-76],eax
	mov	al,[ebp-48]
	mov	[ebp-84],edx
	mov	[ebp-72],ecx
	cmp	[ebp-52],al
	jne	.labl_38

	mov	eax,[ebp-12]
	cmp	[ebx+state.PosPrev+40],eax
	jnb	.labl_37

	cmp	dword [ebx+state.BackPrev+40],0
	je	.labl_38
;----------------------------------------------------------
.labl_37:
	push	dword [ebp-28]
	mov	al,[ebp-20]
	call	GetRepLen1Price
	add	eax,[ebp-72]
	cmp	eax,[ebx+state.Price+40]
	ja	.labl_38

	and	dword [ebx+state.BackPrev+40],0
	mov	[ebx+state.Price+40],eax
	mov	eax,[ebp-12]
	mov	[ebx+state.PosPrev+40],eax
	mov	byte [ebx+state.Prev1IsChar+40],0
;----------------------------------------------------------
.labl_38:
	mov	eax,[_streamPos]
	sub	eax,edi
	mov	ecx,4095
	sub	ecx,[ebp-12]
	inc	eax
	mov	[ebp-56],eax
	cmp	eax,ecx
	jbe	.labl_39

	mov	eax,ecx
	mov	[ebp-56],ecx
;----------------------------------------------------------
.labl_39:
	mov	[ebp-36],eax
	cmp	eax,2
	jb	.labl_72

	mov	ecx,128
	cmp	eax,ecx
	jbe	.labl_40

	mov	[ebp-36],ecx
;----------------------------------------------------------
.labl_40:
	cmp	dword [ebp-36],3
	jb	.labl_45

	cmp	byte [ebp-1],0
	jne	.labl_45

	mov	ecx,[ebp-100]
	xor	eax,eax
	inc	eax
	inc	ecx
	cmp	[ebp-36],eax
	jbe	.labl_42

	mov	edi,[ebp-40]
	mov	edx,edi
	sub	edx,ecx
;----------------------------------------------------------
.labl_41:
	mov	cl,[eax+edi]
	cmp	cl,[edx+eax]
	jne	.labl_42

	inc	eax
	cmp	eax,[ebp-36]
	jb	.labl_41
;----------------------------------------------------------
.labl_42:
	dec	eax
	mov	[ebp-32],eax
	cmp	eax,2
	jb	.labl_45

	mov	eax,[ebp-64]
	mov	al,[eax+LiteralNextStates]
	mov	ecx,[ebp+8]
	movzx	edx,al
	mov	[ebp-60],al
	mov	eax,edx
	shl	eax,4
	inc	ecx
	mov	edi,2048
	and	ecx,3
	add	eax,ecx
	mov	ebx,edi
	sub	ebx,[_isMatch+eax*4]
	mov	eax,edi
	sub	eax,[_isRep+edx*4]
	mov	edx,[ebp-12]
	shr	ebx,2
	mov	edi,[Models+ebx*4]
	shr	eax,2
	add	edi,[Models+eax*4]
	mov	eax,[ebp-32]
	add	edi,esi
	lea	esi,[edx+eax]
	mov	eax,[ebp-8]
	lea	edx,[esi+1]
	cmp	eax,edx
	jnb	.labl_44

	sub	edx,[ebp-8]
	imul	eax,eax,40
	add	eax,state.Price
	add	[ebp-8],edx
;----------------------------------------------------------
.labl_43:
	add	eax,40
	dec	edx
	mov	dword [eax],kIfinityPrice
	jne	.labl_43
;----------------------------------------------------------
.labl_44:
	mov	eax,[ebp-32]
	push	ecx
	push	dword [ebp-60]
	xor	edx,edx
	call	GetRepPrice
	imul	esi,esi,40
	add	eax,edi
	add	esi,state.State+40
	cmp	eax,[esi+12]
	jnb	.labl_45

	mov	[esi+12],eax
	mov	eax,[ebp-12]
	inc	eax
	and	dword [esi+20],0
	mov	[esi+16],eax
	mov	byte [esi+1],1
	mov	byte [esi+2],0
;----------------------------------------------------------
.labl_45:
	and	dword [ebp-24],0
;----------------------------------------------------------
.labl_46:
	mov	eax,[ebp-24]
	mov	eax,[ebp+eax*4-100]
	mov	edx,[ebp-40]
	inc	eax
	mov	ecx,edx
	sub	ecx,eax
	mov	[ebp-68],eax
	mov	al,[edx]
	mov	[ebp-80],ecx
	cmp	al,[ecx]
	jne	.labl_58

	mov	al,[edx+1]
	cmp	al,[ecx+1]
	jne	.labl_58

	push	2
	pop	esi
	cmp	[ebp-36],esi
	jbe	.labl_48
;----------------------------------------------------------
.labl_47:
	mov	al,[edx+esi]
	cmp	al,[ecx+esi]
	jne	.labl_48

	inc	esi
	cmp	esi,[ebp-36]
	jb	.labl_47
;----------------------------------------------------------
.labl_48:
	mov	eax,[ebp-12]
	lea	ebx,[eax+esi]
	mov	[ebp-32],ebx
	imul	ebx,ebx,40
	mov	edi,esi
	add	ebx,state.Price
;----------------------------------------------------------
.labl_49:
	mov	eax,[ebp-8]
	mov	ecx,[ebp-32]
	cmp	eax,ecx
	jnb	.labl_51

	sub	ecx,[ebp-8]
	imul	eax,eax,40
	add	eax,state.Price
	add	[ebp-8],ecx
;----------------------------------------------------------
.labl_50:
	add	eax,40
	dec	ecx
	mov	dword [eax],kIfinityPrice
	jne	.labl_50
;----------------------------------------------------------
.labl_51:
	push	dword [ebp-28]
	mov	edx,[ebp-24]
	push	dword [ebp-20]
	mov	eax,esi
	call	GetRepPrice
	add	eax,[ebp-72]
	cmp	eax,[ebx]
	jnb	.labl_52

	mov	[ebx],eax
	mov	eax,[ebp-12]
	mov	[ebx+4],eax
	mov	eax,[ebp-24]
	mov	[ebx+8],eax
	mov	byte [ebx-11],0
;----------------------------------------------------------
.labl_52:
	dec	esi
	sub	ebx,40
	dec	dword [ebp-32]
	cmp	esi,2
	jnb	.labl_49

	lea	eax,[edi+1]
	lea	esi,[eax+128]
	cmp	esi,[ebp-56]
	jbe	.labl_53

	mov	esi,[ebp-56]
;----------------------------------------------------------
.labl_53:
	cmp	eax,esi
	jnb	.labl_55

	mov	edx,[ebp-40]
	mov	ecx,eax
	sub	ecx,[ebp-68]
	add	ecx,edx
;----------------------------------------------------------
.labl_54:
	mov	bl,[eax+edx]
	cmp	bl,[ecx]
	jne	.labl_55

	inc	eax
	inc	ecx
	cmp	eax,esi
	jb	.labl_54
;----------------------------------------------------------
.labl_55:
	or	ecx,0xFFFFFFFF
	sub	ecx,edi
	add	eax,ecx
	mov	[ebp-16],eax
	cmp	eax,2
	jb	.labl_58

	mov	eax,[ebp-64]
	mov	al,[eax+RepNextStates]
	mov	edx,[ebp+8]
	movzx	eax,al
	mov	ebx,eax
	mov	al,[eax+LiteralNextStates]
	lea	ecx,[edi+edx]
	mov	[ebp-60],al
	movzx	eax,al
	mov	esi,ecx
	and	esi,3
	shl	ebx,4
	add	esi,ebx
	mov	esi,[_isMatch+esi*4]
	lea	ebx,[edi+edx+1]
	mov	[ebp-32],eax
	mov	eax,[ebp-40]
	movzx	edx,byte [edi+eax]
	mov	al,[eax+edi-1]
	push	edx
	mov	edx,[ebp-80]
	movzx	edx,byte [edx+edi]
	push	edx
	shr	esi,2
	mov	esi,[Models+esi*4]
	push	1
	push	ecx
	mov	[ebp-68],esi
	and	ebx,3
	call	CLiteralEncoder_GetPrice
	push	dword [ebp-28]
	mov	edx,[ebp-24]
	push	dword [ebp-20]
	mov	esi,eax
	mov	eax,edi
	call	GetRepPrice
	mov	ecx,[ebp-32]
	add	esi,eax
	shl	ecx,4
	add	ecx,ebx
	mov	eax,2048
	mov	edx,eax
	sub	edx,[_isMatch+ecx*4]
	mov	ecx,[ebp-32]
	sub	eax,[_isRep+ecx*4]
	mov	ecx,[ebp-12]
	shr	edx,2
	add	esi,[Models+edx*4]
	shr	eax,2
	add	esi,[Models+eax*4]
	mov	eax,[ebp-16]
	add	esi,[ebp-68]
	lea	eax,[eax+edi+1]
	add	esi,[ebp-72]
	add	eax,ecx
	mov	[ebp-68],eax
	cmp	[ebp-8],eax
	jnb	.labl_57

	mov	eax,[ebp-8]
	mov	ecx,[ebp-68]
	imul	eax,eax,40
	sub	ecx,[ebp-8]
	add	eax,state.Price
	add	[ebp-8],ecx
;----------------------------------------------------------
.labl_56:
	add	eax,40
	dec	ecx
	mov	dword [eax],kIfinityPrice
	jne	.labl_56
;----------------------------------------------------------
.labl_57:
	mov	eax,[ebp-16]
	push	ebx
	push	dword [ebp-60]
	xor	edx,edx
	call	GetRepPrice
	mov	ecx,[ebp-68]
	imul	ecx,ecx,40
	add	eax,esi
	add	ecx,state.State
	cmp	eax,[ecx+12]
	jnb	.labl_58

	and	dword [ecx+20],0
	mov	[ecx+12],eax
	mov	eax,[ebp-12]
	lea	edx,[edi+eax+1]
	mov	[ecx+4],eax
	mov	eax,[ebp-24]
	mov	[ecx+16],edx
	mov	byte [ecx+1],1
	mov	byte [ecx+2],1
	mov	[ecx+8],eax
;----------------------------------------------------------
.labl_58:
	inc	dword [ebp-24]
	cmp	dword [ebp-24],4
	jb	.labl_46

	mov	eax,[ebp-36]
	cmp	[ebp-44],eax
	jbe	.labl_59

	mov	[ebp-44],eax
;----------------------------------------------------------
.labl_59:
	cmp	dword [ebp-44],2
	jb	.labl_72

	mov	esi,[ebp-44]
	cmp	esi,2
	jne	.labl_60

	cmp	dword [distances+8],0x80
	jnb	.labl_72
;----------------------------------------------------------
.labl_60:
	mov	eax,[ebp-84]
	shr	eax,2
	mov	eax,[Models+eax*4]
	add	eax,[ebp-76]
	mov	[ebp-76],eax
	mov	eax,[ebp-12]
	lea	ecx,[esi+eax]
	cmp	[ebp-8],ecx
	jnb	.labl_62

	mov	eax,[ebp-8]
	imul	eax,eax,40
	mov	edx,ecx
	sub	edx,[ebp-8]
	add	eax,state.Price
	add	[ebp-8],edx
;----------------------------------------------------------
.labl_61:
	add	eax,40
	dec	edx
	mov	dword [eax],kIfinityPrice
	jne	.labl_61
;----------------------------------------------------------
.labl_62:
	imul	ecx,ecx,40
	add	ecx,state.Price
	lea	eax,[distances+4+esi*4]
	lea	edi,[esi+1]
	mov	[ebp-36],eax
	mov	ebx,ecx
	mov	[ebp-72],ecx
;----------------------------------------------------------
.labl_63:
	mov	eax,[ebp-36]
	mov	esi,[eax-4]
	push	dword [ebp-28]
	lea	eax,[edi-1]
	mov	edx,esi
	call	GetPosLenPrice
	add	eax,[ebp-76]
	mov	[ebp-80],eax
	cmp	eax,[ebx]
	jnb	.labl_64

	mov	[ebx],eax
	mov	eax,[ebp-12]
	mov	[ebx+4],eax
	lea	eax,[esi+4]
	mov	[ebx+8],eax
	mov	byte [ebx-11],0
;----------------------------------------------------------
.labl_64:
	lea	eax,[edi-1]
	cmp	eax,[ebp-44]
	je	.labl_65

	mov	eax,[ebp-36]
	cmp	esi,[eax]
	je	.labl_71
;----------------------------------------------------------
.labl_65:
	inc	esi
	lea	ecx,[edi+128]
	mov	[ebp-68],esi
	mov	[ebp-16],edi
	cmp	ecx,[ebp-56]
	jbe	.labl_66

	mov	ecx,[ebp-56]
;----------------------------------------------------------
.labl_66:
	cmp	edi,ecx
	jnb	.labl_68

	mov	eax,edi
	sub	eax,esi
	add	eax,[ebp-40]
;----------------------------------------------------------
.labl_67:
	mov	edx,[ebp-16]
	mov	esi,[ebp-40]
	mov	dl,[edx+esi]
	cmp	dl,[eax]
	jne	.labl_68

	inc	dword [ebp-16]
	inc	eax
	cmp	[ebp-16],ecx
	jb	.labl_67
;----------------------------------------------------------
.labl_68:
	or	ecx,0xFFFFFFFF
	lea	eax,[edi-1]
	sub	ecx,eax
	add	[ebp-16],ecx
	cmp	dword [ebp-16],2
	jb	.labl_71

	mov	eax,[ebp-64]
	mov	al,[eax+MatchNextStates]
	mov	ecx,[ebp+8]
	movzx	eax,al
	mov	esi,eax
	mov	al,[eax+LiteralNextStates]
	lea	edx,[edi+ecx-1]
	mov	[ebp-60],al
	movzx	eax,al
	shl	esi,4
	mov	ebx,edx
	and	ebx,3
	add	esi,ebx
	mov	esi,[_isMatch+esi*4]
	lea	ebx,[edi+ecx]
	mov	[ebp-32],eax
	mov	eax,[ebp-40]
	movzx	ecx,byte [edi+eax-1]
	push	ecx
	mov	ecx,edi
	sub	ecx,[ebp-68]
	shr	esi,2
	movzx	ecx,byte [ecx+eax-1]
	mov	esi,[Models+esi*4]
	mov	al,[edi+eax-2]
	push	ecx
	push	1
	push	edx
	mov	[ebp-84],esi
	and	ebx,3
	call	CLiteralEncoder_GetPrice
	mov	ecx,[ebp-32]
	mov	esi,eax
	shl	ecx,4
	add	ecx,ebx
	mov	eax,2048
	mov	edx,eax
	sub	edx,[_isMatch+ecx*4]
	mov	ecx,[ebp-32]
	sub	eax,[_isRep+ecx*4]
	mov	ecx,[ebp-12]
	shr	edx,2
	add	esi,[Models+edx*4]
	shr	eax,2
	add	esi,[Models+eax*4]
	mov	eax,[ebp-16]
	add	esi,[ebp-84]
	add	eax,edi
	add	esi,[ebp-80]
	add	eax,ecx
	mov	[ebp-32],eax
	cmp	[ebp-8],eax
	jnb	.labl_70

	mov	eax,[ebp-8]
	mov	ecx,[ebp-32]
	imul	eax,eax,40
	sub	ecx,[ebp-8]
	add	eax,state.Price
	add	[ebp-8],ecx
;----------------------------------------------------------
.labl_69:
	add	eax,40
	dec	ecx
	mov	dword [eax],kIfinityPrice
	jne	.labl_69
;----------------------------------------------------------
.labl_70:
	mov	eax,[ebp-16]
	push	ebx
	push	dword [ebp-60]
	xor	edx,edx
	call	GetRepPrice
	mov	ecx,[ebp-32]
	mov	ebx,[ebp-72]
	imul	ecx,ecx,40
	add	eax,esi
	add	ecx,state.State
	cmp	eax,[ecx+12]
	jnb	.labl_71

	and	dword [ecx+20],0
	mov	[ecx+12],eax
	mov	eax,[ebp-12]
	lea	edx,[edi+eax]
	mov	[ecx+4],eax
	mov	eax,[ebp-68]
	add	eax,3
	mov	[ecx+16],edx
	mov	byte [ecx+1],1
	mov	byte [ecx+2],1
	mov	[ecx+8],eax
;----------------------------------------------------------
.labl_71:
	sub	dword [ebp-36],4
	sub	ebx,40
	dec	edi
	lea	eax,[edi-1]
	mov	[ebp-72],ebx
	cmp	eax,2
	jnb	.labl_63
;----------------------------------------------------------
.labl_72:
	inc	dword [ebp-12]
	mov	eax,[ebp-12]
	cmp	eax,[ebp-8]
	jne	.labl_21

	jmp	.labl_74
;----------------------------------------------------------
.labl_73:
	mov	eax,[ebp-44]
	mov	[_longestMatchLength],eax
	mov	byte [_longestMatchWasFound],1
;----------------------------------------------------------
.labl_74:
	push	dword [ebp-12]
	push	dword [ebp+12]
	call	Backward
	mov	ecx,[ebp+16]
	mov	[ecx],eax
;----------------------------------------------------------
.labl_75:
	pop	ebx
	pop	edi
;----------------------------------------------------------
.labl_76:
	pop	esi
	leave	
	ret	12
;*****************************************************************************

;* Call: ***************************************************************
CLiteralEncoder2_EncodeMatched:
	push	ebp
	mov	ebp,esp
	push	ecx
	push	ebx
	push	esi
	xor	ebx,ebx
	push	edi
	inc	ebx
	mov	dword [ebp-4],8
;----------------------------------------------------------
.labl_00:
	dec	dword [ebp-4]
	movzx	ecx,byte [ebp-4]
	movzx	esi,byte [ebp+12]
	movzx	edi,byte [ebp+16]
	shr	esi,cl
	shr	edi,cl
	mov	ecx,[ebp+8]
	and	esi,1
	lea	eax,[esi+1]
	shl	eax,8
	add	eax,ebx
	and	edi,1
	push	edi
	lea	edx,[ecx+eax*4]
	call	CMyBitEncoder_Encode
	add	ebx,ebx
	or	ebx,edi
	cmp	esi,edi
	jne	.labl_02

	cmp	dword [ebp-4],0
	jne	.labl_00

	jmp	.labl_03
;----------------------------------------------------------
.labl_01:
	dec	dword [ebp-4]
	movzx	esi,byte [ebp+16]
	mov	cl,[ebp-4]
	mov	eax,[ebp+8]
	shr	esi,cl
	lea	edx,[eax+ebx*4]
	and	esi,1
	push	esi
	call	CMyBitEncoder_Encode
	add	ebx,ebx
	or	ebx,esi
;----------------------------------------------------------
.labl_02:
	cmp	dword [ebp-4],0
	jne	.labl_01
;----------------------------------------------------------
.labl_03:
	pop	edi
	pop	esi
	pop	ebx
	leave	
	ret	12
;*****************************************************************************

;* Call: ***************************************************************
RangeEncoder_EncodeDirectBits:
	push	esi
	mov	esi,eax
	jmp	.labl_02
;----------------------------------------------------------
.labl_00:
	mov	eax,[esp+8]
	shr	dword [_range],1
	dec	esi
	mov	ecx,esi
	shr	eax,cl
	test	al,1
	je	.labl_01

	mov	eax,[_range]
	add	[low],eax	
	adc	dword [low+4],0
;----------------------------------------------------------
.labl_01:
	cmp	dword [_range],0x1000000
	jnb	.labl_02

	shl	dword [_range],8
	call	RangeEncoder_ShiftLow
;----------------------------------------------------------
.labl_02:
	test	esi,esi
	jne	.labl_00

	pop	esi
	ret	4
;*****************************************************************************

;* Call: ***************************************************************
CBitTreeEncoder_ReverseEncode:
	push	esi
	xor	esi,esi
	push	edi
	mov	edi,[i_01]
	inc	esi
;----------------------------------------------------------
.labl_00:
	mov	eax,[esp+12]
	and	eax,1
	lea	edx,[_posAlignEncoder+esi*4]
	push	eax
	lea	esi,[eax+esi*2]
	call	CMyBitEncoder_Encode
	shr	dword [esp+12],1
	dec	edi
	jne	.labl_00

	pop	edi
	pop	esi
	ret	4
;*****************************************************************************

;* Call: ***************************************************************
MovePos:
	push	esi
	mov	esi,eax
	test	esi,esi
	je	.labl_01

	add	[_additionalOffset],esi
;----------------------------------------------------------
.labl_00:
	dec	esi
	call	lz_cm_09
	call	MatchFinder_MovePos
	test	esi,esi
	jne	.labl_00
;----------------------------------------------------------
.labl_01:
	pop	esi
	ret	
;*****************************************************************************

;* Call: ***************************************************************
Backward:
	push	ebp
	mov	ebp,esp
	push	ecx
	mov	ecx,[ebp+12]
	mov	eax,ecx
	imul	eax,eax,40
	mov	edx,[eax+state.PosPrev]
	mov	eax,[eax+state.BackPrev]
	push	ebx
	push	esi
	mov	[_optimumEndIndex],ecx
	mov	[ebp-4],eax
	push	edi
;----------------------------------------------------------
.labl_00:
	imul	ecx,ecx,40
	cmp	byte [ecx+state.Prev1IsChar],0
	je	.labl_01

	mov	eax,edx
	imul	eax,eax,40
	or	dword [eax+state.BackPrev],0xFFFFFFFF
	lea	esi,[eax+state.Prev1IsChar]
	lea	edi,[eax+state.PosPrev]
	lea	ebx,[edx-1]
	mov	byte [esi],0
	mov	[edi],ebx
	cmp	byte [ecx+state.Prev2],0
	je	.labl_01

	mov	byte [esi-40],0
	mov	esi,[ecx+state.PosPrev2]
	mov	[edi-40],esi
	mov	ecx,[ecx+state.BackPrev2]
	mov	[eax+state.BackPrev-40],ecx
;----------------------------------------------------------
.labl_01:
	mov	ecx,[ebp-4]
	mov	eax,edx
	imul	eax,eax,40
	mov	esi,edx
	mov	edx,[eax+state.BackPrev]
	mov	[eax+state.BackPrev],ecx
	mov	ecx,[ebp+12]
	mov	[ebp-4],edx
	mov	edx,[eax+state.PosPrev]
	mov	[eax+state.PosPrev],ecx
	mov	ecx,esi
	mov	[ebp+12],ecx
	test	esi,esi
	jne	.labl_00

	mov	eax,[state.BackPrev]
	mov	ecx,[ebp+8]
	pop	edi
	mov	[ecx],eax
	mov	eax,[state.PosPrev]
	pop	esi
	mov	[_optimumCurrentIndex],eax
	pop	ebx
	leave
	ret	8
;*****************************************************************************

;* Call: ***************************************************************
lz_cm_09:
	push	ebp
	mov	ebp,esp
	mov	edx,[_matchMaxLen]
	mov	eax,[_pos]
	mov	ecx,[_streamPos]
	sub	esp,44
	push	esi
	lea	esi,[edx+eax]
	cmp	esi,ecx
	ja	.labl_00

	mov	[ebp-24],edx
	jmp	.labl_01
;----------------------------------------------------------
.labl_00:
	sub	ecx,eax
	mov	[ebp-24],ecx
	cmp	ecx,3
	jb	.labl_13
;----------------------------------------------------------
.labl_01:
	mov	ecx,[_cyclicBufferSize]
	mov	edx,eax
	sub	edx,ecx
	cmp	ecx,eax
	mov	ecx,[_buffer]
	lea	esi,[ecx+eax]
	movzx	ecx,byte [esi+2]
	push	ebx
	movzx	ebx,word [esi]
	push	edi
	sbb	edi,edi
	and	dword [ebp-28],0
	and	dword [ebp-40],0
	shl	ecx,8
	and	edi,edx
	movzx	edx,byte [esi]
	xor	ecx,[crc_table+edx*4]
	movzx	edx,byte [esi+1]
	xor	ecx,edx
	mov	edx,[_hash]
	and	ecx,0xFFFFF
	lea	ecx,[edx+ecx*4]
	mov	[edx+ebx*4+0x400000],eax
	mov	ebx,[ecx]
	mov	[ecx],eax
	mov	ecx,[pack_pos]
	lea	ecx,[edx+ecx*8+0x440000]
	mov	[ebp-4],ebx
	lea	ebx,[ecx+4]
	mov	[ebp-12],ecx
	mov	ecx,[_cutValue]
	mov	[ebp-16],ebx
	mov	[ebp-20],ecx
	cmp	[ebp-4],edi
	jbe	.labl_11
;----------------------------------------------------------
.labl_02:
	mov	ecx,[ebp-20]
	dec	dword [ebp-20]
	test	ecx,ecx
	je	.labl_11

	mov	ecx,[_buffer]
	mov	ebx,[ebp-4]
	add	ecx,ebx
	mov	[ebp-36],ecx
	mov	ecx,[ebp-40]
	cmp	ecx,[ebp-28]
	jb	.labl_03

	mov	ecx,[ebp-28]
;----------------------------------------------------------
.labl_03:
	mov	ebx,[ebp-36]
	mov	[ebp-8],ecx
	add	ecx,esi
	sub	ebx,esi
	mov	[ebp-32],ebx
	jmp	.labl_05
;----------------------------------------------------------
.labl_04:
	mov	ecx,[ebp-44]
	mov	ebx,[ebp-32]
;----------------------------------------------------------
.labl_05:
	mov	bl,[ebx+ecx]
	cmp	bl,[ecx]
	jne	.labl_06

	inc	dword [ebp-8]
	inc	ecx
	mov	[ebp-44],ecx
	mov	ecx,[ebp-8]
	cmp	ecx,[ebp-24]
	jne	.labl_04
;----------------------------------------------------------
.labl_06:
	mov	ecx,[pack_pos]
	mov	ebx,eax
	sub	ebx,[ebp-4]
	cmp	ebx,ecx
	ja	.labl_07

	sub	ecx,ebx
	jmp	.labl_08
;----------------------------------------------------------
.labl_07:
	sub	ecx,ebx
	add	ecx,[_cyclicBufferSize]
;----------------------------------------------------------
.labl_08:
	lea	ecx,[edx+ecx*8+0x440000]
	mov	[ebp-32],ecx
	mov	ecx,[ebp-8]
	cmp	ecx,[ebp-24]
	je	.labl_14

	mov	ebx,[ebp-36]
	mov	bl,[ecx+ebx]
	cmp	bl,[ecx+esi]
	mov	ecx,[ebp-4]
	jnb	.labl_09

	mov	ebx,[ebp-12]
	mov	[ebx],ecx
	mov	ecx,[ebp-32]
	mov	ebx,[ebp-8]
	add	ecx,4
	mov	[ebp-12],ecx
	mov	[ebp-28],ebx
	jmp	.labl_10
;----------------------------------------------------------
.labl_09:
	mov	ebx,[ebp-16]
	mov	[ebx],ecx
	mov	ecx,[ebp-32]
	mov	ebx,[ebp-8]
	mov	[ebp-16],ecx
	mov	[ebp-40],ebx
;----------------------------------------------------------
.labl_10:
	mov	ecx,[ecx]
	mov	[ebp-4],ecx
	cmp	ecx,edi
	ja	.labl_02
;----------------------------------------------------------
.labl_11:
	mov	eax,[ebp-12]
	and	dword [eax],0
	mov	eax,[ebp-16]
	and	dword [eax],0
;----------------------------------------------------------
.labl_12:
	pop	edi
	pop	ebx
;----------------------------------------------------------
.labl_13:
	pop	esi
	leave	
	ret	
;----------------------------------------------------------
.labl_14:
	mov	eax,[ebp-32]
	mov	ecx,[eax]
	mov	edx,[ebp-12]
	mov	[edx],ecx
	mov	eax,[eax+4]
	mov	ecx,[ebp-16]
	mov	[ecx],eax
	jmp	.labl_12
;*****************************************************************************

;* Call: ***************************************************************
GetPosSlot:
	cmp	eax,1024
	jnb	.labl_00

	movzx	eax,byte [eax+g_FastPos]
	ret 
;----------------------------------------------------------
.labl_00:
	cmp	eax,0x80000
	jnb	.labl_01

	shr	eax,9
	movzx	eax,byte [eax+g_FastPos]
	add	eax,18
	ret 
;----------------------------------------------------------
.labl_01:
	shr	eax,18
	movzx	eax,byte [eax+g_FastPos]
	add	eax,36 ;'$'
	ret 
;*****************************************************************************

;* Call: ***************************************************************
CPriceTableEncoder_Init:
	push	ebx
	push	edi
	mov	eax,1024
	push	4
	mov	[esi],eax
	mov	[esi+4],eax
	lea	edi,[esi+0x4048]
	pop	ebx
;----------------------------------------------------------
.labl_00:
	push	3
	lea	eax,[edi-0x4040]
	pop	ecx
	call	CBitTreeEncoder_Init
	push	3
	pop	ecx
	mov	eax,edi
	call	CBitTreeEncoder_Init
	add	edi,1028
	dec	ebx
	jne	.labl_00

	push	8
	pop	ecx
	pop	edi
	lea	eax,[esi+0x8088]
	pop	ebx
	jmp	CBitTreeEncoder_Init
;*****************************************************************************

;* Call: ***************************************************************
CPriceTableEncoder_UpdateTable:
	push	ebx
	push	edi
	mov	edi,eax
	xor	ebx,ebx
	cmp	[edi+0xC88C],ebx
	jbe	.labl_01

	mov	eax,[esp+12]
	push	esi
	lea	esi,[edi+eax*4+0x848C]
;----------------------------------------------------------
.labl_00:
	mov	eax,[esp+16]
	mov	edx,ebx
	call	NLength_CEncoder_GetPrice
	mov	[esi],eax
	inc	ebx
	add	esi,64
	cmp	ebx,[edi+0xC88C]
	jb	.labl_00

	pop	esi
;----------------------------------------------------------
.labl_01:
	mov	eax,[edi+0xC88C]
	mov	ecx,[esp+12]
	mov	[edi+ecx*4+0xC890],eax
	pop	edi
	pop	ebx
	ret	4
;*****************************************************************************

;* Call: ***************************************************************
NLength_CEncoder_GetPrice:
	push	ebp
	mov	ebp,esp
	push	ecx
	push	esi
	cmp	edx,8
	jnb	.labl_00

	imul	eax,eax,1028
	lea	esi,[eax+edi+8]
	call	CBitTreeEncoder_GetPrice
	mov	ecx,[edi]
	shr	ecx,2
	add	eax,[Models+ecx*4]
	jmp	.labl_03
;----------------------------------------------------------
.labl_00:
	push	ebx
	mov	ebx,2048
	mov	ecx,ebx
	sub	ecx,[edi]
	shr	ecx,2
	mov	ecx,[Models+ecx*4]
	mov	[ebp-4],ecx
	cmp	edx,16
	jnb	.labl_01

	imul	eax,eax,1028
	add	edx,0xFFFFFFF8
	lea	esi,[eax+edi+0x4048]
	call	CBitTreeEncoder_GetPrice
	mov	ecx,[edi+4]
	shr	ecx,2
	add	eax,[Models+ecx*4]
	jmp	.labl_02
;----------------------------------------------------------
.labl_01:
	add	edx,0xFFFFFFF0
	lea	esi,[edi+0x8088]
	call	CBitTreeEncoder_GetPrice
	sub	ebx,[edi+4]
	shr	ebx,2
	add	eax,[Models+ebx*4]
;----------------------------------------------------------
.labl_02:
	add	[ebp-4],eax
	mov	eax,[ebp-4]
	pop	ebx
;----------------------------------------------------------
.labl_03:
	pop	esi
	leave	
	ret	
;*****************************************************************************

;* Call: ***************************************************************
CPriceTableEncoder_Encode:
	push	edi
	mov	edi,eax
	mov	edx,esi
	cmp	edi,8
	jnb	.labl_00

	push	0
	call	CMyBitEncoder_Encode
	mov	eax,ebx
	imul	eax,eax,1028
	push	edi
	lea	edi,[eax+esi+8]
	jmp	.labl_02
;----------------------------------------------------------
.labl_00:
	push	1
	call	CMyBitEncoder_Encode
	lea	edx,[esi+4]
	cmp	edi,16
	jnb	.labl_01

	push	0
	call	CMyBitEncoder_Encode
	add	edi,0xFFFFFFF8
	mov	eax,ebx
	imul	eax,eax,1028
	push	edi
	lea	edi,[eax+esi+0x4048]
	jmp	.labl_02
;----------------------------------------------------------
.labl_01:
	push	1
	call	CMyBitEncoder_Encode
	add	edi,0xFFFFFFF0
	push	edi
	lea	edi,[esi+0x8088]
;----------------------------------------------------------
.labl_02:
	call	cm_pr_16
	dec	dword [esi+ebx*4+0xC890]
	pop	edi
	jne	.labl_03

	push	ebx
	mov	eax,esi
	call	CPriceTableEncoder_UpdateTable
;----------------------------------------------------------
.labl_03:
	ret	
;*****************************************************************************

;* Call: ***************************************************************
CLiteralEncoder2_Encode:
	push	ebx
	push	esi
	push	edi
	xor	edi,edi
	push	8
	inc	edi
	pop	ebx
;----------------------------------------------------------
.labl_00:
	movzx	esi,byte [esp+20]
	mov	eax,[esp+16]
	dec	ebx
	mov	cl,bl
	shr	esi,cl
	lea	edx,[eax+edi*4]
	and	esi,1
	push	esi
	call	CMyBitEncoder_Encode
	add	edi,edi
	or	edi,esi
	test	ebx,ebx
	jne	.labl_00

	pop	edi
	pop	esi
	pop	ebx
	ret	8
;*****************************************************************************

;* Call: ***************************************************************
CState_IsCharState:
	mov	edx,[_numPrevBits]
	push	esi
	mov	esi,[_posMask]
	and	esi,[esp+8]
	push	8
	pop	ecx
	movzx	eax,al
	sub	cl,dl
	shr	eax,cl
	mov	ecx,edx
	shl	esi,cl
	add	eax,esi
	pop	esi
	ret	4
;*****************************************************************************

;* Call: ***************************************************************
CLiteralEncoder_GetPrice:
	push	dword [esp+16]
	push	dword [esp+16]
	push	dword [esp+16]
	push	dword [esp+16]
	call	CState_IsCharState
	imul	eax,eax,3072
	add	eax,[_posEncoders]
	push	eax
	call	lz_cm_11
	ret	16
;*****************************************************************************

;* Call: ***************************************************************
lz_cm_11:
	push	ebp
	mov	ebp,esp
	push	ecx
	push	ebx
	push	esi
	xor	esi,esi
	xor	eax,eax
	inc	esi
	push	edi
	mov	dword [ebp-4],8
	cmp	[ebp+12],al
	je	.labl_02

	movzx	ecx,byte [ebp+20]
	mov	[ebp+12],ecx
;----------------------------------------------------------
.labl_00:
	dec	dword [ebp-4]
	movzx	ecx,byte [ebp-4]
	movzx	edi,byte [ebp+16]
	mov	edx,[ebp+12]
	mov	ebx,[ebp+8]
	shr	edi,cl
	shr	edx,cl
	and	edi,1
	mov	ecx,edi
	shl	ecx,8
	add	ecx,esi
	mov	ecx,[ebx+ecx*4+1024]
	and	edx,1
	sub	ecx,edx
	mov	ebx,edx
	neg	ebx
	xor	ecx,ebx
	shr	ecx,2
	and	ecx,0x1FF
	add	eax,[Models+ecx*4]
	add	esi,esi
	or	esi,edx
	cmp	edi,edx
	jne	.labl_01

	cmp	dword [ebp-4],0
	jne	.labl_00

	jmp	.labl_04
;----------------------------------------------------------
.labl_01:
	cmp	dword [ebp-4],0
	je	.labl_04
;----------------------------------------------------------
.labl_02:
	movzx	edi,byte [ebp+20]
;----------------------------------------------------------
.labl_03:
	dec	dword [ebp-4]
	mov	cl,[ebp-4]
	mov	edx,edi
	shr	edx,cl
	mov	ecx,[ebp+8]
	mov	ecx,[ecx+esi*4]
	add	esi,esi
	and	edx,1
	sub	ecx,edx
	mov	ebx,edx
	neg	ebx
	xor	ecx,ebx
	shr	ecx,2
	and	ecx,0x1FF
	add	eax,[Models+ecx*4]
	or	esi,edx
	cmp	dword [ebp-4],0
	jne	.labl_03
;----------------------------------------------------------
.labl_04:
	pop	edi
	pop	esi
	pop	ebx
	leave	
	ret	16
;*****************************************************************************

;* Call: ***************************************************************
ReadMatchDistances:
	push	esi
	call	GetLongestMatch
	mov	ecx,eax
	mov	esi,0x80
	cmp	ecx,esi
	jne	.labl_00

	push	dword [distances+512]
	lea	eax,[esi+17]
	push	esi
	call	GetMatchLen
	mov	ecx,eax
	add	ecx,esi
;----------------------------------------------------------
.labl_00:
	inc	dword [_additionalOffset]
	call	MatchFinder_MovePos
	mov	eax,ecx
	pop	esi
	ret	
;*****************************************************************************

;* Call: ***************************************************************
GetLongestMatch:
	push	ebp
	mov	ebp,esp
	sub	esp,0x34
	mov	edx,[_matchMaxLen]
	mov	ecx,[_pos]
	mov	eax,[_streamPos]
	and	dword [ebp-24],0
	push	esi
	lea	esi,[edx+ecx]
	cmp	esi,eax
	ja	.labl_02

	mov	[ebp-32],edx
;----------------------------------------------------------
.labl_00:
	mov	eax,[_cyclicBufferSize]
	mov	edx,ecx
	sub	edx,eax
	cmp	eax,ecx
	sbb	eax,eax
	and	eax,edx
	mov	[ebp-40],eax
	mov	eax,[_buffer]
	push	ebx
	push	edi
	lea	edi,[eax+ecx]
	movzx	edx,byte [edi+2]
	movzx	esi,byte [edi]
	movzx	eax,word [edi]
	shl	edx,8
	xor	edx,[crc_table+esi*4]
	movzx	esi,byte [edi+1]
	xor	edx,esi
	mov	esi,[_hash]
	and	edx,0xFFFFF
	lea	edx,[esi+edx*4]
	mov	ebx,[edx]
	lea	eax,[esi+eax*4+0x400000]
	mov	[ebp-8],ebx
	mov	ebx,[eax]
	mov	[eax],ecx
	or	dword [distances+8],0xFFFFFFFF
	cmp	ebx,[ebp-40]
	jbe	.labl_01

	mov	eax,ecx
	sub	eax,ebx
	dec	eax
	mov	[distances+8],eax
	mov	dword [ebp-24],2
;----------------------------------------------------------
.labl_01:
	mov	ebx,[pack_pos]
	and	dword [ebp-36],0
	mov	[edx],ecx
	or	dword [distances+12],0xFFFFFFFF
	and	dword [ebp-48],0
	lea	edx,[esi+ebx*8+0x440000]
	lea	eax,[edx+4]
	mov	[ebp-20],eax
	mov	eax,[_cutValue]
	mov	[ebp-28],eax
	mov	eax,[ebp-8]
	mov	[ebp-16],edx
	jmp	.labl_13
;----------------------------------------------------------
.labl_02:
	sub	eax,ecx
	mov	[ebp-32],eax
	cmp	eax,3
	jnb	.labl_00

	xor	eax,eax
	jmp	.labl_16
;----------------------------------------------------------
.labl_03:
	mov	eax,[ebp-28]
	dec	dword [ebp-28]
	test	eax,eax
	je	.labl_14

	mov	eax,[_buffer]
	mov	edx,[ebp-8]
	add	eax,edx
	mov	[ebp-44],eax
	mov	eax,[ebp-48]
	cmp	eax,[ebp-36]
	jb	.labl_04

	mov	eax,[ebp-36]
;----------------------------------------------------------
.labl_04:
	mov	edx,[ebp-44]
	mov	[ebp-4],eax
	add	eax,edi
	sub	edx,edi
	mov	[ebp-12],edx
	jmp	.labl_06
;----------------------------------------------------------
.labl_05:
	mov	edx,[ebp-12]
	mov	eax,[ebp-52]
;----------------------------------------------------------
.labl_06:
	mov	dl,[edx+eax]
	cmp	dl,[eax]
	jne	.labl_07

	inc	dword [ebp-4]
	inc	eax
	mov	[ebp-52],eax
	mov	eax,[ebp-4]
	cmp	eax,[ebp-32]
	jne	.labl_05
;----------------------------------------------------------
.labl_07:
	mov	eax,ecx
	sub	eax,[ebp-8]
	mov	[ebp-12],eax
	mov	eax,[ebp-24]
	cmp	eax,[ebp-4]
	jnb	.labl_09
;----------------------------------------------------------
.labl_08:
	mov	edx,[ebp-12]
	inc	eax
	dec	edx
	mov	[distances+eax*4],edx
	cmp	eax,[ebp-4]
	jb	.labl_08

	mov	[ebp-24],eax
;----------------------------------------------------------
.labl_09:
	mov	eax,ebx
	sub	eax,[ebp-12]
	cmp	[ebp-12],ebx
	jbe	.labl_10

	add	eax,[_cyclicBufferSize]
;----------------------------------------------------------
.labl_10:
	lea	eax,[esi+eax*8+0x440000]
	mov	[ebp-12],eax
	mov	eax,[ebp-4]
	cmp	eax,[ebp-32]
	je	.labl_17

	mov	edx,[ebp-44]
	mov	dl,[eax+edx]
	cmp	dl,[eax+edi]
	mov	eax,[ebp-8]
	jnb	.labl_11

	mov	edx,[ebp-16]
	mov	[edx],eax
	mov	eax,[ebp-12]
	mov	edx,[ebp-4]
	add	eax,4
	mov	[ebp-16],eax
	mov	[ebp-36],edx
	jmp	.labl_12
;----------------------------------------------------------
.labl_11:
	mov	edx,[ebp-20]
	mov	[edx],eax
	mov	eax,[ebp-12]
	mov	edx,[ebp-4]
	mov	[ebp-20],eax
	mov	[ebp-48],edx
;----------------------------------------------------------
.labl_12:
	mov	eax,[eax]
	mov	[ebp-8],eax
;----------------------------------------------------------
.labl_13:
	cmp	eax,[ebp-40]
	ja	.labl_03
;----------------------------------------------------------
.labl_14:
	mov	eax,[ebp-16]
	and	dword [eax],0
	mov	eax,[ebp-20]
	and	dword [eax],0
;----------------------------------------------------------
.labl_15:
	mov	eax,[ebp-24]
	pop	edi
	pop	ebx
;----------------------------------------------------------
.labl_16:
	pop	esi
	leave	
	ret	
;----------------------------------------------------------
.labl_17:
	mov	eax,[ebp-12]
	mov	ecx,[eax]
	mov	edx,[ebp-16]
	mov	[edx],ecx
	mov	eax,[eax+4]
	mov	ecx,[ebp-20]
	mov	[ecx],eax
	jmp	.labl_15
;*****************************************************************************

;* Call: ***************************************************************
FillPosSlotPrices:
	push	ecx
	push	ebx
	push	ebp
	push	esi
	push	edi
	xor	ebp,ebp
	mov	esi,_posSlotEncoder
	mov	dword [esp+16],4
;----------------------------------------------------------
.labl_00:
	xor	edi,edi
;----------------------------------------------------------
.labl_01:
	mov	ebx,[_distTableSize]
	cmp	edi,ebx
	jnb	.labl_03

	mov	edx,edi
	call	CBitTreeEncoder_GetPrice
	lea	ecx,[edi+ebp]
	inc	edi
	mov	[_posSlotPrices+ecx*4],eax
	cmp	edi,14
	jb	.labl_01

	cmp	edi,ebx
	jnb	.labl_03

	lea	ebx,[edi+ebp]
	lea	ebx,[_posSlotPrices+ebx*4]
;----------------------------------------------------------
.labl_02:
	mov	edx,edi
	call	CBitTreeEncoder_GetPrice
	mov	ecx,edi
	shr	ecx,1
	sub	ecx,5
	shl	ecx,6
	add	eax,ecx
	mov	[ebx],eax
	inc	edi
	add	ebx,4
	cmp	edi,[_distTableSize]
	jb	.labl_02
;----------------------------------------------------------
.labl_03:
	add	esi,1028
	add	ebp,64
	dec	dword [esp+16]
	jne	.labl_00

	pop	edi
	pop	esi
	pop	ebp
	pop	ebx
	pop	ecx
	ret	
;***********************************************************************

;* Call: ***************************************************************
FillDistancesPrices:
	push	ebp
	mov	ebp,esp
	sub	esp,36
	and	dword [ebp-20],0
	push	ebx
	push	esi
	push	edi
	push	4
	pop	ebx
	mov	dword [ebp-24],_distancesPrices+16
	mov	dword [ebp-16],_posSlotPrices
	mov	[ebp-36],ebx
;----------------------------------------------------------
.labl_00:
	mov	eax,[ebp-24]
	mov	esi,[ebp-16]
	lea	edi,[eax-16]
	movsd	
	movsd	
	movsd	
	movsd	
	mov	[ebp-4],ebx
	mov	[ebp-12],eax
;----------------------------------------------------------
.labl_01:
	mov	esi,[ebp-4]
	mov	eax,esi
	call	GetPosSlot
	mov	edx,eax
	mov	ecx,edx
	xor	eax,eax
	inc	eax
	mov	[ebp-32],edx
	and	edx,eax
	shr	ecx,1
	dec	ecx
	or	edx,2
	shl	edx,cl
	xor	edi,edi
	mov	[ebp-8],eax
	mov	[ebp-28],ecx
	sub	esi,edx
	test	ecx,ecx
	je	.labl_03
;----------------------------------------------------------
.labl_02:
	mov	eax,[ebp-8]
	sub	eax,[ebp-32]
	mov	ecx,esi
	add	eax,edx
	mov	eax,[_numLiteralContextBits+eax*4]
	and	ecx,1
	sub	eax,ecx
	mov	ebx,ecx
	neg	ebx
	xor	eax,ebx
	shr	eax,2
	and	eax,0x1FF
	add	edi,[Models+eax*4]
	mov	eax,[ebp-8]
	shr	esi,1
	dec	dword [ebp-28]
	lea	eax,[ecx+eax*2]
	mov	[ebp-8],eax
	jne	.labl_02

	push	4
	pop	ebx
;----------------------------------------------------------
.labl_03:
	mov	eax,[ebp-32]
	mov	ecx,[ebp-20]
	add	ecx,eax
	mov	eax,[_posSlotPrices+ecx*4]
	mov	ecx,[ebp-12]
	add	[ebp-12],ebx
	add	eax,edi
	inc	dword [ebp-4]
	cmp	dword [ebp-4],0x80
	mov	[ecx],eax
	jb	.labl_01

	add	dword [ebp-16],256
	add	dword [ebp-20],64
	add	dword [ebp-24],512
	dec	dword [ebp-36]
	jne	.labl_00

	pop	edi
	pop	esi
	pop	ebx
	leave	
	ret	
;***********************************************************************

;* Call: ***************************************************************
FillAlignPrices:
	push	ebp
	mov	ebp,esp
	push	ecx
	push	ecx
	push	ebx
	push	esi
	xor	esi,esi
	push	edi
	mov	[ebp-8],esi
;----------------------------------------------------------
.labl_00:
	mov	eax,[i_01]
	xor	edx,edx
	xor	ecx,ecx
	inc	edx
	mov	[ebp-4],eax
;----------------------------------------------------------
.labl_01:
	mov	edi,[_posAlignEncoder+edx*4]
	mov	eax,esi
	and	eax,1
	sub	edi,eax
	mov	ebx,eax
	neg	ebx
	xor	edi,ebx
	shr	edi,2
	and	edi,0x1FF
	add	ecx,[Models+edi*4]
	shr	esi,1
	dec	dword [ebp-4]
	lea	edx,[eax+edx*2]
	jne	.labl_01

	mov	esi,[ebp-8]
	push	16
	mov	[_alignPrices+esi*4],ecx
	inc	esi
	pop	eax
	mov	[ebp-8],esi
	cmp	esi,eax
	jb	.labl_00

	pop	edi
	pop	esi
	mov	[_alignPriceCount],eax
	pop	ebx
	leave	
	ret	
;***********************************************************************

;* Call: ***************************************************************
GetRepLen1Price:
	movzx	eax,al
	mov	edx,[_isRepG0+eax*4]
	mov	ecx,eax
	shl	ecx,4
	add	ecx,[esp+4]
	shr	edx,2
	mov	ecx,[_isRep0Long+ecx*4]
	shr	ecx,2
	mov	eax,[Models+ecx*4]
	add	eax,[Models+edx*4]
	ret	4
;***********************************************************************

;* Call: ***************************************************************
GetRepPrice:
	movzx	ecx,byte [esp+4]
	shl	eax,4
	add	eax,[esp+8]
	push	esi
	mov	eax,[_repMatchLenEncoder+0x840C+eax*4]
	mov	esi,2048
	test	edx,edx
	jne	.labl_00

	mov	edx,ecx
	mov	ecx,[_isRepG0+ecx*4]
	shl	edx,4
	add	edx,[esp+12]
	sub	esi,[_isRep0Long+edx*4]
	shr	ecx,2
	jmp	.labl_02
;----------------------------------------------------------
.labl_00:
	push	edi
	shl	ecx,2
	mov	edi,esi
	sub	edi,[ecx+_isRepG0]
	shr	edi,2
	add	eax,[Models+edi*4]
	pop	edi
	cmp	edx,1
	jne	.labl_01

	mov	ecx,[ecx+_isRepG1]
	shr	ecx,2
	add	eax,[Models+ecx*4]
	jmp	.labl_03
;----------------------------------------------------------
.labl_01:
	sub	esi,[ecx+_isRepG1]
	mov	ecx,[ecx+_isRepG2]
	add	edx,0xFFFFFFFE
	sub	ecx,edx
	neg	edx
	xor	ecx,edx
	shr	ecx,2
	and	ecx,0x1FF
;----------------------------------------------------------
.labl_02:
	shr	esi,2
	mov	edx,[Models+esi*4]
	add	edx,[Models+ecx*4]
	add	eax,edx
;----------------------------------------------------------
.labl_03:
	pop	esi
	ret	8
;***********************************************************************

;* Call: ***************************************************************
GetPosLenPrice:
	push	esi
	mov	esi,eax
	mov	ecx,0x80
	cmp	esi,2
	jne	.labl_00

	cmp	edx,ecx
	jb	.labl_01

	mov	eax,kIfinityPrice
	jmp	.labl_09
;----------------------------------------------------------
.labl_00:
	cmp	esi,6
	jnb	.labl_02
;----------------------------------------------------------
.labl_01:
	lea	eax,[esi-2]
	jmp	.labl_03
;----------------------------------------------------------
.labl_02:
	push	3
	pop	eax
;----------------------------------------------------------
.labl_03:
	cmp	edx,ecx
	jnb	.labl_04

	shl	eax,7
	add	eax,edx
	mov	ecx,[_distancesPrices+eax*4]
	jmp	.labl_08
;----------------------------------------------------------
.labl_04:
	mov	ecx,edx
;GetPosSlot2
	cmp	edx,0x10000	;if (pos < (1<<16))
	jnb	.labl_05

	shr	ecx,6
	movzx	ecx,byte [ecx+g_FastPos]
	add	ecx,12
	jmp	.labl_07
;----------------------------------------------------------
.labl_05:
	cmp	edx,0x2000000	;if (pos < (1<<25))
	jnb	.labl_06

	shr	ecx,15
	movzx	ecx,byte [ecx+g_FastPos]
	add	ecx,30
	jmp	.labl_07
;----------------------------------------------------------
.labl_06:
	shr	ecx,24
	movzx	ecx,byte [ecx+g_FastPos]
	add	ecx,48
;----------------------------------------------------------
.labl_07:
	shl	eax,6
	add	eax,ecx
	mov	ecx,[_posSlotPrices+eax*4]
	and	edx,15
	add	ecx,[_alignPrices+edx*4]
;----------------------------------------------------------
.labl_08:
	shl	esi,4
	add	esi,[esp+8]
	mov	eax,[_prices+esi*4]
	add	eax,ecx
;----------------------------------------------------------
.labl_09:
	pop	esi
	ret	4
;***********************************************************************

;* Call: ***************************************************************
RangeEncoder_ShiftLow:
	push	ecx
	push	ecx
	mov	eax,[low]
	push	esi
	mov	esi,[low+4]
	cmp	eax,0xFF000000
	jb	.labl_00

	test	esi,esi
	je	.labl_02
;----------------------------------------------------------
.labl_00:
	mov	cl,[_cache]
	and	dword [esp+8],0
	mov	edx,esi
	push	ebx
;----------------------------------------------------------
.labl_01:
	mov	bl,dl
	add	bl,cl
	mov	ecx,[pack_length]
	inc	dword [pack_length]
	mov	[ecx],bl
	or	cl,0xFF
	dec	dword [_cacheSize]
	jne	.labl_01

	mov	cl,[low+3]
	mov	[_cache],cl
	pop	ebx
;----------------------------------------------------------
.labl_02:
	inc	dword [_cacheSize]
	shl	eax,8
	and	dword [low+4],0
	mov	[low],eax
	pop	esi
	pop	ecx
	pop	ecx
	ret	
;***********************************************************************

;* Call: ***************************************************************
CMyBitEncoder_Encode:
	mov	ecx,[_range]
	mov	eax,[edx]
	shr	ecx,0xB
	imul	ecx,eax
	cmp	dword [esp+4],0
	jne	.labl_00

	mov	[_range],ecx
	mov	ecx,2048
	sub	ecx,eax
	shr	ecx,5
	add	ecx,eax
	mov	[edx],ecx
	jmp	.labl_01
;----------------------------------------------------------
.labl_00:
	add	[low],ecx
	adc	dword [low+4],0
	sub	[_range],ecx
	mov	ecx,eax
	shr	ecx,5
	sub	eax,ecx
	mov	[edx],eax
;----------------------------------------------------------
.labl_01:
	cmp	dword [_range],0x1000000
	jnb	.labl_02

	shl	dword [_range],8
	call	RangeEncoder_ShiftLow
;----------------------------------------------------------
.labl_02:
	ret	4
;***********************************************************************

;* Call: ***************************************************************
CBitTreeEncoder_Init:
	xor	edx,edx
	inc	edx
	shl	edx,cl
	mov	[eax+1024],ecx
	lea	ecx,[edx-1]
	test	ecx,ecx
	jbe	.labl_00

	push	edi
	lea	edi,[eax+4]
	mov	eax,1024
	rep	stosd	
	pop	edi
;----------------------------------------------------------
.labl_00:
	ret	
;***********************************************************************

;* Call: ***************************************************************
cm_pr_16:
	mov	eax,[esp+4]
	push	ebx
	mov	ebx,[edi+1024]
	push	esi
	xor	esi,esi
	inc	esi
	add	eax,eax
	mov	[esp+12],eax
;----------------------------------------------------------
.labl_00:
	mov	eax,[esp+12]
	mov	ecx,ebx
	shr	eax,cl
	lea	edx,[edi+esi*4]
	and	eax,1
	push	eax
	lea	esi,[eax+esi*2]
	call	CMyBitEncoder_Encode
	dec	ebx
	jne	.labl_00

	pop	esi
	pop	ebx
	ret	4
;***********************************************************************

;* Call: ***************************************************************
CBitTreeEncoder_GetPrice:
	mov	ecx,[esi+1024]
	push	edi
	xor	edi,edi
	inc	edi
	shl	edi,cl
	xor	eax,eax
	or	edx,edi
;----------------------------------------------------------
.labl_00:
	mov	ecx,edx
	shr	edx,1
	mov	edi,[esi+edx*4]
	and	ecx,1
	sub	edi,ecx
	neg	ecx
	xor	edi,ecx
	shr	edi,2
	and	edi,0x1FF
	add	eax,[Models+edi*4]
	cmp	edx,1
	jne	.labl_00

	pop	edi
	ret	
;***********************************************************************

;* Call: ***************************************************************
GetMatchLen:
	mov	ecx,[_streamPos]
	push	edi
	mov	edi,eax
	mov	eax,[_pos]
	sub	ecx,eax
	sub	ecx,[esp+8]
	cmp	edi,ecx
	jbe	.labl_00

	mov	edi,ecx
;----------------------------------------------------------
.labl_00:
	mov	ecx,[_buffer]
	inc	dword [esp+12]
	add	ecx,eax
	add	ecx,[esp+8]
	xor	eax,eax
	test	edi,edi
	jbe	.labl_03

	push	esi
	mov	esi,ecx
	sub	esi,[esp+16]
;----------------------------------------------------------
.labl_01:
	mov	dl,[eax+ecx]
	cmp	dl,[esi+eax]
	jne	.labl_02

	inc	eax
	cmp	eax,edi
	jb	.labl_01
;----------------------------------------------------------
.labl_02:
	pop	esi
;----------------------------------------------------------
.labl_03:
	pop	edi
	ret	8
;***********************************************************************

;* Call: ***************************************************************
MatchFinder_MovePos:
	inc	dword [pack_pos]
	mov	eax,[pack_pos]
	cmp	eax,[_cyclicBufferSize]
	jne	.labl_00

	and	dword [pack_pos],0
;----------------------------------------------------------
.labl_00:
	inc	dword [_pos]
	ret	
;***********************************************************************