Skip to content

Commit

Permalink
update hanlp
Browse files Browse the repository at this point in the history
  • Loading branch information
fanghon committed Dec 1, 2019
1 parent 6486b13 commit 73ff427
Show file tree
Hide file tree
Showing 25 changed files with 226 additions and 100 deletions.
2 changes: 1 addition & 1 deletion .classpath
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path="lib/IKAnalyzer2012_u6.jar"/>
<classpathentry kind="lib" path="lib/shinglecloud-0.51.jar"/>
<classpathentry kind="lib" path="lib/tika-app-1.4.jar"/>
<classpathentry kind="lib" path="lib/ant.jar"/>
<classpathentry kind="lib" path="lib/substance-5.3.jar"/>
<classpathentry kind="lib" path="lib/jplag-2.12.1-SNAPSHOT-jar-with-dependencies.jar"/>
<classpathentry kind="lib" path="lib/hanlp-portable-1.7.5.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
2 changes: 2 additions & 0 deletions .settings/org.eclipse.core.resources.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding//testdata/doccn/dongxiaoutf8-2.txt=UTF-8
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
本系统在它们基础上进行了二次开发和封装,针对moss系统,开发出了客户端存取模块,实现了代码文件提交、结果获取和解析、结果排序等功能;针对sim和jplag,则将其集成到系统中,在moss因网络故障等原因不可用时,可作为替代产品使用。

