Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers whose decimal representation contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not.

Petya has n number segments [l1; r1], [l2; r2], ..., [ln; rn]. During one move Petya can take any segment (let it be segment number i) and replace it with segment [li + 1; ri + 1] or [li - 1; ri - 1]. In other words, during one move Petya can shift any segment to the left or to the right by a unit distance. Petya calls a number full if it belongs to each segment. That is, number x is full if for any i (1 ≤ i ≤ n) the condition li ≤ x ≤ ri is fulfilled.

Petya makes no more than k moves. After that he counts the quantity of full lucky numbers. Find the maximal quantity that he can get.

Input

The first line contains two integers n and k (1 ≤ n ≤ 105, 1 ≤ k ≤ 1018) — the number of segments and the maximum number of moves. Next n lines contain pairs of integers li and ri (1 ≤ li ≤ ri ≤ 1018).

Please do not use the %lld specificator to read or write 64-bit integers in С++. It is preferred to use the %I64d specificator.

Output

Print on the single line the single number — the answer to the problem.

Examples

Input

4 7
1 4
6 9
4 7
3 5


Output

1


Input

2 7
40 45
47 74


Output

2

Note

In the first sample Petya shifts the second segment by two units to the left (it turns into [4; 7]), after that number 4 becomes full.

In the second sample Petya shifts the first segment by two units to the right (it turns into [42; 47]), and shifts the second segment by three units to the left (it turns into [44; 71]), after that numbers 44 and 47 become full.
import java.util.*;

public class Main {

  public static void main(String args[]) {
    (new Main()).solve();
  }

  ArrayList<Long> all = new ArrayList<Long>();

  long inf = 1000000000000000000L;

  void init() {
    add(0);
    Collections.sort(all);
  }

  void add(long L) {
    if( L >= inf ) { return; }
    if( L > 0 ) { all.add(L); }
    add(L * 10 + 4);
    add(L * 10 + 7);
  }

  int solve(int n, long k, long seg[][]) {
    long width = inf;
    for(int i=0; i<n; ++i) {
      width = Math.min(width, seg[i][1] - seg[i][0]);
    }
    int ret = 0;
    for(int i=0; i<all.size(); ++i) {
      long L = all.get(i);
      int lo = i + ret - 1;
      int hi = all.size();
    MAIN:
      while( lo + 1 < hi ) {
        int mid = (lo + hi) / 2;
        long R = all.get(mid);
        if( R - L > width ) {
          hi = mid;
          continue;
        }
        long rest = k;
        for(int m=0; m<n; ++m) {
          if( seg[m][0] <= L && R <= seg[m][1] ) { continue; }
          if( seg[m][0] > L ) {
            long a = seg[m][0] - L;
            if( seg[m][1] - a >= R ) {
              rest -= a;
              if( rest < 0 ) {
                hi = mid;
                continue MAIN;
              }
            }
            else {
              hi = mid;
              continue MAIN;
            }
          }
          if( seg[m][1] < R ) {
            long b = R - seg[m][1];
            if( seg[m][0] + b <= L ) {
              rest -= b;
              if( rest < 0 ) {
                hi = mid;
                continue MAIN;
              }
            }
            else {
              hi = mid;
              continue MAIN;
            }
          }
        }
        lo = mid;
      }
      ret = Math.max(ret, lo - i + 1);
    }
    return ret;
  }

  void solve() {

    init();

    Scanner cin = new Scanner(System.in);

    while( cin.hasNextInt() ) {

      int n = cin.nextInt();
      long k = cin.nextLong();

      long seg[][] = new long[n][2];
      for(int i=0; i<n; ++i) {
        seg[i][0] = cin.nextLong();
        seg[i][1] = cin.nextLong();
      }

      System.out.println(solve(n, k, seg));

    }

  }

}
