Program

The final program can be found here.