Source: https://umm-csci.github.io/senior-seminar/seminars/spring2019/an.pdf