from itertools import*
W=sorted
L=len
def f(e,d):
s=[];R=1
for S in e:
a,b=map(set,zip(*S[0]));I=L(b)!=1if L(a)-L(b)else'-'==d[S[0][0]];D={}
for i in S[1]:D[i[I]]=D.get(i[I],[])+[i[1-I]]
F=lambda x:abs(x-[*[b,a][I]][0]);U=[F(max(D[i],key=F))for i in W(D)];s+=(L(S[0]),*[L([*b])for a,b in groupby(U)if a==max(U)]),
(_,u),*l=W(s)[::-1]
for a,b in l:R*=a<=u;u=min(a,b)
return R
E=enumerate
M={(1,0):'|',(-1,0):'|',(0,-1):'-',(0,1):'-'}
def O(m):
d={(x,y):v for x,r in E(m)for y,v in E(r)}
q,s=[i for i in d if'#'==d[i]],[]
while q:
Q,S=[q[0]],[[],[q[0]]];q={*q}-{q[0]}
for x,y in Q:
for X,Y in M:
if(V:=(x+X,y+Y))in q or(d.get(V)in M.values()and V not in S[0]):S[V in q]+=[V];Q+=[V];q=[*{*q}-{V}]
for x,y in S[0]:
for X,Y in M:
if M[(X,Y)]==d[(x,y)]and(V:=(x+X,y+Y))not in S[0]and d.get(V)==d[(x,y)]:S[0]+=[V]
s+=[S]
return s,d
s1= """
####
## #
## ##
#### # ##
# ## ## ### ## #
# # ## ### ## # #
---- ------ -- - --
"""
s2 = """
##
##
##
####
# # #
---- -
"""
s3 = """
# #
### #
# # #
--- -
"""
s4 = """
###
###
### ## #
--- -- -
"""
s5 = """
#
#### #
# ## #
### # #
##### # ###### ###
----- - ------ ---
"""
s6 = """
#
# # # # # # # #
- - - - - - - -
"""
s7 = """
#
# # ##
--- --
"""
s8 = """
#
# #
### ## # #
## # ## ### #####
---- -- --- -----
"""
s9= """
# #
## ### # #
-- --- - -
"""
s10= """
#
#### #
---- --
"""
def to_board(s):
return [[*i] for i in filter(None, s.split('\n'))]
print(f(*O(to_board(s1))))
print(f(*O(to_board(s2))))
print(f(*O(to_board(s3))))
print(f(*O(to_board(s4))))
print(f(*O(to_board(s5))))
print(f(*O(to_board(s6))))
print(f(*O(to_board(s7))))
print(f(*O(to_board(s8))))
print(f(*O(to_board(s9))))
print(f(*O(to_board(s10))))
ZnJvbSBpdGVydG9vbHMgaW1wb3J0KgpXPXNvcnRlZApMPWxlbgpkZWYgZihlLGQpOgogcz1bXTtSPTEKIGZvciBTIGluIGU6CiAgYSxiPW1hcChzZXQsemlwKCpTWzBdKSk7ST1MKGIpIT0xaWYgTChhKS1MKGIpZWxzZSctJz09ZFtTWzBdWzBdXTtEPXt9CiAgZm9yIGkgaW4gU1sxXTpEW2lbSV1dPUQuZ2V0KGlbSV0sW10pK1tpWzEtSV1dCiAgRj1sYW1iZGEgeDphYnMoeC1bKltiLGFdW0ldXVswXSk7VT1bRihtYXgoRFtpXSxrZXk9RikpZm9yIGkgaW4gVyhEKV07cys9KEwoU1swXSksKltMKFsqYl0pZm9yIGEsYiBpbiBncm91cGJ5KFUpaWYgYT09bWF4KFUpXSksCiAoXyx1KSwqbD1XKHMpWzo6LTFdCiBmb3IgYSxiIGluIGw6Uio9YTw9dTt1PW1pbihhLGIpCiByZXR1cm4gUgogCkU9ZW51bWVyYXRlCk09eygxLDApOid8JywoLTEsMCk6J3wnLCgwLC0xKTonLScsKDAsMSk6Jy0nfQpkZWYgTyhtKToKIGQ9eyh4LHkpOnYgZm9yIHgsciBpbiBFKG0pZm9yIHksdiBpbiBFKHIpfQogcSxzPVtpIGZvciBpIGluIGQgaWYnIyc9PWRbaV1dLFtdCiB3aGlsZSBxOgogIFEsUz1bcVswXV0sW1tdLFtxWzBdXV07cT17KnF9LXtxWzBdfQogIGZvciB4LHkgaW4gUToKICAgZm9yIFgsWSBpbiBNOgogICAgaWYoVjo9KHgrWCx5K1kpKWluIHEgb3IoZC5nZXQoVilpbiBNLnZhbHVlcygpYW5kIFYgbm90IGluIFNbMF0pOlNbViBpbiBxXSs9W1ZdO1ErPVtWXTtxPVsqeypxfS17Vn1dCiAgZm9yIHgseSBpbiBTWzBdOgogICBmb3IgWCxZIGluIE06CiAgICBpZiBNWyhYLFkpXT09ZFsoeCx5KV1hbmQoVjo9KHgrWCx5K1kpKW5vdCBpbiBTWzBdYW5kIGQuZ2V0KFYpPT1kWyh4LHkpXTpTWzBdKz1bVl0KICBzKz1bU10KIHJldHVybiBzLGQKCnMxPSAiIiIKICAgICAgICMjIyMgICAgICAgICAgICAgCiAgICAgICAjIyAjICAgICAgICAgICAgIAogICAgICAgIyMgIyMgICAgICAgICAgIAojIyMjICAgIyAgIyMgICAgICAgICAgIAojICMjICAjIyAjIyMgICMjICAgICAgIwojICAjICAjIyAjIyMgICMjICAjICAgIwotLS0tICAtLS0tLS0gIC0tICAtICAtLQoiIiIKczIgPSAiIiIKICAjIyAgICAKICAjIyAgICAKICAjIyAgIAojIyMjICAgCiMgIyAgIwotLS0tIC0KIiIiCnMzID0gIiIiCiAgIyAjCiMjIyAjCiMgIyAjCi0tLSAtCiIiIgpzNCA9ICIiIgojIyMgICAgIAojIyMgICAgIAojIyMgIyMgIwotLS0gLS0gLQoiIiIKczUgPSAiIiIKICAgICAgIyAgICAgICAgICAgCiMjIyMgICMgICAgICAgICAgIAojICMjICAjICAgICAgICAgICAKIyMjICAgIyAgICAgICAgICMgCiMjIyMjICMgIyMjIyMjICMjIwotLS0tLSAtIC0tLS0tLSAtLS0KIiIiCnM2ID0gIiIiCiAgICAgICAgICAgICAgIwojICMgIyAjICMgIyAjICMKLSAtIC0gLSAtIC0gLSAtCiIiIgpzNyA9ICIiIgojICAgICAKIyAjICMjCi0tLSAtLQoiIiIKczggPSAiIiIKICAgICAjICAgICAgICAgICAgCiAgICAgIyAgIyAgICAgICAgCiAjIyMgIyMgIyAjICAgICAgIAojIyAjICMjICMjIyAjIyMjIwotLS0tIC0tIC0tLSAtLS0tLQoiIiIKczk9ICIiIgogICAgICMgIyAgCiMjICMjIyAjICMKLS0gLS0tIC0gLQoiIiIKczEwPSAiIiIKIyAgICAgICAKIyMjIyAgIwotLS0tIC0tCiIiIgpkZWYgdG9fYm9hcmQocyk6CglyZXR1cm4gW1sqaV0gZm9yIGkgaW4gZmlsdGVyKE5vbmUsIHMuc3BsaXQoJ1xuJykpXQpwcmludChmKCpPKHRvX2JvYXJkKHMxKSkpKQpwcmludChmKCpPKHRvX2JvYXJkKHMyKSkpKQpwcmludChmKCpPKHRvX2JvYXJkKHMzKSkpKQpwcmludChmKCpPKHRvX2JvYXJkKHM0KSkpKQpwcmludChmKCpPKHRvX2JvYXJkKHM1KSkpKQpwcmludChmKCpPKHRvX2JvYXJkKHM2KSkpKQpwcmludChmKCpPKHRvX2JvYXJkKHM3KSkpKQpwcmludChmKCpPKHRvX2JvYXJkKHM4KSkpKQpwcmludChmKCpPKHRvX2JvYXJkKHM5KSkpKQpwcmludChmKCpPKHRvX2JvYXJkKHMxMCkpKSk=