亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? unpack.java

?? 這是架包java-unrar-0.2.jar的源碼
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
/*
 * Copyright (c) 2007 innoSysTec (R) GmbH, Germany. All rights reserved.
 * Original author: Edmund Wagner
 * Creation date: 31.05.2007
 *
 * Source: $HeadURL$
 * Last changed: $LastChangedDate$
 * 
 * the unrar licence applies to all junrar source and binary distributions 
 * you are not allowed to use this source to re-create the RAR compression algorithm
 * 
 * Here some html entities which can be used for escaping javadoc tags:
 * "&":  "&" or "&"
 * "<":  "&#060;" or "&lt;"
 * ">":  "&#062;" or "&gt;"
 * "@":  "&#064;" 
 */
package de.innosystec.unrar.unpack;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;

import de.innosystec.unrar.exception.RarException;
import de.innosystec.unrar.unpack.decode.Compress;
import de.innosystec.unrar.unpack.ppm.BlockTypes;
import de.innosystec.unrar.unpack.ppm.ModelPPM;
import de.innosystec.unrar.unpack.ppm.SubAllocator;
import de.innosystec.unrar.unpack.vm.BitInput;
import de.innosystec.unrar.unpack.vm.RarVM;
import de.innosystec.unrar.unpack.vm.VMPreparedProgram;

/**
 * DOCUMENT ME
 * 
 * @author $LastChangedBy$
 * @version $LastChangedRevision$
 */
public final class Unpack extends Unpack20
{

	private final ModelPPM ppm = new ModelPPM();

	private int ppmEscChar;

	private RarVM rarVM = new RarVM();

	/* Filters code, one entry per filter */
	private List<UnpackFilter> filters = new ArrayList<UnpackFilter>();

	/* Filters stack, several entrances of same filter are possible */
	private List<UnpackFilter> prgStack = new ArrayList<UnpackFilter>();

	/*
	 * lengths of preceding blocks, one length per filter. Used to reduce size
	 * required to write block length if lengths are repeating
	 */
	private List<Integer> oldFilterLengths = new ArrayList<Integer>();

	private int lastFilter;

	private boolean tablesRead;

	private byte[] unpOldTable = new byte[Compress.HUFF_TABLE_SIZE];

	private BlockTypes unpBlockType;

	private boolean externalWindow;

	private long writtenFileSize;

	private boolean fileExtracted;

	private boolean ppmError;

	private int prevLowDist;

	private int lowDistRepCount;

	public static int[] DBitLengthCounts = { 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
		2, 2, 2, 2, 2, 14, 0, 12 };

	public Unpack(ComprDataIO DataIO)
	{
		unpIO = DataIO;
		window = null;
		externalWindow = false;
		suspended = false;
		unpAllBuf = false;
		unpSomeRead = false;
	}

	public void init(byte[] window)
	{
		if (window == null) {
			this.window = new byte[Compress.MAXWINSIZE];
		} else {
			this.window = window;
			externalWindow = true;
		}
		inAddr = 0;
		unpInitData(false);
	}

	public void doUnpack(int method, boolean solid) throws IOException, RarException
	{
		if (unpIO.getSubHeader().getUnpMethod() == 0x30) {
			unstoreFile();
		}
		switch (method) {
		case 15: // rar 1.5 compression
			unpack15(solid);
			break;
		case 20: // rar 2.x compression
		case 26: // files larger than 2GB
			unpack20(solid);
			break;
		case 29: // rar 3.x compression
		case 36: // alternative hash
			unpack29(solid);
			break;
		}
	}

	private void unstoreFile() throws IOException, RarException
	{
		byte[] buffer = new byte[0x10000];
		while (true) {
			int code = unpIO.unpRead(buffer, 0,	(int)Math.min(buffer.length,destUnpSize));
			if (code == 0 || code == -1)
				break;
			code = code < destUnpSize ? code : (int)destUnpSize;
			unpIO.unpWrite(buffer, 0, code);
			if (destUnpSize >= 0)
				destUnpSize -= code;
		}

	}

