//Zory-2020
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
// typedef __int128 ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define db double
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
#define mem(x,val) memset(x,val,sizeof x)
#define Swap(a,b,n) for(int I=0;I<=n;I++) swap(a[I],b[I])
#define PC __builtin_popcountll
#ifdef DEBUG
	#define debug(A,args...) fprintf(stderr,A,##args)
#else
	#define debug(A,args...) 
#endif
namespace mine
{
	ll qread()
	{
		ll ans=0,f=1;char c=getchar();
		while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
		while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
		return ans*f;
	}
	void write(ll num){if(num<0) putchar('-'),num=-num;if(num>=10) write(num/10);putchar('0'+num%10);}
	void write1(ll num){write(num);putchar(' ');}
	void write2(ll num){write(num);putchar('\n');}
	template<typename T>inline bool chmax(T&a,const T&b){return a<b?a=b,1:0;}
	template<typename T>inline bool chmin(T&a,const T&b){return a>b?a=b,1:0;}
	ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
	bool IN(ll x,ll l,ll r){return l<=x and x<=r;}
	void GG(){puts("No");exit(0);}
	
	const db eps=1e-8;
	const int INF=0x3f3f3f3f;
	const int MOD=1e9+7;
	int mm(const int x){return x>=MOD?x-MOD:x;}
	template<typename T> void add(T &x,const int &y){x=(x+y>=MOD?x+y-MOD:x+y);}
	ll qpower(ll x,ll e,int mod=MOD){ll ans=1;while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
	ll invm(ll x){return qpower(x,MOD-2);}
	const int M=5e6+10;
	ll fac[M],facinv[M],Inv[M];ll C(int n,int m){return n<0 or n<m?0:fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;}
	void PRE()
	{
		fac[0]=1;fo(i,1,M-1) fac[i]=fac[i-1]*i%MOD;
		facinv[M-1]=invm(fac[M-1]);fd(i,M-1,1) facinv[i-1]=facinv[i]*i%MOD;
		Inv[1]=1;fo(i,2,M-1) Inv[i]=(MOD-MOD/i)*Inv[MOD%i]%MOD;
	}
	const int N=1e6+10;
	//------------------FIXED------------------
	int n;ll A,B,a[N];
	int gg[2][N];
	//int ok(int op,int l,int r){return gg[op][r-1]-gg[op][l-1]==0;}
	bool ok(int op,int l,int r){return gg[op][l]>r;}
	int f[N],g[N],ad[N];
	void main()
	{
		n=qread(),A=qread(),B=qread();fo(i,1,n) a[i]=qread();a[0]=-bin(62);a[n+1]=bin(62);
		//fo(i,1,n-1) gg[0][i]=gg[0][i-1]+(a[i]>a[i+1]-A),gg[1][i]=gg[1][i-1]+(a[i]>a[i+1]-B);
		gg[0][n]=gg[1][n]=n+1;fd(i,n-1,0) gg[0][i]=(a[i]>a[i+1]-A?i+1:gg[0][i+1]),gg[1][i]=(a[i]>a[i+1]-B?i+1:gg[1][i+1]);
		g[0]=1;
		fo(i,0,n)
		{
			add(ad[i+1],ad[i]),add(f[i],ad[i]);
			if(a[i+1]>=a[i]+A) add(g[i+1],g[i]);
			
			int l=lower_bound(a+i+2,a+n+1,a[i]+A)-a,r=gg[1][i+1];if(l<=r) add(ad[l],g[i]),add(ad[r+1],MOD-g[i]);
			
			int nxt=lower_bound(a+i+1,a+n+1,a[i-1]+B)-a;
			//if(ok(0,i,nxt-1))
			if(gg[0][i]>nxt-1)
			{
				if(a[nxt]>=a[nxt-1]+A) add(g[nxt],f[i]);
				l=lower_bound(a+nxt+1,a+n+1,a[nxt-1]+A)-a,r=gg[1][nxt];if(l<=r) add(ad[l],f[i]),add(ad[r+1],MOD-f[i]);
				//fo(j,nxt+1,n+1) if(ok(1,nxt,j-1) and a[j]>=a[nxt-1]+A) add(f[j],f[i]);
			}
		}add(f[n+1],ad[n+1]);write(mm(f[n+1]+g[n+1]));
	}
};//变量重名！
signed main()
{
	#ifdef DEBUG
	//freopen("a.in","r",stdin);
	freopen("z.txt","r",stdin);
	//freopen("a.out","w",stdout);
	#endif
	srand(time(0));
	mine::PRE();//线性预处理模意义
	mine::main();
	debug("\n---------------------Zory---------------------\nTime: %.2lf s",1.0*clock()/CLOCKS_PER_SEC);
}

Measured memory_bytes: 132864