中英文文档作业相似度的比较则基于[shinglecloud算法](https://www.kom.tu-darmstadt.de/de/research-results/0/1/shinglecloud/)(一种基于文本指纹的、语言无关的相似度快速计算方法),文档主要处理过程如下:
1. 使用tika读取不同格式(txt、doc、docx等)的文档,并将其转换成能统一处理的文本;
2. 使用ikanalyzer对文本进行预处理、精确分词
1. 使用tika读取不同格式(txt、doc、docx、pdf、html等)不同编码文件中的文本内容,并将其转换成能统一处理的文本;
2. 使用hanlp对文本进行预处理、分词
3. 使用shinglecloud算法计算文本之间的相似度;
4. 根据相似度排序,输出比较结果。

Expand All @@ -33,6 +33,9 @@
3. [Winnowing: Local Algorithms for Document Fingerprinting](http://theory.stanford.edu/~aiken/publications/papers/sigmod03.pdf) moss系统采用的核心算法
4. [软件抄袭检测研究综述](https://faculty.ist.psu.edu/wu/papers/spd-survey-16.pdf)

## 更新情况
1. 2019.12.1 使用hanlp作为分词组件,增加支持pdf、html文件文本的查重,修复若干bug,发布v2.8.6版。

## TODO
1. 将jplag整合进系统。已实现。
2. 支持html,jsp文件的查重。
Expand Down
2 changes: 1 addition & 1 deletion bin/.gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
/utils/
/preprocess/
/gui/
Binary file modified bin/gui/plag/edu/FileConvertFrame$4.class
Binary file not shown.
Binary file modified bin/gui/plag/edu/FileConvertFrame.class
Binary file not shown.
Binary file modified bin/gui/plag/edu/PlagGUI.class
Binary file not shown.
Binary file removed bin/preprocess/plag/edu/IKAnalyzer.class
Binary file not shown.
Binary file modified bin/preprocess/plag/edu/TextExtractor.class
Binary file not shown.
Binary file modified bin/shingle/plag/edu/ShingleSim$Fileter.class
Binary file not shown.
Binary file modified bin/shingle/plag/edu/ShingleSim.class
Binary file not shown.
5 changes: 3 additions & 2 deletions help.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
��ҵ����ϵͳʹ�ð���(v2.8.2��)
��ҵ����ϵͳʹ�ð���(v2.8.6��)

һ ��������
ϵͳ��window10��jdk11 64λ�����в�ͨ�����ԡ�
Expand All @@ -19,7 +19,8 @@

2 �ĵ��ı������ƶȼ��
�ĵ����IJ�������ͳ������ļ�ⲽ�����һ�£�ֻ�ǡ�ѡ����ҵ��ʱ��ѡ������ĵ���ҵ��
�磺testdata/doccn�µ���ҵ���ĵ��ļ�����չ��������txt��doc��docx�е�һ�֣�
�磺testdata/doccn�µ���ҵ���ĵ��ļ�����չ��������txt��doc��docx��pdf��html
���е�һ�֡�
��ҵ�����ǡ��ı���ҵ����Ȼ������ִ�бȽϡ���ť���ȴ���ȷ�ϴ�����������������鿴�����
��ť��ϵͳ��򿪡��ȽϽ�������ڣ����Բ鿴�ȽϽ����
�ı��ĵ��ıȽ�Ŀǰ�ݲ�֧��ͨ���������ҳ���п��ӻ��Աȡ�
Expand Down
Binary file removed lib/IKAnalyzer2012_u6.jar
Binary file not shown.
Binary file added lib/hanlp-portable-1.7.5.jar
Binary file not shown.
59 changes: 57 additions & 2 deletions out.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,57 @@
1 8.0% testdata\python\stu1_demo.py testdata\python\stu1_lprcmd.py
from stanford:http://moss.stanford.edu/results/874773796 Fri Oct 25 19:19:17 CST 2019
1 99.51535% dongxiao-2.doc dongxiaogbk.txt
2 92.47312% gumingzhu-2.doc zhucuiyun_2.doc
3 91.408936% wangmeng-2.doc zhucuiyun_2.doc
4 87.63636% dongxiao-2.docx dongxiaoutf8-2.txt
5 84.717606% gumingzhu-2.doc wangmeng-2.doc
6 84.310844% dongxiao-2.doc dongxiao-2.pdf
7 84.168015% dongxiao-2.doc dongxiaoutf8-2.txt
8 83.870964% dongxiao-2.pdf dongxiaogbk.txt
9 83.68336% dongxiaogbk.txt dongxiaoutf8-2.txt
10 82.954544% dongxiao-2.docx dongxiaogbk.txt
11 82.552505% dongxiao-2.doc dongxiao-2.docx
12 75.74404% lijie-2.doc wangmeng-2.doc
13 74.96063% gumingzhu-2.doc wuchangqing-2.doc
14 71.703705% dongxiao-2.pdf dongxiaoutf8-2.txt
15 71.49254% dongxiao-2.docx dongxiao-2.pdf
16 69.92366% wuchangqing-2.doc zhucuiyun_2.doc
17 68.584076% lijie-2.doc zhucuiyun_2.doc
18 65.61151% wangmeng-2.doc wuchangqing-2.doc
19 65.12301% gumingzhu-2.doc lijie-2.doc
20 57.454544% dongxiaogbk.txt meitao-2.doc
21 57.246376% dongxiao-2.doc meitao-2.doc
22 52.258064% lijie-2.doc wuchangqing-2.doc
23 50.757576% dongxiao-2.docx meitao-2.doc
24 50.284416% dongxiao-2.pdf meitao-2.doc
25 48.87218% makai��2.doc wangxuan_2.doc.doc
26 48.45869% dongxiaoutf8-2.txt meitao-2.doc
27 46.67074% liuchuanyang-2.doc tangwenpeng-2.doc
28 41.64096% heliwen_2.doc liufan_2.doc
29 40.54834% liufan_2.doc wangchunming_2.doc
30 38.75061% gechunlong-2.doc hanchao_2.doc
31 36.930233% luxiang-2.doc tangwenpeng-2.doc
32 36.89095% jiangfeng-2.doc lijie-2.doc
33 35.925926% weixiao-2.doc yinxu-2.doc
34 35.424637% liuchuanyang-2.doc wuliangchao-2.doc
35 35.039577% gechunlong-2.doc yinxu-2.doc
36 34.839073% gechunlong-2.doc weixiao-2.doc
37 34.325184% wangmeng-2.doc wuliangchao-2.doc
38 34.069096% guozhiquan -2.doc wuliangchao-2.doc
39 33.98907% wuliangchao-2.doc zhucuiyun_2.doc
40 32.858547% tangwenpeng-2.doc xuqiwei-2.doc
41 32.557137% tangwenpeng-2.doc wangchen-2.doc
42 32.296955% liuchuanyang-2.doc yinxu-2.doc
43 32.073547% lijie-2.doc wuliangchao-2.doc
44 32.070206% gechunlong-2.doc wangchen-2.doc
45 32.058823% jiangfeng-2.doc yinpeiyan_2.doc
46 31.946404% sunxiaolei-2.doc wangchunming_2.doc
47 31.471535% gumingzhu-2.doc wuliangchao-2.doc
48 30.698889% sunxiaolei-2.doc yinxu-2.doc
49 30.651136% liuchuanyang-2.doc xuqiwei-2.doc
50 30.63007% heliwen_2.doc wangchunming_2.doc
51 30.559345% liuchuanyang-2.doc weixiao-2.doc
52 30.494392% wangchen-2.doc xuqiwei-2.doc
53 30.429863% tangwenming-2.doc xuqiwei-2.doc
54 30.424183% tangwenming-2.doc wangchen-2.doc
55 30.095451% sunxiaolei-2.doc tangwenpeng-2.doc
56 30.065361% guozhiquan -2.doc liuchuanyang-2.doc
from fh Sun Dec 01 18:57:44 CST 2019
7 changes: 5 additions & 2 deletions src/gui/plag/edu/FileConvertFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,14 @@ public void actionPerformed(ActionEvent arg0) {
if("python".equals(type)) {
filter[0]="**/*.py";
}
if("doc".equals(type)){ //文档类型,支持doc txt docx
filter = new String[3];
if("doc".equals(type)){ //文档类型,支持doc txt docx pdf html
filter = new String[6];
filter[0] = "**/*.doc";
filter[1] = "**/*.txt";
filter[2] = "**/*.docx";
filter[3] = "**/*.pdf";
filter[4] = "**/*.html";
filter[5] = "**/*.htm";
}

String[] filestrs = AntFile.scanFiles(srcf, filter); //返回含子目录的相对文件名
Expand Down
2 changes: 1 addition & 1 deletion src/gui/plag/edu/PlagGUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public void stateChanged(ChangeEvent arg0) {
panel.add(radBntProgram);

radBntText = new JRadioButton("\u6587\u672C\u4F5C\u4E1A");
radBntText.setToolTipText("\u652F\u6301\u6587\u6863\u7C7B\u578B\uFF1Adoc docx txt");
radBntText.setToolTipText("\u652F\u6301\u6587\u6863\u7C7B\u578B\uFF1Adoc docx txt pdf html\u7B49");
radBntText.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent arg0) {
//文本作业按钮被选择
Expand Down
70 changes: 0 additions & 70 deletions src/preprocess/plag/edu/IKAnalyzer.java

This file was deleted.

11 changes: 9 additions & 2 deletions src/preprocess/plag/edu/TextExtractor.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,11 @@ public static String getTxt(File f) {
try {
is = new FileInputStream(f);
Tika tika = new Tika();
String str = tika.parseToString(new FileInputStream(f));
Metadata metadata = new Metadata();
metadata.set(Metadata.RESOURCE_NAME_KEY, f.getName()); //避免gbk编码txt文本提取错误
String str = tika.parseToString(new FileInputStream(f),metadata);
// System.out.println(f.getName());
// System.out.println(str);

return str;
} catch (FileNotFoundException e) {
Expand Down Expand Up @@ -100,7 +104,10 @@ public static String fileToTxt(File f,Metadata metadata) {
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
File f = new File("D:\\fh\\教学\\201302\\软件测试\\学生提交作业\\第一次作业\\sunxiaolei-1.doc");
// File f = new File("./testdata/doccn/dongxiao-2.doc");
File f = new File("./testdata/doccn/dongxiao-2.pdf");
// File f = new File("./testdata/doccn/dongxiaogbk.txt");
// File f = new File("./testdata/doccn/dongxiaoutf8-2.txt");
System.out.println(TextExtractor.getTxt(f));
Metadata metadata = new Metadata();
System.out.println(TextExtractor.fileToTxt(f,metadata));
Expand Down
54 changes: 54 additions & 0 deletions src/preprocess/plag/edu/Tokenizer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package preprocess.plag.edu;

import java.util.List;

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.dictionary.CustomDictionary;
import com.hankcs.hanlp.seg.common.Term;
import com.hankcs.hanlp.tokenizer.NotionalTokenizer;

public class Tokenizer {
//将输入的字符串转成指定分隔符隔开的分词过的字符串
public static String segment(String text,String sep) {
StringBuilder sb = new StringBuilder();
HanLP.Config.Normalization = true; //(繁体->简体,全角->半角,大写->小写)
List<Term> tokens = NotionalTokenizer.segment(text);//分词,去除停用词
for(Term token : tokens) {
sb.append(token.word+sep);
}
return sb.toString();
}

public static void main(String[] args) {
// TODO Auto-generated method stub
HanLP.Config.Normalization = true; //(繁体->简体,全角->半角,大写->小写)
CustomDictionary.insert("爱听4G", "nz 1000");
String text = "i am from china.小区居民有的反对喂养流浪猫,而有的居民却”赞成“喂养这些小宝贝,i will go back Home,我愛聽4G";
System.out.println(text);
//精确分词
List<Term> tokens = HanLP.segment(text);
System.out.println(tokens); // 停用词典位于data/dictionary/stopwords.txt,可以自行修改
for (Term token : tokens) {
System.out.print("("+token.word+","+token.offset+","+token.length()+")");

}
System.out.println();
// 自动去除停用词,会丢失词在原文件中的位置信息
tokens = NotionalTokenizer.segment(text);
System.out.println(tokens); // 停用词典位于data/dictionary/stopwords.txt,可以自行修改
for (Term token : tokens) {
System.out.print("("+token.word+","+token.offset+","+token.length()+")");

}
System.out.println();
// 自动断句+去除停用词
for (List<Term> sentence : NotionalTokenizer.seg2sentence(text))
{
System.out.println(sentence);
}
//英语中的停用词也会被去掉
String str = Tokenizer.segment(text," ");
System.out.println(str);
}

}
28 changes: 11 additions & 17 deletions src/shingle/plag/edu/ShingleSim.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,16 @@
import java.util.Collections;
import java.util.List;

import preprocess.plag.edu.IKAnalyzer;
import preprocess.plag.edu.TextExtractor;
import preprocess.plag.edu.Tokenizer;
import utils.edu.FileIO;

//import sim.edu.TestWinnowing.Fileter;
//import preprocess.plag.edu;
import data.plag.edu.SimData;
import de.tud.kom.stringmatching.gst.GST;
import de.tud.kom.stringmatching.gst.GSTTile;
import de.tud.kom.stringmatching.gst.utils.GSTHighlighter;
import de.tud.kom.stringmatching.shinglecloud.ShingleCloud;
import de.tud.kom.stringmatching.shinglecloud.ShingleCloudMatch;
import de.tud.kom.stringutils.preprocessing.WhiteSpaceRemovalPreprocessing;
import de.tud.kom.stringutils.tokenization.CharacterTokenizer;
import de.tud.kom.stringutils.tokenization.WordTokenizer;
//import fengci.edu.IKAnalyzer;

public class ShingleSim {
String dic = null; //作业路径名
float threshold = 0.3f; //相似门限是0.3
float threshold = 0.3f; //相似门限默认是0.3
List<File> filels = new ArrayList<File>(); //需要比较的文件
List<SimData> listsd = new ArrayList<SimData>(); //文件比较的结果

Expand All @@ -53,14 +43,17 @@ public void explore(File file) {
}
}

// 实现文件过滤接口,内部类方式,只允许doc、txt、docx类文件及子目录
// 实现文件过滤接口,内部类方式,只允许doc、txt、docx、pdf类文件及子目录
class Fileter implements FileFilter {
@Override
public boolean accept(File arg0) {
// TODO Auto-generated method stub
if (arg0.getName().endsWith(".doc") //
|| arg0.getName().endsWith(".txt")
|| arg0.getName().endsWith(".docx") || arg0.isDirectory())
String fn = arg0.getName().toLowerCase();
if (fn.endsWith(".doc") //
|| fn.endsWith(".txt")
|| fn.endsWith(".docx")
|| fn.endsWith(".pdf")
|| arg0.isDirectory())
return true;
return false;
}
Expand All @@ -70,7 +63,8 @@ public String processZHText(File file){
String resstr=null;
try {
String str = TextExtractor.getTxt(file);
resstr = IKAnalyzer.segment(str,true," "); //智能分词、停用词过滤,空格分开
//resstr = IKAnalyzer.segment(str,true," "); //智能分词、停用词过滤,空格分开
resstr = Tokenizer.segment(str," ");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Expand Down
Binary file added testdata/doccn/dongxiao-2.docx
Binary file not shown.
Binary file added testdata/doccn/dongxiao-2.pdf
Binary file not shown.
41 changes: 41 additions & 0 deletions testdata/doccn/dongxiaogbk.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
���ʶ��壨�������Ƹ���Ӣ�ļ�����ij���12x2��
1.�������ԣ�Software Testing����������https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95 ���壺������������Ҳ��Ϊ�˶������������ж��������� ������ P18
2. ��Ԫ����: unit testing ������http://www.igsgroup.com.cn/common/ISTQB%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E4%B8%93%E4%B8%9A%E6%9C%AF%E8%AF%AD%E5%AF%B9%E7%85%A7%E8%A1%A8v2.1.pdf
���壺������ϸ��ƹ��˵���飬��ģ����������Ҫ����·����Ʋ���������������ģ���ڲ����� P94
3. ���ɲ���: integration testing ����ͬ�� ���壺�ڵ�Ԫ���ԵĻ����ϣ������г���ģ��������򡢵����IJ��ԣ��������Ԫ�򲿼��Ľӿڹ�ϵ��ʹ֮����Ҫ�� P25
4. ϵͳ���ԣ�system testing ����ͬ�� ���壺�Լ��ɵ�������Ӳ��ϵͳ���еIJ��� P26
5. ���ղ���: acceptance testing ����ͬ�� ���壺������ĿҪ��ͺ�ͬ������˫��ǩ���������ĵ����еIJ��Ժ����� P26
6. ���ܲ��ԣ�functional testing ����ͬ�� ���壺���ܲ��Ծ��ǶԲ�Ʒ�ĸ����ܽ�����֤�����ݹ��ܲ���������������ԣ�����Ʒ�Ƿ�ﵽ�û�Ҫ��Ĺ��ܡ� ������ http://baike.baidu.com/view/651435.htm
7. �ںв��ԣ�black-box testing ����ͬ�� ���壺δ֪�����ڲ��ṹ���еIJ��� P26
8. �׺в��ԣ�white-box testing ����ͬ�� ���壺��֪�����ڲ��ṹ���еIJ��� P26
9. ���ܲ��ԣ�performance testing ����ͬ�� ���壺�������������ڼ���ϵͳ�е��������ܡ�P135
10. �����ԣ���testing ���壺�Լ������е�������Ʒ���в��� P158
11.CMM��Capability Maturity Model for Software ���������ģ�� http://baike.baidu.com/view/8110.htm ���壺����������֯�ڶ��塢ʵʩ�����������ƺ͸������������̵�ʵ���и�����չ�׶ε����� http://baike.baidu.com/view/8110.htm
12. ISO9000������������ϵ��׼ ���壺��TC176������������ϵ����ίԱ�ᣩ�ƶ������й��ʱ�׼�� http://baike.baidu.com/view/9486.htm
����⣺��2x12��
1 �ںв��ԺͰ׺в��Ե�������Щ����ʹ�úںв��Ը����׷���?��Щ����ʹ�ð׺в��Ը����׷��֣�����2����
�ںв����Dz�֪�����������ڲ��ṹ���׺в�����֪�����������ڲ��ṹ��
�ںв��Ա��ڷ���1���Ƿ��в���ȷ����©�Ĺ��ܣ�2���ڽӿ��ϣ������Ƿ�����ȷ�Ľ��ܣ��ܷ������ȷ�Ľ����
�׺в������ڷ��֣�1�������е��߼��ж���ȡ���桱��ȡ���١�����������������ٲ�һ�顣2����ѭ���ı߽�����еĽ�����ִ��ѭ����
http://zhidao.baidu.com/question/13988876.html
2 ���ɲ��Ժ�ϵͳ���Ե��������ϵ��
P132 ���ɲ��Զ�����ģ���Ľӿڣ�ϵͳ���Զ���������ϵͳ�����ɲ��Ժ�ϵͳ���Զ��õ��ںв���
�ʴ��⣺(52)
1 (10)���������������ٲ�ģ�ͣ�������Լ�����ľ�����Ŀ���ش��������⣺
�ٲ�ģ�ͣ��������о��ͼƻ��������������ơ����롪���ԡ�����ά�� http://baike.baidu.com/view/551037.htm
��1�� ʵ����Ŀ������������Щ�׶Σ����ȼ򵥲�����������Ŀ��
��һ��������Ʊϵͳ��һ��ʼ��ʦ˵Ҫ�󣨿������о��ͷ�������ͬѧ�������󣬿�ʼ������ʦ��Ҫʲô�����������������Ȼ�����������и���Ӧ���뷨����ƣ�����ʼ����루���룩���������û�б��������ܲ������У����ԣ�
��2�� ��Ϊ����Ա������д������Ϊ����Ҫ��3���׶Σ���˵��ԭ��
�����������ƣ����롣���������ֻ��֪���Լ���Ҫʲô����֪���Լ�Ҫ����ʲô��������ƣ��и������ģ�ӣ�����֪������ôŪ�����룬��Ȼ�dz���Ա���������ܽг���Ա��

2 (12)д���������Ե�2�ֲ�ͬ���壬ָ�����ǵ�������ϲ����һ�֣�Ϊʲô��
��һ�֣�P18 Bill Hetzel ������Ե�Ŀ�IJ�������Ϊ�˷�������ȱ�ݺʹ���Ҳ�Ƕ������������ж��������������������������
�ڶ��֣� P18 Grenford J.Myers ������Ϊ��֤�������д���������֤�������޴���
�ڶ���Ƭ��㡣ԭ�򣺵�һ���������ȫ��㣬��Ϊ�����ǿ϶��д��ģ�������������ûbug�ģ������Ҹ�ϲ���ڶ���

3 (30)����Vģ�ͣ�˵���������Թ����Ǵ��ĸ��׶ο�ʼ�ģ���Ͼ�����Ŀ����ʵ����Ŀ�����о�������Щ���Խ׶Σ�������Щ���͵IJ��ԣ��繦�ܡ��ڰ׺еȣ��������������Ϊ�ĸ����Խ׶�����Ҫ��Ϊʲô��P30
�û����������������Ҫ��������ϸ���������롪��Ԫ���ԡ������ɲ��ԡ�ϵͳ���ԡ����ղ���
������Ʊϵͳ��ÿ���࣬����Ū��֮�󣬿϶��ȼ����û�д������л᲻�ᱨ������Ԫ���ԣ�����һЩ���ࡢ�����ĵ��ã����ܲ��ܱ����ã����ɲ��ԣ������һ���Ժ�����Ʊ�IJ��ԣ����ܲ��ܳɹ���ϵͳ���ԣ���������ʦ�������ղ��ԣ�
�׺в��ԣ�����֮��һ����û��ʲô����
�ںв��ԣ���ʦ����ʱ������û��Ч��
�Ҿ����û����󣬾ͺ���Ҫ����Ϊ����Խ�緢�֣���ʧԽС
Loading

0 comments on commit 73ff427

Please sign in to comment.