FINISH!!!! forget to add comments, i will do it later