Skip to content

Instantly share code, notes, and snippets.

@apaap
Created December 12, 2019 07:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save apaap/8b185c33fd5cf46f2173d7b671e5b849 to your computer and use it in GitHub Desktop.
Save apaap/8b185c33fd5cf46f2173d7b671e5b849 to your computer and use it in GitHub Desktop.
Progress on determining the fate of the Dean Hickerson's R50 Roomba bug
-- prtr-dump.lua
-- Module to serialize lua values and tables and dump to file
-- By Jérôme Vuarand
-- http://piratery.net/dump/
-- LICENSE
-- Copyright (c) Jérôme Vuarand
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to deal
-- in the Software without restriction, including without limitation the rights
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-- copies of the Software, and to permit persons to whom the Software is
-- furnished to do so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in
-- all copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-- THE SOFTWARE.
local _M = {}
local _NAME = ... or 'test'
local tostring = tostring
local io = require 'io'
local os = require 'os'
local math = require 'math'
local table = require 'table'
local string = require 'string'
_M.groupsize = 10000
local dumptablecontent
local tkeys = {
boolean = true,
number = true,
string = true,
}
local tvalues = {
boolean = true,
number = true,
string = true,
table = true,
}
local function dumptable(table, write, level, refs, format)
-- prefix and suffix
local mt = getmetatable(table)
local prefix = mt and mt.__dump_prefix
local suffix = mt and mt.__dump_suffix
if type(prefix)=='function' then
prefix = prefix(table)
end
prefix = prefix or ""
if type(suffix)=='function' then
suffix = suffix(table)
end
suffix = suffix or ""
-- count keys
local nkeys = 0
for k,v in pairs(table) do
nkeys = nkeys + 1
local tk,tv = type(k),type(v)
if not tkeys[tk] then
return nil,"unsupported key type '"..tk.."'"
end
if not (tvalues[tv] or getmetatable(v) and getmetatable(v).__dump) then
return nil,"unsupported value type '"..tv.."'"
end
end
-- if too many keys, use multiple closures
if nkeys > _M.groupsize then
local success,err
if format=='compact' then
success,err = write(prefix.."(function()local t={function()return{")
else
success,err = write(((prefix..[[
(function()
local t = { function() return {
]]):gsub("\n", "\n"..("\t"):rep(level))))
end
if not success then return nil,err end
local groupsep
if format=='compact' then
groupsep = '}end,function()return{'
else
groupsep = ("\t"):rep(level+1)..'} end, function() return {\n'
end
success,err = dumptablecontent(table, write, level+2, _M.groupsize, groupsep, refs, format)
if not success then return nil,err end
if format=='compact' then
success,err = write("}end}local r={}for _,f in ipairs(t) do for k,v in pairs(f()) do r[k]=v end end return r end)()"..suffix)
else
success,err = write((([[
} end }
local result = {}
for _,f in ipairs(t) do
for k,v in pairs(f()) do
result[k] = v
end
end
return result
end)()]]..suffix):gsub("\n", "\n"..("\t"):rep(level))))
end
if not success then return nil,err end
return true
elseif nkeys==0 then
local success,err
if format=='compact' then
success,err = write(prefix.."{}"..suffix)
else
success,err = write(prefix.."{ }"..suffix)
end
if not success then return nil,err end
return true
else
local success,err
if format=='compact' then
success,err = write(prefix.."{")
else
success,err = write(prefix.."{\n")
end
if not success then return nil,err end
success,err = dumptablecontent(table, write, level+1, nil, nil, refs, format)
if not success then return nil,err end
if format=='compact' then
success,err = write("}"..suffix)
else
success,err = write(("\t"):rep(level).."}"..suffix)
end
if not success then return nil,err end
return true
end
end
local function dumpvalue(v, write, level, refs, format, iskey)
local mt = getmetatable(v)
local dump = mt and mt.__dump
if type(dump)=='function' then
dump = dump(v)
end
if dump~=nil then
return write(dump)
end
local t = type(v)
if t=='string' then
if not iskey and v:match('\n.*\n') and not v:match('[\000-\008\011-\031\127]') and format~='compact' then
local eq
for i=0,math.huge do
eq = string.rep('=', i)
if not v:match('%]'..eq..'%]') then
break
end
end
return write('['..eq..'[\n'..v..']'..eq..']')
else
return write('"'..v:gsub('[%z\1-\31\127"\\]', function(c)
if c=='\\' then
return '\\\\'
elseif c=='"' then
return '\\"'
elseif c=='\t' then
return '\\t'
elseif c=='\n' then
return '\\n'
elseif c=='\r' then
return '\\r'
else
return string.format('\\%03d', string.byte(c))
end
end)..'"')
end
elseif t=='number' then
if v~=v then -- nan
return write('0/0')
elseif v==1/0 then -- +inf
return write('1/0')
elseif v==-1/0 then -- -inf
return write('-1/0')
elseif v==math.floor(v) then
return write(tostring(v))
else
local s = tostring(v)
if tonumber(s)~=v then
s = string.format('%.18f', v):gsub('(%..-)0*$', '%1')
end
if tonumber(s)~=v then
s = string.format("%a", v) -- Lua 5.3.1
end
if tonumber(s)~=v then
s = string.format("%.13a", v) -- Lua 5.3.0
end
return write(s)
end
elseif t=='boolean' then
if v then
return write('true')
else
return write('false')
end
elseif t=='nil' then
return write('nil')
elseif t=='table' then
return dumptable(v, write, level, refs, format)
else
return nil,"unsupported value type '"..t.."'"
end
end
local lua_keywords = {
['and'] = true,
['break'] = true,
['do'] = true,
['else'] = true,
['elseif'] = true,
['end'] = true,
['false'] = true,
['for'] = true,
['function'] = true,
['if'] = true,
['in'] = true,
['local'] = true,
['nil'] = true,
['not'] = true,
['or'] = true,
['repeat'] = true,
['return'] = true,
['then'] = true,
['true'] = true,
['until'] = true,
['while'] = true,
}
local function dumppair(k, v, write, level, refs, format, last_key)
if refs and refs[v] and refs[v].link then
v = refs[v].link
end
local success,err,assignment
if format=='compact' then
assignment = "="
else
success,err = write(("\t"):rep(level))
if not success then return nil,err end
assignment = " = "
end
local tk = type(k)
if tk=='string' and k:match("^[_a-zA-Z][_a-zA-Z0-9]*$") and not lua_keywords[k] then
success,err = write(k)
if not success then return nil,err end
elseif tk=='string' or tk=='number' or tk=='boolean' then
success,err = write('[')
if not success then return nil,err end
success,err = dumpvalue(k, write, level, refs, format, true)
if not success then return nil,err end
success,err = write(']')
if not success then return nil,err end
elseif tk=='nil' then
-- we are in the array part
assignment = ""
else
error("unsupported key type '"..type(k).."'")
end
success,err = write(assignment)
if not success then return nil,err end
success,err = dumpvalue(v, write, level, refs, format, false)
if not success then return nil,err end
if format=='compact' then
if last_key then
success,err = true
else
success,err = write(",")
end
else
success,err = write(",\n")
end
if not success then return nil,err end
return true
end
local function keycomp(a, b)
local ta,tb = type(a),type(b)
if ta==tb then
return a < b
else
return ta=='string'
end
end
local tsort = table.sort
local function ksort(keys)
local skeys = {}
for k in pairs(keys) do skeys[#skeys+1] = k end
tsort(skeys, keycomp)
return skeys
end
local function dumptablesection(table, write, level, keys, state, refs, format, last_key)
for _,k in ipairs(keys) do
local v = table[k]
if state then
state.i = state.i + 1
if state.i % state.size == 0 then
local success,err = write(state.sep)
if not success then return nil,err end
end
end
local success,err = dumppair(k, v, write, level, refs, format, k==last_key or state and state.i % state.size == state.size - 1)
if not success then return nil,err end
end
return true
end
local function dumptableimplicitsection(table, write, level, state, refs, format, last_key)
for k,v in ipairs(table) do
if state then
state.i = state.i + 1
if state.i % state.size == 0 then
local success,err = write(state.sep)
if not success then return nil,err end
state.explicit = true
end
end
local success,err
if state and state.explicit then
success,err = dumppair(k, v, write, level, refs, format, k==last_key or state.i % state.size == state.size - 1)
else
success,err = dumppair(nil, v, write, level, refs, format, k==last_key or state and state.i % state.size == state.size - 1)
end
if not success then return nil,err end
end
return true
end
function dumptablecontent(table, write, level, groupsize, groupsep, refs, format)
-- order of groups:
-- - explicit keys
-- - keys with simple values
-- - keys with structure values (table with only explicit keys)
-- - keys with mixed values (table with both exiplicit and implicit keys)
-- - keys with array values (table with only implicit keys)
-- - set part (explicit key with boolean value)
-- - implicit keys
-- order within a group:
-- - string keys in lexicographic order
-- - numbers in increasing order
-- :TODO: handle tables as keys
-- :TODO: handle sets
-- extract implicit keys
local implicit = {}
local last_implicit_key
for k,v in ipairs(table) do
implicit[k] = true
last_implicit_key = k
end
-- categorize explicit keys
local simples = {}
local structures = {}
local mixeds = {}
local arrays = {}
for k,v in pairs(table) do
if not implicit[k] then
if type(v)=='table' then
if v[1]==nil then
structures[k] = true
else
local implicit = {}
for k in ipairs(v) do
implicit[k] = true
end
local mixed = false
for k in pairs(v) do
if not implicit[k] then
mixed = true
break
end
end
if mixed then
mixeds[k] = true
else
arrays[k] = true
end
end
else
simples[k] = true
end
end
end
-- sort keys
simples = ksort(simples)
structures = ksort(structures)
mixeds = ksort(mixeds)
arrays = ksort(arrays)
-- find last key
local last_key = last_implicit_key
if last_key==nil then last_key = arrays[#arrays] end
if last_key==nil then last_key = mixeds[#mixeds] end
if last_key==nil then last_key = structures[#structures] end
if last_key==nil then last_key = simples[#simples] end
local success,err,state
if groupsize and groupsep then
state = {
i = 0,
size = groupsize,
sep = groupsep,
}
end
success,err = dumptablesection(table, write, level, simples, state, refs, format, last_key)
if not success then return nil,err end
success,err = dumptablesection(table, write, level, structures, state, refs, format, last_key)
if not success then return nil,err end
success,err = dumptablesection(table, write, level, mixeds, state, refs, format, last_key)
if not success then return nil,err end
success,err = dumptablesection(table, write, level, arrays, state, refs, format, last_key)
if not success then return nil,err end
success,err = dumptableimplicitsection(table, write, level, state, refs, format, last_key)
if not success then return nil,err end
return true
end
local function ref_helper(processed, pending, cycles, refs, value, parent, key, path)
if type(value)=='table' then
local vrefs = refs[value]
if not vrefs then
vrefs = {
value = value,
}
refs[value] = vrefs
end
table.insert(vrefs, {parent=parent, key=key})
if pending[value] then
cycles[value] = {pending[value], {key, path}}
return
end
if not processed[value] then
local path = {key, path}
processed[value] = true
pending[value] = path
for k,v in pairs(value) do
ref_helper(processed, pending, cycles, refs, k, value, nil, path)
ref_helper(processed, pending, cycles, refs, v, value, k, path)
end
pending[value] = nil
-- only assign an index once the children have one
refs.last = refs.last + 1
vrefs.index = refs.last
end
end
end
local prefixes = {
table = 't',
['function'] = 'f',
thread = 'c',
userdata = 'u',
}
local function check_refs(root)
local processed = {}
local pending = {}
local cycles = {}
local refs = {last=0}
ref_helper(processed, pending, cycles, refs, root, nil, nil)
refs.last = nil
for value,vrefs in pairs(refs) do
if #vrefs==1 then
refs[value] = nil
end
end
return cycles,refs
end
local function dumprefs(refs, file, last)
if not last then last = {0} end
if next(refs) then
-- order the values from last to first discovered according to .index
local refs2 = {}
for value,vrefs in pairs(refs) do
assert(vrefs.value == value)
table.insert(refs2, vrefs)
end
table.sort(refs2, function(a, b) return a.index < b.index end)
-- check all references
for _,vrefs in ipairs(refs2) do
for _,ref in ipairs(vrefs) do
assert(ref.parent, "reference has no parent") -- this should trigger a cycle error earlier
assert(ref.key~=nil, "not yet implemented") -- tables as keys
end
end
-- generate an id and a link
for i,vrefs in ipairs(refs2) do
vrefs.id = prefixes[type(vrefs.value)]..tostring(i)
vrefs.link = setmetatable({}, {__dump=vrefs.id})
end
-- dump shared values
for _,vrefs in ipairs(refs2) do
local success,err = file:write("local "..vrefs.id.." = ")
if not success then return nil,err end
success,err = dumpvalue(vrefs.value, function(...) return file:write(...) end, 0, refs, 'default', false)
if not success then return nil,err end
success,err = file:write("\n")
if not success then return nil,err end
end
end
return true
end
local function cycle_paths(cycles)
local paths = {}
for _,path_pair in pairs(cycles) do
local top,bottom = path_pair[1],path_pair[2]
local root = {}
local cycle = {}
local it = bottom
while it~=top do
table.insert(cycle, 1, it[1])
it = it[2]
end
while it and it[1] do
table.insert(root, 1, it[1])
it = it[2]
end
table.insert(paths, {root, cycle})
end
return paths
end
function _M.tostring(value, format, ignore_refs)
if type(format)=='boolean' then ignore_refs,format = format,ignore_refs end
if not format then format = 'default' end
local cycles,refs = check_refs(value)
if next(cycles) then
return nil,"cycles in value",cycle_paths(cycles)
end
if next(refs) and not ignore_refs then
return nil,"mutable values (tables) with multiple references"
end
local t = {}
local success,err = dumpvalue(value, function(str) table.insert(t, str); return true end, 0, refs, format, false)
if not success then return nil,err end
return table.concat(t)
end
function _M.tofile(value, file)
local cycles,refs = check_refs(value)
if next(cycles) then
return nil,"cycles in value",cycle_paths(cycles)
end
local filename
if type(file)=='string' then
filename = file
file = nil
end
local success,err
if filename then
file,err = io.open(filename, 'wb')
if not file then return nil,err end
end
success,err = dumprefs(refs, file)
if not success then return nil,err end
success,err = file:write"return "
if not success then return nil,err end
success,err = dumpvalue(value, function(...) return file:write(...) end, 0, refs, 'default', false)
if not success then return nil,err end
success,err = file:write("\n-- v".."i: ft=lua\n")
if not success then return nil,err end
if filename then
success,err = file:close()
if not success then return nil,err end
end
return true
end
function _M.toscript(value)
local file = {}
function file:write(str)
self[#self+1] = str
return true
end
local success,err,extra = _M.tofile(value, file)
if not success then return nil,err,extra end
return table.concat(file)
end
function _M.tofile_safe(value, filename, oldsuffix)
local lfs = require 'lfs'
if oldsuffix and lfs.attributes(filename, 'mode') then
local i,suffix = 0,oldsuffix
while io.open(filename..suffix, "rb") do
i = i+1
suffix = oldsuffix..i
end
assert(os.rename(filename, filename..suffix))
end
local tmpfilename = filename..'.new'
local err,file,success
file,err = io.open(tmpfilename, "wb")
if not file then return nil,err end
success,err,extra = _M.tofile(value, file)
if not success then
file:close()
os.remove(tmpfilename)
return nil,err,extra
end
success,err = file:close()
if not success then
os.remove(tmpfilename)
return nil,err
end
if lfs.attributes(filename, 'mode') then
assert(os.remove(filename))
end
assert(os.rename(tmpfilename, filename))
return true
end
if _NAME=='test' then
require 'test'
local load_
if _VERSION=="Lua 5.1" then
load_ = function(str) return assert(loadstring(str))() end
elseif _VERSION=="Lua 5.2" or _VERSION=="Lua 5.3" then
load_ = function(str) return assert(load(str))() end
else
error("unsupported Lua version")
end
-- some simple values
expect([["\000\001\007\t\n\r\014\031 !~\127]].."\128\129\254\255"..[["]],
_M.tostring(string.char(0, 1, 7, 9, 10, 13, 14, 31, 32, 33, 126, 127, 128, 129, 254, 255)))
expect('0/0', _M.tostring(0/0))
expect('1/0', _M.tostring(1/0))
expect('-1/0', _M.tostring(-1/0))
expect("[[\nfoo\nbar\nbaz]]", _M.tostring("foo\nbar\nbaz"))
expect("[[\nfoo\n\tbar\nbaz]]", _M.tostring("foo\n\tbar\nbaz"))
expect("[=[\nfoo\nbar[bar[bar]]\nbaz]=]", _M.tostring("foo\nbar[bar[bar]]\nbaz"))
local value = -0.00223606797749979
expect(value, tonumber(_M.tostring(value)))
-- some numbers get damaged by the regular tostring
local value = 0.05 * math.cos(math.pi / 2)
assert(tonumber(tostring(value))~=value)
expect(value, tonumber(_M.tostring(value)))
-- decimal approximations should be shown as decimal
local value = 51.6409
expect("51.6409", _M.tostring(value))
-- a complete file showing key ordering
local str = [[
return {
Abc = false,
FOO = 42,
Foo = "42",
abc = true,
["f O"] = 42,
fOO = 42,
foo = "42",
[-1] = 37,
[0] = 37,
[42] = 37,
Bar = {
foo = 142,
},
bar = {
foo = 142,
},
Baz = {
foo = 242,
237,
},
baz = {
foo = 242,
237,
},
Baf = {
337,
},
baf = {
337,
},
37,
}
-- v]]..[[i: ft=lua
]]
local t = load_(str)
local filename = os.tmpname()
if pcall(require, 'lfs') then
assert(_M.tofile_safe(t, filename))
else
assert(_M.tofile(t, filename))
end
local file = assert(io.open(filename, "rb"))
local content = assert(file:read"*a")
assert(file:close())
expect(str, content)
local str2 = assert(_M.tostring(t))
expect(content:sub(8, -16), str2)
-- compact tostring
expect([[{Abc=false,FOO=42,Foo="42",abc=true,["f O"]=42,fOO=42,foo="42",[-1]=37,[0]=37,[42]=37,Bar={foo=142},bar={foo=142},Baz={foo=242,237},baz={foo=242,237},Baf={337},baf={337},37}]], _M.tostring(t, 'compact'))
-- toscript
expect(str, _M.toscript(t))
-- cycle detection
local t = {}
t[1] = t
local value,msg,extra = _M.tostring(t)
expect(nil, value)
expect('string', type(msg))
expect({{{}, {1}}}, extra)
local value,msg,extra = _M.toscript(t)
expect(nil, value)
expect('string', type(msg))
expect({{{}, {1}}}, extra)
local t = {}
t[1] = {}
t[1].a = {}
t[1].a[true] = t[1]
local value,msg,extra = _M.tostring(t)
expect({{{1}, {'a', true}}}, extra)
local value,msg,extra = _M.toscript(t)
expect({{{1}, {'a', true}}}, extra)
local t = {}
t[1] = {}
t[1].a = {}
t[1].a[true] = t
local value,msg,extra = _M.tostring(t)
expect({{{}, {1, 'a', true}}}, extra)
local value,msg,extra = _M.toscript(t)
expect({{{}, {1, 'a', true}}}, extra)
-- shared refs support
local t1 = {}
local t = {t1, t1}
local value,msg = _M.tostring(t)
expect(nil, value)
expect('string', type(msg))
local value,msg = _M.toscript(t)
expect('string', type(value))
local value,msg = _M.tostring(t, true)
expect('string', type(value))
-- BFS correctness
local t1 = {"foo"}
local t2 = {{t1}}
local t = {t1, t2, t2}
local filename = os.tmpname()
assert(_M.tofile(t, filename))
local T = dofile(filename)
expect("foo", T[2][1][1][1])
assert(T[2]==T[3])
assert(T[2][1][1]==T[1])
-- the original data should be preserved
local t1 = {"foo"}
local t2 = {{t1}}
local t = {t1, t2, t2}
local filename = os.tmpname()
assert(_M.tofile(t, filename))
assert(t[2])
assert(t[2][1])
assert(t[2][1][1])
expect("foo", t[2][1][1][1])
assert(t[2]==t[3])
assert(t[2][1][1]==t[1])
-- long tables
local t = {}
for i=1,_M.groupsize + 1 do
t[i] = 0
end
local str = _M.tostring(t)
assert(type(str)=='string')
local t2 = load_("return "..str)
expect(_M.groupsize + 1, #t2)
for i=1,_M.groupsize + 1 do
expect(0, t2[i])
end
local str = _M.tostring(t, 'compact')
assert(type(str)=='string')
local t2 = load_("return "..str)
expect(_M.groupsize + 1, #t2)
for i=1,_M.groupsize + 1 do
expect(0, t2[i])
end
expect("(function()local t={function()return{"..string.rep("0,", _M.groupsize-2).."0}end,function()return{[".._M.groupsize.."]=0,["..(_M.groupsize+1).."]=0}end}local r={}for _,f in ipairs(t) do for k,v in pairs(f()) do r[k]=v end end return r end)()", str)
print("all tests passed successfully")
end
return _M
-- Oscar is an OSCillation AnalyzeR for use with Golly.
-- Author: Andrew Trevorrow (andrew@trevorrow.com), Mar 2016.
--
-- This script uses Gabriel Nivasch's "keep minima" algorithm.
-- For each generation, calculate a hash value for the pattern. Keep all of
-- the record-breaking minimal hashes in a list, with the oldest first.
-- For example, after 5 generations the saved hash values might be:
--
-- 8 12 16 24 25,
--
-- If the next hash goes down to 13 then the list can be shortened:
--
-- 8 12 13.
--
-- If the current hash matches one of the saved hashes, it is highly likely
-- the pattern is oscillating. By keeping a corresponding list of generation
-- counts we can calculate the period. We also keep lists of population
-- counts and bounding boxes to reduce the chance of spurious oscillator
-- detection due to hash collisions. The bounding box info also allows us
-- to detect moving oscillators (spaceships/knightships).
--
-- Modified by Arie Paap to checkpoint at regular intervals and prevent
-- patterns reaching the +/- 1E9 boundary (beyond which LtL patterns fail)
local g = golly()
local dump = require 'dump'
-- initialize lists
local hashlist = {} -- for pattern hash values
local genlist = {} -- corresponding generation counts
local poplist = {} -- corresponding population counts
local boxlist = {} -- corresponding bounding boxes
-- keep track of pattern shifts and checkpoint state
--local cpfilename = g.getdir("data").."oscar_state.bak"
local cpfilename = "oscar_state.bak"
local cpinterval = 1000000
local cpoffsetx = 0
local cpoffsety = 0
-- check if outer-totalistic rule has B0 but not S8
local r = g.getrule()
r = string.match(r, "^(.+):") or r
local hasB0notS8 = r:find("B0") == 1 and r:find("/") > 1 and r:sub(-1,-1) ~= "8"
--------------------------------------------------------------------------------
local function show_spaceship_speed(period, deltax, deltay)
-- we found a moving oscillator
if deltax == deltay or deltax == 0 or deltay == 0 then
local speed = ""
if deltax == 0 or deltay == 0 then
-- orthogonal spaceship
if deltax > 1 or deltay > 1 then
speed = speed..(deltax + deltay)
end
else
-- diagonal spaceship (deltax == deltay)
if deltax > 1 then
speed = speed..deltax
end
end
if period == 1 then
g.show("Spaceship detected (speed = "..speed.."c)")
else
g.show("Spaceship detected (speed = "..speed.."c/"..period..")")
end
else
-- deltax != deltay and both > 0
local speed = deltay..","..deltax
if period == 1 then
g.show("Knightship detected (speed = "..speed.."c)")
else
g.show("Knightship detected (speed = "..speed.."c/"..period..")")
end
end
end
--------------------------------------------------------------------------------
local function oscillating()
-- return true if the pattern is empty, stable or oscillating
-- first get current pattern's bounding box
local pbox = g.getrect()
if #pbox == 0 then
g.show("The pattern is empty.")
return true
end
local h = g.hash(pbox)
-- account for offset
pbox[1] = pbox[1] + cpoffsetx
pbox[2] = pbox[2] + cpoffsety
-- determine where to insert h into hashlist
local pos = 1
local listlen = #hashlist
while pos <= listlen do
if h > hashlist[pos] then
pos = pos + 1
elseif h < hashlist[pos] then
-- shorten lists and append info below
for i = 1, listlen - pos + 1 do
table.remove(hashlist)
table.remove(genlist)
table.remove(poplist)
table.remove(boxlist)
end
break
else
-- h == hashlist[pos] so pattern is probably oscillating, but just in
-- case this is a hash collision we also compare pop count and box size
local rect = boxlist[pos]
if tonumber(g.getpop()) == poplist[pos] and pbox[3] == rect[3] and pbox[4] == rect[4] then
local period = tonumber(g.getgen()) - genlist[pos]
if hasB0notS8 and (period % 2) > 0 and
pbox[1] == rect[1] and pbox[2] == rect[2] and
pbox[3] == rect[3] and pbox[4] == rect[4] then
-- ignore this hash value because B0-and-not-S8 rules are
-- emulated by using different rules for odd and even gens,
-- so it's possible to have identical patterns at gen G and
-- gen G+p if p is odd
return false
end
if pbox[1] == rect[1] and pbox[2] == rect[2] and
pbox[3] == rect[3] and pbox[4] == rect[4] then
-- pattern hasn't moved
if period == 1 then
g.show("The pattern is stable.")
else
g.show("Oscillator detected (period = "..period..")")
end
else
local deltax = math.abs(rect[1] - pbox[1])
local deltay = math.abs(rect[2] - pbox[2])
show_spaceship_speed(period, deltax, deltay)
end
return true
else
-- look at next matching hash value or insert if no more
pos = pos + 1
end
end
end
-- store hash/gen/pop/box info at same position in various lists
table.insert(hashlist, pos, h)
table.insert(genlist, pos, tonumber(g.getgen()))
table.insert(poplist, pos, tonumber(g.getpop()))
table.insert(boxlist, pos, pbox)
return false
end
--------------------------------------------------------------------------------
local function fit_if_not_visible()
-- fit pattern in viewport if not empty and not completely visible
local r = g.getrect()
if #r > 0 and not g.visrect(r) then g.fit() end
end
--------------------------------------------------------------------------------
local function save_checkpoint()
-- shift the current pattern to the origin and save the current state
local r = g.getrect()
cpoffsetx = cpoffsetx + r[1]
cpoffsety = cpoffsety + r[2]
local pattern = g.getcells(r)
if #r > 0 then
g.select(g.getrect())
g.clear(0)
g.select({})
end
pattern = g.transform(pattern, -r[1], -r[2])
g.putcells(pattern)
local oscarstate = {
hashlist = hashlist,
genlist = genlist,
poplist = poplist,
boxlist = boxlist,
cpoffsetx = cpoffsetx,
cpoffsety = cpoffsety,
rule = g.getrule(),
pattern = pattern
}
local f = io.open(cpfilename, "w")
if f then
dump.tofile(oscarstate, f)
f:close()
else
g.warn("Can't save state to checkpoint file:\n"..cpfilename)
end
end
--------------------------------------------------------------------------------
local function load_checkpoint()
-- load current state from the last checkpoint
local oscarstate = dofile(cpfilename)
hashlist = oscarstate["hashlist"]
genlist = oscarstate["genlist"]
poplist = oscarstate["poplist"]
boxlist = oscarstate["boxlist"]
cpoffsetx = oscarstate["cpoffsetx"]
cpoffsety = oscarstate["cpoffsety"]
g.new("oscar")
g.setrule(oscarstate["rule"])
g.putcells(oscarstate["pattern"])
local gen = tonumber(genlist[#genlist]) + 1
g.setgen(tostring(gen))
return true
end
--------------------------------------------------------------------------------
-- Check for previous state file to resume from
local f=io.open(cpfilename,"r")
if f~=nil then
local resume = g.getstring("Resume previous oscar analysis from file "..
cpfilename.." (y/n)?", "y", "Resume oscar")
if resume:lower():sub(1,1) == "y" then
local res = load_checkpoint()
if not res then
g.warn("Failed to load state from checkpoint file:\n"..cpfilename)
end
end
f:close()
end
g.show("Checking for oscillation... (hit escape to abort)")
local oldsecs = os.clock()
while not oscillating() do
g.run(1)
local newsecs = os.clock()
if newsecs - oldsecs >= 1.0 then -- show pattern every second
oldsecs = newsecs
fit_if_not_visible()
g.update()
end
if (genlist[#genlist] + 1) % cpinterval == 0 then
save_checkpoint()
end
end
fit_if_not_visible()
-- remove the state file
--res, msg = os.remove(cpfilename)
--if not res then
-- g.warn("Failed to remove checkpoint file: "..cpfilename.." "..msg)
--end
return {
cpoffsetx = 8486761655,
cpoffsety = 8486761655,
rule = "R50,C0,M1,S3334..5193,B3025..6154,NM",
boxlist = {
{
1088907996,
1088907996,
98,
98,
},
{
1774918661,
1774918661,
97,
97,
},
{
2247273986,
2247273986,
98,
98,
},
{
2725460534,
2725460534,
97,
97,
},
{
2771158632,
2771158632,
97,
97,
},
{
2799149258,
2799149258,
99,
99,
},
{
3495258039,
3495258039,
97,
97,
},
{
3593418687,
3593418687,
97,
97,
},
{
4156799895,
4156799895,
99,
99,
},
{
4238771156,
4238771156,
97,
97,
},
{
4311282113,
4311282113,
96,
96,
},
{
4990892966,
4990892966,
98,
98,
},
{
5026483378,
5026483378,
97,
97,
},
{
5499142744,
5499142744,
100,
100,
},
{
5724077306,
5724077306,
98,
98,
},
{
5912427970,
5912427970,
97,
97,
},
{
6046072083,
6046072083,
98,
98,
},
{
6188248964,
6188248964,
97,
97,
},
{
6921488344,
6921488344,
99,
99,
},
{
7665917464,
7665917464,
98,
98,
},
{
7781564784,
7781564784,
97,
97,
},
{
7875092923,
7875092923,
99,
99,
},
{
7974025352,
7974025352,
97,
97,
},
{
7980213535,
7980213535,
97,
97,
},
{
8154138738,
8154138738,
98,
98,
},
{
8169889679,
8169889679,
99,
99,
},
{
8281396408,
8281396408,
97,
97,
},
{
8340648694,
8340648694,
99,
99,
},
{
8375738247,
8375738247,
97,
97,
},
{
8388159377,
8388159377,
99,
99,
},
{
8415645576,
8415645576,
97,
97,
},
{
8442748355,
8442748355,
99,
99,
},
{
8458870281,
8458870281,
99,
99,
},
{
8464824180,
8464824180,
98,
98,
},
{
8473165096,
8473165096,
97,
97,
},
{
8480965742,
8480965742,
97,
97,
},
{
8481463258,
8481463258,
99,
99,
},
{
8484458333,
8484458333,
97,
97,
},
{
8484807938,
8484807938,
99,
99,
},
{
8485282117,
8485282117,
100,
100,
},
{
8485961059,
8485961059,
97,
97,
},
{
8486752892,
8486752892,
100,
100,
},
{
8486757119,
8486757119,
99,
99,
},
{
8486758907,
8486758907,
99,
99,
},
{
8486761493,
8486761493,
100,
100,
},
{
8486761615,
8486761615,
99,
99,
},
{
8486761652,
8486761652,
98,
98,
},
{
8486761654,
8486761654,
97,
97,
},
{
8486761655,
8486761655,
99,
99,
},
{
8486761655,
8486761655,
97,
97,
},
},
genlist = {
6002114894,
9783446547,
12387147534,
15022954665,
15274860727,
15429156282,
19266181951,
19807245853,
22912703202,
23364526055,
23764220173,
27510380607,
27706551859,
30311929734,
31551762390,
32589960001,
33326629692,
34110334083,
38152048988,
42255412079,
42892883907,
43408440256,
43953761499,
43987868819,
44946549291,
45033369894,
45648009175,
45974615600,
46168029683,
46236492976,
46387994959,
46537384404,
46626250696,
46659070276,
46705048837,
46748048947,
46750791300,
46767300993,
46769227892,
46771841916,
46775585639,
46779951576,
46779974960,
46779984872,
46779999118,
46779999774,
46779999978,
46779999995,
46779999996,
46779999999,
},
hashlist = {
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483648,
-2147483646,
-2147483634,
-2147483634,
-2147483608,
-2147483582,
-2147483550,
-2147483360,
-2147483232,
-2147482778,
-2147482610,
-2147482416,
-2147481508,
-2147480664,
-2147360204,
-2147359156,
-2147350774,
-2143289228,
-2118266758,
-1800875424,
-1399221046,
-871204854,
},
pattern = (function()
local t = { function() return {
42,
0,
43,
0,
44,
0,
39,
1,
40,
1,
36,
2,
37,
2,
38,
2,
40,
2,
34,
3,
35,
3,
36,
3,
37,
3,
38,
3,
39,
3,
40,
3,
33,
4,
34,
4,
36,
4,
37,
4,
38,
4,
39,
4,
40,
4,
41,
4,
42,
4,
31,
5,
32,
5,
34,
5,
36,
5,
37,
5,
38,
5,
39,
5,
40,
5,
41,
5,
42,
5,
43,
5,
44,
5,
45,
5,
46,
5,
47,
5,
48,
5,
49,
5,
50,
5,
51,
5,
32,
6,
34,
6,
35,
6,
36,
6,
37,
6,
39,
6,
40,
6,
41,
6,
42,
6,
43,
6,
44,
6,
45,
6,
46,
6,
47,
6,
48,
6,
49,
6,
50,
6,
51,
6,
52,
6,
53,
6,
54,
6,
55,
6,
56,
6,
66,
6,
30,
7,
34,
7,
35,
7,
37,
7,
38,
7,
39,
7,
40,
7,
41,
7,
42,
7,
43,
7,
44,
7,
45,
7,
46,
7,
47,
7,
48,
7,
49,
7,
50,
7,
51,
7,
52,
7,
53,
7,
54,
7,
55,
7,
56,
7,
57,
7,
58,
7,
67,
7,
68,
7,
29,
8,
30,
8,
32,
8,
35,
8,
36,
8,
37,
8,
38,
8,
39,
8,
40,
8,
41,
8,
42,
8,
43,
8,
44,
8,
45,
8,
46,
8,
47,
8,
48,
8,
49,
8,
50,
8,
51,
8,
52,
8,
53,
8,
54,
8,
55,
8,
56,
8,
57,
8,
58,
8,
59,
8,
60,
8,
68,
8,
69,
8,
29,
9,
30,
9,
33,
9,
34,
9,
35,
9,
36,
9,
37,
9,
38,
9,
39,
9,
40,
9,
41,
9,
42,
9,
43,
9,
44,
9,
45,
9,
46,
9,
47,
9,
48,
9,
49,
9,
50,
9,
51,
9,
52,
9,
53,
9,
54,
9,
55,
9,
56,
9,
57,
9,
58,
9,
59,
9,
60,
9,
61,
9,
62,
9,
69,
9,
70,
9,
26,
10,
27,
10,
29,
10,
32,
10,
33,
10,
34,
10,
35,
10,
36,
10,
37,
10,
38,
10,
39,
10,
40,
10,
41,
10,
42,
10,
43,
10,
44,
10,
45,
10,
46,
10,
47,
10,
48,
10,
49,
10,
50,
10,
51,
10,
52,
10,
53,
10,
54,
10,
55,
10,
56,
10,
57,
10,
58,
10,
59,
10,
60,
10,
61,
10,
62,
10,
63,
10,
64,
10,
70,
10,
71,
10,
25,
11,
27,
11,
28,
11,
30,
11,
31,
11,
32,
11,
33,
11,
34,
11,
35,
11,
36,
11,
37,
11,
38,
11,
39,
11,
40,
11,
41,
11,
42,
11,
43,
11,
44,
11,
45,
11,
46,
11,
47,
11,
48,
11,
49,
11,
50,
11,
51,
11,
52,
11,
53,
11,
54,
11,
55,
11,
56,
11,
57,
11,
58,
11,
59,
11,
60,
11,
61,
11,
62,
11,
63,
11,
64,
11,
65,
11,
66,
11,
71,
11,
72,
11,
23,
12,
24,
12,
25,
12,
26,
12,
29,
12,
30,
12,
31,
12,
32,
12,
33,
12,
34,
12,
35,
12,
36,
12,
37,
12,
38,
12,
39,
12,
40,
12,
41,
12,
42,
12,
43,
12,
44,
12,
45,
12,
46,
12,
47,
12,
48,
12,
49,
12,
50,
12,
51,
12,
52,
12,
53,
12,
54,
12,
55,
12,
56,
12,
57,
12,
58,
12,
59,
12,
60,
12,
61,
12,
62,
12,
63,
12,
64,
12,
65,
12,
66,
12,
67,
12,
72,
12,
73,
12,
21,
13,
22,
13,
23,
13,
24,
13,
25,
13,
26,
13,
27,
13,
28,
13,
29,
13,
30,
13,
31,
13,
32,
13,
33,
13,
34,
13,
35,
13,
36,
13,
37,
13,
38,
13,
39,
13,
40,
13,
41,
13,
42,
13,
43,
13,
44,
13,
45,
13,
46,
13,
47,
13,
48,
13,
49,
13,
50,
13,
51,
13,
52,
13,
53,
13,
54,
13,
55,
13,
56,
13,
57,
13,
58,
13,
59,
13,
60,
13,
61,
13,
62,
13,
63,
13,
64,
13,
65,
13,
66,
13,
67,
13,
68,
13,
69,
13,
73,
13,
74,
13,
20,
14,
21,
14,
22,
14,
23,
14,
24,
14,
25,
14,
26,
14,
27,
14,
28,
14,
29,
14,
30,
14,
31,
14,
32,
14,
33,
14,
34,
14,
35,
14,
36,
14,
37,
14,
38,
14,
39,
14,
40,
14,
41,
14,
42,
14,
43,
14,
44,
14,
45,
14,
46,
14,
47,
14,
48,
14,
49,
14,
50,
14,
51,
14,
52,
14,
53,
14,
54,
14,
55,
14,
56,
14,
57,
14,
58,
14,
59,
14,
60,
14,
61,
14,
62,
14,
63,
14,
64,
14,
65,
14,
66,
14,
67,
14,
68,
14,
69,
14,
70,
14,
74,
14,
75,
14,
19,
15,
20,
15,
21,
15,
22,
15,
23,
15,
24,
15,
25,
15,
26,
15,
27,
15,
28,
15,
29,
15,
30,
15,
31,
15,
32,
15,
33,
15,
34,
15,
35,
15,
36,
15,
37,
15,
38,
15,
39,
15,
40,
15,
41,
15,
42,
15,
43,
15,
44,
15,
45,
15,
46,
15,
47,
15,
48,
15,
49,
15,
50,
15,
51,
15,
52,
15,
53,
15,
54,
15,
55,
15,
56,
15,
57,
15,
58,
15,
59,
15,
60,
15,
61,
15,
62,
15,
63,
15,
64,
15,
65,
15,
66,
15,
67,
15,
68,
15,
69,
15,
70,
15,
71,
15,
72,
15,
75,
15,
76,
15,
18,
16,
19,
16,
20,
16,
21,
16,
22,
16,
23,
16,
24,
16,
25,
16,
26,
16,
27,
16,
28,
16,
29,
16,
30,
16,
31,
16,
32,
16,
33,
16,
34,
16,
35,
16,
36,
16,
37,
16,
38,
16,
39,
16,
40,
16,
41,
16,
42,
16,
43,
16,
44,
16,
45,
16,
46,
16,
47,
16,
48,
16,
49,
16,
50,
16,
51,
16,
52,
16,
53,
16,
54,
16,
55,
16,
56,
16,
57,
16,
58,
16,
59,
16,
60,
16,
61,
16,
62,
16,
63,
16,
64,
16,
65,
16,
66,
16,
67,
16,
68,
16,
69,
16,
70,
16,
71,
16,
72,
16,
73,
16,
76,
16,
77,
16,
17,
17,
18,
17,
19,
17,
20,
17,
21,
17,
22,
17,
23,
17,
24,
17,
25,
17,
26,
17,
27,
17,
28,
17,
29,
17,
30,
17,
31,
17,
32,
17,
33,
17,
34,
17,
35,
17,
36,
17,
37,
17,
38,
17,
39,
17,
40,
17,
41,
17,
42,
17,
43,
17,
44,
17,
45,
17,
46,
17,
47,
17,
48,
17,
49,
17,
50,
17,
51,
17,
52,
17,
53,
17,
54,
17,
55,
17,
56,
17,
57,
17,
58,
17,
59,
17,
60,
17,
61,
17,
62,
17,
63,
17,
64,
17,
65,
17,
66,
17,
67,
17,
68,
17,
69,
17,
70,
17,
71,
17,
72,
17,
73,
17,
74,
17,
77,
17,
78,
17,
16,
18,
17,
18,
18,
18,
19,
18,
20,
18,
21,
18,
22,
18,
23,
18,
24,
18,
25,
18,
26,
18,
27,
18,
28,
18,
29,
18,
30,
18,
31,
18,
32,
18,
33,
18,
34,
18,
35,
18,
36,
18,
37,
18,
38,
18,
39,
18,
40,
18,
41,
18,
42,
18,
43,
18,
44,
18,
45,
18,
46,
18,
47,
18,
48,
18,
49,
18,
50,
18,
51,
18,
52,
18,
53,
18,
54,
18,
55,
18,
56,
18,
57,
18,
58,
18,
59,
18,
60,
18,
61,
18,
62,
18,
63,
18,
64,
18,
65,
18,
66,
18,
67,
18,
68,
18,
69,
18,
70,
18,
71,
18,
72,
18,
73,
18,
74,
18,
75,
18,
76,
18,
78,
18,
79,
18,
15,
19,
16,
19,
17,
19,
18,
19,
19,
19,
20,
19,
21,
19,
22,
19,
23,
19,
24,
19,
25,
19,
26,
19,
27,
19,
28,
19,
29,
19,
30,
19,
31,
19,
32,
19,
33,
19,
34,
19,
35,
19,
36,
19,
37,
19,
38,
19,
39,
19,
40,
19,
41,
19,
42,
19,
43,
19,
44,
19,
45,
19,
46,
19,
47,
19,
48,
19,
49,
19,
50,
19,
51,
19,
52,
19,
53,
19,
54,
19,
55,
19,
56,
19,
57,
19,
58,
19,
59,
19,
60,
19,
61,
19,
62,
19,
63,
19,
64,
19,
65,
19,
66,
19,
67,
19,
68,
19,
69,
19,
70,
19,
71,
19,
72,
19,
73,
19,
74,
19,
75,
19,
76,
19,
77,
19,
78,
19,
79,
19,
80,
19,
81,
19,
14,
20,
15,
20,
16,
20,
17,
20,
18,
20,
19,
20,
20,
20,
21,
20,
22,
20,
23,
20,
24,
20,
25,
20,
26,
20,
27,
20,
28,
20,
29,
20,
30,
20,
31,
20,
32,
20,
33,
20,
34,
20,
35,
20,
36,
20,
37,
20,
38,
20,
39,
20,
40,
20,
41,
20,
42,
20,
43,
20,
44,
20,
45,
20,
46,
20,
47,
20,
48,
20,
49,
20,
50,
20,
51,
20,
52,
20,
53,
20,
54,
20,
55,
20,
56,
20,
57,
20,
58,
20,
59,
20,
60,
20,
61,
20,
62,
20,
63,
20,
64,
20,
65,
20,
66,
20,
67,
20,
68,
20,
69,
20,
70,
20,
71,
20,
72,
20,
73,
20,
74,
20,
75,
20,
76,
20,
77,
20,
78,
20,
80,
20,
81,
20,
13,
21,
14,
21,
15,
21,
16,
21,
17,
21,
18,
21,
19,
21,
20,
21,
21,
21,
22,
21,
23,
21,
24,
21,
25,
21,
26,
21,
27,
21,
28,
21,
29,
21,
30,
21,
31,
21,
32,
21,
33,
21,
34,
21,
35,
21,
36,
21,
37,
21,
38,
21,
39,
21,
40,
21,
41,
21,
42,
21,
43,
21,
44,
21,
45,
21,
46,
21,
47,
21,
48,
21,
49,
21,
50,
21,
51,
21,
52,
21,
53,
21,
54,
21,
55,
21,
56,
21,
57,
21,
58,
21,
59,
21,
60,
21,
61,
21,
62,
21,
63,
21,
64,
21,
65,
21,
66,
21,
67,
21,
68,
21,
69,
21,
70,
21,
71,
21,
72,
21,
73,
21,
74,
21,
75,
21,
76,
21,
77,
21,
78,
21,
79,
21,
81,
21,
82,
21,
13,
22,
14,
22,
15,
22,
16,
22,
17,
22,
18,
22,
19,
22,
20,
22,
21,
22,
22,
22,
23,
22,
24,
22,
25,
22,
26,
22,
27,
22,
28,
22,
29,
22,
30,
22,
31,
22,
32,
22,
33,
22,
34,
22,
35,
22,
36,
22,
37,
22,
38,
22,
39,
22,
40,
22,
41,
22,
42,
22,
43,
22,
44,
22,
45,
22,
46,
22,
47,
22,
48,
22,
49,
22,
50,
22,
51,
22,
52,
22,
53,
22,
54,
22,
55,
22,
56,
22,
57,
22,
58,
22,
59,
22,
60,
22,
61,
22,
62,
22,
63,
22,
64,
22,
65,
22,
66,
22,
67,
22,
68,
22,
69,
22,
70,
22,
71,
22,
72,
22,
73,
22,
74,
22,
75,
22,
76,
22,
77,
22,
78,
22,
79,
22,
80,
22,
81,
22,
82,
22,
83,
22,
12,
23,
13,
23,
14,
23,
15,
23,
16,
23,
17,
23,
18,
23,
19,
23,
20,
23,
21,
23,
22,
23,
23,
23,
24,
23,
25,
23,
26,
23,
27,
23,
28,
23,
29,
23,
30,
23,
31,
23,
32,
23,
33,
23,
34,
23,
35,
23,
36,
23,
37,
23,
38,
23,
39,
23,
40,
23,
41,
23,
42,
23,
43,
23,
44,
23,
45,
23,
46,
23,
47,
23,
48,
23,
49,
23,
50,
23,
51,
23,
52,
23,
53,
23,
54,
23,
55,
23,
56,
23,
57,
23,
58,
23,
59,
23,
60,
23,
61,
23,
62,
23,
63,
23,
64,
23,
65,
23,
66,
23,
67,
23,
68,
23,
69,
23,
70,
23,
71,
23,
72,
23,
73,
23,
74,
23,
75,
23,
76,
23,
77,
23,
78,
23,
79,
23,
80,
23,
81,
23,
82,
23,
83,
23,
84,
23,
12,
24,
13,
24,
14,
24,
15,
24,
16,
24,
17,
24,
18,
24,
19,
24,
20,
24,
21,
24,
22,
24,
23,
24,
24,
24,
25,
24,
26,
24,
27,
24,
28,
24,
29,
24,
30,
24,
31,
24,
32,
24,
33,
24,
34,
24,
35,
24,
36,
24,
37,
24,
38,
24,
39,
24,
40,
24,
41,
24,
42,
24,
43,
24,
44,
24,
45,
24,
46,
24,
47,
24,
48,
24,
49,
24,
50,
24,
51,
24,
52,
24,
53,
24,
54,
24,
55,
24,
56,
24,
57,
24,
58,
24,
59,
24,
60,
24,
61,
24,
62,
24,
63,
24,
64,
24,
65,
24,
66,
24,
67,
24,
68,
24,
69,
24,
70,
24,
71,
24,
72,
24,
73,
24,
74,
24,
75,
24,
76,
24,
77,
24,
78,
24,
79,
24,
80,
24,
81,
24,
82,
24,
84,
24,
11,
25,
12,
25,
13,
25,
14,
25,
15,
25,
16,
25,
17,
25,
18,
25,
19,
25,
20,
25,
21,
25,
22,
25,
23,
25,
24,
25,
25,
25,
26,
25,
27,
25,
28,
25,
29,
25,
30,
25,
31,
25,
32,
25,
33,
25,
34,
25,
35,
25,
36,
25,
37,
25,
38,
25,
39,
25,
40,
25,
41,
25,
42,
25,
43,
25,
44,
25,
45,
25,
46,
25,
47,
25,
48,
25,
49,
25,
50,
25,
51,
25,
52,
25,
53,
25,
54,
25,
55,
25,
56,
25,
57,
25,
58,
25,
59,
25,
60,
25,
61,
25,
62,
25,
63,
25,
64,
25,
65,
25,
66,
25,
67,
25,
68,
25,
69,
25,
70,
25,
71,
25,
72,
25,
73,
25,
74,
25,
75,
25,
76,
25,
77,
25,
78,
25,
79,
25,
80,
25,
81,
25,
82,
25,
84,
25,
85,
25,
86,
25,
10,
26,
12,
26,
13,
26,
14,
26,
15,
26,
16,
26,
17,
26,
18,
26,
19,
26,
20,
26,
21,
26,
22,
26,
23,
26,
24,
26,
25,
26,
26,
26,
27,
26,
28,
26,
29,
26,
30,
26,
31,
26,
32,
26,
33,
26,
34,
26,
35,
26,
36,
26,
37,
26,
38,
26,
39,
26,
40,
26,
41,
26,
42,
26,
43,
26,
44,
26,
45,
26,
46,
26,
47,
26,
48,
26,
49,
26,
50,
26,
51,
26,
52,
26,
53,
26,
54,
26,
55,
26,
56,
26,
57,
26,
58,
26,
59,
26,
60,
26,
61,
26,
62,
26,
63,
26,
64,
26,
65,
26,
66,
26,
67,
26,
68,
26,
69,
26,
70,
26,
71,
26,
72,
26,
73,
26,
74,
26,
75,
26,
76,
26,
77,
26,
78,
26,
79,
26,
80,
26,
81,
26,
82,
26,
83,
26,
85,
26,
86,
26,
87,
26,
10,
27,
11,
27,
13,
27,
14,
27,
15,
27,
16,
27,
17,
27,
18,
27,
19,
27,
20,
27,
21,
27,
22,
27,
23,
27,
24,
27,
25,
27,
26,
27,
27,
27,
28,
27,
29,
27,
30,
27,
31,
27,
32,
27,
33,
27,
34,
27,
35,
27,
36,
27,
37,
27,
38,
27,
39,
27,
40,
27,
41,
27,
42,
27,
43,
27,
44,
27,
45,
27,
46,
27,
47,
27,
48,
27,
49,
27,
50,
27,
51,
27,
52,
27,
53,
27,
54,
27,
55,
27,
56,
27,
57,
27,
58,
27,
59,
27,
60,
27,
61,
27,
62,
27,
63,
27,
64,
27,
65,
27,
66,
27,
67,
27,
68,
27,
69,
27,
70,
27,
71,
27,
72,
27,
73,
27,
74,
27,
75,
27,
76,
27,
77,
27,
78,
27,
79,
27,
80,
27,
81,
27,
82,
27,
83,
27,
84,
27,
86,
27,
87,
27,
88,
27,
11,
28,
13,
28,
14,
28,
15,
28,
16,
28,
17,
28,
18,
28,
19,
28,
20,
28,
21,
28,
22,
28,
23,
28,
24,
28,
25,
28,
26,
28,
27,
28,
28,
28,
29,
28,
30,
28,
31,
28,
32,
28,
33,
28,
34,
28,
35,
28,
36,
28,
37,
28,
38,
28,
39,
28,
40,
28,
41,
28,
42,
28,
43,
28,
44,
28,
45,
28,
46,
28,
47,
28,
48,
28,
49,
28,
50,
28,
51,
28,
52,
28,
53,
28,
54,
28,
55,
28,
56,
28,
57,
28,
58,
28,
59,
28,
60,
28,
61,
28,
62,
28,
63,
28,
64,
28,
65,
28,
66,
28,
67,
28,
68,
28,
69,
28,
70,
28,
71,
28,
72,
28,
73,
28,
74,
28,
75,
28,
76,
28,
77,
28,
78,
28,
79,
28,
80,
28,
81,
28,
82,
28,
83,
28,
84,
28,
85,
28,
87,
28,
88,
28,
89,
28,
8,
29,
9,
29,
10,
29,
12,
29,
13,
29,
14,
29,
15,
29,
16,
29,
17,
29,
18,
29,
19,
29,
20,
29,
21,
29,
22,
29,
23,
29,
24,
29,
25,
29,
26,
29,
27,
29,
28,
29,
29,
29,
30,
29,
31,
29,
32,
29,
33,
29,
34,
29,
35,
29,
36,
29,
37,
29,
38,
29,
39,
29,
40,
29,
41,
29,
42,
29,
53,
29,
54,
29,
55,
29,
56,
29,
57,
29,
58,
29,
59,
29,
60,
29,
61,
29,
62,
29,
63,
29,
64,
29,
65,
29,
66,
29,
67,
29,
68,
29,
69,
29,
70,
29,
71,
29,
72,
29,
73,
29,
74,
29,
75,
29,
76,
29,
77,
29,
78,
29,
79,
29,
80,
29,
81,
29,
82,
29,
83,
29,
84,
29,
85,
29,
86,
29,
87,
29,
88,
29,
89,
29,
90,
29,
7,
30,
8,
30,
9,
30,
11,
30,
12,
30,
13,
30,
14,
30,
15,
30,
16,
30,
17,
30,
18,
30,
19,
30,
20,
30,
21,
30,
22,
30,
23,
30,
24,
30,
25,
30,
26,
30,
27,
30,
28,
30,
29,
30,
30,
30,
31,
30,
32,
30,
33,
30,
34,
30,
35,
30,
36,
30,
37,
30,
38,
30,
39,
30,
40,
30,
55,
30,
56,
30,
57,
30,
58,
30,
59,
30,
60,
30,
61,
30,
62,
30,
63,
30,
64,
30,
65,
30,
66,
30,
67,
30,
68,
30,
69,
30,
70,
30,
71,
30,
72,
30,
73,
30,
74,
30,
75,
30,
76,
30,
77,
30,
78,
30,
79,
30,
80,
30,
81,
30,
82,
30,
83,
30,
84,
30,
85,
30,
86,
30,
88,
30,
89,
30,
90,
30,
91,
30,
5,
31,
11,
31,
12,
31,
13,
31,
14,
31,
15,
31,
16,
31,
17,
31,
18,
31,
19,
31,
20,
31,
21,
31,
22,
31,
23,
31,
24,
31,
25,
31,
26,
31,
27,
31,
28,
31,
29,
31,
30,
31,
31,
31,
32,
31,
33,
31,
34,
31,
35,
31,
36,
31,
37,
31,
38,
31,
57,
31,
58,
31,
59,
31,
60,
31,
61,
31,
62,
31,
63,
31,
64,
31,
65,
31,
66,
31,
67,
31,
68,
31,
69,
31,
70,
31,
71,
31,
72,
31,
73,
31,
74,
31,
75,
31,
76,
31,
77,
31,
78,
31,
79,
31,
80,
31,
81,
31,
82,
31,
83,
31,
84,
31,
85,
31,
86,
31,
87,
31,
89,
31,
90,
31,
91,
31,
92,
31,
93,
31,
5,
32,
6,
32,
8,
32,
10,
32,
11,
32,
12,
32,
13,
32,
14,
32,
15,
32,
16,
32,
17,
32,
18,
32,
19,
32,
20,
32,
21,
32,
22,
32,
23,
32,
24,
32,
25,
32,
26,
32,
27,
32,
28,
32,
29,
32,
30,
32,
31,
32,
32,
32,
33,
32,
34,
32,
35,
32,
36,
32,
37,
32,
59,
32,
60,
32,
61,
32,
62,
32,
63,
32,
64,
32,
65,
32,
66,
32,
67,
32,
68,
32,
69,
32,
70,
32,
71,
32,
72,
32,
73,
32,
74,
32,
75,
32,
76,
32,
77,
32,
78,
32,
79,
32,
80,
32,
81,
32,
82,
32,
83,
32,
84,
32,
85,
32,
86,
32,
87,
32,
88,
32,
89,
32,
90,
32,
91,
32,
92,
32,
93,
32,
4,
33,
9,
33,
10,
33,
11,
33,
12,
33,
13,
33,
14,
33,
15,
33,
16,
33,
17,
33,
18,
33,
19,
33,
20,
33,
21,
33,
22,
33,
23,
33,
24,
33,
25,
33,
26,
33,
27,
33,
28,
33,
29,
33,
30,
33,
31,
33,
32,
33,
33,
33,
34,
33,
35,
33,
36,
33,
42,
33,
43,
33,
44,
33,
45,
33,
46,
33,
48,
33,
49,
33,
60,
33,
61,
33,
62,
33,
63,
33,
64,
33,
65,
33,
66,
33,
67,
33,
68,
33,
69,
33,
70,
33,
71,
33,
72,
33,
73,
33,
74,
33,
75,
33,
76,
33,
77,
33,
78,
33,
79,
33,
80,
33,
81,
33,
82,
33,
83,
33,
84,
33,
85,
33,
86,
33,
87,
33,
88,
33,
89,
33,
90,
33,
91,
33,
92,
33,
93,
33,
94,
33,
3,
34,
4,
34,
5,
34,
6,
34,
7,
34,
9,
34,
10,
34,
11,
34,
12,
34,
13,
34,
14,
34,
15,
34,
16,
34,
17,
34,
18,
34,
19,
34,
20,
34,
21,
34,
22,
34,
23,
34,
24,
34,
25,
34,
26,
34,
27,
34,
28,
34,
29,
34,
30,
34,
31,
34,
32,
34,
33,
34,
34,
34,
35,
34,
41,
34,
42,
34,
44,
34,
45,
34,
47,
34,
48,
34,
49,
34,
61,
34,
62,
34,
63,
34,
64,
34,
65,
34,
66,
34,
67,
34,
68,
34,
69,
34,
70,
34,
71,
34,
72,
34,
73,
34,
74,
34,
75,
34,
76,
34,
77,
34,
78,
34,
79,
34,
80,
34,
81,
34,
82,
34,
83,
34,
84,
34,
85,
34,
86,
34,
87,
34,
88,
34,
89,
34,
90,
34,
91,
34,
92,
34,
93,
34,
94,
34,
3,
35,
6,
35,
7,
35,
8,
35,
9,
35,
10,
35,
11,
35,
12,
35,
13,
35,
14,
35,
15,
35,
16,
35,
17,
35,
18,
35,
19,
35,
20,
35,
21,
35,
22,
35,
23,
35,
24,
35,
25,
35,
26,
35,
27,
35,
28,
35,
29,
35,
30,
35,
31,
35,
32,
35,
33,
35,
34,
35,
39,
35,
40,
35,
41,
35,
42,
35,
43,
35,
44,
35,
45,
35,
46,
35,
47,
35,
48,
35,
49,
35,
63,
35,
64,
35,
65,
35,
66,
35,
67,
35,
68,
35,
69,
35,
70,
35,
71,
35,
72,
35,
73,
35,
74,
35,
75,
35,
76,
35,
77,
35,
78,
35,
79,
35,
80,
35,
81,
35,
82,
35,
83,
35,
84,
35,
85,
35,
86,
35,
87,
35,
88,
35,
89,
35,
90,
35,
91,
35,
92,
35,
93,
35,
94,
35,
95,
35,
2,
36,
3,
36,
4,
36,
5,
36,
6,
36,
8,
36,
9,
36,
10,
36,
11,
36,
12,
36,
13,
36,
14,
36,
15,
36,
16,
36,
17,
36,
18,
36,
19,
36,
20,
36,
21,
36,
22,
36,
23,
36,
24,
36,
25,
36,
26,
36,
27,
36,
28,
36,
29,
36,
30,
36,
31,
36,
32,
36,
33,
36,
38,
36,
39,
36,
40,
36,
41,
36,
42,
36,
43,
36,
44,
36,
46,
36,
47,
36,
48,
36,
49,
36,
64,
36,
65,
36,
66,
36,
67,
36,
68,
36,
69,
36,
70,
36,
71,
36,
72,
36,
73,
36,
74,
36,
75,
36,
76,
36,
77,
36,
78,
36,
79,
36,
80,
36,
81,
36,
82,
36,
83,
36,
84,
36,
85,
36,
86,
36,
87,
36,
88,
36,
89,
36,
90,
36,
91,
36,
92,
36,
93,
36,
94,
36,
95,
36,
96,
36,
2,
37,
3,
37,
4,
37,
5,
37,
6,
37,
7,
37,
8,
37,
9,
37,
10,
37,
11,
37,
12,
37,
13,
37,
14,
37,
15,
37,
16,
37,
17,
37,
18,
37,
19,
37,
20,
37,
21,
37,
22,
37,
23,
37,
24,
37,
25,
37,
26,
37,
27,
37,
28,
37,
29,
37,
30,
37,
31,
37,
32,
37,
37,
37,
38,
37,
39,
37,
40,
37,
41,
37,
42,
37,
43,
37,
44,
37,
45,
37,
46,
37,
47,
37,
48,
37,
49,
37,
50,
37,
51,
37,
53,
37,
65,
37,
66,
37,
67,
37,
68,
37,
69,
37,
70,
37,
71,
37,
72,
37,
73,
37,
74,
37,
75,
37,
76,
37,
77,
37,
78,
37,
79,
37,
80,
37,
81,
37,
82,
37,
83,
37,
84,
37,
85,
37,
86,
37,
87,
37,
88,
37,
89,
37,
90,
37,
91,
37,
92,
37,
93,
37,
94,
37,
95,
37,
96,
37,
2,
38,
3,
38,
4,
38,
5,
38,
7,
38,
8,
38,
9,
38,
10,
38,
11,
38,
12,
38,
13,
38,
14,
38,
15,
38,
16,
38,
17,
38,
18,
38,
19,
38,
20,
38,
21,
38,
22,
38,
23,
38,
24,
38,
25,
38,
26,
38,
27,
38,
28,
38,
29,
38,
30,
38,
31,
38,
36,
38,
37,
38,
38,
38,
39,
38,
40,
38,
41,
38,
42,
38,
43,
38,
44,
38,
45,
38,
46,
38,
47,
38,
48,
38,
49,
38,
50,
38,
51,
38,
52,
38,
66,
38,
67,
38,
68,
38,
69,
38,
70,
38,
71,
38,
72,
38,
73,
38,
74,
38,
75,
38,
76,
38,
77,
38,
78,
38,
79,
38,
80,
38,
81,
38,
82,
38,
83,
38,
84,
38,
85,
38,
86,
38,
87,
38,
88,
38,
89,
38,
90,
38,
91,
38,
92,
38,
93,
38,
94,
38,
95,
38,
96,
38,
1,
39,
3,
39,
4,
39,
5,
39,
6,
39,
7,
39,
8,
39,
9,
39,
10,
39,
11,
39,
12,
39,
13,
39,
14,
39,
15,
39,
16,
39,
17,
39,
18,
39,
19,
39,
20,
39,
21,
39,
22,
39,
23,
39,
24,
39,
25,
39,
26,
39,
27,
39,
28,
39,
29,
39,
30,
39,
35,
39,
36,
39,
37,
39,
38,
39,
39,
39,
40,
39,
41,
39,
42,
39,
43,
39,
44,
39,
45,
39,
46,
39,
47,
39,
48,
39,
49,
39,
50,
39,
51,
39,
52,
39,
53,
39,
67,
39,
68,
39,
69,
39,
70,
39,
71,
39,
72,
39,
73,
39,
74,
39,
75,
39,
76,
39,
77,
39,
78,
39,
79,
39,
80,
39,
81,
39,
82,
39,
83,
39,
84,
39,
85,
39,
86,
39,
87,
39,
88,
39,
89,
39,
90,
39,
91,
39,
92,
39,
93,
39,
94,
39,
95,
39,
96,
39,
97,
39,
1,
40,
2,
40,
3,
40,
4,
40,
5,
40,
6,
40,
7,
40,
8,
40,
9,
40,
10,
40,
11,
40,
12,
40,
13,
40,
14,
40,
15,
40,
16,
40,
17,
40,
18,
40,
19,
40,
20,
40,
21,
40,
22,
40,
23,
40,
24,
40,
25,
40,
26,
40,
27,
40,
28,
40,
29,
40,
30,
40,
35,
40,
36,
40,
37,
40,
38,
40,
39,
40,
40,
40,
41,
40,
42,
40,
43,
40,
44,
40,
45,
40,
46,
40,
47,
40,
48,
40,
49,
40,
50,
40,
51,
40,
52,
40,
53,
40,
54,
40,
67,
40,
68,
40,
69,
40,
70,
40,
71,
40,
72,
40,
73,
40,
74,
40,
75,
40,
76,
40,
77,
40,
78,
40,
79,
40,
80,
40,
81,
40,
82,
40,
83,
40,
84,
40,
85,
40,
86,
40,
87,
40,
88,
40,
89,
40,
90,
40,
91,
40,
92,
40,
93,
40,
94,
40,
95,
40,
96,
40,
97,
40,
4,
41,
5,
41,
6,
41,
7,
41,
8,
41,
9,
41,
10,
41,
11,
41,
12,
41,
13,
41,
14,
41,
15,
41,
16,
41,
17,
41,
18,
41,
19,
41,
20,
41,
21,
41,
22,
41,
23,
41,
24,
41,
25,
41,
26,
41,
27,
41,
28,
41,
29,
41,
34,
41,
35,
41,
36,
41,
37,
41,
38,
41,
39,
41,
40,
41,
41,
41,
42,
41,
43,
41,
44,
41,
45,
41,
46,
41,
47,
41,
48,
41,
49,
41,
50,
41,
51,
41,
52,
41,
53,
41,
54,
41,
55,
41,
56,
41,
68,
41,
69,
41,
70,
41,
71,
41,
72,
41,
73,
41,
74,
41,
75,
41,
76,
41,
77,
41,
78,
41,
79,
41,
80,
41,
81,
41,
82,
41,
83,
41,
84,
41,
85,
41,
86,
41,
87,
41,
88,
41,
89,
41,
90,
41,
91,
41,
92,
41,
93,
41,
94,
41,
95,
41,
96,
41,
97,
41,
98,
41,
0,
42,
4,
42,
5,
42,
6,
42,
7,
42,
8,
42,
9,
42,
10,
42,
11,
42,
12,
42,
13,
42,
14,
42,
15,
42,
16,
42,
17,
42,
18,
42,
19,
42,
20,
42,
21,
42,
22,
42,
23,
42,
24,
42,
25,
42,
26,
42,
27,
42,
28,
42,
29,
42,
33,
42,
34,
42,
35,
42,
36,
42,
37,
42,
38,
42,
39,
42,
40,
42,
41,
42,
42,
42,
43,
42,
44,
42,
45,
42,
46,
42,
47,
42,
48,
42,
49,
42,
50,
42,
51,
42,
52,
42,
53,
42,
54,
42,
55,
42,
56,
42,
68,
42,
69,
42,
70,
42,
71,
42,
72,
42,
73,
42,
74,
42,
75,
42,
76,
42,
77,
42,
78,
42,
79,
42,
80,
42,
81,
42,
82,
42,
83,
42,
84,
42,
85,
42,
86,
42,
87,
42,
88,
42,
89,
42,
90,
42,
91,
42,
92,
42,
93,
42,
94,
42,
95,
42,
96,
42,
97,
42,
98,
42,
0,
43,
5,
43,
6,
43,
7,
43,
8,
43,
9,
43,
10,
43,
11,
43,
12,
43,
13,
43,
14,
43,
15,
43,
16,
43,
17,
43,
18,
43,
19,
43,
20,
43,
21,
43,
22,
43,
23,
43,
24,
43,
25,
43,
26,
43,
27,
43,
28,
43,
33,
43,
35,
43,
36,
43,
37,
43,
38,
43,
39,
43,
40,
43,
41,
43,
42,
43,
43,
43,
44,
43,
45,
43,
46,
43,
47,
43,
48,
43,
49,
43,
50,
43,
51,
43,
52,
43,
53,
43,
54,
43,
55,
43,
56,
43,
57,
43,
58,
43,
69,
43,
70,
43,
71,
43,
72,
43,
73,
43,
74,
43,
75,
43,
76,
43,
77,
43,
78,
43,
79,
43,
80,
43,
81,
43,
82,
43,
83,
43,
84,
43,
85,
43,
86,
43,
87,
43,
88,
43,
89,
43,
90,
43,
91,
43,
92,
43,
93,
43,
94,
43,
95,
43,
96,
43,
97,
43,
98,
43,
0,
44,
5,
44,
6,
44,
7,
44,
8,
44,
9,
44,
10,
44,
11,
44,
12,
44,
13,
44,
14,
44,
15,
44,
16,
44,
17,
44,
18,
44,
19,
44,
20,
44,
21,
44,
22,
44,
23,
44,
24,
44,
25,
44,
26,
44,
27,
44,
28,
44,
33,
44,
34,
44,
35,
44,
36,
44,
37,
44,
38,
44,
39,
44,
40,
44,
41,
44,
42,
44,
43,
44,
44,
44,
45,
44,
46,
44,
47,
44,
48,
44,
49,
44,
50,
44,
51,
44,
52,
44,
53,
44,
54,
44,
55,
44,
56,
44,
57,
44,
58,
44,
69,
44,
70,
44,
71,
44,
72,
44,
73,
44,
74,
44,
75,
44,
76,
44,
77,
44,
78,
44,
79,
44,
80,
44,
81,
44,
82,
44,
83,
44,
84,
44,
85,
44,
86,
44,
87,
44,
88,
44,
89,
44,
90,
44,
91,
44,
92,
44,
93,
44,
94,
44,
95,
44,
96,
44,
97,
44,
98,
44,
5,
45,
6,
45,
7,
45,
8,
45,
9,
45,
10,
45,
11,
45,
12,
45,
13,
45,
14,
45,
15,
45,
16,
45,
17,
45,
18,
45,
19,
45,
20,
45,
21,
45,
22,
45,
23,
45,
24,
45,
25,
45,
26,
45,
27,
45,
28,
45,
33,
45,
34,
45,
35,
45,
37,
45,
38,
45,
39,
45,
40,
45,
41,
45,
42,
45,
43,
45,
44,
45,
45,
45,
46,
45,
47,
45,
48,
45,
49,
45,
50,
45,
51,
45,
52,
45,
53,
45,
54,
45,
55,
45,
56,
45,
57,
45,
58,
45,
69,
45,
70,
45,
71,
45,
72,
45,
73,
45,
74,
45,
75,
45,
76,
45,
77,
45,
78,
45,
79,
45,
80,
45,
81,
45,
82,
45,
83,
45,
84,
45,
85,
45,
86,
45,
87,
45,
88,
45,
89,
45,
90,
45,
91,
45,
92,
45,
93,
45,
94,
45,
95,
45,
96,
45,
97,
45,
98,
45,
99,
45,
5,
46,
6,
46,
7,
46,
8,
46,
9,
46,
10,
46,
11,
46,
12,
46,
13,
46,
14,
46,
15,
46,
16,
46,
17,
46,
18,
46,
19,
46,
20,
46,
21,
46,
22,
46,
23,
46,
24,
46,
25,
46,
26,
46,
27,
46,
28,
46,
33,
46,
35,
46,
36,
46,
37,
46,
38,
46,
39,
46,
40,
46,
41,
46,
42,
46,
43,
46,
44,
46,
45,
46,
46,
46,
47,
46,
48,
46,
49,
46,
50,
46,
51,
46,
52,
46,
53,
46,
54,
46,
55,
46,
56,
46,
57,
46,
58,
46,
59,
46,
60,
46,
61,
46,
69,
46,
70,
46,
71,
46,
72,
46,
73,
46,
74,
46,
75,
46,
76,
46,
77,
46,
78,
46,
79,
46,
80,
46,
81,
46,
82,
46,
83,
46,
84,
46,
85,
46,
86,
46,
87,
46,
88,
46,
89,
46,
90,
46,
91,
46,
92,
46,
93,
46,
94,
46,
95,
46,
96,
46,
97,
46,
98,
46,
99,
46,
5,
47,
6,
47,
7,
47,
8,
47,
9,
47,
10,
47,
11,
47,
12,
47,
13,
47,
14,
47,
15,
47,
16,
47,
17,
47,
18,
47,
19,
47,
20,
47,
21,
47,
22,
47,
23,
47,
24,
47,
25,
47,
26,
47,
27,
47,
28,
47,
34,
47,
35,
47,
36,
47,
37,
47,
38,
47,
39,
47,
40,
47,
41,
47,
42,
47,
43,
47,
44,
47,
45,
47,
46,
47,
47,
47,
48,
47,
49,
47,
50,
47,
51,
47,
52,
47,
53,
47,
54,
47,
55,
47,
56,
47,
57,
47,
58,
47,
59,
47,
60,
47,
69,
47,
70,
47,
71,
47,
72,
47,
73,
47,
74,
47,
75,
47,
76,
47,
77,
47,
78,
47,
79,
47,
80,
47,
81,
47,
82,
47,
83,
47,
84,
47,
85,
47,
86,
47,
87,
47,
88,
47,
89,
47,
90,
47,
91,
47,
92,
47,
93,
47,
94,
47,
95,
47,
96,
47,
97,
47,
98,
47,
99,
47,
5,
48,
6,
48,
7,
48,
8,
48,
9,
48,
10,
48,
11,
48,
12,
48,
13,
48,
14,
48,
15,
48,
16,
48,
17,
48,
18,
48,
19,
48,
20,
48,
21,
48,
22,
48,
23,
48,
24,
48,
25,
48,
26,
48,
27,
48,
28,
48,
33,
48,
34,
48,
35,
48,
36,
48,
37,
48,
38,
48,
39,
48,
40,
48,
41,
48,
42,
48,
43,
48,
44,
48,
45,
48,
46,
48,
47,
48,
48,
48,
49,
48,
50,
48,
51,
48,
52,
48,
53,
48,
54,
48,
55,
48,
56,
48,
57,
48,
58,
48,
59,
48,
60,
48,
61,
48,
69,
48,
70,
48,
71,
48,
72,
48,
73,
48,
74,
48,
75,
48,
76,
48,
77,
48,
78,
48,
79,
48,
80,
48,
81,
48,
82,
48,
83,
48,
84,
48,
85,
48,
86,
48,
87,
48,
88,
48,
89,
48,
90,
48,
91,
48,
92,
48,
93,
48,
94,
48,
95,
48,
96,
48,
97,
48,
98,
48,
99,
48,
5,
49,
6,
49,
7,
49,
8,
49,
9,
49,
10,
49,
11,
49,
12,
49,
13,
49,
14,
49,
15,
49,
16,
49,
17,
49,
18,
49,
19,
49,
20,
49,
21,
49,
22,
49,
23,
49,
24,
49,
25,
49,
26,
49,
27,
49,
28,
49,
33,
49,
34,
49,
35,
49,
36,
49,
37,
49,
38,
49,
39,
49,
40,
49,
41,
49,
42,
49,
43,
49,
44,
49,
45,
49,
46,
49,
47,
49,
48,
49,
49,
49,
50,
49,
51,
49,
52,
49,
53,
49,
54,
49,
55,
49,
56,
49,
57,
49,
58,
49,
59,
49,
60,
49,
61,
49,
62,
49,
64,
49,
69,
49,
70,
49,
71,
49,
72,
49,
73,
49,
74,
49,
75,
49,
76,
49,
77,
49,
78,
49,
79,
49,
80,
49,
81,
49,
82,
49,
83,
49,
84,
49,
85,
49,
86,
49,
87,
49,
88,
49,
89,
49,
90,
49,
91,
49,
92,
49,
93,
49,
94,
49,
95,
49,
96,
49,
97,
49,
98,
49,
99,
49,
5,
50,
6,
50,
7,
50,
8,
50,
9,
50,
10,
50,
11,
50,
12,
50,
13,
50,
14,
50,
15,
50,
16,
50,
17,
50,
18,
50,
19,
50,
20,
50,
21,
50,
22,
50,
23,
50,
24,
50,
25,
50,
26,
50,
27,
50,
28,
50,
37,
50,
38,
50,
39,
50,
40,
50,
41,
50,
42,
50,
43,
50,
44,
50,
45,
50,
46,
50,
47,
50,
48,
50,
49,
50,
50,
50,
51,
50,
52,
50,
53,
50,
54,
50,
55,
50,
56,
50,
57,
50,
58,
50,
59,
50,
60,
50,
61,
50,
62,
50,
63,
50,
65,
50,
69,
50,
70,
50,
71,
50,
72,
50,
73,
50,
74,
50,
75,
50,
76,
50,
77,
50,
78,
50,
79,
50,
80,
50,
81,
50,
82,
50,
83,
50,
84,
50,
85,
50,
86,
50,
87,
50,
88,
50,
89,
50,
90,
50,
91,
50,
92,
50,
93,
50,
94,
50,
95,
50,
96,
50,
97,
50,
98,
50,
99,
50,
5,
51,
6,
51,
7,
51,
8,
51,
9,
51,
10,
51,
11,
51,
12,
51,
13,
51,
14,
51,
15,
51,
16,
51,
17,
51,
18,
51,
19,
51,
20,
51,
21,
51,
22,
51,
23,
51,
24,
51,
25,
51,
26,
51,
27,
51,
28,
51,
37,
51,
38,
51,
39,
51,
40,
51,
41,
51,
42,
51,
43,
51,
44,
51,
45,
51,
46,
51,
47,
51,
48,
51,
49,
51,
50,
51,
51,
51,
52,
51,
53,
51,
54,
51,
55,
51,
56,
51,
57,
51,
58,
51,
59,
51,
60,
51,
61,
51,
62,
51,
63,
51,
64,
51,
69,
51,
70,
51,
71,
51,
72,
51,
73,
51,
74,
51,
75,
51,
76,
51,
77,
51,
78,
51,
79,
51,
80,
51,
81,
51,
82,
51,
83,
51,
84,
51,
85,
51,
86,
51,
87,
51,
88,
51,
89,
51,
90,
51,
91,
51,
92,
51,
93,
51,
94,
51,
95,
51,
96,
51,
97,
51,
98,
51,
99,
51,
6,
52,
7,
52,
8,
52,
9,
52,
10,
52,
11,
52,
12,
52,
13,
52,
14,
52,
15,
52,
16,
52,
17,
52,
18,
52,
19,
52,
20,
52,
21,
52,
22,
52,
23,
52,
24,
52,
25,
52,
26,
52,
27,
52,
28,
52,
38,
52,
39,
52,
40,
52,
41,
52,
42,
52,
43,
52,
44,
52,
45,
52,
46,
52,
47,
52,
48,
52,
49,
52,
50,
52,
51,
52,
52,
52,
53,
52,
54,
52,
55,
52,
56,
52,
57,
52,
58,
52,
59,
52,
60,
52,
61,
52,
62,
52,
63,
52,
64,
52,
66,
52,
69,
52,
70,
52,
71,
52,
72,
52,
73,
52,
74,
52,
75,
52,
76,
52,
77,
52,
78,
52,
79,
52,
80,
52,
81,
52,
82,
52,
83,
52,
84,
52,
85,
52,
86,
52,
87,
52,
88,
52,
89,
52,
90,
52,
91,
52,
92,
52,
93,
52,
94,
52,
95,
52,
96,
52,
97,
52,
98,
52,
6,
53,
7,
53,
8,
53,
9,
53,
10,
53,
11,
53,
12,
53,
13,
53,
14,
53,
15,
53,
16,
53,
17,
53,
18,
53,
19,
53,
20,
53,
21,
53,
22,
53,
23,
53,
24,
53,
25,
53,
26,
53,
27,
53,
28,
53,
29,
53,
37,
53,
39,
53,
40,
53,
41,
53,
42,
53,
43,
53,
44,
53,
45,
53,
46,
53,
47,
53,
48,
53,
49,
53,
50,
53,
51,
53,
52,
53,
53,
53,
54,
53,
55,
53,
56,
53,
57,
53,
58,
53,
59,
53,
60,
53,
61,
53,
62,
53,
63,
53,
64,
53,
65,
53,
66,
53,
67,
53,
68,
53,
69,
53,
70,
53,
71,
53,
72,
53,
73,
53,
74,
53,
75,
53,
76,
53,
77,
53,
78,
53,
79,
53,
80,
53,
81,
53,
82,
53,
83,
53,
84,
53,
85,
53,
86,
53,
87,
53,
88,
53,
89,
53,
90,
53,
91,
53,
92,
53,
93,
53,
94,
53,
95,
53,
96,
53,
97,
53,
98,
53,
6,
54,
7,
54,
8,
54,
9,
54,
10,
54,
11,
54,
12,
54,
13,
54,
14,
54,
15,
54,
16,
54,
17,
54,
18,
54,
19,
54,
20,
54,
21,
54,
22,
54,
23,
54,
24,
54,
25,
54,
26,
54,
27,
54,
28,
54,
29,
54,
40,
54,
41,
54,
42,
54,
43,
54,
44,
54,
45,
54,
46,
54,
47,
54,
48,
54,
49,
54,
50,
54,
51,
54,
52,
54,
53,
54,
54,
54,
55,
54,
56,
54,
57,
54,
58,
54,
59,
54,
60,
54,
61,
54,
62,
54,
63,
54,
64,
54,
65,
54,
66,
54,
67,
54,
68,
54,
69,
54,
70,
54,
71,
54,
72,
54,
73,
54,
74,
54,
75,
54,
76,
54,
77,
54,
78,
54,
79,
54,
80,
54,
81,
54,
82,
54,
83,
54,
84,
54,
85,
54,
86,
54,
87,
54,
88,
54,
89,
54,
90,
54,
91,
54,
92,
54,
93,
54,
94,
54,
95,
54,
96,
54,
97,
54,
98,
54,
6,
55,
7,
55,
8,
55,
9,
55,
10,
55,
11,
55,
12,
55,
13,
55,
14,
55,
15,
55,
16,
55,
17,
55,
18,
55,
19,
55,
20,
55,
21,
55,
22,
55,
23,
55,
24,
55,
25,
55,
26,
55,
27,
55,
28,
55,
29,
55,
30,
55,
41,
55,
42,
55,
43,
55,
44,
55,
45,
55,
46,
55,
47,
55,
48,
55,
49,
55,
50,
55,
51,
55,
52,
55,
53,
55,
54,
55,
55,
55,
56,
55,
57,
55,
58,
55,
59,
55,
60,
55,
61,
55,
62,
55,
63,
55,
64,
55,
65,
55,
66,
55,
67,
55,
68,
55,
69,
55,
70,
55,
71,
55,
72,
55,
73,
55,
74,
55,
75,
55,
76,
55,
77,
55,
78,
55,
79,
55,
80,
55,
81,
55,
82,
55,
83,
55,
84,
55,
85,
55,
86,
55,
87,
55,
88,
55,
89,
55,
90,
55,
91,
55,
92,
55,
94,
55,
95,
55,
96,
55,
97,
55,
6,
56,
7,
56,
8,
56,
9,
56,
10,
56,
11,
56,
12,
56,
13,
56,
14,
56,
15,
56,
16,
56,
17,
56,
18,
56,
19,
56,
20,
56,
21,
56,
22,
56,
23,
56,
24,
56,
25,
56,
26,
56,
27,
56,
28,
56,
29,
56,
30,
56,
41,
56,
42,
56,
43,
56,
44,
56,
45,
56,
46,
56,
47,
56,
48,
56,
49,
56,
50,
56,
51,
56,
52,
56,
53,
56,
54,
56,
55,
56,
56,
56,
57,
56,
58,
56,
59,
56,
60,
56,
61,
56,
62,
56,
63,
56,
64,
56,
65,
56,
66,
56,
67,
56,
68,
56,
69,
56,
70,
56,
71,
56,
72,
56,
73,
56,
74,
56,
75,
56,
76,
56,
77,
56,
78,
56,
79,
56,
80,
56,
81,
56,
82,
56,
83,
56,
84,
56,
85,
56,
86,
56,
87,
56,
88,
56,
89,
56,
90,
56,
91,
56,
92,
56,
96,
56,
97,
56,
7,
57,
8,
57,
9,
57,
10,
57,
11,
57,
12,
57,
13,
57,
14,
57,
15,
57,
16,
57,
17,
57,
18,
57,
19,
57,
20,
57,
21,
57,
22,
57,
23,
57,
24,
57,
25,
57,
26,
57,
27,
57,
28,
57,
29,
57,
30,
57,
31,
57,
43,
57,
44,
57,
45,
57,
46,
57,
47,
57,
48,
57,
49,
57,
50,
57,
51,
57,
52,
57,
53,
57,
54,
57,
55,
57,
56,
57,
57,
57,
58,
57,
59,
57,
60,
57,
61,
57,
62,
57,
63,
57,
64,
57,
65,
57,
66,
57,
67,
57,
68,
57,
69,
57,
70,
57,
71,
57,
72,
57,
73,
57,
74,
57,
75,
57,
76,
57,
77,
57,
78,
57,
79,
57,
80,
57,
81,
57,
82,
57,
83,
57,
84,
57,
85,
57,
86,
57,
87,
57,
88,
57,
89,
57,
90,
57,
91,
57,
92,
57,
95,
57,
96,
57,
97,
57,
7,
58,
8,
58,
9,
58,
10,
58,
11,
58,
12,
58,
13,
58,
14,
58,
15,
58,
16,
58,
17,
58,
18,
58,
19,
58,
20,
58,
21,
58,
22,
58,
23,
58,
24,
58,
25,
58,
26,
58,
27,
58,
28,
58,
29,
58,
30,
58,
31,
58,
43,
58,
44,
58,
45,
58,
46,
58,
47,
58,
48,
58,
49,
58,
50,
58,
51,
58,
52,
58,
53,
58,
54,
58,
55,
58,
56,
58,
57,
58,
58,
58,
59,
58,
60,
58,
61,
58,
62,
58,
63,
58,
64,
58,
65,
58,
66,
58,
67,
58,
68,
58,
69,
58,
70,
58,
71,
58,
72,
58,
73,
58,
74,
58,
75,
58,
76,
58,
77,
58,
78,
58,
79,
58,
80,
58,
81,
58,
82,
58,
83,
58,
84,
58,
85,
58,
86,
58,
87,
58,
88,
58,
89,
58,
90,
58,
91,
58,
96,
58,
8,
59,
9,
59,
10,
59,
11,
59,
12,
59,
13,
59,
14,
59,
15,
59,
16,
59,
17,
59,
18,
59,
19,
59,
20,
59,
21,
59,
22,
59,
23,
59,
24,
59,
25,
59,
26,
59,
27,
59,
28,
59,
29,
59,
30,
59,
31,
59,
32,
59,
46,
59,
47,
59,
48,
59,
49,
59,
50,
59,
51,
59,
52,
59,
53,
59,
54,
59,
55,
59,
56,
59,
57,
59,
58,
59,
59,
59,
60,
59,
61,
59,
62,
59,
63,
59,
64,
59,
65,
59,
66,
59,
67,
59,
68,
59,
69,
59,
70,
59,
71,
59,
72,
59,
73,
59,
74,
59,
75,
59,
76,
59,
77,
59,
78,
59,
79,
59,
80,
59,
81,
59,
82,
59,
83,
59,
84,
59,
85,
59,
86,
59,
87,
59,
88,
59,
89,
59,
90,
59,
91,
59,
8,
60,
9,
60,
10,
60,
11,
60,
12,
60,
13,
60,
14,
60,
15,
60,
16,
60,
17,
60,
18,
60,
19,
60,
20,
60,
21,
60,
22,
60,
23,
60,
24,
60,
25,
60,
26,
60,
27,
60,
28,
60,
29,
60,
30,
60,
31,
60,
32,
60,
33,
60,
46,
60,
47,
60,
48,
60,
49,
60,
50,
60,
51,
60,
52,
60,
53,
60,
54,
60,
55,
60,
56,
60,
57,
60,
58,
60,
59,
60,
60,
60,
61,
60,
62,
60,
63,
60,
64,
60,
65,
60,
66,
60,
67,
60,
68,
60,
69,
60,
70,
60,
71,
60,
72,
60,
73,
60,
74,
60,
75,
60,
76,
60,
77,
60,
78,
60,
79,
60,
80,
60,
81,
60,
82,
60,
83,
60,
84,
60,
85,
60,
86,
60,
87,
60,
88,
60,
89,
60,
90,
60,
9,
61,
10,
61,
11,
61,
12,
61,
13,
61,
14,
61,
15,
61,
16,
61,
17,
61,
18,
61,
19,
61,
20,
61,
21,
61,
22,
61,
23,
61,
24,
61,
25,
61,
26,
61,
27,
61,
28,
61,
29,
61,
30,
61,
31,
61,
32,
61,
33,
61,
34,
61,
46,
61,
48,
61,
49,
61,
50,
61,
51,
61,
52,
61,
53,
61,
54,
61,
55,
61,
56,
61,
57,
61,
58,
61,
59,
61,
60,
61,
61,
61,
62,
61,
63,
61,
64,
61,
65,
61,
66,
61,
67,
61,
68,
61,
69,
61,
70,
61,
71,
61,
72,
61,
73,
61,
74,
61,
75,
61,
76,
61,
77,
61,
78,
61,
79,
61,
80,
61,
81,
61,
82,
61,
83,
61,
84,
61,
85,
61,
86,
61,
87,
61,
88,
61,
89,
61,
90,
61,
9,
62,
10,
62,
11,
62,
12,
62,
13,
62,
14,
62,
15,
62,
16,
62,
17,
62,
18,
62,
19,
62,
20,
62,
21,
62,
22,
62,
23,
62,
24,
62,
25,
62,
26,
62,
27,
62,
28,
62,
29,
62,
30,
62,
31,
62,
32,
62,
33,
62,
34,
62,
49,
62,
50,
62,
51,
62,
52,
62,
53,
62,
54,
62,
55,
62,
56,
62,
57,
62,
58,
62,
59,
62,
60,
62,
61,
62,
62,
62,
63,
62,
64,
62,
65,
62,
66,
62,
67,
62,
68,
62,
69,
62,
70,
62,
71,
62,
72,
62,
73,
62,
74,
62,
75,
62,
76,
62,
77,
62,
78,
62,
79,
62,
80,
62,
81,
62,
82,
62,
83,
62,
84,
62,
85,
62,
86,
62,
87,
62,
88,
62,
89,
62,
10,
63,
11,
63,
12,
63,
13,
63,
14,
63,
15,
63,
16,
63,
17,
63,
18,
63,
19,
63,
20,
63,
21,
63,
22,
63,
23,
63,
24,
63,
25,
63,
26,
63,
27,
63,
28,
63,
29,
63,
30,
63,
31,
63,
32,
63,
33,
63,
34,
63,
35,
63,
50,
63,
51,
63,
52,
63,
53,
63,
54,
63,
55,
63,
56,
63,
57,
63,
58,
63,
59,
63,
60,
63,
61,
63,
62,
63,
63,
63,
64,
63,
65,
63,
66,
63,
67,
63,
68,
63,
69,
63,
70,
63,
71,
63,
72,
63,
73,
63,
74,
63,
75,
63,
76,
63,
77,
63,
78,
63,
79,
63,
80,
63,
81,
63,
82,
63,
83,
63,
84,
63,
85,
63,
86,
63,
87,
63,
88,
63,
10,
64,
11,
64,
12,
64,
13,
64,
14,
64,
15,
64,
16,
64,
17,
64,
18,
64,
19,
64,
20,
64,
21,
64,
22,
64,
23,
64,
24,
64,
25,
64,
26,
64,
27,
64,
28,
64,
29,
64,
30,
64,
31,
64,
32,
64,
33,
64,
34,
64,
35,
64,
36,
64,
49,
64,
51,
64,
52,
64,
53,
64,
54,
64,
55,
64,
56,
64,
57,
64,
58,
64,
59,
64,
60,
64,
61,
64,
62,
64,
63,
64,
64,
64,
65,
64,
66,
64,
67,
64,
68,
64,
69,
64,
70,
64,
71,
64,
72,
64,
73,
64,
74,
64,
75,
64,
76,
64,
77,
64,
78,
64,
79,
64,
80,
64,
81,
64,
82,
64,
83,
64,
84,
64,
85,
64,
86,
64,
87,
64,
88,
64,
11,
65,
12,
65,
13,
65,
14,
65,
15,
65,
16,
65,
17,
65,
18,
65,
19,
65,
20,
65,
21,
65,
22,
65,
23,
65,
24,
65,
25,
65,
26,
65,
27,
65,
28,
65,
29,
65,
30,
65,
31,
65,
32,
65,
33,
65,
34,
65,
35,
65,
36,
65,
37,
65,
50,
65,
53,
65,
54,
65,
55,
65,
56,
65,
57,
65,
58,
65,
59,
65,
60,
65,
61,
65,
62,
65,
63,
65,
64,
65,
65,
65,
66,
65,
67,
65,
68,
65,
69,
65,
70,
65,
71,
65,
72,
65,
73,
65,
74,
65,
75,
65,
76,
65,
77,
65,
78,
65,
79,
65,
80,
65,
81,
65,
82,
65,
83,
65,
84,
65,
85,
65,
86,
65,
87,
65,
6,
66,
11,
66,
12,
66,
13,
66,
14,
66,
15,
66,
16,
66,
17,
66,
18,
66,
19,
66,
20,
66,
21,
66,
22,
66,
23,
66,
24,
66,
25,
66,
26,
66,
27,
66,
28,
66,
29,
66,
30,
66,
31,
66,
32,
66,
33,
66,
34,
66,
35,
66,
36,
66,
37,
66,
38,
66,
52,
66,
53,
66,
54,
66,
55,
66,
56,
66,
57,
66,
58,
66,
59,
66,
60,
66,
61,
66,
62,
66,
63,
66,
64,
66,
65,
66,
66,
66,
67,
66,
68,
66,
69,
66,
70,
66,
71,
66,
72,
66,
73,
66,
74,
66,
75,
66,
76,
66,
77,
66,
78,
66,
79,
66,
80,
66,
81,
66,
82,
66,
83,
66,
84,
66,
85,
66,
86,
66,
7,
67,
12,
67,
13,
67,
14,
67,
15,
67,
16,
67,
17,
67,
18,
67,
19,
67,
20,
67,
21,
67,
22,
67,
23,
67,
24,
67,
25,
67,
26,
67,
27,
67,
28,
67,
29,
67,
30,
67,
31,
67,
32,
67,
33,
67,
34,
67,
35,
67,
36,
67,
37,
67,
38,
67,
39,
67,
40,
67,
53,
67,
54,
67,
55,
67,
56,
67,
57,
67,
58,
67,
59,
67,
60,
67,
61,
67,
62,
67,
63,
67,
64,
67,
65,
67,
66,
67,
67,
67,
68,
67,
69,
67,
70,
67,
71,
67,
72,
67,
73,
67,
74,
67,
75,
67,
76,
67,
77,
67,
78,
67,
79,
67,
80,
67,
81,
67,
82,
67,
83,
67,
84,
67,
85,
67,
86,
67,
7,
68,
8,
68,
13,
68,
14,
68,
15,
68,
16,
68,
17,
68,
18,
68,
19,
68,
20,
68,
21,
68,
22,
68,
23,
68,
24,
68,
25,
68,
26,
68,
27,
68,
28,
68,
29,
68,
30,
68,
31,
68,
32,
68,
33,
68,
34,
68,
35,
68,
36,
68,
37,
68,
38,
68,
39,
68,
40,
68,
41,
68,
42,
68,
53,
68,
54,
68,
55,
68,
56,
68,
57,
68,
58,
68,
59,
68,
60,
68,
61,
68,
62,
68,
63,
68,
64,
68,
65,
68,
66,
68,
67,
68,
68,
68,
69,
68,
70,
68,
71,
68,
72,
68,
73,
68,
74,
68,
75,
68,
76,
68,
77,
68,
78,
68,
79,
68,
80,
68,
81,
68,
82,
68,
83,
68,
84,
68,
85,
68,
8,
69,
9,
69,
13,
69,
14,
69,
15,
69,
16,
69,
17,
69,
18,
69,
19,
69,
20,
69,
21,
69,
22,
69,
23,
69,
24,
69,
25,
69,
26,
69,
27,
69,
28,
69,
29,
69,
30,
69,
31,
69,
32,
69,
33,
69,
34,
69,
35,
69,
36,
69,
37,
69,
38,
69,
39,
69,
40,
69,
41,
69,
42,
69,
43,
69,
44,
69,
45,
69,
46,
69,
47,
69,
48,
69,
49,
69,
50,
69,
51,
69,
52,
69,
53,
69,
54,
69,
55,
69,
56,
69,
57,
69,
58,
69,
59,
69,
60,
69,
61,
69,
62,
69,
63,
69,
64,
69,
65,
69,
66,
69,
67,
69,
68,
69,
69,
69,
70,
69,
71,
69,
72,
69,
73,
69,
74,
69,
75,
69,
76,
69,
77,
69,
78,
69,
79,
69,
80,
69,
81,
69,
82,
69,
83,
69,
84,
69,
9,
70,
10,
70,
14,
70,
15,
70,
16,
70,
17,
70,
18,
70,
19,
70,
20,
70,
21,
70,
22,
70,
23,
70,
24,
70,
25,
70,
26,
70,
27,
70,
28,
70,
29,
70,
30,
70,
31,
70,
32,
70,
33,
70,
34,
70,
35,
70,
36,
70,
37,
70,
38,
70,
39,
70,
40,
70,
41,
70,
42,
70,
43,
70,
44,
70,
45,
70,
46,
70,
47,
70,
48,
70,
49,
70,
50,
70,
51,
70,
52,
70,
53,
70,
54,
70,
55,
70,
56,
70,
57,
70,
58,
70,
59,
70,
60,
70,
61,
70,
62,
70,
63,
70,
64,
70,
65,
70,
66,
70,
67,
70,
68,
70,
69,
70,
70,
70,
71,
70,
72,
70,
73,
70,
74,
70,
75,
70,
76,
70,
77,
70,
78,
70,
79,
70,
80,
70,
81,
70,
82,
70,
83,
70,
84,
70,
10,
71,
11,
71,
15,
71,
16,
71,
17,
71,
18,
71,
19,
71,
20,
71,
21,
71,
22,
71,
23,
71,
24,
71,
25,
71,
26,
71,
27,
71,
28,
71,
29,
71,
30,
71,
31,
71,
32,
71,
33,
71,
34,
71,
35,
71,
36,
71,
37,
71,
38,
71,
39,
71,
40,
71,
41,
71,
42,
71,
43,
71,
44,
71,
45,
71,
46,
71,
47,
71,
48,
71,
49,
71,
50,
71,
51,
71,
52,
71,
53,
71,
54,
71,
55,
71,
56,
71,
57,
71,
58,
71,
59,
71,
60,
71,
61,
71,
62,
71,
63,
71,
64,
71,
65,
71,
66,
71,
67,
71,
68,
71,
69,
71,
70,
71,
71,
71,
72,
71,
73,
71,
74,
71,
75,
71,
76,
71,
77,
71,
78,
71,
79,
71,
80,
71,
81,
71,
82,
71,
83,
71,
11,
72,
12,
72,
15,
72,
16,
72,
17,
72,
18,
72,
19,
72,
20,
72,
21,
72,
22,
72,
23,
72,
24,
72,
25,
72,
26,
72,
27,
72,
28,
72,
29,
72,
30,
72,
31,
72,
32,
72,
33,
72,
34,
72,
35,
72,
36,
72,
37,
72,
38,
72,
39,
72,
40,
72,
41,
72,
42,
72,
43,
72,
44,
72,
45,
72,
46,
72,
47,
72,
48,
72,
49,
72,
50,
72,
51,
72,
52,
72,
53,
72,
54,
72,
55,
72,
56,
72,
57,
72,
58,
72,
59,
72,
60,
72,
61,
72,
62,
72,
63,
72,
64,
72,
65,
72,
66,
72,
67,
72,
68,
72,
69,
72,
70,
72,
71,
72,
72,
72,
73,
72,
74,
72,
75,
72,
76,
72,
77,
72,
78,
72,
79,
72,
80,
72,
81,
72,
82,
72,
12,
73,
13,
73,
16,
73,
17,
73,
18,
73,
19,
73,
20,
73,
21,
73,
22,
73,
23,
73,
24,
73,
25,
73,
26,
73,
27,
73,
28,
73,
29,
73,
30,
73,
31,
73,
32,
73,
33,
73,
34,
73,
35,
73,
36,
73,
37,
73,
38,
73,
39,
73,
40,
73,
41,
73,
42,
73,
43,
73,
44,
73,
45,
73,
46,
73,
47,
73,
48,
73,
49,
73,
50,
73,
51,
73,
52,
73,
53,
73,
54,
73,
55,
73,
56,
73,
57,
73,
58,
73,
59,
73,
60,
73,
61,
73,
62,
73,
63,
73,
64,
73,
65,
73,
66,
73,
67,
73,
68,
73,
69,
73,
70,
73,
71,
73,
72,
73,
73,
73,
74,
73,
75,
73,
76,
73,
77,
73,
78,
73,
79,
73,
80,
73,
81,
73,
13,
74,
14,
74,
17,
74,
18,
74,
19,
74,
20,
74,
21,
74,
22,
74,
23,
74,
24,
74,
25,
74,
26,
74,
27,
74,
28,
74,
29,
74,
30,
74,
31,
74,
32,
74,
33,
74,
34,
74,
35,
74,
36,
74,
37,
74,
38,
74,
39,
74,
40,
74,
41,
74,
42,
74,
43,
74,
44,
74,
45,
74,
46,
74,
47,
74,
48,
74,
49,
74,
50,
74,
51,
74,
52,
74,
53,
74,
54,
74,
55,
74,
56,
74,
57,
74,
58,
74,
59,
74,
60,
74,
61,
74,
62,
74,
63,
74,
64,
74,
65,
74,
66,
74,
67,
74,
68,
74,
69,
74,
70,
74,
71,
74,
72,
74,
73,
74,
74,
74,
75,
74,
76,
74,
77,
74,
78,
74,
79,
74,
80,
74,
14,
75,
15,
75,
18,
75,
19,
75,
20,
75,
21,
75,
22,
75,
23,
75,
24,
75,
25,
75,
26,
75,
27,
75,
28,
75,
29,
75,
30,
75,
31,
75,
32,
75,
33,
75,
34,
75,
35,
75,
36,
75,
37,
75,
38,
75,
39,
75,
40,
75,
41,
75,
42,
75,
43,
75,
44,
75,
45,
75,
46,
75,
47,
75,
48,
75,
49,
75,
50,
75,
51,
75,
52,
75,
53,
75,
54,
75,
55,
75,
56,
75,
57,
75,
58,
75,
59,
75,
60,
75,
61,
75,
62,
75,
63,
75,
64,
75,
65,
75,
66,
75,
67,
75,
68,
75,
69,
75,
70,
75,
71,
75,
72,
75,
73,
75,
74,
75,
75,
75,
76,
75,
77,
75,
78,
75,
79,
75,
15,
76,
16,
76,
18,
76,
19,
76,
20,
76,
21,
76,
22,
76,
23,
76,
24,
76,
25,
76,
26,
76,
27,
76,
28,
76,
29,
76,
30,
76,
31,
76,
32,
76,
33,
76,
34,
76,
35,
76,
36,
76,
37,
76,
38,
76,
39,
76,
40,
76,
41,
76,
42,
76,
43,
76,
44,
76,
45,
76,
46,
76,
47,
76,
48,
76,
49,
76,
50,
76,
51,
76,
52,
76,
53,
76,
54,
76,
55,
76,
56,
76,
57,
76,
58,
76,
59,
76,
60,
76,
61,
76,
62,
76,
63,
76,
64,
76,
65,
76,
66,
76,
67,
76,
68,
76,
69,
76,
70,
76,
71,
76,
72,
76,
73,
76,
74,
76,
75,
76,
76,
76,
77,
76,
78,
76,
79,
76,
16,
77,
17,
77,
19,
77,
20,
77,
21,
77,
22,
77,
23,
77,
24,
77,
25,
77,
26,
77,
27,
77,
28,
77,
29,
77,
30,
77,
31,
77,
32,
77,
33,
77,
34,
77,
35,
77,
36,
77,
37,
77,
38,
77,
39,
77,
40,
77,
41,
77,
42,
77,
43,
77,
44,
77,
45,
77,
46,
77,
47,
77,
48,
77,
49,
77,
50,
77,
51,
77,
52,
77,
53,
77,
54,
77,
55,
77,
56,
77,
57,
77,
58,
77,
59,
77,
60,
77,
61,
77,
62,
77,
63,
77,
64,
77,
65,
77,
66,
77,
67,
77,
68,
77,
69,
77,
70,
77,
71,
77,
72,
77,
73,
77,
74,
77,
75,
77,
76,
77,
77,
77,
78,
77,
17,
78,
18,
78,
19,
78,
20,
78,
21,
78,
22,
78,
23,
78,
24,
78,
25,
78,
26,
78,
27,
78,
28,
78,
29,
78,
30,
78,
31,
78,
32,
78,
33,
78,
34,
78,
35,
78,
36,
78,
37,
78,
38,
78,
39,
78,
40,
78,
41,
} end, function() return {
[10000] = 78,
[10001] = 42,
[10002] = 78,
[10003] = 43,
[10004] = 78,
[10005] = 44,
[10006] = 78,
[10007] = 45,
[10008] = 78,
[10009] = 46,
[10010] = 78,
[10011] = 47,
[10012] = 78,
[10013] = 48,
[10014] = 78,
[10015] = 49,
[10016] = 78,
[10017] = 50,
[10018] = 78,
[10019] = 51,
[10020] = 78,
[10021] = 52,
[10022] = 78,
[10023] = 53,
[10024] = 78,
[10025] = 54,
[10026] = 78,
[10027] = 55,
[10028] = 78,
[10029] = 56,
[10030] = 78,
[10031] = 57,
[10032] = 78,
[10033] = 58,
[10034] = 78,
[10035] = 59,
[10036] = 78,
[10037] = 60,
[10038] = 78,
[10039] = 61,
[10040] = 78,
[10041] = 62,
[10042] = 78,
[10043] = 63,
[10044] = 78,
[10045] = 64,
[10046] = 78,
[10047] = 65,
[10048] = 78,
[10049] = 66,
[10050] = 78,
[10051] = 67,
[10052] = 78,
[10053] = 68,
[10054] = 78,
[10055] = 69,
[10056] = 78,
[10057] = 70,
[10058] = 78,
[10059] = 71,
[10060] = 78,
[10061] = 72,
[10062] = 78,
[10063] = 73,
[10064] = 78,
[10065] = 74,
[10066] = 78,
[10067] = 75,
[10068] = 78,
[10069] = 76,
[10070] = 78,
[10071] = 77,
[10072] = 78,
[10073] = 18,
[10074] = 79,
[10075] = 19,
[10076] = 79,
[10077] = 21,
[10078] = 79,
[10079] = 22,
[10080] = 79,
[10081] = 23,
[10082] = 79,
[10083] = 24,
[10084] = 79,
[10085] = 25,
[10086] = 79,
[10087] = 26,
[10088] = 79,
[10089] = 27,
[10090] = 79,
[10091] = 28,
[10092] = 79,
[10093] = 29,
[10094] = 79,
[10095] = 30,
[10096] = 79,
[10097] = 31,
[10098] = 79,
[10099] = 32,
[10100] = 79,
[10101] = 33,
[10102] = 79,
[10103] = 34,
[10104] = 79,
[10105] = 35,
[10106] = 79,
[10107] = 36,
[10108] = 79,
[10109] = 37,
[10110] = 79,
[10111] = 38,
[10112] = 79,
[10113] = 39,
[10114] = 79,
[10115] = 40,
[10116] = 79,
[10117] = 41,
[10118] = 79,
[10119] = 42,
[10120] = 79,
[10121] = 43,
[10122] = 79,
[10123] = 44,
[10124] = 79,
[10125] = 45,
[10126] = 79,
[10127] = 46,
[10128] = 79,
[10129] = 47,
[10130] = 79,
[10131] = 48,
[10132] = 79,
[10133] = 49,
[10134] = 79,
[10135] = 50,
[10136] = 79,
[10137] = 51,
[10138] = 79,
[10139] = 52,
[10140] = 79,
[10141] = 53,
[10142] = 79,
[10143] = 54,
[10144] = 79,
[10145] = 55,
[10146] = 79,
[10147] = 56,
[10148] = 79,
[10149] = 57,
[10150] = 79,
[10151] = 58,
[10152] = 79,
[10153] = 59,
[10154] = 79,
[10155] = 60,
[10156] = 79,
[10157] = 61,
[10158] = 79,
[10159] = 62,
[10160] = 79,
[10161] = 63,
[10162] = 79,
[10163] = 64,
[10164] = 79,
[10165] = 65,
[10166] = 79,
[10167] = 66,
[10168] = 79,
[10169] = 67,
[10170] = 79,
[10171] = 68,
[10172] = 79,
[10173] = 69,
[10174] = 79,
[10175] = 70,
[10176] = 79,
[10177] = 71,
[10178] = 79,
[10179] = 72,
[10180] = 79,
[10181] = 73,
[10182] = 79,
[10183] = 74,
[10184] = 79,
[10185] = 75,
[10186] = 79,
[10187] = 76,
[10188] = 79,
[10189] = 19,
[10190] = 80,
[10191] = 20,
[10192] = 80,
[10193] = 22,
[10194] = 80,
[10195] = 23,
[10196] = 80,
[10197] = 24,
[10198] = 80,
[10199] = 25,
[10200] = 80,
[10201] = 26,
[10202] = 80,
[10203] = 27,
[10204] = 80,
[10205] = 28,
[10206] = 80,
[10207] = 29,
[10208] = 80,
[10209] = 30,
[10210] = 80,
[10211] = 31,
[10212] = 80,
[10213] = 32,
[10214] = 80,
[10215] = 33,
[10216] = 80,
[10217] = 34,
[10218] = 80,
[10219] = 35,
[10220] = 80,
[10221] = 36,
[10222] = 80,
[10223] = 37,
[10224] = 80,
[10225] = 38,
[10226] = 80,
[10227] = 39,
[10228] = 80,
[10229] = 40,
[10230] = 80,
[10231] = 41,
[10232] = 80,
[10233] = 42,
[10234] = 80,
[10235] = 43,
[10236] = 80,
[10237] = 44,
[10238] = 80,
[10239] = 45,
[10240] = 80,
[10241] = 46,
[10242] = 80,
[10243] = 47,
[10244] = 80,
[10245] = 48,
[10246] = 80,
[10247] = 49,
[10248] = 80,
[10249] = 50,
[10250] = 80,
[10251] = 51,
[10252] = 80,
[10253] = 52,
[10254] = 80,
[10255] = 53,
[10256] = 80,
[10257] = 54,
[10258] = 80,
[10259] = 55,
[10260] = 80,
[10261] = 56,
[10262] = 80,
[10263] = 57,
[10264] = 80,
[10265] = 58,
[10266] = 80,
[10267] = 59,
[10268] = 80,
[10269] = 60,
[10270] = 80,
[10271] = 61,
[10272] = 80,
[10273] = 62,
[10274] = 80,
[10275] = 63,
[10276] = 80,
[10277] = 64,
[10278] = 80,
[10279] = 65,
[10280] = 80,
[10281] = 66,
[10282] = 80,
[10283] = 67,
[10284] = 80,
[10285] = 68,
[10286] = 80,
[10287] = 69,
[10288] = 80,
[10289] = 70,
[10290] = 80,
[10291] = 71,
[10292] = 80,
[10293] = 72,
[10294] = 80,
[10295] = 73,
[10296] = 80,
[10297] = 74,
[10298] = 80,
[10299] = 19,
[10300] = 81,
[10301] = 20,
[10302] = 81,
[10303] = 21,
[10304] = 81,
[10305] = 22,
[10306] = 81,
[10307] = 23,
[10308] = 81,
[10309] = 24,
[10310] = 81,
[10311] = 25,
[10312] = 81,
[10313] = 26,
[10314] = 81,
[10315] = 27,
[10316] = 81,
[10317] = 28,
[10318] = 81,
[10319] = 29,
[10320] = 81,
[10321] = 30,
[10322] = 81,
[10323] = 31,
[10324] = 81,
[10325] = 32,
[10326] = 81,
[10327] = 33,
[10328] = 81,
[10329] = 34,
[10330] = 81,
[10331] = 35,
[10332] = 81,
[10333] = 36,
[10334] = 81,
[10335] = 37,
[10336] = 81,
[10337] = 38,
[10338] = 81,
[10339] = 39,
[10340] = 81,
[10341] = 40,
[10342] = 81,
[10343] = 41,
[10344] = 81,
[10345] = 42,
[10346] = 81,
[10347] = 43,
[10348] = 81,
[10349] = 44,
[10350] = 81,
[10351] = 45,
[10352] = 81,
[10353] = 46,
[10354] = 81,
[10355] = 47,
[10356] = 81,
[10357] = 48,
[10358] = 81,
[10359] = 49,
[10360] = 81,
[10361] = 50,
[10362] = 81,
[10363] = 51,
[10364] = 81,
[10365] = 52,
[10366] = 81,
[10367] = 53,
[10368] = 81,
[10369] = 54,
[10370] = 81,
[10371] = 55,
[10372] = 81,
[10373] = 56,
[10374] = 81,
[10375] = 57,
[10376] = 81,
[10377] = 58,
[10378] = 81,
[10379] = 59,
[10380] = 81,
[10381] = 60,
[10382] = 81,
[10383] = 61,
[10384] = 81,
[10385] = 62,
[10386] = 81,
[10387] = 63,
[10388] = 81,
[10389] = 64,
[10390] = 81,
[10391] = 65,
[10392] = 81,
[10393] = 66,
[10394] = 81,
[10395] = 67,
[10396] = 81,
[10397] = 68,
[10398] = 81,
[10399] = 69,
[10400] = 81,
[10401] = 70,
[10402] = 81,
[10403] = 71,
[10404] = 81,
[10405] = 72,
[10406] = 81,
[10407] = 73,
[10408] = 81,
[10409] = 21,
[10410] = 82,
[10411] = 22,
[10412] = 82,
[10413] = 23,
[10414] = 82,
[10415] = 24,
[10416] = 82,
[10417] = 25,
[10418] = 82,
[10419] = 26,
[10420] = 82,
[10421] = 27,
[10422] = 82,
[10423] = 28,
[10424] = 82,
[10425] = 29,
[10426] = 82,
[10427] = 30,
[10428] = 82,
[10429] = 31,
[10430] = 82,
[10431] = 32,
[10432] = 82,
[10433] = 33,
[10434] = 82,
[10435] = 34,
[10436] = 82,
[10437] = 35,
[10438] = 82,
[10439] = 36,
[10440] = 82,
[10441] = 37,
[10442] = 82,
[10443] = 38,
[10444] = 82,
[10445] = 39,
[10446] = 82,
[10447] = 40,
[10448] = 82,
[10449] = 41,
[10450] = 82,
[10451] = 42,
[10452] = 82,
[10453] = 43,
[10454] = 82,
[10455] = 44,
[10456] = 82,
[10457] = 45,
[10458] = 82,
[10459] = 46,
[10460] = 82,
[10461] = 47,
[10462] = 82,
[10463] = 48,
[10464] = 82,
[10465] = 49,
[10466] = 82,
[10467] = 50,
[10468] = 82,
[10469] = 51,
[10470] = 82,
[10471] = 52,
[10472] = 82,
[10473] = 53,
[10474] = 82,
[10475] = 54,
[10476] = 82,
[10477] = 55,
[10478] = 82,
[10479] = 56,
[10480] = 82,
[10481] = 57,
[10482] = 82,
[10483] = 58,
[10484] = 82,
[10485] = 59,
[10486] = 82,
[10487] = 60,
[10488] = 82,
[10489] = 61,
[10490] = 82,
[10491] = 62,
[10492] = 82,
[10493] = 63,
[10494] = 82,
[10495] = 64,
[10496] = 82,
[10497] = 65,
[10498] = 82,
[10499] = 66,
[10500] = 82,
[10501] = 67,
[10502] = 82,
[10503] = 68,
[10504] = 82,
[10505] = 69,
[10506] = 82,
[10507] = 70,
[10508] = 82,
[10509] = 71,
[10510] = 82,
[10511] = 72,
[10512] = 82,
[10513] = 22,
[10514] = 83,
[10515] = 23,
[10516] = 83,
[10517] = 26,
[10518] = 83,
[10519] = 27,
[10520] = 83,
[10521] = 28,
[10522] = 83,
[10523] = 29,
[10524] = 83,
[10525] = 30,
[10526] = 83,
[10527] = 31,
[10528] = 83,
[10529] = 32,
[10530] = 83,
[10531] = 33,
[10532] = 83,
[10533] = 34,
[10534] = 83,
[10535] = 35,
[10536] = 83,
[10537] = 36,
[10538] = 83,
[10539] = 37,
[10540] = 83,
[10541] = 38,
[10542] = 83,
[10543] = 39,
[10544] = 83,
[10545] = 40,
[10546] = 83,
[10547] = 41,
[10548] = 83,
[10549] = 42,
[10550] = 83,
[10551] = 43,
[10552] = 83,
[10553] = 44,
[10554] = 83,
[10555] = 45,
[10556] = 83,
[10557] = 46,
[10558] = 83,
[10559] = 47,
[10560] = 83,
[10561] = 48,
[10562] = 83,
[10563] = 49,
[10564] = 83,
[10565] = 50,
[10566] = 83,
[10567] = 51,
[10568] = 83,
[10569] = 52,
[10570] = 83,
[10571] = 53,
[10572] = 83,
[10573] = 54,
[10574] = 83,
[10575] = 55,
[10576] = 83,
[10577] = 56,
[10578] = 83,
[10579] = 57,
[10580] = 83,
[10581] = 58,
[10582] = 83,
[10583] = 59,
[10584] = 83,
[10585] = 60,
[10586] = 83,
[10587] = 61,
[10588] = 83,
[10589] = 62,
[10590] = 83,
[10591] = 63,
[10592] = 83,
[10593] = 64,
[10594] = 83,
[10595] = 65,
[10596] = 83,
[10597] = 66,
[10598] = 83,
[10599] = 67,
[10600] = 83,
[10601] = 68,
[10602] = 83,
[10603] = 69,
[10604] = 83,
[10605] = 70,
[10606] = 83,
[10607] = 71,
[10608] = 83,
[10609] = 23,
[10610] = 84,
[10611] = 24,
[10612] = 84,
[10613] = 25,
[10614] = 84,
[10615] = 27,
[10616] = 84,
[10617] = 28,
[10618] = 84,
[10619] = 29,
[10620] = 84,
[10621] = 30,
[10622] = 84,
[10623] = 31,
[10624] = 84,
[10625] = 32,
[10626] = 84,
[10627] = 33,
[10628] = 84,
[10629] = 34,
[10630] = 84,
[10631] = 35,
[10632] = 84,
[10633] = 36,
[10634] = 84,
[10635] = 37,
[10636] = 84,
[10637] = 38,
[10638] = 84,
[10639] = 39,
[10640] = 84,
[10641] = 40,
[10642] = 84,
[10643] = 41,
[10644] = 84,
[10645] = 42,
[10646] = 84,
[10647] = 43,
[10648] = 84,
[10649] = 44,
[10650] = 84,
[10651] = 45,
[10652] = 84,
[10653] = 46,
[10654] = 84,
[10655] = 47,
[10656] = 84,
[10657] = 48,
[10658] = 84,
[10659] = 49,
[10660] = 84,
[10661] = 50,
[10662] = 84,
[10663] = 51,
[10664] = 84,
[10665] = 52,
[10666] = 84,
[10667] = 53,
[10668] = 84,
[10669] = 54,
[10670] = 84,
[10671] = 55,
[10672] = 84,
[10673] = 56,
[10674] = 84,
[10675] = 57,
[10676] = 84,
[10677] = 58,
[10678] = 84,
[10679] = 59,
[10680] = 84,
[10681] = 60,
[10682] = 84,
[10683] = 61,
[10684] = 84,
[10685] = 62,
[10686] = 84,
[10687] = 63,
[10688] = 84,
[10689] = 64,
[10690] = 84,
[10691] = 65,
[10692] = 84,
[10693] = 66,
[10694] = 84,
[10695] = 67,
[10696] = 84,
[10697] = 68,
[10698] = 84,
[10699] = 69,
[10700] = 84,
[10701] = 70,
[10702] = 84,
[10703] = 25,
[10704] = 85,
[10705] = 26,
[10706] = 85,
[10707] = 28,
[10708] = 85,
[10709] = 29,
[10710] = 85,
[10711] = 30,
[10712] = 85,
[10713] = 31,
[10714] = 85,
[10715] = 32,
[10716] = 85,
[10717] = 33,
[10718] = 85,
[10719] = 34,
[10720] = 85,
[10721] = 35,
[10722] = 85,
[10723] = 36,
[10724] = 85,
[10725] = 37,
[10726] = 85,
[10727] = 38,
[10728] = 85,
[10729] = 39,
[10730] = 85,
[10731] = 40,
[10732] = 85,
[10733] = 41,
[10734] = 85,
[10735] = 42,
[10736] = 85,
[10737] = 43,
[10738] = 85,
[10739] = 44,
[10740] = 85,
[10741] = 45,
[10742] = 85,
[10743] = 46,
[10744] = 85,
[10745] = 47,
[10746] = 85,
[10747] = 48,
[10748] = 85,
[10749] = 49,
[10750] = 85,
[10751] = 50,
[10752] = 85,
[10753] = 51,
[10754] = 85,
[10755] = 52,
[10756] = 85,
[10757] = 53,
[10758] = 85,
[10759] = 54,
[10760] = 85,
[10761] = 55,
[10762] = 85,
[10763] = 56,
[10764] = 85,
[10765] = 57,
[10766] = 85,
[10767] = 58,
[10768] = 85,
[10769] = 59,
[10770] = 85,
[10771] = 60,
[10772] = 85,
[10773] = 61,
[10774] = 85,
[10775] = 62,
[10776] = 85,
[10777] = 63,
[10778] = 85,
[10779] = 64,
[10780] = 85,
[10781] = 65,
[10782] = 85,
[10783] = 66,
[10784] = 85,
[10785] = 67,
[10786] = 85,
[10787] = 68,
[10788] = 85,
[10789] = 25,
[10790] = 86,
[10791] = 26,
[10792] = 86,
[10793] = 27,
[10794] = 86,
[10795] = 29,
[10796] = 86,
[10797] = 30,
[10798] = 86,
[10799] = 31,
[10800] = 86,
[10801] = 32,
[10802] = 86,
[10803] = 33,
[10804] = 86,
[10805] = 34,
[10806] = 86,
[10807] = 35,
[10808] = 86,
[10809] = 36,
[10810] = 86,
[10811] = 37,
[10812] = 86,
[10813] = 38,
[10814] = 86,
[10815] = 39,
[10816] = 86,
[10817] = 40,
[10818] = 86,
[10819] = 41,
[10820] = 86,
[10821] = 42,
[10822] = 86,
[10823] = 43,
[10824] = 86,
[10825] = 44,
[10826] = 86,
[10827] = 45,
[10828] = 86,
[10829] = 46,
[10830] = 86,
[10831] = 47,
[10832] = 86,
[10833] = 48,
[10834] = 86,
[10835] = 49,
[10836] = 86,
[10837] = 50,
[10838] = 86,
[10839] = 51,
[10840] = 86,
[10841] = 52,
[10842] = 86,
[10843] = 53,
[10844] = 86,
[10845] = 54,
[10846] = 86,
[10847] = 55,
[10848] = 86,
[10849] = 56,
[10850] = 86,
[10851] = 57,
[10852] = 86,
[10853] = 58,
[10854] = 86,
[10855] = 59,
[10856] = 86,
[10857] = 60,
[10858] = 86,
[10859] = 61,
[10860] = 86,
[10861] = 62,
[10862] = 86,
[10863] = 63,
[10864] = 86,
[10865] = 64,
[10866] = 86,
[10867] = 65,
[10868] = 86,
[10869] = 66,
[10870] = 86,
[10871] = 67,
[10872] = 86,
[10873] = 26,
[10874] = 87,
[10875] = 27,
[10876] = 87,
[10877] = 28,
[10878] = 87,
[10879] = 29,
[10880] = 87,
[10881] = 31,
[10882] = 87,
[10883] = 32,
[10884] = 87,
[10885] = 33,
[10886] = 87,
[10887] = 34,
[10888] = 87,
[10889] = 35,
[10890] = 87,
[10891] = 36,
[10892] = 87,
[10893] = 37,
[10894] = 87,
[10895] = 38,
[10896] = 87,
[10897] = 39,
[10898] = 87,
[10899] = 40,
[10900] = 87,
[10901] = 41,
[10902] = 87,
[10903] = 42,
[10904] = 87,
[10905] = 43,
[10906] = 87,
[10907] = 44,
[10908] = 87,
[10909] = 45,
[10910] = 87,
[10911] = 46,
[10912] = 87,
[10913] = 47,
[10914] = 87,
[10915] = 48,
[10916] = 87,
[10917] = 49,
[10918] = 87,
[10919] = 50,
[10920] = 87,
[10921] = 51,
[10922] = 87,
[10923] = 52,
[10924] = 87,
[10925] = 53,
[10926] = 87,
[10927] = 54,
[10928] = 87,
[10929] = 55,
[10930] = 87,
[10931] = 56,
[10932] = 87,
[10933] = 57,
[10934] = 87,
[10935] = 58,
[10936] = 87,
[10937] = 59,
[10938] = 87,
[10939] = 60,
[10940] = 87,
[10941] = 61,
[10942] = 87,
[10943] = 62,
[10944] = 87,
[10945] = 63,
[10946] = 87,
[10947] = 64,
[10948] = 87,
[10949] = 65,
[10950] = 87,
[10951] = 27,
[10952] = 88,
[10953] = 28,
[10954] = 88,
[10955] = 29,
[10956] = 88,
[10957] = 30,
[10958] = 88,
[10959] = 32,
[10960] = 88,
[10961] = 33,
[10962] = 88,
[10963] = 34,
[10964] = 88,
[10965] = 35,
[10966] = 88,
[10967] = 36,
[10968] = 88,
[10969] = 37,
[10970] = 88,
[10971] = 38,
[10972] = 88,
[10973] = 39,
[10974] = 88,
[10975] = 40,
[10976] = 88,
[10977] = 41,
[10978] = 88,
[10979] = 42,
[10980] = 88,
[10981] = 43,
[10982] = 88,
[10983] = 44,
[10984] = 88,
[10985] = 45,
[10986] = 88,
[10987] = 46,
[10988] = 88,
[10989] = 47,
[10990] = 88,
[10991] = 48,
[10992] = 88,
[10993] = 49,
[10994] = 88,
[10995] = 50,
[10996] = 88,
[10997] = 51,
[10998] = 88,
[10999] = 52,
[11000] = 88,
[11001] = 53,
[11002] = 88,
[11003] = 54,
[11004] = 88,
[11005] = 55,
[11006] = 88,
[11007] = 56,
[11008] = 88,
[11009] = 57,
[11010] = 88,
[11011] = 58,
[11012] = 88,
[11013] = 59,
[11014] = 88,
[11015] = 60,
[11016] = 88,
[11017] = 61,
[11018] = 88,
[11019] = 62,
[11020] = 88,
[11021] = 63,
[11022] = 88,
[11023] = 64,
[11024] = 88,
[11025] = 28,
[11026] = 89,
[11027] = 29,
[11028] = 89,
[11029] = 30,
[11030] = 89,
[11031] = 31,
[11032] = 89,
[11033] = 32,
[11034] = 89,
[11035] = 33,
[11036] = 89,
[11037] = 34,
[11038] = 89,
[11039] = 35,
[11040] = 89,
[11041] = 36,
[11042] = 89,
[11043] = 37,
[11044] = 89,
[11045] = 38,
[11046] = 89,
[11047] = 39,
[11048] = 89,
[11049] = 40,
[11050] = 89,
[11051] = 41,
[11052] = 89,
[11053] = 42,
[11054] = 89,
[11055] = 43,
[11056] = 89,
[11057] = 44,
[11058] = 89,
[11059] = 45,
[11060] = 89,
[11061] = 46,
[11062] = 89,
[11063] = 47,
[11064] = 89,
[11065] = 48,
[11066] = 89,
[11067] = 49,
[11068] = 89,
[11069] = 50,
[11070] = 89,
[11071] = 51,
[11072] = 89,
[11073] = 52,
[11074] = 89,
[11075] = 53,
[11076] = 89,
[11077] = 54,
[11078] = 89,
[11079] = 55,
[11080] = 89,
[11081] = 56,
[11082] = 89,
[11083] = 57,
[11084] = 89,
[11085] = 58,
[11086] = 89,
[11087] = 59,
[11088] = 89,
[11089] = 60,
[11090] = 89,
[11091] = 61,
[11092] = 89,
[11093] = 62,
[11094] = 89,
[11095] = 29,
[11096] = 90,
[11097] = 30,
[11098] = 90,
[11099] = 31,
[11100] = 90,
[11101] = 32,
[11102] = 90,
[11103] = 33,
[11104] = 90,
[11105] = 34,
[11106] = 90,
[11107] = 35,
[11108] = 90,
[11109] = 36,
[11110] = 90,
[11111] = 37,
[11112] = 90,
[11113] = 38,
[11114] = 90,
[11115] = 39,
[11116] = 90,
[11117] = 40,
[11118] = 90,
[11119] = 41,
[11120] = 90,
[11121] = 42,
[11122] = 90,
[11123] = 43,
[11124] = 90,
[11125] = 44,
[11126] = 90,
[11127] = 45,
[11128] = 90,
[11129] = 46,
[11130] = 90,
[11131] = 47,
[11132] = 90,
[11133] = 48,
[11134] = 90,
[11135] = 49,
[11136] = 90,
[11137] = 50,
[11138] = 90,
[11139] = 51,
[11140] = 90,
[11141] = 52,
[11142] = 90,
[11143] = 53,
[11144] = 90,
[11145] = 54,
[11146] = 90,
[11147] = 55,
[11148] = 90,
[11149] = 56,
[11150] = 90,
[11151] = 57,
[11152] = 90,
[11153] = 58,
[11154] = 90,
[11155] = 59,
[11156] = 90,
[11157] = 60,
[11158] = 90,
[11159] = 61,
[11160] = 90,
[11161] = 30,
[11162] = 91,
[11163] = 31,
[11164] = 91,
[11165] = 32,
[11166] = 91,
[11167] = 33,
[11168] = 91,
[11169] = 34,
[11170] = 91,
[11171] = 35,
[11172] = 91,
[11173] = 36,
[11174] = 91,
[11175] = 37,
[11176] = 91,
[11177] = 38,
[11178] = 91,
[11179] = 39,
[11180] = 91,
[11181] = 40,
[11182] = 91,
[11183] = 41,
[11184] = 91,
[11185] = 42,
[11186] = 91,
[11187] = 43,
[11188] = 91,
[11189] = 44,
[11190] = 91,
[11191] = 45,
[11192] = 91,
[11193] = 46,
[11194] = 91,
[11195] = 47,
[11196] = 91,
[11197] = 48,
[11198] = 91,
[11199] = 49,
[11200] = 91,
[11201] = 50,
[11202] = 91,
[11203] = 51,
[11204] = 91,
[11205] = 52,
[11206] = 91,
[11207] = 53,
[11208] = 91,
[11209] = 54,
[11210] = 91,
[11211] = 55,
[11212] = 91,
[11213] = 56,
[11214] = 91,
[11215] = 57,
[11216] = 91,
[11217] = 58,
[11218] = 91,
[11219] = 59,
[11220] = 91,
[11221] = 31,
[11222] = 92,
[11223] = 32,
[11224] = 92,
[11225] = 33,
[11226] = 92,
[11227] = 34,
[11228] = 92,
[11229] = 35,
[11230] = 92,
[11231] = 36,
[11232] = 92,
[11233] = 37,
[11234] = 92,
[11235] = 38,
[11236] = 92,
[11237] = 39,
[11238] = 92,
[11239] = 40,
[11240] = 92,
[11241] = 41,
[11242] = 92,
[11243] = 42,
[11244] = 92,
[11245] = 43,
[11246] = 92,
[11247] = 44,
[11248] = 92,
[11249] = 45,
[11250] = 92,
[11251] = 46,
[11252] = 92,
[11253] = 47,
[11254] = 92,
[11255] = 48,
[11256] = 92,
[11257] = 49,
[11258] = 92,
[11259] = 50,
[11260] = 92,
[11261] = 51,
[11262] = 92,
[11263] = 52,
[11264] = 92,
[11265] = 53,
[11266] = 92,
[11267] = 54,
[11268] = 92,
[11269] = 55,
[11270] = 92,
[11271] = 56,
[11272] = 92,
[11273] = 57,
[11274] = 92,
[11275] = 31,
[11276] = 93,
[11277] = 32,
[11278] = 93,
[11279] = 33,
[11280] = 93,
[11281] = 34,
[11282] = 93,
[11283] = 35,
[11284] = 93,
[11285] = 36,
[11286] = 93,
[11287] = 37,
[11288] = 93,
[11289] = 38,
[11290] = 93,
[11291] = 39,
[11292] = 93,
[11293] = 40,
[11294] = 93,
[11295] = 41,
[11296] = 93,
[11297] = 42,
[11298] = 93,
[11299] = 43,
[11300] = 93,
[11301] = 44,
[11302] = 93,
[11303] = 45,
[11304] = 93,
[11305] = 46,
[11306] = 93,
[11307] = 47,
[11308] = 93,
[11309] = 48,
[11310] = 93,
[11311] = 49,
[11312] = 93,
[11313] = 50,
[11314] = 93,
[11315] = 51,
[11316] = 93,
[11317] = 52,
[11318] = 93,
[11319] = 53,
[11320] = 93,
[11321] = 54,
[11322] = 93,
[11323] = 33,
[11324] = 94,
[11325] = 34,
[11326] = 94,
[11327] = 35,
[11328] = 94,
[11329] = 36,
[11330] = 94,
[11331] = 37,
[11332] = 94,
[11333] = 38,
[11334] = 94,
[11335] = 39,
[11336] = 94,
[11337] = 40,
[11338] = 94,
[11339] = 41,
[11340] = 94,
[11341] = 42,
[11342] = 94,
[11343] = 43,
[11344] = 94,
[11345] = 44,
[11346] = 94,
[11347] = 45,
[11348] = 94,
[11349] = 46,
[11350] = 94,
[11351] = 47,
[11352] = 94,
[11353] = 48,
[11354] = 94,
[11355] = 49,
[11356] = 94,
[11357] = 50,
[11358] = 94,
[11359] = 51,
[11360] = 94,
[11361] = 52,
[11362] = 94,
[11363] = 53,
[11364] = 94,
[11365] = 54,
[11366] = 94,
[11367] = 55,
[11368] = 94,
[11369] = 35,
[11370] = 95,
[11371] = 36,
[11372] = 95,
[11373] = 37,
[11374] = 95,
[11375] = 38,
[11376] = 95,
[11377] = 39,
[11378] = 95,
[11379] = 40,
[11380] = 95,
[11381] = 41,
[11382] = 95,
[11383] = 42,
[11384] = 95,
[11385] = 43,
[11386] = 95,
[11387] = 44,
[11388] = 95,
[11389] = 45,
[11390] = 95,
[11391] = 46,
[11392] = 95,
[11393] = 47,
[11394] = 95,
[11395] = 48,
[11396] = 95,
[11397] = 49,
[11398] = 95,
[11399] = 50,
[11400] = 95,
[11401] = 51,
[11402] = 95,
[11403] = 52,
[11404] = 95,
[11405] = 53,
[11406] = 95,
[11407] = 54,
[11408] = 95,
[11409] = 55,
[11410] = 95,
[11411] = 57,
[11412] = 95,
[11413] = 36,
[11414] = 96,
[11415] = 37,
[11416] = 96,
[11417] = 38,
[11418] = 96,
[11419] = 39,
[11420] = 96,
[11421] = 40,
[11422] = 96,
[11423] = 41,
[11424] = 96,
[11425] = 42,
[11426] = 96,
[11427] = 43,
[11428] = 96,
[11429] = 44,
[11430] = 96,
[11431] = 45,
[11432] = 96,
[11433] = 46,
[11434] = 96,
[11435] = 47,
[11436] = 96,
[11437] = 48,
[11438] = 96,
[11439] = 49,
[11440] = 96,
[11441] = 50,
[11442] = 96,
[11443] = 51,
[11444] = 96,
[11445] = 52,
[11446] = 96,
[11447] = 53,
[11448] = 96,
[11449] = 54,
[11450] = 96,
[11451] = 55,
[11452] = 96,
[11453] = 56,
[11454] = 96,
[11455] = 57,
[11456] = 96,
[11457] = 58,
[11458] = 96,
[11459] = 39,
[11460] = 97,
[11461] = 40,
[11462] = 97,
[11463] = 41,
[11464] = 97,
[11465] = 42,
[11466] = 97,
[11467] = 43,
[11468] = 97,
[11469] = 44,
[11470] = 97,
[11471] = 45,
[11472] = 97,
[11473] = 46,
[11474] = 97,
[11475] = 47,
[11476] = 97,
[11477] = 48,
[11478] = 97,
[11479] = 49,
[11480] = 97,
[11481] = 50,
[11482] = 97,
[11483] = 51,
[11484] = 97,
[11485] = 52,
[11486] = 97,
[11487] = 53,
[11488] = 97,
[11489] = 54,
[11490] = 97,
[11491] = 55,
[11492] = 97,
[11493] = 56,
[11494] = 97,
[11495] = 57,
[11496] = 97,
[11497] = 41,
[11498] = 98,
[11499] = 42,
[11500] = 98,
[11501] = 43,
[11502] = 98,
[11503] = 44,
[11504] = 98,
[11505] = 45,
[11506] = 98,
[11507] = 46,
[11508] = 98,
[11509] = 47,
[11510] = 98,
[11511] = 48,
[11512] = 98,
[11513] = 49,
[11514] = 98,
[11515] = 50,
[11516] = 98,
[11517] = 51,
[11518] = 98,
[11519] = 52,
[11520] = 98,
[11521] = 53,
[11522] = 98,
[11523] = 54,
[11524] = 98,
[11525] = 45,
[11526] = 99,
[11527] = 46,
[11528] = 99,
[11529] = 47,
[11530] = 99,
[11531] = 48,
[11532] = 99,
[11533] = 49,
[11534] = 99,
[11535] = 50,
[11536] = 99,
[11537] = 51,
[11538] = 99,
} end }
local result = {}
for _,f in ipairs(t) do
for k,v in pairs(f()) do
result[k] = v
end
end
return result
end)(),
poplist = {
5692,
5938,
5723,
5937,
5912,
5740,
5900,
5921,
5742,
5919,
5935,
5949,
5913,
5777,
5726,
5899,
5736,
5941,
5743,
5989,
5905,
5713,
5927,
5933,
5938,
5717,
5957,
5735,
5923,
5715,
5933,
5768,
5721,
5699,
5881,
5879,
5731,
5887,
5749,
5769,
5882,
5773,
5719,
5736,
5752,
5716,
5728,
5931,
5745,
5934,
},
}
-- vi: ft=lua
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment