#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MOD = 1000000007LL; // 题目要求的模数,防止数值溢出
int main() {
// 优化输入输出速度:关闭cin与stdio同步,解绑cin和cout
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
if (!(cin >> s)) return 0; // 处理输入失败的边界情况
// 动态规划状态定义(核心思想:先包含空序列简化计算,最后再剔除)
ll total = 1; // 初始为1,表示空序列(所有合法子序列总数,包含空序列)
ll end6 = 0; // 记录所有合法子序列中以'6'结尾的数量(初始无字符,故为0)
// 遍历每个字符,逐字符更新状态(时间复杂度O(n),n为字符串长度)
for (char ch : s) {
ll prev = total; // 保存当前total的原始值(后续total会更新,需用原始值计算end6)
ll allowed; // 定义allowed:可以拼接当前字符ch的合法子序列数量
if (ch == '1') {
// 情况1:当前字符是'1'——不能接在以'6'结尾的子序列后(避免形成"61")
// allowed = 所有合法子序列 - 以'6'结尾的子序列(仅保留非6结尾的合法子序列)
allowed = (total - end6) % MOD;
} else {
// 情况2:当前字符不是'1'(是6或其他数字)——所有合法子序列都可拼接
allowed = total % MOD;
}
// 更新total:新的子序列总数 = 原有子序列(不选当前字符) + 拼接当前字符的新子序列(选当前字符)
total = (total + allowed) % MOD;
// 若当前字符是'6',更新以'6'结尾的子序列数量
if (ch == '6') {
// end6 = 原有以6结尾的子序列(不选当前6) + 拼接当前6的新子序列(选当前6,数量为prev即原total)
end6 = (end6 + prev) % MOD;
}
// 注:字符是1/其他非6字符时,end6无需更新(不会新增以6结尾的子序列)
}
// 最终结果:total包含空序列,需减1得到非空合法子序列数
ll ans = (total - 1) % MOD;
if (ans < 0) ans += MOD; // 处理total=0(空字符串)时的负数情况
cout << ans << '\n';
return 0;
}