#include <bits/stdc++.h>
#include <algorithm>
#define _GLIBCXX_DEBUG
using namespace std;
typedef long long ll;
int main(){
  ll a,b,mx=1; cin >> a >> b;
  vector<ll> count(b+1,0);
  for(ll i=a; i<=b; i++){
    for(ll j=1; j*j<=i; j++){
      if(i%j==0){
        if(j*j==i){
          count[j]++;
        }
        else{
          count[j]++;
          count[i/j]++;
        }
      }
    }
  }
  for(ll i=1; i<=b; i++){
    if(count[i]>=2 && mx < i){
      mx = i;
    }
  }
  cout << mx << endl;
}

    #include <bits/stdc++.h>
    using namespace std;
    #include <math.h>
    #include <iomanip>
    #include <cstdint>
    #include <string>
    #include <sstream>
    template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
    template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
    #define rep(i,n) for (int i = 0; i < (n); ++i)
    typedef long long ll;
    using P=pair<int,int>;
    const int INF=1001001001;
    const int mod=1e9+7;
    
    struct mint {
      ll x; 
      mint(ll x=0):x((x%mod+mod)%mod){}
      mint operator-() const { return mint(-x);}
      mint& operator+=(const mint a) {
        if ((x += a.x) >= mod) x -= mod;
        return *this;
      }
      mint& operator-=(const mint a) {
        if ((x += mod-a.x) >= mod) x -= mod;
        return *this;
      }
      mint& operator*=(const mint a) { (x *= a.x) %= mod; return *this;}
      mint operator+(const mint a) const { return mint(*this) += a;}
      mint operator-(const mint a) const { return mint(*this) -= a;}
      mint operator*(const mint a) const { return mint(*this) *= a;}
      mint pow(ll t) const {
        if (!t) return 1;
        mint a = pow(t>>1);
        a *= a;
        if (t&1) a *= *this;
        return a;
      }
       
      mint inv() const { return pow(mod-2);}
      mint& operator/=(const mint a) { return *this *= a.inv();}
      mint operator/(const mint a) const { return mint(*this) /= a;}
     };
      istream& operator>>(istream& is, const mint& a) { return is >> a.x;}
      ostream& operator<<(ostream& os, const mint& a) { return os << a.x;}
      struct combination {
      vector<mint> fact, ifact;
      combination(int n):fact(n+1),ifact(n+1) {
        assert(n < mod);
        fact[0] = 1;
        for (int i = 1; i <= n; ++i) fact[i] = fact[i-1]*i;
        ifact[n] = fact[n].inv();
        for (int i = n; i >= 1; --i) ifact[i-1] = ifact[i]*i;
      }
      mint operator()(int n, int k) {
        if (k < 0 || k > n) return 0;
        return fact[n]*ifact[k]*ifact[n-k];
      }
     } c(200005);

    void rot(vector<vector<int>>& s){
      int h=s.size(),w=s[0].size();
      vector<vector<int>>t(w,vector<int>(h));
      swap(s,t);
      rep(j,w){
        rep(i,h){
          s[j][i]=t[h-1-i][j];
        }
      }
    }

    int main(){
      int h,w;cin>>h>>w;
      vector<string>s(h);
      rep(i,h){cin>>s[i];}
      vector<vector<int>>a(h,vector<int>(w));
      int cnt=0;
      vector<vector<int>>sum(h,vector<int>(w));
      rep(i,h){
        rep(j,w){
          if(s[i][j]=='.'){a[i][j]=1;sum[i][j]=1;cnt++;}
        }
      }
      rep(z,4){
        vector<vector<int>>res(h,vector<int>(w));
        rep(i,h){
          rep(j,w){
            if(j&&a[i][j]&&a[i][j-1]){res[i][j]+=(res[i][j-1]+1);}
            sum[i][j]+=res[i][j];
          }
        }
        rot(a);
        rot(sum);
        swap(h,w);
      }
      vector<mint>two(h*w+1,1);
      rep(i,h*w){two[i+1]=two[i]*2;}

      mint ans=0;
      rep(i,h){
        rep(j,w){
          ans+=two[cnt]-two[cnt-sum[i][j]];
        }
      }
      cout<<ans<<endl;
      return 0;
    }