diff --git a/LP/InterruptDB.py b/LP/InterruptDB.py
index 9a9767b..b64dc7d 100755
--- a/LP/InterruptDB.py
+++ b/LP/InterruptDB.py
@@ -72,6 +72,21 @@ class InterruptDB(object):
ret[name] = [val]
return ret
+ @staticmethod
+ def load_scores(dbname):
+ scores = {} # {fname: [irp0_[kl0, kl1, ...], irp1_[...]]}
+ for k, v in InterruptDB.load(dbname).items():
+ for irpc, score, irp, kl, nums in v:
+ if k not in scores:
+ scores[k] = [[] for _ in range(29)]
+ part = scores[k][irp]
+ while kl >= len(part):
+ part.append((0, 0)) # (score, irp_count)
+ oldc = part[kl][1]
+ if irpc > oldc or (irpc == oldc and score > part[kl][0]):
+ part[kl] = (score, irpc)
+ return scores
+
@staticmethod
def write(name, score, irp, irpmax, keylen, nums, dbname='db_main'):
with open(LPath.db(dbname), 'a') as f:
diff --git a/LP/InterruptToWeb.py b/LP/InterruptToWeb.py
index a6e6426..fb5870d 100755
--- a/LP/InterruptToWeb.py
+++ b/LP/InterruptToWeb.py
@@ -1,9 +1,22 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from Alphabet import RUNES
-from LPath import FILES_ALL, LPath
+from LPath import FILES_ALL, FILES_SOLVED, LPath
from InterruptDB import InterruptDB
from InterruptIndices import InterruptIndices
+from RuneText import RuneTextFile
+from Probability import Probability
+
+NORM_MIN = 0.40
+NORM_MAX = 0.98
+HIGH_MIN = 1.25
+HIGH_MAX = 1.65
+
+
+def mark(x, low=0, high=1):
+ if x <= low:
+ return ' class="m0"'
+ return f' class="m{int((min(high, x) - low) / (high - low) * 14) + 1}"'
#########################################
@@ -11,29 +24,13 @@ from InterruptIndices import InterruptIndices
#########################################
class InterruptToWeb(object):
- def __init__(self, dbname, template='template.html'):
+ def __init__(self, dbname, template='templates/ioc.html'):
with open(LPath.results(template), 'r') as f:
self.template = f.read()
- self.indices = InterruptIndices()
- self.scores = {}
- db = InterruptDB.load(dbname)
- for k, v in db.items():
- for irpc, score, irp, kl, nums in v:
- if k not in self.scores:
- self.scores[k] = [[] for _ in range(29)]
- part = self.scores[k][irp]
- while kl >= len(part):
- part.append((0, 0)) # (score, irpc)
- oldc = part[kl][1]
- if irpc > oldc or (irpc == oldc and score > part[kl][0]):
- part[kl] = (score, irpc)
-
- def cls(self, x, low=0, high=1):
- if x <= low:
- return ' class="m0"'
- return f' class="m{int((min(high, x) - low) / (high - low) * 14) + 1}"'
+ self.scores = InterruptDB.load_scores(dbname)
def table_reliable(self):
+ db_indices = InterruptIndices()
trh = '
'
trtotal = '
Total
'
trd = [f'
{x}
' for x in RUNES]
@@ -41,7 +38,7 @@ class InterruptToWeb(object):
for name in FILES_ALL:
if name not in self.scores:
continue
- total = self.indices.total(name)
+ total = db_indices.total(name)
trh += f'
{name}
'
trtotal += f'
{total}
'
for i in range(29):
@@ -55,8 +52,8 @@ class InterruptToWeb(object):
if max([x[1] for x in scrs]) != 0:
trd[i] += '
?
'
continue
- _, num = self.indices.consider(name, i, worst_irpc)
- trd[i] += f'
{num}
'
+ _, num = db_indices.consider(name, i, worst_irpc)
+ trd[i] += f'
{num}
'
trh += '
\n'
trtotal += '\n'
@@ -66,7 +63,7 @@ class InterruptToWeb(object):
trd[i] = ''
return f'
{trh}{"".join(trd)}{trtotal}
'
- def table_interrupt(self, irp, pmin=1.25, pmax=1.65):
+ def table_interrupt(self, irp, pmin, pmax):
maxkl = max(len(x[irp]) for x in self.scores.values())
trh = '
'
trbest = '
best
'
@@ -81,9 +78,9 @@ class InterruptToWeb(object):
trh += f'
{name}
'
for kl, (score, _) in enumerate(klarr):
if score < 0:
- trd[kl] += f'
–
'
+ trd[kl] += f'
–
'
else:
- trd[kl] += f'
{score:.2f}
'
+ trd[kl] += f'
{score:.2f}
'
if score > maxscore:
maxscore = score
bestkl = kl
@@ -94,7 +91,7 @@ class InterruptToWeb(object):
trd[i] += '
\n'
return f'
{trh}{"".join(trd[1:])}{trbest}
'
- def make(self, outfile, pmin=1.25, pmax=1.65):
+ def make(self, outfile, pmin, pmax):
nav = ''
txt = ''
for i in range(29):
@@ -111,6 +108,217 @@ class InterruptToWeb(object):
f.write(html)
+class ChapterToWeb(object):
+ def __init__(self, template='templates/pages.html'):
+ with open(LPath.results(template), 'r') as f:
+ self.template = f.read()
+ self.score = [(InterruptDB.load_scores('db_high'), HIGH_MIN, HIGH_MAX),
+ (InterruptDB.load_scores('db_norm'), NORM_MIN, NORM_MAX)]
+
+ def pick_ngrams(self, runes, gramsize, limit=100):
+ res = {}
+ for i in range(len(runes) - gramsize + 1):
+ z = ''.join(x.rune for x in runes[i:i + gramsize])
+ try:
+ res[z] += 1
+ except KeyError:
+ res[z] = 1
+ res = sorted(res.items(), key=lambda x: -x[1])
+ txt = f'
{gramsize}-grams:
\n'
+ txt += '
\n'
+ for x, y in res[:limit]:
+ txt += f'
{x}:
{y}
'
+ if len(res) > limit:
+ txt += f' + {len(res) - limit} others'
+ return txt + '
\n'
+ for i, (a, b) in enumerate(zip(indices, indices[1:])):
+ x = min(abs(a - b), min(a, b) + 29 - max(a, b))
+ y = 1 if x == 0 else 0
+ sffx = f' title="offset: {i}, rune: {RUNES[a]}"' if y else ''
+ txta += f'
\n'
+ for i in range(len(indices) - width + 1):
+ ioc = Probability(indices[i:i + width]).IC()
+ clss = mark(ioc, HIGH_MIN - 0.1, HIGH_MAX)
+ txt += f'
{ioc:.2f}
'
+ txt += '
\n'
+ return txt
+
+ def pick_letters(self, words, idx, desc):
+ letters = []
+ for x in words:
+ letters.append(x[idx])
+ ioc = Probability(x.index for x in letters).IC()
+ txt = f'
Pick every {desc} letter (IoC: {ioc:.3f}):
\n'
+ txt += '
\n'
+ for x in letters:
+ txt += f'
{x.text}
'
+ txt += '
\n'
+ return txt
+
+ def pick_words(self, words, n):
+ txt = ''
+ for u in range(n):
+ if n > 1:
+ txt += f'
Start with {u + 1}. word
\n'
+ subset = [x for x in words[u:None:n]]
+ ioc = Probability(x.index for y in subset for x in y).IC()
+ txt += f'
Words (IoC: {ioc:.3f}):
\n'
+ txt += '
\n'
+ for x in subset:
+ txt += str(x.text) + ' '
+ txt += '
\n'
+ txt += self.pick_letters(subset, 0, 'first')
+ txt += self.pick_letters(subset, -1, 'last')
+ return txt
+
+ def sec_concealment(self, words):
+ txt = ''
+ for n in range(1, 6):
+ txt += f'
Pick every {n}. word
\n'
+ txt += '
\n'
+ txt += self.pick_words(words, n)
+ txt += '
\n'
+ return txt
+
+ def make(self, fname, outfile):
+ source = RuneTextFile(LPath.page(fname))
+ words = [x[3] for x in source.enum_words()]
+ runes = [x for w in words for x in w]
+ indices = [x.index for x in runes]
+ html = self.template.replace('__FNAME__', fname)
+ html = html.replace('__SEC_COUNTS__', self.sec_counts(words, runes))
+ html = html.replace('__SEC_DOUBLE__', self.sec_double_rune(indices))
+ if fname.startswith('solved_'):
+ warn = '
IoC is disabled on solved pages. Open the '
+ warn += f'“unsolved” page'
+ warn += ' instead.
'
+ html = html.replace('__SEC_IOC__', warn)
+ else:
+ html = html.replace('__SEC_IOC__', self.sec_ioc(fname))
+ ioc_flow = '
\n'
+ for winsize in [120, 80, 50, 30, 20]:
+ ioc_flow += self.sec_ioc_flow(indices, winsize)
+ ioc_flow += '
\n'
+ html = html.replace('__SEC_IOC_FLOW__', ioc_flow)
+ html = html.replace('__SEC_CONCEAL__', self.sec_concealment(words))
+ with open(LPath.results(outfile), 'w') as f:
+ f.write(html)
+
+
+class IndexToWeb(object):
+ def __init__(self, template='templates/index.html'):
+ with open(LPath.results(template), 'r') as f:
+ self.template = f.read()
+
+ def make(self, the_links, outfile='index.html'):
+ html = self.template
+ for key, links in the_links.items():
+ txt = ''
+ for x, y in links:
+ txt += f' {y} '
+ html = html.replace(key, txt)
+ with open(LPath.results(outfile), 'w') as f:
+ f.write(html)
+
+
if __name__ == '__main__':
- InterruptToWeb('db_high').make('index_high.html')
- InterruptToWeb('db_norm').make('index_norm.html', pmin=0.40, pmax=0.98)
+ links = {
+ '__A_IOC__': [('ioc/high.html', 'Highest (bluntly)'),
+ ('ioc/norm.html', 'Normal english (1.7767)')],
+ '__A_CHAPTER__': [(f'pages/{x}.html', x) for x in FILES_ALL],
+ '__A_SOLVED__': [(f'pages/solved_{x}.html', x)
+ for x in FILES_SOLVED]
+ }
+ InterruptToWeb('db_high').make('ioc/high.html', HIGH_MIN, HIGH_MAX)
+ InterruptToWeb('db_norm').make('ioc/norm.html', NORM_MIN, NORM_MAX)
+ ctw = ChapterToWeb()
+ for x, y in links['__A_CHAPTER__']:
+ ctw.make(y, x)
+ for x, y in links['__A_SOLVED__']:
+ ctw.make('solved_' + y, x)
+ IndexToWeb().make(links)
diff --git a/pages/solved_0_koan_1.txt b/pages/solved_0_koan_1.txt
new file mode 100644
index 0000000..20b9391
--- /dev/null
+++ b/pages/solved_0_koan_1.txt
@@ -0,0 +1,22 @@
+ᚪ•ᚳᚩᚪᚾ⁜
+ᚪ•ᛗᚪᚾ•ᛞᛖᚳᛁᛞᛖᛞ•ᛏᚩ•ᚷᚩ•ᚪᚾᛞ•ᛋᛏᚢᛞᚣ•ᚹᛁᚦ•ᚪ•ᛗᚪᛋᛏᛖᚱ⁘
+ᚻᛖ•ᚹᛖᚾᛏ•ᛏᚩ•ᚦᛖ•ᛞᚩᚩᚱ•ᚩᚠ•ᚦᛖ•ᛗᚪᛋᛏᛖᚱ⁘
+"ᚹᚻᚩ•ᚪᚱᛖ•ᚣᚩᚢ•ᚹᚻᚩ•ᚹᛁᛋᚻᛖᛋ•ᛏᚩ•ᛋᛏᚢᛞᚣ•ᚻᛖᚱᛖ"ᚪᛋᚳᛖᛞ•ᚦᛖ•ᛗᚪᛋᛏᛖᚱ⁘
+ᚦᛖ•ᛋᛏᚢᛞᛖᚾᛏ•ᛏᚩᛚᛞ•ᚦᛖ•ᛗᚪᛋᛏᛖᚱ•ᚻᛁᛋ•ᚾᚪᛗᛖ⁘
+"ᚦᚪᛏ•ᛁᛋ•ᚾᚩᛏ•ᚹᚻᚪᛏ•ᚣᚩᚢ•ᚪᚱᛖ⁚ᚦᚪᛏ•ᛁᛋ•ᚩᚾᛚᚣ•ᚹᚻᚪᛏ•ᚣᚩᚢ•ᚪᚱᛖ•ᚳᚪᛚᛚᛖᛞ⁘
+ᚹᚻᚩ•ᚪᚱᛖ•ᚣᚩᚢ•ᚹᚻᚩ•ᚹᛁᛋᚻᛖᛋ•ᛏᚩ•ᛋᛏᚢᛞᚣ•ᚻᛖᚱᛖ"ᚻᛖ•ᚪᛋᚳᛖᛞ•ᚪᚷᚪᛁᚾ⁘
+ᚦᛖ•ᛗᚪᚾ•ᚦᚩᚢᚷᚻᛏ•ᚠᚩᚱ•ᚪ•ᛗᚩᛗᛖᚾᛏ⁚ᚪᚾᛞ•ᚱᛖᛈᛚᛁᛖᛞ•"ᛁ•ᚪᛗ•ᚪ•ᛈᚱᚩᚠᛖᛋᛋᚩᚱ"⁘
+"ᚦᚪᛏ•ᛁᛋ•ᚹᚻᚪᛏ•ᚣᚩᚢ•ᛞᚩ⁚ᚾᚩᛏ•ᚹᚻᚪᛏ•ᚣᚩᚢ•ᚪᚱᛖ⁚"ᚱᛖᛈᛚᛁᛖᛞ•ᚦᛖ•ᛗᚪᛋᛏᛖᚱ⁘
+"ᚹᚻᚩ•ᚪᚱᛖ•ᚣᚩᚢ•ᚹᚻᚩ•ᚹᛁᛋᚻᛖᛋ•ᛏᚩ•ᛋᛏᚢᛞᚣ•ᚻᛖᚱᛖ"⁘
+ᚳᚩᚾᚠᚢᛋᛖᛞ⁚ᚦᛖ•ᛗᚪᚾ•ᚦᚩᚢᚷᚻᛏ•ᛋᚩᛗᛖ•ᛗᚩᚱᛖ⁘
+ᚠᛁᚾᚪᛚᛚᚣ⁚ᚻᛖ•ᚪᚾᛋᚹᛖᚱᛖᛞ⁚"ᛁ•ᚪᛗ•ᚪ•ᚻᚢᛗᚪᚾ•ᛒᛖᛝ"⁘
+"ᚦᚪᛏ•ᛁᛋ•ᚩᚾᛚᚣ•ᚣᚩᚢᚱ•ᛋᛈᛖᚳᛁᛖᛋ⁚ᚾᚩᛏ•ᚹᚻᚩ•ᚣᚩᚢ•ᚪᚱᛖ⁘
+ᚹᚻᚩ•ᚪᚱᛖ•ᚣᚩᚢ•ᚹᚻᚩ•ᚹᛁᛋᚻᛖᛋ•ᛏᚩ•ᛋᛏᚢᛞᚣ•ᚻᛖᚱᛖ"⁚ᚪᛋᚳᛖᛞ•ᚦᛖ•ᛗᚪᛋᛏᛖᚱ•ᚪᚷᚪᛁᚾ⁘
+ᚪᚠᛏᛖᚱ•ᚪ•ᛗᚩᛗᛖᚾᛏ•ᚩᚠ•ᚦᚩᚢᚷᚻᛏ⁚ᚦᛖ•ᛈᚱᚩᚠᛖᛋᛋᚩᚱ•ᚱᛖᛈᛚᛁᛖᛞ•"ᛁ•ᚪᛗ•ᚪ•ᚳᚩᚾᛋᚳᛡᚢᛋᚾᛖᛋᛋ•ᛁᚾᚻᚪᛒᛁᛏᛝ•ᚪᚾ•ᚪᚱᛒᛁᛏᚱᚪᚱᚣ•ᛒᚩᛞᚣ"⁘
+"ᚦᚪᛏ•ᛁᛋ•ᛗᛖᚱᛖᛚᚣ•ᚹᚻᚪᛏ•ᚣᚩᚢ•ᚪᚱᛖ⁚ᚾᚩᛏ•ᚹᚻᚩ•ᚣᚩᚢ•ᚪᚱᛖ⁘
+ᚹᚻᚩ•ᚪᚱᛖ•ᚣᚩᚢ•ᚹᚻᚩ•ᚹᛁᛋᚻᛖᛋ•ᛏᚩ•ᛋᛏᚢᛞᚣ•ᚻᛖᚱᛖ"⁘
+ᚦᛖ•ᛗᚪᚾ•ᚹᚪᛋ•ᚷᛖᛏᛏᛝ•ᛁᚱᚱᛁᛏᚪᛏᛖᛞ⁘
+"ᛁ•ᚪᛗ⁚"ᚻᛖ•ᛋᛏᚪᚱᛏᛖᛞ⁚ᛒᚢᛏ•ᚻᛖ•ᚳᚩᚢᛚᛞ•ᚾᚩᛏ•ᚦᛁᚾᚳ•ᚩᚠ•ᚪᚾᚣᚦᛝ•ᛖᛚᛋᛖ•ᛏᚩ•ᛋᚪᚣ⁚ᛋᚩ•ᚻᛖ•ᛏᚱᚪᛁᛚᛖᛞ•ᚩᚠᚠ⁘
+ᚪᚠᛏᛖᚱ•ᚪ•ᛚᚩᛝ•ᛈᚪᚢᛋᛖ•ᚦᛖ•ᛗᚪᛋᛏᛖᚱ•ᚱᛖᛈᛚᛁᛖᛞ⁚"ᚦᛖᚾ•ᚣᚩᚢ•ᚪᚱᛖ•ᚹᛖᛚᚳᚩᛗᛖ•ᛏᚩ•ᚳᚩᛗᛖ•ᛋᛏᚢᛞᚣ"⁜
+ᚪᚾ•ᛁᚾᛋᛏᚱᚢᚳᛏᛡᚾ⁜
+ᛞᚩ•ᚠᚩᚢᚱ•ᚢᚾᚱᛠᛋᚩᚾᚪᛒᛚᛖ•ᚦᛝᛋ•ᛠᚳᚻ•ᛞᚪᚣ⁜
\ No newline at end of file
diff --git a/pages/solved_0_loss_of_divinity.txt b/pages/solved_0_loss_of_divinity.txt
new file mode 100644
index 0000000..62be932
--- /dev/null
+++ b/pages/solved_0_loss_of_divinity.txt
@@ -0,0 +1,25 @@
+ᚦᛖ•ᛚᚩᛋᛋ•ᚩᚠ•ᛞᛁᚢᛁᚾᛁᛏᚣ⁜
+ᚦᛖ•ᚳᛁᚱᚳᚢᛗᚠᛖᚱᛖᚾᚳᛖ•ᛈᚱᚪᚳᛏᛁᚳᛖᛋ•ᚦᚱᛖᛖ•ᛒᛖᚻᚪᚢᛡᚱᛋ•ᚹᚻᛁᚳᚻ•ᚳᚪᚢᛋᛖ•ᚦᛖ•ᛚᚩᛋᛋ•ᚩᚠ•ᛞᛁᚢᛁᚾᛁᛏᚣ⁘
+⁜ᚳᚩᚾᛋᚢᛗᛈᛏᛡᚾ⁜
+ᚹᛖ•ᚳᚩᚾᛋᚢᛗᛖ•ᛏᚩᚩ•ᛗᚢᚳᚻ•ᛒᛖᚳᚪᚢᛋᛖ•ᚹᛖ•ᛒᛖᛚᛖᛁᚢᛖ•ᚦᛖ•ᚠᚩᛚᛚᚩᚹᛝ•ᛏᚹᚩ•ᛖᚱᚱᚩᚱᛋ•ᚹᛁᚦᛁᚾ•ᚦᛖ•ᛞᛖᚳᛖᛈᛏᛡᚾ⁘
+1ᚹᛖ•ᛞᚩ•ᚾᚩᛏ•ᚻᚪᚢᛖ•ᛖᚾᚩᚢᚷᚻ⁚ᚩᚱ•ᚦᛖᚱᛖ•ᛁᛋ•ᚾᚩᛏ•ᛖᚾᚩᚢᚷᚻ⁘
+2ᚹᛖ•ᚻᚪᚢᛖ•ᚹᚻᚪᛏ•ᚹᛖ•ᚻᚪᚢᛖ•ᚾᚩᚹ•ᛒᚣ•ᛚᚢᚳᚳ⁖ᚪᚾᛞ•ᚹᛖ•ᚹᛁᛚᛚ•ᚾᚩᛏ•ᛒᛖ•ᛋᛏᚱᚩᛝ•ᛖᚾᚩᚢᚷᚻ•ᛚᚪᛏᛖᚱ•ᛏᚩ•ᚩᛒᛏᚪᛁᚾ•ᚹᚻᚪᛏ•ᚹᛖ•ᚾᛖᛖᛞ⁘
+ᛗᚩᛋᛏ•ᚦᛝᛋ•ᚪᚱᛖ•ᚾᚩᛏ•ᚹᚩᚱᚦ•ᚳᚩᚾᛋᚢᛗᛝ⁜
+⁜ᛈᚱᛖᛋᛖᚱᚢᚪᛏᛡᚾ⁜
+ᚹᛖ•ᛈᚱᛖᛋᛖᚱᚢᛖ•ᚦᛝᛋ•ᛒᛖᚳᚪᚢᛋᛖ•ᚹᛖ•ᛒᛖᛚᛁᛖᚢᛖ•ᚹᛖ•ᚪᚱᛖ•ᚹᛠᚳ⁘
+ᛁᚠ•ᚹᛖ•ᛚᚩᛋᛖ•ᚦᛖᛗ•ᚹᛖ•ᚹᛁᛚᛚ•ᚾᚩᛏ•ᛒᛖ•ᛋᛏᚱᚩᛝ•ᛖᚾᚩᚢᚷᚻ•ᛏᚩ•ᚷᚪᛁᚾ•ᚦᛖᛗ•ᚪᚷᚪᛁᚾ⁘
+ᚦᛁᛋ•ᛁᛋ•ᚦᛖ•ᛞᛖᚳᛖᛈᛏᛡᚾ⁘
+ᛗᚩᛋᛏ•ᚦᛝᛋ•ᚪᚱᛖ•ᚾᚩᛏ•ᚹᚩᚱᚦ•ᛈᚱᛖᛋᛖᚱᚢᛝ⁜
+⁜ᚪᛞᚻᛖᚱᛖᚾᚳᛖ⁜
+ᚹᛖ•ᚠᚩᛚᛚᚩᚹ•ᛞᚩᚷᛗᚪ•ᛋᚩ•ᚦᚪᛏ•ᚹᛖ•ᚳᚪᚾ•ᛒᛖᛚᚩᛝ•ᚪᚾᛞ•ᛒᛖ•ᚱᛁᚷᚻᛏ⁘
+•ᚩᚱ•ᚹᛖ•ᚠᚩᛚᛚᚩᚹ•ᚱᛠᛋᚩᚾ•ᛋᚩ•ᚹᛖ•ᚳᚪᚾ•ᛒᛖᛚᚩᛝ•ᚪᚾᛞ•ᛒᛖ•ᚱᛁᚷᚻᛏ⁘
+ᚦᛖᚱᛖ•ᛁᛋ•ᚾᚩᚦᛝ•ᛏᚩ•ᛒᛖ•ᚱᛁᚷᚻᛏ•ᚪᛒᚩᚢᛏ⁘
+•ᛏᚩ•ᛒᛖᛚᚩᛝ•ᛁᛋ•ᛞᛠᚦ⁜
+ᛁᛏ•ᛁᛋ•ᚦᛖ•ᛒᛖᚻᚪᚢᛡᚱᛋ•ᚩᚠ•ᚳᚩᚾᛋᚢᛗᛈᛏᛡᚾ⁖ᛈᚱᛖᛋᛖᚱᚢᚪᛏᛡᚾ⁖ᚪᚾᛞ•ᚪᛞᚻᛖᚱᛖᚾᚳᛖ•ᚦᚪᛏ•ᚻᚪᚢᛖ•ᚢᛋ•ᛚᚩᛋᛖ•ᚩᚢᚱ•ᛈᚱᛁᛗᚪᛚᛁᛏᚣ⁖ᚪᚾᛞ•ᚦᚢᛋ•ᚩᚢᚱ•ᛞᛁᚢᛁᚾᛁᛏᚣ⁜
+ᛋᚩᛗᛖ•ᚹᛁᛋᛞᚩᛗ⁜
+ᚪᛗᚪᛋᛋ•ᚷᚱᛠᛏ•ᚹᛠᛚᚦ⁘
+ᚾᛖᚢᛖᚱ•ᛒᛖᚳᚩᛗᛖ•ᚪᛏᛏᚪᚳᚻᛖᛞ•ᛏᚩ•ᚹᚻᚪᛏ•ᚣᚩᚢ•ᚩᚹᚾ⁘
+ᛒᛖ•ᛈᚱᛖᛈᚪᚱᛖᛞ•ᛏᚩ•ᛞᛖᛋᛏᚱᚩᚣ•ᚪᛚᛚ•ᚦᚪᛏ•ᚣᚩᚢ•ᚩᚹᚾ⁘
+ᚪᚾ•ᛁᚾᛋᛏᚱᚢᚳᛏᛡᚾ⁜
+ᛈᚱᚩᚷᚱᚪᛗ•ᚣᚩᚢᚱ•ᛗᛁᚾᛞ⁘
+ᛈᚱᚩᚷᚱᚪᛗ•ᚱᛠᛚᛁᛏᚣ⁜
\ No newline at end of file
diff --git a/pages/solved_0_warning.txt b/pages/solved_0_warning.txt
new file mode 100644
index 0000000..cea43c0
--- /dev/null
+++ b/pages/solved_0_warning.txt
@@ -0,0 +1,10 @@
+ᚪ•ᚹᚪᚱᚾᛝ⁜
+ᛒᛖᛚᛁᛖᚢᛖ•ᚾᚩᚦᛝ•ᚠᚱᚩᛗ•ᚦᛁᛋ•ᛒᚩᚩᚳ⁘
+ᛖᛉᚳᛖᛈᛏ•ᚹᚻᚪᛏ•ᚣᚩᚢ•ᚳᚾᚩᚹ•ᛏᚩ•ᛒᛖ•ᛏᚱᚢᛖ⁘
+ᛏᛖᛋᛏ•ᚦᛖ•ᚳᚾᚩᚹᛚᛖᛞᚷᛖ⁘
+ᚠᛁᚾᛞ•ᚣᚩᚢᚱ•ᛏᚱᚢᚦ⁘
+ᛖᛉᛈᛖᚱᛁᛖᚾᚳᛖ•ᚣᚩᚢᚱ•ᛞᛠᚦ⁘
+ᛞᚩ•ᚾᚩᛏ•ᛖᛞᛁᛏ•ᚩᚱ•ᚳᚻᚪᛝᛖ•ᚦᛁᛋ•ᛒᚩᚩᚳ⁘
+ᚩᚱ•ᚦᛖ•ᛗᛖᛋᛋᚪᚷᛖ•ᚳᚩᚾᛏᚪᛁᚾᛖᛞ•ᚹᛁᚦᛁᚾ⁘
+ᛖᛁᚦᛖᚱ•ᚦᛖ•ᚹᚩᚱᛞᛋ•ᚩᚱ•ᚦᛖᛁᚱ•ᚾᚢᛗᛒᛖᚱᛋ⁘
+ᚠᚩᚱ•ᚪᛚᛚ•ᛁᛋ•ᛋᚪᚳᚱᛖᛞ⁜
\ No newline at end of file
diff --git a/pages/solved_0_welcome.txt b/pages/solved_0_welcome.txt
new file mode 100644
index 0000000..18c353f
--- /dev/null
+++ b/pages/solved_0_welcome.txt
@@ -0,0 +1,15 @@
+ᚹᛖᛚᚳᚩᛗᛖ⁜
+ᚹᛖᛚᚳᚩᛗᛖ⁚ᛈᛁᛚᚷᚱᛁᛗ⁚ᛏᚩ•ᚦᛖ•ᚷᚱᛠᛏ•ᛄᚩᚢᚱᚾᛖᚣ•ᛏᚩᚹᚪᚱᛞ•ᚦᛖ•ᛖᚾᛞ•ᚩᚠ•ᚪᛚᛚ•ᚦᛝᛋ⁘
+ᛁᛏ•ᛁᛋ•ᚾᚩᛏ•ᚪᚾ•ᛠᛋᚣ•ᛏᚱᛁᛈ⁚ᛒᚢᛏ•ᚠᚩᚱ•ᚦᚩᛋᛖ•ᚹᚻᚩ•ᚠᛁᚾᛞ•ᚦᛖᛁᚱ•ᚹᚪᚣ•ᚻᛖᚱᛖ•ᛁᛏ•ᛁᛋ•ᚪ•ᚾᛖᚳᛖᛋᛋᚪᚱᚣ•ᚩᚾᛖ⁘
+ᚪᛚᚩᛝ•ᚦᛖ•ᚹᚪᚣ•ᚣᚩᚢ•ᚹᛁᛚᛚ•ᚠᛁᚾᛞ•ᚪᚾ•ᛖᚾᛞ•ᛏᚩ•ᚪᛚᛚ•ᛋᛏᚱᚢᚷᚷᛚᛖ•ᚪᚾᛞ•ᛋᚢᚠᚠᛖᚱᛝ⁚ᚣᚩᚢᚱ•ᛁᚾᚾᚩᚳᛖᚾᚳᛖ⁚ᚣᚩᚢᚱ•ᛁᛚᛚᚢᛋᛡᚾᛋ⁚ᚣᚩᚢᚱ•ᚳᛖᚱᛏᚪᛁᚾᛏᚣ⁚ᚪᚾᛞ•ᚣᚩᚢᚱ•ᚱᛠᛚᛁᛏᚣ⁘
+ᚢᛚᛏᛁᛗᚪᛏᛖᛚᚣ⁚ᚣᚩᚢ•ᚹᛁᛚᛚ•ᛞᛁᛋᚳᚩᚢᛖᚱ•ᚪᚾ•ᛖᚾᛞ•ᛏᚩ•ᛋᛖᛚᚠ⁘
+ᛁᛏ•ᛁᛋ•ᚦᚱᚩᚢᚷᚻ•ᚦᛁᛋ•ᛈᛁᛚᚷᚱᛁᛗᚪᚷᛖ•ᚦᚪᛏ•ᚹᛖ•ᛋᚻᚪᛈᛖ•ᚩᚢᚱᛋᛖᛚᚢᛖᛋ•ᚪᚾᛞ•ᚩᚢᚱ•ᚱᛠᛚᛁᛏᛁᛖᛋ⁘
+ᛄᚩᚢᚱᚾᛖᚣ•ᛞᛖᛖᛈ•ᚹᛁᚦᛁᚾ•ᚪᚾᛞ•ᚣᚩᚢ•ᚹᛁᛚᛚ•ᚪᚱᚱᛁᚢᛖ•ᚩᚢᛏᛋᛁᛞᛖ⁘
+ᛚᛁᚳᛖ•ᚦᛖ•ᛁᚾᛋᛏᚪᚱ⁚ᛁᛏ•ᛁᛋ•ᚩᚾᛚᚣ•ᚦᚱᚩᚢᚷᚻ•ᚷᚩᛝ•ᚹᛁᚦᛁᚾ•ᚦᚪᛏ•ᚹᛖ•ᛗᚪᚣ•ᛖᛗᛖᚱᚷᛖ⁜
+ᚹᛁᛞᛋᚩᛗ⁜
+ᚣᚩᚢ•ᚪᚱᛖ•ᚪ•ᛒᛖᛝ•ᚢᚾᛏᚩ•ᚣᚩᚢᚱᛋᛖᛚᚠ⁘
+ᚣᚩᚢ•ᚪᚱᛖ•ᚪ•ᛚᚪᚹ•ᚢᚾᛏᚩ•ᚣᚩᚢᚱᛋᛖᛚᚠ⁘
+ᛠᚳᚻ•ᛁᚾᛏᛖᛚᛚᛁᚷᛖᚾᚳᛖ•ᛁᛋ•ᚻᚩᛚᚣ⁘
+ᚠᚩᚱ•ᚪᛚᛚ•ᚦᚪᛏ•ᛚᛁᚢᛖᛋ•ᛁᛋ•ᚻᚩᛚᚣ⁜
+⁜ᚪᚾ•ᛁᚾᛋᛏᚱᚢᚳᛏᛡᚾ⁜
+ᚳᚩᛗᛗᚪᚾᛞ•ᚣᚩᚢᚱ•ᚩᚹᚾ•ᛋᛖᛚᚠ⁜
\ No newline at end of file
diff --git a/pages/solved_0_wisdom.txt b/pages/solved_0_wisdom.txt
new file mode 100644
index 0000000..2a30e8a
--- /dev/null
+++ b/pages/solved_0_wisdom.txt
@@ -0,0 +1,10 @@
+ᛋᚩᛗᛖ•ᚹᛁᛋᛞᚩᛗ⁜
+ᚦᛖ•ᛈᚱᛁᛗᛖᛋ•ᚪᚱᛖ•ᛋᚪᚳᚱᛖᛞ⁘
+ᚦᛖ•ᛏᚩᛏᛁᛖᚾᛏ•ᚠᚢᚾᚳᛏᛡᚾ•ᛁᛋ•ᛋᚪᚳᚱᛖᛞ⁘
+ᚪᛚᛚ•ᚦᛝᛋ•ᛋᚻᚩᚢᛚᛞ•ᛒᛖ•ᛖᚾᚳᚱᚣᛈᛏᛖᛞ⁜
+ᚳᚾᚩᚹ•ᚦᛁᛋ⁜
+272 138 ᛋᚻᚪᛞᚩᚹᛋ 131 151⁘
+ᚫᚦᛖᚱᛠᛚ ᛒᚢᚠᚠᛖᚱᛋ ᚢᚩᛁᛞ ᚳᚪᚱᚾᚪᛚ 18⁘
+226 ᚩᛒᛋᚳᚢᚱᚪ ᚠᚩᚱᛗ 245 ᛗᚩᛒᛁᚢᛋ⁘
+18 ᚪᚾᚪᛚᚩᚷ ᚢᚩᛁᛞ ᛗᚩᚢᚱᚾᚠᚢᛚ ᚫᚦᛖᚱᛠᛚ⁘
+151 131 ᚳᚪᛒᚪᛚ 138 272⁘
\ No newline at end of file
diff --git a/pages/solved_jpg107-167.txt b/pages/solved_jpg107-167.txt
new file mode 100644
index 0000000..8e3260e
--- /dev/null
+++ b/pages/solved_jpg107-167.txt
@@ -0,0 +1,7 @@
+ᚪ•ᚳᚩᚪᚾ⁜
+ᛞᚢᚱᛝ•ᚪ•ᛚᛖᛋᛋᚩᚾ⁚ᚦᛖ•ᛗᚪᛋᛏᛖᚱ•ᛖᛉᛈᛚᚪᛁᚾᛖᛞ•ᚦᛖ•ᛁ⁘
+"ᚦᛖ•ᛁ•ᛁᛋ•ᚦᛖ•ᚢᚩᛁᚳᛖ•ᚩᚠ•ᚦᛖ•ᚳᛁᚱᚳᚢᛗᚠᛖᚱᛖᚾᚳᛖ⁚"ᚻᛖ•ᛋᚪᛁᛞ⁘
+ᚹᚻᛖᚾ•ᚪᛋᚳᛖᛞ•ᛒᚣ•ᚪ•ᛋᛏᚢᛞᛖᚾᛏ•ᛏᚩ•ᛖᛉᛈᛚᚪᛁᚾ•ᚹᚻᚪᛏ•ᚦᚪᛏ•ᛗᛠᚾᛏ⁖ᚦᛖ•ᛗᚪᛋᛏᛖᚱ•ᛋᚪᛁᛞ"ᛁᛏ•ᛁᛋ•ᚪ•ᚢᚩᛁᚳᛖ•ᛁᚾᛋᛁᛞᛖ•ᚣᚩᚢᚱ•ᚻᛠᛞ"⁘
+"ᛁ•ᛞᚩᚾ'ᛏ•ᚻᚪᚢᛖ•ᚪ•ᚢᚩᛁᚳᛖ•ᛁᚾ•ᛗᚣ•ᚻᛠᛞ⁚"•ᚦᚩᚢᚷᚻᛏ•ᚦᛖ•ᛋᛏᚢᛞᛖᚾᛏ⁚ᚪᚾᛞ•ᚻᛖ•ᚱᚪᛁᛋᛖᛞ•ᚻᛁᛋ•ᚻᚪᚾᛞ•ᛏᚩ•ᛏᛖᛚᛚ•ᚦᛖ•ᛗᚪᛋᛏᛖᚱ⁘
+ᚦᛖ•ᛗᚪᛋᛏᛖᚱ•ᛋᛏᚩᛈᛈᛖᛞ•ᚦᛖ•ᛋᛏᚢᛞᛖᚾᛏ⁚ᚪᚾᛞ•ᛋᚪᛁᛞ"ᚦᛖ•ᚢᚩᛁᚳᛖ•ᚦᚪᛏ•ᛄᚢᛋᛏ•ᛋᚪᛁᛞ•ᚣᚩᚢ•ᚻᚪᚢᛖ•ᚾᚩ•ᚢᚩᛁᚳᛖ•ᛁᚾ•ᚣᚩᚢᚱ•ᚻᛠᛞ⁖ᛁᛋ•ᚦᛖ•ᛁ⁘
+"ᚪᚾᛞ•ᚦᛖ•ᛋᛏᚢᛞᛖᚾᛏᛋ•ᚹᛖᚱᛖ•ᛖᚾᛚᛁᚷᚻᛏᛖᚾᛖᛞ⁜
\ No newline at end of file
diff --git a/pages/solved_jpg229.txt b/pages/solved_jpg229.txt
new file mode 100644
index 0000000..5a629ea
--- /dev/null
+++ b/pages/solved_jpg229.txt
@@ -0,0 +1,11 @@
+ᚪᚾ•ᛁᚾᛋᛏᚱᚢᚳᛏᛡᚾ⁜
+ᚳᚹᛖᛋᛏᛡᚾ•ᚪᛚᛚ•ᚦᛝᛋ⁘
+ᛞᛁᛋᚳᚩᚢᛖᚱ•ᛏᚱᚢᚦ•ᛁᚾᛋᛁᛞᛖ•ᚣᚩᚢᚱᛋᛖᛚᚠ⁘
+ᚠᚩᛚᛚᚩᚹ•ᚣᚩᚢᚱ•ᛏᚱᚢᚦ⁘
+ᛁᛗᛈᚩᛋᛖ•ᚾᚩᚦᛝ•ᚩᚾ•ᚩᚦᛖᚱᛋ⁜
+ᚳᚾᚩᚹ•ᚦᛁᛋ⁜
+434 1311 312 278 966⁘
+204 812 934 280 1071⁘
+626 620 809 620 626⁘
+1071 280 934 812 204⁘
+966 278 312 1311 434⁘
\ No newline at end of file
diff --git a/pages/solved_p56_an_end.txt b/pages/solved_p56_an_end.txt
new file mode 100644
index 0000000..4b0a120
--- /dev/null
+++ b/pages/solved_p56_an_end.txt
@@ -0,0 +1,4 @@
+ᚪᚾ•ᛖᚾᛞ⁜
+ᚹᛁᚦᛁᚾ•ᚦᛖ•ᛞᛖᛖᛈ•ᚹᛖᛒ⁖ᚦᛖᚱᛖ•ᛖᛉᛁᛋᛏᛋ•ᚪ•ᛈᚪᚷᛖ•ᚦᚪᛏ•ᚻᚪᛋᚻᛖᛋ•ᛏᚩ⁜
+36367763ab73783c7af284446c59466b4cd653239a311cb7116d4618dee09a8425893dc7500b464fdaf1672d7bef5e891c6e2274568926a49fb4f45132c2a8b4⁘
+ᛁᛏ•ᛁᛋ•ᚦᛖ•ᛞᚢᛏᚣ•ᚩᚠ•ᛖᚢᛖᚱᚣ•ᛈᛁᛚᚷᚱᛁᛗ•ᛏᚩ•ᛋᛖᛖᚳ•ᚩᚢᛏ•ᚦᛁᛋ•ᛈᚪᚷᛖ⁜
\ No newline at end of file
diff --git a/pages/solved_p57_parable.txt b/pages/solved_p57_parable.txt
new file mode 100644
index 0000000..ae93152
--- /dev/null
+++ b/pages/solved_p57_parable.txt
@@ -0,0 +1,4 @@
+ᛈᚪᚱᚪᛒᛚᛖ⁜
+ᛚᛁᚳᛖ•ᚦᛖ•ᛁᚾᛋᛏᚪᚱ•ᛏᚢᚾᚾᛖᛚᛝ•ᛏᚩ•ᚦᛖ•ᛋᚢᚱᚠᚪᚳᛖ⁘
+ᚹᛖ•ᛗᚢᛋᛏ•ᛋᚻᛖᛞ•ᚩᚢᚱ•ᚩᚹᚾ•ᚳᛁᚱᚳᚢᛗᚠᛖᚱᛖᚾᚳᛖᛋ⁘
+ᚠᛁᚾᛞ•ᚦᛖ•ᛞᛁᚢᛁᚾᛁᛏᚣ•ᚹᛁᚦᛁᚾ•ᚪᚾᛞ•ᛖᛗᛖᚱᚷᛖ⁜
\ No newline at end of file
diff --git a/results/home.svg b/results/home.svg
new file mode 100644
index 0000000..a963958
--- /dev/null
+++ b/results/home.svg
@@ -0,0 +1,2 @@
+
diff --git a/results/index.html b/results/index.html
index 3aed40c..04baf13 100644
--- a/results/index.html
+++ b/results/index.html
@@ -3,24 +3,38 @@
- InterruptDB – Frequency Analysis, IoC
-
+ LP Analysis
+
-