okay I'm just stealing from sylebro at this point
credits to @sylebro for basically everything in this project