架完抽象了，花了167行 = =