Draw an ASCII-O'-Lantern for Halloween Halloween is almost here, the holiday after which most people need to wean themselves off a hollow diet of sugar.

Write a program that takes in a positive integer. If the integer is less than 31 (1 through 30), output this ASCII-art jack-o'-lantern, looking to the right as if looking forward to Halloween:

 _____I_____
| | | | | | |
| | |^| |^| |
| | | |^| | |
| | |VvVvV| |
|_|_|_|_|_|_|


If the input is 31 (the October date Halloween is on), output the same ASCII-o'-lantern, but looking left:

 _____I_____
| | | | | | |
| |^| |^| | |
| | |^| | | |
| |VvVvV| | |
|_|_|_|_|_|_|


If the input is greater than 31, output a bloated-looking ASCII-o'-lantern who probably ate too much candy. He can face either left or right since queasyness can be disorientating. So output:

 _____I_____
| | | | | | |
| |o| |o| | |
| | |^| | | |
| |XXXXX| | |
|_|_|_|_|_|_|


or

 _____I_____
| | | | | | |
| | |o| |o| |
| | | |^| | |
| | |XXXXX| |
|_|_|_|_|_|_|


Whichever you prefer. It may even be different for different numbers above 31.

The shortest code in bytes wins.
JavaScript (ES6), 185 142 140 136 bytes

Now you can tweet-a-pumpkin!

n=&gt;` _____I_____
0 4 1
02421
0 |^| 1
031
|_|_|_|_|_|_|`.replace(/\d/g,x=&gt;x-2?x-3?x^n&gt;30?"| |":"| | |":n&gt;31?"XXXXX":"VvVvV":n&gt;31?"o":"^")


Probably still room for improvement...