This took a lot longer than I anticipated, but you can find it here.