Source: https://info.usherbrooke.ca/informatique/cours/archive-plan-de-cours/a12-plans-de-cours/ift099_2012-3_pdc.pdf