import java.util.HashMap;
import java.util.Map;

public class Euler760 {
    static final long MOD = 1000000007L;
    static final long INV2 = (MOD + 1) / 2;

    static class HS {
        long h, s;

        HS(long h, long s) {
            this.h = h;
            this.s = s;
        }
    }

    static Map<Long, HS> memo = new HashMap<>();

    static long addMod(long a, long b) {
        long r = a + b;
        return (r >= MOD) ? (r - MOD) : r;
    }

    static long mulMod(long a, long b) {
        return (a * b) % MOD;
    }

    static HS solveRec(long n) {
        if (n <= 0) {
            return new HS(0, 0);
        }
        HS cached = memo.get(n);
        if (cached != null) {
            return cached;
        }

        long m = n / 2;
        HS sm = solveRec(m);
        HS sm1 = solveRec(m - 1);
        long mm = m % MOD;

        long h = 0;
        long s = 0;

        if ((n & 1L) == 0L) {
            h = (mulMod(2, sm.h) + mulMod(2, sm1.h) + mm) % MOD;

            long poly = mulMod(3, mulMod(mm, (mm + 1) % MOD));
            poly = mulMod(poly, INV2);
            s = (mulMod(2, sm.s) + mulMod(6, sm1.s) + poly) % MOD;
        } else {
            h = (mulMod(4, sm.h) + mulMod(2, (mm + 1) % MOD)) % MOD;

            long poly = 0;
            poly = (poly + mulMod(3, mulMod(mm, mm))) % MOD;
            poly = (poly + mulMod(7, mm)) % MOD;
            poly = (poly + 4) % MOD;
            poly = mulMod(poly, INV2);
            s = (mulMod(6, sm.s) + mulMod(2, sm1.s) + poly) % MOD;
        }

        HS out = new HS(h, s);
        memo.put(n, out);
        return out;
    }

    public static String solve() {
        long n = 1000000000000000000L;
        HS res = solveRec(n);
        long ans = mulMod(2, res.s);
        return Long.toString(ans);
    }

    public static void main(String[] args) {
        System.out.println(solve());
    }
}