	private void unpack29(boolean solid) throws IOException, RarException
	{

		int[] DDecode = new int[Compress.DC];
		byte[] DBits = new byte[Compress.DC];

		int Bits;

		if (DDecode[1] == 0) {
			int Dist = 0, BitLength = 0, Slot = 0;
			for (int I = 0; I < DBitLengthCounts.length; I++, BitLength++) {
				int count = DBitLengthCounts[I];
				for (int J = 0; J < count; J++, Slot++, Dist += (1 << BitLength)) {
					DDecode[Slot] = Dist;
					DBits[Slot] = (byte) BitLength;
				}
			}
		}

		fileExtracted = true;

		if (!suspended) {
			unpInitData(solid);
			if (!unpReadBuf()) {
				return;
			}
			if ((!solid || !tablesRead) && !readTables()) {
				return;
			}
		}

		if (ppmError) {
			return;
		}

		while (true) {
			unpPtr &= Compress.MAXWINMASK;

			if (inAddr > readBorder) {
				if (!unpReadBuf()) {
					break;
				}
			}
			//System.out.println(((wrPtr - unpPtr) & Compress.MAXWINMASK)+":"+wrPtr+":"+unpPtr);
			if (((wrPtr - unpPtr) & Compress.MAXWINMASK) < 260
					&& wrPtr != unpPtr) {

				UnpWriteBuf();
				if (writtenFileSize > destUnpSize) {
					return;
				}
				if (suspended) {
					fileExtracted = false;
					return;
				}
			}
			if (unpBlockType == BlockTypes.BLOCK_PPM) {
				int Ch = ppm.decodeChar();
				if (Ch == -1) {
					ppmError = true;
					break;
				}
				if (Ch == ppmEscChar) {
					int NextCh = ppm.decodeChar();
					if (NextCh == 0) {
						if (!readTables()) {
							break;
						}
						continue;
					}
					if (NextCh == 2 || NextCh == -1) {
						break;
					}
					if (NextCh == 3) {
						if (!readVMCodePPM()) {
							break;
						}
						continue;
					}
					if (NextCh == 4) {
						int Distance = 0, Length = 0;
						boolean failed = false;
						for (int I = 0; I < 4 && !failed; I++) {
							int ch = ppm.decodeChar();
							if (ch == -1) {
								failed = true;
							} else {
								if (I == 3) {
									// Bug fixed
									Length = ch&0xff;
								} else {
									// Bug fixed
									Distance = (Distance << 8) + (ch&0xff);
								}
							}
						}
						if (failed) {
							break;
						}
						copyString(Length + 32, Distance + 2);
						continue;
					}
					if (NextCh == 5) {
						int Length = ppm.decodeChar();
						if (Length == -1) {
							break;
						}
						copyString(Length + 4, 1);
						continue;
					}
				}
				window[unpPtr++] = (byte) Ch;
				continue;
			}

			int Number = decodeNumber(LD);
			if (Number < 256) {
				window[unpPtr++] = (byte) Number;
				continue;
			}
			if (Number >= 271) {
				int Length = LDecode[Number -= 271] + 3;
				if ((Bits = LBits[Number]) > 0) {
					Length += getbits() >>> (16 - Bits);
						addbits(Bits);
				}

				int DistNumber = decodeNumber(DD);
				int Distance = DDecode[DistNumber] + 1;
				if ((Bits = DBits[DistNumber]) > 0) {
					if (DistNumber > 9) {
						if (Bits > 4) {
							Distance += ((getbits() >>> (20 - Bits)) << 4);
							addbits(Bits - 4);
						}
						if (lowDistRepCount > 0) {
							lowDistRepCount--;
							Distance += prevLowDist;
						} else {
							int LowDist = decodeNumber(LDD);
							if (LowDist == 16) {
								lowDistRepCount = Compress.LOW_DIST_REP_COUNT - 1;
								Distance += prevLowDist;
							} else {
								Distance += LowDist;
								prevLowDist = LowDist;
							}
						}
					} else {
						Distance += getbits() >>> (16 - Bits);
						addbits(Bits);
					}
				}

				if (Distance >= 0x2000) {
					Length++;
					if (Distance >= 0x40000L) {
						Length++;
					}
				}

				insertOldDist(Distance);
				insertLastMatch(Length, Distance);

				copyString(Length, Distance);
				continue;
			}
			if (Number == 256) {
				if (!readEndOfBlock()) {
					break;
				}
				continue;
			}
			if (Number == 257) {
				if (!readVMCode()) {
					break;
				}
				continue;
			}
			if (Number == 258) {
				if (lastLength != 0) {
					copyString(lastLength, lastDist);
				}
				continue;
			}
			if (Number < 263) {
				int DistNum = Number - 259;
				int Distance = oldDist[DistNum];
				for (int I = DistNum; I > 0; I--) {
					oldDist[I] = oldDist[I - 1];
				}
				oldDist[0] = Distance;

				int LengthNumber = decodeNumber(RD);
				int Length = LDecode[LengthNumber] + 2;
				if ((Bits = LBits[LengthNumber]) > 0) {
					Length += getbits() >>> (16 - Bits);
					addbits(Bits);
				}
				insertLastMatch(Length, Distance);
				copyString(Length, Distance);
				continue;
			}
			if (Number < 272) {
				int Distance = SDDecode[Number -= 263] + 1;
				if ((Bits = SDBits[Number]) > 0) {
					Distance += getbits() >>> (16 - Bits);
					addbits(Bits);
				}
				insertOldDist(Distance);
				insertLastMatch(2, Distance);
				copyString(2, Distance);
				continue;
			}
		}
		UnpWriteBuf();

	}

