第二次修改，有点复杂
添加了部分注释