#include <bits/stdc++.h>/*
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <map>
#include <queue>
#include <vector>
#include <set>
*/usingnamespacestd;
typedeflonglong LL;
typedefdouble DB;
typedefunsignedint UI;
typedef pair<int, int> PII;
constint inf = 0x7f7f7f7f;
#define rdi() read<int>()#define rdl() read<LL>()#define rds(a) scanf("%s", a)#define mk(i, j) make_pair(i, j)#define pb push_back#define fi first#define se second#define For(i, j, k) for (int i = j; i <= k; i ++)#define Rep(i, j, k) for (int i = j; i >= k; i --)#define Edge(i, u) for (int i = head[u]; i; i = e[i].nxt)template<typename t> t read() {
t x = 0; int f = 1; char c = getchar();
while (c > '9' || c < '0') f = c == '-' ? -1 : 1 , c = getchar();
while (c >= '0' && c <= '9') x = x * 10 + c - 48 , c = getchar();
return x * f;
}
template<typename t> void write(t x) {
if (x < 0){
putchar('-'), write(-x);
return;
}
if (x >= 10) write(x / 10);
putchar(x % 10 + 48);
}
constint P = 1e9 + 7;
int n, m, ans;
int main() {
// freopen(".in", "r", stdin);// freopen(".out", "w", stdout);
n = rdi(), m = rdi();
if (n < m) swap(n, m);
if (n - m > 1) returnputs("0"), 0;
ans = 1;
for (int i = 1; i <= n; i ++) ans = (1ll * ans * i) % P;
for (int i = 1; i <= m; i ++) ans = (1ll * ans * i) % P;
if (n == m) ans = (2ll * ans) % P;
printf("%d\n", ans);
return0;
}