copied alot of stuff from the internet