	private void UnpWriteBuf() throws IOException
	{
		int WrittenBorder = wrPtr;
		int WriteSize = (unpPtr - WrittenBorder) & Compress.MAXWINMASK;
		for (int I = 0; I < prgStack.size(); I++) {
			UnpackFilter flt = prgStack.get(I);
			if (flt == null) {
				continue;
			}
			if (flt.isNextWindow()) {
				flt.setNextWindow(false);// ->NextWindow=false;
				continue;
			}
			int BlockStart = flt.getBlockStart();// ->BlockStart;
			int BlockLength = flt.getBlockLength();// ->BlockLength;
			if (((BlockStart - WrittenBorder) & Compress.MAXWINMASK) < WriteSize) {
				if (WrittenBorder != BlockStart) {
					UnpWriteArea(WrittenBorder, BlockStart);
					WrittenBorder = BlockStart;
					WriteSize = (unpPtr - WrittenBorder) & Compress.MAXWINMASK;
				}
				if (BlockLength <= WriteSize) {
					int BlockEnd = (BlockStart + BlockLength)
					& Compress.MAXWINMASK;
					if (BlockStart < BlockEnd || BlockEnd == 0) {
						// VM.SetMemory(0,Window+BlockStart,BlockLength);
						rarVM.setMemory(0, window, BlockStart, BlockLength);
					} else {
						int FirstPartLength = Compress.MAXWINSIZE - BlockStart;
						// VM.SetMemory(0,Window+BlockStart,FirstPartLength);
						rarVM.setMemory(0, window, BlockStart, FirstPartLength);
						// VM.SetMemory(FirstPartLength,Window,BlockEnd);
						rarVM.setMemory(FirstPartLength, window, 0, BlockEnd);

					}

					VMPreparedProgram ParentPrg = filters.get(
							flt.getParentFilter()).getPrg();
					VMPreparedProgram Prg = flt.getPrg();

					if (ParentPrg.getGlobalData().size() > RarVM.VM_FIXEDGLOBALSIZE) {
						// copy global data from previous script execution if
						// any
						// Prg->GlobalData.Alloc(ParentPrg->GlobalData.Size());
						// memcpy(&Prg->GlobalData[VM_FIXEDGLOBALSIZE],&ParentPrg->GlobalData[VM_FIXEDGLOBALSIZE],ParentPrg->GlobalData.Size()-VM_FIXEDGLOBALSIZE);
						Prg.getGlobalData().setSize(
								ParentPrg.getGlobalData().size());
						for (int i = 0; i < ParentPrg.getGlobalData().size()
						- RarVM.VM_FIXEDGLOBALSIZE; i++) {
							Prg.getGlobalData().set(
									RarVM.VM_FIXEDGLOBALSIZE + i,
									ParentPrg.getGlobalData().get(
											RarVM.VM_FIXEDGLOBALSIZE + i));
						}
					}

					ExecuteCode(Prg);

					if (Prg.getGlobalData().size() > RarVM.VM_FIXEDGLOBALSIZE) {
						// save global data for next script execution
						if (ParentPrg.getGlobalData().size() < Prg
								.getGlobalData().size()) {
							ParentPrg.getGlobalData().setSize(
									Prg.getGlobalData().size());// ->GlobalData.Alloc(Prg->GlobalData.Size());
						}
						// memcpy(&ParentPrg->GlobalData[VM_FIXEDGLOBALSIZE],&Prg->GlobalData[VM_FIXEDGLOBALSIZE],Prg->GlobalData.Size()-VM_FIXEDGLOBALSIZE);
						for (int i = 0; i < Prg.getGlobalData().size()
						- RarVM.VM_FIXEDGLOBALSIZE; i++) {
							ParentPrg.getGlobalData().set(
									RarVM.VM_FIXEDGLOBALSIZE + i,
									Prg.getGlobalData().get(
											RarVM.VM_FIXEDGLOBALSIZE + i));
						}
					} else {
						ParentPrg.getGlobalData().clear();
					}

					int FilteredDataOffset = Prg.getFilteredDataOffset();
					int FilteredDataSize = Prg.getFilteredDataSize();
					byte[] FilteredData = new byte[FilteredDataSize];

					for (int i = 0; i < FilteredDataSize; i++) {
						FilteredData[i] = rarVM.getMem()[FilteredDataOffset+i];//Prg.getGlobalData().get(FilteredDataOffset + i);
					}

					prgStack.set(I, null);
					while (I + 1 < prgStack.size()) {
						UnpackFilter NextFilter = prgStack.get(I + 1);
						if (NextFilter == null
								|| NextFilter.getBlockStart() != BlockStart
								|| NextFilter.getBlockLength() != FilteredDataSize
								|| NextFilter.isNextWindow()) {
							break;
						}
						// apply several filters to same data block

						rarVM.setMemory(0, FilteredData, 0, FilteredDataSize);// .SetMemory(0,FilteredData,FilteredDataSize);

						VMPreparedProgram pPrg = filters.get(
								NextFilter.getParentFilter()).getPrg();
						VMPreparedProgram NextPrg = NextFilter.getPrg();

						if (pPrg.getGlobalData().size() > RarVM.VM_FIXEDGLOBALSIZE) {
							// copy global data from previous script execution
							// if any
							// NextPrg->GlobalData.Alloc(ParentPrg->GlobalData.Size());
							NextPrg.getGlobalData().setSize(
									pPrg.getGlobalData().size());
							// memcpy(&NextPrg->GlobalData[VM_FIXEDGLOBALSIZE],&ParentPrg->GlobalData[VM_FIXEDGLOBALSIZE],ParentPrg->GlobalData.Size()-VM_FIXEDGLOBALSIZE);
							for (int i = 0; i < pPrg.getGlobalData().size()
							- RarVM.VM_FIXEDGLOBALSIZE; i++) {
								NextPrg.getGlobalData().set(
										RarVM.VM_FIXEDGLOBALSIZE + i,
										pPrg.getGlobalData().get(
												RarVM.VM_FIXEDGLOBALSIZE + i));
							}
						}

						ExecuteCode(NextPrg);

						if (NextPrg.getGlobalData().size() > RarVM.VM_FIXEDGLOBALSIZE) {
							// save global data for next script execution
							if (pPrg.getGlobalData().size() < NextPrg
									.getGlobalData().size()) {
								pPrg.getGlobalData().setSize(
										NextPrg.getGlobalData().size());
							}
							// memcpy(&ParentPrg->GlobalData[VM_FIXEDGLOBALSIZE],&NextPrg->GlobalData[VM_FIXEDGLOBALSIZE],NextPrg->GlobalData.Size()-VM_FIXEDGLOBALSIZE);
							for (int i = 0; i < NextPrg.getGlobalData().size()
							- RarVM.VM_FIXEDGLOBALSIZE; i++) {
								pPrg.getGlobalData().set(
										RarVM.VM_FIXEDGLOBALSIZE + i,
										NextPrg.getGlobalData().get(
												RarVM.VM_FIXEDGLOBALSIZE + i));
							}
						} else {
							pPrg.getGlobalData().clear();
						}
						FilteredDataOffset = NextPrg.getFilteredDataOffset();
						FilteredDataSize = NextPrg.getFilteredDataSize();

						FilteredData = new byte[FilteredDataSize];
						for (int i = 0; i < FilteredDataSize; i++) {
							FilteredData[i] = NextPrg.getGlobalData().get(
									FilteredDataOffset + i);
						}

						I++;
						prgStack.set(I, null);
					}
					unpIO.unpWrite(FilteredData, 0, FilteredDataSize);
					unpSomeRead = true;
					writtenFileSize += FilteredDataSize;
					WrittenBorder = BlockEnd;
					WriteSize = (unpPtr - WrittenBorder) & Compress.MAXWINMASK;
				} else {
					for (int J = I; J < prgStack.size(); J++) {
						UnpackFilter filt = prgStack.get(J);
						if (filt != null && filt.isNextWindow()) {
							filt.setNextWindow(false);
						}
					}
					wrPtr = WrittenBorder;
					return;
				}
			}
		}

		UnpWriteArea(WrittenBorder, unpPtr);
		wrPtr = unpPtr;

	}

