Takahashi has an empty string S and a variable x whose initial value is 0.

Also, we have a string T consisting of `0` and `1`.

Now, Takahashi will do the operation with the following two steps |T| times.

* Insert a `0` or a `1` at any position of S of his choice.
* Then, increment x by the sum of the digits in the odd positions (first, third, fifth, ...) of S. For example, if S is `01101`, the digits in the odd positions are `0`, `1`, `1` from left to right, so x is incremented by 2.



Print the maximum possible final value of x in a sequence of operations such that S equals T in the end.

Constraints

* 1 \leq |T| \leq 2 \times 10^5
* T consists of `0` and `1`.

Input

Input is given from Standard Input in the following format:


T


Output

Print the maximum possible final value of x in a sequence of operations such that S equals T in the end.

Examples

Input

1101


Output

5


Input

0111101101


Output

26
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using Graph = vector<vector<int>>;
using WGraph = vector<vector<pair<int, ll>>>;

template<class T>inline bool chmax(T &a, const T &b) { if (b > a) { a = b; return true; } return false; }
template<class T>inline bool chmin(T &a, const T &b) { if (b < a) { a = b; return true; } return false; }

constexpr int dx[4] = {-1, 0, 0, 1}, dy[4] = {0, -1, 1, 0};
constexpr int INF = 1e9;
constexpr int MOD = 1e9 + 7;
constexpr long long LINF = 1e18;
constexpr double EPS = 1e-10;
constexpr double PI = M_PI;

void solve() {
    string t;
    cin >> t;
    int len = (int)t.size();
    ll res = 0;
    ll cur = 0;
    vector<bool> in(len, false);
    for (int i=0; i<len; ++i) {
        if (t.at(i) == '1') {
            in.at(i) = true;
            ++cur;
            res += (cur+1) / 2;
        }
    }
    ll used = 0;
    ll fowZero = 0, fowOne = 0;
    for (int i=0; i<len; ++i) {
        if (t.at(i) == '0') {
            if (used%2 == 1) {
                in.at(i) = true;
                ++cur;
                res += (cur+1) / 2;
                ++fowZero;
                ++used;
            }
        } else {
            ++used;
            ++fowOne;
        }
    }
    ll backOdd = 0, backEven = 0;
    for (int i=len-1; i>=0; --i) {
        if (t.at(i) == '0') {
            if (in.at(i)) {
                ++backEven;
                --fowZero;
            } else {
                in.at(i) = true;
                if ((fowOne + fowZero) % 2 == 0) ++backEven;
                else ++backOdd;
                swap(backOdd, backEven);
                ++cur;
                res += (cur+1) / 2 - backOdd;
            }
        } else {
            --fowOne;
        }
    }
    cout << res << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout << fixed << setprecision(20);

    solve();

    return 0;
}
