#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls now<<1
#define rs now<<1|1
const int mod=10007;
int n,m,ope,l,r,x;
const int maxn=1e5+7;
int num[maxn];
struct Node{
int l,r;
int len;
int sum[4],lazy[4];
}node[maxn<<2];
void build(int l,int r,int now){
node[now].l=l,node[now].r=r;
for(int i=0;i<3;i++)node[now].sum[i]=0,node[now].lazy[i]=0;
node[now].lazy[1]=1;
node[now].len=r-l+1;
if(l!=r){
int mid=l+r>>1;
build(l,mid,ls);
build(mid+1,r,rs);
}
}
void pup(int now){
for(int i=0;i<3;i++)node[now].sum[i]=(node[ls].sum[i]+node[rs].sum[i])%mod;
}
void pud(int now){
if(node[now].lazy[0]){
node[ls].lazy[0]=node[now].lazy[0];
node[rs].lazy[0]=node[now].lazy[0];
node[ls].lazy[1]=1;
node[rs].lazy[1]=1;
node[ls].lazy[2]=0;
node[rs].lazy[2]=0;
for(int i=0;i<3;i++){
node[ls].sum[i]=(int)pow(node[now].lazy[0],i+1)*node[ls].len%mod;
node[rs].sum[i]=(int)pow(node[now].lazy[0],i+1)*node[rs].len%mod;
}
node[now].lazy[0]=0;
}
if(node[now].lazy[1]!=1){
node[ls].lazy[1]=node[ls].lazy[1]*node[now].lazy[1]%mod;
node[rs].lazy[1]=node[rs].lazy[1]*node[now].lazy[1]%mod;
node[ls].lazy[2]=node[ls].lazy[2]*node[now].lazy[1]%mod;
node[rs].lazy[2]=node[rs].lazy[2]*node[now].lazy[1]%mod;
for(int i=0;i<3;i++){
node[ls].sum[i]=(int)pow(node[now].lazy[1],i+1)*node[ls].len%mod;
node[rs].sum[i]=(int)pow(node[now].lazy[1],i+1)*node[rs].len%mod;
}
node[now].lazy[1]=1;
}
if(node[now].lazy[2]){
node[ls].lazy[2]=(node[ls].lazy[2]+node[now].lazy[2])%mod;
node[ls].sum[2]=(node[ls].sum[2]+3*node[now].lazy[2]*node[ls].sum[1]+3*node[now].lazy[2]*node[now].lazy[2]*node[ls].sum[0]+node[ls].len*node[now].lazy[2]*node[now].lazy[2]*node[now].lazy[2])%mod;
node[ls].sum[1]=(node[ls].sum[1]+2*node[now].lazy[2]*node[ls].sum[0]+node[ls].len*node[now].lazy[2]*node[now].lazy[2]*node[now].lazy[2])%mod;
node[ls].sum[0]=(node[ls].sum[0]+node[ls].len*node[now].lazy[2])%mod;
node[rs].lazy[2]=(node[rs].lazy[2]+node[now].lazy[2])%mod;
node[rs].sum[2]=(node[rs].sum[2]+3*node[now].lazy[2]*node[rs].sum[1]+3*node[now].lazy[2]*node[now].lazy[2]*node[rs].sum[0]+node[rs].len*node[now].lazy[2]*node[now].lazy[2]*node[now].lazy[2])%mod;
node[rs].sum[1]=(node[rs].sum[1]+2*node[now].lazy[2]*node[rs].sum[0]+node[rs].len*node[now].lazy[2]*node[now].lazy[2]*node[now].lazy[2])%mod;
node[rs].sum[0]=(node[rs].sum[0]+node[rs].len*node[now].lazy[2])%mod;
node[now].lazy[2]=0;
}
}
int query(int now,int l,int r,int ope){
if(node[now].l>=l&&node[now].r<=r){
for(int i=0;i<3;i++) if(ope==i+1) return node[now].sum[i];
pud(now);
int mid=node[now].l+node[now].r>>1;
int r=0;
if(l<=mid)r=query(ls,l,r,ope);
if(r>mid)r=(r+query(rs,l,r,ope))%mod;
return r;
}
}
void change(int now,int l,int r,int ope,int x){
if(node[now].l>=l&&node[now].r<=r){
if(ope==1) {
node[now].lazy[2]=(node[now].lazy[2]+x)%mod;
node[now].sum[2]=(node[now].sum[2]+3*x*node[now].sum[1]+3*x*x*node[now].sum[0]+node[now].len*x*x*x)%mod;
node[now].sum[1]=(node[now].sum[1]+2*x*node[now].sum[0]+node[now].len*x*x*x)%mod;
node[now].sum[0]=(node[now].sum[0]+node[now].len*x)%mod;
}
else if(ope==2){
node[now].lazy[1]=node[now].lazy[1]*x%mod;
node[now].lazy[2]=node[now].lazy[2]*x%mod;
for(int i=0;i<3;i++){
node[now].sum[i]=(int)pow(x,i+1)*node[now].len%mod;
}
}
else {
node[now].lazy[0]=x;
node[now].lazy[1]=1;
node[now].lazy[2]=0;
for(int i=0;i<3;i++){
node[now].sum[i]=(int)pow(x,i+1)*node[now].len%mod;
}
return ;
}
pud(now);
int mid=node[now].l+node[now].r>>1;
if(l<=mid) change(ls,l,r,ope,x);
if(r>mid) change(rs,l,r,ope,x);
pup(now);
}
}
signed main(){
std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
while(cin>>n>>m,n,m){
build(1,n,1);
while(m--){
cin>>ope>>l>>r>>x;
if(ope<4) change(1,l,r,ope,x);
else cout<<query(1,l,r,ope)<<"\n";
}
}
}