	private void UnpWriteArea(int startPtr, int endPtr) throws IOException
	{
		if (endPtr != startPtr) {
			unpSomeRead = true;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国精产品一区一区三区mba视频| 国产一区二区三区美女| 精品免费国产一区二区三区四区| 成人精品一区二区三区中文字幕| 亚洲福中文字幕伊人影院| 国产亚洲精品bt天堂精选| 欧美丰满一区二区免费视频 | 国产午夜精品一区二区三区嫩草| 日本丶国产丶欧美色综合| 国产精品911| 免费xxxx性欧美18vr| 亚洲一区二区视频在线| 国产精品国产精品国产专区不蜜 | 欧美性猛交xxxxxx富婆| 国产成人亚洲综合色影视| 欧美aaa在线| 亚洲成人777| 亚洲人亚洲人成电影网站色| 欧美v国产在线一区二区三区| 欧美乱妇23p| 欧美日韩一级二级| 一本久久a久久精品亚洲| 成人av在线网站| 国产又粗又猛又爽又黄91精品| 婷婷综合五月天| 亚洲综合图片区| 亚洲精品欧美激情| 综合久久久久久久| 成人免费小视频| 中文字幕欧美激情一区| 久久久一区二区三区捆绑**| 亚洲精品一区二区三区精华液 | 国产激情91久久精品导航| 精品在线播放免费| 狂野欧美性猛交blacked| 天堂成人国产精品一区| 日韩高清不卡一区二区三区| 性感美女久久精品| 日韩**一区毛片| 日韩av中文字幕一区二区三区| 亚洲va天堂va国产va久| 日日夜夜精品视频免费| 五月天视频一区| 六月丁香婷婷色狠狠久久| 久久成人av少妇免费| 韩国欧美国产一区| 国产精品综合av一区二区国产馆| 国内精品视频666| 国产成人精品免费视频网站| a4yy欧美一区二区三区| 91色综合久久久久婷婷| 欧美婷婷六月丁香综合色| 欧美日韩精品是欧美日韩精品| 欧美日韩免费一区二区三区| 91精品中文字幕一区二区三区| 91精品国产乱码久久蜜臀| 久久综合久久综合九色| 日本一区二区三区在线观看| 亚洲柠檬福利资源导航| 午夜电影一区二区| 国内精品不卡在线| 99久久精品免费看| 欧美日韩国产乱码电影| 日韩一级大片在线观看| 久久精品人人做人人爽97| 18成人在线观看| 日韩影院免费视频| 国产99久久久久| 欧美伊人久久大香线蕉综合69| 91精品国产综合久久婷婷香蕉| 久久久精品tv| 亚洲国产精品尤物yw在线观看| 麻豆国产精品777777在线| 波多野结衣中文一区| 欧美人与禽zozo性伦| 久久久九九九九| 亚洲免费av在线| 久久精品国产久精国产| heyzo一本久久综合| 欧美日韩不卡在线| 国产精品伦一区二区三级视频| 亚洲大片在线观看| 成人免费毛片片v| 91精品欧美福利在线观看| 国产精品女人毛片| 日本女人一区二区三区| 成人免费三级在线| 日韩三级伦理片妻子的秘密按摩| 亚洲国产精品传媒在线观看| 亚洲成人在线网站| 成人午夜大片免费观看| 制服丝袜日韩国产| 亚洲欧美日韩电影| 国产电影精品久久禁18| 欧美一区二区在线播放| 国产精品毛片高清在线完整版| 免费在线成人网| 91久久一区二区| 欧美高清在线一区| 精品一区二区三区的国产在线播放| 色综合久久久久网| 国产欧美日韩在线视频| 奇米一区二区三区| 欧美少妇性性性| 中文字幕一区视频| 国产一区二区免费在线| 日韩一级黄色片| 亚洲一区二区精品久久av| www.亚洲在线| 久久精品欧美一区二区三区麻豆| 日日欢夜夜爽一区| 91官网在线免费观看| 日韩码欧中文字| 成人精品国产一区二区4080| 久久午夜老司机| 九色porny丨国产精品| 91精品国产91久久综合桃花 | 久久精品一区二区三区不卡牛牛| 婷婷成人综合网| 欧美中文字幕久久| 亚洲人妖av一区二区| 91在线码无精品| 自拍偷拍亚洲综合| 99久久免费视频.com| 中文字幕一区二区三区在线不卡| 懂色av中文一区二区三区| 久久久国产一区二区三区四区小说 | 日韩欧美国产电影| 免费高清在线一区| 日韩亚洲欧美中文三级| 免费在线成人网| 日韩欧美国产综合一区| 美女在线一区二区| 日韩一二三四区| 韩国欧美一区二区| 久久久亚洲欧洲日产国码αv| 国产在线精品一区二区三区不卡 | 国模套图日韩精品一区二区| 日韩一级高清毛片| 狠狠色丁香婷婷综合| 国产视频视频一区| 风间由美中文字幕在线看视频国产欧美| 久久综合九色综合欧美就去吻 | eeuss国产一区二区三区| 国产欧美精品一区二区色综合 | 91色在线porny| 亚洲精品久久久蜜桃| 欧美日韩你懂得| 蜜臀a∨国产成人精品| 精品国产亚洲在线| 国产福利91精品一区| 一区在线中文字幕| 欧美亚洲综合色| 久久精品国产色蜜蜜麻豆| 国产午夜三级一区二区三| 成年人网站91| 一区二区三区在线视频免费观看| 欧美亚洲一区二区三区四区| 亚欧色一区w666天堂| 精品精品欲导航| 成人激情小说乱人伦| 亚洲综合一区在线| 精品久久久久一区二区国产| 成人一级片在线观看| 一区二区三区在线观看欧美 | 亚洲免费观看高清完整| 欧美精品xxxxbbbb| 国产精品99久| 亚洲精品国产一区二区精华液 | 91蜜桃网址入口| 青青草国产精品97视觉盛宴 | 亚洲国产裸拍裸体视频在线观看乱了| 69堂国产成人免费视频| 国产盗摄女厕一区二区三区| 依依成人精品视频| 日韩精品一区国产麻豆| 色综合色综合色综合色综合色综合| 午夜精品福利一区二区蜜股av | 国产一区二区精品久久99| 亚洲欧美日韩国产另类专区| 日韩欧美你懂的| 色综合色综合色综合色综合色综合| 毛片基地黄久久久久久天堂| 1000部国产精品成人观看| 欧美一卡在线观看| 99国产精品久久久久久久久久| 日本美女一区二区三区视频| 国产精品久久久久久久久晋中| 91精品国产综合久久久久久久| 成人免费av资源| 精品一区二区三区日韩| 亚洲国产精品欧美一二99| 国产精品视频免费看| 日韩一区二区影院| 欧美天堂亚洲电影院在线播放| 国产成人精品在线看| 日韩专区在线视频| 亚洲欧美一区二区三区国产精品 | 精品亚洲成a人| 亚洲小说春色综合另类电影|