algs = ["",
"R' U R' U' R' U' R' U R U R2",
"R U' R U R U R U' R' U' R2",
"R2 U2 R U2 R2 U2 R2 U2 R U2 R2",
"R2 U R2 U' R2 F2 R2 U' F2 U R2 F2",
"R U' R F2 R' U R' U' R2 F2 R2",
"R2 F2 R2 U R U' R F2 R' U R'",
"R U R' U R' U' R F' R U R' U' R' F R2 U' R2 U R",
"F' U2 R' U F U' F' U' R U' F",
"R U R' F' R U R' U' R' F R2 U' R'",
"R' U2 R U2 R' F R U R' U' R' F' R2",
"F' R' U' R F' R' U F' U' F' U F R F2",
"F2 R2 U' R' U' R F2 R' U R F2 U R2 F2",
"F2 R2 U' F2 R' U' R F2 R' U R U R2 F2",
"R' U' R2 U' R2 U' R U2 R2 F U R' U' R F' R",
"R' F R' U R U' F' R2 U2 R' U R2 U R2 U R",
"F' R U R' U' R' F R2 F U' R' U' R U F' R'",
"R' U R' F R F' R U' R' F' U F R U R' U' R",
"R U R' U' R' F R2 U' R' U' R U R' F'",
"F R U' R' U' R U R' F' R U R' U' R' F R F'",
"F' U2 F' U' R' F' R2 U' R' U R' F R U' F",
"R U' R U F R F2 U F U' F R' F' R'"]
algDict = {0: '0 ', 1: 'U ', 2: 'U ', 3: 'H ', 4: 'Z ', 5: 'A ',
6: 'A ', 7: 'E ', 8: 'J ', 9: 'J ', 10: 'R ', 11: 'R ',
12: 'G ', 13: 'G ', 14: 'G ', 15: 'G ', 16: 'N ', 17: 'N ',
18: 'T ', 19: 'Y ', 20: 'F ', 21: 'V '}
##################################################
class MyCube:
"""A virtual 3x3x3 matrix"""
def __init__(self):
self.uSide = ['U', 'U', 'U', 'U', 'U', 'U', 'U', 'U'] #URF, UF, etc
self.fSide = ['F', 'F', 'F', 'F', 'F', 'F', 'F', 'F'] #FRD, FD, etc
self.lSide = ['L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'] #LFD, LD, etc
self.bSide = ['B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'] #BRD, BD, etc
self.rSide = ['R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'] #RBD, RD, etc
self.dSide = ['D', 'D', 'D', 'D', 'D', 'D', 'D', 'D'] #DBR, DR, etc
def doU(self):
self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5], self.uSide[6], self.uSide[7] = self.uSide[6], self.uSide[7], self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5]
self.fSide[5], self.lSide[5], self.bSide[1], self.rSide[5] = self.rSide[5], self.fSide[5], self.lSide[5], self.bSide[1]
self.fSide[6], self.lSide[6], self.bSide[2], self.rSide[6] = self.rSide[6], self.fSide[6], self.lSide[6], self.bSide[2]
self.fSide[7], self.lSide[7], self.bSide[3], self.rSide[7] = self.rSide[7], self.fSide[7], self.lSide[7], self.bSide[3]
def doUp(self):
self.uSide[6], self.uSide[7], self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5] = self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5], self.uSide[6], self.uSide[7]
self.rSide[5], self.fSide[5], self.lSide[5], self.bSide[1] = self.fSide[5], self.lSide[5], self.bSide[1], self.rSide[5]
self.rSide[6], self.fSide[6], self.lSide[6], self.bSide[2] = self.fSide[6], self.lSide[6], self.bSide[2], self.rSide[6]
self.rSide[7], self.fSide[7], self.lSide[7], self.bSide[3] = self.fSide[7], self.lSide[7], self.bSide[3], self.rSide[7]
def doR(self):
self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5], self.rSide[6], self.rSide[7] = self.rSide[6], self.rSide[7], self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5]
self.fSide[7], self.uSide[7], self.bSide[7], self.dSide[7] = self.dSide[7], self.fSide[7], self.uSide[7], self.bSide[7]
self.fSide[0], self.uSide[0], self.bSide[0], self.dSide[0] = self.dSide[0], self.fSide[0], self.uSide[0], self.bSide[0]
self.fSide[1], self.uSide[1], self.bSide[1], self.dSide[1] = self.dSide[1], self.fSide[1], self.uSide[1], self.bSide[1]
def doRp(self):
self.rSide[6], self.rSide[7], self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5] = self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5], self.rSide[6], self.rSide[7]
self.dSide[7], self.fSide[7], self.uSide[7], self.bSide[7] = self.fSide[7], self.uSide[7], self.bSide[7], self.dSide[7]
self.dSide[0], self.fSide[0], self.uSide[0], self.bSide[0] = self.fSide[0], self.uSide[0], self.bSide[0], self.dSide[0]
self.dSide[1], self.fSide[1], self.uSide[1], self.bSide[1] = self.fSide[1], self.uSide[1], self.bSide[1], self.dSide[1]
def doF(self):
self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5], self.fSide[6], self.fSide[7] = self.fSide[6], self.fSide[7], self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5]
self.uSide[1], self.rSide[3], self.dSide[5], self.lSide[7] = self.lSide[7], self.uSide[1], self.rSide[3], self.dSide[5]
self.uSide[2], self.rSide[4], self.dSide[6], self.lSide[0] = self.lSide[0], self.uSide[2], self.rSide[4], self.dSide[6]
self.uSide[3], self.rSide[5], self.dSide[7], self.lSide[1] = self.lSide[1], self.uSide[3], self.rSide[5], self.dSide[7]
def doFp(self):
self.fSide[6], self.fSide[7], self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5] = self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5], self.fSide[6], self.fSide[7]
self.lSide[7], self.uSide[1], self.rSide[3], self.dSide[5] = self.uSide[1], self.rSide[3], self.dSide[5], self.lSide[7]
self.lSide[0], self.uSide[2], self.rSide[4], self.dSide[6] = self.uSide[2], self.rSide[4], self.dSide[6], self.lSide[0]
self.lSide[1], self.uSide[3], self.rSide[5], self.dSide[7] = self.uSide[3], self.rSide[5], self.dSide[7], self.lSide[1]
def doAlg(self, algString):
ialg = algString.replace('(', '') #get rid of unwanted
ialg = ialg.replace(')', '') # or otherwise unneeded characters
ialg = ialg.replace("2'", '2') # incl. whitespace, paren., 2's
ialg = ialg.replace(' ', ' ')
parts = ialg.split(' ') #Divide the alg up into individual moves
for part in parts:
if part == 'U': self.doU()
elif part == 'U2': self.doU(); self.doU()
elif part == "U'": self.doUp()
elif part == 'F': self.doF()
elif part == 'F2': self.doF(); self.doF()
elif part == "F'": self.doFp()
elif part == 'R': self.doR()
elif part == 'R2': self.doR(); self.doR()
elif part == "R'": self.doRp()
def printCube(self):
print
print " ", self.bSide[5] + self.bSide[6] + self.bSide[7]
print " ", self.bSide[4] + "b" + self.bSide[0]
print " ", self.bSide[3] + self.bSide[2] + self.bSide[1] + '\n'
print " ", self.uSide[5] + self.uSide[6] + self.uSide[7]
print " ", self.uSide[4] + "u" + self.uSide[0]
print " ", self.uSide[3] + self.uSide[2] + self.uSide[1] + '\n'
print "" + self.lSide[5] + self.lSide[6] + self.lSide[7], self.fSide[5] + self.fSide[6] + self.fSide[7], self.rSide[5] + self.rSide[6] + self.rSide[7]
print "" + self.lSide[4] + 'l' + self.lSide[0], self.fSide[4] + 'f' + self.fSide[0], self.rSide[4] + 'r' + self.rSide[0]
print "" + self.lSide[3] + self.lSide[2] + self.lSide[1], self.fSide[3] + self.fSide[2] + self.fSide[1], self.rSide[3] + self.rSide[2] + self.rSide[1] + '\n'
print " ", self.dSide[5] + self.dSide[6] + self.dSide[7]
print " ", self.dSide[4] + "d" + self.dSide[0]
print " ", self.dSide[3] + self.dSide[2] + self.dSide[1] + '\n'
def printMin(self):
print
print " ", self.bSide[3] + self.bSide[2] + self.bSide[1] + '\n'
print " ", self.uSide[5] + self.uSide[6] + self.uSide[7]
print " ", self.uSide[4] + "u" + self.uSide[0]
print " ", self.uSide[3] + self.uSide[2] + self.uSide[1] + '\n'
print "" + self.lSide[5] + self.lSide[6] + self.lSide[7], self.fSide[5] + self.fSide[6] + self.fSide[7], self.rSide[5] + self.rSide[6] + self.rSide[7]
def checkSolved(self):
if self.uSide[0] == self.uSide[1] == self.uSide[2] == self.uSide[3] == self.uSide[4] == self.uSide[5] == self.uSide[6] == self.uSide[7]:
if self.fSide[5] == self.fSide[6] == self.fSide[7]:
if self.lSide[5] == self.lSide[6] == self.lSide[7]:
if self.rSide[5] == self.rSide[6] == self.rSide[7]:
if self.bSide[3] == self.bSide[2] == self.bSide[1]:
return True
return False
##################################################
def tryOne(aTemp, this): #string of alg trying, string of alg trying to solve
wtf = MyCube(); wtf.doAlg(this); wtf.doUp()
for try1 in range(4):
wtf.doU(); wtf2 = wtf
wtf2.doAlg(aTemp)
if wtf2.checkSolved(): return True
return False
def tryTwo(aTemp, bTemp, this):
now = MyCube(); now.doAlg(this); now.doUp()
for try1 in range(4):
now.doU(); mow = now
mow.doAlg(aTemp)
for try2 in range(4):
mow.doU(); oow = mow
oow.doAlg(bTemp)
if oow.checkSolved(): return True
return False
def tryCombo(a, b, c, listNow):
for alg in range(0, len(algs)):
if listNow[alg] == False:
aCube = MyCube(); aCube.doAlg(algs[alg])
if aCube.checkSolved(): #basically, check if it's already good (case algs[0])
listNow[alg] = True; continue
elif tryOne(a, algs[alg]): listNow[alg] = True; continue
elif tryOne(b, algs[alg]): listNow[alg] = True; continue
elif tryOne(c, algs[alg]): listNow[alg] = True; continue
elif tryTwo(a, a, algs[alg]): listNow[alg] = True; continue
elif tryTwo(b, b, algs[alg]): listNow[alg] = True; continue
elif tryTwo(c, c, algs[alg]): listNow[alg] = True; continue
elif tryTwo(a, b, algs[alg]): listNow[alg] = True; continue
elif tryTwo(a, c, algs[alg]): listNow[alg] = True; continue
elif tryTwo(b, a, algs[alg]): listNow[alg] = True; continue
elif tryTwo(b, c, algs[alg]): listNow[alg] = True; continue
elif tryTwo(c, a, algs[alg]): listNow[alg] = True; continue
elif tryTwo(c, b, algs[alg]): listNow[alg] = True; continue
else: return listNow
return listNow
##################################################
## Memo 3 algs? ##
highest = 0
for l1 in range(1,7):
#print "L1: ", l1
for l2 in range(l1+1,len(algs)):
for l3 in range(l2+1,len(algs)):
algsDone = [False]*len(algs)
algsDone = tryCombo(algs[l1], algs[l2], algs[l3], algsDone)
if sum(algsDone) == len(algs):
print "\t\tAlgs used: ", l1, l2, l3
#print "\t\tCases solved: " + str(sum(algsDone)) + " out of " + str(len(algs))
#print "\t\t", algsDone; print
highest = sum(algsDone)
print '\n\n'
YWxncyA9IFsiIiwKIlInIFUgUicgVScgUicgVScgUicgVSBSIFUgUjIiLAoiUiBVJyBSIFUgUiBVIFIgVScgUicgVScgUjIiLAoiUjIgVTIgUiBVMiBSMiBVMiBSMiBVMiBSIFUyIFIyIiwKIlIyIFUgUjIgVScgUjIgRjIgUjIgVScgRjIgVSBSMiBGMiIsCiJSIFUnIFIgRjIgUicgVSBSJyBVJyBSMiBGMiBSMiIsCiJSMiBGMiBSMiBVIFIgVScgUiBGMiBSJyBVIFInIiwKIlIgVSBSJyBVIFInIFUnIFIgRicgUiBVIFInIFUnIFInIEYgUjIgVScgUjIgVSBSIiwKIkYnIFUyIFInIFUgRiBVJyBGJyBVJyBSIFUnIEYiLAoiUiBVIFInIEYnIFIgVSBSJyBVJyBSJyBGIFIyIFUnIFInIiwKIlInIFUyIFIgVTIgUicgRiBSIFUgUicgVScgUicgRicgUjIiLAoiRicgUicgVScgUiBGJyBSJyBVIEYnIFUnIEYnIFUgRiBSIEYyIiwKIkYyIFIyIFUnIFInIFUnIFIgRjIgUicgVSBSIEYyIFUgUjIgRjIiLAoiRjIgUjIgVScgRjIgUicgVScgUiBGMiBSJyBVIFIgVSBSMiBGMiIsCiJSJyBVJyBSMiBVJyBSMiBVJyBSIFUyIFIyIEYgVSBSJyBVJyBSIEYnIFIiLAoiUicgRiBSJyBVIFIgVScgRicgUjIgVTIgUicgVSBSMiBVIFIyIFUgUiIsCiJGJyBSIFUgUicgVScgUicgRiBSMiBGIFUnIFInIFUnIFIgVSBGJyBSJyIsCiJSJyBVIFInIEYgUiBGJyBSIFUnIFInIEYnIFUgRiBSIFUgUicgVScgUiIsCiJSIFUgUicgVScgUicgRiBSMiBVJyBSJyBVJyBSIFUgUicgRiciLAoiRiBSIFUnIFInIFUnIFIgVSBSJyBGJyBSIFUgUicgVScgUicgRiBSIEYnIiwKIkYnIFUyIEYnIFUnIFInIEYnIFIyIFUnIFInIFUgUicgRiBSIFUnIEYiLAoiUiBVJyBSIFUgRiBSIEYyIFUgRiBVJyBGIFInIEYnIFInIl0KCgphbGdEaWN0ID0gezA6ICAnMCAnLCAxOiAgJ1UgJywgMjogICdVICcsIDM6ICAnSCAnLCA0OiAgJ1ogJywgNTogICdBICcsCiAgICAgICAgICAgNjogICdBICcsIDc6ICAnRSAnLCA4OiAgJ0ogJywgOTogICdKICcsIDEwOiAnUiAnLCAxMTogJ1IgJywKICAgICAgICAgICAxMjogJ0cgJywgMTM6ICdHICcsIDE0OiAnRyAnLCAxNTogJ0cgJywgMTY6ICdOICcsIDE3OiAnTiAnLAogICAgICAgICAgIDE4OiAnVCAnLCAxOTogJ1kgJywgMjA6ICdGICcsIDIxOiAnViAnfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpjbGFzcyBNeUN1YmU6CiAgIiIiQSB2aXJ0dWFsIDN4M3gzIG1hdHJpeCIiIgogIGRlZiBfX2luaXRfXyhzZWxmKToKICAgIHNlbGYudVNpZGUgPSBbJ1UnLCAnVScsICdVJywgJ1UnLCAnVScsICdVJywgJ1UnLCAnVSddICNVUkYsIFVGLCBldGMKICAgIHNlbGYuZlNpZGUgPSBbJ0YnLCAnRicsICdGJywgJ0YnLCAnRicsICdGJywgJ0YnLCAnRiddICNGUkQsIEZELCBldGMKICAgIHNlbGYubFNpZGUgPSBbJ0wnLCAnTCcsICdMJywgJ0wnLCAnTCcsICdMJywgJ0wnLCAnTCddICNMRkQsIExELCBldGMKICAgIHNlbGYuYlNpZGUgPSBbJ0InLCAnQicsICdCJywgJ0InLCAnQicsICdCJywgJ0InLCAnQiddICNCUkQsIEJELCBldGMKICAgIHNlbGYuclNpZGUgPSBbJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUiddICNSQkQsIFJELCBldGMKICAgIHNlbGYuZFNpZGUgPSBbJ0QnLCAnRCcsICdEJywgJ0QnLCAnRCcsICdEJywgJ0QnLCAnRCddICNEQlIsIERSLCBldGMKCgogIGRlZiBkb1Uoc2VsZik6CgogICAgc2VsZi51U2lkZVswXSwgc2VsZi51U2lkZVsxXSwgc2VsZi51U2lkZVsyXSwgc2VsZi51U2lkZVszXSwgc2VsZi51U2lkZVs0XSwgc2VsZi51U2lkZVs1XSwgc2VsZi51U2lkZVs2XSwgc2VsZi51U2lkZVs3XSA9IHNlbGYudVNpZGVbNl0sIHNlbGYudVNpZGVbN10sIHNlbGYudVNpZGVbMF0sIHNlbGYudVNpZGVbMV0sIHNlbGYudVNpZGVbMl0sIHNlbGYudVNpZGVbM10sIHNlbGYudVNpZGVbNF0sIHNlbGYudVNpZGVbNV0KCiAgICBzZWxmLmZTaWRlWzVdLCBzZWxmLmxTaWRlWzVdLCBzZWxmLmJTaWRlWzFdLCBzZWxmLnJTaWRlWzVdID0gc2VsZi5yU2lkZVs1XSwgc2VsZi5mU2lkZVs1XSwgc2VsZi5sU2lkZVs1XSwgc2VsZi5iU2lkZVsxXQogICAgc2VsZi5mU2lkZVs2XSwgc2VsZi5sU2lkZVs2XSwgc2VsZi5iU2lkZVsyXSwgc2VsZi5yU2lkZVs2XSA9IHNlbGYuclNpZGVbNl0sIHNlbGYuZlNpZGVbNl0sIHNlbGYubFNpZGVbNl0sIHNlbGYuYlNpZGVbMl0KICAgIHNlbGYuZlNpZGVbN10sIHNlbGYubFNpZGVbN10sIHNlbGYuYlNpZGVbM10sIHNlbGYuclNpZGVbN10gPSBzZWxmLnJTaWRlWzddLCBzZWxmLmZTaWRlWzddLCBzZWxmLmxTaWRlWzddLCBzZWxmLmJTaWRlWzNdCgogIGRlZiBkb1VwKHNlbGYpOgogICAgc2VsZi51U2lkZVs2XSwgc2VsZi51U2lkZVs3XSwgc2VsZi51U2lkZVswXSwgc2VsZi51U2lkZVsxXSwgc2VsZi51U2lkZVsyXSwgc2VsZi51U2lkZVszXSwgc2VsZi51U2lkZVs0XSwgc2VsZi51U2lkZVs1XSA9IHNlbGYudVNpZGVbMF0sIHNlbGYudVNpZGVbMV0sIHNlbGYudVNpZGVbMl0sIHNlbGYudVNpZGVbM10sIHNlbGYudVNpZGVbNF0sIHNlbGYudVNpZGVbNV0sIHNlbGYudVNpZGVbNl0sIHNlbGYudVNpZGVbN10KCiAgICBzZWxmLnJTaWRlWzVdLCBzZWxmLmZTaWRlWzVdLCBzZWxmLmxTaWRlWzVdLCBzZWxmLmJTaWRlWzFdID0gc2VsZi5mU2lkZVs1XSwgc2VsZi5sU2lkZVs1XSwgc2VsZi5iU2lkZVsxXSwgc2VsZi5yU2lkZVs1XQogICAgc2VsZi5yU2lkZVs2XSwgc2VsZi5mU2lkZVs2XSwgc2VsZi5sU2lkZVs2XSwgc2VsZi5iU2lkZVsyXSA9IHNlbGYuZlNpZGVbNl0sIHNlbGYubFNpZGVbNl0sIHNlbGYuYlNpZGVbMl0sIHNlbGYuclNpZGVbNl0KICAgIHNlbGYuclNpZGVbN10sIHNlbGYuZlNpZGVbN10sIHNlbGYubFNpZGVbN10sIHNlbGYuYlNpZGVbM10gPSBzZWxmLmZTaWRlWzddLCBzZWxmLmxTaWRlWzddLCBzZWxmLmJTaWRlWzNdLCBzZWxmLnJTaWRlWzddCgogIGRlZiBkb1Ioc2VsZik6CgogICAgc2VsZi5yU2lkZVswXSwgc2VsZi5yU2lkZVsxXSwgc2VsZi5yU2lkZVsyXSwgc2VsZi5yU2lkZVszXSwgc2VsZi5yU2lkZVs0XSwgc2VsZi5yU2lkZVs1XSwgc2VsZi5yU2lkZVs2XSwgc2VsZi5yU2lkZVs3XSA9IHNlbGYuclNpZGVbNl0sIHNlbGYuclNpZGVbN10sIHNlbGYuclNpZGVbMF0sIHNlbGYuclNpZGVbMV0sIHNlbGYuclNpZGVbMl0sIHNlbGYuclNpZGVbM10sIHNlbGYuclNpZGVbNF0sIHNlbGYuclNpZGVbNV0KICAgICAgCiAgICBzZWxmLmZTaWRlWzddLCBzZWxmLnVTaWRlWzddLCBzZWxmLmJTaWRlWzddLCBzZWxmLmRTaWRlWzddID0gc2VsZi5kU2lkZVs3XSwgc2VsZi5mU2lkZVs3XSwgc2VsZi51U2lkZVs3XSwgc2VsZi5iU2lkZVs3XQogICAgc2VsZi5mU2lkZVswXSwgc2VsZi51U2lkZVswXSwgc2VsZi5iU2lkZVswXSwgc2VsZi5kU2lkZVswXSA9IHNlbGYuZFNpZGVbMF0sIHNlbGYuZlNpZGVbMF0sIHNlbGYudVNpZGVbMF0sIHNlbGYuYlNpZGVbMF0KICAgIHNlbGYuZlNpZGVbMV0sIHNlbGYudVNpZGVbMV0sIHNlbGYuYlNpZGVbMV0sIHNlbGYuZFNpZGVbMV0gPSBzZWxmLmRTaWRlWzFdLCBzZWxmLmZTaWRlWzFdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLmJTaWRlWzFdCgogIGRlZiBkb1JwKHNlbGYpOgogICAgc2VsZi5yU2lkZVs2XSwgc2VsZi5yU2lkZVs3XSwgc2VsZi5yU2lkZVswXSwgc2VsZi5yU2lkZVsxXSwgc2VsZi5yU2lkZVsyXSwgc2VsZi5yU2lkZVszXSwgc2VsZi5yU2lkZVs0XSwgc2VsZi5yU2lkZVs1XSA9IHNlbGYuclNpZGVbMF0sIHNlbGYuclNpZGVbMV0sIHNlbGYuclNpZGVbMl0sIHNlbGYuclNpZGVbM10sIHNlbGYuclNpZGVbNF0sIHNlbGYuclNpZGVbNV0sIHNlbGYuclNpZGVbNl0sIHNlbGYuclNpZGVbN10KCiAgICBzZWxmLmRTaWRlWzddLCBzZWxmLmZTaWRlWzddLCBzZWxmLnVTaWRlWzddLCBzZWxmLmJTaWRlWzddID0gc2VsZi5mU2lkZVs3XSwgc2VsZi51U2lkZVs3XSwgc2VsZi5iU2lkZVs3XSwgc2VsZi5kU2lkZVs3XQogICAgc2VsZi5kU2lkZVswXSwgc2VsZi5mU2lkZVswXSwgc2VsZi51U2lkZVswXSwgc2VsZi5iU2lkZVswXSA9IHNlbGYuZlNpZGVbMF0sIHNlbGYudVNpZGVbMF0sIHNlbGYuYlNpZGVbMF0sIHNlbGYuZFNpZGVbMF0KICAgIHNlbGYuZFNpZGVbMV0sIHNlbGYuZlNpZGVbMV0sIHNlbGYudVNpZGVbMV0sIHNlbGYuYlNpZGVbMV0gPSBzZWxmLmZTaWRlWzFdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLmJTaWRlWzFdLCBzZWxmLmRTaWRlWzFdCgogIGRlZiBkb0Yoc2VsZik6CiAgICBzZWxmLmZTaWRlWzBdLCBzZWxmLmZTaWRlWzFdLCBzZWxmLmZTaWRlWzJdLCBzZWxmLmZTaWRlWzNdLCBzZWxmLmZTaWRlWzRdLCBzZWxmLmZTaWRlWzVdLCBzZWxmLmZTaWRlWzZdLCBzZWxmLmZTaWRlWzddID0gc2VsZi5mU2lkZVs2XSwgc2VsZi5mU2lkZVs3XSwgc2VsZi5mU2lkZVswXSwgc2VsZi5mU2lkZVsxXSwgc2VsZi5mU2lkZVsyXSwgc2VsZi5mU2lkZVszXSwgc2VsZi5mU2lkZVs0XSwgc2VsZi5mU2lkZVs1XQoKICAgIHNlbGYudVNpZGVbMV0sIHNlbGYuclNpZGVbM10sIHNlbGYuZFNpZGVbNV0sIHNlbGYubFNpZGVbN10gPSBzZWxmLmxTaWRlWzddLCBzZWxmLnVTaWRlWzFdLCBzZWxmLnJTaWRlWzNdLCBzZWxmLmRTaWRlWzVdCiAgICBzZWxmLnVTaWRlWzJdLCBzZWxmLnJTaWRlWzRdLCBzZWxmLmRTaWRlWzZdLCBzZWxmLmxTaWRlWzBdID0gc2VsZi5sU2lkZVswXSwgc2VsZi51U2lkZVsyXSwgc2VsZi5yU2lkZVs0XSwgc2VsZi5kU2lkZVs2XQogICAgc2VsZi51U2lkZVszXSwgc2VsZi5yU2lkZVs1XSwgc2VsZi5kU2lkZVs3XSwgc2VsZi5sU2lkZVsxXSA9IHNlbGYubFNpZGVbMV0sIHNlbGYudVNpZGVbM10sIHNlbGYuclNpZGVbNV0sIHNlbGYuZFNpZGVbN10KICAgIAogIGRlZiBkb0ZwKHNlbGYpOgogICAgc2VsZi5mU2lkZVs2XSwgc2VsZi5mU2lkZVs3XSwgc2VsZi5mU2lkZVswXSwgc2VsZi5mU2lkZVsxXSwgc2VsZi5mU2lkZVsyXSwgc2VsZi5mU2lkZVszXSwgc2VsZi5mU2lkZVs0XSwgc2VsZi5mU2lkZVs1XSA9IHNlbGYuZlNpZGVbMF0sIHNlbGYuZlNpZGVbMV0sIHNlbGYuZlNpZGVbMl0sIHNlbGYuZlNpZGVbM10sIHNlbGYuZlNpZGVbNF0sIHNlbGYuZlNpZGVbNV0sIHNlbGYuZlNpZGVbNl0sIHNlbGYuZlNpZGVbN10KIAogICAgc2VsZi5sU2lkZVs3XSwgc2VsZi51U2lkZVsxXSwgc2VsZi5yU2lkZVszXSwgc2VsZi5kU2lkZVs1XSA9IHNlbGYudVNpZGVbMV0sIHNlbGYuclNpZGVbM10sIHNlbGYuZFNpZGVbNV0sIHNlbGYubFNpZGVbN10KICAgIHNlbGYubFNpZGVbMF0sIHNlbGYudVNpZGVbMl0sIHNlbGYuclNpZGVbNF0sIHNlbGYuZFNpZGVbNl0gPSBzZWxmLnVTaWRlWzJdLCBzZWxmLnJTaWRlWzRdLCBzZWxmLmRTaWRlWzZdLCBzZWxmLmxTaWRlWzBdCiAgICBzZWxmLmxTaWRlWzFdLCBzZWxmLnVTaWRlWzNdLCBzZWxmLnJTaWRlWzVdLCBzZWxmLmRTaWRlWzddID0gc2VsZi51U2lkZVszXSwgc2VsZi5yU2lkZVs1XSwgc2VsZi5kU2lkZVs3XSwgc2VsZi5sU2lkZVsxXQoKCiAgICAKICBkZWYgZG9BbGcoc2VsZiwgYWxnU3RyaW5nKToKICAgIGlhbGcgPSBhbGdTdHJpbmcucmVwbGFjZSgnKCcsICcnKSAgICAgI2dldCByaWQgb2YgdW53YW50ZWQKICAgIGlhbGcgPSBpYWxnLnJlcGxhY2UoJyknLCAnJykgICAgICAgICAgIyBvciBvdGhlcndpc2UgdW5uZWVkZWQgY2hhcmFjdGVycwogICAgaWFsZyA9IGlhbGcucmVwbGFjZSgiMiciLCAnMicpICAgICAgICAjIGluY2wuIHdoaXRlc3BhY2UsIHBhcmVuLiwgMidzCiAgICBpYWxnID0gaWFsZy5yZXBsYWNlKCcgICcsICcgJykKICAgIHBhcnRzID0gaWFsZy5zcGxpdCgnICcpICAgICAgICAgICAgICAgI0RpdmlkZSB0aGUgYWxnIHVwIGludG8gaW5kaXZpZHVhbCBtb3ZlcwogICAgCiAgICBmb3IgcGFydCBpbiBwYXJ0czoKICAgICAgaWYgcGFydCA9PSAgICdVJzogIHNlbGYuZG9VKCkKICAgICAgZWxpZiBwYXJ0ID09ICdVMic6IHNlbGYuZG9VKCk7IHNlbGYuZG9VKCkKICAgICAgZWxpZiBwYXJ0ID09ICJVJyI6IHNlbGYuZG9VcCgpCiAgICAgICAgICAgIAogICAgICBlbGlmIHBhcnQgPT0gJ0YnOiAgc2VsZi5kb0YoKQogICAgICBlbGlmIHBhcnQgPT0gJ0YyJzogc2VsZi5kb0YoKTsgc2VsZi5kb0YoKQogICAgICBlbGlmIHBhcnQgPT0gIkYnIjogc2VsZi5kb0ZwKCkKICAgICAgCiAgICAgIGVsaWYgcGFydCA9PSAnUic6ICBzZWxmLmRvUigpCiAgICAgIGVsaWYgcGFydCA9PSAnUjInOiBzZWxmLmRvUigpOyBzZWxmLmRvUigpCiAgICAgIGVsaWYgcGFydCA9PSAiUiciOiBzZWxmLmRvUnAoKQogICAgICAgICAgICAKICBkZWYgcHJpbnRDdWJlKHNlbGYpOgogICAgcHJpbnQKICAgIHByaW50ICIgICAiLCBzZWxmLmJTaWRlWzVdICsgc2VsZi5iU2lkZVs2XSArIHNlbGYuYlNpZGVbN10KICAgIHByaW50ICIgICAiLCBzZWxmLmJTaWRlWzRdICsgImIiICsgCSAgc2VsZi5iU2lkZVswXQogICAgcHJpbnQgIiAgICIsIHNlbGYuYlNpZGVbM10gKyBzZWxmLmJTaWRlWzJdICsgc2VsZi5iU2lkZVsxXSArICdcbicKCiAgICBwcmludCAiICAgIiwgc2VsZi51U2lkZVs1XSArIHNlbGYudVNpZGVbNl0gKyBzZWxmLnVTaWRlWzddCiAgICBwcmludCAiICAgIiwgc2VsZi51U2lkZVs0XSArICJ1IiArIAkgIHNlbGYudVNpZGVbMF0KICAgIHByaW50ICIgICAiLCBzZWxmLnVTaWRlWzNdICsgc2VsZi51U2lkZVsyXSArIHNlbGYudVNpZGVbMV0gKyAnXG4nCgogICAgcHJpbnQgIiIgKyBzZWxmLmxTaWRlWzVdICsgc2VsZi5sU2lkZVs2XSArIHNlbGYubFNpZGVbN10sIHNlbGYuZlNpZGVbNV0gKyBzZWxmLmZTaWRlWzZdICsgc2VsZi5mU2lkZVs3XSwgc2VsZi5yU2lkZVs1XSArIHNlbGYuclNpZGVbNl0gKyBzZWxmLnJTaWRlWzddCiAgICBwcmludCAiIiArIHNlbGYubFNpZGVbNF0gKyAnbCcgKyAgICAgICAgICAgc2VsZi5sU2lkZVswXSwgc2VsZi5mU2lkZVs0XSArICdmJyArICAgICAgICAgICBzZWxmLmZTaWRlWzBdLCBzZWxmLnJTaWRlWzRdICsgJ3InICsgICAgICAgICAgIHNlbGYuclNpZGVbMF0KICAgIHByaW50ICIiICsgc2VsZi5sU2lkZVszXSArIHNlbGYubFNpZGVbMl0gKyBzZWxmLmxTaWRlWzFdLCBzZWxmLmZTaWRlWzNdICsgc2VsZi5mU2lkZVsyXSArIHNlbGYuZlNpZGVbMV0sIHNlbGYuclNpZGVbM10gKyBzZWxmLnJTaWRlWzJdICsgc2VsZi5yU2lkZVsxXSArICdcbicKCiAgICBwcmludCAiICAgIiwgc2VsZi5kU2lkZVs1XSArIHNlbGYuZFNpZGVbNl0gKyBzZWxmLmRTaWRlWzddCiAgICBwcmludCAiICAgIiwgc2VsZi5kU2lkZVs0XSArICJkIiArIAkgIHNlbGYuZFNpZGVbMF0KICAgIHByaW50ICIgICAiLCBzZWxmLmRTaWRlWzNdICsgc2VsZi5kU2lkZVsyXSArIHNlbGYuZFNpZGVbMV0gKyAnXG4nCgogIGRlZiBwcmludE1pbihzZWxmKToKICAgIHByaW50CgogICAgcHJpbnQgIiAgICIsIHNlbGYuYlNpZGVbM10gKyBzZWxmLmJTaWRlWzJdICsgc2VsZi5iU2lkZVsxXSArICdcbicKCiAgICBwcmludCAiICAgIiwgc2VsZi51U2lkZVs1XSArIHNlbGYudVNpZGVbNl0gKyBzZWxmLnVTaWRlWzddCiAgICBwcmludCAiICAgIiwgc2VsZi51U2lkZVs0XSArICJ1IiArIAkgIHNlbGYudVNpZGVbMF0KICAgIHByaW50ICIgICAiLCBzZWxmLnVTaWRlWzNdICsgc2VsZi51U2lkZVsyXSArIHNlbGYudVNpZGVbMV0gKyAnXG4nCgogICAgcHJpbnQgIiIgKyBzZWxmLmxTaWRlWzVdICsgc2VsZi5sU2lkZVs2XSArIHNlbGYubFNpZGVbN10sIHNlbGYuZlNpZGVbNV0gKyBzZWxmLmZTaWRlWzZdICsgc2VsZi5mU2lkZVs3XSwgc2VsZi5yU2lkZVs1XSArIHNlbGYuclNpZGVbNl0gKyBzZWxmLnJTaWRlWzddCgogIGRlZiBjaGVja1NvbHZlZChzZWxmKToKICAgIGlmIHNlbGYudVNpZGVbMF0gPT0gc2VsZi51U2lkZVsxXSA9PSBzZWxmLnVTaWRlWzJdID09IHNlbGYudVNpZGVbM10gPT0gc2VsZi51U2lkZVs0XSA9PSBzZWxmLnVTaWRlWzVdID09IHNlbGYudVNpZGVbNl0gPT0gc2VsZi51U2lkZVs3XToKICAgICAgaWYgc2VsZi5mU2lkZVs1XSA9PSBzZWxmLmZTaWRlWzZdID09IHNlbGYuZlNpZGVbN106CiAgICAgICAgaWYgc2VsZi5sU2lkZVs1XSA9PSBzZWxmLmxTaWRlWzZdID09IHNlbGYubFNpZGVbN106CiAgICAgICAgICBpZiBzZWxmLnJTaWRlWzVdID09IHNlbGYuclNpZGVbNl0gPT0gc2VsZi5yU2lkZVs3XToKICAgICAgICAgICAgaWYgc2VsZi5iU2lkZVszXSA9PSBzZWxmLmJTaWRlWzJdID09IHNlbGYuYlNpZGVbMV06CiAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZGVmIHRyeU9uZShhVGVtcCwgdGhpcyk6CSNzdHJpbmcgb2YgYWxnIHRyeWluZywgc3RyaW5nIG9mIGFsZyB0cnlpbmcgdG8gc29sdmUKICAgIHd0ZiA9IE15Q3ViZSgpOyB3dGYuZG9BbGcodGhpcyk7IHd0Zi5kb1VwKCkKICAgIGZvciB0cnkxIGluIHJhbmdlKDQpOgogICAgICAgIHd0Zi5kb1UoKTsgd3RmMiA9IHd0ZgogICAgICAgIHd0ZjIuZG9BbGcoYVRlbXApCgogICAgICAgIGlmIHd0ZjIuY2hlY2tTb2x2ZWQoKTogcmV0dXJuIFRydWUKCiAgICByZXR1cm4gRmFsc2UKCmRlZiB0cnlUd28oYVRlbXAsIGJUZW1wLCB0aGlzKToKICAgIG5vdyA9IE15Q3ViZSgpOyBub3cuZG9BbGcodGhpcyk7IG5vdy5kb1VwKCkKICAgIGZvciB0cnkxIGluIHJhbmdlKDQpOgogICAgICBub3cuZG9VKCk7IG1vdyA9IG5vdwogICAgICBtb3cuZG9BbGcoYVRlbXApCiAgICAgIGZvciB0cnkyIGluIHJhbmdlKDQpOgogICAgICAgICAgbW93LmRvVSgpOyBvb3cgPSBtb3cKICAgICAgICAgIG9vdy5kb0FsZyhiVGVtcCkKICAgICAgICAgIGlmIG9vdy5jaGVja1NvbHZlZCgpOiByZXR1cm4gVHJ1ZQoKICAgIHJldHVybiBGYWxzZQoKZGVmIHRyeUNvbWJvKGEsIGIsIGMsIGxpc3ROb3cpOgogICAgZm9yIGFsZyBpbiByYW5nZSgwLCBsZW4oYWxncykpOgogICAgICAgIGlmIGxpc3ROb3dbYWxnXSA9PSBGYWxzZToKCiAgICAgICAgICAgIGFDdWJlID0gTXlDdWJlKCk7IGFDdWJlLmRvQWxnKGFsZ3NbYWxnXSkKCiAgICAgICAgICAgIGlmIGFDdWJlLmNoZWNrU29sdmVkKCk6IAkJI2Jhc2ljYWxseSwgY2hlY2sgaWYgaXQncyBhbHJlYWR5IGdvb2QgKGNhc2UgYWxnc1swXSkKICAgICAgICAgICAgICAgIGxpc3ROb3dbYWxnXSA9IFRydWU7IGNvbnRpbnVlCgogICAgICAgICAgICBlbGlmIHRyeU9uZShhLCBhbGdzW2FsZ10pOiAgICBsaXN0Tm93W2FsZ10gPSBUcnVlOyAgY29udGludWUKICAgICAgICAgICAgZWxpZiB0cnlPbmUoYiwgYWxnc1thbGddKTogICAgbGlzdE5vd1thbGddID0gVHJ1ZTsgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsaWYgdHJ5T25lKGMsIGFsZ3NbYWxnXSk6ICAgIGxpc3ROb3dbYWxnXSA9IFRydWU7ICBjb250aW51ZQoKICAgICAgICAgICAgZWxpZiB0cnlUd28oYSwgYSwgYWxnc1thbGddKTogbGlzdE5vd1thbGddID0gVHJ1ZTsgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsaWYgdHJ5VHdvKGIsIGIsIGFsZ3NbYWxnXSk6IGxpc3ROb3dbYWxnXSA9IFRydWU7ICBjb250aW51ZQogICAgICAgICAgICBlbGlmIHRyeVR3byhjLCBjLCBhbGdzW2FsZ10pOiBsaXN0Tm93W2FsZ10gPSBUcnVlOyAgY29udGludWUKCiAgICAgICAgICAgIGVsaWYgdHJ5VHdvKGEsIGIsIGFsZ3NbYWxnXSk6IGxpc3ROb3dbYWxnXSA9IFRydWU7IGNvbnRpbnVlCiAgICAgICAgICAgIGVsaWYgdHJ5VHdvKGEsIGMsIGFsZ3NbYWxnXSk6IGxpc3ROb3dbYWxnXSA9IFRydWU7ICBjb250aW51ZQoKICAgICAgICAgICAgZWxpZiB0cnlUd28oYiwgYSwgYWxnc1thbGddKTogbGlzdE5vd1thbGddID0gVHJ1ZTsgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsaWYgdHJ5VHdvKGIsIGMsIGFsZ3NbYWxnXSk6IGxpc3ROb3dbYWxnXSA9IFRydWU7ICBjb250aW51ZQoKICAgICAgICAgICAgZWxpZiB0cnlUd28oYywgYSwgYWxnc1thbGddKTogbGlzdE5vd1thbGddID0gVHJ1ZTsgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsaWYgdHJ5VHdvKGMsIGIsIGFsZ3NbYWxnXSk6IGxpc3ROb3dbYWxnXSA9IFRydWU7ICBjb250aW51ZQoKICAgICAgICAgICAgZWxzZTogcmV0dXJuIGxpc3ROb3cKCiAgICByZXR1cm4gbGlzdE5vdwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyBNZW1vIDMgYWxncz8gIyMKCmhpZ2hlc3QgPSAwCgpmb3IgbDEgaW4gcmFuZ2UoMSw3KToKICAgICNwcmludCAiTDE6ICIsIGwxCiAgICBmb3IgbDIgaW4gcmFuZ2UobDErMSxsZW4oYWxncykpOgogICAgICAgIGZvciBsMyBpbiByYW5nZShsMisxLGxlbihhbGdzKSk6CgogICAgICAgICAgICBhbGdzRG9uZSA9IFtGYWxzZV0qbGVuKGFsZ3MpCgogICAgICAgICAgICBhbGdzRG9uZSA9IHRyeUNvbWJvKGFsZ3NbbDFdLCBhbGdzW2wyXSwgYWxnc1tsM10sIGFsZ3NEb25lKQoKICAgICAgICAgICAgaWYgc3VtKGFsZ3NEb25lKSA9PSBsZW4oYWxncyk6CiAgICAgICAgICAgICAgICBwcmludCAiXHRcdEFsZ3MgdXNlZDogIiwgbDEsIGwyLCBsMwogICAgICAgICAgICAgICAgI3ByaW50ICJcdFx0Q2FzZXMgc29sdmVkOiAiICsgc3RyKHN1bShhbGdzRG9uZSkpICsgIiBvdXQgb2YgIiArIHN0cihsZW4oYWxncykpCiAgICAgICAgICAgICAgICAjcHJpbnQgIlx0XHQiLCBhbGdzRG9uZTsgcHJpbnQKICAgICAgICAgICAgICAgIGhpZ2hlc3QgPSBzdW0oYWxnc0RvbmUpCiAgICBwcmludCAnXG5cbicK