should be mostly done, I'll keep updating it when I find problems later