using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); public static void Main() { Solve(); } static void Solve() { var n = NN; var b = new int[n]; for (var i = 0; i < n; ++i) b[i] = NN; WriteLine((Calc(n, b, 0, 0) + Calc(n, b, 0, 1) + Calc(n, b, 1, 0) + Calc(n, b, 1, 1)) % mod); } static int mod = 1_000_000_007; static long Calc(int n, int[] b, int left, int right) { if (left == 0 && right == 0 && b[0] == 1) return 0; var dp = new long[n, 4]; if (b[0] == 0) { if (left == 0 && right == 0) { dp[0, 0] = 1; dp[0, 1] = 1; } else if (left == 1 && right == 1) { dp[0, 3] = 1; } } else { if (left == 0 && right == 1) { dp[0, 0] = 1; dp[0, 1] = 1; } else if (left == 1 && right == 0) { dp[0, 2] = 1; dp[0, 3] = 1; } else if (left == 1 && right == 1) { dp[0, 2] = 1; } } for (var i = 1; i < n; ++i) { if (b[i] == 0) { dp[i, 0] = dp[i - 1, 0]; dp[i, 1] = dp[i - 1, 0]; dp[i, 3] = dp[i - 1, 3]; } else { dp[i, 0] = dp[i - 1, 2]; dp[i, 1] = dp[i - 1, 2]; dp[i, 2] = (dp[i - 1, 1] + dp[i - 1, 3]) % mod; dp[i, 3] = dp[i - 1, 1]; } } if (right == 0 && left == 0) return dp[n - 1, 0]; if (right == 0 && left == 1) return dp[n - 1, 1]; if (right == 1 && left == 0) return dp[n - 1, 2]; return dp[n - 1, 3]; } }