Ktlo

Stargate Server

Nov 25th, 2024 (edited)
1,053
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 212.64 KB | Software | 0 0
  1. VERSION = 'v1.6.1'
  2. local base64 = [[local a={}local b=_G.bit32 and _G.bit32.extract;if not b then if _G.bit then local c,d,e=_G.bit.lshift,_G.bit.rshift,_G.bit.band;b=function(f,g,h)return e(d(f,g),c(1,h)-1)end elseif _G._VERSION=="Lua 5.1"then b=function(f,g,h)local i=0;local j=2^g;for k=0,h-1 do local l=j+j;if f%l>=j then i=i+2^k end;j=l end;return i end else b=load'return function( v, from, width )return ( v >> from ) & ((1 << width) - 1)end'()end end;function a.makeencoder(m,n,o)local p={}for q,r in pairs{[0]='A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9',m or'+',n or'/',o or'='}do p[q]=r:byte()end;return p end;function a.makedecoder(m,n,o)local s={}for q,t in pairs(a.makeencoder(m,n,o))do s[t]=q end;return s end;local u=a.makeencoder()local v=a.makedecoder()local r,w=string.char,table.concat;function a.encode(x,p,y)p=p or u;local z,A,B={},1,#x;local C=B%3;local D={}for k=1,B-C,3 do local E,F,G=x:byte(k,k+2)local f=E*0x10000+F*0x100+G;local H;if y then H=D[f]if not H then H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])D[f]=H end else H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])end;z[A]=H;A=A+1 end;if C==2 then local E,F=x:byte(B-1,B)local f=E*0x10000+F*0x100;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[64])elseif C==1 then local f=x:byte(B)*0x10000;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[64],p[64])end;return w(z)end;function a.decode(I,s,y)s=s or v;local J='[^%w%+%/%=]'if s then local m,n;for t,q in pairs(s)do if q==62 then m=t elseif q==63 then n=t end end;J=('[^%%w%%%s%%%s%%=]'):format(r(m),r(n))end;I=I:gsub(J,'')local D=y and{}local z,A={},1;local B=#I;local K=I:sub(-2)=='=='and 2 or I:sub(-1)=='='and 1 or 0;for k=1,K>0 and B-4 or B,4 do local E,F,G,L=I:byte(k,k+3)local H;if y then local M=E*0x1000000+F*0x10000+G*0x100+L;H=D[M]if not H then local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))D[M]=H end else local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))end;z[A]=H;A=A+1 end;if K==1 then local E,F,G=I:byte(B-3,B-1)local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40;z[A]=r(b(f,16,8),b(f,8,8))elseif K==2 then local E,F=I:byte(B-3,B-2)local f=s[E]*0x40000+s[F]*0x1000;z[A]=r(b(f,16,8))end;return w(z)end;return a
  3. ]]
  4. base64 = load(base64, "@[included]/base64.lua", 't', _ENV)()
  5.  
  6. function saveExtra(resource, filename)
  7.     filename = filename or resource
  8.     local file = assert(io.open(filename, 'w'))
  9.     file:write(EXTRAS[resource])
  10.     file:close()
  11. end
  12. function saveProgram(filename)
  13.     filename = filename or "sgs.lua"
  14.     local file = assert(io.open(filename, 'w'))
  15.     file:write(PROGRAM)
  16.     file:close()
  17. end
  18. function typeY()
  19.     write("Do you want to continue? (Type Y for continue): ")
  20.     local read = read(nil, nil, nil, "N")
  21.     if read ~= 'Y' then
  22.         print("Exiting...")
  23.         error("Terminated", 0)
  24.     end
  25. end
  26. EXTRAS = {
  27.     ["dialing.dfpwm"] = base64.decode "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1aqqqqpUVa1S1aqqUlVVVbWq0qqqUlVVVbWqqqqqUlVVVbWqqqqqqlRVVVVVq6qqqkpVVVXVqqqqqlJVVVW1qqqqqlJVtVTVqirVqkpVtSpVq6pUrSpVtapUtapUrSpVtapUtapUrSpVtSpVtapUrapUtSpVtapUrapStapU1apUtapStapU1apUtapStapU1SpVtapKtapUVStVtaoqtapSVVVV1aqqqqpSVVVV1aqqqqpSVVVV1aqqqqpSVVVV1aqqqqpSVVVV1aqqqqpSVVVV1aqqqqpUVVVVtaqqqqpU1VJVtaqqqipVrUpVtaqqqqpSrapUVatK1aoqtapKVa1SVa0qtaoqVa1UVa2qsqqqUq0qy1StqtSqqjLNqlRVK03VqipV1VRVVVVVVVVVVVVV1apSrSpVVU1Vs6rSrEpVq6rSqqqqqqrKqqpUq0pVq1LNqsoyVVVNNVVTVVVVNVXNrFRVVVXVSq00VdXUNLWqrKrKyipVrUqtqqrMqkpVtaosq6pKtSpVrbKysiqrSktVVVXNKjVTVVVVVSsrVVVVVVVVVVUzVVVNs6oq1apUtapUq6qyqqqqqqqyqqpUsyrTqspUyyyrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==";
  28.     ["offworld.dfpwm"] = base64.decode "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";
  29. }
  30. PROGRAM = ([[VERSION = 'v1.6.1'
  31. local base64 = <$<local a={}local b=_G.bit32 and _G.bit32.extract;if not b then if _G.bit then local c,d,e=_G.bit.lshift,_G.bit.rshift,_G.bit.band;b=function(f,g,h)return e(d(f,g),c(1,h)-1)end elseif _G._VERSION=="Lua 5.1"then b=function(f,g,h)local i=0;local j=2^g;for k=0,h-1 do local l=j+j;if f%l>=j then i=i+2^k end;j=l end;return i end else b=load'return function( v, from, width )return ( v >> from ) & ((1 << width) - 1)end'()end end;function a.makeencoder(m,n,o)local p={}for q,r in pairs{[0]='A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9',m or'+',n or'/',o or'='}do p[q]=r:byte()end;return p end;function a.makedecoder(m,n,o)local s={}for q,t in pairs(a.makeencoder(m,n,o))do s[t]=q end;return s end;local u=a.makeencoder()local v=a.makedecoder()local r,w=string.char,table.concat;function a.encode(x,p,y)p=p or u;local z,A,B={},1,#x;local C=B%3;local D={}for k=1,B-C,3 do local E,F,G=x:byte(k,k+2)local f=E*0x10000+F*0x100+G;local H;if y then H=D[f]if not H then H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])D[f]=H end else H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])end;z[A]=H;A=A+1 end;if C==2 then local E,F=x:byte(B-1,B)local f=E*0x10000+F*0x100;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[64])elseif C==1 then local f=x:byte(B)*0x10000;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[64],p[64])end;return w(z)end;function a.decode(I,s,y)s=s or v;local J='[^%w%+%/%=]'if s then local m,n;for t,q in pairs(s)do if q==62 then m=t elseif q==63 then n=t end end;J=('[^%%w%%%s%%%s%%=]'):format(r(m),r(n))end;I=I:gsub(J,'')local D=y and{}local z,A={},1;local B=#I;local K=I:sub(-2)=='=='and 2 or I:sub(-1)=='='and 1 or 0;for k=1,K>0 and B-4 or B,4 do local E,F,G,L=I:byte(k,k+3)local H;if y then local M=E*0x1000000+F*0x10000+G*0x100+L;H=D[M]if not H then local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))D[M]=H end else local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))end;z[A]=H;A=A+1 end;if K==1 then local E,F,G=I:byte(B-3,B-1)local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40;z[A]=r(b(f,16,8),b(f,8,8))elseif K==2 then local E,F=I:byte(B-3,B-2)local f=s[E]*0x40000+s[F]*0x1000;z[A]=r(b(f,16,8))end;return w(z)end;return a
  32. >$>
  33. base64 = load(base64, "@[included]/base64.lua", 't', _ENV)()
  34. local modules = {
  35.     ["ccryptolib.chacha20"] = base64.decode "Cgpsb2NhbCBleHBlY3QgID0gcmVxdWlyZSAiY2MuZXhwZWN0Ii5leHBlY3QKbG9jYWwgbGFzc2VydCA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwudXRpbCIubGFzc2VydApsb2NhbCBwYWNraW5nID0gcmVxdWlyZSAiY2NyeXB0b2xpYi5pbnRlcm5hbC5wYWNraW5nIgoKbG9jYWwgYnhvciA9IGJpdDMyLmJ4b3IKbG9jYWwgcm9sID0gYml0MzIubHJvdGF0ZQpsb2NhbCB1OHg0LCBmbXQ4eDQgPSBwYWNraW5nLmNvbXBpbGVVbnBhY2soIjxJNEk0STRJNEk0STRJNEk0IikKbG9jYWwgdTN4NCwgZm10M3g0ID0gcGFja2luZy5jb21waWxlVW5wYWNrKCI8STRJNEk0IikKbG9jYWwgcDE2eDQsIGZtdDE2eDQgPSBwYWNraW5nLmNvbXBpbGVQYWNrKCI8STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STQiKQpsb2NhbCB1MTZ4NCA9IHBhY2tpbmcuY29tcGlsZVVucGFjayhmbXQxNng0KQoKCgoKCgoKCmxvY2FsIGZ1bmN0aW9uIGNyeXB0KGtleSwgbm9uY2UsIG1lc3NhZ2UsIHJvdW5kcywgb2Zmc2V0KQogICAgZXhwZWN0KDEsIGtleSwgInN0cmluZyIpCiAgICBsYXNzZXJ0KCNrZXkgPT0gMzIsICJrZXkgbGVuZ3RoIG11c3QgYmUgMzIiLCAyKQogICAgZXhwZWN0KDIsIG5vbmNlLCAic3RyaW5nIikKICAgIGxhc3NlcnQoI25vbmNlID09IDEyLCAibm9uY2UgbGVuZ3RoIG11c3QgYmUgMTIiLCAyKQogICAgZXhwZWN0KDMsIG1lc3NhZ2UsICJzdHJpbmciKQogICAgcm91bmRzID0gZXhwZWN0KDQsIHJvdW5kcywgIm51bWJlciIsICJuaWwiKSBvciAyMAogICAgbGFzc2VydChyb3VuZHMgJSAyID09IDAsICJyb3VuZCBudW1iZXIgbXVzdCBiZSBldmVuIiwgMikKICAgIGxhc3NlcnQocm91bmRzID49IDgsICJyb3VuZCBudW1iZXIgbXVzdCBiZSBubyBzbWFsbGVyIHRoYW4gOCIsIDIpCiAgICBsYXNzZXJ0KHJvdW5kcyA8PSAyMCwgInJvdW5kIG51bWJlciBtdXN0IGJlIG5vIGxhcmdlciB0aGFuIDIwIiwgMikKICAgIG9mZnNldCA9IGV4cGVjdCg1LCBvZmZzZXQsICJudW1iZXIiLCAibmlsIikgb3IgMQogICAgbGFzc2VydChvZmZzZXQgJSAxID09IDAsICJvZmZzZXQgbXVzdCBiZSBhbiBpbnRlZ2VyIiwgMikKICAgIGxhc3NlcnQob2Zmc2V0ID49IDAsICJvZmZzZXQgbXVzdCBiZSBub25uZWdhdGl2ZSIsIDIpCiAgICBsYXNzZXJ0KCNtZXNzYWdlICsgNjQgKiBvZmZzZXQgPD0gMiBeIDM4LCAib2Zmc2V0IHRvbyBsYXJnZSIsIDIpCgogICAgCiAgICBsb2NhbCBpMCwgaTEsIGkyLCBpMyA9IDB4NjE3MDc4NjUsIDB4MzMyMDY0NmUsIDB4Nzk2MjJkMzIsIDB4NmIyMDY1NzQKICAgIGxvY2FsIGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNyA9IHU4eDQoZm10OHg0LCBrZXksIDEpCiAgICBsb2NhbCBjciwgbjAsIG4xLCBuMiA9IG9mZnNldCwgdTN4NChmbXQzeDQsIG5vbmNlLCAxKQoKICAgIAogICAgbG9jYWwgcGFkZGVkID0gbWVzc2FnZSAuLiAoIlwwIik6cmVwKC0jbWVzc2FnZSAlIDY0KQoKICAgIAogICAgbG9jYWwgb3V0ID0ge30KICAgIGxvY2FsIGlkeCA9IDEKICAgIGZvciBpID0gMSwgI3BhZGRlZCAvIDY0IGRvCiAgICAgICAgCiAgICAgICAgbG9jYWwgczAwLCBzMDEsIHMwMiwgczAzID0gaTAsIGkxLCBpMiwgaTMKICAgICAgICBsb2NhbCBzMDQsIHMwNSwgczA2LCBzMDcgPSBrMCwgazEsIGsyLCBrMwogICAgICAgIGxvY2FsIHMwOCwgczA5LCBzMTAsIHMxMSA9IGs0LCBrNSwgazYsIGs3CiAgICAgICAgbG9jYWwgczEyLCBzMTMsIHMxNCwgczE1ID0gY3IsIG4wLCBuMSwgbjIKCiAgICAgICAgCiAgICAgICAgZm9yIF8gPSAxLCByb3VuZHMsIDIgZG8KICAgICAgICAgICAgczAwID0gczAwICsgczA0IHMxMiA9IHJvbChieG9yKHMxMiwgczAwKSwgMTYpCiAgICAgICAgICAgIHMwOCA9IHMwOCArIHMxMiBzMDQgPSByb2woYnhvcihzMDQsIHMwOCksIDEyKQogICAgICAgICAgICBzMDAgPSBzMDAgKyBzMDQgczEyID0gcm9sKGJ4b3IoczEyLCBzMDApLCA4KQogICAgICAgICAgICBzMDggPSBzMDggKyBzMTIgczA0ID0gcm9sKGJ4b3IoczA0LCBzMDgpLCA3KQoKICAgICAgICAgICAgczAxID0gczAxICsgczA1IHMxMyA9IHJvbChieG9yKHMxMywgczAxKSwgMTYpCiAgICAgICAgICAgIHMwOSA9IHMwOSArIHMxMyBzMDUgPSByb2woYnhvcihzMDUsIHMwOSksIDEyKQogICAgICAgICAgICBzMDEgPSBzMDEgKyBzMDUgczEzID0gcm9sKGJ4b3IoczEzLCBzMDEpLCA4KQogICAgICAgICAgICBzMDkgPSBzMDkgKyBzMTMgczA1ID0gcm9sKGJ4b3IoczA1LCBzMDkpLCA3KQoKICAgICAgICAgICAgczAyID0gczAyICsgczA2IHMxNCA9IHJvbChieG9yKHMxNCwgczAyKSwgMTYpCiAgICAgICAgICAgIHMxMCA9IHMxMCArIHMxNCBzMDYgPSByb2woYnhvcihzMDYsIHMxMCksIDEyKQogICAgICAgICAgICBzMDIgPSBzMDIgKyBzMDYgczE0ID0gcm9sKGJ4b3IoczE0LCBzMDIpLCA4KQogICAgICAgICAgICBzMTAgPSBzMTAgKyBzMTQgczA2ID0gcm9sKGJ4b3IoczA2LCBzMTApLCA3KQoKICAgICAgICAgICAgczAzID0gczAzICsgczA3IHMxNSA9IHJvbChieG9yKHMxNSwgczAzKSwgMTYpCiAgICAgICAgICAgIHMxMSA9IHMxMSArIHMxNSBzMDcgPSByb2woYnhvcihzMDcsIHMxMSksIDEyKQogICAgICAgICAgICBzMDMgPSBzMDMgKyBzMDcgczE1ID0gcm9sKGJ4b3IoczE1LCBzMDMpLCA4KQogICAgICAgICAgICBzMTEgPSBzMTEgKyBzMTUgczA3ID0gcm9sKGJ4b3IoczA3LCBzMTEpLCA3KQoKICAgICAgICAgICAgczAwID0gczAwICsgczA1IHMxNSA9IHJvbChieG9yKHMxNSwgczAwKSwgMTYpCiAgICAgICAgICAgIHMxMCA9IHMxMCArIHMxNSBzMDUgPSByb2woYnhvcihzMDUsIHMxMCksIDEyKQogICAgICAgICAgICBzMDAgPSBzMDAgKyBzMDUgczE1ID0gcm9sKGJ4b3IoczE1LCBzMDApLCA4KQogICAgICAgICAgICBzMTAgPSBzMTAgKyBzMTUgczA1ID0gcm9sKGJ4b3IoczA1LCBzMTApLCA3KQoKICAgICAgICAgICAgczAxID0gczAxICsgczA2IHMxMiA9IHJvbChieG9yKHMxMiwgczAxKSwgMTYpCiAgICAgICAgICAgIHMxMSA9IHMxMSArIHMxMiBzMDYgPSByb2woYnhvcihzMDYsIHMxMSksIDEyKQogICAgICAgICAgICBzMDEgPSBzMDEgKyBzMDYgczEyID0gcm9sKGJ4b3IoczEyLCBzMDEpLCA4KQogICAgICAgICAgICBzMTEgPSBzMTEgKyBzMTIgczA2ID0gcm9sKGJ4b3IoczA2LCBzMTEpLCA3KQoKICAgICAgICAgICAgczAyID0gczAyICsgczA3IHMxMyA9IHJvbChieG9yKHMxMywgczAyKSwgMTYpCiAgICAgICAgICAgIHMwOCA9IHMwOCArIHMxMyBzMDcgPSByb2woYnhvcihzMDcsIHMwOCksIDEyKQogICAgICAgICAgICBzMDIgPSBzMDIgKyBzMDcgczEzID0gcm9sKGJ4b3IoczEzLCBzMDIpLCA4KQogICAgICAgICAgICBzMDggPSBzMDggKyBzMTMgczA3ID0gcm9sKGJ4b3IoczA3LCBzMDgpLCA3KQoKICAgICAgICAgICAgczAzID0gczAzICsgczA0IHMxNCA9IHJvbChieG9yKHMxNCwgczAzKSwgMTYpCiAgICAgICAgICAgIHMwOSA9IHMwOSArIHMxNCBzMDQgPSByb2woYnhvcihzMDQsIHMwOSksIDEyKQogICAgICAgICAgICBzMDMgPSBzMDMgKyBzMDQgczE0ID0gcm9sKGJ4b3IoczE0LCBzMDMpLCA4KQogICAgICAgICAgICBzMDkgPSBzMDkgKyBzMTQgczA0ID0gcm9sKGJ4b3IoczA0LCBzMDkpLCA3KQogICAgICAgIGVuZAoKICAgICAgICAKICAgICAgICBsb2NhbCBtMDAsIG0wMSwgbTAyLCBtMDMsIG0wNCwgbTA1LCBtMDYsIG0wNwogICAgICAgIGxvY2FsIG0wOCwgbTA5LCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0xNCwgbTE1CgogICAgICAgIG0wMCwgbTAxLCBtMDIsIG0wMywgbTA0LCBtMDUsIG0wNiwgbTA3LAogICAgICAgIG0wOCwgbTA5LCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0xNCwgbTE1LCBpZHggPQogICAgICAgICAgICB1MTZ4NChmbXQxNng0LCBwYWRkZWQsIGlkeCkKCiAgICAgICAgCiAgICAgICAgb3V0W2ldID0gcDE2eDQoZm10MTZ4NCwKICAgICAgICAgICAgYnhvcihtMDAsIHMwMCArIGkwKSwgYnhvcihtMDEsIHMwMSArIGkxKSwKICAgICAgICAgICAgYnhvcihtMDIsIHMwMiArIGkyKSwgYnhvcihtMDMsIHMwMyArIGkzKSwKICAgICAgICAgICAgYnhvcihtMDQsIHMwNCArIGswKSwgYnhvcihtMDUsIHMwNSArIGsxKSwKICAgICAgICAgICAgYnhvcihtMDYsIHMwNiArIGsyKSwgYnhvcihtMDcsIHMwNyArIGszKSwKICAgICAgICAgICAgYnhvcihtMDgsIHMwOCArIGs0KSwgYnhvcihtMDksIHMwOSArIGs1KSwKICAgICAgICAgICAgYnhvcihtMTAsIHMxMCArIGs2KSwgYnhvcihtMTEsIHMxMSArIGs3KSwKICAgICAgICAgICAgYnhvcihtMTIsIHMxMiArIGNyKSwgYnhvcihtMTMsIHMxMyArIG4wKSwKICAgICAgICAgICAgYnhvcihtMTQsIHMxNCArIG4xKSwgYnhvcihtMTUsIHMxNSArIG4yKQogICAgICAgICkKCiAgICAgICAgCiAgICAgICAgY3IgPSBjciArIDEKICAgIGVuZAoKICAgIHJldHVybiB0YWJsZS5jb25jYXQob3V0KTpzdWIoMSwgI21lc3NhZ2UpCmVuZAoKcmV0dXJuIHsKICAgIGNyeXB0ID0gY3J5cHQsCn0K";
  36.     ["ccryptolib.internal.mp"] = base64.decode "Cgpsb2NhbCB1bnBhY2sgPSB1bnBhY2sgb3IgdGFibGUudW5wYWNrCgoKCgoKCgoKCgoKCgoKbG9jYWwgZnVuY3Rpb24gY2FycnlXZWFrKGEpCiAgICBsb2NhbCBhMDAsIGEwMSwgYTAyLCBhMDMsIGEwNCwgYTA1LCBhMDYsIGEwNywgYTA4LCBhMDksIGExMCA9IHVucGFjayhhKQoKICAgIGxvY2FsIGgwMCA9IGEwMCArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwMSA9IGEwMSArIGgwMCAqIDIgXiAtMjQKICAgIGxvY2FsIGgwMSA9IGEwMSArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwMiA9IGEwMiArIGgwMSAqIDIgXiAtMjQKICAgIGxvY2FsIGgwMiA9IGEwMiArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwMyA9IGEwMyArIGgwMiAqIDIgXiAtMjQKICAgIGxvY2FsIGgwMyA9IGEwMyArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwNCA9IGEwNCArIGgwMyAqIDIgXiAtMjQKICAgIGxvY2FsIGgwNCA9IGEwNCArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwNSA9IGEwNSArIGgwNCAqIDIgXiAtMjQKICAgIGxvY2FsIGgwNSA9IGEwNSArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwNiA9IGEwNiArIGgwNSAqIDIgXiAtMjQKICAgIGxvY2FsIGgwNiA9IGEwNiArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwNyA9IGEwNyArIGgwNiAqIDIgXiAtMjQKICAgIGxvY2FsIGgwNyA9IGEwNyArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwOCA9IGEwOCArIGgwNyAqIDIgXiAtMjQKICAgIGxvY2FsIGgwOCA9IGEwOCArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGEwOSA9IGEwOSArIGgwOCAqIDIgXiAtMjQKICAgIGxvY2FsIGgwOSA9IGEwOSArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1IGExMCA9IGExMCArIGgwOSAqIDIgXiAtMjQKICAgIGxvY2FsIGgxMCA9IGExMCArIDMgKiAyIF4gNzUgLSAzICogMiBeIDc1CgogICAgcmV0dXJuIHsKICAgICAgICBhMDAgLSBoMDAsCiAgICAgICAgYTAxIC0gaDAxLAogICAgICAgIGEwMiAtIGgwMiwKICAgICAgICBhMDMgLSBoMDMsCiAgICAgICAgYTA0IC0gaDA0LAogICAgICAgIGEwNSAtIGgwNSwKICAgICAgICBhMDYgLSBoMDYsCiAgICAgICAgYTA3IC0gaDA3LAogICAgICAgIGEwOCAtIGgwOCwKICAgICAgICBhMDkgLSBoMDksCiAgICAgICAgYTEwIC0gaDEwLAogICAgfSwgaDEwICogMiBeIC0yNAplbmQKCgoKCgpsb2NhbCBmdW5jdGlvbiBjYXJyeShhKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAgPSB1bnBhY2soYSkKCiAgICBsb2NhbCBsMDAgPSBhMDAgJSAyIF4gMjQgYTAxID0gYTAxICsgKGEwMCAtIGwwMCkgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDEgPSBhMDEgJSAyIF4gMjQgYTAyID0gYTAyICsgKGEwMSAtIGwwMSkgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDIgPSBhMDIgJSAyIF4gMjQgYTAzID0gYTAzICsgKGEwMiAtIGwwMikgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDMgPSBhMDMgJSAyIF4gMjQgYTA0ID0gYTA0ICsgKGEwMyAtIGwwMykgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDQgPSBhMDQgJSAyIF4gMjQgYTA1ID0gYTA1ICsgKGEwNCAtIGwwNCkgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDUgPSBhMDUgJSAyIF4gMjQgYTA2ID0gYTA2ICsgKGEwNSAtIGwwNSkgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDYgPSBhMDYgJSAyIF4gMjQgYTA3ID0gYTA3ICsgKGEwNiAtIGwwNikgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDcgPSBhMDcgJSAyIF4gMjQgYTA4ID0gYTA4ICsgKGEwNyAtIGwwNykgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDggPSBhMDggJSAyIF4gMjQgYTA5ID0gYTA5ICsgKGEwOCAtIGwwOCkgKiAyIF4gLTI0CiAgICBsb2NhbCBsMDkgPSBhMDkgJSAyIF4gMjQgYTEwID0gYTEwICsgKGEwOSAtIGwwOSkgKiAyIF4gLTI0CiAgICBsb2NhbCBsMTAgPSBhMTAgJSAyIF4gMjQKICAgIGxvY2FsIGgxMCA9IChhMTAgLSBsMTApICogMiBeIC0yNAoKICAgIHJldHVybiB7bDAwLCBsMDEsIGwwMiwgbDAzLCBsMDQsIGwwNSwgbDA2LCBsMDcsIGwwOCwgbDA5LCBsMTB9LCBoMTAKZW5kCgoKCgoKbG9jYWwgZnVuY3Rpb24gYWRkKGEsIGIpCiAgICBsb2NhbCBhMDAsIGEwMSwgYTAyLCBhMDMsIGEwNCwgYTA1LCBhMDYsIGEwNywgYTA4LCBhMDksIGExMCA9IHVucGFjayhhKQogICAgbG9jYWwgYjAwLCBiMDEsIGIwMiwgYjAzLCBiMDQsIGIwNSwgYjA2LCBiMDcsIGIwOCwgYjA5LCBiMTAgPSB1bnBhY2soYikKCiAgICByZXR1cm4gewogICAgICAgIGEwMCArIGIwMCwKICAgICAgICBhMDEgKyBiMDEsCiAgICAgICAgYTAyICsgYjAyLAogICAgICAgIGEwMyArIGIwMywKICAgICAgICBhMDQgKyBiMDQsCiAgICAgICAgYTA1ICsgYjA1LAogICAgICAgIGEwNiArIGIwNiwKICAgICAgICBhMDcgKyBiMDcsCiAgICAgICAgYTA4ICsgYjA4LAogICAgICAgIGEwOSArIGIwOSwKICAgICAgICBhMTAgKyBiMTAsCiAgICB9CmVuZAoKCgoKCmxvY2FsIGZ1bmN0aW9uIHN1YihhLCBiKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAgPSB1bnBhY2soYSkKICAgIGxvY2FsIGIwMCwgYjAxLCBiMDIsIGIwMywgYjA0LCBiMDUsIGIwNiwgYjA3LCBiMDgsIGIwOSwgYjEwID0gdW5wYWNrKGIpCgogICAgcmV0dXJuIHsKICAgICAgICBhMDAgLSBiMDAsCiAgICAgICAgYTAxIC0gYjAxLAogICAgICAgIGEwMiAtIGIwMiwKICAgICAgICBhMDMgLSBiMDMsCiAgICAgICAgYTA0IC0gYjA0LAogICAgICAgIGEwNSAtIGIwNSwKICAgICAgICBhMDYgLSBiMDYsCiAgICAgICAgYTA3IC0gYjA3LAogICAgICAgIGEwOCAtIGIwOCwKICAgICAgICBhMDkgLSBiMDksCiAgICAgICAgYTEwIC0gYjEwLAogICAgfQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gbG11bChhLCBiKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAgPSB1bnBhY2soYSkKICAgIGxvY2FsIGIwMCwgYjAxLCBiMDIsIGIwMywgYjA0LCBiMDUsIGIwNiwgYjA3LCBiMDgsIGIwOSwgYjEwID0gdW5wYWNrKGIpCgogICAgcmV0dXJuIGNhcnJ5IHsKICAgICAgICBhMDAgKiBiMDAsCiAgICAgICAgYTAxICogYjAwICsgYTAwICogYjAxLAogICAgICAgIGEwMiAqIGIwMCArIGEwMSAqIGIwMSArIGEwMCAqIGIwMiwKICAgICAgICBhMDMgKiBiMDAgKyBhMDIgKiBiMDEgKyBhMDEgKiBiMDIgKyBhMDAgKiBiMDMsCiAgICAgICAgYTA0ICogYjAwICsgYTAzICogYjAxICsgYTAyICogYjAyICsgYTAxICogYjAzICsgYTAwICogYjA0LAogICAgICAgIGEwNSAqIGIwMCArIGEwNCAqIGIwMSArIGEwMyAqIGIwMiArIGEwMiAqIGIwMyArIGEwMSAqIGIwNCArIGEwMCAqIGIwNSwKICAgICAgICBhMDYgKiBiMDAgKyBhMDUgKiBiMDEgKyBhMDQgKiBiMDIgKyBhMDMgKiBiMDMgKyBhMDIgKiBiMDQgKyBhMDEgKiBiMDUgKyBhMDAgKiBiMDYsCiAgICAgICAgYTA3ICogYjAwICsgYTA2ICogYjAxICsgYTA1ICogYjAyICsgYTA0ICogYjAzICsgYTAzICogYjA0ICsgYTAyICogYjA1ICsgYTAxICogYjA2ICsgYTAwICogYjA3LAogICAgICAgIGEwOCAqIGIwMCArIGEwNyAqIGIwMSArIGEwNiAqIGIwMiArIGEwNSAqIGIwMyArIGEwNCAqIGIwNCArIGEwMyAqIGIwNSArIGEwMiAqIGIwNiArIGEwMSAqIGIwNyArIGEwMCAqIGIwOCwKICAgICAgICBhMDkgKiBiMDAgKyBhMDggKiBiMDEgKyBhMDcgKiBiMDIgKyBhMDYgKiBiMDMgKyBhMDUgKiBiMDQgKyBhMDQgKiBiMDUgKyBhMDMgKiBiMDYgKyBhMDIgKiBiMDcgKyBhMDEgKiBiMDggKyBhMDAgKiBiMDksCiAgICAgICAgYTEwICogYjAwICsgYTA5ICogYjAxICsgYTA4ICogYjAyICsgYTA3ICogYjAzICsgYTA2ICogYjA0ICsgYTA1ICogYjA1ICsgYTA0ICogYjA2ICsgYTAzICogYjA3ICsgYTAyICogYjA4ICsgYTAxICogYjA5ICsgYTAwICogYjEwLAogICAgfQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gbXVsKGEsIGIpCiAgICBsb2NhbCBsb3csIG9mID0gbG11bChhLCBiKQoKICAgIGxvY2FsIF8sIGEwMSwgYTAyLCBhMDMsIGEwNCwgYTA1LCBhMDYsIGEwNywgYTA4LCBhMDksIGExMCA9IHVucGFjayhhKQogICAgbG9jYWwgXywgYjAxLCBiMDIsIGIwMywgYjA0LCBiMDUsIGIwNiwgYjA3LCBiMDgsIGIwOSwgYjEwID0gdW5wYWNrKGIpCgogICAgCiAgICByZXR1cm4gbG93LCAoY2FycnkgewogICAgICAgIG9mICsgYTEwICogYjAxICsgYTA5ICogYjAyICsgYTA4ICogYjAzICsgYTA3ICogYjA0ICsgYTA2ICogYjA1ICsgYTA1ICogYjA2ICsgYTA0ICogYjA3ICsgYTAzICogYjA4ICsgYTAyICogYjA5ICsgYTAxICogYjEwLAogICAgICAgIGExMCAqIGIwMiArIGEwOSAqIGIwMyArIGEwOCAqIGIwNCArIGEwNyAqIGIwNSArIGEwNiAqIGIwNiArIGEwNSAqIGIwNyArIGEwNCAqIGIwOCArIGEwMyAqIGIwOSArIGEwMiAqIGIxMCwKICAgICAgICBhMTAgKiBiMDMgKyBhMDkgKiBiMDQgKyBhMDggKiBiMDUgKyBhMDcgKiBiMDYgKyBhMDYgKiBiMDcgKyBhMDUgKiBiMDggKyBhMDQgKiBiMDkgKyBhMDMgKiBiMTAsCiAgICAgICAgYTEwICogYjA0ICsgYTA5ICogYjA1ICsgYTA4ICogYjA2ICsgYTA3ICogYjA3ICsgYTA2ICogYjA4ICsgYTA1ICogYjA5ICsgYTA0ICogYjEwLAogICAgICAgIGExMCAqIGIwNSArIGEwOSAqIGIwNiArIGEwOCAqIGIwNyArIGEwNyAqIGIwOCArIGEwNiAqIGIwOSArIGEwNSAqIGIxMCwKICAgICAgICBhMTAgKiBiMDYgKyBhMDkgKiBiMDcgKyBhMDggKiBiMDggKyBhMDcgKiBiMDkgKyBhMDYgKiBiMTAsCiAgICAgICAgYTEwICogYjA3ICsgYTA5ICogYjA4ICsgYTA4ICogYjA5ICsgYTA3ICogYjEwLAogICAgICAgIGExMCAqIGIwOCArIGEwOSAqIGIwOSArIGEwOCAqIGIxMCwKICAgICAgICBhMTAgKiBiMDkgKyBhMDkgKiBiMTAsCiAgICAgICAgYTEwICogYjEwLAogICAgICAgIDAKICAgIH0pCmVuZAoKCgoKCgoKCgpsb2NhbCBmdW5jdGlvbiBkd2FkZChhMCwgYTEsIGIwLCBiMSkKICAgIGxvY2FsIGxvdywgYyA9IGNhcnJ5KGFkZChhMCwgYjApKQogICAgbG9jYWwgaGlnaCA9IGFkZChhMSwgYjEpCiAgICBoaWdoWzFdID0gaGlnaFsxXSArIGMKICAgIHJldHVybiBsb3csIGNhcnJ5KGhpZ2gpCmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gaGFsZihhKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAgPSB1bnBhY2soYSkKCiAgICByZXR1cm4gKGNhcnJ5V2VhayB7CiAgICAgICAgYTAwICogMC41ICsgYTAxICogMiBeIDIzLAogICAgICAgIGEwMiAqIDIgXiAyMywKICAgICAgICBhMDMgKiAyIF4gMjMsCiAgICAgICAgYTA0ICogMiBeIDIzLAogICAgICAgIGEwNSAqIDIgXiAyMywKICAgICAgICBhMDYgKiAyIF4gMjMsCiAgICAgICAgYTA3ICogMiBeIDIzLAogICAgICAgIGEwOCAqIDIgXiAyMywKICAgICAgICBhMDkgKiAyIF4gMjMsCiAgICAgICAgYTEwICogMiBeIDIzLAogICAgICAgIDAsCiAgICB9KQplbmQKCgoKCmxvY2FsIGZ1bmN0aW9uIHRoaXJkKGEpCiAgICBsb2NhbCBhMDAsIGEwMSwgYTAyLCBhMDMsIGEwNCwgYTA1LCBhMDYsIGEwNywgYTA4LCBhMDksIGExMCA9IHVucGFjayhhKQoKICAgIGxvY2FsIGQwMCA9IGEwMCAqIDB4YWFhYWFhCiAgICBsb2NhbCBkMDEgPSBhMDEgKiAweGFhYWFhYSArIGQwMAogICAgbG9jYWwgZDAyID0gYTAyICogMHhhYWFhYWEgKyBkMDEKICAgIGxvY2FsIGQwMyA9IGEwMyAqIDB4YWFhYWFhICsgZDAyCiAgICBsb2NhbCBkMDQgPSBhMDQgKiAweGFhYWFhYSArIGQwMwogICAgbG9jYWwgZDA1ID0gYTA1ICogMHhhYWFhYWEgKyBkMDQKICAgIGxvY2FsIGQwNiA9IGEwNiAqIDB4YWFhYWFhICsgZDA1CiAgICBsb2NhbCBkMDcgPSBhMDcgKiAweGFhYWFhYSArIGQwNgogICAgbG9jYWwgZDA4ID0gYTA4ICogMHhhYWFhYWEgKyBkMDcKICAgIGxvY2FsIGQwOSA9IGEwOSAqIDB4YWFhYWFhICsgZDA4CiAgICBsb2NhbCBkMTAgPSBhMTAgKiAweGFhYWFhYSArIGQwOQoKICAgIAogICAgCiAgICByZXR1cm4gKGNhcnJ5V2VhayB7CiAgICAgICAgYTAwICsgZDAwLAogICAgICAgIGEwMSArIGQwMSwKICAgICAgICBhMDIgKyBkMDIsCiAgICAgICAgYTAzICsgZDAzLAogICAgICAgIGEwNCArIGQwNCwKICAgICAgICBhMDUgKyBkMDUsCiAgICAgICAgYTA2ICsgZDA2LAogICAgICAgIGEwNyArIGQwNywKICAgICAgICBhMDggKyBkMDgsCiAgICAgICAgYTA5ICsgZDA5LAogICAgICAgIGExMCArIGQxMCwKICAgIH0pCmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gbW9kMihhKQogICAgcmV0dXJuIGFbMV0gJSAyCmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gbW9kMyhhKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAgPSB1bnBhY2soYSkKICAgIHJldHVybiAoYTAwICsgYTAxICsgYTAyICsgYTAzICsgYTA0ICsgYTA1ICsgYTA2ICsgYTA3ICsgYTA4ICsgYTA5ICsgYTEwKSAlIDMKZW5kCgoKCgpsb2NhbCBmdW5jdGlvbiBhcHByb3goYSkKICAgIGxvY2FsIGEwMCwgYTAxLCBhMDIsIGEwMywgYTA0LCBhMDUsIGEwNiwgYTA3LCBhMDgsIGEwOSwgYTEwID0gdW5wYWNrKGEpCiAgICByZXR1cm4gYTAwCiAgICAgICAgICsgYTAxICogMiBeIDI0CiAgICAgICAgICsgYTAyICogMiBeIDQ4CiAgICAgICAgICsgYTAzICogMiBeIDcyCiAgICAgICAgICsgYTA0ICogMiBeIDk2CiAgICAgICAgICsgYTA1ICogMiBeIDEyMAogICAgICAgICArIGEwNiAqIDIgXiAxNDQKICAgICAgICAgKyBhMDcgKiAyIF4gMTY4CiAgICAgICAgICsgYTA4ICogMiBeIDE5MgogICAgICAgICArIGEwOSAqIDIgXiAyMTYKICAgICAgICAgKyBhMTAgKiAyIF4gMjQwCmVuZAoKCgoKCmxvY2FsIGZ1bmN0aW9uIGNtcChhLCBiKQogICAgcmV0dXJuIGFwcHJveChzdWIoYSwgYikpCmVuZAoKbG9jYWwgZnVuY3Rpb24gbnVtKGEpCiAgICByZXR1cm4ge2EsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CmVuZAoKcmV0dXJuIHsKICAgIGNhcnJ5ID0gY2FycnksCiAgICBjYXJyeVdlYWsgPSBjYXJyeVdlYWssCiAgICBhZGQgPSBhZGQsCiAgICBzdWIgPSBzdWIsCiAgICBkd2FkZCA9IGR3YWRkLAogICAgbG11bCA9IGxtdWwsCiAgICBtdWwgPSBtdWwsCiAgICBoYWxmID0gaGFsZiwKICAgIHRoaXJkID0gdGhpcmQsCiAgICBtb2QyID0gbW9kMiwKICAgIG1vZDMgPSBtb2QzLAogICAgYXBwcm94ID0gYXBwcm94LAogICAgY21wID0gY21wLAogICAgbnVtID0gbnVtLAp9Cg==";
  37.     ["ccryptolib.internal.fq"] = base64.decode "Cgpsb2NhbCBtcCA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwubXAiCmxvY2FsIHV0aWwgPSByZXF1aXJlICJjY3J5cHRvbGliLmludGVybmFsLnV0aWwiCmxvY2FsIHBhY2tpbmcgPSByZXF1aXJlICJjY3J5cHRvbGliLmludGVybmFsLnBhY2tpbmciCgpsb2NhbCB1bnBhY2sgPSB1bnBhY2sgb3IgdGFibGUudW5wYWNrCmxvY2FsIHBmcSwgZm10ZnEgPSBwYWNraW5nLmNvbXBpbGVQYWNrKCI8STNJM0kzSTNJM0kzSTNJM0kzSTNJMiIpCmxvY2FsIHVmcSA9IHBhY2tpbmcuY29tcGlsZVVucGFjayhmbXRmcSkKbG9jYWwgdWZxbCwgZm10ZnFsID0gcGFja2luZy5jb21waWxlVW5wYWNrKCI8STNJM0kzSTNJM0kzSTNJM0kzSTNJMyIpCmxvY2FsIHVmcWgsIGZtdGZxaCA9IHBhY2tpbmcuY29tcGlsZVVucGFjaygiPEkzSTNJM0kzSTNJM0kzSTNJM0kzSTEiKQoKCmxvY2FsIFEgPSB7CiAgICAxNjExMDU3MywKICAgIDA2NDk0ODEyLAogICAgMTQwNDcyNTAsCiAgICAxMDY4MDIyMCwKICAgIDE0NjEyOTU4LAogICAgMDAwMDAwMjAsCiAgICAwMDAwMDAwMCwKICAgIDAwMDAwMDAwLAogICAgMDAwMDAwMDAsCiAgICAwMDAwMDAwMCwKICAgIDAwMDA0MDk2LAp9CgoKbG9jYWwgVDAgPSB7CiAgICAwNTUzNzMwNywKICAgIDAxOTQyMjkwLAogICAgMTY3NjU2MjEsCiAgICAxNjYyODM1NiwKICAgIDEwNjE4NjEwLAogICAgMDcwNzI0MzMsCiAgICAwMzczNTQ1OSwKICAgIDAxMzY5OTQwLAogICAgMTUyNzYwODYsCiAgICAxMzAzODE5MSwKICAgIDEzNDA5NzE4LAp9CgoKbG9jYWwgVDEgPSB7CiAgICAxMTcxMTk5NiwKICAgIDAxNzQ3ODYwLAogICAgMDgzMjY5NjEsCiAgICAwMzgxNDcxOCwKICAgIDAxODU5OTc0LAogICAgMTMzMjc0NjEsCiAgICAxNjEwNTA2MSwKICAgIDA3NTkwNDIzLAogICAgMDQwNTA2NjgsCiAgICAwODEzODkwNiwKICAgIDAwMDAwMjgzLAp9Cgpsb2NhbCBUOCA9IHsKICAgIDUxMTAyNTMsCiAgICAzMDM5MzQ1LAogICAgMjUwMzUwMCwKICAgIDExNzc5NTY4LAogICAgMTU0MTY0NzIsCiAgICAxNjc2NjU1MCwKICAgIDE2Nzc3MjE1LAogICAgMTY3NzcyMTUsCiAgICAxNjc3NzIxNSwKICAgIDE2Nzc3MjE1LAogICAgNDA5NSwKfQoKbG9jYWwgWkVSTyA9IG1wLm51bSgwKQoKCgoKCgpsb2NhbCBmdW5jdGlvbiByZWR1Y2UoYSkKICAgIGxvY2FsIGMgPSBtcC5zdWIoYSwgUSkKCiAgICAKICAgIGlmIG1wLmFwcHJveChjKSA8IDAgdGhlbiByZXR1cm4gKG1wLmNhcnJ5KGEpKSBlbmQKCiAgICAKICAgIAogICAgCiAgICByZXR1cm4gKG1wLmNhcnJ5KGMpKSAKZW5kCgoKCgoKCgoKCgpsb2NhbCBmdW5jdGlvbiBhZGQoYSwgYikKICAgIHJldHVybiByZWR1Y2UobXAuYWRkKGEsIGIpKQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gbmVnKGEpCiAgICByZXR1cm4gcmVkdWNlKG1wLnN1YihRLCBhKSkKZW5kCgoKCgoKCgoKCgpsb2NhbCBmdW5jdGlvbiBzdWIoYSwgYikKICAgIHJldHVybiBhZGQoYSwgbmVnKGIpKQplbmQKCgoKCgoKCmxvY2FsIGZ1bmN0aW9uIG11bChhLCBiKQogICAgbG9jYWwgdDAsIHQxID0gbXAubXVsKGEsIGIpCiAgICBsb2NhbCBtcTAsIG1xMSA9IG1wLm11bChtcC5sbXVsKHQwLCBUMCksIFEpCiAgICBsb2NhbCBfLCBzMSA9IG1wLmR3YWRkKHQwLCB0MSwgbXEwLCBtcTEpCiAgICByZXR1cm4gcmVkdWNlKHMxKQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gbW9udGdvbWVyeShhKQogICAgCiAgICByZXR1cm4gbXVsKGEsIFQxKQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gZGVtb250Z29tZXJ5KGEpCiAgICAKICAgIGxvY2FsIG1xMCwgbXExID0gbXAubXVsKG1wLmxtdWwoYSwgVDApLCBRKQogICAgbG9jYWwgXywgczEgPSBtcC5kd2FkZChhLCBaRVJPLCBtcTAsIG1xMSkKICAgIHJldHVybiByZWR1Y2UoczEpCmVuZAoKCgoKCgpsb2NhbCBmdW5jdGlvbiBlbmNvZGUoYSkKICAgIHJldHVybiBwZnEoZm10ZnEsIHVucGFjayhkZW1vbnRnb21lcnkoYSkpKQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gZGVjb2RlKHN0cikKICAgIGxvY2FsIGRlYyA9IHt1ZnEoZm10ZnEsIHN0ciwgMSl9IGRlY1sxMl0gPSBuaWwKICAgIHJldHVybiBtb250Z29tZXJ5KGRlYykKZW5kCgoKCgoKCmxvY2FsIGZ1bmN0aW9uIGRlY29kZVdpZGUoc3RyKQogICAgbG9jYWwgbG93ID0ge3VmcWwoZm10ZnFsLCBzdHIsIDEpfSBsb3dbMTJdID0gbmlsCiAgICBsb2NhbCBoaWdoID0ge3VmcWgoZm10ZnFoLCBzdHIsIDM0KX0gaGlnaFsxMl0gPSBuaWwKICAgIHJldHVybiBhZGQobW9udGdvbWVyeShsb3cpLCBtb250Z29tZXJ5KG1vbnRnb21lcnkoaGlnaCkpKQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gZGVjb2RlQ2xhbXBlZChzdHIpCiAgICAKICAgIGxvY2FsIHdvcmRzID0ge3VmcShmbXRmcSwgc3RyLCAxKX0gd29yZHNbMTJdID0gbmlsCgogICAgCiAgICB3b3Jkc1sxXSA9IGJpdDMyLmJhbmQod29yZHNbMV0sIDB4ZmZmZmY4KQogICAgd29yZHNbMTFdID0gYml0MzIuYmFuZCh3b3Jkc1sxMV0sIDB4N2ZmZikKICAgIHdvcmRzWzExXSA9IGJpdDMyLmJvcih3b3Jkc1sxMV0sIDB4NDAwMCkKCiAgICByZXR1cm4gbW9udGdvbWVyeSh3b3JkcykKZW5kCgoKCgoKbG9jYWwgZnVuY3Rpb24gZWlnaHRoKGEpCiAgICByZXR1cm4gbXVsKGEsIFQ4KQplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gYml0cyhhKQogICAgbG9jYWwgb3V0ID0gdXRpbC5yZWJhc2VMRShkZW1vbnRnb21lcnkoYSksIDIgXiAyNCwgMikKICAgIGZvciBpID0gMjU0LCAyODkgZG8gb3V0W2ldID0gbmlsIGVuZAogICAgcmV0dXJuIG91dAplbmQKCgoKCgoKCgoKCgpsb2NhbCBmdW5jdGlvbiBtYWtlUnVsZXNldChhLCBiKQogICAgCiAgICBsb2NhbCBkdCA9IGRlbW9udGdvbWVyeShhKSAKICAgIGxvY2FsIGV0ID0gZGVtb250Z29tZXJ5KGIpIAogICAgbG9jYWwgZnQgPSBtcC5zdWIoZHQsIGV0KSAgCgogICAgCiAgICBsb2NhbCBkMiA9IG1wLm1vZDIoZHQpCiAgICBsb2NhbCBlMiA9IG1wLm1vZDIoZXQpCgogICAgCiAgICBsb2NhbCBkMyA9IG1wLm1vZDMoZHQpCiAgICBsb2NhbCBlMyA9IG1wLm1vZDMoZXQpCgogICAgCiAgICBsb2NhbCBlZiA9IG1wLmFwcHJveChldCkKICAgIGxvY2FsIGZmID0gbXAuYXBwcm94KGZ0KQoKICAgIAogICAgbG9jYWwgbHV0MyA9IHtbMF0gPSAwLCAyLCAxfQoKICAgIGxvY2FsIHJ1bGVzID0ge30KICAgIHdoaWxlIGZmIH49IDAgZG8KICAgICAgICBpZiBmZiA8IDAgdGhlbgogICAgICAgICAgICAKICAgICAgICAgICAgcnVsZXNbI3J1bGVzICsgMV0gPSAwCiAgICAgICAgICAgIAogICAgICAgICAgICBkdCwgZXQgPSBldCwgZHQKICAgICAgICAgICAgZDIsIGUyID0gZTIsIGQyCiAgICAgICAgICAgIGQzLCBlMyA9IGUzLCBkMwogICAgICAgICAgICBlZiA9IG1wLmFwcHJveChldCkKICAgICAgICAgICAgZnQgPSBtcC5zdWIoZHQsIGV0KQogICAgICAgICAgICBmZiA9IC1mZgogICAgICAgIGVsc2VpZiA0ICogZmYgPCBlZiBhbmQgZDMgPT0gbHV0M1tlM10gdGhlbgogICAgICAgICAgICAKICAgICAgICAgICAgcnVsZXNbI3J1bGVzICsgMV0gPSAxCiAgICAgICAgICAgIAogICAgICAgICAgICBkdCwgZXQgPSBtcC50aGlyZChtcC5hZGQoZHQsIGZ0KSksIG1wLnRoaXJkKG1wLnN1YihldCwgZnQpKQogICAgICAgICAgICBkMiwgZTIgPSBlMiwgZDIKICAgICAgICAgICAgZDMsIGUzID0gbXAubW9kMyhkdCksIG1wLm1vZDMoZXQpCiAgICAgICAgICAgIGVmID0gbXAuYXBwcm94KGV0KQogICAgICAgIGVsc2VpZiA0ICogZmYgPCBlZiBhbmQgZDIgPT0gZTIgYW5kIGQzID09IGUzIHRoZW4KICAgICAgICAgICAgCiAgICAgICAgICAgIHJ1bGVzWyNydWxlcyArIDFdID0gMgogICAgICAgICAgICAKICAgICAgICAgICAgZHQgPSBtcC5oYWxmKGZ0KQogICAgICAgICAgICBkMiA9IG1wLm1vZDIoZHQpCiAgICAgICAgICAgIGQzID0gbHV0M1soZDMgLSBlMykgJSAzXQogICAgICAgICAgICBmdCA9IG1wLnN1YihkdCwgZXQpCiAgICAgICAgICAgIGZmID0gbXAuYXBwcm94KGZ0KQogICAgICAgIGVsc2VpZiBmZiA8IDMgKiBlZiB0aGVuCiAgICAgICAgICAgIAogICAgICAgICAgICBydWxlc1sjcnVsZXMgKyAxXSA9IDMKICAgICAgICAgICAgCiAgICAgICAgICAgIGR0ID0gbXAuY2FycnlXZWFrKGZ0KQogICAgICAgICAgICBkMiA9IChkMiAtIGUyKSAlIDIKICAgICAgICAgICAgZDMgPSAoZDMgLSBlMykgJSAzCiAgICAgICAgICAgIGZ0ID0gbXAuc3ViKGR0LCBldCkKICAgICAgICAgICAgZmYgPSBtcC5hcHByb3goZnQpCiAgICAgICAgZWxzZWlmIGQyID09IGUyIHRoZW4KICAgICAgICAgICAgCiAgICAgICAgICAgIHJ1bGVzWyNydWxlcyArIDFdID0gMgogICAgICAgICAgICAKICAgICAgICAgICAgZHQgPSBtcC5oYWxmKGZ0KQogICAgICAgICAgICBkMiA9IG1wLm1vZDIoZHQpCiAgICAgICAgICAgIGQzID0gbHV0M1soZDMgLSBlMykgJSAzXQogICAgICAgICAgICBmdCA9IG1wLnN1YihkdCwgZXQpCiAgICAgICAgICAgIGZmID0gbXAuYXBwcm94KGZ0KQogICAgICAgIGVsc2VpZiBkMiA9PSAwIHRoZW4KICAgICAgICAgICAgCiAgICAgICAgICAgIHJ1bGVzWyNydWxlcyArIDFdID0gNQogICAgICAgICAgICAKICAgICAgICAgICAgZHQgPSBtcC5oYWxmKGR0KQogICAgICAgICAgICBkMiA9IG1wLm1vZDIoZHQpCiAgICAgICAgICAgIGQzID0gbHV0M1tkM10KICAgICAgICAgICAgZnQgPSBtcC5zdWIoZHQsIGV0KQogICAgICAgICAgICBmZiA9IG1wLmFwcHJveChmdCkKICAgICAgICBlbHNlaWYgZDMgPT0gMCB0aGVuCiAgICAgICAgICAgIAogICAgICAgICAgICBydWxlc1sjcnVsZXMgKyAxXSA9IDYKICAgICAgICAgICAgCiAgICAgICAgICAgIGR0ID0gbXAuY2FycnlXZWFrKG1wLnN1YihtcC50aGlyZChkdCksIGV0KSkKICAgICAgICAgICAgZDIgPSAoZDIgLSBlMikgJSAyCiAgICAgICAgICAgIGQzID0gbXAubW9kMyhkdCkKICAgICAgICAgICAgZnQgPSBtcC5zdWIoZHQsIGV0KQogICAgICAgICAgICBmZiA9IG1wLmFwcHJveChmdCkKICAgICAgICBlbHNlaWYgZDMgPT0gbHV0M1tlM10gdGhlbgogICAgICAgICAgICAKICAgICAgICAgICAgcnVsZXNbI3J1bGVzICsgMV0gPSA3CiAgICAgICAgICAgIAogICAgICAgICAgICBkdCA9IG1wLnRoaXJkKG1wLnN1YihmdCwgZXQpKQogICAgICAgICAgICBkMyA9IG1wLm1vZDMoZHQpCiAgICAgICAgICAgIGZ0ID0gbXAuc3ViKGR0LCBldCkKICAgICAgICAgICAgZmYgPSBtcC5hcHByb3goZnQpCiAgICAgICAgZWxzZWlmIGQzID09IGUzIHRoZW4KICAgICAgICAgICAgCiAgICAgICAgICAgIHJ1bGVzWyNydWxlcyArIDFdID0gOAogICAgICAgICAgICAKICAgICAgICAgICAgZHQgPSBtcC50aGlyZChmdCkKICAgICAgICAgICAgZDIgPSAoZDIgLSBlMikgJSAyCiAgICAgICAgICAgIGQzID0gbXAubW9kMyhkdCkKICAgICAgICAgICAgZnQgPSBtcC5zdWIoZHQsIGV0KQogICAgICAgICAgICBmZiA9IG1wLmFwcHJveChmdCkKICAgICAgICBlbHNlCiAgICAgICAgICAgIAogICAgICAgICAgICBydWxlc1sjcnVsZXMgKyAxXSA9IDkKICAgICAgICAgICAgCiAgICAgICAgICAgIGV0ID0gbXAuaGFsZihldCkKICAgICAgICAgICAgZTIgPSBtcC5tb2QyKGV0KQogICAgICAgICAgICBlMyA9IGx1dDNbZTNdCiAgICAgICAgICAgIGVmID0gbXAuYXBwcm94KGV0KQogICAgICAgICAgICBmdCA9IG1wLnN1YihkdCwgZXQpCiAgICAgICAgICAgIGZmID0gbXAuYXBwcm94KGZ0KQogICAgICAgIGVuZAogICAgZW5kCgogICAgbG9jYWwgdWJpdHMgPSB1dGlsLnJlYmFzZUxFKGR0LCAyIF4gMjQsIDIpCiAgICB3aGlsZSB1Yml0c1sjdWJpdHNdID09IDAgZG8gdWJpdHNbI3ViaXRzXSA9IG5pbCBlbmQKCiAgICByZXR1cm4ge3ViaXRzLCBydWxlc30KZW5kCgpyZXR1cm4gewogICAgYWRkID0gYWRkLAogICAgc3ViID0gc3ViLAogICAgbXVsID0gbXVsLAogICAgZW5jb2RlID0gZW5jb2RlLAogICAgZGVjb2RlID0gZGVjb2RlLAogICAgZGVjb2RlV2lkZSA9IGRlY29kZVdpZGUsCiAgICBkZWNvZGVDbGFtcGVkID0gZGVjb2RlQ2xhbXBlZCwKICAgIGVpZ2h0aCA9IGVpZ2h0aCwKICAgIGJpdHMgPSBiaXRzLAogICAgbWFrZVJ1bGVzZXQgPSBtYWtlUnVsZXNldCwKfQo=";
  38.     ["ccryptolib.internal.packing"] = base64.decode "CgoKCgoKCmxvY2FsIGZtdCA9IHN0cmluZy5mb3JtYXQKCmxvY2FsIGZ1bmN0aW9uIG1rUGFjayh3b3JkcywgQkUpCiAgICBsb2NhbCBvdXQgPSAibG9jYWwgQz1zdHJpbmcuY2hhciByZXR1cm4gZnVuY3Rpb24oXywiCiAgICBsb2NhbCBuYiA9IDAKICAgIGZvciBpID0gMSwgI3dvcmRzIGRvCiAgICAgICAgb3V0ID0gb3V0IC4uIGZtdCgibiVkLCIsIGkpCiAgICAgICAgbmIgPSBuYiArIHdvcmRzW2ldCiAgICBlbmQKICAgIG91dCA9IG91dDpzdWIoMSwgLTIpIC4uICIpbG9jYWwgIgogICAgZm9yIGkgPSAxLCBuYiBkbwogICAgICAgIG91dCA9IG91dCAuLiBmbXQoImIlZCwiLCBpKQogICAgZW5kCiAgICBvdXQgPSBvdXQ6c3ViKDEsIC0yKSAuLiAiICIKICAgIGxvY2FsIGJpID0gMQogICAgZm9yIGkgPSAxLCAjd29yZHMgZG8KICAgICAgICBmb3IgXyA9IDEsIHdvcmRzW2ldIC0gMSBkbwogICAgICAgICAgICBvdXQgPSBvdXQgLi4gZm10KCJiJWQ9biVkJSUyXjggbiVkPShuJWQtYiVkKSoyXi04ICIsIGJpLCBpLCBpLCBpLCBiaSkKICAgICAgICAgICAgYmkgPSBiaSArIDEKICAgICAgICBlbmQKICAgICAgICBiaSA9IGJpICsgMQogICAgZW5kCiAgICBvdXQgPSBvdXQgLi4gInJldHVybiBDKCIKICAgIGJpID0gMQogICAgaWYgbm90IEJFIHRoZW4KICAgICAgICBmb3IgaSA9IDEsICN3b3JkcyBkbwogICAgICAgICAgICBmb3IgXyA9IDEsIHdvcmRzW2ldIC0gMSBkbwogICAgICAgICAgICAgICAgb3V0ID0gb3V0IC4uIGZtdCgiYiVkLCIsIGJpKQogICAgICAgICAgICAgICAgYmkgPSBiaSArIDEKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIG91dCA9IG91dCAuLiBmbXQoIm4lZCUlMl44LCIsIGkpCiAgICAgICAgICAgIGJpID0gYmkgKyAxCiAgICAgICAgZW5kCiAgICBlbHNlCiAgICAgICAgZm9yIGkgPSAxLCAjd29yZHMgZG8KICAgICAgICAgICAgb3V0ID0gb3V0IC4uIGZtdCgibiVkJSUyXjgsIiwgaSkKICAgICAgICAgICAgYmkgPSBiaSArIHdvcmRzW2ldIC0gMgogICAgICAgICAgICBmb3IgXyA9IDEsIHdvcmRzW2ldIC0gMSBkbwogICAgICAgICAgICAgICAgb3V0ID0gb3V0IC4uIGZtdCgiYiVkLCIsIGJpKQogICAgICAgICAgICAgICAgYmkgPSBiaSAtIDEKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGJpID0gYmkgKyB3b3Jkc1tpXSArIDEKICAgICAgICBlbmQKICAgIGVuZAogICAgb3V0ID0gb3V0OnN1YigxLCAtMikgLi4gIillbmQiCiAgICByZXR1cm4gbG9hZChvdXQpKCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBta1VucGFjayh3b3JkcywgQkUpCiAgICBsb2NhbCBvdXQgPSAibG9jYWwgQj1zdHJpbmcuYnl0ZSByZXR1cm4gZnVuY3Rpb24oXyxzLGkpbG9jYWwgIgogICAgbG9jYWwgYmkgPSAxCiAgICBpZiBub3QgQkUgdGhlbgogICAgICAgIGZvciBpID0gMSwgI3dvcmRzIGRvCiAgICAgICAgICAgIGZvciBfID0gMSwgd29yZHNbaV0gZG8KICAgICAgICAgICAgICAgIG91dCA9IG91dCAuLiBmbXQoImIlZCwiLCBiaSkKICAgICAgICAgICAgICAgIGJpID0gYmkgKyAxCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgZWxzZQogICAgICAgIGZvciBpID0gMSwgI3dvcmRzIGRvCiAgICAgICAgICAgIGJpID0gYmkgKyB3b3Jkc1tpXSAtIDEKICAgICAgICAgICAgZm9yIF8gPSAxLCB3b3Jkc1tpXSBkbwogICAgICAgICAgICAgICAgb3V0ID0gb3V0IC4uIGZtdCgiYiVkLCIsIGJpKQogICAgICAgICAgICAgICAgYmkgPSBiaSAtIDEKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGJpID0gYmkgKyB3b3Jkc1tpXSArIDEKICAgICAgICBlbmQKICAgIGVuZAogICAgb3V0ID0gb3V0OnN1YigxLCAtMikgLi4gZm10KCI9QihzLGksaSslZClyZXR1cm4gIiwgYmkgLSAyKQogICAgYmkgPSAxCiAgICBmb3IgaSA9IDEsICN3b3JkcyBkbwogICAgICAgIG91dCA9IG91dCAuLiBmbXQoImIlZCIsIGJpKQogICAgICAgIGJpID0gYmkgKyAxCiAgICAgICAgZm9yIGogPSAyLCB3b3Jkc1tpXSBkbwogICAgICAgICAgICBvdXQgPSBvdXQgLi4gZm10KCIrYiVkKjJeJWQiLCBiaSwgOCAqIGogLSA4KQogICAgICAgICAgICBiaSA9IGJpICsgMQogICAgICAgIGVuZAogICAgICAgIG91dCA9IG91dCAuLiAiLCIKICAgIGVuZAogICAgb3V0ID0gb3V0IC4uIGZtdCgiaSslZCBlbmQiLCBiaSAtIDEpCiAgICByZXR1cm4gbG9hZChvdXQpKCkKZW5kCgoKaWYgbm90IHN0cmluZy5wYWNrIG9yIHBjYWxsKHN0cmluZy5kdW1wLCBzdHJpbmcucGFjaykgdGhlbgogICAgbG9jYWwgZnVuY3Rpb24gY29tcGlsZShmbXQsIGZuKQogICAgICAgIGxvY2FsIGUgPSBhc3NlcnQoZm10Om1hdGNoKCJeKFs+PF0pSVtJJWRdKyQiKSwgImludmFsaWQgZm9ybWF0IHN0cmluZyIpCiAgICAgICAgbG9jYWwgdyA9IHt9CiAgICAgICAgZm9yIGkgaW4gZm10OmdtYXRjaCgiSShbJWRdKykiKSBkbwogICAgICAgICAgICBsb2NhbCBuID0gdG9udW1iZXIoaSkgb3IgNAogICAgICAgICAgICBhc3NlcnQobiA+IDAgYW5kIG4gPD0gMTYsICJpbnRlZ3JhbCBzaXplIG91dCBvZiBsaW1pdHMiKQogICAgICAgICAgICB3WyN3ICsgMV0gPSBuCiAgICAgICAgZW5kCiAgICAgICAgcmV0dXJuIGZuKHcsIGUgPT0gIj4iKQogICAgZW5kCgogICAgbG9jYWwgcGFja0NhY2hlID0ge30KICAgIGxvY2FsIHVucGFja0NhY2hlID0ge30KCiAgICAKICAgIAoKICAgIAogICAgCiAgICAKICAgIAogICAgCiAgICAKICAgIAogICAgCiAgICBsb2NhbCBmdW5jdGlvbiBjb21waWxlUGFjayhmbXQpCiAgICAgICAgaWYgbm90IHBhY2tDYWNoZVtmbXRdIHRoZW4KICAgICAgICAgICAgcGFja0NhY2hlW2ZtdF0gPSBjb21waWxlKGZtdCwgbWtQYWNrKQogICAgICAgIGVuZAogICAgICAgIHJldHVybiBwYWNrQ2FjaGVbZm10XSwgZm10CiAgICBlbmQKCiAgICAKICAgIAogICAgCiAgICAKICAgIAogICAgCiAgICAKICAgIAogICAgbG9jYWwgZnVuY3Rpb24gY29tcGlsZVVucGFjayhmbXQpCiAgICAgICAgaWYgbm90IHVucGFja0NhY2hlW2ZtdF0gdGhlbgogICAgICAgICAgICB1bnBhY2tDYWNoZVtmbXRdID0gY29tcGlsZShmbXQsIG1rVW5wYWNrKQogICAgICAgIGVuZAogICAgICAgIHJldHVybiB1bnBhY2tDYWNoZVtmbXRdLCBmbXQKICAgIGVuZAoKICAgIHJldHVybiB7CiAgICAgICAgY29tcGlsZVBhY2sgPSBjb21waWxlUGFjaywKICAgICAgICBjb21waWxlVW5wYWNrID0gY29tcGlsZVVucGFjaywKICAgIH0KZWxzZQogICAgCiAgICAKICAgIAogICAgCiAgICBsb2NhbCBmdW5jdGlvbiBjb21waWxlUGFjayhmbXQpIHJldHVybiBzdHJpbmcucGFjaywgZm10IGVuZAoKICAgIAogICAgCiAgICAKICAgIAogICAgbG9jYWwgZnVuY3Rpb24gY29tcGlsZVVucGFjayhmbXQpIHJldHVybiBzdHJpbmcudW5wYWNrLCBmbXQgZW5kCgogICAgcmV0dXJuIHsKICAgICAgICBjb21waWxlUGFjayA9IGNvbXBpbGVQYWNrLAogICAgICAgIGNvbXBpbGVVbnBhY2sgPSBjb21waWxlVW5wYWNrLAogICAgfQplbmQK";
  39.     ["ccryptolib.internal.edwards25519"] = base64.decode "Cgpsb2NhbCBmcCA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwuZnAiCgpsb2NhbCB1bnBhY2sgPSB1bnBhY2sgb3IgdGFibGUudW5wYWNrCgoKCgoKCgoKCgoKCgpsb2NhbCBEID0gZnAubXVsKGZwLm51bSgtMTIxNjY1KSwgZnAuaW52ZXJ0KGZwLm51bSgxMjE2NjYpKSkKbG9jYWwgSyA9IGZwLmttdWwoRCwgMikKCgpsb2NhbCBPID0ge2ZwLm51bSgwKSwgZnAubnVtKDEpLCBmcC5udW0oMSksIGZwLm51bSgwKX0KbG9jYWwgRyA9IG5pbAoKCgoKbG9jYWwgZnVuY3Rpb24gZG91YmxlKFAxKQogICAgCiAgICAKICAgIAogICAgbG9jYWwgUDF4LCBQMXksIFAxeiA9IHVucGFjayhQMSkKICAgIGxvY2FsIGEgPSBmcC5zcXVhcmUoUDF4KQogICAgbG9jYWwgYiA9IGZwLnNxdWFyZShQMXkpCiAgICBsb2NhbCBjID0gZnAuc3F1YXJlKFAxeikKICAgIGxvY2FsIGQgPSBmcC5hZGQoYywgYykKICAgIGxvY2FsIGUgPSBmcC5hZGQoYSwgYikKICAgIGxvY2FsIGYgPSBmcC5hZGQoUDF4LCBQMXkpCiAgICBsb2NhbCBnID0gZnAuc3F1YXJlKGYpCiAgICBsb2NhbCBoID0gZnAuY2FycnkoZnAuc3ViKGcsIGUpKQogICAgbG9jYWwgaSA9IGZwLnN1YihiLCBhKQogICAgbG9jYWwgaiA9IGZwLmNhcnJ5KGZwLnN1YihkLCBpKSkKICAgIGxvY2FsIFAzeCA9IGZwLm11bChoLCBqKQogICAgbG9jYWwgUDN5ID0gZnAubXVsKGksIGUpCiAgICBsb2NhbCBQM3ogPSBmcC5tdWwoaiwgaSkKICAgIGxvY2FsIFAzdCA9IGZwLm11bChoLCBlKQogICAgcmV0dXJuIHtQM3gsIFAzeSwgUDN6LCBQM3R9CmVuZAoKCgoKCmxvY2FsIGZ1bmN0aW9uIGFkZChQMSwgTjIpCiAgICBsb2NhbCBQMXgsIFAxeSwgUDF6LCBQMXQgPSB1bnBhY2soUDEpCiAgICBsb2NhbCBOMXAsIE4xbSwgTjF6LCBOMXQgPSB1bnBhY2soTjIpCiAgICBsb2NhbCBhID0gZnAuc3ViKFAxeSwgUDF4KQogICAgbG9jYWwgYiA9IGZwLm11bChhLCBOMW0pCiAgICBsb2NhbCBjID0gZnAuYWRkKFAxeSwgUDF4KQogICAgbG9jYWwgZCA9IGZwLm11bChjLCBOMXApCiAgICBsb2NhbCBlID0gZnAubXVsKFAxdCwgTjF0KQogICAgbG9jYWwgZiA9IGZwLm11bChQMXosIE4xeikKICAgIGxvY2FsIGcgPSBmcC5zdWIoZCwgYikKICAgIGxvY2FsIGggPSBmcC5zdWIoZiwgZSkKICAgIGxvY2FsIGkgPSBmcC5hZGQoZiwgZSkKICAgIGxvY2FsIGogPSBmcC5hZGQoZCwgYikKICAgIGxvY2FsIFAzeCA9IGZwLm11bChnLCBoKQogICAgbG9jYWwgUDN5ID0gZnAubXVsKGksIGopCiAgICBsb2NhbCBQM3ogPSBmcC5tdWwoaCwgaSkKICAgIGxvY2FsIFAzdCA9IGZwLm11bChnLCBqKQogICAgcmV0dXJuIHtQM3gsIFAzeSwgUDN6LCBQM3R9CmVuZAoKCgoKCmxvY2FsIGZ1bmN0aW9uIHN1YihQMSwgTjIpCiAgICBsb2NhbCBQMXgsIFAxeSwgUDF6LCBQMXQgPSB1bnBhY2soUDEpCiAgICBsb2NhbCBOMXAsIE4xbSwgTjF6LCBOMXQgPSB1bnBhY2soTjIpCiAgICBsb2NhbCBhID0gZnAuc3ViKFAxeSwgUDF4KQogICAgbG9jYWwgYiA9IGZwLm11bChhLCBOMXApCiAgICBsb2NhbCBjID0gZnAuYWRkKFAxeSwgUDF4KQogICAgbG9jYWwgZCA9IGZwLm11bChjLCBOMW0pCiAgICBsb2NhbCBlID0gZnAubXVsKFAxdCwgTjF0KQogICAgbG9jYWwgZiA9IGZwLm11bChQMXosIE4xeikKICAgIGxvY2FsIGcgPSBmcC5zdWIoZCwgYikKICAgIGxvY2FsIGggPSBmcC5hZGQoZiwgZSkKICAgIGxvY2FsIGkgPSBmcC5zdWIoZiwgZSkKICAgIGxvY2FsIGogPSBmcC5hZGQoZCwgYikKICAgIGxvY2FsIFAzeCA9IGZwLm11bChnLCBoKQogICAgbG9jYWwgUDN5ID0gZnAubXVsKGksIGopCiAgICBsb2NhbCBQM3ogPSBmcC5tdWwoaCwgaSkKICAgIGxvY2FsIFAzdCA9IGZwLm11bChnLCBqKQogICAgcmV0dXJuIHtQM3gsIFAzeSwgUDN6LCBQM3R9CmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gbmllbHMoUDEpCiAgICBsb2NhbCBQMXgsIFAxeSwgUDF6LCBQMXQgPSB1bnBhY2soUDEpCiAgICBsb2NhbCBOM3AgPSBmcC5hZGQoUDF5LCBQMXgpCiAgICBsb2NhbCBOM20gPSBmcC5zdWIoUDF5LCBQMXgpCiAgICBsb2NhbCBOM3ogPSBmcC5hZGQoUDF6LCBQMXopCiAgICBsb2NhbCBOM3QgPSBmcC5tdWwoUDF0LCBLKQogICAgcmV0dXJuIHtOM3AsIE4zbSwgTjN6LCBOM3R9CmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gc2NhbGUoUDEpCiAgICBsb2NhbCBQMXgsIFAxeSwgUDF6ID0gdW5wYWNrKFAxKQogICAgbG9jYWwgekludiA9IGZwLmludmVydChQMXopCiAgICBsb2NhbCBQM3ggPSBmcC5tdWwoUDF4LCB6SW52KQogICAgbG9jYWwgUDN5ID0gZnAubXVsKFAxeSwgekludikKICAgIGxvY2FsIFAzeiA9IGZwLm51bSgxKQogICAgbG9jYWwgUDN0ID0gZnAubXVsKFAzeCwgUDN5KQogICAgcmV0dXJuIHtQM3gsIFAzeSwgUDN6LCBQM3R9CmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gZW5jb2RlKFAxKQogICAgUDEgPSBzY2FsZShQMSkKICAgIGxvY2FsIFAxeCwgUDF5ID0gdW5wYWNrKFAxKQogICAgbG9jYWwgeSA9IGZwLmVuY29kZShQMXkpCiAgICBsb2NhbCB4Qml0ID0gZnAuY2Fub25pY2FsaXplKFAxeClbMV0gJSAyCiAgICByZXR1cm4geTpzdWIoMSwgLTIpIC4uIHN0cmluZy5jaGFyKHk6Ynl0ZSgtMSkgKyB4Qml0ICogMTI4KQplbmQKCgoKCmxvY2FsIGZ1bmN0aW9uIGRlY29kZShzdHIpCiAgICBsb2NhbCBQM3kgPSBmcC5kZWNvZGUoc3RyKQogICAgbG9jYWwgYSA9IGZwLnNxdWFyZShQM3kpCiAgICBsb2NhbCBiID0gZnAuc3ViKGEsIGZwLm51bSgxKSkKICAgIGxvY2FsIGMgPSBmcC5tdWwoYSwgRCkKICAgIGxvY2FsIGQgPSBmcC5hZGQoYywgZnAubnVtKDEpKQogICAgbG9jYWwgUDN4ID0gZnAuc3FydERpdihiLCBkKQogICAgaWYgbm90IFAzeCB0aGVuIHJldHVybiBuaWwgZW5kCiAgICBsb2NhbCB4Qml0ID0gZnAuY2Fub25pY2FsaXplKFAzeClbMV0gJSAyCiAgICBpZiB4Qml0IH49IGJpdDMyLmV4dHJhY3Qoc3RyOmJ5dGUoLTEpLCA3KSB0aGVuCiAgICAgICAgUDN4ID0gZnAuY2FycnkoZnAubmVnKFAzeCkpCiAgICBlbmQKICAgIGxvY2FsIFAzeiA9IGZwLm51bSgxKQogICAgbG9jYWwgUDN0ID0gZnAubXVsKFAzeCwgUDN5KQogICAgcmV0dXJuIHtQM3gsIFAzeSwgUDN6LCBQM3R9CmVuZAoKRyA9IGRlY29kZSgiWGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYiKSAKCgoKCgpsb2NhbCBmdW5jdGlvbiBzaWduZWRSYWRpeFcoYml0cywgdykKICAgIAogICAgbG9jYWwgd1BvdyA9IDIgXiB3CiAgICBsb2NhbCB3UG93aCA9IHdQb3cgLyAyCiAgICBsb2NhbCBvdXQgPSB7fQogICAgbG9jYWwgYWNjID0gMAogICAgbG9jYWwgbXVsID0gMQogICAgZm9yIGkgPSAxLCAjYml0cyBkbwogICAgICAgIGFjYyA9IGFjYyArIGJpdHNbaV0gKiBtdWwKICAgICAgICBtdWwgPSBtdWwgKiAyCiAgICAgICAgd2hpbGUgaSA9PSAjYml0cyBhbmQgYWNjID4gMCBvciBtdWwgPiB3UG93IGRvCiAgICAgICAgICAgIGxvY2FsIHJlbSA9IGFjYyAlIHdQb3cKICAgICAgICAgICAgaWYgcmVtID49IHdQb3doIHRoZW4gcmVtID0gcmVtIC0gd1BvdyBlbmQKICAgICAgICAgICAgYWNjID0gKGFjYyAtIHJlbSkgLyB3UG93CiAgICAgICAgICAgIG11bCA9IG11bCAvIHdQb3cKICAgICAgICAgICAgb3V0WyNvdXQgKyAxXSA9IHJlbQogICAgICAgIGVuZAogICAgZW5kCiAgICByZXR1cm4gb3V0CmVuZAoKCgoKCmxvY2FsIGZ1bmN0aW9uIHJhZGl4V1RhYmxlKFAsIHcpCiAgICBsb2NhbCBvdXQgPSB7fQogICAgZm9yIGkgPSAxLCBtYXRoLmNlaWwoMjU2IC8gdykgZG8KICAgICAgICBsb2NhbCByb3cgPSB7bmllbHMoUCl9CiAgICAgICAgZm9yIGogPSAyLCAyIF4gdyAvIDIgZG8KICAgICAgICAgICAgUCA9IGFkZChQLCByb3dbMV0pCiAgICAgICAgICAgIHJvd1tqXSA9IG5pZWxzKFApCiAgICAgICAgZW5kCiAgICAgICAgb3V0W2ldID0gcm93CiAgICAgICAgUCA9IGRvdWJsZShQKQogICAgZW5kCiAgICByZXR1cm4gb3V0CmVuZAoKCmxvY2FsIEdfVyA9IDUKCgpsb2NhbCBHX1RBQkxFID0gcmFkaXhXVGFibGUoRywgR19XKQoKCgoKCgoKCgpsb2NhbCBmdW5jdGlvbiB3TmFmKGJpdHMsIHcpCiAgICAKICAgIGxvY2FsIHdQb3cgPSAyIF4gdwogICAgbG9jYWwgd1Bvd2ggPSB3UG93IC8gMgogICAgbG9jYWwgb3V0ID0ge30KICAgIGxvY2FsIGFjYyA9IDAKICAgIGxvY2FsIG11bCA9IDEKICAgIGZvciBpID0gMSwgI2JpdHMgZG8KICAgICAgICBhY2MgPSBhY2MgKyBiaXRzW2ldICogbXVsCiAgICAgICAgbXVsID0gbXVsICogMgogICAgICAgIHdoaWxlIGkgPT0gI2JpdHMgYW5kIGFjYyA+IDAgb3IgbXVsID4gd1BvdyBkbwogICAgICAgICAgICBpZiBhY2MgJSAyID09IDAgdGhlbgogICAgICAgICAgICAgICAgYWNjID0gYWNjIC8gMgogICAgICAgICAgICAgICAgbXVsID0gbXVsIC8gMgogICAgICAgICAgICAgICAgb3V0WyNvdXQgKyAxXSA9IDAKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbG9jYWwgcmVtID0gYWNjICUgd1BvdwogICAgICAgICAgICAgICAgaWYgcmVtID49IHdQb3doIHRoZW4gcmVtID0gcmVtIC0gd1BvdyBlbmQKICAgICAgICAgICAgICAgIGFjYyA9IGFjYyAtIHJlbQogICAgICAgICAgICAgICAgb3V0WyNvdXQgKyAxXSA9IHJlbQogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgIGVuZAogICAgd2hpbGUgb3V0WyNvdXRdID09IDAgZG8gb3V0WyNvdXRdID0gbmlsIGVuZAogICAgcmV0dXJuIG91dAplbmQKCgoKCgpsb2NhbCBmdW5jdGlvbiBXTkFGVGFibGUoUCwgdykKICAgIGxvY2FsIGRQID0gZG91YmxlKFApCiAgICBsb2NhbCBvdXQgPSB7bmllbHMoUCl9CiAgICBmb3IgaSA9IDMsIDIgXiB3LCAyIGRvCiAgICAgICAgb3V0W2ldID0gbmllbHMoYWRkKGRQLCBvdXRbaSAtIDJdKSkKICAgIGVuZAogICAgcmV0dXJuIG91dAplbmQKCgoKCmxvY2FsIGZ1bmN0aW9uIG11bEcoYml0cykKICAgIGxvY2FsIHN3ID0gc2lnbmVkUmFkaXhXKGJpdHMsIEdfVykKICAgIGxvY2FsIFIgPSBPCiAgICBmb3IgaSA9IDEsICNzdyBkbwogICAgICAgIGxvY2FsIGIgPSBzd1tpXQogICAgICAgIGlmIGIgPiAwIHRoZW4KICAgICAgICAgICAgUiA9IGFkZChSLCBHX1RBQkxFW2ldW2JdKQogICAgICAgIGVsc2VpZiBiIDwgMCB0aGVuCiAgICAgICAgICAgIFIgPSBzdWIoUiwgR19UQUJMRVtpXVstYl0pCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBSCmVuZAoKCgoKCmxvY2FsIGZ1bmN0aW9uIG11bChQLCBiaXRzKQogICAgbG9jYWwgbmFmID0gd05hZihiaXRzLCA1KQogICAgbG9jYWwgdGJsID0gV05BRlRhYmxlKFAsIDUpCiAgICBsb2NhbCBSID0gTwogICAgZm9yIGkgPSAjbmFmLCAxLCAtMSBkbwogICAgICAgIGxvY2FsIGIgPSBuYWZbaV0KICAgICAgICBpZiBiID09IDAgdGhlbgogICAgICAgICAgICBSID0gZG91YmxlKFIpCiAgICAgICAgZWxzZWlmIGIgPiAwIHRoZW4KICAgICAgICAgICAgUiA9IGFkZChSLCB0YmxbYl0pCiAgICAgICAgZWxzZQogICAgICAgICAgICBSID0gc3ViKFIsIHRibFstYl0pCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBSCmVuZAoKcmV0dXJuIHsKICAgIGRvdWJsZSA9IGRvdWJsZSwKICAgIGFkZCA9IGFkZCwKICAgIHN1YiA9IHN1YiwKICAgIG5pZWxzID0gbmllbHMsCiAgICBzY2FsZSA9IHNjYWxlLAogICAgZW5jb2RlID0gZW5jb2RlLAogICAgZGVjb2RlID0gZGVjb2RlLAogICAgbXVsRyA9IG11bEcsCiAgICBtdWwgPSBtdWwsCn0K";
  40.     ["ccryptolib.internal.sha512"] = base64.decode "Cgpsb2NhbCBleHBlY3QgID0gcmVxdWlyZSAiY2MuZXhwZWN0Ii5leHBlY3QKbG9jYWwgcGFja2luZyA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwucGFja2luZyIKCmxvY2FsIHNobCA9IGJpdDMyLmxzaGlmdApsb2NhbCBzaHIgPSBiaXQzMi5yc2hpZnQKbG9jYWwgYnhvciA9IGJpdDMyLmJ4b3IKbG9jYWwgYm5vdCA9IGJpdDMyLmJub3QKbG9jYWwgYmFuZCA9IGJpdDMyLmJhbmQKbG9jYWwgcDF4MTYsIGZtdDF4MTYgPSBwYWNraW5nLmNvbXBpbGVQYWNrKCI+STE2IikKbG9jYWwgcDE2eDQsIGZtdDE2eDQgPSBwYWNraW5nLmNvbXBpbGVQYWNrKCI+STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STQiKQpsb2NhbCB1MzJ4NCwgZm10MzJ4NCA9IHBhY2tpbmcuY29tcGlsZVVucGFjaygiPkk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STQiKQoKbG9jYWwgZnVuY3Rpb24gY2Fycnk2NChhMSwgYTApCiAgICBsb2NhbCByMCA9IGEwICUgMiBeIDMyCiAgICBhMSA9IGExICsgKGEwIC0gcjApIC8gMiBeIDMyCiAgICByZXR1cm4gYTEgJSAyIF4gMzIsIHIwCmVuZAoKbG9jYWwgSyA9IHsKICAgIDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIsIDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QsIDB4YjVjMGZiY2YsIDB4ZWM0ZDNiMmYsCiAgICAweGU5YjVkYmE1LCAweDgxODlkYmJjLCAweDM5NTZjMjViLCAweGYzNDhiNTM4LCAweDU5ZjExMWYxLCAweGI2MDVkMDE5LAogICAgMHg5MjNmODJhNCwgMHhhZjE5NGY5YiwgMHhhYjFjNWVkNSwgMHhkYTZkODExOCwgMHhkODA3YWE5OCwgMHhhMzAzMDI0MiwKICAgIDB4MTI4MzViMDEsIDB4NDU3MDZmYmUsIDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMsIDB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTIsCiAgICAweDcyYmU1ZDc0LCAweGYyN2I4OTZmLCAweDgwZGViMWZlLCAweDNiMTY5NmIxLCAweDliZGMwNmE3LCAweDI1YzcxMjM1LAogICAgMHhjMTliZjE3NCwgMHhjZjY5MjY5NCwgMHhlNDliNjljMSwgMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwgMHgzODRmMjVlMywKICAgIDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUsIDB4MjQwY2ExY2MsIDB4NzdhYzljNjUsIDB4MmRlOTJjNmYsIDB4NTkyYjAyNzUsCiAgICAweDRhNzQ4NGFhLCAweDZlYTZlNDgzLCAweDVjYjBhOWRjLCAweGJkNDFmYmQ0LCAweDc2Zjk4OGRhLCAweDgzMTE1M2I1LAogICAgMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiwgMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCwgMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiwKICAgIDB4YmY1OTdmYzcsIDB4YmVlZjBlZTQsIDB4YzZlMDBiZjMsIDB4M2RhODhmYzIsIDB4ZDVhNzkxNDcsIDB4OTMwYWE3MjUsCiAgICAweDA2Y2E2MzUxLCAweGUwMDM4MjZmLCAweDE0MjkyOTY3LCAweDBhMGU2ZTcwLCAweDI3YjcwYTg1LCAweDQ2ZDIyZmZjLAogICAgMHgyZTFiMjEzOCwgMHg1YzI2YzkyNiwgMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywgMHg5ZDk1YjNkZiwKICAgIDB4NjUwYTczNTQsIDB4OGJhZjYzZGUsIDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgsIDB4ODFjMmM5MmUsIDB4NDdlZGFlZTYsCiAgICAweDkyNzIyYzg1LCAweDE0ODIzNTNiLCAweGEyYmZlOGExLCAweDRjZjEwMzY0LCAweGE4MWE2NjRiLCAweGJjNDIzMDAxLAogICAgMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSwgMHhjNzZjNTFhMywgMHgwNjU0YmUzMCwgMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCwKICAgIDB4ZDY5OTA2MjQsIDB4NTU2NWE5MTAsIDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEsIDB4MTA2YWEwNzAsIDB4MzJiYmQxYjgsCiAgICAweDE5YTRjMTE2LCAweGI4ZDJkMGM4LCAweDFlMzc2YzA4LCAweDUxNDFhYjUzLCAweDI3NDg3NzRjLCAweGRmOGVlYjk5LAogICAgMHgzNGIwYmNiNSwgMHhlMTliNDhhOCwgMHgzOTFjMGNiMywgMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYiwKICAgIDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMsIDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMsIDB4NzQ4ZjgyZWUsIDB4NWRlZmIyZmMsCiAgICAweDc4YTU2MzZmLCAweDQzMTcyZjYwLCAweDg0Yzg3ODE0LCAweGExZjBhYjcyLCAweDhjYzcwMjA4LCAweDFhNjQzOWVjLAogICAgMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCwgMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSwgMHhiZWY5YTNmNywgMHhiMmM2NzkxNSwKICAgIDB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmIsIDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMsIDB4ZDE4NmI4YzcsIDB4MjFjMGMyMDcsCiAgICAweGVhZGE3ZGQ2LCAweGNkZTBlYjFlLCAweGY1N2Q0ZjdmLCAweGVlNmVkMTc4LCAweDA2ZjA2N2FhLCAweDcyMTc2ZmJhLAogICAgMHgwYTYzN2RjNSwgMHhhMmM4OThhNiwgMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwgMHgxMzFjNDcxYiwKICAgIDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQsIDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMsIDB4M2M5ZWJlMGEsIDB4MTVjOWJlYmMsCiAgICAweDQzMWQ2N2M0LCAweDljMTAwZDRjLCAweDRjYzVkNGJlLCAweGNiM2U0MmI2LCAweDU5N2YyOTljLCAweGZjNjU3ZTJhLAogICAgMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYywgMHg2YzQ0MTk4YywgMHg0YTQ3NTgxNywKfQoKCgoKbG9jYWwgZnVuY3Rpb24gZGlnZXN0KGRhdGEpCiAgICBleHBlY3QoMSwgZGF0YSwgInN0cmluZyIpCgogICAgCiAgICBsb2NhbCBiaXRsZW4gPSAjZGF0YSAqIDgKICAgIGxvY2FsIHBhZGxlbiA9IC0oI2RhdGEgKyAxNykgJSAxMjgKICAgIGRhdGEgPSBkYXRhIC4uICJceDgwIiAuLiAoIlwwIik6cmVwKHBhZGxlbikgLi4gcDF4MTYoZm10MXgxNiwgYml0bGVuKQoKICAgIAogICAgbG9jYWwgaDAxLCBoMDAgPSAweDZhMDllNjY3LCAweGYzYmNjOTA4CiAgICBsb2NhbCBoMTEsIGgxMCA9IDB4YmI2N2FlODUsIDB4ODRjYWE3M2IKICAgIGxvY2FsIGgyMSwgaDIwID0gMHgzYzZlZjM3MiwgMHhmZTk0ZjgyYgogICAgbG9jYWwgaDMxLCBoMzAgPSAweGE1NGZmNTNhLCAweDVmMWQzNmYxCiAgICBsb2NhbCBoNDEsIGg0MCA9IDB4NTEwZTUyN2YsIDB4YWRlNjgyZDEKICAgIGxvY2FsIGg1MSwgaDUwID0gMHg5YjA1Njg4YywgMHgyYjNlNmMxZgogICAgbG9jYWwgaDYxLCBoNjAgPSAweDFmODNkOWFiLCAweGZiNDFiZDZiCiAgICBsb2NhbCBoNzEsIGg3MCA9IDB4NWJlMGNkMTksIDB4MTM3ZTIxNzkKCiAgICAKICAgIGZvciBpID0gMSwgI2RhdGEsIDEyOCBkbwogICAgICAgIGxvY2FsIHcgPSB7dTMyeDQoZm10MzJ4NCwgZGF0YSwgaSl9CgogICAgICAgIAogICAgICAgIGZvciBqID0gMzMsIDE2MCwgMiBkbwogICAgICAgICAgICBsb2NhbCB3ZjEsIHdmMCA9IHdbaiAtIDMwXSwgd1tqIC0gMjldCiAgICAgICAgICAgIGxvY2FsIHQxID0gc2hyKHdmMSwgMSkgKyBzaGwod2YwLCAzMSkKICAgICAgICAgICAgbG9jYWwgdDAgPSBzaHIod2YwLCAxKSArIHNobCh3ZjEsIDMxKQogICAgICAgICAgICBsb2NhbCB1MSA9IHNocih3ZjEsIDgpICsgc2hsKHdmMCwgMjQpCiAgICAgICAgICAgIGxvY2FsIHUwID0gc2hyKHdmMCwgOCkgKyBzaGwod2YxLCAyNCkKICAgICAgICAgICAgbG9jYWwgdjEgPSBzaHIod2YxLCA3KQogICAgICAgICAgICBsb2NhbCB2MCA9IHNocih3ZjAsIDcpICsgc2hsKHdmMSwgMjUpCgogICAgICAgICAgICBsb2NhbCB3MjEsIHcyMCA9IHdbaiAtIDRdLCB3W2ogLSAzXQogICAgICAgICAgICBsb2NhbCB3MSA9IHNocih3MjEsIDE5KSArIHNobCh3MjAsIDEzKQogICAgICAgICAgICBsb2NhbCB3MCA9IHNocih3MjAsIDE5KSArIHNobCh3MjEsIDEzKQogICAgICAgICAgICBsb2NhbCB4MCA9IHNocih3MjEsIDI5KSArIHNobCh3MjAsIDMpCiAgICAgICAgICAgIGxvY2FsIHgxID0gc2hyKHcyMCwgMjkpICsgc2hsKHcyMSwgMykKICAgICAgICAgICAgbG9jYWwgeTEgPSBzaHIodzIxLCA2KQogICAgICAgICAgICBsb2NhbCB5MCA9IHNocih3MjAsIDYpICsgc2hsKHcyMSwgMjYpCgogICAgICAgICAgICBsb2NhbCByMSwgcjAgPQogICAgICAgICAgICAgICAgd1tqIC0gMzJdICsgYnhvcih0MSwgdTEsIHYxKSArIHdbaiAtIDE0XSArIGJ4b3IodzEsIHgxLCB5MSksCiAgICAgICAgICAgICAgICB3W2ogLSAzMV0gKyBieG9yKHQwLCB1MCwgdjApICsgd1tqIC0gMTNdICsgYnhvcih3MCwgeDAsIHkwKQoKICAgICAgICAgICAgd1tqXSwgd1tqICsgMV0gPSBjYXJyeTY0KHIxLCByMCkKICAgICAgICBlbmQKCiAgICAgICAgCiAgICAgICAgbG9jYWwgYTEsIGEwID0gaDAxLCBoMDAKICAgICAgICBsb2NhbCBiMSwgYjAgPSBoMTEsIGgxMAogICAgICAgIGxvY2FsIGMxLCBjMCA9IGgyMSwgaDIwCiAgICAgICAgbG9jYWwgZDEsIGQwID0gaDMxLCBoMzAKICAgICAgICBsb2NhbCBlMSwgZTAgPSBoNDEsIGg0MAogICAgICAgIGxvY2FsIGYxLCBmMCA9IGg1MSwgaDUwCiAgICAgICAgbG9jYWwgZzEsIGcwID0gaDYxLCBoNjAKICAgICAgICBsb2NhbCBoMSwgaDAgPSBoNzEsIGg3MAogICAgICAgIGZvciBqID0gMSwgMTYwLCAyIGRvCiAgICAgICAgICAgIGxvY2FsIHQxID0gc2hyKGUxLCAxNCkgKyBzaGwoZTAsIDE4KQogICAgICAgICAgICBsb2NhbCB0MCA9IHNocihlMCwgMTQpICsgc2hsKGUxLCAxOCkKICAgICAgICAgICAgbG9jYWwgdTEgPSBzaHIoZTEsIDE4KSArIHNobChlMCwgMTQpCiAgICAgICAgICAgIGxvY2FsIHUwID0gc2hyKGUwLCAxOCkgKyBzaGwoZTEsIDE0KQogICAgICAgICAgICBsb2NhbCB2MCA9IHNocihlMSwgOSkgKyBzaGwoZTAsIDIzKQogICAgICAgICAgICBsb2NhbCB2MSA9IHNocihlMCwgOSkgKyBzaGwoZTEsIDIzKQogICAgICAgICAgICBsb2NhbCBzMTEgPSBieG9yKHQxLCB1MSwgdjEpCiAgICAgICAgICAgIGxvY2FsIHMxMCA9IGJ4b3IodDAsIHUwLCB2MCkKCiAgICAgICAgICAgIGxvY2FsIGNoMSA9IGJ4b3IoYmFuZChlMSwgZjEpLCBiYW5kKGJub3QoZTEpLCBnMSkpCiAgICAgICAgICAgIGxvY2FsIGNoMCA9IGJ4b3IoYmFuZChlMCwgZjApLCBiYW5kKGJub3QoZTApLCBnMCkpCgogICAgICAgICAgICBsb2NhbCB0ZW1wMTEgPSBoMSArIHMxMSArIGNoMSArIEtbal0gKyB3W2pdCiAgICAgICAgICAgIGxvY2FsIHRlbXAxMCA9IGgwICsgczEwICsgY2gwICsgS1tqICsgMV0gKyB3W2ogKyAxXQoKICAgICAgICAgICAgbG9jYWwgdzEgPSBzaHIoYTEsIDI4KSArIHNobChhMCwgNCkKICAgICAgICAgICAgbG9jYWwgdzAgPSBzaHIoYTAsIDI4KSArIHNobChhMSwgNCkKICAgICAgICAgICAgbG9jYWwgeDAgPSBzaHIoYTEsIDIpICsgc2hsKGEwLCAzMCkKICAgICAgICAgICAgbG9jYWwgeDEgPSBzaHIoYTAsIDIpICsgc2hsKGExLCAzMCkKICAgICAgICAgICAgbG9jYWwgeTAgPSBzaHIoYTEsIDcpICsgc2hsKGEwLCAyNSkKICAgICAgICAgICAgbG9jYWwgeTEgPSBzaHIoYTAsIDcpICsgc2hsKGExLCAyNSkKICAgICAgICAgICAgbG9jYWwgczAxID0gYnhvcih3MSwgeDEsIHkxKQogICAgICAgICAgICBsb2NhbCBzMDAgPSBieG9yKHcwLCB4MCwgeTApCgogICAgICAgICAgICBsb2NhbCBtYWoxID0gYnhvcihiYW5kKGExLCBiMSksIGJhbmQoYTEsIGMxKSwgYmFuZChiMSwgYzEpKQogICAgICAgICAgICBsb2NhbCBtYWowID0gYnhvcihiYW5kKGEwLCBiMCksIGJhbmQoYTAsIGMwKSwgYmFuZChiMCwgYzApKQoKICAgICAgICAgICAgbG9jYWwgdGVtcDIxID0gczAxICsgbWFqMQogICAgICAgICAgICBsb2NhbCB0ZW1wMjAgPSBzMDAgKyBtYWowCgogICAgICAgICAgICBoMSA9IGcxICBoMCA9IGcwCiAgICAgICAgICAgIGcxID0gZjEgIGcwID0gZjAKICAgICAgICAgICAgZjEgPSBlMSAgZjAgPSBlMAogICAgICAgICAgICBlMSwgZTAgPSBjYXJyeTY0KGQxICsgdGVtcDExLCBkMCArIHRlbXAxMCkKICAgICAgICAgICAgZDEgPSBjMSAgZDAgPSBjMAogICAgICAgICAgICBjMSA9IGIxICBjMCA9IGIwCiAgICAgICAgICAgIGIxID0gYTEgIGIwID0gYTAKICAgICAgICAgICAgYTEsIGEwID0gY2Fycnk2NCh0ZW1wMTEgKyB0ZW1wMjEsIHRlbXAxMCArIHRlbXAyMCkKICAgICAgICBlbmQKCiAgICAgICAgaDAxLCBoMDAgPSBjYXJyeTY0KGgwMSArIGExLCBoMDAgKyBhMCkKICAgICAgICBoMTEsIGgxMCA9IGNhcnJ5NjQoaDExICsgYjEsIGgxMCArIGIwKQogICAgICAgIGgyMSwgaDIwID0gY2Fycnk2NChoMjEgKyBjMSwgaDIwICsgYzApCiAgICAgICAgaDMxLCBoMzAgPSBjYXJyeTY0KGgzMSArIGQxLCBoMzAgKyBkMCkKICAgICAgICBoNDEsIGg0MCA9IGNhcnJ5NjQoaDQxICsgZTEsIGg0MCArIGUwKQogICAgICAgIGg1MSwgaDUwID0gY2Fycnk2NChoNTEgKyBmMSwgaDUwICsgZjApCiAgICAgICAgaDYxLCBoNjAgPSBjYXJyeTY0KGg2MSArIGcxLCBoNjAgKyBnMCkKICAgICAgICBoNzEsIGg3MCA9IGNhcnJ5NjQoaDcxICsgaDEsIGg3MCArIGgwKQogICAgZW5kCgogICAgcmV0dXJuIHAxNng0KGZtdDE2eDQsCiAgICAgICAgaDAxLCBoMDAsIGgxMSwgaDEwLCBoMjEsIGgyMCwgaDMxLCBoMzAsCiAgICAgICAgaDQxLCBoNDAsIGg1MSwgaDUwLCBoNjEsIGg2MCwgaDcxLCBoNzAKICAgICkKZW5kCgpyZXR1cm4gewogICAgZGlnZXN0ID0gZGlnZXN0LAp9Cg==";
  41.     ["ccryptolib.internal.util"] = base64.decode "bG9jYWwgZnVuY3Rpb24gbGFzc2VydCh2YWwsIGVyciwgbGV2ZWwpCiAgICBpZiBub3QgdmFsIHRoZW4gZXJyb3IoZXJyLCBsZXZlbCArIDEpIGVuZAogICAgcmV0dXJuIHZhbAplbmQKCgoKCgoKbG9jYWwgZnVuY3Rpb24gcmViYXNlTEUoYSwgYmFzZTEsIGJhc2UyKSAKICAgIGxvY2FsIG91dCA9IHt9CiAgICBsb2NhbCBvdXRsZW4gPSAxCiAgICBsb2NhbCBhY2MgPSAwCiAgICBsb2NhbCBtdWwgPSAxCiAgICBmb3IgaSA9IDEsICNhIGRvCiAgICAgICAgYWNjID0gYWNjICsgYVtpXSAqIG11bAogICAgICAgIG11bCA9IG11bCAqIGJhc2UxCiAgICAgICAgd2hpbGUgbXVsID49IGJhc2UyIGRvCiAgICAgICAgICAgIGxvY2FsIHJlbSA9IGFjYyAlIGJhc2UyCiAgICAgICAgICAgIGFjYyA9IChhY2MgLSByZW0pIC8gYmFzZTIKICAgICAgICAgICAgbXVsID0gbXVsIC8gYmFzZTIKICAgICAgICAgICAgb3V0W291dGxlbl0gPSByZW0KICAgICAgICAgICAgb3V0bGVuID0gb3V0bGVuICsgMQogICAgICAgIGVuZAogICAgZW5kCiAgICBpZiBtdWwgPiAwIHRoZW4KICAgICAgICBvdXRbb3V0bGVuXSA9IGFjYwogICAgZW5kCiAgICByZXR1cm4gb3V0CmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gYml0cyhzdHIpCiAgICAKICAgIGxvY2FsIGJ5dGVzID0ge3N0cjpieXRlKDEsIDMyKX0KICAgIGxvY2FsIG91dCA9IHt9CiAgICBmb3IgaSA9IDEsIDMyIGRvCiAgICAgICAgbG9jYWwgYnl0ZSA9IGJ5dGVzW2ldCiAgICAgICAgZm9yIGogPSAtNywgMCBkbwogICAgICAgICAgICBsb2NhbCBiaXQgPSBieXRlICUgMgogICAgICAgICAgICBvdXRbOCAqIGkgKyBqXSA9IGJpdAogICAgICAgICAgICBieXRlID0gKGJ5dGUgLSBiaXQpIC8gMgogICAgICAgIGVuZAogICAgZW5kCgogICAgCiAgICBvdXRbMV0gPSAwCiAgICBvdXRbMl0gPSAwCiAgICBvdXRbM10gPSAwCiAgICBvdXRbMjU1XSA9IDEKICAgIG91dFsyNTZdID0gMAoKICAgIHJldHVybiBvdXQKZW5kCgoKCgpsb2NhbCBmdW5jdGlvbiBiaXRzOChzdHIpCiAgICByZXR1cm4ge3VucGFjayhiaXRzKHN0ciksIDQpfQplbmQKCnJldHVybiB7CiAgICBsYXNzZXJ0ID0gbGFzc2VydCwKICAgIHJlYmFzZUxFID0gcmViYXNlTEUsCiAgICBiaXRzID0gYml0cywKICAgIGJpdHM4ID0gYml0czgsCn0K";
  42.     ["ccryptolib.ed25519"] = base64.decode "Cgpsb2NhbCBleHBlY3QgPSByZXF1aXJlICJjYy5leHBlY3QiLmV4cGVjdApsb2NhbCBsYXNzZXJ0ID0gcmVxdWlyZSAiY2NyeXB0b2xpYi5pbnRlcm5hbC51dGlsIi5sYXNzZXJ0CmxvY2FsIGZxICAgICA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwuZnEiCmxvY2FsIHNoYTUxMiA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwuc2hhNTEyIgpsb2NhbCBlZCAgICAgPSByZXF1aXJlICJjY3J5cHRvbGliLmludGVybmFsLmVkd2FyZHMyNTUxOSIKbG9jYWwgcmFuZG9tID0gcmVxdWlyZSAiY2NyeXB0b2xpYi5yYW5kb20iCgoKCgpsb2NhbCBmdW5jdGlvbiBwdWJsaWNLZXkoc2spCiAgICBleHBlY3QoMSwgc2ssICJzdHJpbmciKQogICAgYXNzZXJ0KCNzayA9PSAzMiwgInNlY3JldCBrZXkgbGVuZ3RoIG11c3QgYmUgMzIiKQoKICAgIGxvY2FsIGggPSBzaGE1MTIuZGlnZXN0KHNrKQogICAgbG9jYWwgeCA9IGZxLmRlY29kZUNsYW1wZWQoaDpzdWIoMSwgMzIpKQoKICAgIHJldHVybiBlZC5lbmNvZGUoZWQubXVsRyhmcS5iaXRzKHgpKSkKZW5kCgoKCgoKCmxvY2FsIGZ1bmN0aW9uIHNpZ24oc2ssIHBrLCBtc2cpCiAgICBleHBlY3QoMSwgc2ssICJzdHJpbmciKQogICAgbGFzc2VydCgjc2sgPT0gMzIsICJzZWNyZXQga2V5IGxlbmd0aCBtdXN0IGJlIDMyIiwgMikKICAgIGV4cGVjdCgyLCBwaywgInN0cmluZyIpCiAgICBsYXNzZXJ0KCNwayA9PSAzMiwgInB1YmxpYyBrZXkgbGVuZ3RoIG11c3QgYmUgMzIiLCAyKQogICAgZXhwZWN0KDMsIG1zZywgInN0cmluZyIpCgogICAgCiAgICBsb2NhbCBoID0gc2hhNTEyLmRpZ2VzdChzaykKICAgIGxvY2FsIHggPSBmcS5kZWNvZGVDbGFtcGVkKGg6c3ViKDEsIDMyKSkKCiAgICAKICAgIGxvY2FsIGsgPSBmcS5kZWNvZGVXaWRlKHJhbmRvbS5yYW5kb20oNjQpKQogICAgbG9jYWwgciA9IGVkLm11bEcoZnEuYml0cyhrKSkKICAgIGxvY2FsIHJTdHIgPSBlZC5lbmNvZGUocikKCiAgICAKICAgIGxvY2FsIGUgPSBmcS5kZWNvZGVXaWRlKHNoYTUxMi5kaWdlc3QoclN0ciAuLiBwayAuLiBtc2cpKQoKICAgIAogICAgbG9jYWwgbSA9IGZxLmRlY29kZVdpZGUocmFuZG9tLnJhbmRvbSg2NCkpCiAgICBsb2NhbCBzID0gZnEuc3ViKGZxLmFkZChrLCBmcS5tdWwoZnEuYWRkKHgsIG0pLCBlKSksIGZxLm11bChtLCBlKSkKICAgIGxvY2FsIHNTdHIgPSBmcS5lbmNvZGUocykKCiAgICByZXR1cm4gclN0ciAuLiBzU3RyCmVuZAoKCgoKCgpsb2NhbCBmdW5jdGlvbiB2ZXJpZnkocGssIG1zZywgc2lnKQogICAgZXhwZWN0KDEsIHBrLCAic3RyaW5nIikKICAgIGxhc3NlcnQoI3BrID09IDMyLCAicHVibGljIGtleSBsZW5ndGggbXVzdCBiZSAzMiIsIDIpIAogICAgZXhwZWN0KDIsIG1zZywgInN0cmluZyIpCiAgICBleHBlY3QoMywgc2lnLCAic3RyaW5nIikKICAgIGxhc3NlcnQoI3NpZyA9PSA2NCwgInNpZ25hdHVyZSBsZW5ndGggbXVzdCBiZSA2NCIsIDIpCgogICAgbG9jYWwgeSA9IGVkLmRlY29kZShwaykKICAgIGlmIG5vdCB5IHRoZW4gcmV0dXJuIGZhbHNlIGVuZAoKICAgIGxvY2FsIHJTdHIgPSBzaWc6c3ViKDEsIDMyKQogICAgbG9jYWwgc1N0ciA9IHNpZzpzdWIoMzMpCgogICAgbG9jYWwgZSA9IGZxLmRlY29kZVdpZGUoc2hhNTEyLmRpZ2VzdChyU3RyIC4uIHBrIC4uIG1zZykpCgogICAgbG9jYWwgZ3MgPSBlZC5tdWxHKGZxLmJpdHMoZnEuZGVjb2RlKHNTdHIpKSkKICAgIGxvY2FsIHllID0gZWQubXVsKHksIGZxLmJpdHMoZSkpCiAgICBsb2NhbCBydiA9IGVkLnN1YihncywgZWQubmllbHMoeWUpKQoKICAgIHJldHVybiBlZC5lbmNvZGUocnYpID09IHJTdHIKZW5kCgpyZXR1cm4gewogICAgcHVibGljS2V5ID0gcHVibGljS2V5LAogICAgc2lnbiA9IHNpZ24sCiAgICB2ZXJpZnkgPSB2ZXJpZnksCn0K";
  43.     ["ccryptolib.internal.fp"] = base64.decode "Cgpsb2NhbCBwYWNraW5nID0gcmVxdWlyZSAiY2NyeXB0b2xpYi5pbnRlcm5hbC5wYWNraW5nIgoKbG9jYWwgdW5wYWNrID0gdW5wYWNrIG9yIHRhYmxlLnVucGFjawpsb2NhbCB1ZnAsIGZtdGZwID0gcGFja2luZy5jb21waWxlVW5wYWNrKCI8STNJM0kySTNJM0kySTNJM0kySTNJM0kyIikKCgoKCgoKCgoKCmxvY2FsIEkgPSB7CiAgICAwOTU4NjQwICogMiBeIDAsCiAgICAwODI2NjY0ICogMiBeIDIyLAogICAgMTYxMzI1MSAqIDIgXiA0MywKICAgIDEwNDE1MjggKiAyIF4gNjQsCiAgICAwMDEzNjczICogMiBeIDg1LAogICAgMDM4NzE3MSAqIDIgXiAxMDcsCiAgICAxODI0Njc5ICogMiBeIDEyOCwKICAgIDAzMTM4MzkgKiAyIF4gMTQ5LAogICAgMDcwOTQ0MCAqIDIgXiAxNzAsCiAgICAwMTIyNjM1ICogMiBeIDE5MiwKICAgIDAyNjI3ODIgKiAyIF4gMjEzLAogICAgMDcxMjkwNSAqIDIgXiAyMzQsCn0KCgoKCmxvY2FsIGZ1bmN0aW9uIG51bShuKQogICAgcmV0dXJuIHtuLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQplbmQKCgoKCmxvY2FsIGZ1bmN0aW9uIG5lZyhhKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAsIGExMSA9IHVucGFjayhhKQogICAgcmV0dXJuIHsKICAgICAgICAtYTAwLAogICAgICAgIC1hMDEsCiAgICAgICAgLWEwMiwKICAgICAgICAtYTAzLAogICAgICAgIC1hMDQsCiAgICAgICAgLWEwNSwKICAgICAgICAtYTA2LAogICAgICAgIC1hMDcsCiAgICAgICAgLWEwOCwKICAgICAgICAtYTA5LAogICAgICAgIC1hMTAsCiAgICAgICAgLWExMSwKICAgIH0KZW5kCgoKCgoKbG9jYWwgZnVuY3Rpb24gYWRkKGEsIGIpCiAgICBsb2NhbCBhMDAsIGEwMSwgYTAyLCBhMDMsIGEwNCwgYTA1LCBhMDYsIGEwNywgYTA4LCBhMDksIGExMCwgYTExID0gdW5wYWNrKGEpCiAgICBsb2NhbCBiMDAsIGIwMSwgYjAyLCBiMDMsIGIwNCwgYjA1LCBiMDYsIGIwNywgYjA4LCBiMDksIGIxMCwgYjExID0gdW5wYWNrKGIpCiAgICByZXR1cm4gewogICAgICAgIGEwMCArIGIwMCwKICAgICAgICBhMDEgKyBiMDEsCiAgICAgICAgYTAyICsgYjAyLAogICAgICAgIGEwMyArIGIwMywKICAgICAgICBhMDQgKyBiMDQsCiAgICAgICAgYTA1ICsgYjA1LAogICAgICAgIGEwNiArIGIwNiwKICAgICAgICBhMDcgKyBiMDcsCiAgICAgICAgYTA4ICsgYjA4LAogICAgICAgIGEwOSArIGIwOSwKICAgICAgICBhMTAgKyBiMTAsCiAgICAgICAgYTExICsgYjExLAogICAgfQplbmQKCgoKCgpsb2NhbCBmdW5jdGlvbiBzdWIoYSwgYikKICAgIGxvY2FsIGEwMCwgYTAxLCBhMDIsIGEwMywgYTA0LCBhMDUsIGEwNiwgYTA3LCBhMDgsIGEwOSwgYTEwLCBhMTEgPSB1bnBhY2soYSkKICAgIGxvY2FsIGIwMCwgYjAxLCBiMDIsIGIwMywgYjA0LCBiMDUsIGIwNiwgYjA3LCBiMDgsIGIwOSwgYjEwLCBiMTEgPSB1bnBhY2soYikKICAgIHJldHVybiB7CiAgICAgICAgYTAwIC0gYjAwLAogICAgICAgIGEwMSAtIGIwMSwKICAgICAgICBhMDIgLSBiMDIsCiAgICAgICAgYTAzIC0gYjAzLAogICAgICAgIGEwNCAtIGIwNCwKICAgICAgICBhMDUgLSBiMDUsCiAgICAgICAgYTA2IC0gYjA2LAogICAgICAgIGEwNyAtIGIwNywKICAgICAgICBhMDggLSBiMDgsCiAgICAgICAgYTA5IC0gYjA5LAogICAgICAgIGExMCAtIGIxMCwKICAgICAgICBhMTEgLSBiMTEsCiAgICB9CmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gY2FycnkoYSkKICAgIGxvY2FsIGEwMCwgYTAxLCBhMDIsIGEwMywgYTA0LCBhMDUsIGEwNiwgYTA3LCBhMDgsIGEwOSwgYTEwLCBhMTEgPSB1bnBhY2soYSkKICAgIGxvY2FsIGMwMCwgYzAxLCBjMDIsIGMwMywgYzA0LCBjMDUsIGMwNiwgYzA3LCBjMDgsIGMwOSwgYzEwLCBjMTEKCiAgICBjMTEgPSBhMTEgKyAzICogMiBeIDMwNiAtIDMgKiAyIF4gMzA2ICBhMDAgPSBhMDAgKyAxOSAvIDIgXiAyNTUgKiBjMTEKCiAgICBjMDAgPSBhMDAgKyAzICogMiBeIDczICAtIDMgKiAyIF4gNzMgICBhMDEgPSBhMDEgKyBjMDAKICAgIGMwMSA9IGEwMSArIDMgKiAyIF4gOTQgIC0gMyAqIDIgXiA5NCAgIGEwMiA9IGEwMiArIGMwMQogICAgYzAyID0gYTAyICsgMyAqIDIgXiAxMTUgLSAzICogMiBeIDExNSAgYTAzID0gYTAzICsgYzAyCiAgICBjMDMgPSBhMDMgKyAzICogMiBeIDEzNiAtIDMgKiAyIF4gMTM2ICBhMDQgPSBhMDQgKyBjMDMKICAgIGMwNCA9IGEwNCArIDMgKiAyIF4gMTU4IC0gMyAqIDIgXiAxNTggIGEwNSA9IGEwNSArIGMwNAogICAgYzA1ID0gYTA1ICsgMyAqIDIgXiAxNzkgLSAzICogMiBeIDE3OSAgYTA2ID0gYTA2ICsgYzA1CiAgICBjMDYgPSBhMDYgKyAzICogMiBeIDIwMCAtIDMgKiAyIF4gMjAwICBhMDcgPSBhMDcgKyBjMDYKICAgIGMwNyA9IGEwNyArIDMgKiAyIF4gMjIxIC0gMyAqIDIgXiAyMjEgIGEwOCA9IGEwOCArIGMwNwogICAgYzA4ID0gYTA4ICsgMyAqIDIgXiAyNDMgLSAzICogMiBeIDI0MyAgYTA5ID0gYTA5ICsgYzA4CiAgICBjMDkgPSBhMDkgKyAzICogMiBeIDI2NCAtIDMgKiAyIF4gMjY0ICBhMTAgPSBhMTAgKyBjMDkKICAgIGMxMCA9IGExMCArIDMgKiAyIF4gMjg1IC0gMyAqIDIgXiAyODUgIGExMSA9IGExMSAtIGMxMSArIGMxMAoKICAgIGMxMSA9IGExMSArIDMgKiAyIF4gMzA2IC0gMyAqIDIgXiAzMDYKCiAgICByZXR1cm4gewogICAgICAgIGEwMCAtIGMwMCArIDE5IC8gMiBeIDI1NSAqIGMxMSwKICAgICAgICBhMDEgLSBjMDEsCiAgICAgICAgYTAyIC0gYzAyLAogICAgICAgIGEwMyAtIGMwMywKICAgICAgICBhMDQgLSBjMDQsCiAgICAgICAgYTA1IC0gYzA1LAogICAgICAgIGEwNiAtIGMwNiwKICAgICAgICBhMDcgLSBjMDcsCiAgICAgICAgYTA4IC0gYzA4LAogICAgICAgIGEwOSAtIGMwOSwKICAgICAgICBhMTAgLSBjMTAsCiAgICAgICAgYTExIC0gYzExLAogICAgfQplbmQKCgoKCgoKCgoKCmxvY2FsIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShhKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAsIGExMSA9IHVucGFjayhhKQogICAgbG9jYWwgYzAwLCBjMDEsIGMwMiwgYzAzLCBjMDQsIGMwNSwgYzA2LCBjMDcsIGMwOCwgYzA5LCBjMTAsIGMxMQoKICAgIAogICAgCiAgICBjMDAgPSBhMDAgJSAyIF4gMjIgICBhMDEgPSBhMDAgLSBjMDAgKyBhMDEKICAgIGMwMSA9IGEwMSAlIDIgXiA0MyAgIGEwMiA9IGEwMSAtIGMwMSArIGEwMgogICAgYzAyID0gYTAyICUgMiBeIDY0ICAgYTAzID0gYTAyIC0gYzAyICsgYTAzCiAgICBjMDMgPSBhMDMgJSAyIF4gODUgICBhMDQgPSBhMDMgLSBjMDMgKyBhMDQKICAgIGMwNCA9IGEwNCAlIDIgXiAxMDcgIGEwNSA9IGEwNCAtIGMwNCArIGEwNQogICAgYzA1ID0gYTA1ICUgMiBeIDEyOCAgYTA2ID0gYTA1IC0gYzA1ICsgYTA2CiAgICBjMDYgPSBhMDYgJSAyIF4gMTQ5ICBhMDcgPSBhMDYgLSBjMDYgKyBhMDcKICAgIGMwNyA9IGEwNyAlIDIgXiAxNzAgIGEwOCA9IGEwNyAtIGMwNyArIGEwOAogICAgYzA4ID0gYTA4ICUgMiBeIDE5MiAgYTA5ID0gYTA4IC0gYzA4ICsgYTA5CiAgICBjMDkgPSBhMDkgJSAyIF4gMjEzICBhMTAgPSBhMDkgLSBjMDkgKyBhMTAKICAgIGMxMCA9IGExMCAlIDIgXiAyMzQgIGExMSA9IGExMCAtIGMxMCArIGExMQogICAgYzExID0gYTExICUgMiBeIDI1NSAgYzAwID0gYzAwICsgMTkgLyAyIF4gMjU1ICogKGExMSAtIGMxMSkKCiAgICAKICAgIGlmICAgICAgYzExIC8gMiBeIDIzNCA9PSAyIF4gMjEgLSAxCiAgICAgICAgYW5kIGMxMCAvIDIgXiAyMTMgPT0gMiBeIDIxIC0gMQogICAgICAgIGFuZCBjMDkgLyAyIF4gMTkyID09IDIgXiAyMSAtIDEKICAgICAgICBhbmQgYzA4IC8gMiBeIDE3MCA9PSAyIF4gMjIgLSAxCiAgICAgICAgYW5kIGMwNyAvIDIgXiAxNDkgPT0gMiBeIDIxIC0gMQogICAgICAgIGFuZCBjMDYgLyAyIF4gMTI4ID09IDIgXiAyMSAtIDEKICAgICAgICBhbmQgYzA1IC8gMiBeIDEwNyA9PSAyIF4gMjEgLSAxCiAgICAgICAgYW5kIGMwNCAvIDIgXiA4NSAgPT0gMiBeIDIyIC0gMQogICAgICAgIGFuZCBjMDMgLyAyIF4gNjQgID09IDIgXiAyMSAtIDEKICAgICAgICBhbmQgYzAyIC8gMiBeIDQzICA9PSAyIF4gMjEgLSAxCiAgICAgICAgYW5kIGMwMSAvIDIgXiAyMiAgPT0gMiBeIDIxIC0gMQogICAgICAgIGFuZCBjMDAgPj0gMiBeIDIyIC0gMTkKICAgIHRoZW4KICAgICAgICByZXR1cm4gezE5IC0gMiBeIDIyICsgYzAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQogICAgZWxzZQogICAgICAgIHJldHVybiB7YzAwLCBjMDEsIGMwMiwgYzAzLCBjMDQsIGMwNSwgYzA2LCBjMDcsIGMwOCwgYzA5LCBjMTAsIGMxMX0KICAgIGVuZAplbmQKCgoKCgpsb2NhbCBmdW5jdGlvbiBlcShhLCBiKQogICAgbG9jYWwgYyA9IGNhbm9uaWNhbGl6ZShzdWIoYSwgYikpCiAgICBmb3IgaSA9IDEsIDEyIGRvIGlmIGNbaV0gfj0gMCB0aGVuIHJldHVybiBmYWxzZSBlbmQgZW5kCiAgICByZXR1cm4gdHJ1ZQplbmQKCgoKCgpsb2NhbCBmdW5jdGlvbiBtdWwoYSwgYikKICAgIGxvY2FsIGEwMCwgYTAxLCBhMDIsIGEwMywgYTA0LCBhMDUsIGEwNiwgYTA3LCBhMDgsIGEwOSwgYTEwLCBhMTEgPSB1bnBhY2soYSkKICAgIGxvY2FsIGIwMCwgYjAxLCBiMDIsIGIwMywgYjA0LCBiMDUsIGIwNiwgYjA3LCBiMDgsIGIwOSwgYjEwLCBiMTEgPSB1bnBhY2soYikKICAgIGxvY2FsIGMwMCwgYzAxLCBjMDIsIGMwMywgYzA0LCBjMDUsIGMwNiwgYzA3LCBjMDgsIGMwOSwgYzEwLCBjMTEKCiAgICAKICAgIGMwMCA9IGExMSAqIGIwMQogICAgICAgICsgYTEwICogYjAyCiAgICAgICAgKyBhMDkgKiBiMDMKICAgICAgICArIGEwOCAqIGIwNAogICAgICAgICsgYTA3ICogYjA1CiAgICAgICAgKyBhMDYgKiBiMDYKICAgICAgICArIGEwNSAqIGIwNwogICAgICAgICsgYTA0ICogYjA4CiAgICAgICAgKyBhMDMgKiBiMDkKICAgICAgICArIGEwMiAqIGIxMAogICAgICAgICsgYTAxICogYjExCiAgICBjMDEgPSBhMTEgKiBiMDIKICAgICAgICArIGExMCAqIGIwMwogICAgICAgICsgYTA5ICogYjA0CiAgICAgICAgKyBhMDggKiBiMDUKICAgICAgICArIGEwNyAqIGIwNgogICAgICAgICsgYTA2ICogYjA3CiAgICAgICAgKyBhMDUgKiBiMDgKICAgICAgICArIGEwNCAqIGIwOQogICAgICAgICsgYTAzICogYjEwCiAgICAgICAgKyBhMDIgKiBiMTEKICAgIGMwMiA9IGExMSAqIGIwMwogICAgICAgICsgYTEwICogYjA0CiAgICAgICAgKyBhMDkgKiBiMDUKICAgICAgICArIGEwOCAqIGIwNgogICAgICAgICsgYTA3ICogYjA3CiAgICAgICAgKyBhMDYgKiBiMDgKICAgICAgICArIGEwNSAqIGIwOQogICAgICAgICsgYTA0ICogYjEwCiAgICAgICAgKyBhMDMgKiBiMTEKICAgIGMwMyA9IGExMSAqIGIwNAogICAgICAgICsgYTEwICogYjA1CiAgICAgICAgKyBhMDkgKiBiMDYKICAgICAgICArIGEwOCAqIGIwNwogICAgICAgICsgYTA3ICogYjA4CiAgICAgICAgKyBhMDYgKiBiMDkKICAgICAgICArIGEwNSAqIGIxMAogICAgICAgICsgYTA0ICogYjExCiAgICBjMDQgPSBhMTEgKiBiMDUKICAgICAgICArIGExMCAqIGIwNgogICAgICAgICsgYTA5ICogYjA3CiAgICAgICAgKyBhMDggKiBiMDgKICAgICAgICArIGEwNyAqIGIwOQogICAgICAgICsgYTA2ICogYjEwCiAgICAgICAgKyBhMDUgKiBiMTEKICAgIGMwNSA9IGExMSAqIGIwNgogICAgICAgICsgYTEwICogYjA3CiAgICAgICAgKyBhMDkgKiBiMDgKICAgICAgICArIGEwOCAqIGIwOQogICAgICAgICsgYTA3ICogYjEwCiAgICAgICAgKyBhMDYgKiBiMTEKICAgIGMwNiA9IGExMSAqIGIwNwogICAgICAgICsgYTEwICogYjA4CiAgICAgICAgKyBhMDkgKiBiMDkKICAgICAgICArIGEwOCAqIGIxMAogICAgICAgICsgYTA3ICogYjExCiAgICBjMDcgPSBhMTEgKiBiMDgKICAgICAgICArIGExMCAqIGIwOQogICAgICAgICsgYTA5ICogYjEwCiAgICAgICAgKyBhMDggKiBiMTEKICAgIGMwOCA9IGExMSAqIGIwOQogICAgICAgICsgYTEwICogYjEwCiAgICAgICAgKyBhMDkgKiBiMTEKICAgIGMwOSA9IGExMSAqIGIxMAogICAgICAgICsgYTEwICogYjExCiAgICBjMTAgPSBhMTEgKiBiMTEKCiAgICAKICAgIGMwMCA9IGMwMCAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDAgKiBiMDAKICAgIGMwMSA9IGMwMSAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDEgKiBiMDAKICAgICAgICArIGEwMCAqIGIwMQogICAgYzAyID0gYzAyICogKDE5IC8gMiBeIDI1NSkKICAgICAgICArIGEwMiAqIGIwMAogICAgICAgICsgYTAxICogYjAxCiAgICAgICAgKyBhMDAgKiBiMDIKICAgIGMwMyA9IGMwMyAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDMgKiBiMDAKICAgICAgICArIGEwMiAqIGIwMQogICAgICAgICsgYTAxICogYjAyCiAgICAgICAgKyBhMDAgKiBiMDMKICAgIGMwNCA9IGMwNCAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDQgKiBiMDAKICAgICAgICArIGEwMyAqIGIwMQogICAgICAgICsgYTAyICogYjAyCiAgICAgICAgKyBhMDEgKiBiMDMKICAgICAgICArIGEwMCAqIGIwNAogICAgYzA1ID0gYzA1ICogKDE5IC8gMiBeIDI1NSkKICAgICAgICArIGEwNSAqIGIwMAogICAgICAgICsgYTA0ICogYjAxCiAgICAgICAgKyBhMDMgKiBiMDIKICAgICAgICArIGEwMiAqIGIwMwogICAgICAgICsgYTAxICogYjA0CiAgICAgICAgKyBhMDAgKiBiMDUKICAgIGMwNiA9IGMwNiAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDYgKiBiMDAKICAgICAgICArIGEwNSAqIGIwMQogICAgICAgICsgYTA0ICogYjAyCiAgICAgICAgKyBhMDMgKiBiMDMKICAgICAgICArIGEwMiAqIGIwNAogICAgICAgICsgYTAxICogYjA1CiAgICAgICAgKyBhMDAgKiBiMDYKICAgIGMwNyA9IGMwNyAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDcgKiBiMDAKICAgICAgICArIGEwNiAqIGIwMQogICAgICAgICsgYTA1ICogYjAyCiAgICAgICAgKyBhMDQgKiBiMDMKICAgICAgICArIGEwMyAqIGIwNAogICAgICAgICsgYTAyICogYjA1CiAgICAgICAgKyBhMDEgKiBiMDYKICAgICAgICArIGEwMCAqIGIwNwogICAgYzA4ID0gYzA4ICogKDE5IC8gMiBeIDI1NSkKICAgICAgICArIGEwOCAqIGIwMAogICAgICAgICsgYTA3ICogYjAxCiAgICAgICAgKyBhMDYgKiBiMDIKICAgICAgICArIGEwNSAqIGIwMwogICAgICAgICsgYTA0ICogYjA0CiAgICAgICAgKyBhMDMgKiBiMDUKICAgICAgICArIGEwMiAqIGIwNgogICAgICAgICsgYTAxICogYjA3CiAgICAgICAgKyBhMDAgKiBiMDgKICAgIGMwOSA9IGMwOSAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDkgKiBiMDAKICAgICAgICArIGEwOCAqIGIwMQogICAgICAgICsgYTA3ICogYjAyCiAgICAgICAgKyBhMDYgKiBiMDMKICAgICAgICArIGEwNSAqIGIwNAogICAgICAgICsgYTA0ICogYjA1CiAgICAgICAgKyBhMDMgKiBiMDYKICAgICAgICArIGEwMiAqIGIwNwogICAgICAgICsgYTAxICogYjA4CiAgICAgICAgKyBhMDAgKiBiMDkKICAgIGMxMCA9IGMxMCAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMTAgKiBiMDAKICAgICAgICArIGEwOSAqIGIwMQogICAgICAgICsgYTA4ICogYjAyCiAgICAgICAgKyBhMDcgKiBiMDMKICAgICAgICArIGEwNiAqIGIwNAogICAgICAgICsgYTA1ICogYjA1CiAgICAgICAgKyBhMDQgKiBiMDYKICAgICAgICArIGEwMyAqIGIwNwogICAgICAgICsgYTAyICogYjA4CiAgICAgICAgKyBhMDEgKiBiMDkKICAgICAgICArIGEwMCAqIGIxMAogICAgYzExID0gYTExICogYjAwCiAgICAgICAgKyBhMTAgKiBiMDEKICAgICAgICArIGEwOSAqIGIwMgogICAgICAgICsgYTA4ICogYjAzCiAgICAgICAgKyBhMDcgKiBiMDQKICAgICAgICArIGEwNiAqIGIwNQogICAgICAgICsgYTA1ICogYjA2CiAgICAgICAgKyBhMDQgKiBiMDcKICAgICAgICArIGEwMyAqIGIwOAogICAgICAgICsgYTAyICogYjA5CiAgICAgICAgKyBhMDEgKiBiMTAKICAgICAgICArIGEwMCAqIGIxMQoKICAgIAogICAgYTEwID0gYzEwICsgMyAqIDIgXiAyODUgLSAzICogMiBeIDI4NSAgYzExID0gYzExICsgYTEwCiAgICBhMTEgPSBjMTEgKyAzICogMiBeIDMwNiAtIDMgKiAyIF4gMzA2ICBjMDAgPSBjMDAgKyAxOSAvIDIgXiAyNTUgKiBhMTEKCiAgICBhMDAgPSBjMDAgKyAzICogMiBeIDczICAtIDMgKiAyIF4gNzMgICBjMDEgPSBjMDEgKyBhMDAKICAgIGEwMSA9IGMwMSArIDMgKiAyIF4gOTQgIC0gMyAqIDIgXiA5NCAgIGMwMiA9IGMwMiArIGEwMQogICAgYTAyID0gYzAyICsgMyAqIDIgXiAxMTUgLSAzICogMiBeIDExNSAgYzAzID0gYzAzICsgYTAyCiAgICBhMDMgPSBjMDMgKyAzICogMiBeIDEzNiAtIDMgKiAyIF4gMTM2ICBjMDQgPSBjMDQgKyBhMDMKICAgIGEwNCA9IGMwNCArIDMgKiAyIF4gMTU4IC0gMyAqIDIgXiAxNTggIGMwNSA9IGMwNSArIGEwNAogICAgYTA1ID0gYzA1ICsgMyAqIDIgXiAxNzkgLSAzICogMiBeIDE3OSAgYzA2ID0gYzA2ICsgYTA1CiAgICBhMDYgPSBjMDYgKyAzICogMiBeIDIwMCAtIDMgKiAyIF4gMjAwICBjMDcgPSBjMDcgKyBhMDYKICAgIGEwNyA9IGMwNyArIDMgKiAyIF4gMjIxIC0gMyAqIDIgXiAyMjEgIGMwOCA9IGMwOCArIGEwNwogICAgYTA4ID0gYzA4ICsgMyAqIDIgXiAyNDMgLSAzICogMiBeIDI0MyAgYzA5ID0gYzA5ICsgYTA4CiAgICBhMDkgPSBjMDkgKyAzICogMiBeIDI2NCAtIDMgKiAyIF4gMjY0ICBjMTAgPSBjMTAgLSBhMTAgKyBhMDkKICAgIGExMCA9IGMxMCArIDMgKiAyIF4gMjg1IC0gMyAqIDIgXiAyODUgIGMxMSA9IGMxMSAtIGExMSArIGExMAoKICAgIGExMSA9IGMxMSArIDMgKiAyIF4gMzA2IC0gMyAqIDIgXiAzMDYKCiAgICByZXR1cm4gewogICAgICAgIGMwMCAtIGEwMCArIDE5IC8gMiBeIDI1NSAqIGExMSwKICAgICAgICBjMDEgLSBhMDEsCiAgICAgICAgYzAyIC0gYTAyLAogICAgICAgIGMwMyAtIGEwMywKICAgICAgICBjMDQgLSBhMDQsCiAgICAgICAgYzA1IC0gYTA1LAogICAgICAgIGMwNiAtIGEwNiwKICAgICAgICBjMDcgLSBhMDcsCiAgICAgICAgYzA4IC0gYTA4LAogICAgICAgIGMwOSAtIGEwOSwKICAgICAgICBjMTAgLSBhMTAsCiAgICAgICAgYzExIC0gYTExLAogICAgfQplbmQKCgoKCmxvY2FsIGZ1bmN0aW9uIHNxdWFyZShhKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAsIGExMSA9IHVucGFjayhhKQogICAgbG9jYWwgZDAwLCBkMDEsIGQwMiwgZDAzLCBkMDQsIGQwNSwgZDA2LCBkMDcsIGQwOCwgZDA5LCBkMTAKICAgIGxvY2FsIGMwMCwgYzAxLCBjMDIsIGMwMywgYzA0LCBjMDUsIGMwNiwgYzA3LCBjMDgsIGMwOSwgYzEwLCBjMTEKCiAgICAKICAgIGQwMCA9IGEwMCArIGEwMAogICAgZDAxID0gYTAxICsgYTAxCiAgICBkMDIgPSBhMDIgKyBhMDIKICAgIGQwMyA9IGEwMyArIGEwMwogICAgZDA0ID0gYTA0ICsgYTA0CiAgICBkMDUgPSBhMDUgKyBhMDUKICAgIGQwNiA9IGEwNiArIGEwNgogICAgZDA3ID0gYTA3ICsgYTA3CiAgICBkMDggPSBhMDggKyBhMDgKICAgIGQwOSA9IGEwOSArIGEwOQogICAgZDEwID0gYTEwICsgYTEwCgogICAgCiAgICBjMDAgPSBhMTEgKiBkMDEKICAgICAgICArIGExMCAqIGQwMgogICAgICAgICsgYTA5ICogZDAzCiAgICAgICAgKyBhMDggKiBkMDQKICAgICAgICArIGEwNyAqIGQwNQogICAgICAgICsgYTA2ICogYTA2CiAgICBjMDEgPSBhMTEgKiBkMDIKICAgICAgICArIGExMCAqIGQwMwogICAgICAgICsgYTA5ICogZDA0CiAgICAgICAgKyBhMDggKiBkMDUKICAgICAgICArIGEwNyAqIGQwNgogICAgYzAyID0gYTExICogZDAzCiAgICAgICAgKyBhMTAgKiBkMDQKICAgICAgICArIGEwOSAqIGQwNQogICAgICAgICsgYTA4ICogZDA2CiAgICAgICAgKyBhMDcgKiBhMDcKICAgIGMwMyA9IGExMSAqIGQwNAogICAgICAgICsgYTEwICogZDA1CiAgICAgICAgKyBhMDkgKiBkMDYKICAgICAgICArIGEwOCAqIGQwNwogICAgYzA0ID0gYTExICogZDA1CiAgICAgICAgKyBhMTAgKiBkMDYKICAgICAgICArIGEwOSAqIGQwNwogICAgICAgICsgYTA4ICogYTA4CiAgICBjMDUgPSBhMTEgKiBkMDYKICAgICAgICArIGExMCAqIGQwNwogICAgICAgICsgYTA5ICogZDA4CiAgICBjMDYgPSBhMTEgKiBkMDcKICAgICAgICArIGExMCAqIGQwOAogICAgICAgICsgYTA5ICogYTA5CiAgICBjMDcgPSBhMTEgKiBkMDgKICAgICAgICArIGExMCAqIGQwOQogICAgYzA4ID0gYTExICogZDA5CiAgICAgICAgKyBhMTAgKiBhMTAKICAgIGMwOSA9IGExMSAqIGQxMAogICAgYzEwID0gYTExICogYTExCgogICAgCiAgICBjMDAgPSBjMDAgKiAoMTkgLyAyIF4gMjU1KQogICAgICAgICsgYTAwICogYTAwCiAgICBjMDEgPSBjMDEgKiAoMTkgLyAyIF4gMjU1KQogICAgICAgICsgYTAxICogZDAwCiAgICBjMDIgPSBjMDIgKiAoMTkgLyAyIF4gMjU1KQogICAgICAgICsgYTAyICogZDAwCiAgICAgICAgKyBhMDEgKiBhMDEKICAgIGMwMyA9IGMwMyAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDMgKiBkMDAKICAgICAgICArIGEwMiAqIGQwMQogICAgYzA0ID0gYzA0ICogKDE5IC8gMiBeIDI1NSkKICAgICAgICArIGEwNCAqIGQwMAogICAgICAgICsgYTAzICogZDAxCiAgICAgICAgKyBhMDIgKiBhMDIKICAgIGMwNSA9IGMwNSAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDUgKiBkMDAKICAgICAgICArIGEwNCAqIGQwMQogICAgICAgICsgYTAzICogZDAyCiAgICBjMDYgPSBjMDYgKiAoMTkgLyAyIF4gMjU1KQogICAgICAgICsgYTA2ICogZDAwCiAgICAgICAgKyBhMDUgKiBkMDEKICAgICAgICArIGEwNCAqIGQwMgogICAgICAgICsgYTAzICogYTAzCiAgICBjMDcgPSBjMDcgKiAoMTkgLyAyIF4gMjU1KQogICAgICAgICsgYTA3ICogZDAwCiAgICAgICAgKyBhMDYgKiBkMDEKICAgICAgICArIGEwNSAqIGQwMgogICAgICAgICsgYTA0ICogZDAzCiAgICBjMDggPSBjMDggKiAoMTkgLyAyIF4gMjU1KQogICAgICAgICsgYTA4ICogZDAwCiAgICAgICAgKyBhMDcgKiBkMDEKICAgICAgICArIGEwNiAqIGQwMgogICAgICAgICsgYTA1ICogZDAzCiAgICAgICAgKyBhMDQgKiBhMDQKICAgIGMwOSA9IGMwOSAqICgxOSAvIDIgXiAyNTUpCiAgICAgICAgKyBhMDkgKiBkMDAKICAgICAgICArIGEwOCAqIGQwMQogICAgICAgICsgYTA3ICogZDAyCiAgICAgICAgKyBhMDYgKiBkMDMKICAgICAgICArIGEwNSAqIGQwNAogICAgYzEwID0gYzEwICogKDE5IC8gMiBeIDI1NSkKICAgICAgICArIGExMCAqIGQwMAogICAgICAgICsgYTA5ICogZDAxCiAgICAgICAgKyBhMDggKiBkMDIKICAgICAgICArIGEwNyAqIGQwMwogICAgICAgICsgYTA2ICogZDA0CiAgICAgICAgKyBhMDUgKiBhMDUKICAgIGMxMSA9IGExMSAqIGQwMAogICAgICAgICsgYTEwICogZDAxCiAgICAgICAgKyBhMDkgKiBkMDIKICAgICAgICArIGEwOCAqIGQwMwogICAgICAgICsgYTA3ICogZDA0CiAgICAgICAgKyBhMDYgKiBkMDUKCiAgICAKICAgIGExMCA9IGMxMCArIDMgKiAyIF4gMjg1IC0gMyAqIDIgXiAyODUgIGMxMSA9IGMxMSArIGExMAogICAgYTExID0gYzExICsgMyAqIDIgXiAzMDYgLSAzICogMiBeIDMwNiAgYzAwID0gYzAwICsgMTkgLyAyIF4gMjU1ICogYTExCgogICAgYTAwID0gYzAwICsgMyAqIDIgXiA3MyAgLSAzICogMiBeIDczICAgYzAxID0gYzAxICsgYTAwCiAgICBhMDEgPSBjMDEgKyAzICogMiBeIDk0ICAtIDMgKiAyIF4gOTQgICBjMDIgPSBjMDIgKyBhMDEKICAgIGEwMiA9IGMwMiArIDMgKiAyIF4gMTE1IC0gMyAqIDIgXiAxMTUgIGMwMyA9IGMwMyArIGEwMgogICAgYTAzID0gYzAzICsgMyAqIDIgXiAxMzYgLSAzICogMiBeIDEzNiAgYzA0ID0gYzA0ICsgYTAzCiAgICBhMDQgPSBjMDQgKyAzICogMiBeIDE1OCAtIDMgKiAyIF4gMTU4ICBjMDUgPSBjMDUgKyBhMDQKICAgIGEwNSA9IGMwNSArIDMgKiAyIF4gMTc5IC0gMyAqIDIgXiAxNzkgIGMwNiA9IGMwNiArIGEwNQogICAgYTA2ID0gYzA2ICsgMyAqIDIgXiAyMDAgLSAzICogMiBeIDIwMCAgYzA3ID0gYzA3ICsgYTA2CiAgICBhMDcgPSBjMDcgKyAzICogMiBeIDIyMSAtIDMgKiAyIF4gMjIxICBjMDggPSBjMDggKyBhMDcKICAgIGEwOCA9IGMwOCArIDMgKiAyIF4gMjQzIC0gMyAqIDIgXiAyNDMgIGMwOSA9IGMwOSArIGEwOAogICAgYTA5ID0gYzA5ICsgMyAqIDIgXiAyNjQgLSAzICogMiBeIDI2NCAgYzEwID0gYzEwIC0gYTEwICsgYTA5CiAgICBhMTAgPSBjMTAgKyAzICogMiBeIDI4NSAtIDMgKiAyIF4gMjg1ICBjMTEgPSBjMTEgLSBhMTEgKyBhMTAKCiAgICBhMTEgPSBjMTEgKyAzICogMiBeIDMwNiAtIDMgKiAyIF4gMzA2CgogICAgcmV0dXJuIHsKICAgICAgICBjMDAgLSBhMDAgKyAxOSAvIDIgXiAyNTUgKiBhMTEsCiAgICAgICAgYzAxIC0gYTAxLAogICAgICAgIGMwMiAtIGEwMiwKICAgICAgICBjMDMgLSBhMDMsCiAgICAgICAgYzA0IC0gYTA0LAogICAgICAgIGMwNSAtIGEwNSwKICAgICAgICBjMDYgLSBhMDYsCiAgICAgICAgYzA3IC0gYTA3LAogICAgICAgIGMwOCAtIGEwOCwKICAgICAgICBjMDkgLSBhMDksCiAgICAgICAgYzEwIC0gYTEwLAogICAgICAgIGMxMSAtIGExMSwKICAgIH0KZW5kCgoKCgoKbG9jYWwgZnVuY3Rpb24ga211bChhLCBrKQogICAgbG9jYWwgYTAwLCBhMDEsIGEwMiwgYTAzLCBhMDQsIGEwNSwgYTA2LCBhMDcsIGEwOCwgYTA5LCBhMTAsIGExMSA9IHVucGFjayhhKQogICAgbG9jYWwgYzAwLCBjMDEsIGMwMiwgYzAzLCBjMDQsIGMwNSwgYzA2LCBjMDcsIGMwOCwgYzA5LCBjMTAsIGMxMQoKICAgIAogICAgYTAwID0gYTAwICogawogICAgYTAxID0gYTAxICogawogICAgYTAyID0gYTAyICogawogICAgYTAzID0gYTAzICogawogICAgYTA0ID0gYTA0ICogawogICAgYTA1ID0gYTA1ICogawogICAgYTA2ID0gYTA2ICogawogICAgYTA3ID0gYTA3ICogawogICAgYTA4ID0gYTA4ICogawogICAgYTA5ID0gYTA5ICogawogICAgYTEwID0gYTEwICogawogICAgYTExID0gYTExICogawoKICAgIGMxMSA9IGExMSArIDMgKiAyIF4gMzA2IC0gMyAqIDIgXiAzMDYgIGEwMCA9IGEwMCArIDE5IC8gMiBeIDI1NSAqIGMxMQoKICAgIGMwMCA9IGEwMCArIDMgKiAyIF4gNzMgIC0gMyAqIDIgXiA3MyAgIGEwMSA9IGEwMSArIGMwMAogICAgYzAxID0gYTAxICsgMyAqIDIgXiA5NCAgLSAzICogMiBeIDk0ICAgYTAyID0gYTAyICsgYzAxCiAgICBjMDIgPSBhMDIgKyAzICogMiBeIDExNSAtIDMgKiAyIF4gMTE1ICBhMDMgPSBhMDMgKyBjMDIKICAgIGMwMyA9IGEwMyArIDMgKiAyIF4gMTM2IC0gMyAqIDIgXiAxMzYgIGEwNCA9IGEwNCArIGMwMwogICAgYzA0ID0gYTA0ICsgMyAqIDIgXiAxNTggLSAzICogMiBeIDE1OCAgYTA1ID0gYTA1ICsgYzA0CiAgICBjMDUgPSBhMDUgKyAzICogMiBeIDE3OSAtIDMgKiAyIF4gMTc5ICBhMDYgPSBhMDYgKyBjMDUKICAgIGMwNiA9IGEwNiArIDMgKiAyIF4gMjAwIC0gMyAqIDIgXiAyMDAgIGEwNyA9IGEwNyArIGMwNgogICAgYzA3ID0gYTA3ICsgMyAqIDIgXiAyMjEgLSAzICogMiBeIDIyMSAgYTA4ID0gYTA4ICsgYzA3CiAgICBjMDggPSBhMDggKyAzICogMiBeIDI0MyAtIDMgKiAyIF4gMjQzICBhMDkgPSBhMDkgKyBjMDgKICAgIGMwOSA9IGEwOSArIDMgKiAyIF4gMjY0IC0gMyAqIDIgXiAyNjQgIGExMCA9IGExMCArIGMwOQogICAgYzEwID0gYTEwICsgMyAqIDIgXiAyODUgLSAzICogMiBeIDI4NSAgYTExID0gYTExIC0gYzExICsgYzEwCgogICAgYzExID0gYTExICsgMyAqIDIgXiAzMDYgLSAzICogMiBeIDMwNgoKICAgIHJldHVybiB7CiAgICAgICAgYTAwIC0gYzAwICsgMTkgLyAyIF4gMjU1ICogYzExLAogICAgICAgIGEwMSAtIGMwMSwKICAgICAgICBhMDIgLSBjMDIsCiAgICAgICAgYTAzIC0gYzAzLAogICAgICAgIGEwNCAtIGMwNCwKICAgICAgICBhMDUgLSBjMDUsCiAgICAgICAgYTA2IC0gYzA2LAogICAgICAgIGEwNyAtIGMwNywKICAgICAgICBhMDggLSBjMDgsCiAgICAgICAgYTA5IC0gYzA5LAogICAgICAgIGExMCAtIGMxMCwKICAgICAgICBhMTEgLSBjMTEKICAgIH0KZW5kCgoKCgoKbG9jYWwgZnVuY3Rpb24gbnNxdWFyZShhLCBuKQogICAgZm9yIF8gPSAxLCBuIGRvIGEgPSBzcXVhcmUoYSkgZW5kCiAgICByZXR1cm4gYQplbmQKCgoKCgoKCmxvY2FsIGZ1bmN0aW9uIGludmVydChhKQogICAgbG9jYWwgYTIgPSBzcXVhcmUoYSkKICAgIGxvY2FsIGE5ID0gbXVsKGEsIG5zcXVhcmUoYTIsIDIpKQogICAgbG9jYWwgYTExID0gbXVsKGE5LCBhMikKCiAgICBsb2NhbCB4NSA9IG11bChzcXVhcmUoYTExKSwgYTkpCiAgICBsb2NhbCB4MTAgPSBtdWwobnNxdWFyZSh4NSwgNSksIHg1KQogICAgbG9jYWwgeDIwID0gbXVsKG5zcXVhcmUoeDEwLCAxMCksIHgxMCkKICAgIGxvY2FsIHg0MCA9IG11bChuc3F1YXJlKHgyMCwgMjApLCB4MjApCiAgICBsb2NhbCB4NTAgPSBtdWwobnNxdWFyZSh4NDAsIDEwKSwgeDEwKQogICAgbG9jYWwgeDEwMCA9IG11bChuc3F1YXJlKHg1MCwgNTApLCB4NTApCiAgICBsb2NhbCB4MjAwID0gbXVsKG5zcXVhcmUoeDEwMCwgMTAwKSwgeDEwMCkKICAgIGxvY2FsIHgyNTAgPSBtdWwobnNxdWFyZSh4MjAwLCA1MCksIHg1MCkKCiAgICByZXR1cm4gbXVsKG5zcXVhcmUoeDI1MCwgNSksIGExMSkKZW5kCgoKCgoKCgoKbG9jYWwgZnVuY3Rpb24gc3FydERpdih1LCB2KQogICAgdSA9IGNhcnJ5KHUpCgogICAgbG9jYWwgdjIgPSBzcXVhcmUodikKICAgIGxvY2FsIHYzID0gbXVsKHYsIHYyKQogICAgbG9jYWwgdjYgPSBzcXVhcmUodjMpCiAgICBsb2NhbCB2NyA9IG11bCh2LCB2NikKICAgIGxvY2FsIHV2NyA9IG11bCh1LCB2NykKCiAgICBsb2NhbCB4MiA9IG11bChzcXVhcmUodXY3KSwgdXY3KQogICAgbG9jYWwgeDQgPSBtdWwobnNxdWFyZSh4MiwgMiksIHgyKQogICAgbG9jYWwgeDggPSBtdWwobnNxdWFyZSh4NCwgNCksIHg0KQogICAgbG9jYWwgeDE2ID0gbXVsKG5zcXVhcmUoeDgsIDgpLCB4OCkKICAgIGxvY2FsIHgxOCA9IG11bChuc3F1YXJlKHgxNiwgMiksIHgyKQogICAgbG9jYWwgeDMyID0gbXVsKG5zcXVhcmUoeDE2LCAxNiksIHgxNikKICAgIGxvY2FsIHg1MCA9IG11bChuc3F1YXJlKHgzMiwgMTgpLCB4MTgpCiAgICBsb2NhbCB4MTAwID0gbXVsKG5zcXVhcmUoeDUwLCA1MCksIHg1MCkKICAgIGxvY2FsIHgyMDAgPSBtdWwobnNxdWFyZSh4MTAwLCAxMDApLCB4MTAwKQogICAgbG9jYWwgeDI1MCA9IG11bChuc3F1YXJlKHgyMDAsIDUwKSwgeDUwKQogICAgbG9jYWwgcHIgPSBtdWwobnNxdWFyZSh4MjUwLCAyKSwgdXY3KQoKICAgIGxvY2FsIHV2MyA9IG11bCh1LCB2MykKICAgIGxvY2FsIGIgPSBtdWwodXYzLCBwcikKICAgIGxvY2FsIGIyID0gc3F1YXJlKGIpCiAgICBsb2NhbCB2YjIgPSBtdWwodiwgYjIpCgogICAgaWYgbm90IGVxKHZiMiwgdSkgdGhlbgogICAgICAgIAogICAgICAgIGIgPSBtdWwoYiwgSSkKICAgICAgICBiMiA9IHNxdWFyZShiKQogICAgICAgIHZiMiA9IG11bCh2LCBiMikKICAgIGVuZAoKICAgIGlmIGVxKHZiMiwgdSkgdGhlbgogICAgICAgIHJldHVybiBiCiAgICBlbHNlCiAgICAgICAgcmV0dXJuIG5pbAogICAgZW5kCmVuZAoKCgoKCgpsb2NhbCBmdW5jdGlvbiBlbmNvZGUoYSkKICAgIGEgPSBjYW5vbmljYWxpemUoYSkKICAgIGxvY2FsIGEwMCwgYTAxLCBhMDIsIGEwMywgYTA0LCBhMDUsIGEwNiwgYTA3LCBhMDgsIGEwOSwgYTEwLCBhMTEgPSB1bnBhY2soYSkKCiAgICBsb2NhbCBieXRlcyA9IHt9CiAgICBsb2NhbCBhY2MgPSBhMDAKCiAgICBsb2NhbCBmdW5jdGlvbiBwdXRCeXRlcyhuKQogICAgICAgIGZvciBfID0gMSwgbiBkbwogICAgICAgICAgICBsb2NhbCBieXRlID0gYWNjICUgMjU2CiAgICAgICAgICAgIGJ5dGVzWyNieXRlcyArIDFdID0gYnl0ZQogICAgICAgICAgICBhY2MgPSAoYWNjIC0gYnl0ZSkgLyAyNTYKICAgICAgICBlbmQKICAgIGVuZAoKICAgIHB1dEJ5dGVzKDIpIGFjYyA9IGFjYyArIGEwMSAvIDIgXiAxNgogICAgcHV0Qnl0ZXMoMykgYWNjID0gYWNjICsgYTAyIC8gMiBeIDQwCiAgICBwdXRCeXRlcygzKSBhY2MgPSBhY2MgKyBhMDMgLyAyIF4gNjQKICAgIHB1dEJ5dGVzKDIpIGFjYyA9IGFjYyArIGEwNCAvIDIgXiA4MAogICAgcHV0Qnl0ZXMoMykgYWNjID0gYWNjICsgYTA1IC8gMiBeIDEwNAogICAgcHV0Qnl0ZXMoMykgYWNjID0gYWNjICsgYTA2IC8gMiBeIDEyOAogICAgcHV0Qnl0ZXMoMikgYWNjID0gYWNjICsgYTA3IC8gMiBeIDE0NAogICAgcHV0Qnl0ZXMoMykgYWNjID0gYWNjICsgYTA4IC8gMiBeIDE2OAogICAgcHV0Qnl0ZXMoMykgYWNjID0gYWNjICsgYTA5IC8gMiBeIDE5MgogICAgcHV0Qnl0ZXMoMikgYWNjID0gYWNjICsgYTEwIC8gMiBeIDIwOAogICAgcHV0Qnl0ZXMoMykgYWNjID0gYWNjICsgYTExIC8gMiBeIDIzMgogICAgcHV0Qnl0ZXMoMykKCiAgICByZXR1cm4gc3RyaW5nLmNoYXIodW5wYWNrKGJ5dGVzKSkgCmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gZGVjb2RlKGIpCiAgICBsb2NhbCB3MDAsIHcwMSwgdzAyLCB3MDMsIHcwNCwgdzA1LCB3MDYsIHcwNywgdzA4LCB3MDksIHcxMCwgdzExID0KICAgICAgICB1ZnAoZm10ZnAsIGIsIDEpCgogICAgdzExID0gdzExICUgMiBeIDE1CgogICAgcmV0dXJuIGNhcnJ5IHsKICAgICAgICB3MDAsCiAgICAgICAgdzAxICogMiBeIDI0LAogICAgICAgIHcwMiAqIDIgXiA0OCwKICAgICAgICB3MDMgKiAyIF4gNjQsCiAgICAgICAgdzA0ICogMiBeIDg4LAogICAgICAgIHcwNSAqIDIgXiAxMTIsCiAgICAgICAgdzA2ICogMiBeIDEyOCwKICAgICAgICB3MDcgKiAyIF4gMTUyLAogICAgICAgIHcwOCAqIDIgXiAxNzYsCiAgICAgICAgdzA5ICogMiBeIDE5MiwKICAgICAgICB3MTAgKiAyIF4gMjE2LAogICAgICAgIHcxMSAqIDIgXiAyNDAsCiAgICB9CmVuZAoKCgoKbG9jYWwgZnVuY3Rpb24gZXF6KGEpCiAgICBsb2NhbCBjID0gY2Fub25pY2FsaXplKGEpCiAgICBsb2NhbCBjMDAsIGMwMSwgYzAyLCBjMDMsIGMwNCwgYzA1LCBjMDYsIGMwNywgYzA4LCBjMDksIGMxMCwgYzExID0gdW5wYWNrKGMpCiAgICByZXR1cm4gYzAwICsgYzAxICsgYzAyICsgYzAzICsgYzA0ICsgYzA1ICsgYzA2ICsgYzA3ICsgYzA4ICsgYzA5ICsgYzEwICsgYzExCiAgICAgICAgPT0gMAplbmQKCnJldHVybiB7CiAgICBudW0gPSBudW0sCiAgICBuZWcgPSBuZWcsCiAgICBhZGQgPSBhZGQsCiAgICBzdWIgPSBzdWIsCiAgICBrbXVsID0ga211bCwKICAgIG11bCA9IG11bCwKICAgIGNhbm9uaWNhbGl6ZSA9IGNhbm9uaWNhbGl6ZSwKICAgIHNxdWFyZSA9IHNxdWFyZSwKICAgIGNhcnJ5ID0gY2FycnksCiAgICBpbnZlcnQgPSBpbnZlcnQsCiAgICBzcXJ0RGl2ID0gc3FydERpdiwKICAgIGVuY29kZSA9IGVuY29kZSwKICAgIGRlY29kZSA9IGRlY29kZSwKICAgIGVxeiA9IGVxeiwKfQo=";
  44.     ["ccryptolib.blake3"] = base64.decode "LS0tIFRoZSBCTEFLRTMgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLgoKbG9jYWwgZXhwZWN0ID0gcmVxdWlyZSAiY2MuZXhwZWN0Ii5leHBlY3QKbG9jYWwgbGFzc2VydCA9IHJlcXVpcmUgImNjcnlwdG9saWIuaW50ZXJuYWwudXRpbCIubGFzc2VydApsb2NhbCBwYWNraW5nID0gcmVxdWlyZSAiY2NyeXB0b2xpYi5pbnRlcm5hbC5wYWNraW5nIgoKbG9jYWwgdW5wYWNrID0gdW5wYWNrIG9yIHRhYmxlLnVucGFjawpsb2NhbCBieG9yID0gYml0MzIuYnhvcgpsb2NhbCByb2wgPSBiaXQzMi5scm90YXRlCmxvY2FsIHAxNng0LCBmbXQxNng0ID0gcGFja2luZy5jb21waWxlUGFjaygiPEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0STRJNEk0IikKbG9jYWwgdTE2eDQgPSBwYWNraW5nLmNvbXBpbGVVbnBhY2soZm10MTZ4NCkKbG9jYWwgdTh4NCwgZm10OHg0ID0gcGFja2luZy5jb21waWxlVW5wYWNrKCI8STRJNEk0STRJNEk0STRJNCIpCgpsb2NhbCBDSFVOS19TVEFSVCA9IDB4MDEKbG9jYWwgQ0hVTktfRU5EID0gMHgwMgpsb2NhbCBQQVJFTlQgPSAweDA0CmxvY2FsIFJPT1QgPSAweDA4CmxvY2FsIEtFWUVEX0hBU0ggPSAweDEwCmxvY2FsIERFUklWRV9LRVlfQ09OVEVYVCA9IDB4MjAKbG9jYWwgREVSSVZFX0tFWV9NQVRFUklBTCA9IDB4NDAKCmxvY2FsIElWID0gewogICAgMHg2YTA5ZTY2NywgMHhiYjY3YWU4NSwgMHgzYzZlZjM3MiwgMHhhNTRmZjUzYSwKICAgIDB4NTEwZTUyN2YsIDB4OWIwNTY4OGMsIDB4MWY4M2Q5YWIsIDB4NWJlMGNkMTksCn0KCmxvY2FsIGZ1bmN0aW9uIGNvbXByZXNzKGgsIG1zZywgdCwgdjE0LCB2MTUsIGZ1bGwpCiAgICBsb2NhbCBoMDAsIGgwMSwgaDAyLCBoMDMsIGgwNCwgaDA1LCBoMDYsIGgwNyA9IHVucGFjayhoKQogICAgbG9jYWwgdjAwLCB2MDEsIHYwMiwgdjAzID0gaDAwLCBoMDEsIGgwMiwgaDAzCiAgICBsb2NhbCB2MDQsIHYwNSwgdjA2LCB2MDcgPSBoMDQsIGgwNSwgaDA2LCBoMDcKICAgIGxvY2FsIHYwOCwgdjA5LCB2MTAsIHYxMSA9IDB4NmEwOWU2NjcsIDB4YmI2N2FlODUsIDB4M2M2ZWYzNzIsIDB4YTU0ZmY1M2EKICAgIGxvY2FsIHYxMiA9IHQgJSAyIF4gMzIKICAgIGxvY2FsIHYxMyA9ICh0IC0gdjEyKSAqIDIgXiAtMzIKCiAgICBsb2NhbCBtMDAsIG0wMSwgbTAyLCBtMDMsIG0wNCwgbTA1LCBtMDYsIG0wNywKICAgICAgICAgIG0wOCwgbTA5LCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0xNCwgbTE1ID0gdW5wYWNrKG1zZykKCiAgICBsb2NhbCB0bXAKICAgIGZvciBpID0gMSwgNyBkbwogICAgICAgIHYwMCA9IHYwMCArIHYwNCArIG0wMCB2MTIgPSByb2woYnhvcih2MTIsIHYwMCksIDE2KQogICAgICAgIHYwOCA9IHYwOCArIHYxMiAgICAgICB2MDQgPSByb2woYnhvcih2MDQsIHYwOCksIDIwKQogICAgICAgIHYwMCA9IHYwMCArIHYwNCArIG0wMSB2MTIgPSByb2woYnhvcih2MTIsIHYwMCksIDI0KQogICAgICAgIHYwOCA9IHYwOCArIHYxMiAgICAgICB2MDQgPSByb2woYnhvcih2MDQsIHYwOCksIDI1KQoKICAgICAgICB2MDEgPSB2MDEgKyB2MDUgKyBtMDIgdjEzID0gcm9sKGJ4b3IodjEzLCB2MDEpLCAxNikKICAgICAgICB2MDkgPSB2MDkgKyB2MTMgICAgICAgdjA1ID0gcm9sKGJ4b3IodjA1LCB2MDkpLCAyMCkKICAgICAgICB2MDEgPSB2MDEgKyB2MDUgKyBtMDMgdjEzID0gcm9sKGJ4b3IodjEzLCB2MDEpLCAyNCkKICAgICAgICB2MDkgPSB2MDkgKyB2MTMgICAgICAgdjA1ID0gcm9sKGJ4b3IodjA1LCB2MDkpLCAyNSkKCiAgICAgICAgdjAyID0gdjAyICsgdjA2ICsgbTA0IHYxNCA9IHJvbChieG9yKHYxNCwgdjAyKSwgMTYpCiAgICAgICAgdjEwID0gdjEwICsgdjE0ICAgICAgIHYwNiA9IHJvbChieG9yKHYwNiwgdjEwKSwgMjApCiAgICAgICAgdjAyID0gdjAyICsgdjA2ICsgbTA1IHYxNCA9IHJvbChieG9yKHYxNCwgdjAyKSwgMjQpCiAgICAgICAgdjEwID0gdjEwICsgdjE0ICAgICAgIHYwNiA9IHJvbChieG9yKHYwNiwgdjEwKSwgMjUpCgogICAgICAgIHYwMyA9IHYwMyArIHYwNyArIG0wNiB2MTUgPSByb2woYnhvcih2MTUsIHYwMyksIDE2KQogICAgICAgIHYxMSA9IHYxMSArIHYxNSAgICAgICB2MDcgPSByb2woYnhvcih2MDcsIHYxMSksIDIwKQogICAgICAgIHYwMyA9IHYwMyArIHYwNyArIG0wNyB2MTUgPSByb2woYnhvcih2MTUsIHYwMyksIDI0KQogICAgICAgIHYxMSA9IHYxMSArIHYxNSAgICAgICB2MDcgPSByb2woYnhvcih2MDcsIHYxMSksIDI1KQoKICAgICAgICB2MDAgPSB2MDAgKyB2MDUgKyBtMDggdjE1ID0gcm9sKGJ4b3IodjE1LCB2MDApLCAxNikKICAgICAgICB2MTAgPSB2MTAgKyB2MTUgICAgICAgdjA1ID0gcm9sKGJ4b3IodjA1LCB2MTApLCAyMCkKICAgICAgICB2MDAgPSB2MDAgKyB2MDUgKyBtMDkgdjE1ID0gcm9sKGJ4b3IodjE1LCB2MDApLCAyNCkKICAgICAgICB2MTAgPSB2MTAgKyB2MTUgICAgICAgdjA1ID0gcm9sKGJ4b3IodjA1LCB2MTApLCAyNSkKCiAgICAgICAgdjAxID0gdjAxICsgdjA2ICsgbTEwIHYxMiA9IHJvbChieG9yKHYxMiwgdjAxKSwgMTYpCiAgICAgICAgdjExID0gdjExICsgdjEyICAgICAgIHYwNiA9IHJvbChieG9yKHYwNiwgdjExKSwgMjApCiAgICAgICAgdjAxID0gdjAxICsgdjA2ICsgbTExIHYxMiA9IHJvbChieG9yKHYxMiwgdjAxKSwgMjQpCiAgICAgICAgdjExID0gdjExICsgdjEyICAgICAgIHYwNiA9IHJvbChieG9yKHYwNiwgdjExKSwgMjUpCgogICAgICAgIHYwMiA9IHYwMiArIHYwNyArIG0xMiB2MTMgPSByb2woYnhvcih2MTMsIHYwMiksIDE2KQogICAgICAgIHYwOCA9IHYwOCArIHYxMyAgICAgICB2MDcgPSByb2woYnhvcih2MDcsIHYwOCksIDIwKQogICAgICAgIHYwMiA9IHYwMiArIHYwNyArIG0xMyB2MTMgPSByb2woYnhvcih2MTMsIHYwMiksIDI0KQogICAgICAgIHYwOCA9IHYwOCArIHYxMyAgICAgICB2MDcgPSByb2woYnhvcih2MDcsIHYwOCksIDI1KQoKICAgICAgICB2MDMgPSB2MDMgKyB2MDQgKyBtMTQgdjE0ID0gcm9sKGJ4b3IodjE0LCB2MDMpLCAxNikKICAgICAgICB2MDkgPSB2MDkgKyB2MTQgICAgICAgdjA0ID0gcm9sKGJ4b3IodjA0LCB2MDkpLCAyMCkKICAgICAgICB2MDMgPSB2MDMgKyB2MDQgKyBtMTUgdjE0ID0gcm9sKGJ4b3IodjE0LCB2MDMpLCAyNCkKICAgICAgICB2MDkgPSB2MDkgKyB2MTQgICAgICAgdjA0ID0gcm9sKGJ4b3IodjA0LCB2MDkpLCAyNSkKCiAgICAgICAgaWYgaSB+PSA3IHRoZW4KICAgICAgICAgICAgdG1wID0gbTAyCiAgICAgICAgICAgIG0wMiA9IG0wMwogICAgICAgICAgICBtMDMgPSBtMTAKICAgICAgICAgICAgbTEwID0gbTEyCiAgICAgICAgICAgIG0xMiA9IG0wOQogICAgICAgICAgICBtMDkgPSBtMTEKICAgICAgICAgICAgbTExID0gbTA1CiAgICAgICAgICAgIG0wNSA9IG0wMAogICAgICAgICAgICBtMDAgPSB0bXAKCiAgICAgICAgICAgIHRtcCA9IG0wNgogICAgICAgICAgICBtMDYgPSBtMDQKICAgICAgICAgICAgbTA0ID0gbTA3CiAgICAgICAgICAgIG0wNyA9IG0xMwogICAgICAgICAgICBtMTMgPSBtMTQKICAgICAgICAgICAgbTE0ID0gbTE1CiAgICAgICAgICAgIG0xNSA9IG0wOAogICAgICAgICAgICBtMDggPSBtMDEKICAgICAgICAgICAgbTAxID0gdG1wCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICBpZiBmdWxsIHRoZW4KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBieG9yKHYwMCwgdjA4KSwgYnhvcih2MDEsIHYwOSksIGJ4b3IodjAyLCB2MTApLCBieG9yKHYwMywgdjExKSwKICAgICAgICAgICAgYnhvcih2MDQsIHYxMiksIGJ4b3IodjA1LCB2MTMpLCBieG9yKHYwNiwgdjE0KSwgYnhvcih2MDcsIHYxNSksCiAgICAgICAgICAgIGJ4b3IodjA4LCBoMDApLCBieG9yKHYwOSwgaDAxKSwgYnhvcih2MTAsIGgwMiksIGJ4b3IodjExLCBoMDMpLAogICAgICAgICAgICBieG9yKHYxMiwgaDA0KSwgYnhvcih2MTMsIGgwNSksIGJ4b3IodjE0LCBoMDYpLCBieG9yKHYxNSwgaDA3KSwKICAgICAgICB9CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgYnhvcih2MDAsIHYwOCksIGJ4b3IodjAxLCB2MDkpLCBieG9yKHYwMiwgdjEwKSwgYnhvcih2MDMsIHYxMSksCiAgICAgICAgICAgIGJ4b3IodjA0LCB2MTIpLCBieG9yKHYwNSwgdjEzKSwgYnhvcih2MDYsIHYxNCksIGJ4b3IodjA3LCB2MTUpLAogICAgICAgIH0KICAgIGVuZAplbmQKCmxvY2FsIGZ1bmN0aW9uIG1lcmdlKGN2bCwgY3ZyKQogICAgZm9yIGkgPSAxLCA4IGRvIGN2bFtpICsgOF0gPSBjdnJbaV0gZW5kCiAgICByZXR1cm4gY3ZsCmVuZAoKbG9jYWwgZnVuY3Rpb24gYmxha2UzKGl2LCBmbGFncywgbXNnLCBsZW4pCiAgICAtLSBTZXQgdXAgdGhlIHN0YXRlLgogICAgbG9jYWwgc3RhdGVDdnMgPSB7fQogICAgbG9jYWwgc3RhdGVDdiA9IGl2CiAgICBsb2NhbCBzdGF0ZVQgPSAwCiAgICBsb2NhbCBzdGF0ZU4gPSAwCiAgICBsb2NhbCBzdGF0ZVN0YXJ0ID0gQ0hVTktfU1RBUlQKICAgIGxvY2FsIHN0YXRlRW5kID0gMAoKICAgIC0tIERpZ2VzdCBjb21wbGV0ZSBibG9ja3MuCiAgICBmb3IgaSA9IDEsICNtc2cgLSA2NCwgNjQgZG8KICAgICAgICAtLSBDb21wcmVzcyB0aGUgYmxvY2suCiAgICAgICAgbG9jYWwgYmxvY2sgPSB7dTE2eDQoZm10MTZ4NCwgbXNnLCBpKX0KICAgICAgICBsb2NhbCBzdGF0ZUZsYWdzID0gZmxhZ3MgKyBzdGF0ZVN0YXJ0ICsgc3RhdGVFbmQKICAgICAgICBzdGF0ZUN2ID0gY29tcHJlc3Moc3RhdGVDdiwgYmxvY2ssIHN0YXRlVCwgNjQsIHN0YXRlRmxhZ3MpCiAgICAgICAgc3RhdGVTdGFydCA9IDAKICAgICAgICBzdGF0ZU4gPSBzdGF0ZU4gKyAxCgogICAgICAgIGlmIHN0YXRlTiA9PSAxNSB0aGVuCiAgICAgICAgICAgIC0tIExhc3QgYmxvY2sgaW4gY2h1bmsuCiAgICAgICAgICAgIHN0YXRlRW5kID0gQ0hVTktfRU5ECiAgICAgICAgZWxzZWlmIHN0YXRlTiA9PSAxNiB0aGVuCiAgICAgICAgICAgIC0tIENodW5rIGNvbXBsZXRlLCBtZXJnZS4KICAgICAgICAgICAgbG9jYWwgbWVyZ2VDdiA9IHN0YXRlQ3YKICAgICAgICAgICAgbG9jYWwgbWVyZ2VBbXQgPSBzdGF0ZVQgKyAxCiAgICAgICAgICAgIHdoaWxlIG1lcmdlQW10ICUgMiA9PSAwIGRvCiAgICAgICAgICAgICAgICBsb2NhbCBibG9jayA9IG1lcmdlKHRhYmxlLnJlbW92ZShzdGF0ZUN2cyksIG1lcmdlQ3YpCiAgICAgICAgICAgICAgICBtZXJnZUN2ID0gY29tcHJlc3MoaXYsIGJsb2NrLCAwLCA2NCwgZmxhZ3MgKyBQQVJFTlQpCiAgICAgICAgICAgICAgICBtZXJnZUFtdCA9IG1lcmdlQW10IC8gMgogICAgICAgICAgICBlbmQKCiAgICAgICAgICAgIC0tIFB1c2ggYmFjay4KICAgICAgICAgICAgdGFibGUuaW5zZXJ0KHN0YXRlQ3ZzLCBtZXJnZUN2KQoKICAgICAgICAgICAgLS0gVXBkYXRlIHN0YXRlIGJhY2sgdG8gbmV4dCBjaHVuay4KICAgICAgICAgICAgc3RhdGVDdiA9IGl2CiAgICAgICAgICAgIHN0YXRlVCA9IHN0YXRlVCArIDEKICAgICAgICAgICAgc3RhdGVOID0gMAogICAgICAgICAgICBzdGF0ZVN0YXJ0ID0gQ0hVTktfU1RBUlQKICAgICAgICAgICAgc3RhdGVFbmQgPSAwCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICAtLSBQYWQgdGhlIGxhc3QgbWVzc2FnZSBibG9jay4KICAgIGxvY2FsIGxhc3RMZW4gPSAjbXNnID09IDAgYW5kIDAgb3IgKCNtc2cgLSAxKSAlIDY0ICsgMQogICAgbG9jYWwgcGFkZGVkID0gbXNnOnN1YigtbGFzdExlbikgLi4gKCJcMCIpOnJlcCg2NCkKICAgIGxvY2FsIGxhc3QgPSB7dTE2eDQoZm10MTZ4NCwgcGFkZGVkLCAxKX0KCiAgICAtLSBQcmVwYXJlIG91dHB1dCBleHBhbnNpb24gc3RhdGUuCiAgICBsb2NhbCBvdXRDdiwgb3V0QmxvY2ssIG91dExlbiwgb3V0RmxhZ3MKICAgIGlmIHN0YXRlVCA+IDAgdGhlbgogICAgICAgIC0tIFJvb3QgaXMgYSBwYXJlbnQsIGRpZ2VzdCBsYXN0IGJsb2NrIG5vdyBhbmQgbWVyZ2UgcGFyZW50cy4KICAgICAgICBsb2NhbCBzdGF0ZUZsYWdzID0gZmxhZ3MgKyBzdGF0ZVN0YXJ0ICsgQ0hVTktfRU5ECiAgICAgICAgbG9jYWwgbWVyZ2VDdiA9IGNvbXByZXNzKHN0YXRlQ3YsIGxhc3QsIHN0YXRlVCwgbGFzdExlbiwgc3RhdGVGbGFncykKICAgICAgICBmb3IgaSA9ICNzdGF0ZUN2cywgMiwgLTEgZG8KICAgICAgICAgICAgbG9jYWwgYmxvY2sgPSBtZXJnZShzdGF0ZUN2c1tpXSwgbWVyZ2VDdikKICAgICAgICAgICAgbWVyZ2VDdiA9IGNvbXByZXNzKGl2LCBibG9jaywgMCwgNjQsIGZsYWdzICsgUEFSRU5UKQogICAgICAgIGVuZAoKICAgICAgICAtLSBTZXQgb3V0cHV0IHN0YXRlLgogICAgICAgIG91dEN2ID0gaXYKICAgICAgICBvdXRCbG9jayA9IG1lcmdlKHN0YXRlQ3ZzWzFdLCBtZXJnZUN2KQogICAgICAgIG91dExlbiA9IDY0CiAgICAgICAgb3V0RmxhZ3MgPSBmbGFncyArIFJPT1QgKyBQQVJFTlQKICAgIGVsc2UKICAgICAgICAtLSBSb290IGJsb2NrIGlzIGluIHRoZSBmaXJzdCBjaHVuaywgc2V0IG91dHB1dCBzdGF0ZS4KICAgICAgICBvdXRDdiA9IHN0YXRlQ3YKICAgICAgICBvdXRCbG9jayA9IGxhc3QKICAgICAgICBvdXRMZW4gPSBsYXN0TGVuCiAgICAgICAgb3V0RmxhZ3MgPSBmbGFncyArIHN0YXRlU3RhcnQgKyBDSFVOS19FTkQgKyBST09UCiAgICBlbmQKCiAgICAtLSBFeHBhbmQgb3V0cHV0LgogICAgbG9jYWwgb3V0ID0ge30KICAgIGZvciBpID0gMCwgbGVuIC8gNjQgZG8KICAgICAgICBsb2NhbCBtZCA9IGNvbXByZXNzKG91dEN2LCBvdXRCbG9jaywgaSwgb3V0TGVuLCBvdXRGbGFncywgdHJ1ZSkKICAgICAgICBvdXRbaSArIDFdID0gcDE2eDQoZm10MTZ4NCwgdW5wYWNrKG1kKSkKICAgIGVuZAoKICAgIHJldHVybiB0YWJsZS5jb25jYXQob3V0KTpzdWIoMSwgbGVuKQplbmQKCi0tLSBIYXNoZXMgZGF0YSB1c2luZyBCTEFLRTMuCi0tLSBAcGFyYW0gbWVzc2FnZSBzdHJpbmcgVGhlIGlucHV0IG1lc3NhZ2UuCi0tLSBAcGFyYW0gbGVuIG51bWJlcj8gVGhlIGRlc2lyZWQgaGFzaCBsZW5ndGgsIGluIGJ5dGVzLiBEZWZhdWx0cyB0byAzMi4KLS0tIEByZXR1cm4gc3RyaW5nIGhhc2ggVGhlIGhhc2guCmxvY2FsIGZ1bmN0aW9uIGRpZ2VzdChtZXNzYWdlLCBsZW4pCiAgICBleHBlY3QoMSwgbWVzc2FnZSwgInN0cmluZyIpCiAgICBsZW4gPSBleHBlY3QoMiwgbGVuLCAibnVtYmVyIiwgIm5pbCIpIG9yIDMyCiAgICBsYXNzZXJ0KGxlbiAlIDEgPT0gMCwgImRlc2lyZWQgb3V0cHV0IGxlbmd0aCBtdXN0IGJlIGFuIGludGVnZXIiLCAyKQogICAgbGFzc2VydChsZW4gPj0gMSwgImRlc2lyZWQgb3V0cHV0IGxlbmd0aCBtdXN0IGJlIHBvc2l0aXZlIiwgMikKICAgIHJldHVybiBibGFrZTMoSVYsIDAsIG1lc3NhZ2UsIGxlbikKZW5kCgotLS0gUGVyZm9ybXMgYSBrZXllZCBoYXNoLgotLS0gQHBhcmFtIGtleSBzdHJpbmcgQSAzMi1ieXRlIHJhbmRvbSBrZXkuCi0tLSBAcGFyYW0gbWVzc2FnZSBzdHJpbmcgVGhlIGlucHV0IG1lc3NhZ2UuCi0tLSBAcGFyYW0gbGVuIG51bWJlcj8gVGhlIGRlc2lyZWQgaGFzaCBsZW5ndGgsIGluIGJ5dGVzLiBEZWZhdWx0cyB0byAzMi4KLS0tIEByZXR1cm4gc3RyaW5nIGhhc2ggVGhlIGtleWVkIGhhc2guCmxvY2FsIGZ1bmN0aW9uIGRpZ2VzdEtleWVkKGtleSwgbWVzc2FnZSwgbGVuKQogICAgZXhwZWN0KDEsIGtleSwgInN0cmluZyIpCiAgICBsYXNzZXJ0KCNrZXkgPT0gMzIsICJrZXkgbGVuZ3RoIG11c3QgYmUgMzIiLCAyKQogICAgZXhwZWN0KDIsIG1lc3NhZ2UsICJzdHJpbmciKQogICAgbGVuID0gZXhwZWN0KDMsIGxlbiwgIm51bWJlciIsICJuaWwiKSBvciAzMgogICAgbGFzc2VydChsZW4gJSAxID09IDAsICJkZXNpcmVkIG91dHB1dCBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyIiwgMikKICAgIGxhc3NlcnQobGVuID49IDEsICJkZXNpcmVkIG91dHB1dCBsZW5ndGggbXVzdCBiZSBwb3NpdGl2ZSIsIDIpCiAgICByZXR1cm4gYmxha2UzKHt1OHg0KGZtdDh4NCwga2V5LCAxKX0sIEtFWUVEX0hBU0gsIG1lc3NhZ2UsIGxlbikKZW5kCgotLS0gTWFrZXMgYSBjb250ZXh0LWJhc2VkIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIChLREYpLgotLS0gQHBhcmFtIGNvbnRleHQgc3RyaW5nIFRoZSBjb250ZXh0IGZvciB0aGUgS0RGLgotLS0gQHJldHVybiBmdW4obWF0ZXJpYWw6IHN0cmluZywgbGVuOiBudW1iZXI/KTogc3RyaW5nIGtkZiBUaGUgS0RGLgpsb2NhbCBmdW5jdGlvbiBkZXJpdmVLZXkoY29udGV4dCkKICAgIGV4cGVjdCgxLCBjb250ZXh0LCAic3RyaW5nIikKICAgIGxvY2FsIGl2ID0ge3U4eDQoZm10OHg0LCBibGFrZTMoSVYsIERFUklWRV9LRVlfQ09OVEVYVCwgY29udGV4dCwgMzIpLCAxKX0KCiAgICAtLS0gRGVyaXZlcyBhIGtleS4KICAgIC0tLSBAcGFyYW0gbWF0ZXJpYWwgc3RyaW5nIFRoZSBrZXlpbmcgbWF0ZXJpYWwuCiAgICAtLS0gQHBhcmFtIGxlbiBudW1iZXI/IFRoZSBkZXNpcmVkIGhhc2ggbGVuZ3RoLCBpbiBieXRlcy4gRGVmYXVsdHMgdG8gMzIuCiAgICByZXR1cm4gZnVuY3Rpb24obWF0ZXJpYWwsIGxlbikKICAgICAgICBleHBlY3QoMSwgbWF0ZXJpYWwsICJzdHJpbmciKQogICAgICAgIGxlbiA9IGV4cGVjdCgyLCBsZW4sICJudW1iZXIiLCAibmlsIikgb3IgMzIKICAgICAgICBsYXNzZXJ0KGxlbiAlIDEgPT0gMCwgImRlc2lyZWQgb3V0cHV0IGxlbmd0aCBtdXN0IGJlIGFuIGludGVnZXIiLCAyKQogICAgICAgIGxhc3NlcnQobGVuID49IDEsICJkZXNpcmVkIG91dHB1dCBsZW5ndGggbXVzdCBiZSBwb3NpdGl2ZSIsIDIpCiAgICAgICAgcmV0dXJuIGJsYWtlMyhpdiwgREVSSVZFX0tFWV9NQVRFUklBTCwgbWF0ZXJpYWwsIGxlbikKICAgIGVuZAplbmQKCnJldHVybiB7CiAgICBkaWdlc3QgPSBkaWdlc3QsCiAgICBkaWdlc3RLZXllZCA9IGRpZ2VzdEtleWVkLAogICAgZGVyaXZlS2V5ID0gZGVyaXZlS2V5LAp9Cg==";
  45.     ["ccryptolib.random"] = base64.decode "bG9jYWwgZXhwZWN0ICAgPSByZXF1aXJlICJjYy5leHBlY3QiLmV4cGVjdApsb2NhbCBibGFrZTMgICA9IHJlcXVpcmUgImNjcnlwdG9saWIuYmxha2UzIgpsb2NhbCBjaGFjaGEyMCA9IHJlcXVpcmUgImNjcnlwdG9saWIuY2hhY2hhMjAiCmxvY2FsIHV0aWwgICAgID0gcmVxdWlyZSAiY2NyeXB0b2xpYi5pbnRlcm5hbC51dGlsIgoKbG9jYWwgbGFzc2VydCA9IHV0aWwubGFzc2VydAoKCmxvY2FsIGN0eCA9IHsKICAgICJjY3J5cHRvbGliIDIwMjMtMDQtMTFUMTk6NDNaIHJhbmRvbS5sdWEgaW5pdGlhbGl6YXRpb24gY29udGV4dCIsCiAgICBvcy5lcG9jaCgidXRjIiksCiAgICBvcy5kYXkoKSwKICAgIG9zLnRpbWUoKSwKICAgIG1hdGgucmFuZG9tKDAsIDIgXiAyNCAtIDEpLAogICAgbWF0aC5yYW5kb20oMCwgMiBeIDI0IC0gMSksCiAgICB0b3N0cmluZyh7fSksCiAgICB0b3N0cmluZyh7fSksCn0KCmxvY2FsIHN0YXRlID0gYmxha2UzLmRpZ2VzdCh0YWJsZS5jb25jYXQoY3R4LCAifCIpKQpsb2NhbCBpbml0aWFsaXplZCA9IGZhbHNlCgoKCmxvY2FsIGZ1bmN0aW9uIGluaXQoc2VlZCkKICAgIGV4cGVjdCgxLCBzZWVkLCAic3RyaW5nIikKICAgIHN0YXRlID0gYmxha2UzLmRpZ2VzdEtleWVkKHN0YXRlLCBzZWVkKQogICAgaW5pdGlhbGl6ZWQgPSB0cnVlCmVuZAoKCgpsb2NhbCBmdW5jdGlvbiBpc0luaXQoKQogICAgcmV0dXJuIGluaXRpYWxpemVkCmVuZAoKCgoKCgoKCgoKCgpsb2NhbCBmdW5jdGlvbiBpbml0V2l0aFRpbWluZygpCiAgICBhc3NlcnQob3MuZXBvY2goInV0YyIpIH49IDApCgogICAgbG9jYWwgZiA9IGFzc2VydChsb2FkKCJsb2NhbCBlPW9zLmVwb2NoIHJldHVybnsiIC4uICgiZSd1dGMnLCIpOnJlcCgyNTYpIC4uICJ9IikpCgogICAgZG8gCiAgICAgICAgbG9jYWwgdCA9IGYoKQogICAgICAgIHdoaWxlIHRbMjU2XSAtIHRbMV0gPiAxIGRvIHQgPSBmKCkgZW5kCiAgICBlbmQKCiAgICAKICAgIGxvY2FsIGJ1ZiA9IHt9CiAgICBmb3IgaSA9IDEsIDUxMiBkbwogICAgICAgIGxvY2FsIHQgPSBmKCkKICAgICAgICB3aGlsZSB0WzI1Nl0gPT0gdFsxXSBkbyB0ID0gZigpIGVuZAogICAgICAgIGZvciBqID0gMSwgMjU2IGRvCiAgICAgICAgICAgIGlmIHRbal0gfj0gdFsxXSB0aGVuCiAgICAgICAgICAgICAgICBidWZbaV0gPSBqIC0gMQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZW5kCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICAKICAgIGxvY2FsIGhpc3QgPSB7fQogICAgZm9yIGkgPSAwLCAyNTUgZG8gaGlzdFtpXSA9IDAgZW5kCiAgICBmb3IgaSA9IDEsICNidWYgZG8gaGlzdFtidWZbaV1dID0gaGlzdFtidWZbaV1dICsgMSBlbmQKICAgIGZvciBpID0gMCwgMjU1IGRvIGFzc2VydChoaXN0W2ldIDwgMjApIGVuZAoKICAgIGluaXQoc3RyaW5nLmNoYXIodGFibGUudW5wYWNrKGJ1ZikpKQplbmQKCgoKbG9jYWwgZnVuY3Rpb24gbWl4KGRhdGEpCiAgICBleHBlY3QoMSwgZGF0YSwgInN0cmluZyIpCiAgICBzdGF0ZSA9IGJsYWtlMy5kaWdlc3RLZXllZChzdGF0ZSwgZGF0YSkKZW5kCgoKCgpsb2NhbCBmdW5jdGlvbiByYW5kb20obGVuKQogICAgZXhwZWN0KDEsIGxlbiwgIm51bWJlciIpCiAgICBsYXNzZXJ0KGluaXRpYWxpemVkLCAiYXR0ZW1wdCB0byB1c2UgYW4gdW5pbml0aWFsaXplZCByYW5kb20gZ2VuZXJhdG9yIiwgMikKICAgIGxvY2FsIG1zZyA9ICgiXDAiKTpyZXAobWF0aC5tYXgobGVuLCAwKSArIDMyKQogICAgbG9jYWwgbm9uY2UgPSAoIlwwIik6cmVwKDEyKQogICAgbG9jYWwgb3V0ID0gY2hhY2hhMjAuY3J5cHQoc3RhdGUsIG5vbmNlLCBtc2csIDgsIDApCiAgICBzdGF0ZSA9IG91dDpzdWIoMSwgMzIpCiAgICByZXR1cm4gb3V0OnN1YigzMykKZW5kCgpyZXR1cm4gewogICAgaW5pdCA9IGluaXQsCiAgICBpc0luaXQgPSBpc0luaXQsCiAgICBpbml0V2l0aFRpbWluZyA9IGluaXRXaXRoVGltaW5nLAogICAgbWl4ID0gbWl4LAogICAgcmFuZG9tID0gcmFuZG9tLAp9Cg==";
  46.     ["psg.spkey"] = base64.decode "bG9jYWwgUFJJVkFURV9LRVlfRklMRSA9ICJob3N0X2tleS50eHQiCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCByYW5kb20gPSByZXF1aXJlICdjY3J5cHRvbGliLnJhbmRvbScKbG9jYWwgZWQyNTUxOSA9IHJlcXVpcmUgJ2NjcnlwdG9saWIuZWQyNTUxOScKbG9jYWwgYmFzZTY0ID0gcmVxdWlyZSAna3Rsby5iYXNlNjQnCmxvY2FsIGtleXJpbmcgPSByZXF1aXJlICdwc2cua2V5cmluZycKCmxvY2FsIHByaXZhdGVLZXksIHB1YmxpY0tleQpkbwoJbG9jYWwgZmlsZSA9IGlvLm9wZW4oUFJJVkFURV9LRVlfRklMRSwgJ3InKQoJaWYgZmlsZSB0aGVuCgkJcHJpdmF0ZUtleSA9IGJhc2U2NC5kZWNvZGUoZmlsZTpyZWFkKCdhJykpCgllbHNlCgkJaWYgbm90IHJhbmRvbS5pc0luaXQoKSB0aGVuCgkJCXJhbmRvbS5pbml0V2l0aFRpbWluZygpCgkJZW5kCgkJcHJpdmF0ZUtleSA9IHJhbmRvbS5yYW5kb20oMzIpCgkJZmlsZSA9IGlvLm9wZW4oUFJJVkFURV9LRVlfRklMRSwgJ3cnKQoJCWlmIG5vdCBmaWxlIHRoZW4KCQkJZXJyb3IoImNhbm5vdCBvcGVuIGZpbGUgJyIuLlBSSVZBVEVfS0VZX0ZJTEUuLiInIGZvciB3cml0ZSBtb2RlIikKCQllbmQKCQlmaWxlOndyaXRlKGJhc2U2NC5lbmNvZGUocHJpdmF0ZUtleSkpCgllbmQKCWZpbGU6Y2xvc2UoKQoJcHVibGljS2V5ID0gZWQyNTUxOS5wdWJsaWNLZXkocHJpdmF0ZUtleSkKZW5kCgpsb2NhbCBwa2V5ID0ge30KCmxvY2FsIHNlc3Npb25zID0ge30KCmxvY2FsIGZ1bmN0aW9uIGNsZWFudXBTZXNzaW9ucygpCglsb2NhbCBwcmV2S2V5ID0gbmlsCglsb2NhbCBrZXksIHZhbHVlID0gbmV4dChzZXNzaW9ucykKCXdoaWxlIGtleSBkbwoJCWlmIG9zLnRpbWUoKSAtIHZhbHVlID4gMTAgdGhlbgoJCQlzZXNzaW9uc1trZXldID0gbmlsCgkJCWtleSA9IHByZXZLZXkKCQllbmQKCQlwcmV2S2V5ID0ga2V5CgkJa2V5LCB2YWx1ZSA9IG5leHQoc2Vzc2lvbnMsIGtleSkKCWVuZAplbmQKCmxvY2FsIHNlcmlhbGl6ZU9wdHMgPSB7IGNvbXBhY3QgPSB0cnVlIH0KCmZ1bmN0aW9uIHBrZXkucHVibGljX2tleSgpCglyZXR1cm4gYmFzZTY0LmVuY29kZShwdWJsaWNLZXkpCmVuZAoKZnVuY3Rpb24gcGtleS5hdXRoX3JlcXVlc3Qobm9uY2UsIHBheWxvYWQpCglhc3NlcnQoI25vbmNlIDw9IDY0KQoJY2xlYW51cFNlc3Npb25zKCkKCWxvY2FsIHNlc3Npb24gPSByYW5kb20ucmFuZG9tKDE2KQoJc2Vzc2lvbnNbc2Vzc2lvbl0gPSBvcy50aW1lKCkKCWxvY2FsIG1lc3NhZ2UgPSB7CgkJbm9uY2UgPSBub25jZTsKCQlzZXNzaW9uID0gYmFzZTY0LmVuY29kZShzZXNzaW9uKTsKCQlwYXlsb2FkID0gcGF5bG9hZDsKCQlrZXkgPSBiYXNlNjQuZW5jb2RlKHB1YmxpY0tleSk7Cgl9Cglsb2NhbCBtZXNzYWdlU3RyaW5nID0gdGV4dHV0aWxzLnNlcmlhbGlzZShtZXNzYWdlLCBzZXJpYWxpemVPcHRzKQoJbG9jYWwgc2lnbmF0dXJlID0gZWQyNTUxOS5zaWduKHByaXZhdGVLZXksIHB1YmxpY0tleSwgbWVzc2FnZVN0cmluZykKCXJldHVybiB7CgkJbWVzc2FnZSA9IG1lc3NhZ2VTdHJpbmc7CgkJc2lnbmF0dXJlID0gYmFzZTY0LmVuY29kZShzaWduYXR1cmUpOwoJfQplbmQKCmZ1bmN0aW9uIHBrZXkuYXV0aF9jb250aW51ZShyZXF1ZXN0KQoJY2xlYW51cFNlc3Npb25zKCkKCWxvY2FsIG1lc3NhZ2VTdHJpbmcgPSByZXF1ZXN0Lm1lc3NhZ2UKCWxvY2FsIG1lc3NhZ2UgPSB0ZXh0dXRpbHMudW5zZXJpYWxpc2UobWVzc2FnZVN0cmluZykKCWlmIG5vdCBtZXNzYWdlIHRoZW4KCQlyZXR1cm4gZmFsc2UsICJpbmNvbnNpc3RlbnQgbWVzc2FnZSIsIG1lc3NhZ2Uua2V5CgllbmQKCWxvY2FsIHNlc3Npb24gPSBiYXNlNjQuZGVjb2RlKG1lc3NhZ2Uuc2Vzc2lvbikKCWlmIG5vdCBzZXNzaW9uc1tzZXNzaW9uXSB0aGVuCgkJcmV0dXJuIGZhbHNlLCAic2Vzc2lvbiBpcyBleHBpcmVkIiwgbWVzc2FnZS5rZXkKCWVuZAoJbG9jYWwga2V5ID0gYmFzZTY0LmRlY29kZShtZXNzYWdlLmtleSkKCWlmIG5vdCBrZXlyaW5nLmtleXNba2V5XSB0aGVuCgkJcmV0dXJuIGZhbHNlLCAiYWNjZXNzIGRlbmllZCIsIG1lc3NhZ2Uua2V5CgllbmQKCWlmIG5vdCBlZDI1NTE5LnZlcmlmeShrZXksIG1lc3NhZ2VTdHJpbmcsIGJhc2U2NC5kZWNvZGUocmVxdWVzdC5zaWduYXR1cmUpKSB0aGVuCgkJcmV0dXJuIGZhbHNlLCAic2lnbmF0dXJlIGlzIG5vdCB2YWxpZCIsIG1lc3NhZ2Uua2V5CgllbmQKCXJldHVybiB0cnVlLCBuaWwsIG1lc3NhZ2Uua2V5CmVuZAoKcmV0dXJuIHBrZXkK";
  47.     ["ktlo.rpc"] = base64.decode "bG9jYWwgam9iID0gcmVxdWlyZSAna3Rsby5qb2InCgpsb2NhbCBycGMgPSB7fQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCBmdW5jdGlvbiBwcmVwYXJlQW5zd2VyKHNlcnZlciwgaWQsIHJlc3VsdCkKCXJldHVybiB7CgkJbWFnaWMgPSAicnBjIjsKCQlzZXJ2ZXIgPSBzZXJ2ZXI7CgkJa2luZCA9ICdyZXNwb25zZSc7CgkJaWQgPSBpZDsKCQlyZXN1bHQgPSByZXN1bHQ7Cgl9CmVuZAoKbG9jYWwgZnVuY3Rpb24gcHJlcGFyZVN1Y2Nlc3Moc2VydmVyLCBpZCwgLi4uKQoJcmV0dXJuIHByZXBhcmVBbnN3ZXIoc2VydmVyLCBpZCwgeyBzdGF0dXMgPSAnc3VjY2VzcycsIHZhbHVlID0gdGFibGUucGFjayguLi4pIH0pCmVuZAoKbG9jYWwgZnVuY3Rpb24gcHJlcGFyZUVycm9yKHNlcnZlciwgaWQsIGVycm9yKQoJcmV0dXJuIHByZXBhcmVBbnN3ZXIoc2VydmVyLCBpZCwgeyBzdGF0dXMgPSAnZmFpbHVyZScsIGVycm9yID0gZXJyb3IgfSkKZW5kCgpsb2NhbCBmdW5jdGlvbiBwcm9jZXNzUmVxdWVzdChjb21tYW5kcywgbWVzc2FnZSwgaG9zdG5hbWUpCglpZiB0eXBlKG1lc3NhZ2UpID09ICd0YWJsZScgYW5kIG1lc3NhZ2UubWFnaWMgPT0gInJwYyIgYW5kIG1lc3NhZ2Uua2luZCA9PSAncmVxdWVzdCcgYW5kIG1lc3NhZ2Uuc2VydmVyID09IGhvc3RuYW1lIHRoZW4KCQlsb2NhbCBtdHlwZSA9IG1lc3NhZ2UudHlwZQoJCWlmIG10eXBlID09ICdoZWxwJyB0aGVuCgkJCWxvY2FsIGhlbHAgPSB7fQoJCQlmb3IgY29tbWFuZCBpbiBwYWlycyhjb21tYW5kcykgZG8KCQkJCWhlbHBbY29tbWFuZF0gPSB7CgkJCQkJaGVscCA9IGNvbW1hbmQuaGVscDsKCQkJCX0KCQkJZW5kCgkJCXJldHVybiBwcmVwYXJlU3VjY2Vzcyhob3N0bmFtZSwgbWVzc2FnZS5pZCwgaGVscCkKCQllbHNlaWYgbXR5cGUgPT0gJ2NhbGwnIHRoZW4KCQkJbG9jYWwgY29tbWFuZCA9IGNvbW1hbmRzW21lc3NhZ2UuY29tbWFuZF0KCQkJaWYgY29tbWFuZCA9PSBuaWwgdGhlbgoJCQkJcmV0dXJuIHByZXBhcmVFcnJvcihob3N0bmFtZSwgbWVzc2FnZS5pZCwgInVua25vd24gcmVtb3RlIHByb2NlZHVyZSAnIi4ubWVzc2FnZS5jb21tYW5kLi4iJyIpCgkJCWVuZAoJCQlsb2NhbCByZXN1bHQgPSB7IHBjYWxsKGNvbW1hbmQucHJvY2VkdXJlLCB0YWJsZS51bnBhY2sobWVzc2FnZS5hcmd1bWVudHMpKSB9CgkJCWlmIHJlc3VsdFsxXSB0aGVuCgkJCQlyZXR1cm4gcHJlcGFyZVN1Y2Nlc3MoaG9zdG5hbWUsIG1lc3NhZ2UuaWQsIHRhYmxlLnVucGFjayhyZXN1bHQsIDIpKQoJCQllbHNlCgkJCQlyZXR1cm4gcHJlcGFyZUVycm9yKGhvc3RuYW1lLCBtZXNzYWdlLmlkLCByZXN1bHRbMl0pCgkJCWVuZAoJCWVsc2UKCQkJcmV0dXJuIHByZXBhcmVFcnJvcihob3N0bmFtZSwgbWVzc2FnZS5pZCwgInVuc3VwcG9ydGVkIHJwYyByZXF1ZXN0IHR5cGUgJyIuLm10eXBlLi4iJyIpCgkJZW5kCgllbmQKZW5kCgpmdW5jdGlvbiBycGMuc2VydmVyKGNvbW1hbmRzLCBoYW5kbGVyLCBob3N0bmFtZSkKCXJldHVybiBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJaGFuZGxlcihmdW5jdGlvbihyZXF1ZXN0KQoJCQkJcmV0dXJuIHByb2Nlc3NSZXF1ZXN0KGNvbW1hbmRzLCByZXF1ZXN0LCBob3N0bmFtZSkKCQkJZW5kKQoJCWVuZAoJZW5kKQplbmQKCmxvY2FsIGRjYWxsID0gcGVyaXBoZXJhbC5jYWxsCgpsb2NhbCBmdW5jdGlvbiBtb2RlbVNlcnZlckhhbmRsZXJUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCwgZikKCWxvY2FsIHNpZGUsIHJjaGFubmVsLCByZXBseUNoYW5uZWwsIHJlcXVlc3QKCXJlcGVhdAoJCXNpZGUsIHJjaGFubmVsLCByZXBseUNoYW5uZWwsIHJlcXVlc3QgPSBzZWxlY3QoMiwgb3MucHVsbEV2ZW50KCJtb2RlbV9tZXNzYWdlIikpCgl1bnRpbCBzaWRlID09IG1vZGVtIGFuZCByY2hhbm5lbCA9PSBjaGFubmVsCglsb2NhbCByZXNwb25zZSA9IGYocmVxdWVzdCkKCWlmIHJlc3BvbnNlIHRoZW4KCQlkY2FsbChtb2RlbSwgJ3RyYW5zbWl0JywgcmVwbHlDaGFubmVsLCBjaGFubmVsLCByZXNwb25zZSkKCWVuZAplbmQKCmxvY2FsIGZ1bmN0aW9uIHdpdGhMaXN0ZW5pbmdDaGFubmVsKG1vZGVtLCBjaGFubmVsLCBhY3Rpb24pCgktLSBpZiBkY2FsbChtb2RlbSwgJ2lzT3BlbicsIGNoYW5uZWwpIHRoZW4KCS0tCSAgIGVycm9yKCJjaGFubmVsICMiLi5jaGFubmVsLi4iaXMgYWxyZWFkeSBvcGVuIiwgMikKCS0tIGVuZAoJZGNhbGwobW9kZW0sICdvcGVuJywgY2hhbm5lbCkKCXJldHVybiBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCWpvYi5ydW5uaW5nKCk6ZmlubmFsaXplKGZ1bmN0aW9uKCkKCQkJZGNhbGwobW9kZW0sICdjbG9zZScsIGNoYW5uZWwpCgkJZW5kKQoJCXJldHVybiBhY3Rpb24oKQoJZW5kKQplbmQKCmZ1bmN0aW9uIHJwYy5zZXJ2ZXJfbmV0d29yayhjb21tYW5kcywgbW9kZW0sIGNoYW5uZWwsIGhvc3RuYW1lKQoJaWYgdHlwZShtb2RlbSkgPT0gJ3RhYmxlJyB0aGVuCgkJbW9kZW0gPSBwZXJpcGhlcmFsLmdldE5hbWUobW9kZW0pCgllbmQKCXJldHVybiB3aXRoTGlzdGVuaW5nQ2hhbm5lbChtb2RlbSwgY2hhbm5lbCwgZnVuY3Rpb24oKQoJCWxvY2FsIHByb2Nlc3MgPSBmdW5jdGlvbihmKSBtb2RlbVNlcnZlckhhbmRsZXJUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCwgZikgZW5kCgkJcnBjLnNlcnZlcihjb21tYW5kcywgcHJvY2VzcywgaG9zdG5hbWUpCgllbmQpCmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBycGMuaXNfcmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpCglyZXR1cm4gdHlwZShyZXNwb25zZSkgPT0gJ3RhYmxlJyBhbmQgcmVzcG9uc2UubWFnaWMgPT0gInJwYyIgYW5kIHJlc3BvbnNlLmlkID09IHJlcXVlc3QuaWQgYW5kIHJlc3BvbnNlLmtpbmQgPT0gJ3Jlc3BvbnNlJyBhbmQgcmVzcG9uc2UucmVzdWx0IC0tIGFuZCByZXNwb25zZS5zZXJ2ZXIgPT0gcmVxdWVzdC5zZXJ2ZXIKZW5kCgpsb2NhbCBmdW5jdGlvbiBleGVjdXRlUmVtb3RlKGNsaWVudCwgbXR5cGUsIGZpbGwsIC4uLikKCWxvY2FsIGlkID0gbWF0aC5yYW5kb20oMTAwMDAwMDAwMDAwKQoJbG9jYWwgcmVxdWVzdCA9IHsKCQltYWdpYyA9ICJycGMiOwoJCXNlcnZlciA9IGNsaWVudC5zZXJ2ZXI7CgkJaWQgPSBpZDsKCQlraW5kID0gJ3JlcXVlc3QnOwoJCXR5cGUgPSBtdHlwZTsKCX0KCWZpbGwocmVxdWVzdCwgLi4uKQoJbG9jYWwgcmVzcG9uc2UgPSBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXJldHVybiBjbGllbnQuZXhjaGFuZ2UocmVxdWVzdCkucmVzdWx0CgllbmQpCglsb2NhbCBvaywgcmVzdWx0ID0gcmVzcG9uc2U6YXdhaXRfdGltZW91dChjbGllbnQudGltZW91dCkKCWlmIG5vdCBvayB0aGVuCgkJZXJyb3IoInRpbWVvdXQiLCAzKQoJZW5kCglpZiByZXN1bHQuc3RhdHVzID09ICdzdWNjZXNzJyB0aGVuCgkJcmV0dXJuIHRhYmxlLnVucGFjayhyZXN1bHQudmFsdWUpCgllbHNlCgkJZXJyb3IoInJwYzogIi4ucmVzdWx0LmVycm9yLCAzKQoJZW5kCmVuZAoKbG9jYWwgZnVuY3Rpb24gZmlsbENhbGwocmVxdWVzdCwgcHJvY2VkdXJlLCAuLi4pCglyZXF1ZXN0LmNvbW1hbmQgPSBwcm9jZWR1cmUKCXJlcXVlc3QuYXJndW1lbnRzID0gdGFibGUucGFjayguLi4pCmVuZAoKbG9jYWwgZnVuY3Rpb24gZXhlY3V0ZVJlbW90ZVByb2NlZHVyZShjbGllbnQsIHByb2NlZHVyZSwgLi4uKQoJcmV0dXJuIGV4ZWN1dGVSZW1vdGUoY2xpZW50LCAnY2FsbCcsIGZpbGxDYWxsLCBwcm9jZWR1cmUsIC4uLikKZW5kCgpsb2NhbCBmdW5jdGlvbiBmaWxsSGVscCgpZW5kCgpsb2NhbCBmdW5jdGlvbiBleGVjdXRlUmVtb3RlSGVscChjbGllbnQpCglyZXR1cm4gZXhlY3V0ZVJlbW90ZShjbGllbnQsICdoZWxwJywgZmlsbEhlbHApCmVuZAoKbG9jYWwgY2xpZW50X21ldGEgPSB7fQoKZnVuY3Rpb24gY2xpZW50X21ldGE6X19pbmRleChrZXkpCglyZXR1cm4gZnVuY3Rpb24oLi4uKQoJCXJldHVybiBleGVjdXRlUmVtb3RlUHJvY2VkdXJlKHJhd2dldChzZWxmLCAnX3N0YXRlJyksIGtleSwgLi4uKQoJZW5kCmVuZAoKZnVuY3Rpb24gY2xpZW50X21ldGE6X19wYWlycygpCglyZXR1cm4gbmV4dCwgZXhlY3V0ZVJlbW90ZUhlbHAocmF3Z2V0KHNlbGYsICdfc3RhdGUnKSksIG5pbAplbmQKCmZ1bmN0aW9uIHJwYy5jbGllbnQoZXhjaGFuZ2UsIHRpbWVvdXQsIGhvc3RuYW1lKQoJbG9jYWwgY2xpZW50ID0gewoJCV9zdGF0ZSA9IHsKCQkJZXhjaGFuZ2UgPSBleGNoYW5nZTsKCQkJdGltZW91dCA9IHRpbWVvdXQ7CgkJCXNlcnZlciA9IGhvc3RuYW1lOwoJCX07Cgl9CglyZXR1cm4gc2V0bWV0YXRhYmxlKGNsaWVudCwgY2xpZW50X21ldGEpCmVuZAoKbG9jYWwgZnVuY3Rpb24gcmFuZG9tQ2hhbm5lbChtb2RlbSkKCXdoaWxlIHRydWUgZG8KCQlsb2NhbCBjaGFubmVsID0gbWF0aC5yYW5kb20oNjU1MzUpCgkJaWYgbm90IGRjYWxsKG1vZGVtLCAnaXNPcGVuJywgY2hhbm5lbCkgdGhlbgoJCQlyZXR1cm4gY2hhbm5lbAoJCWVuZAoJZW5kCmVuZAoKbG9jYWwgZnVuY3Rpb24gZXhjaGFuZ2VOZXR3b3JrVGVtcGxhdGUobW9kZW0sIHNlcnZlckNoYW5uZWwsIHJlcXVlc3QpCglsb2NhbCByZXBseUNoYW5uZWwgPSByYW5kb21DaGFubmVsKG1vZGVtKQoJZGNhbGwobW9kZW0sICdvcGVuJywgcmVwbHlDaGFubmVsKQoJZGNhbGwobW9kZW0sICd0cmFuc21pdCcsIHNlcnZlckNoYW5uZWwsIHJlcGx5Q2hhbm5lbCwgcmVxdWVzdCkKCWpvYi5ydW5uaW5nKCk6ZmlubmFsaXplKGZ1bmN0aW9uKCkKCQlkY2FsbChtb2RlbSwgJ2Nsb3NlJywgcmVwbHlDaGFubmVsKQoJZW5kKQoJbG9jYWwgc2lkZSwgY2hhbm5lbCwgcmVzcG9uc2UKCXJlcGVhdAoJCV8sIHNpZGUsIGNoYW5uZWwsIF8sIHJlc3BvbnNlID0gb3MucHVsbEV2ZW50KCJtb2RlbV9tZXNzYWdlIikKCXVudGlsIHNpZGUgPT0gbW9kZW0gYW5kIGNoYW5uZWwgPT0gcmVwbHlDaGFubmVsIGFuZCBycGMuaXNfcmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpCglyZXR1cm4gcmVzcG9uc2UKZW5kCgpmdW5jdGlvbiBycGMuY2xpZW50X25ldHdvcmsobW9kZW0sIGNoYW5uZWwsIHRpbWVvdXQsIGhvc3RuYW1lKQoJaWYgdHlwZShtb2RlbSkgPT0gJ3RhYmxlJyB0aGVuCgkJbW9kZW0gPSBwZXJpcGhlcmFsLmdldE5hbWUobW9kZW0pCgllbmQKCXJldHVybiBycGMuY2xpZW50KGZ1bmN0aW9uIChyZXF1ZXN0KQoJCXJldHVybiBleGNoYW5nZU5ldHdvcmtUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCwgcmVxdWVzdCkKCWVuZCwgdGltZW91dCwgaG9zdG5hbWUpCmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBycGMuYnJvYWRjYXN0KHB1c2gsIGV2ZW50KQoJbG9jYWwgbWVzc2FnZSA9IHsKCQltYWdpYyA9ICJycGMiOwoJCWtpbmQgPSAnZXZlbnQnOwoJCWlkID0gbWF0aC5yYW5kb20oKTsKCQlkYXRhID0gZXZlbnQ7Cgl9CglwdXNoKG1lc3NhZ2UpCmVuZAoKbG9jYWwgZnVuY3Rpb24gbmV0d29ya0Jyb2FkY2FzdFB1c2hUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCwgbWVzc2FnZSkKCWRjYWxsKG1vZGVtLCAndHJhbnNtaXQnLCBjaGFubmVsLCAwLCBtZXNzYWdlKQplbmQKCmZ1bmN0aW9uIHJwYy5icm9hZGNhc3RfbmV0d29yayhtb2RlbSwgY2hhbm5lbCwgZXZlbnQpCglpZiB0eXBlKG1vZGVtKSA9PSAndGFibGUnIHRoZW4KCQltb2RlbSA9IHBlcmlwaGVyYWwuZ2V0TmFtZShtb2RlbSkKCWVuZAoJcnBjLmJyb2FkY2FzdChmdW5jdGlvbihtZXNzYWdlKQoJCXJldHVybiBuZXR3b3JrQnJvYWRjYXN0UHVzaFRlbXBsYXRlKG1vZGVtLCBjaGFubmVsLCBtZXNzYWdlKQoJZW5kLCBldmVudCkKZW5kCgpmdW5jdGlvbiBycGMuc3Vic2NyaWJlKHB1bGwsIGFjdGlvbikKCXJldHVybiBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJbG9jYWwgbWVzc2FnZSwgbWV0YSA9IHB1bGwoKQoJCQlpZiB0eXBlKG1lc3NhZ2UpID09ICd0YWJsZScgYW5kIG1lc3NhZ2UubWFnaWMgPT0gJ3JwYycgYW5kIG1lc3NhZ2Uua2luZCA9PSAnZXZlbnQnIHRoZW4KCQkJCWpvYi5hc3luYyhmdW5jdGlvbigpIGFjdGlvbihtZXNzYWdlLmRhdGEsIG1ldGEpIGVuZCkKCQkJZW5kCgkJZW5kCgllbmQpCmVuZAoKbG9jYWwgZnVuY3Rpb24gbmV0d29ya1N1YnNjcmliZVB1bGxUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCkKCWxvY2FsIHNpZGUsIHJjaGFubmVsLCBtZXNzYWdlLCBkaXN0YW5jZQoJcmVwZWF0CgkJXywgc2lkZSwgcmNoYW5uZWwsIF8sIG1lc3NhZ2UsIGRpc3RhbmNlID0gb3MucHVsbEV2ZW50KCJtb2RlbV9tZXNzYWdlIikKCXVudGlsIHNpZGUgPT0gbW9kZW0gYW5kIHJjaGFubmVsID09IGNoYW5uZWwKCXJldHVybiBtZXNzYWdlLCB7ZGlzdGFuY2U9ZGlzdGFuY2V9CmVuZAoKZnVuY3Rpb24gcnBjLnN1YnNjcmliZV9uZXR3b3JrKG1vZGVtLCBjaGFubmVsLCBhY3Rpb24pCglpZiB0eXBlKG1vZGVtKSA9PSAndGFibGUnIHRoZW4KCQltb2RlbSA9IHBlcmlwaGVyYWwuZ2V0TmFtZShtb2RlbSkKCWVuZAoJcmV0dXJuIHdpdGhMaXN0ZW5pbmdDaGFubmVsKG1vZGVtLCBjaGFubmVsLCBmdW5jdGlvbigpCgkJcnBjLnN1YnNjcmliZShmdW5jdGlvbigpCgkJCXJldHVybiBuZXR3b3JrU3Vic2NyaWJlUHVsbFRlbXBsYXRlKG1vZGVtLCBjaGFubmVsKQoJCWVuZCwgYWN0aW9uKQoJZW5kKQplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuY3Rpb24gcnBjLnNpbXBsZV9jb21tYW5kcyhjb21tYW5kcykKCWxvY2FsIHJlc3VsdCA9IHt9Cglmb3IgaywgdiBpbiBwYWlycyhjb21tYW5kcykgZG8KCQlyZXN1bHRba10gPSB7IHByb2NlZHVyZSA9IHYgfQoJZW5kCglyZXR1cm4gcmVzdWx0CmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpyZXR1cm4gcnBjCg==";
  48.     ["ktlo.concurrent"] = base64.decode "bG9jYWwgb3MsdGFibGUsbWF0aD1vcyx0YWJsZSxtYXRoO2xvY2FsIGEsYixjLGQ9b3MucHVsbEV2ZW50UmF3LG9zLnN0YXJ0VGltZXIsb3MuY2FuY2VsVGltZXIsb3MuZXBvY2g7bG9jYWwgZSxmLGcsaD10YWJsZS51bnBhY2ssdGFibGUucGFjayx0YWJsZS5yZW1vdmUsdGFibGUuaW5zZXJ0O2xvY2FsIGk9bWF0aC5mbG9vcjtsb2NhbCBzZXRtZXRhdGFibGUsc2VsZWN0LGVycm9yLHR5cGUscGFpcnM9c2V0bWV0YXRhYmxlLHNlbGVjdCxlcnJvcix0eXBlLHBhaXJzO2xvY2FsIGo9cmVxdWlyZSdrdGxvLmNoZWNrJ2xvY2FsIGs9ai5leHBlY3Q7bG9jYWwgZnVuY3Rpb24gbChtLG4pZm9yIG89MSwjbSBkbyBpZiBuPT1tW29ddGhlbiByZXR1cm4gbyBlbmQgZW5kO3JldHVybiBuaWwgZW5kO2xvY2FsIHA9e3dhaXRhYmxlPXRydWV9bG9jYWwgcT17fWxvY2FsIGZ1bmN0aW9uIHIocylrKDEscywnd2FpdGFibGUnKWxvY2FsIHQ9cy5zZWxlY3Rvcjtsb2NhbCB1PXt0LmltbWVkaWF0ZShzKX1pZiB1WzFddGhlbiByZXR1cm4gZSh1LDIpZW5kO2xvY2FsIHY9dC5lbnRlcihzKXJlcGVhdCBsb2NhbCB3PXthKCl9bG9jYWwgeD13WzFdaWYgeD09J3Rlcm1pbmF0ZSd0aGVuIHQubGVhdmUocyx2LGZhbHNlKWVycm9yKCJUZXJtaW5hdGVkIiwwKWVuZCB1bnRpbCB0LmNvbmRpdGlvbihzLHYsdylyZXR1cm4gdC5sZWF2ZShzLHYsdHJ1ZSllbmQ7cS53YWl0PXI7ZnVuY3Rpb24gcS5zZWxlY3QoLi4uKWZvciBvPTEsc2VsZWN0KCcjJywuLi4pZG8gayhvLHNlbGVjdChvLC4uLiksJ3dhaXRhYmxlJyllbmQ7bG9jYWwgeT17Li4ufWxvY2FsIHo9e31sb2NhbCBBPXt9bG9jYWwgQj0jeTtmb3Igbz0xLEIgZG8gbG9jYWwgcz15W29dbG9jYWwgdT17cy5zZWxlY3Rvci5pbW1lZGlhdGUocyl9aWYgdVsxXXRoZW4gcmV0dXJuIHMsZSh1LDIpZW5kIGVuZDtmb3Igbz0xLEIgZG8gbG9jYWwgcz15W29dbG9jYWwgdD1zLnNlbGVjdG9yO3pbb109dDtBW29dPXQuZW50ZXIocyllbmQ7bG9jYWwgQz1uaWw7cmVwZWF0IGxvY2FsIHc9ZihhKCkpbG9jYWwgeD13WzFdaWYgeD09J3Rlcm1pbmF0ZSd0aGVuIGZvciBvPTEsQiBkbyBsb2NhbCBzPXlbb11sb2NhbCB0PXpbb11sb2NhbCB2PUFbb110LmxlYXZlKHMsdixmYWxzZSllbmQ7ZXJyb3IoIlRlcm1pbmF0ZWQiLDApZW5kO2ZvciBvPTEsQiBkbyBsb2NhbCBzPXlbb11sb2NhbCB0PXpbb11sb2NhbCB2PUFbb11pZiB0LmNvbmRpdGlvbihzLHYsdyl0aGVuIEM9bzticmVhayBlbmQgZW5kIHVudGlsIEM7bG9jYWwgRDtmb3Igbz0xLEIgZG8gbG9jYWwgcz15W29dbG9jYWwgdD16W29dbG9jYWwgdj1BW29daWYgbz09QyB0aGVuIEQ9Zih0LmxlYXZlKHMsdix0cnVlKSllbHNlIHQubGVhdmUocyx2LGZhbHNlKWVuZCBlbmQ7cmV0dXJuIHlbQ10sZShEKWVuZDtsb2NhbCBmdW5jdGlvbiBFKClyZXR1cm4gZmFsc2UgZW5kO2xvY2FsIEY9e31sb2NhbCBHPTE7Ri5zZWxlY3Rvcj17aW1tZWRpYXRlPUUsZW50ZXI9ZnVuY3Rpb24oc2VsZilsb2NhbCBIPUc7Rz1HKzE7aChzZWxmLmNvbnN1bWVycyxIKXJldHVybiBIIGVuZCxjb25kaXRpb249ZnVuY3Rpb24oc2VsZixILHcpbG9jYWwgSSxKLEs9dGFibGUudW5wYWNrKHcpcmV0dXJuIEk9PSdub3RpZnlfd2FrZSdhbmQgSj09c2VsZi5pZCBhbmQoSz09SCBvciBub3QgSyllbmQsbGVhdmU9ZnVuY3Rpb24oc2VsZixILEMpaWYgbm90IEMgdGhlbiBsb2NhbCBMPXNlbGYuY29uc3VtZXJzO2xvY2FsIE09bChMLEgpaWYgTSB0aGVuIGcoTCxNKXJldHVybiBmYWxzZSBlbHNlIHJldHVybiB0cnVlIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZH1mdW5jdGlvbiBGOndhaXQoKWsoMSxzZWxmLCdub3RpZnknKXJldHVybiByKHNlbGYpZW5kO2Z1bmN0aW9uIEY6d2FrZSgpaygxLHNlbGYsJ25vdGlmeScpbG9jYWwgTD1zZWxmLmNvbnN1bWVycztsb2NhbCBOPWcoTCwxKWlmIE4gdGhlbiBvcy5xdWV1ZUV2ZW50KCJub3RpZnlfd2FrZSIsc2VsZi5pZCxOKXJldHVybiB0cnVlIGVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7ZnVuY3Rpb24gRjp3YWtlX2FsbCgpaygxLHNlbGYsJ25vdGlmeScpbG9jYWwgTz0jc2VsZi5jb25zdW1lcnM7aWYgTz4wIHRoZW4gc2VsZi5jb25zdW1lcnM9e31vcy5xdWV1ZUV2ZW50KCJub3RpZnlfd2FrZSIsc2VsZi5pZClyZXR1cm4gTyBlbHNlIHJldHVybiAwIGVuZCBlbmQ7bG9jYWwgUD17X19pbmRleD1GLF9fY2xhc3Nlcz1wLF9fbmFtZT0nbm90aWZ5J31sb2NhbCBRPTE7bG9jYWwgZnVuY3Rpb24gUigpbG9jYWwgSj1RO1E9USsxO2xvY2FsIFM9e2lkPUosY291bnQ9MCxjb25zdW1lcnM9e319cmV0dXJuIHNldG1ldGF0YWJsZShTLFApZW5kO3Eubm90aWZ5PVI7bG9jYWwgZnVuY3Rpb24gVChzZWxmKWxvY2FsIFM9c2VsZi5ub3RpZnk7cmV0dXJuIFMuc2VsZWN0b3IuZW50ZXIoUyllbmQ7bG9jYWwgZnVuY3Rpb24gVShzZWxmLFYsdylsb2NhbCBTPXNlbGYubm90aWZ5O3JldHVybiBTLnNlbGVjdG9yLmNvbmRpdGlvbihTLFYsdyllbmQ7bG9jYWwgZnVuY3Rpb24gVyhzZWxmLFYsQylsb2NhbCBTPXNlbGYubm90aWZ5O3JldHVybiBTLnNlbGVjdG9yLmxlYXZlKFMsVixDKWVuZDtsb2NhbCBmdW5jdGlvbiBYKHUsWSlyZXR1cm57aW1tZWRpYXRlPXUsZW50ZXI9VCxjb25kaXRpb249VSxsZWF2ZT1mdW5jdGlvbihzZWxmLHYsQylsb2NhbCBaPVcoc2VsZix2LEMpcmV0dXJuIFkoc2VsZixaLEMpZW5kfWVuZDtsb2NhbCBfPXt9ZnVuY3Rpb24gXzp0cnlfbG9jaygpaygxLHNlbGYsJ2xvY2thYmxlJylyZXR1cm4gc2VsZi5zZWxlY3Rvci5pbW1lZGlhdGUoc2VsZillbmQ7ZnVuY3Rpb24gXzpsb2NrKClrKDEsc2VsZiwnbG9ja2FibGUnKXIoc2VsZillbmQ7ZnVuY3Rpb24gXzp1bmxvY2soKWsoMSxzZWxmLCdsb2NrYWJsZScpZXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpZW5kO2Z1bmN0aW9uIF86d2l0aF9sb2NrKGEwLC4uLilrKDEsc2VsZiwnbG9ja2FibGUnKWsoMixhMCwnZnVuY3Rpb24nKXIoc2VsZilsb2NhbCBEPXtwY2FsbChhMCwuLi4pfXNlbGY6dW5sb2NrKClpZiBEWzFddGhlbiByZXR1cm4gZShELDIpZWxzZSBlcnJvcihEWzJdLDApZW5kIGVuZDtmdW5jdGlvbiBfOndpdGhfdHJ5X2xvY2soYTAsLi4uKWsoMSxzZWxmLCdsb2NrYWJsZScpaygyLGEwLCdmdW5jdGlvbicpbG9jYWwgYTE9c2VsZi5zZWxlY3Rvci5pbW1lZGlhdGUoc2VsZilpZiBhMSB0aGVuIGxvY2FsIEQ9e3BjYWxsKGEwLC4uLil9c2VsZjp1bmxvY2soKWlmIERbMV10aGVuIHJldHVybiB0cnVlLGUoRCwyKWVsc2UgZXJyb3IoRFsyXSwwKWVuZCBlbHNlIHJldHVybiBmYWxzZSBlbmQgZW5kO2Z1bmN0aW9uIF86d3JhcChhMClrKDEsc2VsZiwnbG9ja2FibGUnKWsoMixhMCwnZnVuY3Rpb24nKXJldHVybiBmdW5jdGlvbiguLi4pcmV0dXJuIHNlbGY6d2l0aF9sb2NrKGZ1bmN0aW9uKC4uLilyZXR1cm4gYTAoLi4uKWVuZCwuLi4pZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBhMihzZWxmLFosQylpZiBaIHRoZW4gc2VsZjp1bmxvY2soKWVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYTModSlyZXR1cm4gWCh1LGEyKWVuZDtsb2NhbCBhND17bG9ja2FibGU9dHJ1ZSx3YWl0YWJsZT10cnVlfWxvY2FsIGE1PXt9c2V0bWV0YXRhYmxlKGE1LHtfX2luZGV4PV99KWxvY2FsIGZ1bmN0aW9uIGE2KHNlbGYpaWYgc2VsZi5sb2NrZWQgdGhlbiByZXR1cm4gZmFsc2UgZWxzZSBzZWxmLmxvY2tlZD10cnVlO3JldHVybiB0cnVlIGVuZCBlbmQ7YTUuc2VsZWN0b3I9YTMoYTYpZnVuY3Rpb24gYTU6dW5sb2NrKClrKDEsc2VsZiwnbXV0ZXgnKWlmIG5vdCBzZWxmLmxvY2tlZCB0aGVuIGVycm9yKCJtdXRleCBub3QgbG9ja2VkIiwyKWVuZDtpZiBub3Qgc2VsZi5ub3RpZnk6d2FrZSgpdGhlbiBzZWxmLmxvY2tlZD1mYWxzZSBlbmQgZW5kO2xvY2FsIGE3PXtfX2luZGV4PWE1LF9fY2xhc3Nlcz1hNCxfX25hbWU9J211dGV4J31mdW5jdGlvbiBxLm11dGV4KClsb2NhbCBhOD17bG9ja2VkPWZhbHNlLG5vdGlmeT1SKCl9cmV0dXJuIHNldG1ldGF0YWJsZShhOCxhNyllbmQ7bG9jYWwgYTk9e31sb2NhbCBmdW5jdGlvbiBhYShzZWxmKWlmI3NlbGYucXVldWU+MCB0aGVuIHJldHVybiB0cnVlLGcoc2VsZi5xdWV1ZSwxKWVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYWIoc2VsZixaLEMpaWYgWiB0aGVuIHNlbGYubm90aWZ5Ondha2UoKWVuZDtpZiBDIHRoZW4gcmV0dXJuIGcoc2VsZi5xdWV1ZSwxKWVuZCBlbmQ7YTkuc2VsZWN0b3I9WChhYSxhYilmdW5jdGlvbiBhOTpzZW5kKG0paygxLHNlbGYsJ2NoYW5uZWwnKWgoc2VsZi5xdWV1ZSxtKXNlbGYubm90aWZ5Ondha2UoKWVuZDtmdW5jdGlvbiBhOTp0cnlfcmVjdigpaygxLHNlbGYsJ2NoYW5uZWwnKXJldHVybiBhYShzZWxmKWVuZDtmdW5jdGlvbiBhOTpyZWN2KClrKDEsc2VsZiwnY2hhbm5lbCcpcmV0dXJuIHIoc2VsZillbmQ7bG9jYWwgYWM9e19faW5kZXg9YTksX19jbGFzc2VzPXAsX19uYW1lPSdjaGFubmVsJ31mdW5jdGlvbiBxLmNoYW5uZWwoKWxvY2FsIGFkPXtxdWV1ZT17fSxub3RpZnk9UigpfXJldHVybiBzZXRtZXRhdGFibGUoYWQsYWMpZW5kO2xvY2FsIGFlPXt9bG9jYWwgZnVuY3Rpb24gYWYoc2VsZixaLEMpaWYgQyB0aGVuIHJldHVybiBzZWxmLnZhbHVlIGVuZCBlbmQ7YWUuc2VsZWN0b3I9WChFLGFmKWZ1bmN0aW9uIGFlOnNldChuKWsoMSxzZWxmLCdwcm9wZXJ0eScpaWYgc2VsZi52YWx1ZX49biB0aGVuIHNlbGYudmFsdWU9bjtzZWxmLm5vdGlmeTp3YWtlX2FsbCgpZW5kIGVuZDtmdW5jdGlvbiBhZTpjb2xsZWN0KGFnKWsoMSxzZWxmLCdwcm9wZXJ0eScpYWcoc2VsZi52YWx1ZSl3aGlsZSB0cnVlIGRvIGxvY2FsIG49cihzZWxmKWFnKG4pd2hpbGUgc2VsZi52YWx1ZX49biBkbyBuPXNlbGYudmFsdWU7YWcobillbmQgZW5kIGVuZDtmdW5jdGlvbiBhZTp3YWl0X3VudGlsKGFoKWsoMSxzZWxmLCdwcm9wZXJ0eScpbG9jYWwgbj1zZWxmLnZhbHVlO2lmIGFoKG4pdGhlbiByZXR1cm4gbiBlbmQ7d2hpbGUgdHJ1ZSBkbyBuPXIoc2VsZilpZiBhaChuKXRoZW4gcmV0dXJuIG4gZW5kIGVuZCBlbmQ7bG9jYWwgYWk9e19faW5kZXg9YWUsX19jbGFzc2VzPXAsX19uYW1lPSdwcm9wZXJ0eSd9ZnVuY3Rpb24gcS5wcm9wZXJ0eShhailsb2NhbCBhaz17dmFsdWU9YWosbm90aWZ5PVIoKX1yZXR1cm4gc2V0bWV0YXRhYmxlKGFrLGFpKWVuZDtsb2NhbCBmdW5jdGlvbiBhbChzZWxmKWlmIHNlbGYubG9ja2VkIHRoZW4gcmV0dXJuIGZhbHNlIGVsc2UgbG9jYWwgTz1zZWxmLmNvdW50O2lmIE89PTAgdGhlbiBzZWxmLndyaXRlLmxvY2tlZD10cnVlIGVuZDtzZWxmLmNvdW50PU8rMTtyZXR1cm4gdHJ1ZSBlbmQgZW5kO2xvY2FsIGFtPXt9YW0uc2VsZWN0b3I9YTMoYWwpZnVuY3Rpb24gYW06dW5sb2NrKClrKDEsc2VsZiwncmVhZF9tdXRleCcpbG9jYWwgTz1zZWxmLmNvdW50O2lmIE89PTAgdGhlbiBlcnJvcigibXV0ZXggaXMgbm90IGxvY2tlZCIsMillbmQ7c2VsZi5jb3VudD1PLTE7aWYgTz09MSB0aGVuIGxvY2FsIGFuPXNlbGYud3JpdGU7aWYgYW4ubm90aWZ5Ondha2UoKXRoZW4gc2VsZi5sb2NrZWQ9dHJ1ZSBlbmQgZW5kIGVuZDtzZXRtZXRhdGFibGUoYW0se19faW5kZXg9X30pbG9jYWwgYW89e19faW5kZXg9YW0sX19jbGFzc2VzPWE0LF9fbmFtZT0ncmVhZF9tdXRleCd9bG9jYWwgZnVuY3Rpb24gYXAoc2VsZilpZiBzZWxmLmxvY2tlZCB0aGVuIHJldHVybiBmYWxzZSBlbHNlIGxvY2FsIGFxPXNlbGYucmVhZDthcS5sb2NrZWQ9dHJ1ZTtzZWxmLmxvY2tlZD10cnVlO3JldHVybiB0cnVlIGVuZCBlbmQ7bG9jYWwgYXI9e31hci5zZWxlY3Rvcj1hMyhhcClmdW5jdGlvbiBhcjp1bmxvY2soKWsoMSxzZWxmLCd3cml0ZV9tdXRleCcpbG9jYWwgYXE9c2VsZi5yZWFkO2xvY2FsIE89YXEuY291bnQ7aWYgbm90IHNlbGYubG9ja2VkIG9yIE8+MCB0aGVuIGVycm9yKCJtdXRleCBpcyBub3QgbG9ja2VkIiwyKWVuZDtpZiBzZWxmLm5vdGlmeTp3YWtlKCl0aGVuIHJldHVybiBlbmQ7YXEubG9ja2VkPWZhbHNlO2xvY2FsIGFzPWFxLm5vdGlmeTp3YWtlX2FsbCgpaWYgYXM+MCB0aGVuIGFxLmNvdW50PWFzO3JldHVybiBlbmQ7c2VsZi5sb2NrZWQ9ZmFsc2UgZW5kO2xvY2FsIGF0PXtfX2luZGV4PWFyLF9fY2xhc3Nlcz1hNCxfX25hbWU9J3dyaXRlX211dGV4J31mdW5jdGlvbiBxLnJ3X211dGV4KClsb2NhbCBhcT17Y291bnQ9MCxsb2NrZWQ9ZmFsc2Usbm90aWZ5PVIoKSx3cml0ZT10cnVlfWxvY2FsIGFuPXtsb2NrZWQ9ZmFsc2Usbm90aWZ5PVIoKSxyZWFkPXRydWV9YXEud3JpdGU9YW47YW4ucmVhZD1hcTtzZXRtZXRhdGFibGUoYXEsYW8pc2V0bWV0YXRhYmxlKGFuLGF0KXJldHVybiBhbixhcSBlbmQ7bG9jYWwgZnVuY3Rpb24gYXUoKXJldHVybiBkKCd1dGMnKS8xMDAwIGVuZDtsb2NhbCBhdj17fWF2LnNlbGVjdG9yPXt9ZnVuY3Rpb24gYXYuc2VsZWN0b3IuaW1tZWRpYXRlKHNlbGYpbG9jYWwgYXc9YXUoKWxvY2FsIGF4PXNlbGYubWlsZXN0b25lO2lmIGF3Pj1heCB0aGVuIHNlbGYubWlsZXN0b25lPWF4K3NlbGYucGVyaW9kO3JldHVybiB0cnVlIGVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7ZnVuY3Rpb24gYXYuc2VsZWN0b3IuZW50ZXIoc2VsZilsb2NhbCBheT1zZWxmLm1pbGVzdG9uZS1hdSgpaWYgYXk8MCB0aGVuIGF5PTAgZW5kO3JldHVybiBiKGF5KWVuZDtmdW5jdGlvbiBhdi5zZWxlY3Rvci5jb25kaXRpb24oc2VsZixheix3KXJldHVybiB3WzFdPT0ndGltZXInYW5kIHdbMl09PWF6IGVuZDtmdW5jdGlvbiBhdi5zZWxlY3Rvci5sZWF2ZShzZWxmLGF6LEMpaWYgbm90IEMgdGhlbiBjKGF6KWVsc2Ugc2VsZi5taWxlc3RvbmU9c2VsZi5taWxlc3RvbmUrc2VsZi5wZXJpb2QgZW5kIGVuZDtmdW5jdGlvbiBhdjpzbGVlcCgpaygxLHNlbGYsJ3RpbWVyJylyZXR1cm4gcihzZWxmKWVuZDtmdW5jdGlvbiBhdjpza2lwX21pc3NlZCgpaygxLHNlbGYsJ3RpbWVyJylsb2NhbCBhdz1hdSgpbG9jYWwgYXg9c2VsZi5taWxlc3RvbmU7aWYgYXc8YXggdGhlbiByZXR1cm4gMCBlbmQ7bG9jYWwgYUE9c2VsZi5wZXJpb2Q7bG9jYWwgYUI9aSgoYXctYXgpL2FBKSsxO3NlbGYubWlsZXN0b25lPWF4K2FCKmFBO3JldHVybiBhQiBlbmQ7bG9jYWwgYUM9e19faW5kZXg9YXYsX19jbGFzc2VzPXAsX19uYW1lPSd0aW1lcid9ZnVuY3Rpb24gcS50aW1lcihhQSxhRClrKDEsYUEsJ251bWJlcicpaygyLGFELCdudW1iZXInLCduaWwnKWlmIG5vdCBhRCB0aGVuIGFEPWF1KCkrYUEgZW5kO2xvY2FsIGF6PXttaWxlc3RvbmU9YUQscGVyaW9kPWFBfXJldHVybiBzZXRtZXRhdGFibGUoYXosYUMpZW5kO2xvY2FsIGFFPXt9YUUuc2VsZWN0b3I9e31hRS5zZWxlY3Rvci5pbW1lZGlhdGU9RTtmdW5jdGlvbiBhRS5zZWxlY3Rvci5lbnRlcihzZWxmKXJldHVybiBiKHNlbGYuZGVsYXkpZW5kO2Z1bmN0aW9uIGFFLnNlbGVjdG9yLmNvbmRpdGlvbihzZWxmLGF6LHcpcmV0dXJuIHdbMV09PSd0aW1lcidhbmQgd1syXT09YXogZW5kO2Z1bmN0aW9uIGFFLnNlbGVjdG9yLmxlYXZlKHNlbGYsYXosQylpZiBub3QgQyB0aGVuIGMoYXopZW5kIGVuZDtsb2NhbCBhRj17X19pbmRleD1hRSxfX2NsYXNzZXM9cCxfX25hbWU9J3RpbWVvdXQnfWZ1bmN0aW9uIHEudGltZW91dChhRylrKDEsYUcsJ251bWJlcicpbG9jYWwgYUg9e2RlbGF5PWFHfXJldHVybiBzZXRtZXRhdGFibGUoYUgsYUYpZW5kO2xvY2FsIGFJPXt9YUkuc2VsZWN0b3I9e31hSS5zZWxlY3Rvci5pbW1lZGlhdGU9RTtmdW5jdGlvbiBhSS5zZWxlY3Rvci5lbnRlcigpcmV0dXJue31lbmQ7ZnVuY3Rpb24gYUkuc2VsZWN0b3IuY29uZGl0aW9uKHNlbGYsdix3KWxvY2FsIGFKPXNlbGYuZmlsdGVyKHcpaWYgYUogdGhlbiBmb3Igbz0xLCN3IGRvIHZbb109d1tvXWVuZCBlbmQ7cmV0dXJuIGFKIGVuZDtmdW5jdGlvbiBhSS5zZWxlY3Rvci5sZWF2ZShzZWxmLHYsQylpZiBDIHRoZW4gcmV0dXJuIHYgZW5kIGVuZDtmdW5jdGlvbiBhSTpsaXN0ZW4oKWsoMSxzZWxmLCdldmVudCcpcmV0dXJuIGUocihzZWxmKSllbmQ7bG9jYWwgYUs9e19faW5kZXg9YUksX19jbGFzc2VzPXAsX19uYW1lPSdldmVudCd9ZnVuY3Rpb24gcS5ldmVudChhTClrKDEsYUwsJ2Z1bmN0aW9uJywnc3RyaW5nJywndGFibGUnKWlmIHR5cGUoYUw9PSdzdHJpbmcnKXRoZW4gbG9jYWwgYU09YUw7YUw9ZnVuY3Rpb24odylyZXR1cm4gd1sxXT09YU0gZW5kIGVsc2VpZiB0eXBlKGFMKT09J3RhYmxlJ3RoZW4gbG9jYWwgYU49YUw7YUw9ZnVuY3Rpb24odylmb3IgYU8sbiBpbiBwYWlycyhhTilkbyBpZiB3W2FPXX49biB0aGVuIHJldHVybiBmYWxzZSBlbmQgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQ7bG9jYWwgdz17ZmlsdGVyPWFMfXJldHVybiBzZXRtZXRhdGFibGUodyxhSyllbmQ7bG9jYWwgYVA9e31sb2NhbCBmdW5jdGlvbiBhUShzZWxmKWxvY2FsIGFSPXNlbGYuYXF1aXJlZDtsb2NhbCBPPXNlbGYuY291bnQ7aWYgYVI8TyB0aGVuIGFSPWFSKzE7c2VsZi5hcXVpcmVkPWFSO2lmIGFSPT1PIHRoZW4gc2VsZi5sb2NrZWQ9dHJ1ZSBlbmQ7cmV0dXJuIHRydWUgZWxzZSByZXR1cm4gZmFsc2UgZW5kIGVuZDthUC5zZWxlY3Rvcj1hMyhhUSlmdW5jdGlvbiBhUDp1bmxvY2soKWsoMSxzZWxmLCdzZW1hcGhvcmUnKWxvY2FsIGFSPXNlbGYuYXF1aXJlZDtpZiBhUj09MCB0aGVuIGVycm9yKCJzZW1hcGhvcmUgaXMgbm90IGxvY2tlZCIsMillbmQ7aWYgbm90IHNlbGYubm90aWZ5Ondha2UoKXRoZW4gc2VsZi5hcXVpcmVkPWFSLTE7c2VsZi5sb2NrZWQ9ZmFsc2UgZW5kIGVuZDtzZXRtZXRhdGFibGUoYVAse19faW5kZXg9X30pbG9jYWwgYVM9e19faW5kZXg9YVAsX19jbGFzc2VzPWE0LF9fbmFtZT0nc2VtYXBob3JlJ31mdW5jdGlvbiBxLnNlbWFwaG9yZShPKWsoMSxPLCdudW1iZXInKWxvY2FsIGFUPXtjb3VudD1pKE8pLGFxdWlyZWQ9MCxsb2NrZWQ9ZmFsc2Usbm90aWZ5PVIoKX1yZXR1cm4gc2V0bWV0YXRhYmxlKGFULGFTKWVuZDtsb2NhbCBhVT17fWxvY2FsIGZ1bmN0aW9uIGFWKHNlbGYpaWYgc2VsZi5jb21wbGV0ZWQgdGhlbiByZXR1cm4gdHJ1ZSxzZWxmLnZhbHVlIGVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYVcoc2VsZixaLEMpaWYgQyB0aGVuIHJldHVybiBzZWxmLnZhbHVlIGVuZCBlbmQ7YVUuc2VsZWN0b3I9WChhVixhVylmdW5jdGlvbiBhVTpnZXQoKWsoMSxzZWxmLCdmdXR1cmUnKXJldHVybiByKHNlbGYpZW5kO2Z1bmN0aW9uIGFVOmNvbXBsZXRlKG4paygxLHNlbGYsJ2Z1dHVyZScpaWYgc2VsZi5jb21wbGV0ZWQgdGhlbiBlcnJvcigiZnV0dXJlIGlzIGFscmVhZHkgY29tcGxldGVkIiwyKWVuZDtzZWxmLmNvbXBsZXRlZD10cnVlO3NlbGYudmFsdWU9bjtzZWxmLm5vdGlmeTp3YWtlX2FsbCgpZW5kO2xvY2FsIGFYPXtfX2luZGV4PWFVLF9fY2xhc3Nlcz1wLF9fbmFtZT0nZnV0dXJlJ31mdW5jdGlvbiBxLmZ1dHVyZSgpbG9jYWwgYVk9e2NvbXBsZXRlZD1mYWxzZSx2YWx1ZT1mYWxzZSxub3RpZnk9cS5ub3RpZnkoKX1yZXR1cm4gc2V0bWV0YXRhYmxlKGFZLGFYKWVuZDtyZXR1cm4gcQo=";
  49.     ["psg.filter"] = base64.decode "bG9jYWwgQUxMT1dMSVNUX0ZJTEUgPSAiYWxsb3dsaXN0LnR4dCIKbG9jYWwgREVOWUxJU1RfRklMRSA9ICJkZW55bGlzdC50eHQiCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbG9jYWwgc3RhcmdhdGUgPSBwZXJpcGhlcmFsLmZpbmQgJ2FkdmFuY2VkX2NyeXN0YWxfaW50ZXJmYWNlJwoKbG9jYWwgZnVuY3Rpb24gQUREUkVTU19QQVRURVJOKG4pCglyZXR1cm4gIl4lLSIuLigiKCVkKyktIik6cmVwKG4pLi4iJCIKZW5kCmxvY2FsIFNZTUJPTDdfUEFUVEVSTiA9IEFERFJFU1NfUEFUVEVSTig2KQpsb2NhbCBTWU1CT0w4X1BBVFRFUk4gPSBBRERSRVNTX1BBVFRFUk4oNykKbG9jYWwgU1lNQk9MOV9QQVRURVJOID0gQUREUkVTU19QQVRURVJOKDgpCgpsb2NhbCBmdW5jdGlvbiBwYXJzZUFkZHJlc3NQYXJ0cyhhZGRyZXNzKQoJbG9jYWwgc3ltYm9sNyA9IHsgYWRkcmVzczptYXRjaChTWU1CT0w3X1BBVFRFUk4pIH0KCWlmIG5leHQoc3ltYm9sNykgdGhlbgoJCXJldHVybiBzeW1ib2w3CgllbmQKCWxvY2FsIHN5bWJvbDggPSB7IGFkZHJlc3M6bWF0Y2goU1lNQk9MOF9QQVRURVJOKSB9CglpZiBuZXh0KHN5bWJvbDgpIHRoZW4KCQlyZXR1cm4gc3ltYm9sOAoJZW5kCglsb2NhbCBzeW1ib2w5ID0geyBhZGRyZXNzOm1hdGNoKFNZTUJPTDlfUEFUVEVSTikgfQoJaWYgbmV4dChzeW1ib2w5KSB0aGVuCgkJcmV0dXJuIHN5bWJvbDkKCWVuZAoJcmV0dXJuIG5pbAplbmQKCmxvY2FsIGZ1bmN0aW9uIHBhcnNlQWRkcmVzcyhhZGRyZXNzKQoJbG9jYWwgcGFydHMgPSBwYXJzZUFkZHJlc3NQYXJ0cyhhZGRyZXNzKQoJaWYgbm90IHBhcnRzIHRoZW4KCQlyZXR1cm4gbmlsCgllbmQKCWZvciBpIGluIGlwYWlycyhwYXJ0cykgZG8KCQlwYXJ0c1tpXSA9IHRvbnVtYmVyKHBhcnRzW2ldKQoJZW5kCglyZXR1cm4gcGFydHMKZW5kCgpsb2NhbCBmdW5jdGlvbiBsb2FkQWRkcmVzc2VzKGZpbGVuYW1lKQoJbG9jYWwgcmVzdWx0ID0ge30KCWxvY2FsIGZpbGUgPSBpby5vcGVuKGZpbGVuYW1lLCAncicpCglpZiBmaWxlIHRoZW4KCQlmb3IgbGluZSBpbiBmaWxlOmxpbmVzICdsJyBkbwoJCQlsb2NhbCBhZGRyZXNzID0gcGFyc2VBZGRyZXNzKGxpbmUpCgkJCWlmIGFkZHJlc3MgdGhlbgoJCQkJcmVzdWx0W2xpbmVdID0gYWRkcmVzcwoJCQllbmQKCQllbmQKCWVuZAoJcmV0dXJuIHJlc3VsdAplbmQKCmxvY2FsIGFsbG93bGlzdCA9IGxvYWRBZGRyZXNzZXMoQUxMT1dMSVNUX0ZJTEUpCmxvY2FsIGRlbnlsaXN0ID0gbG9hZEFkZHJlc3NlcyhERU5ZTElTVF9GSUxFKQoKbG9jYWwgZmlsdGVyID0ge30KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCBmdW5jdGlvbiBhZGRyZXNzVG9TdHJpbmcoYWRkcmVzcykKCXJldHVybiAnLScuLnRhYmxlLmNvbmNhdChhZGRyZXNzLCAnLScpLi4nLScKZW5kCgpsb2NhbCBmdW5jdGlvbiBsaXN0QWRkKGxpc3QsIG1ldGhvZCwgZmlsZW5hbWUsIGFkZHJlc3MpCglsb2NhbCBzdHIgPSBhZGRyZXNzVG9TdHJpbmcoYWRkcmVzcykKCWlmIGxpc3Rbc3RyXSB0aGVuCgkJcmV0dXJuIGZhbHNlCgllbmQKCW1ldGhvZChhZGRyZXNzLCBmYWxzZSkKCWxpc3Rbc3RyXSA9IGFkZHJlc3MKCWxvY2FsIGZpbGUgPSBhc3NlcnQoaW8ub3BlbihmaWxlbmFtZSwgJ2EnKSkKCWZpbGU6d3JpdGUoc3RyKQoJZmlsZTp3cml0ZSgnXG4nKQoJZmlsZTpjbG9zZSgpCglyZXR1cm4gdHJ1ZQplbmQKCmZ1bmN0aW9uIGZpbHRlci5hbGxvd2xpc3RfYWRkKGFkZHJlc3MpCglyZXR1cm4gbGlzdEFkZChhbGxvd2xpc3QsIHN0YXJnYXRlLmFkZFRvV2hpdGVsaXN0LCBBTExPV0xJU1RfRklMRSwgYWRkcmVzcykKZW5kCgpmdW5jdGlvbiBmaWx0ZXIuZGVueWxpc3RfYWRkKGFkZHJlc3MpCglyZXR1cm4gbGlzdEFkZChkZW55bGlzdCwgc3RhcmdhdGUuYWRkVG9CbGFja2xpc3QsIERFTllMSVNUX0ZJTEUsIGFkZHJlc3MpCmVuZAoKbG9jYWwgZnVuY3Rpb24gbGlzdERlbChsaXN0LCBtZXRob2QsIGZpbGVuYW1lLCBhZGRyZXNzKQoJbG9jYWwgc3RyID0gYWRkcmVzc1RvU3RyaW5nKGFkZHJlc3MpCglpZiBub3QgbGlzdFtzdHJdIHRoZW4KCQlyZXR1cm4gZmFsc2UKCWVuZAoJbWV0aG9kKGFkZHJlc3MpCglsaXN0W3N0cl0gPSBuaWwKCWxvY2FsIGZpbGUgPSBhc3NlcnQoaW8ub3BlbihmaWxlbmFtZSwgJ3cnKSkKCWZvciBpdGVtIGluIHBhaXJzKGxpc3QpIGRvCgkJZmlsZTp3cml0ZShpdGVtKQoJCWZpbGU6d3JpdGUoJ1xuJykKCWVuZAoJZmlsZTpjbG9zZSgpCglyZXR1cm4gdHJ1ZQplbmQKCmZ1bmN0aW9uIGZpbHRlci5hbGxvd2xpc3RfZGVsKGFkZHJlc3MpCglyZXR1cm4gbGlzdERlbChhbGxvd2xpc3QsIHN0YXJnYXRlLnJlbW92ZUZyb21XaGl0ZWxpc3QsIEFMTE9XTElTVF9GSUxFLCBhZGRyZXNzKQplbmQKCmZ1bmN0aW9uIGZpbHRlci5kZW55bGlzdF9kZWwoYWRkcmVzcykKCXJldHVybiBsaXN0RGVsKGRlbnlsaXN0LCBzdGFyZ2F0ZS5yZW1vdmVGcm9tQmxhY2tsaXN0LCBERU5ZTElTVF9GSUxFLCBhZGRyZXNzKQplbmQKCmxvY2FsIGZ1bmN0aW9uIGxpc3RTeW5jaChsaXN0LCBjbGVhck1ldGhvZCwgYWRkTWV0aG9kKQoJY2xlYXJNZXRob2QoKQoJZm9yIF8sIGFkZHJlc3MgaW4gcGFpcnMobGlzdCkgZG8KCQlhZGRNZXRob2QoYWRkcmVzcywgZmFsc2UpCgllbmQKZW5kCgpmdW5jdGlvbiBmaWx0ZXIuYWxsb3dsaXN0X3N5bmNoKCkKCWxpc3RTeW5jaChhbGxvd2xpc3QsIHN0YXJnYXRlLmNsZWFyV2hpdGVsaXN0LCBzdGFyZ2F0ZS5hZGRUb1doaXRlbGlzdCkKZW5kCgpmdW5jdGlvbiBmaWx0ZXIuZGVueWxpc3Rfc3luY2goKQoJbGlzdFN5bmNoKGRlbnlsaXN0LCBzdGFyZ2F0ZS5jbGVhckJsYWNrbGlzdCwgc3RhcmdhdGUuYWRkVG9CbGFja2xpc3QpCmVuZAoKbG9jYWwgZnVuY3Rpb24gbGlzdEdldGFsbChsaXN0KQoJbG9jYWwgcmVzdWx0ID0ge30KCWZvciBfLCBhZGRyZXNzIGluIHBhaXJzKGxpc3QpIGRvCgkJdGFibGUuaW5zZXJ0KHJlc3VsdCwgYWRkcmVzcykKCWVuZAoJcmV0dXJuIHJlc3VsdAplbmQKCmZ1bmN0aW9uIGZpbHRlci5hbGxvd2xpc3RfZ2V0YWxsKCkKCXJldHVybiBsaXN0R2V0YWxsKGFsbG93bGlzdCkKZW5kCgpmdW5jdGlvbiBmaWx0ZXIuZGVueWxpc3RfZ2V0YWxsKCkKCXJldHVybiBsaXN0R2V0YWxsKGRlbnlsaXN0KQplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpyZXR1cm4gZmlsdGVyCg==";
  50.     ["psg.keyring"] = base64.decode "CmxvY2FsIEFVVEhPUklaRURfS0VZU19GSUxFID0gImtleXJpbmcudHh0IgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbG9jYWwgYmFzZTY0ID0gcmVxdWlyZSAna3Rsby5iYXNlNjQnCgpsb2NhbCBmdW5jdGlvbiByZWFkX2tleShsaW5lKQoJbG9jYWwga2V5LCBuYW1lID0gbGluZTptYXRjaCAiXihbJXcrPS9dKyklcysoLispJCIKCWlmIGtleSB0aGVuCgkJcmV0dXJuIGtleSwgbmFtZQoJZWxzZQoJCXJldHVybiBsaW5lCgllbmQKZW5kCgpsb2NhbCBhdXRob3JpemVkS2V5cyA9IHt9CmRvCglsb2NhbCBmaWxlID0gaW8ub3BlbihBVVRIT1JJWkVEX0tFWVNfRklMRSwgJ3InKQoJaWYgZmlsZSB0aGVuCgkJZm9yIGxpbmUgaW4gZmlsZTpsaW5lcygnbCcpIGRvCgkJCWxvY2FsIGtleSwgbmFtZSA9IHJlYWRfa2V5KGxpbmUpCgkJCWF1dGhvcml6ZWRLZXlzW2Jhc2U2NC5kZWNvZGUoa2V5KV0gPSB7a2V5PWtleSwgbmFtZT1uYW1lfQoJCWVuZAoJCWZpbGU6Y2xvc2UoKQoJZW5kCmVuZAoKbG9jYWwga2V5cmluZyA9IHsKCWtleXMgPSBhdXRob3JpemVkS2V5czsKfQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmtleXJpbmcucmVhZF9rZXkgPSByZWFkX2tleQoKZnVuY3Rpb24ga2V5cmluZy5nZXRfYWxsKCkKCWxvY2FsIHJlc3VsdCA9IHt9Cglmb3IgXywga2V5IGluIHBhaXJzKGF1dGhvcml6ZWRLZXlzKSBkbwoJCXRhYmxlLmluc2VydChyZXN1bHQsIGtleSkKCWVuZAoJcmV0dXJuIHJlc3VsdAplbmQKCmxvY2FsIGZ1bmN0aW9uIHdyaXRlX2tleShmaWxlLCBrZXlpbmZvKQoJZmlsZTp3cml0ZShrZXlpbmZvLmtleSkKCWxvY2FsIG5hbWUgPSBrZXlpbmZvLm5hbWUKCWlmIG5hbWUgdGhlbgoJCWZpbGU6d3JpdGUoJyAnKQoJCWZpbGU6d3JpdGUobmFtZSkKCWVuZAoJZmlsZTp3cml0ZSgnXG4nKQplbmQKCmxvY2FsIGZ1bmN0aW9uIHNhdmVfa2V5cygpCglsb2NhbCBmaWxlID0gaW8ub3BlbihBVVRIT1JJWkVEX0tFWVNfRklMRSwgJ3cnKQoJaWYgbm90IGZpbGUgdGhlbgoJCWVycm9yKCJmaWxlICciLi5BVVRIT1JJWkVEX0tFWVNfRklMRS4uIicgY2Fubm90IGJlIG9wZW5lZCBmb3Igd3JpdGluZyIpCgllbmQKCWZvciBfLCBrZXlpbmZvIGluIHBhaXJzKGF1dGhvcml6ZWRLZXlzKSBkbwoJCXdyaXRlX2tleShmaWxlLCBrZXlpbmZvKQoJZW5kCglmaWxlOmNsb3NlKCkKZW5kCgpmdW5jdGlvbiBrZXlyaW5nLmV4aXN0cyhrZXkpCglsb2NhbCBkZWNvZGVkID0gYmFzZTY0LmRlY29kZShrZXkpCglyZXR1cm4gYXV0aG9yaXplZEtleXNbZGVjb2RlZF0KZW5kCgpmdW5jdGlvbiBrZXlyaW5nLnRydXN0KGtleSwgbmFtZSkKCWxvY2FsIGRlY29kZWQgPSBiYXNlNjQuZGVjb2RlKGtleSkKCWxvY2FsIG9sZCA9IGF1dGhvcml6ZWRLZXlzW2RlY29kZWRdCglpZiBvbGQgdGhlbgoJCWlmIG9sZC5uYW1lIH49IG5hbWUgdGhlbgoJCQlvbGQubmFtZSA9IG5hbWUKCQllbmQKCQlzYXZlX2tleXMoKQoJCXJldHVybiBmYWxzZQoJZW5kCglhdXRob3JpemVkS2V5c1tkZWNvZGVkXSA9IHsga2V5PWtleSwgbmFtZT1uYW1lIH0KCXNhdmVfa2V5cygpCglyZXR1cm4gdHJ1ZQplbmQKCmZ1bmN0aW9uIGtleXJpbmcuZm9yZ2V0KGtleSkKCWtleSA9IGJhc2U2NC5kZWNvZGUoa2V5KQoJaWYgbm90IGF1dGhvcml6ZWRLZXlzW2tleV0gdGhlbgoJCXJldHVybiBmYWxzZQoJZW5kCglhdXRob3JpemVkS2V5c1trZXldID0gbmlsCglzYXZlX2tleXMoKQoJcmV0dXJuIHRydWUKZW5kCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKcmV0dXJuIGtleXJpbmcK";
  51.     ["ktlo.job"] = base64.decode "bG9jYWwgY29uY3VycmVudCA9IHJlcXVpcmUgJ2t0bG8uY29uY3VycmVudCcKbG9jYWwgdGFzayA9IHJlcXVpcmUgJ2t0bG8udGFzaycKCmxvY2FsIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgZW5kaW5nKQoJcmV0dXJuIHN0cjpzdWIoLSNlbmRpbmcpID09IGVuZGluZwplbmQKCmxvY2FsIGZ1bmN0aW9uIGlzX3Rlcm1pbmF0ZWQoc3RyKQoJcmV0dXJuIGVuZHNXaXRoKHN0ciwgIlRlcm1pbmF0ZWQiKQplbmQKCmxvY2FsIGxpYnJhcnkgPSB7fQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbG9jYWwgam9iX21ldGhvZHMgPSB7fQoKam9iX21ldGhvZHMuc2VsZWN0b3IgPSB7fQoKZnVuY3Rpb24gam9iX21ldGhvZHMuc2VsZWN0b3IuaW1tZWRpYXRlKHNlbGYpCglsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQoJcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5pbW1lZGlhdGUoZnV0dXJlKQplbmQKCmZ1bmN0aW9uIGpvYl9tZXRob2RzLnNlbGVjdG9yLmVudGVyKHNlbGYpCglsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQoJcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5lbnRlcihmdXR1cmUpCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHMuc2VsZWN0b3IuY29uZGl0aW9uKHNlbGYsIGNvbnRleHQsIGV2ZW50KQoJbG9jYWwgZnV0dXJlID0gc2VsZi5mdXR1cmUKCXJldHVybiBmdXR1cmUuc2VsZWN0b3IuY29uZGl0aW9uKGZ1dHVyZSwgY29udGV4dCwgZXZlbnQpCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHMuc2VsZWN0b3IubGVhdmUoc2VsZiwgY29udGV4dCwgc2VsZWN0ZWQpCglsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQoJcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5sZWF2ZShmdXR1cmUsIGNvbnRleHQsIHNlbGVjdGVkKQplbmQKCmxvY2FsIGpvYl9tZXRhID0gewoJX19pbmRleCA9IGpvYl9tZXRob2RzOwoJX19jbGFzc2VzID0geyB3YWl0YWJsZSA9IHRydWUgfTsKCV9fbmFtZSA9ICd0YXNrJzsKfQoKbG9jYWwgZnVuY3Rpb24gam9iX3Jvb3Qoam9iKQoJbG9jYWwgcGFyZW50ID0gam9iLnBhcmVudAoJaWYgcGFyZW50IHRoZW4KCQlyZXR1cm4gam9iX3Jvb3QocGFyZW50KQoJZWxzZQoJCXJldHVybiBqb2IKCWVuZAplbmQKCmxvY2FsIGpvYl9jaGlsZF9kZWF0aAoKbG9jYWwgZnVuY3Rpb24gam9iX3Rlcm1pbmF0ZV9jb25kaXRpb24oam9iKQoJaWYgam9iLnRhc2suc3RhdHVzIH49ICdhbGl2ZScgYW5kIG5vdCBuZXh0KGpvYi5jaGlsZHJlbikgYW5kIG5vdCBqb2IuZnV0dXJlLmNvbXBsZXRlZCB0aGVuCgkJaWYgbm90IGpvYi5yZXN1bHQuY29tcGxldGVkIHRoZW4KCQkJam9iLnJlc3VsdDpjb21wbGV0ZShqb2IudGFzay5mdXR1cmU6Z2V0KCkpCgkJZW5kCgkJam9iLmZ1dHVyZTpjb21wbGV0ZShqb2IucmVzdWx0OmdldCgpKQoJCWxvY2FsIHN1Y2Nlc3MsIGVyciA9IGpvYi5mdXR1cmU6Z2V0KCk6dW5wYWNrKCkKCQlpZiBzdWNjZXNzIHRoZW4KCQkJam9iLnN0YXR1cyA9ICdkb25lJwoJCWVsc2UKCQkJaWYgaXNfdGVybWluYXRlZChlcnIpIHRoZW4KCQkJCWpvYi5zdGF0dXMgPSAnY2FuY2VsZWQnCgkJCWVsc2UKCQkJCWpvYi5zdGF0dXMgPSAnYmFkJwoJCQllbmQKCQllbmQKCQlpZiBqb2IucGFyZW50IHRoZW4KCQkJam9iX2NoaWxkX2RlYXRoKGpvYi5wYXJlbnQsIGpvYikKCQllbmQKCWVuZAplbmQKCmpvYl9jaGlsZF9kZWF0aCA9IGZ1bmN0aW9uKGpvYiwgY2hpbGQpCglpZiBjaGlsZC5zdGF0dXMgPT0gJ2JhZCcgdGhlbgoJCWlmIG5vdCBqb2IucmVzdWx0LmNvbXBsZXRlZCB0aGVuCgkJCWpvYi5yZXN1bHQ6Y29tcGxldGUoY2hpbGQuZnV0dXJlOmdldCgpKQoJCQktLSBpZ25vcmUgcGFyYWxsZWwgZXJyb3JzIGZvciBub3cKCQkJbG9jYWwgcm9vdCA9IGpvYl9yb290KGpvYikKCQkJbG9jYWwgdHJhY2VzID0gcm9vdC50cmFjZXMgb3Ige30KCQkJdGFibGUuaW5zZXJ0KHRyYWNlcywgY2hpbGQudGFzay50cmFjZWJhY2spCgkJCXJvb3QudHJhY2VzID0gdHJhY2VzCgkJZW5kCgkJam9iOmNhbmNlbCgpCgllbmQKCWpvYi5jaGlsZHJlbltjaGlsZF0gPSBuaWwKCWpvYl90ZXJtaW5hdGVfY29uZGl0aW9uKGpvYikKZW5kCgpsb2NhbCBmdW5jdGlvbiBqb2JfY3JlYXRlKHBvb2wsIGFjdGlvbikKCWFzc2VydChhY3Rpb24pCglsb2NhbCBqb2IKCWpvYiA9IHsKCQlzdGF0dXMgPSAnd29ya2luZyc7CgkJcmVzdWx0ID0gY29uY3VycmVudC5mdXR1cmUoKTsKCQlmdXR1cmUgPSBjb25jdXJyZW50LmZ1dHVyZSgpOwoJCWNoaWxkcmVuID0ge307CgkJdGFzayA9IHBvb2w6c3Bhd24oZnVuY3Rpb24oKQoJCQl0YXNrLmNvbnRleHQoKS5KT0IgPSBqb2IKCQkJcmV0dXJuIGFjdGlvbigpCgkJZW5kKTsKCX0KCXNldG1ldGF0YWJsZShqb2IsIGpvYl9tZXRhKQoJcG9vbDpzcGF3bl9pbW1vcnRhbChmdW5jdGlvbigpCgkJam9iLnRhc2s6d2FpdCgpCgkJaWYgam9iLnRhc2suc3RhdHVzID09ICdmYWlsZWQnIHRoZW4KCQkJam9iOmNhbmNlbCgpCgkJZW5kCgkJam9iX3Rlcm1pbmF0ZV9jb25kaXRpb24oam9iKQoJZW5kKTpzdGFydCgpCglyZXR1cm4gam9iCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHM6Zm9yayhhY3Rpb24pCglsb2NhbCBqb2IgPSBqb2JfY3JlYXRlKHNlbGYudGFzay5wb29sLCBhY3Rpb24pCglqb2IucGFyZW50ID0gc2VsZgoJc2VsZi5jaGlsZHJlbltqb2JdID0gdHJ1ZQoJcmV0dXJuIGpvYgplbmQKCmZ1bmN0aW9uIGpvYl9tZXRob2RzOmFzeW5jKGFjdGlvbikKCWxvY2FsIGpvYiA9IHNlbGY6Zm9yayhhY3Rpb24pCglqb2IudGFzazpzdGFydCgpCglyZXR1cm4gam9iCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHM6Y2FuY2VsX2NoaWxkcmVuKCkKCWZvciBjaGlsZCBpbiBwYWlycyhzZWxmLmNoaWxkcmVuKSBkbwoJCWNoaWxkOmNhbmNlbCgpCgllbmQKZW5kCgpmdW5jdGlvbiBqb2JfbWV0aG9kczpjYW5jZWwoKQoJc2VsZjpjYW5jZWxfY2hpbGRyZW4oKQoJc2VsZi50YXNrOnN0b3AoKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gam9iX21ldGhvZHM6YXdhaXQoKQoJcmV0dXJuIHNlbGYuZnV0dXJlOmdldCgpOnVud3JhcCgpCmVuZAoKLS0tIEBhc3luYwpmdW5jdGlvbiBqb2JfbWV0aG9kczphd2FpdF90aW1lb3V0KHRpbWVvdXQpCglsb2NhbCByZXN1bHQgPSBjb25jdXJyZW50LnNlbGVjdChzZWxmLCBjb25jdXJyZW50LnRpbWVvdXQodGltZW91dCkpCglpZiByZXN1bHQgPT0gc2VsZiB0aGVuCgkJcmV0dXJuIHRydWUsIHNlbGY6YXdhaXQoKQoJZWxzZQoJCXNlbGY6Y2FuY2VsKCkKCQlyZXR1cm4gZmFsc2UKCWVuZAplbmQKCmZ1bmN0aW9uIGpvYl9tZXRob2RzOmZpbm5hbGl6ZShhY3Rpb24pCglsb2NhbCB0YXNrID0gc2VsZi50YXNrLnBvb2w6c3Bhd25faW1tb3J0YWwoZnVuY3Rpb24oKQoJCWNvbmN1cnJlbnQud2FpdChzZWxmKQoJCXJldHVybiBhY3Rpb24oKQoJZW5kKQoJdGFzazpzdGFydCgpCglyZXR1cm4gdGFzawplbmQKCmZ1bmN0aW9uIGxpYnJhcnkucnVuKGFjdGlvbikKCWxvY2FsIHBvb2wgPSB0YXNrLnBvb2woKQoJbG9jYWwgcm9vdCA9IGpvYl9jcmVhdGUocG9vbCwgYWN0aW9uKQoJcm9vdC50YXNrOnN0YXJ0KCkKCXBvb2w6cnVuKCkKCXJvb3QuZnV0dXJlOmdldCgpCglsb2NhbCB0cmFjZXMgPSByb290LnRyYWNlcyBvciB7fQoJbG9jYWwgdHJhY2ViYWNrID0gcm9vdC50YXNrLnRyYWNlYmFjawoJaWYgdHJhY2ViYWNrIHRoZW4KCQl0YWJsZS5pbnNlcnQodHJhY2VzLCB0cmFjZWJhY2spCgllbmQKCWlmIG5leHQodHJhY2VzKSB0aGVuCgkJbG9jYWwgZmlsZW5hbWUgPSBvcy5kYXRlKCJjcmFzaF8lWS0lbS0lZFQlSDolTTolU1oudHh0IikKCQlsb2NhbCBmaWxlID0gaW8ub3BlbihmaWxlbmFtZSwgJ3cnKQoJCWlmIGZpbGUgdGhlbgoJCQlmaWxlOndyaXRlKCJFUlJPUjogIikKCQkJZmlsZTp3cml0ZShzZWxlY3QoMiwgcm9vdC5mdXR1cmU6Z2V0KCk6dW5wYWNrKCkpKQoJCQlmaWxlOndyaXRlKCdcbicpCgkJCWZvciBpPSN0cmFjZXMsIDEsIC0xIGRvCgkJCQlsb2NhbCB0cmFjZSA9IHRyYWNlc1tpXQoJCQkJZmlsZTp3cml0ZSh0cmFjZSkKCQkJCWZpbGU6d3JpdGUoJ1xuJykKCQkJZW5kCgkJCWZpbGU6Y2xvc2UoKQoJCWVuZAoJZW5kCglyZXR1cm4gcm9vdDphd2FpdCgpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5ydW5uaW5nKCkKCXJldHVybiB0YXNrLmNvbnRleHQoKS5KT0IKZW5kCgpsb2NhbCBmdW5jdGlvbiBqb2JfcmVxdWlyZV9ydW5uaW5nKCkKCXJldHVybiBsaWJyYXJ5LnJ1bm5pbmcoKSBvciBlcnJvcigibm8gam9iIGluIGN1cnJlbnQgY29udGV4dCIsIDMpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5hc3luYyhhY3Rpb24pCglyZXR1cm4gam9iX3JlcXVpcmVfcnVubmluZygpOmFzeW5jKGFjdGlvbikKZW5kCgpmdW5jdGlvbiBsaWJyYXJ5LmNhbmNlbCgpCglyZXR1cm4gam9iX3JlcXVpcmVfcnVubmluZygpOmNhbmNlbCgpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5hbnkoLi4uKQoJbG9jYWwgcmVzdWx0ID0geyBjb25jdXJyZW50LnNlbGVjdCguLi4pIH0KCWZvciBfLCBqb2IgaW4gaXBhaXJzIHsgLi4uIH0gZG8KCQlqb2I6Y2FuY2VsKCkKCWVuZAoJcmV0dXJuIHRhYmxlLnVucGFjayhyZXN1bHQpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5jcml0aWNhbChhY3Rpb24pCglsb2NhbCBqb2IgPSBqb2JfcmVxdWlyZV9ydW5uaW5nKCkKCWxvY2FsIHQgPSBqb2IudGFzay5wb29sOnNwYXduX2ltbW9ydGFsKGZ1bmN0aW9uKCkKCQl0YXNrLmNvbnRleHQoKS5KT0IgPSBqb2IKCQlyZXR1cm4gYWN0aW9uKCkKCWVuZCkKCXQ6c3RhcnQoKQoJcmV0dXJuIHQ6am9pbigpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5yZXRyeSh0aW1lcywgYWN0aW9uLCAuLi4pCglsb2NhbCBlcnIKCWZvciBfPTEsIHRpbWVzIGRvCgkJbG9jYWwgciA9IHRhYmxlLnBhY2socGNhbGwoYWN0aW9uLCAuLi4pKQoJCWlmIHJbMV0gdGhlbgoJCQlyZXR1cm4gdGFibGUudW5wYWNrKHIsIDIpCgkJZWxzZQoJCQllcnIgPSByWzJdCgkJCWlmIGlzX3Rlcm1pbmF0ZWQoZXJyKSB0aGVuCgkJCQlicmVhawoJCQllbmQKCQllbmQKCWVuZAoJZXJyb3IoZXJyLCAwKQplbmQKCmxpYnJhcnkubGl2ZWRhdGEgPSB7fQoKZnVuY3Rpb24gbGlicmFyeS5saXZlZGF0YS5zdWJzY3JpYmUocHJvcGVydHksIGFjdGlvbikKCXJldHVybiBsaWJyYXJ5LmFzeW5jKGZ1bmN0aW9uKCkKCQlwcm9wZXJ0eTpjb2xsZWN0KGZ1bmN0aW9uKHZhbHVlKQoJCQlsaWJyYXJ5LmFzeW5jKGZ1bmN0aW9uKCkKCQkJCWFjdGlvbih2YWx1ZSkKCQkJZW5kKQoJCWVuZCkKCWVuZCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBleHRyYWN0X3ZhbHVlcyhwcm9wZXJ0aWVzKQoJbG9jYWwgdmFsdWVzID0ge30KCWZvciBpLCBwcm9wZXJ0eSBpbiBpcGFpcnMocHJvcGVydGllcykgZG8KCQl2YWx1ZXNbaV0gPSBwcm9wZXJ0eS52YWx1ZQoJZW5kCglyZXR1cm4gdGFibGUudW5wYWNrKHZhbHVlcykKZW5kCgpmdW5jdGlvbiBsaWJyYXJ5LmxpdmVkYXRhLmNvbWJpbmUoYWN0aW9uLCAuLi4pCglsb2NhbCBqb2IgPSBqb2JfcmVxdWlyZV9ydW5uaW5nKCkKCWxvY2FsIHByb3BlcnRpZXMgPSB0YWJsZS5wYWNrKC4uLikKCWxvY2FsIGluaXQgPSBhY3Rpb24oZXh0cmFjdF92YWx1ZXMocHJvcGVydGllcykpCglsb2NhbCByZXN1bHQgPSBjb25jdXJyZW50LnByb3BlcnR5KGluaXQpCglqb2I6YXN5bmMoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJY29uY3VycmVudC5zZWxlY3QodGFibGUudW5wYWNrKHByb3BlcnRpZXMpKQoJCQlyZXN1bHQ6c2V0KGFjdGlvbihleHRyYWN0X3ZhbHVlcyhwcm9wZXJ0aWVzKSkpCgkJZW5kCgllbmQpCglyZXR1cm4gcmVzdWx0CmVuZAoKZnVuY3Rpb24gbGlicmFyeS5saXZlZGF0YS5kZXRlcm1pbmVzKHByb3BlcnR5LCBhY3Rpb24pCglsb2NhbCBqb2IKCXJldHVybiBsaWJyYXJ5LmxpdmVkYXRhLnN1YnNjcmliZShwcm9wZXJ0eSwgZnVuY3Rpb24odmFsdWUpCgkJaWYgam9iIHRoZW4KCQkJam9iOmNhbmNlbCgpCgkJZW5kCgkJaWYgdmFsdWUgdGhlbgoJCQlqb2IgPSBsaWJyYXJ5LmFzeW5jKGFjdGlvbikKCQllbmQKCWVuZCkKZW5kCgpyZXR1cm4gbGlicmFyeQo=";
  52.     ["ktlo.task"] = base64.decode "bG9jYWwgY29uY3VycmVudCA9IHJlcXVpcmUgJ2t0bG8uY29uY3VycmVudCcKbG9jYWwgY29udGFpbmVyID0gcmVxdWlyZSAna3Rsby5jb250YWluZXInCgpsb2NhbCBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIGVuZGluZykKCXJldHVybiBzdHI6c3ViKC0jZW5kaW5nKSA9PSBlbmRpbmcKZW5kCgpsb2NhbCBxdWV1ZUV2ZW50UmF3ID0gb3MucXVldWVFdmVudFJhdyBvciBvcy5xdWV1ZUV2ZW50Cm9zLnF1ZXVlRXZlbnRSYXcgPSBxdWV1ZUV2ZW50UmF3Cgpsb2NhbCBsaWJyYXJ5ID0ge30KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCB0YXNrX21ldGhvZHMgPSB7fQoKdGFza19tZXRob2RzLnNlbGVjdG9yID0ge30KCmZ1bmN0aW9uIHRhc2tfbWV0aG9kcy5zZWxlY3Rvci5pbW1lZGlhdGUoc2VsZikKCWxvY2FsIGZ1dHVyZSA9IHNlbGYuZnV0dXJlCglyZXR1cm4gZnV0dXJlLnNlbGVjdG9yLmltbWVkaWF0ZShmdXR1cmUpCmVuZAoKZnVuY3Rpb24gdGFza19tZXRob2RzLnNlbGVjdG9yLmVudGVyKHNlbGYpCglsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQoJcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5lbnRlcihmdXR1cmUpCmVuZAoKZnVuY3Rpb24gdGFza19tZXRob2RzLnNlbGVjdG9yLmNvbmRpdGlvbihzZWxmLCBjb250ZXh0LCBldmVudCkKCWxvY2FsIGZ1dHVyZSA9IHNlbGYuZnV0dXJlCglyZXR1cm4gZnV0dXJlLnNlbGVjdG9yLmNvbmRpdGlvbihmdXR1cmUsIGNvbnRleHQsIGV2ZW50KQplbmQKCmZ1bmN0aW9uIHRhc2tfbWV0aG9kcy5zZWxlY3Rvci5sZWF2ZShzZWxmLCBjb250ZXh0LCBzZWxlY3RlZCkKCWxvY2FsIGZ1dHVyZSA9IHNlbGYuZnV0dXJlCglyZXR1cm4gZnV0dXJlLnNlbGVjdG9yLmxlYXZlKGZ1dHVyZSwgY29udGV4dCwgc2VsZWN0ZWQpCmVuZAoKdGFza19tZXRob2RzLndhaXQgPSBjb25jdXJyZW50LndhaXQKCmZ1bmN0aW9uIHRhc2tfbWV0aG9kczpqb2luKCkKCXJldHVybiBzZWxmLmZ1dHVyZTpnZXQoKTp1bndyYXAoKQplbmQKCmxvY2FsIGZ1bmN0aW9uIHRhc2tfY29udGludWUoc2VsZiwgZXZlbnQpCglpZiBzZWxmLnN0YXR1cyB+PSAnYWxpdmUnIHRoZW4KCQlyZXR1cm4KCWVuZAoJaWYgZXZlbnRbMV0gPT0gJ3Rlcm1pbmF0ZScgYW5kIHNlbGYuaW1tb3J0YWwgdGhlbgoJCXJldHVybgoJZW5kCglsb2NhbCB0aHJlYWQgPSBzZWxmLnRocmVhZAoJbG9jYWwgcHJldl90YXNrID0gX1RBU0sKCV9HLl9UQVNLID0gc2VsZgoJbG9jYWwgcmVzdWx0ID0gY29udGFpbmVyLnJlc3VsdC5yZXN1bWluZyh0aHJlYWQsIHRhYmxlLnVucGFjayhldmVudCkpCglfRy5fVEFTSyA9IHByZXZfdGFzawoJbG9jYWwgb2ssIGVyciA9IHJlc3VsdDp1bnBhY2soKQoJaWYgbm90IG9rIHRoZW4KCQlzZWxmLmZ1dHVyZTpjb21wbGV0ZShyZXN1bHQpCgkJaWYgZW5kc1dpdGgoZXJyLCAiVGVybWluYXRlZCIpIHRoZW4KCQkJc2VsZi5zdGF0dXMgPSAnc3RvcGVkJwoJCWVsc2UKCQkJc2VsZi5zdGF0dXMgPSAnZmFpbGVkJwoJCQlzZWxmLnRyYWNlYmFjayA9IGRlYnVnLnRyYWNlYmFjayh0aHJlYWQsIGVycikKCQllbmQKCWVsc2VpZiBjb3JvdXRpbmUuc3RhdHVzKHRocmVhZCkgPT0gJ2RlYWQnIHRoZW4KCQlzZWxmLmZ1dHVyZTpjb21wbGV0ZShyZXN1bHQpCgkJc2VsZi5zdGF0dXMgPSAnZGVhZCcKCWVsc2UKCQlsb2NhbCBuZXh0X2V2ZW50ID0gZXJyCgkJc2VsZi5ldmVudCA9IG5leHRfZXZlbnQKCQlpZiBuZXh0X2V2ZW50ID09ICd3YWtlJyB0aGVuCgkJCXRhYmxlLmluc2VydChzZWxmLnBvb2wub3JkZXJzLCB7dGFzaz1zZWxmLCBvcmRlcj0nd2FrZSd9KQoJCWVuZAoJZW5kCmVuZAoKZnVuY3Rpb24gdGFza19tZXRob2RzOnJlc3VtZShldmVudCkKCXNlbGY6c3RhcnQoKQoJbG9jYWwgZXZlbnROYW1lID0gZXZlbnRbMV0KCWlmIGV2ZW50TmFtZSA9PSAndGFza19zdG9wJyB0aGVuCgkJaWYgZXZlbnRbMl0gPT0gc2VsZi5pZCB0aGVuCgkJCXRhc2tfY29udGludWUoc2VsZiwgeyAndGVybWluYXRlJyB9KQoJCWVuZAoJCXJldHVybgoJZW5kCglpZiBldmVudE5hbWUgPT0gJ3Rlcm1pbmF0ZScgb3IgKG5vdCBzZWxmLmV2ZW50KSBvciBzZWxmLmV2ZW50ID09IGV2ZW50TmFtZSB0aGVuCgkJdGFza19jb250aW51ZShzZWxmLCBldmVudCkKCWVuZAplbmQKCmZ1bmN0aW9uIHRhc2tfbWV0aG9kczpzdG9wKCkKCWlmIHNlbGYuc3RhdHVzID09ICdhbGl2ZScgdGhlbgoJCXRhYmxlLmluc2VydChzZWxmLnBvb2wub3JkZXJzLCB7IHRhc2s9c2VsZiwgb3JkZXI9J3N0b3AnIH0pCgllbmQKZW5kCgpmdW5jdGlvbiB0YXNrX21ldGhvZHM6c3RhcnQoKQoJaWYgbm90IHNlbGYuc3RhcnRlZCB0aGVuCgkJc2VsZi5zdGFydGVkID0gdHJ1ZQoJCXRhc2tfY29udGludWUoc2VsZiwge30pCgllbmQKZW5kCgpsb2NhbCB0YXNrX21ldGEgPSB7CglfX2luZGV4ID0gdGFza19tZXRob2RzOwoJX19jbGFzc2VzID0geyB3YWl0YWJsZSA9IHRydWUgfTsKCV9fbmFtZSA9ICd0YXNrJzsKfQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmxvY2FsIHBvb2xfbWV0aG9kcyA9IHt9Cgpsb2NhbCB0YXNrSWRDb3VudGVyID0gMQoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnNwYXduKGFjdGlvbiwgaW1tb3J0YWwpCglsb2NhbCB0YXNrID0gewoJCWlkID0gdGFza0lkQ291bnRlcjsKCQlpbW1vcnRhbCA9IGltbW9ydGFsIG9yIGZhbHNlOwoJCXBvb2wgPSBzZWxmOwoJCWZ1dHVyZSA9IGNvbmN1cnJlbnQuZnV0dXJlKCk7CgkJdGhyZWFkID0gY29yb3V0aW5lLmNyZWF0ZShhY3Rpb24pOwoJCWV2ZW50ID0gbmlsOwoJCXN0YXR1cyA9ICdhbGl2ZSc7CgkJY29udGV4dCA9IHt9OwoJCXN0YXJ0ZWQgPSBmYWxzZTsKCX0KCXRhc2tJZENvdW50ZXIgPSB0YXNrSWRDb3VudGVyICsgMQoJc2V0bWV0YXRhYmxlKHRhc2ssIHRhc2tfbWV0YSkKCXRhYmxlLmluc2VydChzZWxmLnRhc2tzLCB0YXNrKQoJcmV0dXJuIHRhc2sKZW5kCgpmdW5jdGlvbiBwb29sX21ldGhvZHM6c3Bhd25faW1tb3J0YWwoYWN0aW9uKQoJcmV0dXJuIHNlbGY6c3Bhd24oYWN0aW9uLCB0cnVlKQplbmQKCmZ1bmN0aW9uIHBvb2xfbWV0aG9kczpyZXN1bWUoZXZlbnQpCglsb2NhbCBmaWx0ZXJlZCA9IHt9Cglsb2NhbCBwcm9jZXNzID0gc2VsZi50YXNrcwoJc2VsZi50YXNrcyA9IGZpbHRlcmVkCglmb3IgXywgdGFzayBpbiBpcGFpcnMocHJvY2VzcykgZG8KCQl0YXNrOnJlc3VtZShldmVudCkKCQlpZiB0YXNrLnN0YXR1cyA9PSAnYWxpdmUnIHRoZW4KCQkJdGFibGUuaW5zZXJ0KGZpbHRlcmVkLCB0YXNrKQoJCWVuZAoJZW5kCmVuZAoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnByb2Nlc3Nfb3JkZXJzX3F1ZXVlKCkKCXdoaWxlIG5leHQoc2VsZi5vcmRlcnMpIGRvCgkJbG9jYWwgcXVldWUgPSBzZWxmLm9yZGVycwoJCXNlbGYub3JkZXJzID0ge30KCQlmb3IgXywgcmVjb3JkIGluIGlwYWlycyhxdWV1ZSkgZG8KCQkJbG9jYWwgdGFzayA9IHJlY29yZC50YXNrCgkJCWxvY2FsIG9yZGVyID0gcmVjb3JkLm9yZGVyCgkJCWlmIG9yZGVyID09ICdzdG9wJyB0aGVuCgkJCQl0YXNrX2NvbnRpbnVlKHRhc2ssIHsgJ3Rlcm1pbmF0ZScgfSkKCQkJZWxzZWlmIG9yZGVyID09ICd3YWtlJyB0aGVuCgkJCQl0YXNrX2NvbnRpbnVlKHRhc2ssIHsgJ3dha2UnIH0pCgkJCWVuZAoJCWVuZAoJZW5kCmVuZAoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnByb2Nlc3NfaW50ZXJuYWxfZXZlbnRzKCkKCWxvY2FsIGV2ZW50cyA9IHNlbGYuZXZlbnRzCglpZiBuZXh0KGV2ZW50cykgdGhlbgoJCXNlbGYuZXZlbnRzID0ge30KCQlmb3IgXywgZXZlbnQgaW4gaXBhaXJzKGV2ZW50cykgZG8KCQkJc2VsZjpyZXN1bWUoZXZlbnQpCgkJZW5kCgllbmQKZW5kCgpmdW5jdGlvbiBwb29sX21ldGhvZHM6c3RlcCgpCglzZWxmOnByb2Nlc3Nfb3JkZXJzX3F1ZXVlKCkKCXNlbGY6cHJvY2Vzc19pbnRlcm5hbF9ldmVudHMoKQoJaWYgbmV4dChzZWxmLnRhc2tzKSB0aGVuCgkJaWYgbmV4dChzZWxmLmV2ZW50cykgdGhlbgoJCQlxdWV1ZUV2ZW50UmF3KCdldmVudF9iYXRjaCcpCgkJZW5kCgkJbG9jYWwgZXZlbnQgPSB7IG9zLnB1bGxFdmVudFJhdygpIH0KCQlpZiBldmVudFsxXSB+PSAnZXZlbnRfYmF0Y2gnIHRoZW4KCQkJc2VsZjpyZXN1bWUoZXZlbnQpCgkJZW5kCgllbmQKZW5kCgpmdW5jdGlvbiBwb29sX21ldGhvZHM6cnVuKCkKCXdoaWxlIG5leHQoc2VsZi50YXNrcykgZG8KCQlzZWxmOnN0ZXAoKQoJZW5kCmVuZAoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnF1ZXVlX2V2ZW50KGV2ZW50TmFtZSwgLi4uKQoJdGFibGUuaW5zZXJ0KHNlbGYuZXZlbnRzLCB7ZXZlbnROYW1lLCAuLi59KQplbmQKCmxvY2FsIHBvb2xfbWV0YSA9IHsKCV9faW5kZXggPSBwb29sX21ldGhvZHM7Cn0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBsaWJyYXJ5LnBvb2woKQoJbG9jYWwgcG9vbCA9IHsKCQl0YXNrcyA9IHt9OwoJCWV2ZW50cyA9IHt9OwoJCW9yZGVycyA9IHt9OwoJfQoJcmV0dXJuIHNldG1ldGF0YWJsZShwb29sLCBwb29sX21ldGEpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5ydW5uaW5nKCkKCXJldHVybiBfVEFTSwplbmQKCmZ1bmN0aW9uIGxpYnJhcnkuY29udGV4dCgpCglsb2NhbCB0YXNrID0gbGlicmFyeS5ydW5uaW5nKCkgb3IgZXJyb3IoImNvbnRleHQoKSBjYWxsZWQgb3V0c2lkZSBhbnkgdGFzayIsIDIpCglyZXR1cm4gdGFzay5jb250ZXh0CmVuZAoKZnVuY3Rpb24gbGlicmFyeS5hbnkoLi4uKQoJbG9jYWwgcmVzdWx0ID0geyBjb25jdXJyZW50LnNlbGVjdCguLi4pIH0KCWZvciBfLCB0YXNrIGluIGlwYWlycyB7IC4uLiB9IGRvCgkJdGFzazpzdG9wKCkKCWVuZAoJcmV0dXJuIHRhYmxlLnVucGFjayhyZXN1bHQpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS55aWVsZCgpCgljb3JvdXRpbmUueWllbGQoJ3dha2UnKQplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvcy5xdWV1ZUV2ZW50ID0gZnVuY3Rpb24oLi4uKQoJbG9jYWwgdGFzayA9IGxpYnJhcnkucnVubmluZygpCglpZiB0YXNrIHRoZW4KCQl0YXNrLnBvb2w6cXVldWVfZXZlbnQoLi4uKQoJZWxzZQoJCXF1ZXVlRXZlbnRSYXcoLi4uKQoJZW5kCmVuZAoKcmV0dXJuIGxpYnJhcnkK";
  53.     ["psg.audit"] = base64.decode "QVVESVRfRElSRUNUT1JZPSJhdWRpdCIKRVZFTlRfVEFCTEU9ImV2ZW50IgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKaWYgZnMuZXhpc3RzKEFVRElUX0RJUkVDVE9SWSkgdGhlbgoJZnMubWFrZURpcihBVURJVF9ESVJFQ1RPUlkpCmVuZAoKbG9jYWwgYXVkaXQgPSB7fQoKbG9jYWwgZnVuY3Rpb24gdGltZXN0YW1wKCkKCXJldHVybiBvcy5kYXRlKCIlWS0lbS0lZFQlSDolTTolU1oiKQplbmQKCmxvY2FsIENPTUEgPSAoJywnKTpieXRlKDEpCgpsb2NhbCBmdW5jdGlvbiBwYXJzZV9jc3Yoc3RyKQoJbG9jYWwgaSxqLCBuID0gMSwgMSwgI3N0cgoJbG9jYWwgcmVzdWx0ID0ge30KCXdoaWxlIGogPD0gbiBkbwoJCWxvY2FsIGMgPSBzdHI6Ynl0ZShqKQoJCWlmIGMgPT0gQ09NQSB0aGVuCgkJCWxvY2FsIHRleHQKCQkJaWYgaSA9PSBqIC0gMSB0aGVuCgkJCQl0ZXh0ID0gIiIKCQkJZWxzZQoJCQkJdGV4dCA9IHN0cjpzdWIoaSwgaiAtIDEpCgkJCWVuZAoJCQl0YWJsZS5pbnNlcnQocmVzdWx0LCB0ZXh0KQoJCQlqID0gaiArIDEKCQkJaSA9IGoKCQllbHNlCgkJCWogPSBqICsgMQoJCWVuZAoJZW5kCglsb2NhbCB0ZXh0CglpZiBpID09IGogdGhlbgoJCXRleHQgPSAiIgoJZWxzZQoJCXRleHQgPSBzdHI6c3ViKGksIGopCgllbmQKCXRhYmxlLmluc2VydChyZXN1bHQsIHRleHQpCglyZXR1cm4gcmVzdWx0CmVuZAoKbG9jYWwgZnVuY3Rpb24gdGFibGVfdG9fY3N2KHRhYikKCXJldHVybiB0YWJsZS5jb25jYXQodGFiLCAiLCIpCmVuZAoKbG9jYWwgZnVuY3Rpb24gbWFrZUZpbGVuYW1lKGV2ZW50KQoJcmV0dXJuIEFVRElUX0RJUkVDVE9SWS4uIi8iLi5ldmVudC4uIi5jc3YiCmVuZAoKbG9jYWwgZnVuY3Rpb24gYXBwZW5kX3RvX2ZpbGUoZmlsZW5hbWUsIGRhdGEpCglsb2NhbCBmaWxlID0gYXNzZXJ0KGlvLm9wZW4oZmlsZW5hbWUsICdhJykpCglmaWxlOndyaXRlKHRhYmxlX3RvX2NzdihkYXRhKSkKCWZpbGU6d3JpdGUoJ1xuJykKCWZpbGU6Y2xvc2UoKQplbmQKCmxvY2FsIGZ1bmN0aW9uIGRlZmluZV9zY2hlbWFsZXNzKGV2ZW50LCBoZWFkZXJzKQoJbG9jYWwgZmlsZW5hbWUgPSBtYWtlRmlsZW5hbWUoZXZlbnQpCglpZiBub3QgZnMuZXhpc3RzKGZpbGVuYW1lKSB0aGVuCgkJYXBwZW5kX3RvX2ZpbGUoZmlsZW5hbWUsIGhlYWRlcnMpCgllbmQKZW5kCgpsb2NhbCBldmVudEhlYWRlcnMgPSB7J3RpbWVzdGFtcCcsICd0eXBlJ30KCmRlZmluZV9zY2hlbWFsZXNzKEVWRU5UX1RBQkxFLCBldmVudEhlYWRlcnMpCgpsb2NhbCBmdW5jdGlvbiByZWFkX2JhY2tfbGluZShmaWxlLCBsb2NhdGlvbikKCWZvciBwb3M9bG9jYXRpb24tMSwgMCwgLTEgZG8KCQlmaWxlOnNlZWsoInNldCIsIHBvcykKCQlsb2NhbCBjID0gZmlsZTpyZWFkKDEpCgkJaWYgYyA9PSAnXG4nIHRoZW4KCQkJbG9jYWwgbGluZSA9IGZpbGU6cmVhZCgnbCcpCgkJCWZpbGU6c2Vlaygic2V0IiwgcG9zKQoJCQlyZXR1cm4gbGluZSwgcG9zCgkJZW5kCgllbmQKCXJldHVybiBuaWwsIDAKZW5kCgpsb2NhbCBmdW5jdGlvbiBzZXR1cF9oZWFkKGV2ZW50KQoJbG9jYWwgZmlsZSA9IGFzc2VydChpby5vcGVuKG1ha2VGaWxlbmFtZShldmVudCkpKQoJYXNzZXJ0KGZpbGU6cmVhZCgnbCcpKQoJcmV0dXJuIGZpbGUKZW5kCgpsb2NhbCBmdW5jdGlvbiBzZXR1cF90YWlsKGV2ZW50KQoJbG9jYWwgZmlsZSA9IGFzc2VydChpby5vcGVuKG1ha2VGaWxlbmFtZShldmVudCkpKQoJbG9jYWwgbG9jYXRpb24gPSBmaWxlOnNlZWsoImVuZCIpCglyZXR1cm4gZmlsZSwgbG9jYXRpb24gLSAxCmVuZAoKbG9jYWwgc2NoZW1hID0ge30KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmF1ZGl0LnBhcnNlX2NzdiA9IHBhcnNlX2NzdgoKZnVuY3Rpb24gYXVkaXQuZGVmaW5lKGV2ZW50LCBoZWFkZXJzKQoJZGVmaW5lX3NjaGVtYWxlc3MoZXZlbnQsIGhlYWRlcnMpCglzY2hlbWFbZXZlbnRdID0gaGVhZGVycwplbmQKCmZ1bmN0aW9uIGF1ZGl0LnNhdmUoZXZlbnQsIHJlY29yZCkKCWxvY2FsIGhlYWRlcnMgPSBhc3NlcnQoc2NoZW1hW2V2ZW50XSkKCWxvY2FsIHQgPSB0aW1lc3RhbXAoKQoJYXBwZW5kX3RvX2ZpbGUobWFrZUZpbGVuYW1lKEVWRU5UX1RBQkxFKSwge3QsIGV2ZW50fSkKCWxvY2FsIGRhdGEgPSB7fQoJZm9yIGksIGhlYWRlciBpbiBpcGFpcnMoaGVhZGVycykgZG8KCQlkYXRhW2ldID0gdG9zdHJpbmcocmVjb3JkW2hlYWRlcl0pCgllbmQKCWFwcGVuZF90b19maWxlKG1ha2VGaWxlbmFtZShldmVudCksIGRhdGEpCglyZXR1cm4gdAplbmQKCmxvY2FsIGZ1bmN0aW9uIGF1ZGl0X3JlYWQoc2V0dXBfZmlsZSwgcmVhZF9saW5lLCBza2lwLCBzaXplKQoJbG9jYWwgbWFpbkZpbGUsIG1haW5Mb2NhdGlvbiA9IHNldHVwX2ZpbGUoRVZFTlRfVEFCTEUpCglsb2NhbCBmaWxlcyA9IHt9Cglmb3IgZXZlbnQsIGhlYWRlcnMgaW4gcGFpcnMoc2NoZW1hKSBkbwoJCWxvY2FsIGZpbGUsIGxvY2F0aW9uID0gc2V0dXBfZmlsZShldmVudCkKCQlsb2NhbCBjb250ZXh0ID0gewoJCQlmaWxlID0gZmlsZTsKCQkJbG9jYXRpb24gPSBsb2NhdGlvbjsKCQkJaGVhZGVycyA9IGhlYWRlcnM7CgkJfQoJCWZpbGVzW2V2ZW50XSA9IGNvbnRleHQKCWVuZAoJbG9jYWwgcmVzdWx0LCBsaW5lID0ge30sIG5pbAoJZm9yIGk9MSwgc2tpcCtzaXplIGRvCgkJbGluZSwgbWFpbkxvY2F0aW9uID0gcmVhZF9saW5lKG1haW5GaWxlLCBtYWluTG9jYXRpb24pCgkJaWYgbm90IGxpbmUgdGhlbgoJCQlicmVhawoJCWVuZAoJCWxvY2FsIGRhdGEgPSBwYXJzZV9jc3YobGluZSkKCQlsb2NhbCB0eXBlID0gZGF0YVsyXQoJCWxvY2FsIGNvbnRleHQgPSBmaWxlc1t0eXBlXQoJCWlmIGkgPD0gc2tpcCB0aGVuCgkJCV8sIGNvbnRleHQubG9jYXRpb24gPSBhc3NlcnQocmVhZF9saW5lKGNvbnRleHQuZmlsZSwgY29udGV4dC5sb2NhdGlvbikpCgkJZWxzZQoJCQlsb2NhbCByZWNvcmQgPSB7CgkJCQl0aW1lc3RhbXA9ZGF0YVsxXTsKCQkJCWV2ZW50PXR5cGU7CgkJCX0KCQkJbGluZSwgY29udGV4dC5sb2NhdGlvbiA9IGFzc2VydChyZWFkX2xpbmUoY29udGV4dC5maWxlLCBjb250ZXh0LmxvY2F0aW9uKSkKCQkJZGF0YSA9IHBhcnNlX2NzdihsaW5lKQoJCQlmb3IgaiwgaGVhZGVyIGluIGlwYWlycyhjb250ZXh0LmhlYWRlcnMpIGRvCgkJCQlyZWNvcmRbaGVhZGVyXSA9IGRhdGFbal0KCQkJZW5kCgkJCXRhYmxlLmluc2VydChyZXN1bHQsIHJlY29yZCkKCQllbmQKCWVuZAoJZm9yIF8sIGNvbnRleHQgaW4gcGFpcnMoZmlsZXMpIGRvCgkJY29udGV4dC5maWxlOmNsb3NlKCkKCWVuZAoJcmV0dXJuIHJlc3VsdAplbmQKCmxvY2FsIGZ1bmN0aW9uIHJlYWRfbGluZV9oZWFkKGZpbGUpCglyZXR1cm4gZmlsZTpyZWFkKCdsJykKZW5kCgpmdW5jdGlvbiBhdWRpdC5oZWFkKHNraXAsIHNpemUpCglyZXR1cm4gYXVkaXRfcmVhZChzZXR1cF9oZWFkLCByZWFkX2xpbmVfaGVhZCwgc2tpcCwgc2l6ZSkKZW5kCgpmdW5jdGlvbiBhdWRpdC50YWlsKHNraXAsIHNpemUpCglyZXR1cm4gYXVkaXRfcmVhZChzZXR1cF90YWlsLCByZWFkX2JhY2tfbGluZSwgc2tpcCwgc2l6ZSkKZW5kCgpsb2NhbCBmdW5jdGlvbiBjb3B5X2NvbnRlbnQoZXZlbnQsIGZpbGUsIGhlYWRlcnMpCglsb2NhbCBmaWxlbmFtZSA9IG1ha2VGaWxlbmFtZShldmVudCkKCWxvY2FsIHRtcGZpbGUgPSBmaWxlbmFtZS4uIi50bXAiCglsb2NhbCBvdXQgPSBhc3NlcnQoaW8ub3Blbih0bXBmaWxlLCAndycpKQoJb3V0OndyaXRlKHRhYmxlX3RvX2NzdihoZWFkZXJzKSkKCW91dDp3cml0ZSgnXG4nKQoJZm9yIGNodW5rIGluIGZpbGU6bGluZXMoNDA5NikgZG8KCQlvdXQ6d3JpdGUoY2h1bmspCgllbmQKCWZpbGU6Y2xvc2UoKQoJb3V0OmNsb3NlKCkKCWZzLmRlbGV0ZShmaWxlbmFtZSkKCWZzLm1vdmUodG1wZmlsZSwgZmlsZW5hbWUpCmVuZAoKZnVuY3Rpb24gYXVkaXQuZXJhc2UoY291bnQpCglsb2NhbCBtYWluRmlsZSA9IHNldHVwX2hlYWQoRVZFTlRfVEFCTEUpCglsb2NhbCBmaWxlcyA9IHt9Cglmb3IgZXZlbnQsIGhlYWRlcnMgaW4gcGFpcnMoc2NoZW1hKSBkbwoJCWxvY2FsIGZpbGUgPSBzZXR1cF9oZWFkKGV2ZW50KQoJCWxvY2FsIGNvbnRleHQgPSB7CgkJCWZpbGUgPSBmaWxlOwoJCQloZWFkZXJzID0gaGVhZGVyczsKCQl9CgkJZmlsZXNbZXZlbnRdID0gY29udGV4dAoJZW5kCglsb2NhbCBsaW5lCglmb3IgaT0xLCBjb3VudCBkbwoJCWxpbmUgPSBtYWluRmlsZTpyZWFkKCdsJykKCQlpZiBub3QgbGluZSB0aGVuCgkJCWJyZWFrCgkJZW5kCgkJbG9jYWwgZGF0YSA9IHBhcnNlX2NzdihsaW5lKQoJCWxvY2FsIHR5cGUgPSBkYXRhWzJdCgkJbG9jYWwgY29udGV4dCA9IGZpbGVzW3R5cGVdCgkJYXNzZXJ0KGNvbnRleHQuZmlsZTpyZWFkKCdsJykpCgllbmQKCWNvcHlfY29udGVudChFVkVOVF9UQUJMRSwgbWFpbkZpbGUsIGV2ZW50SGVhZGVycykKCWZvciBldmVudCwgY29udGV4dCBpbiBwYWlycyhmaWxlcykgZG8KCQljb3B5X2NvbnRlbnQoZXZlbnQsIGNvbnRleHQuZmlsZSwgY29udGV4dC5oZWFkZXJzKQoJZW5kCmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKcmV0dXJuIGF1ZGl0Cg==";
  54.     ["ktlo.container"] = base64.decode "bG9jYWwgdGFibGUsbWF0aCxzdHJpbmcsYT10YWJsZSxtYXRoLHN0cmluZyxyZXF1aXJlJ2t0bG8uY2hlY2snbG9jYWwgYixjLGQ9dGFibGUudW5wYWNrLHRhYmxlLmluc2VydCx0YWJsZS5jb25jYXQ7bG9jYWwgZXJyb3Isc2V0bWV0YXRhYmxlLHRvc3RyaW5nLHR5cGU9ZXJyb3Isc2V0bWV0YXRhYmxlLHRvc3RyaW5nLHR5cGU7bG9jYWwgZSxmPW1hdGguaHVnZSxtYXRoLmZsb29yO2xvY2FsIGcsaCxpPXN0cmluZy5tYXRjaCxzdHJpbmcuZ3N1YixzdHJpbmcuZm9ybWF0O2xvY2FsIGo9YS5leHBlY3Q7bG9jYWwgaz1jb3JvdXRpbmUucmVzdW1lO2xvY2FsIGw9e31sb2NhbCBtPXt9ZnVuY3Rpb24gbTp1bndyYXAoKWooMSxzZWxmLCdyZXN1bHQnKWxvY2FsIG49c2VsZi52YWx1ZTtpZiBzZWxmLnN1Y2Nlc3MgdGhlbiByZXR1cm4gYihuKWVsc2UgZXJyb3IobiwyKWVuZCBlbmQ7ZnVuY3Rpb24gbTp1bnBhY2soKWooMSxzZWxmLCdyZXN1bHQnKWxvY2FsIG49c2VsZi52YWx1ZTtpZiBzZWxmLnN1Y2Nlc3MgdGhlbiByZXR1cm4gdHJ1ZSxiKG4pZWxzZSByZXR1cm4gZmFsc2UsbiBlbmQgZW5kO2xvY2FsIG89e19faW5kZXg9bSxfX25hbWU9J3Jlc3VsdCd9bG9jYWwgZnVuY3Rpb24gcChxLG4pbG9jYWwgcj17c3VjY2Vzcz1xLHZhbHVlPW59cmV0dXJuIHNldG1ldGF0YWJsZShyLG8pZW5kO2xvY2FsIGZ1bmN0aW9uIHMoLi4uKXJldHVybiBwKHRydWUsey4uLn0pZW5kO2xvY2FsIGZ1bmN0aW9uIHQodSlyZXR1cm4gcChmYWxzZSx1KWVuZDtsb2NhbCBmdW5jdGlvbiB2KHcsLi4uKWlmIHcgdGhlbiByZXR1cm4gcyguLi4pZWxzZSByZXR1cm4gdCguLi4pZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiB4KHksLi4uKWooMSx5LCdmdW5jdGlvbicpcmV0dXJuIHYocGNhbGwoeSwuLi4pKWVuZDtsb2NhbCBmdW5jdGlvbiB6KEEsLi4uKWooMSxBLCd0aHJlYWQnKXJldHVybiB2KGsoQSwuLi4pKWVuZDtsLnJlc3VsdD17c3VjY2Vzcz1zLGZhaWx1cmU9dCxjYXRjaGluZz14LHJlc3VtaW5nPXoscGFjaz12fWxvY2FsIGZ1bmN0aW9uIEIobilpZiB0eXBlKG4pfj0nbnVtYmVyJ3RoZW4gcmV0dXJuIG5pbCBlbmQ7aWYgbj09ZSBvciBuPT0tZSBvciBufj1mKG4pdGhlbiByZXR1cm4nZmxvYXQnZW5kO3JldHVybidpbnRlZ2VyJ2VuZDtsb2NhbCBmdW5jdGlvbiBDKEQsbilpZiB0eXBlKG4pPT0nc3RyaW5nJ3RoZW4gbG9jYWwgRT1oKGkoIiVxIixuKSwiXFxcbiIsIlxcbiIpYyhELEUpZWxzZWlmIEIobik9PSdmbG9hdCd0aGVuIGlmIG5+PW4gdGhlbiBjKEQsIjAvMCIpZWxzZWlmIG49PWUgdGhlbiBjKEQsIjEvMCIpZWxzZWlmIG49PS1lIHRoZW4gYyhELCItMS8wIillbHNlIGMoRCx0b3N0cmluZyhuKSllbmQgZWxzZSBjKEQsdG9zdHJpbmcobikpZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBGKHNlbGYpbG9jYWwgRD17InsifWxvY2FsIEc9I3NlbGY7Zm9yIEg9MSxHIGRvIEMoRCxzZWxmW0hdKWMoRCwiLCIpZW5kO2ZvciBJLG4gaW4gcGFpcnMoc2VsZilkbyBpZiBub3QoQihJKT09J2ludGVnZXInYW5kIEk+PTEgYW5kIEk8PUcpdGhlbiBpZiB0eXBlKEkpPT0nc3RyaW5nJ2FuZCBnKEksJ15bXyVhXVtfJXddKiQnKXRoZW4gYyhELEkpZWxzZSBjKEQsIlsiKUMoRCxJKWMoRCwiXSIpZW5kO2MoRCwiPSIpQyhELG4pYyhELCIsIillbmQgZW5kO2lmI0Q9PTEgdGhlbiByZXR1cm4ie30iZW5kO0RbI0RdPSd9J3JldHVybiBkKEQpZW5kO2xvY2FsIGZ1bmN0aW9uIEooSyxMKWxvY2FsIE09e31mb3IgTixPIGluIHBhaXJzKEspZG8gbG9jYWwgUD1MW05daWYgUD09bmlsIG9yIE9+PVAgdGhlbiByZXR1cm4gZmFsc2UgZW5kO01bTl09dHJ1ZSBlbmQ7Zm9yIFEsUiBpbiBwYWlycyhMKWRvIGlmIG5vdCBNW1FddGhlbiByZXR1cm4gZmFsc2UgZW5kIGVuZDtyZXR1cm4gdHJ1ZSBlbmQ7bG9jYWwgUz17X190b3N0cmluZz1GLF9fZXE9Sn1sb2NhbCBUO2Z1bmN0aW9uIFQobixVKWooMSxuLCd0YWJsZScpaigyLFUsJ2Jvb2xlYW4nLCduaWwnKWxvY2FsIHI9c2V0bWV0YXRhYmxlKG4sUylpZiBVIHRoZW4gZm9yIFIsViBpbiBwYWlycyhuKWRvIGlmIHR5cGUoVik9PSd0YWJsZSd0aGVuIFQoVix0cnVlKWVuZCBlbmQgZW5kO3JldHVybiByIGVuZDtsLmRhdHVtPVQ7cmV0dXJuIGwK";
  55.     ["ktlo.check"] = base64.decode "bG9jYWwgdHlwZSxzZWxlY3QscmF3Z2V0LHRvc3RyaW5nLGVycm9yLGRlYnVnLHRhYmxlPXR5cGUsc2VsZWN0LHJhd2dldCx0b3N0cmluZyxlcnJvcixkZWJ1Zyx0YWJsZTtsb2NhbCBhPWRlYnVnLmdldG1ldGF0YWJsZTtsb2NhbCBiLGM9dGFibGUuY29uY2F0LHRhYmxlLnJlbW92ZTtsb2NhbCBkPXt9bG9jYWwgZnVuY3Rpb24gZShmLGcpaWYgZ349InRhYmxlImFuZCBnfj0idXNlcmRhdGEidGhlbiByZXR1cm4gZyBlbmQ7bG9jYWwgaD1hKGYpaWYgbm90IGggdGhlbiByZXR1cm4gZyBlbmQ7bG9jYWwgaT1yYXdnZXQoaCwiX19uYW1lIilpZiB0eXBlKGkpPT0ic3RyaW5nInRoZW4gcmV0dXJuIGkgZWxzZSByZXR1cm4gZyBlbmQgZW5kO2xvY2FsIGZ1bmN0aW9uIGooLi4uKWxvY2FsIGs9ey4uLn1mb3IgbD0jaywxLC0xIGRvIGlmIGtbbF09PSJuaWwidGhlbiBjKGssbCllbmQgZW5kO2lmI2s8PTEgdGhlbiByZXR1cm4gdG9zdHJpbmcoLi4uKWVsc2UgcmV0dXJuIGIoaywiLCAiLDEsI2stMSkuLiIgb3IgIi4ua1sja11lbmQgZW5kO2xvY2FsIGZ1bmN0aW9uIG0oZixuLG8paWYgbj09byB0aGVuIHJldHVybiB0cnVlIGVuZDtpZiBufj0idGFibGUiYW5kIG5+PSJ1c2VyZGF0YSJ0aGVuIHJldHVybiBmYWxzZSBlbmQ7bG9jYWwgaD1hKGYpaWYgbm90IGggdGhlbiByZXR1cm4gZmFsc2UgZW5kO2xvY2FsIGk9cmF3Z2V0KGgsIl9fbmFtZSIpaWYgaT09byB0aGVuIHJldHVybiB0cnVlIGVuZDtsb2NhbCBwPWguX19jbGFzc2VzO2lmIG5vdCBwIHRoZW4gcmV0dXJuIGZhbHNlIGVuZDtpZiBwW29ddGhlbiByZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZDtmdW5jdGlvbiBkLmV4cGVjdChxLGYsLi4uKWxvY2FsIG49dHlwZShmKWZvciBsPTEsc2VsZWN0KCIjIiwuLi4pZG8gbG9jYWwgbz1zZWxlY3QobCwuLi4paWYgbShmLG4sbyl0aGVuIHJldHVybiBmIGVuZCBlbmQ7bG9jYWwgZz1lKGYsbilsb2NhbCBpO2xvY2FsIHIscz1wY2FsbChkZWJ1Zy5nZXRpbmZvLDMsIm5TIilpZiByIGFuZCBzLm5hbWUgYW5kIHMubmFtZX49IiJhbmQgcy53aGF0fj0iQyJ0aGVuIGk9cy5uYW1lIGVuZDtsb2NhbCB0PWooLi4uKWlmIGkgdGhlbiBlcnJvcigoImJhZCBhcmd1bWVudCAjJWQgdG8gJyVzJyAoJXMgZXhwZWN0ZWQsIGdvdCAlcykiKTpmb3JtYXQocSxpLHQsZyksMyllbHNlIGVycm9yKCgiYmFkIGFyZ3VtZW50ICMlZCAoJXMgZXhwZWN0ZWQsIGdvdCAlcykiKTpmb3JtYXQocSx0LGcpLDMpZW5kIGVuZDtyZXR1cm4gZAo=";
  56. }
  57. local function loader(module)
  58.     if module == 'ktlo.base64' then
  59.         return function() return base64 end
  60.     else
  61.         local text = modules[module]
  62.         if not text then
  63.             return nil, "not embedded in program"
  64.         end
  65.         modules[module] = nil
  66.         return load(text, "@[included]/"..module..".lua", 't', _ENV)
  67.     end
  68. end
  69. table.insert(package.loaders, loader)
  70. _G.RESOURCES = {
  71. }
  72. local entrypoint = "bG9jYWwgQ0hBTk5FTF9DT01NQU5EID0gNDYKbG9jYWwgQ0hBTk5FTF9FVkVOVCA9IDQ3CmxvY2FsIFNFQ1VSSVRZX0NPTU1BTkQgPSA0OApsb2NhbCBTRUNVUklUWV9FVkVOVCA9IDQ5CmxvY2FsIERJU0NPVkVSX1BFUklPRCA9IDEKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmxvY2FsIGNvbmN1cnJlbnQgPSByZXF1aXJlICdrdGxvLmNvbmN1cnJlbnQnCmxvY2FsIGpvYiA9IHJlcXVpcmUgJ2t0bG8uam9iJwpsb2NhbCBycGMgPSByZXF1aXJlICdrdGxvLnJwYycKbG9jYWwgc3BrZXkgPSByZXF1aXJlICdwc2cuc3BrZXknCmxvY2FsIGtleXJpbmcgPSByZXF1aXJlICdwc2cua2V5cmluZycKbG9jYWwgZmlsdGVyID0gcmVxdWlyZSAncHNnLmZpbHRlcicKbG9jYWwgYXVkaXQgPSByZXF1aXJlICdwc2cuYXVkaXQnCmxvY2FsIHJhbmRvbSA9IHJlcXVpcmUgJ2NjcnlwdG9saWIucmFuZG9tJwpsb2NhbCBjb250YWluZXIgPSByZXF1aXJlICdrdGxvLmNvbnRhaW5lcicKCmxvY2FsIHZlcnNpb24gPSBWRVJTSU9OIG9yICdkZXYnCgpsb2NhbCBzcGVha2VycyA9IHsgcGVyaXBoZXJhbC5maW5kKCJzcGVha2VyIikgfQpsb2NhbCBtb2RlbXMgPSB7IHBlcmlwaGVyYWwuZmluZCgibW9kZW0iLCBmdW5jdGlvbihfLCBtb2RlbSkgcmV0dXJuIG1vZGVtLmlzV2lyZWxlc3MgZW5kKSB9CmlmICNtb2RlbXMgPT0gMCB0aGVuCgllcnJvciAiTm8gbW9kZW0gZm91bmQ7IGV4aXRpbmcuLi4iCmVuZAoKbG9jYWwgdGllcgpsb2NhbCBzdGFyZ2F0ZQoKZG8KCWxvY2FsIGludGVyZmFjZXMgPSB7CgkJImFkdmFuY2VkX2NyeXN0YWxfaW50ZXJmYWNlIiwKCQkiY3J5c3RhbF9pbnRlcmZhY2UiLAoJCSJiYXNpY19pbnRlcmZhY2UiLAoJfQoJZm9yIGksIGludGVyZmFjZSBpbiBpcGFpcnMoaW50ZXJmYWNlcykgZG8KCQlzdGFyZ2F0ZSA9IHBlcmlwaGVyYWwuZmluZChpbnRlcmZhY2UpCgkJaWYgc3RhcmdhdGUgdGhlbgoJCQl0aWVyID0gI2ludGVyZmFjZXMgLSBpICsgMQoJCQlicmVhawoJCWVuZAoJZW5kCmVuZAoKaWYgbm90IHN0YXJnYXRlIHRoZW4KCWVycm9yICJObyBzdGFyZ2F0ZSBmb3VuZDsgZXhpdGluZy4uLiIKZW5kCgpzZXR0aW5ncy5kZWZpbmUoImdhbGF4aWVzIiwgewoJZGVzY3JpcHRpb24gPSAiR2FsYXhpZXMiLAoJZGVmYXVsdCA9IHsic2dqb3VybmV5Om1pbGt5X3dheSJ9LAoJdHlwZSA9ICJ0YWJsZSIsCn0pCgpzZXR0aW5ncy5kZWZpbmUoInNvbGFyU3lzdGVtIiwgewoJZGVzY3JpcHRpb24gPSAiQ3VycmVudCBzb2xhciBzeXN0ZW0iLAoJZGVmYXVsdCA9ICJtaW5lY3JhZnQ6b3ZlcndvcmxkIiwKCXR5cGUgPSAic3RyaW5nIiwKfSkKCnNldHRpbmdzLmRlZmluZSgicHJlZmVyTWFudWFsIiwgewoJZGVzY3JpcHRpb24gPSAiUHJlZmVyIG1hbnVhbCBkaWFsaW5nIHRvIGRpcmVjdCIsCglkZWZhdWx0ID0gZmFsc2UsCgl0eXBlID0gImJvb2xlYW4iLAp9KQoKc2V0dGluZ3MuZGVmaW5lKCJwc2cuYWR2YW5jZWREaWFsIiwgewoJZGVzY3JpcHRpb24gPSAiUHJlZmVyIGRpcmVjdCBlbmNvZGluZyBpZiBwb3NzaWJsZSIsCglkZWZhdWx0ID0gZmFsc2UsCgl0eXBlID0gImJvb2xlYW4iLAp9KQoKc2V0dGluZ3MuZGVmaW5lKCJhdXRvSXJpcyIsIHsKCWRlc2NyaXB0aW9uID0gIkVuYWJsZSBhdXRvbWF0aWMgaXJpcyBhY3RpdmF0aW9uIG9uIGluY29taW5nIHdvcm1ob2xlIiwKCWRlZmF1bHQgPSB0cnVlLAoJdHlwZSA9ICJib29sZWFuIiwKfSkKCnNldHRpbmdzLmRlZmluZSgicHNnLmF1dG9DbG9zZSIsIHsKCWRlc2NyaXB0aW9uID0gIkNsb3NlIGNvbm5lY3RyaW9uIGFmdGVyIE4gc2Vjb25kcyBmcm9tIGxhc3QgdHJhdmVsbGVyIGVudGVycyB0aGUgU3RhcmdhdGUiLAoJZGVmYXVsdCA9IDAsCgl0eXBlID0gIm51bWJlciIsCn0pCgpzZXR0aW5ncy5kZWZpbmUoInBzZy5pcmlzUHJvdGVjdCIsIHsKCWRlc2NyaXB0aW9uID0gIkNsb3NlIGNvbm5lY3RyaW9uIGFmdGVyIE4gaXJpcyBoaXRzIGZyb20gYW4gb3RoZXJzaWRlIG9mIGEgY29ubmVjdGlvbiIsCglkZWZhdWx0ID0gMCwKCXR5cGUgPSAibnVtYmVyIiwKfSkKCnNldHRpbmdzLmRlZmluZSgicHNnLm5vS2F3b29zaCIsIHsKCWRlc2NyaXB0aW9uID0gIkVuYWJsZSBwcm90ZWN0aW9uIGZyb20ga2F3b29zaCB1c2luZyBpcmlzIiwKCWRlZmF1bHQgPSBmYWxzZSwKCXR5cGUgPSAiYm9vbGVhbiIsCn0pCgpzZXR0aW5ncy5kZWZpbmUoImVuYWJsZUF1ZGl0IiwgewoJZGVzY3JpcHRpb24gPSAiV3JpdGUgYXVkaXQgZXZlbnRzIGludG8gbG9jYWwgam91cm5hbCIsCglkZWZhdWx0ID0gZmFsc2UsCgl0eXBlID0gImJvb2xlYW4iLAp9KQoKc2V0dGluZ3MuZGVmaW5lKCJwc2cubG9jYWxBZGRyZXNzIiwgewoJZGVzY3JpcHRpb24gPSAiTG9jYWwgc3RhcmdhdGUgYWRkcmVzcyIsCglkZWZhdWx0ID0gbmlsLAoJdHlwZSA9ICJ0YWJsZSIsCn0pCgpsb2NhbCBnYWxheGllcyA9IHNldHRpbmdzLmdldCgiZ2FsYXhpZXMiLCB7InNnam91cm5leTptaWxreV93YXkifSkKbG9jYWwgc29sYXJTeXN0ZW0gPSBzZXR0aW5ncy5nZXQoInNvbGFyU3lzdGVtIiwgInNnam91cm5leTp0ZXJyYSIpCmxvY2FsIHByZWZlck1hbnVhbFByb3BlcnR5ID0gY29uY3VycmVudC5wcm9wZXJ0eShzZXR0aW5ncy5nZXQoInByZWZlck1hbnVhbCIsIGZhbHNlKSkKbG9jYWwgYWR2YW5jZWREaWFsUHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KHNldHRpbmdzLmdldCgicHNnLmFkdmFuY2VkRGlhbCIsIGZhbHNlKSkKbG9jYWwgYXV0b0lyaXNQcm9wZXJ0eSA9IGNvbmN1cnJlbnQucHJvcGVydHkoc2V0dGluZ3MuZ2V0KCJhdXRvSXJpcyIsIHRydWUpKQpsb2NhbCBhdXRvQ2xvc2VQcm9wZXJ0eSA9IGNvbmN1cnJlbnQucHJvcGVydHkoc2V0dGluZ3MuZ2V0KCJwc2cuYXV0b0Nsb3NlIiwgMCkpCmxvY2FsIGlyaXNQcm90ZWN0UHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KHNldHRpbmdzLmdldCgicHNnLmlyaXNQcm90ZWN0IiwgMCkpCmxvY2FsIG5vS2F3b29zaFByb3BlcnR5ID0gY29uY3VycmVudC5wcm9wZXJ0eShzZXR0aW5ncy5nZXQoInBzZy5ub0thd29vc2giLCBmYWxzZSkpCmxvY2FsIGVuYWJsZUF1ZGl0UHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KHNldHRpbmdzLmdldCgiZW5hYmxlQXVkaXQiLCBmYWxzZSkpCgpsb2NhbCBpZCA9IG9zLmdldENvbXB1dGVySUQoKQoKbG9jYWwgaGFuZGxlcnMgPSB7fQoKbG9jYWwgZnVuY3Rpb24gcGxheUNodW5rKHNwZWFrZXIsIGNodW5rKQoJd2hpbGUgbm90IHNwZWFrZXIucGxheUF1ZGlvKGNodW5rLCAxMDApIGRvCgkJb3MucHVsbEV2ZW50KCdzcGVha2VyX2F1ZGlvX2VtcHR5JykKCWVuZAplbmQKCmxvY2FsIGZ1bmN0aW9uIHBsYXlTb3VuZChzb3VuZCkKCXJldHVybiBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCWlmICNzcGVha2VycyA+IDAgYW5kIGZzLmV4aXN0cyhzb3VuZCkgdGhlbgoJCQlsb2NhbCBkZnB3bSA9IHJlcXVpcmUgJ2NjLmF1ZGlvLmRmcHdtJwoJCQlsb2NhbCBkZWNvZGVyID0gZGZwd20ubWFrZV9kZWNvZGVyKCkKCQkJd2hpbGUgdHJ1ZSBkbwoJCQkJZm9yIGNodW5rIGluIGlvLmxpbmVzKHNvdW5kLCAxNiAqIDEwMjQpIGRvCgkJCQkJbG9jYWwgYnVmZmVyID0gZGVjb2RlcihjaHVuaykKCgkJCQkJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQkJCQkJZm9yIF8sIHNwZWFrZXIgaW4gaXBhaXJzKHNwZWFrZXJzKSBkbwoJCQkJCQkJam9iLmFzeW5jKGZ1bmN0aW9uKCkgcGxheUNodW5rKHNwZWFrZXIsIGJ1ZmZlcikgZW5kKQoJCQkJCQllbmQKCQkJCQllbmQpOmF3YWl0KCkKCQkJCWVuZAoJCQllbmQKCQllbmQKCWVuZCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBjYWxsT3JEZWZhdWx0KG1ldGhvZCwgZGVmYXVsdCkKCWlmIG1ldGhvZCB0aGVuCgkJcmV0dXJuIG1ldGhvZCgpCgllbHNlCgkJcmV0dXJuIGRlZmF1bHQKCWVuZAplbmQKCmpvYi5ydW4oZnVuY3Rpb24oKQoKbG9jYWwgbVN0YXJnYXRlR2VuZXJhdGlvbiA9IHN0YXJnYXRlLmdldFN0YXJnYXRlR2VuZXJhdGlvbigpCmxvY2FsIG1TdGFyZ2F0ZVZhcmlhbnQgPSBzdGFyZ2F0ZS5nZXRTdGFyZ2F0ZVZhcmlhbnQoKQpsb2NhbCBtU3RhcmdhdGVUeXBlID0gc3RhcmdhdGUuZ2V0U3RhcmdhdGVUeXBlKCkKbG9jYWwgbUxvY2FsQWRkcmVzcyA9IHNldHRpbmdzLmdldCgicHNnLmxvY2FsQWRkcmVzcyIpIG9yIGNhbGxPckRlZmF1bHQoc3RhcmdhdGUuZ2V0TG9jYWxBZGRyZXNzLCBuaWwpCmxvY2FsIG1JcmlzVGh1ZCA9IDAKCmxvY2FsIGVtcHR5Sm9iID0gam9iLmFzeW5jKGZ1bmN0aW9uKCllbmQpCgpsb2NhbCBpcmlzUHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KGNhbGxPckRlZmF1bHQoc3RhcmdhdGUuZ2V0SXJpcywgbmlsKSkKbG9jYWwgaXJpc0R1cmFiaWxpdHlQcm9wZXJ0eSA9IGNvbmN1cnJlbnQucHJvcGVydHkoY2FsbE9yRGVmYXVsdChzdGFyZ2F0ZS5nZXRJcmlzRHVyYWJpbGl0eSwgMCkpCmxvY2FsIGlyaXNNYXhEdXJhYmlsaXR5UHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KGNhbGxPckRlZmF1bHQoc3RhcmdhdGUuZ2V0SXJpc01heER1cmFiaWxpdHksIDApKQpsb2NhbCBpc1N0YXJnYXRlQ29ubmVjdGVkUHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KHN0YXJnYXRlLmlzU3RhcmdhdGVDb25uZWN0ZWQoKSkKbG9jYWwgaXNTdGFyZ2F0ZURpYWxpbmdPdXRQcm9wZXJ0eSA9IGNvbmN1cnJlbnQucHJvcGVydHkoc3RhcmdhdGUuaXNTdGFyZ2F0ZURpYWxpbmdPdXQoKSkKbG9jYWwgaXNJbmNvbWluZ0Nvbm5lY3Rpb25Qcm9wZXJ0eSA9IGpvYi5saXZlZGF0YS5jb21iaW5lKGZ1bmN0aW9uKGlzU3RhcmdhdGVDb25uZWN0ZWQsIGlzU3RhcmdhdGVEaWFsaW5nT3V0KQoJcmV0dXJuIGlzU3RhcmdhdGVDb25uZWN0ZWQgYW5kIG5vdCBpc1N0YXJnYXRlRGlhbGluZ091dAplbmQsIGlzU3RhcmdhdGVDb25uZWN0ZWRQcm9wZXJ0eSwgaXNTdGFyZ2F0ZURpYWxpbmdPdXRQcm9wZXJ0eSkKCmxvY2FsIHBsYXlBbGFybVRhc2sgPSBlbXB0eUpvYgpqb2IubGl2ZWRhdGEuc3Vic2NyaWJlKGlzSW5jb21pbmdDb25uZWN0aW9uUHJvcGVydHksIGZ1bmN0aW9uKGlzSW5jb21pbmdDb25uZWN0aW9uKQoJcGxheUFsYXJtVGFzazpjYW5jZWwoKQoJaWYgaXNJbmNvbWluZ0Nvbm5lY3Rpb24gdGhlbgoJCWlmIGF1dG9JcmlzUHJvcGVydHkudmFsdWUgYW5kIGlyaXNQcm9wZXJ0eS52YWx1ZSB0aGVuCgkJCWNhbGxPckRlZmF1bHQoc3RhcmdhdGUuY2xvc2VJcmlzKQoJCWVuZAoJCXBsYXlBbGFybVRhc2sgPSBwbGF5U291bmQoIm9mZndvcmxkLmRmcHdtIikKCWVsc2UKCQlpZiBhdXRvSXJpc1Byb3BlcnR5LnZhbHVlIGFuZCBpcmlzUHJvcGVydHkudmFsdWUgdGhlbgoJCQljYWxsT3JEZWZhdWx0KHN0YXJnYXRlLm9wZW5JcmlzKQoJCWVuZAoJZW5kCmVuZCkKCmxvY2FsIGRpc2NvdmVyeUV2ZW50QnJvYWRjYXN0TGF0Y2ggPSBjb25jdXJyZW50LnByb3BlcnR5KGZhbHNlKQpsb2NhbCBhZGRyZXNzQnVmZmVyUHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KHt9KQpsb2NhbCBpc0RpYWxpbmdQcm9wZXJ0eSA9IGpvYi5saXZlZGF0YS5jb21iaW5lKGZ1bmN0aW9uKGFkZHJlc3NCdWZmZXIpCglyZXR1cm4gI2FkZHJlc3NCdWZmZXIgPiAwCmVuZCwgYWRkcmVzc0J1ZmZlclByb3BlcnR5KQpsb2NhbCBlbmdhZ2VkQ2hldnJvbnNQcm9wZXJ0eSA9IGNvbmN1cnJlbnQucHJvcGVydHkoc3RhcmdhdGUuZ2V0Q2hldnJvbnNFbmdhZ2VkKCkpCmxvY2FsIGRpYWxlZEFkZHJlc3NQcm9wZXJ0eSA9IGNvbmN1cnJlbnQucHJvcGVydHkoY2FsbE9yRGVmYXVsdChzdGFyZ2F0ZS5nZXREaWFsZWRBZGRyZXNzLCB7fSkpCmxvY2FsIGVuZXJneVRhcmdldFByb3BlcnR5ID0gY29uY3VycmVudC5wcm9wZXJ0eShzdGFyZ2F0ZS5nZXRFbmVyZ3lUYXJnZXQoKSkKbG9jYWwgY29ubmVjdGVkQWRkcmVzc1Byb3BlcnR5ID0gY29uY3VycmVudC5wcm9wZXJ0eShjYWxsT3JEZWZhdWx0KHN0YXJnYXRlLmdldENvbm5lY3RlZEFkZHJlc3MsIHt9KSkKbG9jYWwgaXNOZXR3b3JrUmVzdHJpY3RlZFByb3BlcnR5ID0gY29uY3VycmVudC5wcm9wZXJ0eShjYWxsT3JEZWZhdWx0KHN0YXJnYXRlLmlzTmV0d29ya1Jlc3RyaWN0ZWQsIGZhbHNlKSkKbG9jYWwgbmV0d29ya1Byb3BlcnR5ID0gY29uY3VycmVudC5wcm9wZXJ0eShjYWxsT3JEZWZhdWx0KHN0YXJnYXRlLmdldE5ldHdvcmssIGZhbHNlKSkKbG9jYWwgZmlsdGVyVHlwZVByb3BlcnR5ID0gY29uY3VycmVudC5wcm9wZXJ0eShjYWxsT3JEZWZhdWx0KHN0YXJnYXRlLmdldEZpbHRlclR5cGUsIDApKQpsb2NhbCBmdW5jdGlvbiBwb2xsTmV3VmFsdWVzKCkKCWxvY2FsIGZlZWRiYWNrQ29kZSwgZmVlZGJhY2tOYW1lID0gc3RhcmdhdGUuZ2V0UmVjZW50RmVlZGJhY2soKTsKCXJldHVybiB7CgkJZmVlZGJhY2tDb2RlID0gZmVlZGJhY2tDb2RlOwoJCWZlZWRiYWNrTmFtZSA9IGZlZWRiYWNrTmFtZTsKCQllbmVyZ3kgPSBzdGFyZ2F0ZS5nZXRFbmVyZ3koKTsKCQllbmVyZ3lDYXBhY2l0eSA9IHN0YXJnYXRlLmdldEVuZXJneUNhcGFjaXR5KCk7CgkJc3RhcmdhdGVFbmVyZ3kgPSBzdGFyZ2F0ZS5nZXRTdGFyZ2F0ZUVuZXJneSgpOwoJCW9wZW5UaW1lID0gc3RhcmdhdGUuZ2V0T3BlblRpbWUoKTsKCQlpc1dvcm1ob2xlT3BlbiA9IHN0YXJnYXRlLmlzV29ybWhvbGVPcGVuKCk7Cgl9CmVuZApsb2NhbCBwb2xsVmFsdWVzUHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KHBvbGxOZXdWYWx1ZXMoKSkKCi0tIG5vIGthd29vc2gKam9iLmxpdmVkYXRhLnN1YnNjcmliZShpc1N0YXJnYXRlQ29ubmVjdGVkUHJvcGVydHksIGZ1bmN0aW9uKGlzQ29ubmVjdGVkKQoJaWYgaXNDb25uZWN0ZWQgYW5kIG5vS2F3b29zaFByb3BlcnR5LnZhbHVlIHRoZW4KCQljYWxsT3JEZWZhdWx0KHN0YXJnYXRlLmNsb3NlSXJpcykKCWVuZAplbmQpCmpvYi5saXZlZGF0YS5zdWJzY3JpYmUocG9sbFZhbHVlc1Byb3BlcnR5LCBmdW5jdGlvbih2YWx1ZXMpCglpZiBub0thd29vc2hQcm9wZXJ0eS52YWx1ZSBhbmQgdmFsdWVzLmlzV29ybWhvbGVPcGVuIGFuZCAoaXNTdGFyZ2F0ZURpYWxpbmdPdXRQcm9wZXJ0eS52YWx1ZSBvciAobm90IGF1dG9JcmlzUHJvcGVydHkudmFsdWUpKSB0aGVuCgkJY2FsbE9yRGVmYXVsdChzdGFyZ2F0ZS5vcGVuSXJpcykKCWVuZAplbmQpCgpsb2NhbCBmdW5jdGlvbiBidWlsZERpc2NvdmVyRXZlbnQoKQoJbG9jYWwgcmVzdWx0ID0ge30KCWxvY2FsIHZhbHVlcyA9IHBvbGxWYWx1ZXNQcm9wZXJ0eS52YWx1ZQoJcmVzdWx0LmlkID0gaWQKCXJlc3VsdC52ZXJzaW9uID0gdmVyc2lvbgoJcmVzdWx0LmdhbGF4aWVzID0gZ2FsYXhpZXMKCXJlc3VsdC5zb2xhclN5c3RlbSA9IHNvbGFyU3lzdGVtCglyZXN1bHQubG9jYWxBZGRyZXNzID0gbUxvY2FsQWRkcmVzcwoJcmVzdWx0LnRpZXIgPSB0aWVyCglsb2NhbCBkaWFsZWRBZGRyZXNzID0gZGlhbGVkQWRkcmVzc1Byb3BlcnR5LnZhbHVlCglsb2NhbCBhZGRyZXNzQnVmZmVyID0gYWRkcmVzc0J1ZmZlclByb3BlcnR5LnZhbHVlCglsb2NhbCBza2lwID0gMAoJaWYgZGlhbGVkQWRkcmVzc1sjZGlhbGVkQWRkcmVzc10gPT0gYWRkcmVzc0J1ZmZlclsxXSB0aGVuCgkJc2tpcCA9IDEKCWVuZAoJbG9jYWwgc2VuZEFkZHJlc3NCdWZmZXIgPSB7fQoJZm9yIGkgPSAxK3NraXAsICNhZGRyZXNzQnVmZmVyIGRvCgkJaWYgYWRkcmVzc0J1ZmZlcltpXSA9PSAwIHRoZW4gYnJlYWsgZW5kCgkJdGFibGUuaW5zZXJ0KHNlbmRBZGRyZXNzQnVmZmVyLCBhZGRyZXNzQnVmZmVyW2ldKQoJZW5kCglyZXN1bHQuYWRkcmVzc0J1ZmZlciA9IHNlbmRBZGRyZXNzQnVmZmVyCglyZXN1bHQuZGlhbGVkQWRkcmVzcyA9IGRpYWxlZEFkZHJlc3M7Cglsb2NhbCBpc0Nvbm5lY3RlZCA9IGlzU3RhcmdhdGVDb25uZWN0ZWRQcm9wZXJ0eS52YWx1ZQoJcmVzdWx0LnBvb1ByZXNzZWQgPSBpc0Nvbm5lY3RlZCBvciBhZGRyZXNzQnVmZmVyWyNhZGRyZXNzQnVmZmVyXSA9PSAwCglyZXN1bHQuYmFzaWMgPSB7CgkJZW5lcmd5ID0gdmFsdWVzLmVuZXJneTsKCQllbmVyZ3lDYXBhY2l0eSA9IHZhbHVlcy5lbmVyZ3lDYXBhY2l0eTsKCQllbmVyZ3lUYXJnZXQgPSBlbmVyZ3lUYXJnZXRQcm9wZXJ0eS52YWx1ZTsKCQlnZW5lcmF0aW9uID0gbVN0YXJnYXRlR2VuZXJhdGlvbjsKCQl2YXJpYW50ID0gbVN0YXJnYXRlVmFyaWFudDsKCQl0eXBlID0gbVN0YXJnYXRlVHlwZTsKCQlzdGFyZ2F0ZUVuZXJneSA9IHZhbHVlcy5zdGFyZ2F0ZUVuZXJneTsKCQljaGV2cm9uc0VuZ2FnZWQgPSBlbmdhZ2VkQ2hldnJvbnNQcm9wZXJ0eS52YWx1ZTsKCQlvcGVuVGltZSA9IHZhbHVlcy5vcGVuVGltZTsKCQlpc0Nvbm5lY3RlZCA9IGlzQ29ubmVjdGVkOwoJCWlzRGlhbGluZ091dCA9IGlzU3RhcmdhdGVEaWFsaW5nT3V0UHJvcGVydHkudmFsdWU7CgkJaXNXb3JtaG9sZU9wZW4gPSB2YWx1ZXMuaXNXb3JtaG9sZU9wZW47CgkJcmVjZW50RmVlZGJhY2tDb2RlID0gdmFsdWVzLmZlZWRiYWNrQ29kZTsKCX0KCWlmIHRpZXIgPj0gMiB0aGVuCgkJcmVzdWx0LmNyeXN0YWwgPSB7CgkJCXJlY2VudEZlZWRiYWNrTmFtZSA9IHZhbHVlcy5mZWVkYmFja05hbWU7CgkJfQoJZW5kCglpZiB0aWVyID49IDMgdGhlbgoJCXJlc3VsdC5hZHZhbmNlZCA9IHsKCQkJY29ubmVjdGVkQWRkcmVzcyA9IGNvbm5lY3RlZEFkZHJlc3NQcm9wZXJ0eS52YWx1ZTsKCQkJbG9jYWxBZGRyZXNzID0gbUxvY2FsQWRkcmVzczsKCQl9CgllbmQKCXJldHVybiByZXN1bHQKZW5kCmxvY2FsIGRpc2NvdmVyeU1lc3NhZ2VQcm9wZXJ0eSA9IGpvYi5saXZlZGF0YS5jb21iaW5lKAoJYnVpbGREaXNjb3ZlckV2ZW50LAoJcG9sbFZhbHVlc1Byb3BlcnR5LAoJZW5nYWdlZENoZXZyb25zUHJvcGVydHksCglpc1N0YXJnYXRlQ29ubmVjdGVkUHJvcGVydHksCglkaWFsZWRBZGRyZXNzUHJvcGVydHksCgllbmVyZ3lUYXJnZXRQcm9wZXJ0eSwKCWlzU3RhcmdhdGVEaWFsaW5nT3V0UHJvcGVydHksCgljb25uZWN0ZWRBZGRyZXNzUHJvcGVydHksCglhZGRyZXNzQnVmZmVyUHJvcGVydHkKKQpqb2IubGl2ZWRhdGEuc3Vic2NyaWJlKGRpc2NvdmVyeU1lc3NhZ2VQcm9wZXJ0eSwgZnVuY3Rpb24oKSBkaXNjb3ZlcnlFdmVudEJyb2FkY2FzdExhdGNoOnNldCh0cnVlKSBlbmQpCmxvY2FsIGZ1bmN0aW9uIGluc2VydEFkZHJlc3NTeW1ib2wocHJvcGVydHksIGluZGV4LCBzeW1ib2wpCglsb2NhbCBwcmV2QWRkcmVzcyA9IHByb3BlcnR5LnZhbHVlCglpZiBzeW1ib2wgfj0gMCBhbmQgcHJldkFkZHJlc3NbaW5kZXhdIH49IHN5bWJvbCB0aGVuCgkJbG9jYWwgYWRkcmVzcyA9IHsgdGFibGUudW5wYWNrKHByZXZBZGRyZXNzKSB9CgkJYWRkcmVzc1tpbmRleF0gPSBzeW1ib2wKCQlwcm9wZXJ0eTpzZXQoYWRkcmVzcykKCWVuZAplbmQKbG9jYWwgZnVuY3Rpb24gaW5zZXJ0RGlhbGVkU3ltYm9sKGluZGV4LCBzeW1ib2wpCglpbnNlcnRBZGRyZXNzU3ltYm9sKGRpYWxlZEFkZHJlc3NQcm9wZXJ0eSwgaW5kZXgsIHN5bWJvbCkKCWluc2VydEFkZHJlc3NTeW1ib2woY29ubmVjdGVkQWRkcmVzc1Byb3BlcnR5LCBpbmRleCwgc3ltYm9sKQplbmQKam9iLmFzeW5jKGZ1bmN0aW9uKCkKCWxvY2FsIHRpbWVyID0gY29uY3VycmVudC50aW1lcihESVNDT1ZFUl9QRVJJT0QpCgl3aGlsZSB0cnVlIGRvCgkJcG9sbFZhbHVlc1Byb3BlcnR5OnNldChwb2xsTmV3VmFsdWVzKCkpCgkJdGltZXI6c2xlZXAoKQoJCXRpbWVyOnNraXBfbWlzc2VkKCkKCWVuZAplbmQpCmpvYi5hc3luYyhmdW5jdGlvbigpCgl3aGlsZSB0cnVlIGRvCgkJb3MucHVsbEV2ZW50KCdzdGFyZ2F0ZV9pbmNvbWluZ19jb25uZWN0aW9uJykKCQlpc1N0YXJnYXRlQ29ubmVjdGVkUHJvcGVydHk6c2V0KHRydWUpCgllbmQKZW5kKQoKam9iLmFzeW5jKGZ1bmN0aW9uKCkKCXdoaWxlIHRydWUgZG8KCQlsb2NhbCBfLCBfLCBlbmdhZ2VkQ291bnQsIGNoZXZyb24sIGlzSW5jb21pbmcsIHN5bWJvbCA9IG9zLnB1bGxFdmVudCgnc3RhcmdhdGVfY2hldnJvbl9lbmdhZ2VkJykKCQllbmdhZ2VkQ2hldnJvbnNQcm9wZXJ0eTpzZXQoZW5nYWdlZENvdW50KQoJCWlmIGNoZXZyb24gPT0gMCB0aGVuCgkJCWlzU3RhcmdhdGVDb25uZWN0ZWRQcm9wZXJ0eTpzZXQodHJ1ZSkKCQkJaXNTdGFyZ2F0ZURpYWxpbmdPdXRQcm9wZXJ0eTpzZXQobm90IGlzSW5jb21pbmcpCgkJZW5kCgkJaWYgc3ltYm9sIHRoZW4KCQkJaWYgaXNJbmNvbWluZyB0aGVuCgkJCQlpbnNlcnRBZGRyZXNzU3ltYm9sKGNvbm5lY3RlZEFkZHJlc3NQcm9wZXJ0eSwgZW5nYWdlZENvdW50LCBzeW1ib2wpCgkJCWVsc2UKCQkJCWluc2VydERpYWxlZFN5bWJvbChlbmdhZ2VkQ291bnQsIHN5bWJvbCkKCQkJZW5kCgkJZW5kCgllbmQKZW5kKQpqb2IuYXN5bmMoZnVuY3Rpb24oKQoJd2hpbGUgdHJ1ZSBkbwoJCWxvY2FsIF8sIF8sIGFkZHJlc3MgPSBvcy5wdWxsRXZlbnQoJ3N0YXJnYXRlX2luY29taW5nX3dvcm1ob2xlJykKCQlpc1N0YXJnYXRlQ29ubmVjdGVkUHJvcGVydHk6c2V0KHRydWUpCgkJaWYgYWRkcmVzcyB0aGVuCgkJCWNvbm5lY3RlZEFkZHJlc3NQcm9wZXJ0eTpzZXQoYWRkcmVzcykKCQllbmQKCWVuZAplbmQpCmpvYi5hc3luYyhmdW5jdGlvbigpCgl3aGlsZSB0cnVlIGRvCgkJb3MucHVsbEV2ZW50KCdzdGFyZ2F0ZV9vdXRnb2luZ193b3JtaG9sZScpCgkJaXNTdGFyZ2F0ZUNvbm5lY3RlZFByb3BlcnR5OnNldCh0cnVlKQoJCWlzU3RhcmdhdGVEaWFsaW5nT3V0UHJvcGVydHk6c2V0KHRydWUpCgllbmQKZW5kKQpsb2NhbCBhdXRvQ2xvc2VKb2IgPSBlbXB0eUpvYgpsb2NhbCBmdW5jdGlvbiBhdXRvQ2xvc2VSb3V0aW5lKCkKCWxvY2FsIGF1dG9DbG9zZSA9IGF1dG9DbG9zZVByb3BlcnR5LnZhbHVlCglpZiBhdXRvQ2xvc2UgPT0gMCB0aGVuCgkJcmV0dXJuCgllbmQKCXNsZWVwKGF1dG9DbG9zZSkKCXN0YXJnYXRlLmRpc2Nvbm5lY3RTdGFyZ2F0ZSgpCmVuZApqb2IuYXN5bmMoZnVuY3Rpb24oKQoJd2hpbGUgdHJ1ZSBkbwoJCW9zLnB1bGxFdmVudCgnc3RhcmdhdGVfcmVzZXQnKQoJCWVuZ2FnZWRDaGV2cm9uc1Byb3BlcnR5OnNldCgwKQoJCWlzU3RhcmdhdGVDb25uZWN0ZWRQcm9wZXJ0eTpzZXQoZmFsc2UpCgkJaXNTdGFyZ2F0ZURpYWxpbmdPdXRQcm9wZXJ0eTpzZXQoZmFsc2UpCgkJZGlhbGVkQWRkcmVzc1Byb3BlcnR5OnNldCh7fSkKCQljb25uZWN0ZWRBZGRyZXNzUHJvcGVydHk6c2V0KHt9KQoJCWFkZHJlc3NCdWZmZXJQcm9wZXJ0eTpzZXQoe30pCgkJbUlyaXNUaHVkID0gMAoJCWF1dG9DbG9zZUpvYjpjYW5jZWwoKQoJZW5kCmVuZCkKam9iLmFzeW5jKGZ1bmN0aW9uKCkKCXdoaWxlIHRydWUgZG8KCQlvcy5wdWxsRXZlbnQoJ3N0YXJnYXRlX2RlY29uc3RydWN0aW5nX2VudGl0eScpCgkJYXV0b0Nsb3NlSm9iOmNhbmNlbCgpCgkJYXV0b0Nsb3NlSm9iID0gam9iLmFzeW5jKGF1dG9DbG9zZVJvdXRpbmUpCgllbmQKZW5kKQoKZnVuY3Rpb24gaGFuZGxlcnMudGVsbChtZXNzYWdlKQoJc3RhcmdhdGUuc2VuZFN0YXJnYXRlTWVzc2FnZShtZXNzYWdlKQoJcmV0dXJuIHRydWUKZW5kCgpsb2NhbCBvdGhlcnNpZGUgPSB7fQoKZnVuY3Rpb24gb3RoZXJzaWRlLmluZm8obm9uY2UpCglyZXR1cm4gc3BrZXkuYXV0aF9yZXF1ZXN0KG5vbmNlLCB7IGlzSXJpc0Nsb3NlZCA9IHN0YXJnYXRlLmdldElyaXNQcm9ncmVzcyBhbmQgc3RhcmdhdGUuZ2V0SXJpc1Byb2dyZXNzKCkgfj0gMCB9KQplbmQKCmxvY2FsIGZ1bmN0aW9uIGJyb2FkY2FzdChtb2RlbUZpbHRlciwgY2hhbm5lbCwgbWVzc2FnZSkKCWZvciBfLCBtb2RlbSBpbiBpcGFpcnMobW9kZW1zKSBkbwoJCWlmIG1vZGVtRmlsdGVyKG1vZGVtKSB0aGVuCgkJCXJwYy5icm9hZGNhc3RfbmV0d29yayhtb2RlbSwgY2hhbm5lbCwgbWVzc2FnZSkKCQllbmQKCWVuZAplbmQKCmxvY2FsIGZ1bmN0aW9uIHJldHVyblRydWUoKQoJcmV0dXJuIHRydWUKZW5kCgpsb2NhbCBmdW5jdGlvbiBicm9hZGNhc3RfcHVibGljKG1lc3NhZ2UpCglicm9hZGNhc3QocmV0dXJuVHJ1ZSwgQ0hBTk5FTF9FVkVOVCwgbWVzc2FnZSkKZW5kCgpsb2NhbCBmdW5jdGlvbiBpc1dpcmVkTW9kZW0obW9kZW0pCglyZXR1cm4gbm90IG1vZGVtLmlzV2lyZWxlc3MoKQplbmQKCmxvY2FsIGZ1bmN0aW9uIGJyb2FkY2FzdF9zZWN1cml0eShtZXNzYWdlKQoJYnJvYWRjYXN0KGlzV2lyZWRNb2RlbSwgU0VDVVJJVFlfRVZFTlQsIG1lc3NhZ2UpCmVuZAoKbG9jYWwgZnVuY3Rpb24gc2F2ZUF1ZGl0RXZlbnQoZXZlbnQsIHJlY29yZCkKCWxvY2FsIHRpbWVzdGFtcCA9IGF1ZGl0LnNhdmUoZXZlbnQsIHJlY29yZCkKCXJlY29yZC5ldmVudCA9IGV2ZW50CglyZWNvcmQudGltZXN0YW1wID0gdGltZXN0YW1wCglicm9hZGNhc3Rfc2VjdXJpdHkgewoJCXR5cGUgPSAnYXVkaXQnOwoJCXJlY29yZCA9IHJlY29yZDsKCX0KZW5kCgphdWRpdC5kZWZpbmUoJ2F1dGgnLCB7ICdrZXknLCAnZXJyb3InIH0pCgpmdW5jdGlvbiBvdGhlcnNpZGUuYXV0aChyZXF1ZXN0KQoJbG9jYWwgcmVzdWx0LCByZWFzb24sIGtleSA9IHNwa2V5LmF1dGhfY29udGludWUocmVxdWVzdCkKCWlmIGVuYWJsZUF1ZGl0UHJvcGVydHkudmFsdWUgdGhlbgoJCXNhdmVBdWRpdEV2ZW50KCdhdXRoJywgeyBrZXk9a2V5LCBlcnJvcj0ocmVhc29uIG9yICIiKSB9KQoJZW5kCglpZiByZXN1bHQgYW5kIGlyaXNQcm9wZXJ0eS52YWx1ZSB0aGVuCgkJc3RhcmdhdGUub3BlbklyaXMoKQoJZW5kCglyZXR1cm4gcmVzdWx0LCByZWFzb24KZW5kCgpsb2NhbCBmdW5jdGlvbiBlbmNvZGVTeW1ib2xNYW51YWwoc3ltYm9sLCBzbG93KQoJbG9jYWwgY3VycmVudCA9IHN0YXJnYXRlLmdldEN1cnJlbnRTeW1ib2woKQoJaWYgY3VycmVudCA9PSAtMSB0aGVuCgkJY3VycmVudCA9IDIzLjUKCWVuZAoJbG9jYWwgZGlmZgoJaWYgc3ltYm9sID4gY3VycmVudCB0aGVuCgkJbG9jYWwgY3VycmVudEFsdCA9IGN1cnJlbnQgKyAzOQoJCWxvY2FsIGRpZmYxID0gc3ltYm9sIC0gY3VycmVudAoJCWxvY2FsIGRpZmYyID0gc3ltYm9sIC0gY3VycmVudEFsdAoJCWlmIG1hdGguYWJzKGRpZmYxKSA8IG1hdGguYWJzKGRpZmYyKSB0aGVuCgkJCWRpZmYgPSBkaWZmMQoJCWVsc2UKCQkJZGlmZiA9IGRpZmYyCgkJZW5kCgllbHNlCgkJbG9jYWwgc3ltYm9sQWx0ID0gc3ltYm9sICsgMzkKCQlsb2NhbCBkaWZmMSA9IHN5bWJvbCAtIGN1cnJlbnQKCQlsb2NhbCBkaWZmMiA9IHN5bWJvbEFsdCAtIGN1cnJlbnQKCQlpZiBtYXRoLmFicyhkaWZmMSkgPCBtYXRoLmFicyhkaWZmMikgdGhlbgoJCQlkaWZmID0gZGlmZjEKCQllbHNlCgkJCWRpZmYgPSBkaWZmMgoJCWVuZAoJZW5kCglpZiBkaWZmID4gMCB0aGVuCgkJc3RhcmdhdGUucm90YXRlQW50aUNsb2Nrd2lzZShzeW1ib2wpCgllbHNlCgkJc3RhcmdhdGUucm90YXRlQ2xvY2t3aXNlKHN5bWJvbCkKCWVuZAoJcmVwZWF0IG9zLnNsZWVwKDAuMikKCXVudGlsIHN0YXJnYXRlLmlzQ3VycmVudFN5bWJvbChzeW1ib2wpCglpZiBzbG93IHRoZW4KCQlvcy5zbGVlcCgxKQoJZW5kCgkoc3RhcmdhdGUub3BlbkNoZXZyb24gb3Igc3RhcmdhdGUuZW5jb2RlQ2hldnJvbikoKQoJaWYgc2xvdyBhbmQgc3RhcmdhdGUub3BlbkNoZXZyb24gdGhlbgoJCW9zLnNsZWVwKDAuNSkKCQlpZiBzeW1ib2wgfj0gMCB0aGVuCgkJCXN0YXJnYXRlLmVuY29kZUNoZXZyb24oKQoJCWVuZAoJCW9zLnNsZWVwKDAuNSkKCWVuZAoJY2FsbE9yRGVmYXVsdChzdGFyZ2F0ZS5jbG9zZUNoZXZyb24pCglpZiBzbG93IHRoZW4KCQlvcy5zbGVlcCgxKQoJZW5kCmVuZAoKbG9jYWwgaXNVbml2ZXJzZVN0YXJnYXRlID0gbVN0YXJnYXRlVHlwZSA9PSAic2dqb3VybmV5OnVuaXZlcnNlX3N0YXJnYXRlIgpsb2NhbCBjYW5EaWFsTWFudWFsbHkgPSBzdGFyZ2F0ZS5nZXRDdXJyZW50U3ltYm9sCmxvY2FsIGNhbkVuZ2FnZUltbWVkaWF0bHkgPSB0aWVyID49IDMgb3IgKAoJewoJCVsic2dqb3VybmV5Om1pbGt5X3dheV9zdGFyZ2F0ZSJdID0gdHJ1ZTsKCQlbInNnam91cm5leTpjbGFzc2ljX3N0YXJnYXRlIl0gPSB0cnVlOwoJCVsic2dqb3VybmV5OnRvbGxhbl9zdGFyZ2F0ZSJdID0gdHJ1ZTsKCX0KKVttU3RhcmdhdGVUeXBlXQoKbG9jYWwgZnVuY3Rpb24gZG9FbmdhZ2Uoc3ltYm9sLCBkaXJlY3QpCgljb3JvdXRpbmUud3JhcChmdW5jdGlvbigpCgkJc3RhcmdhdGUuZW5nYWdlU3ltYm9sKHN5bWJvbCwgZGlyZWN0KQoJZW5kKSgpCmVuZAoKbG9jYWwgZnVuY3Rpb24gZW5jb2RlU3ltYm9sKHN5bWJvbCwgc2xvdykKCWlmIGFkdmFuY2VkRGlhbFByb3BlcnR5LnZhbHVlIGFuZCBjYW5FbmdhZ2VJbW1lZGlhdGx5IGFuZCBzbG93IHRoZW4KCQlkb0VuZ2FnZShzeW1ib2wsIHRydWUpCgkJb3Muc2xlZXAoMC41KQoJZWxzZWlmIGlzVW5pdmVyc2VTdGFyZ2F0ZSBhbmQgbm90IGNhbkVuZ2FnZUltbWVkaWF0bHkgYW5kIG5vdCBzbG93IGFuZCBjYW5EaWFsTWFudWFsbHkgdGhlbgoJCWVuY29kZVN5bWJvbE1hbnVhbChzeW1ib2wsIHNsb3cpCgllbHNlaWYgbm90IGlzVW5pdmVyc2VTdGFyZ2F0ZSBhbmQgcHJlZmVyTWFudWFsUHJvcGVydHkudmFsdWUgYW5kIHNsb3cgYW5kIGNhbkRpYWxNYW51YWxseSB0aGVuCgkJZW5jb2RlU3ltYm9sTWFudWFsKHN5bWJvbCwgc2xvdykKCWVsc2VpZiB0aWVyID49IDIgdGhlbgoJCWxvY2FsIGVuZ2FnZWRUYXJnZXQgPSBlbmdhZ2VkQ2hldnJvbnNQcm9wZXJ0eS52YWx1ZSArIDEKCQlkb0VuZ2FnZShzeW1ib2wsIG5vdCBzbG93KQoJCWlmIHNsb3cgdGhlbgoJCQlvcy5zbGVlcCgwLjUpCgkJZW5kCgkJaWYgc2xvdyBvciBub3QgY2FuRW5nYWdlSW1tZWRpYXRseSB0aGVuCgkJCWVuZ2FnZWRDaGV2cm9uc1Byb3BlcnR5OndhaXRfdW50aWwoZnVuY3Rpb24odmFsdWUpIHJldHVybiB2YWx1ZSA9PSBlbmdhZ2VkVGFyZ2V0IGVuZCkKCQllbmQKCWVsc2VpZiBjYW5EaWFsTWFudWFsbHkgdGhlbgoJCWVuY29kZVN5bWJvbE1hbnVhbChzeW1ib2wsIHNsb3cpCgllbmQKCWluc2VydERpYWxlZFN5bWJvbChlbmdhZ2VkQ2hldnJvbnNQcm9wZXJ0eS52YWx1ZSwgc3ltYm9sKQplbmQKCmxvY2FsIHNsb3dEaWFsaW5nRW5hYmxlZCA9IHRydWUKCmxvY2FsIGZ1bmN0aW9uIHF1ZXVlUG9wKHF1ZXVlKQoJcmV0dXJuIHsgdGFibGUudW5wYWNrKHF1ZXVlLCAyKSB9CmVuZAoKbG9jYWwgZnVuY3Rpb24gcXVldWVQdXNoKHF1ZXVlLCB2YWx1ZSkKCWxvY2FsIG5ldyA9IHsgdGFibGUudW5wYWNrKHF1ZXVlKSB9Cgl0YWJsZS5pbnNlcnQobmV3LCB2YWx1ZSkKCXJldHVybiBuZXcKZW5kCgpqb2IubGl2ZWRhdGEuZGV0ZXJtaW5lcyhpc0RpYWxpbmdQcm9wZXJ0eSwgZnVuY3Rpb24oKQoJcGxheVNvdW5kKCJkaWFsaW5nLmRmcHdtIikKCXdoaWxlIHRydWUgZG8KCQlsb2NhbCBhZGRyZXNzQnVmZmVyID0gYWRkcmVzc0J1ZmZlclByb3BlcnR5LnZhbHVlCgkJbG9jYWwgc3ltYm9sID0gYWRkcmVzc0J1ZmZlclsxXQoJCWlmIG5vdCBzeW1ib2wgdGhlbiBicmVhayBlbmQKCQllbmNvZGVTeW1ib2woc3ltYm9sLCBzbG93RGlhbGluZ0VuYWJsZWQpCgkJYWRkcmVzc0J1ZmZlclByb3BlcnR5OnNldChxdWV1ZVBvcChhZGRyZXNzQnVmZmVyUHJvcGVydHkudmFsdWUpKQoJZW5kCmVuZCkKCmxvY2FsIG1heFN5bWJvbCA9ICgKCXsKCQlbInNnam91cm5leTptaWxreV93YXlfc3RhcmdhdGUiXSA9IDM4OwoJCVsic2dqb3VybmV5OmNsYXNzaWNfc3RhcmdhdGUiXSA9IDM4OwoJCVsic2dqb3VybmV5OnVuaXZlcnNlX3N0YXJnYXRlIl0gPSAzNTsKCX0KKVttU3RhcmdhdGVUeXBlXSBvciA0NwoKZnVuY3Rpb24gaGFuZGxlcnMuZW5nYWdlKHN5bWJvbCkKCWlmIGlzU3RhcmdhdGVDb25uZWN0ZWRQcm9wZXJ0eS52YWx1ZSB0aGVuCgkJcmV0dXJuIGZhbHNlCgllbmQKCXN5bWJvbCA9IG1hdGguZmxvb3Ioc3ltYm9sKQoJaWYgc3ltYm9sIDwgMCBvciBzeW1ib2wgPiBtYXhTeW1ib2wgdGhlbgoJCXJldHVybiBmYWxzZQoJZW5kCglsb2NhbCBkaWFsZWRBZGRyZXNzID0gZGlhbGVkQWRkcmVzc1Byb3BlcnR5LnZhbHVlCglsb2NhbCBhZGRyZXNzQnVmZmVyID0gYWRkcmVzc0J1ZmZlclByb3BlcnR5LnZhbHVlCglsb2NhbCBidWZmZXJMZW5ndGggPSAjYWRkcmVzc0J1ZmZlcgoJaWYgYnVmZmVyTGVuZ3RoICsgI2RpYWxlZEFkZHJlc3MgPj0gOSB0aGVuCgkJcmV0dXJuIGZhbHNlCgllbmQKCWlmIGFkZHJlc3NCdWZmZXJbYnVmZmVyTGVuZ3RoXSA9PSAwIHRoZW4KCQlyZXR1cm4gZmFsc2UKCWVuZAoJZm9yIF8sIGl0IGluIGlwYWlycyhkaWFsZWRBZGRyZXNzKSBkbwoJCWlmIGl0ID09IHN5bWJvbCB0aGVuCgkJCXJldHVybiBmYWxzZQoJCWVuZAoJZW5kCglmb3IgXywgaXQgaW4gaXBhaXJzKGFkZHJlc3NCdWZmZXIpIGRvCgkJaWYgaXQgPT0gc3ltYm9sIHRoZW4KCQkJcmV0dXJuIGZhbHNlCgkJZW5kCgllbmQKCXNsb3dEaWFsaW5nRW5hYmxlZCA9IHRydWUKCWFkZHJlc3NCdWZmZXJQcm9wZXJ0eTpzZXQocXVldWVQdXNoKGFkZHJlc3NCdWZmZXIsIHN5bWJvbCkpCglyZXR1cm4gdHJ1ZQplbmQKCmZ1bmN0aW9uIGhhbmRsZXJzLmRpYWwoYWRkcmVzcywgc2xvdykKCWlmIG5vdCBhZGRyZXNzIHRoZW4gcmV0dXJuIGZhbHNlIGVuZAoJaWYgaXNEaWFsaW5nUHJvcGVydHkudmFsdWUgdGhlbgoJCXJldHVybgoJZW5kCglmb3IgaT0xLCAjYWRkcmVzcyBkbwoJCWxvY2FsIHN5bWJvbCA9IG1hdGguZmxvb3IoYWRkcmVzc1tpXSkKCQlhZGRyZXNzW2ldID0gc3ltYm9sCgkJaWYgc3ltYm9sIDwgMCBvciBzeW1ib2wgPiBtYXhTeW1ib2wgdGhlbgoJCQlyZXR1cm4gZmFsc2UKCQllbmQKCWVuZAoJc2xvd0RpYWxpbmdFbmFibGVkID0gc2xvdwoJbG9jYWwgYWRkcmVzc0J1ZmZlciA9IGFkZHJlc3MKCWFkZHJlc3NCdWZmZXJbI2FkZHJlc3NCdWZmZXIrMV0gPSAwCglhZGRyZXNzQnVmZmVyUHJvcGVydHk6c2V0KGFkZHJlc3NCdWZmZXIpCglsb2NhbCBzZXRDaGV2cm9uQ29uZmlndXJhdGlvbiA9IHN0YXJnYXRlLnNldENoZXZyb25Db25maWd1cmF0aW9uCglpZiBzZXRDaGV2cm9uQ29uZmlndXJhdGlvbiB0aGVuCgkJaWYgI2FkZHJlc3NCdWZmZXIgPT0gOCB0aGVuCgkJCXNldENoZXZyb25Db25maWd1cmF0aW9uKHsxLDIsMyw0LDYsNyw4LDV9KQoJCWVsc2VpZiAjYWRkcmVzc0J1ZmZlciA9PSA5IHRoZW4KCQkJc2V0Q2hldnJvbkNvbmZpZ3VyYXRpb24oezEsMiwzLDQsNSw2LDcsOH0pCgkJZW5kCgllbmQKZW5kCgpmdW5jdGlvbiBoYW5kbGVycy5kaXNjb25uZWN0KCkKCXN0YXJnYXRlLmRpc2Nvbm5lY3RTdGFyZ2F0ZSgpCmVuZAoKZnVuY3Rpb24gaGFuZGxlcnMucmVnaXN0ZXIocGtleSwgbmFtZSkKCWlmIG5vdCBrZXlyaW5nLmV4aXN0cyhwa2V5KSB0aGVuCgkJYnJvYWRjYXN0X3NlY3VyaXR5IHsgdHlwZSA9ICdyZWdpc3RlcicsIGtleSA9IHBrZXksIG5hbWUgPSBuYW1lIH0KCWVuZAoJcmV0dXJuIHNwa2V5LnB1YmxpY19rZXkoKQplbmQKCmxvY2FsIHNlY3VyaXR5ID0ge30KCmxvY2FsIGZ1bmN0aW9uIGZpbHRlclR5cGVUb01vZGUodHlwZSkKCWlmIHR5cGUgPT0gMSB0aGVuCgkJcmV0dXJuICdhbGxvdycKCWVsc2VpZiB0eXBlID09IC0xIHRoZW4KCQlyZXR1cm4gJ2RlbnknCgllbHNlCgkJcmV0dXJuICdub25lJwoJZW5kCmVuZAoKbG9jYWwgZnVuY3Rpb24gZmlsdGVyTW9kZVRvVHlwZShtb2RlKQoJaWYgbW9kZSA9PSAnYWxsb3cnIHRoZW4KCQlyZXR1cm4gMQoJZWxzZWlmIG1vZGUgPT0gJ2RlbnknIHRoZW4KCQlyZXR1cm4gLTEKCWVsc2UKCQlyZXR1cm4gMAoJZW5kCmVuZAoKZnVuY3Rpb24gc2VjdXJpdHkuZ2V0U3RhdGUoKQoJbG9jYWwgcmVzdWx0ID0gewoJCXZlcnNpb24gPSB2ZXJzaW9uOwoJCWtleXJpbmcgPSBrZXlyaW5nLmdldF9hbGwoKTsKCQl0aWVyID0gdGllcjsKCQlzZXR0aW5ncyA9IHsKCQkJa2V5ID0gc3BrZXkucHVibGljX2tleSgpOwoJCQlnYWxheGllcyA9IGdhbGF4aWVzOwoJCQlzb2xhclN5c3RlbSA9IHNvbGFyU3lzdGVtOwoJCQllbmVyZ3lUYXJnZXQgPSBlbmVyZ3lUYXJnZXRQcm9wZXJ0eS52YWx1ZTsKCQkJYXV0b0lyaXMgPSBhdXRvSXJpc1Byb3BlcnR5LnZhbHVlOwoJCQllbmFibGVBdWRpdCA9IGVuYWJsZUF1ZGl0UHJvcGVydHkudmFsdWU7CgkJCWlyaXMgPSBpcmlzUHJvcGVydHkudmFsdWU7CgkJCWlyaXNEdXJhYmlsaXR5ID0gaXJpc0R1cmFiaWxpdHlQcm9wZXJ0eS52YWx1ZTsKCQkJaXJpc01heER1cmFiaWxpdHkgPSBpcmlzTWF4RHVyYWJpbGl0eVByb3BlcnR5LnZhbHVlOwoJCX07CgkJcHJvdG9jb2xzID0gewoJCQlhdXRvQ2xvc2UgPSBhdXRvQ2xvc2VQcm9wZXJ0eS52YWx1ZTsKCQkJaXJpc1Byb3RlY3QgPSBpcmlzUHJvdGVjdFByb3BlcnR5LnZhbHVlOwoJCQlub0thd29vc2ggPSBub0thd29vc2hQcm9wZXJ0eS52YWx1ZTsKCQkJZGlhbCA9IHsKCQkJCXByZWZlck1hbnVhbCA9IHByZWZlck1hbnVhbFByb3BlcnR5LnZhbHVlOwoJCQkJYWR2YW5jZWREaWFsID0gYWR2YW5jZWREaWFsUHJvcGVydHkudmFsdWU7CgkJCX07CgkJfTsKCX0KCWlmIHRpZXIgPj0gMyB0aGVuCgkJcmVzdWx0LmFkdmFuY2VkID0gewoJCQluZXR3b3JrID0gewoJCQkJaWQgPSBuZXR3b3JrUHJvcGVydHkudmFsdWU7CgkJCQlpc1Jlc3RyaWN0ZWQgPSBpc05ldHdvcmtSZXN0cmljdGVkUHJvcGVydHkudmFsdWU7CgkJCX07CgkJCWZpbHRlciA9IHsKCQkJCWFsbG93bGlzdCA9IGZpbHRlci5hbGxvd2xpc3RfZ2V0YWxsKCk7CgkJCQlkZW55bGlzdCA9IGZpbHRlci5kZW55bGlzdF9nZXRhbGwoKTsKCQkJCW1vZGUgPSBmaWx0ZXJUeXBlVG9Nb2RlKGZpbHRlclR5cGVQcm9wZXJ0eS52YWx1ZSk7CgkJCX07CgkJfQoJZW5kCglyZXR1cm4gcmVzdWx0CmVuZAoKbG9jYWwgZnVuY3Rpb24gYnJvYWRjYXN0U2V0dGluZyhzZXR0aW5nLCB2YWx1ZSkKCWJyb2FkY2FzdF9zZWN1cml0eSB7IHR5cGUgPSAnc2V0dGluZycsIHNldHRpbmcgPSBzZXR0aW5nLCB2YWx1ZSA9IHZhbHVlIH0KZW5kCgpmdW5jdGlvbiBzZWN1cml0eS5zZXRFbmVyZ3lUYXJnZXQodGFyZ2V0KQoJc3RhcmdhdGUuc2V0RW5lcmd5VGFyZ2V0KHRhcmdldCkKCWVuZXJneVRhcmdldFByb3BlcnR5OnNldChzdGFyZ2F0ZS5nZXRFbmVyZ3lUYXJnZXQoKSkKZW5kCmpvYi5saXZlZGF0YS5zdWJzY3JpYmUoZW5lcmd5VGFyZ2V0UHJvcGVydHksIGZ1bmN0aW9uKHZhbHVlKQoJYnJvYWRjYXN0U2V0dGluZygiZW5lcmd5X3RhcmdldCIsIHZhbHVlKQplbmQpCgpmdW5jdGlvbiBzZWN1cml0eS5zZXROZXR3b3JrKG5ldHdvcmspCglzdGFyZ2F0ZS5zZXROZXR3b3JrKG5ldHdvcmspCgluZXR3b3JrUHJvcGVydHk6c2V0KHN0YXJnYXRlLmdldE5ldHdvcmsoKSkKZW5kCmpvYi5saXZlZGF0YS5zdWJzY3JpYmUobmV0d29ya1Byb3BlcnR5LCBmdW5jdGlvbih2YWx1ZSkKCWJyb2FkY2FzdFNldHRpbmcoIm5ldHdvcmsiLCB2YWx1ZSkKZW5kKQoKZnVuY3Rpb24gc2VjdXJpdHkucmVzdHJpY3ROZXR3b3JrKHZhbHVlKQoJc3RhcmdhdGUucmVzdHJpY3ROZXR3b3JrKHZhbHVlKQoJaXNOZXR3b3JrUmVzdHJpY3RlZFByb3BlcnR5OnNldCh2YWx1ZSkKZW5kCmpvYi5saXZlZGF0YS5zdWJzY3JpYmUoaXNOZXR3b3JrUmVzdHJpY3RlZFByb3BlcnR5LCBmdW5jdGlvbih2YWx1ZSkKCWJyb2FkY2FzdFNldHRpbmcoImlzX25ldHdvcmtfcmVzdHJpY3RlZCIsIHZhbHVlKQplbmQpCgpmdW5jdGlvbiBzZWN1cml0eS5zZXRGaWx0ZXJNb2RlKG1vZGUpCglzdGFyZ2F0ZS5zZXRGaWx0ZXJUeXBlKGZpbHRlck1vZGVUb1R5cGUobW9kZSkpCglmaWx0ZXJUeXBlUHJvcGVydHk6c2V0KHN0YXJnYXRlLmdldEZpbHRlclR5cGUoKSkKZW5kCmpvYi5saXZlZGF0YS5zdWJzY3JpYmUoZmlsdGVyVHlwZVByb3BlcnR5LCBmdW5jdGlvbih2YWx1ZSkKCWxvY2FsIG1vZGUgPSBmaWx0ZXJUeXBlVG9Nb2RlKHZhbHVlKQoJYnJvYWRjYXN0U2V0dGluZygnZmlsdGVyX21vZGUnLCBtb2RlKQplbmQpCgpmdW5jdGlvbiBzZWN1cml0eS5kZW55KHBrZXkpCglrZXlyaW5nLmZvcmdldChwa2V5KQoJYnJvYWRjYXN0X3NlY3VyaXR5IHsgdHlwZSA9ICdkZW55Jywga2V5ID0gcGtleSB9CmVuZAoKZnVuY3Rpb24gc2VjdXJpdHkuYWxsb3cocGtleSwgbmFtZSkKCWxvY2FsIHIgPSBrZXlyaW5nLnRydXN0KHBrZXksIG5hbWUpCglpZiByIHRoZW4KCQlicm9hZGNhc3Rfc2VjdXJpdHkgeyB0eXBlID0gJ2FsbG93Jywga2V5ID0gcGtleSwgbmFtZSA9IG5hbWUgfQoJZW5kCmVuZAoKbG9jYWwgZnVuY3Rpb24gYnJvYWRjYXN0RmlsdGVyVXBkYXRlKGxpc3QsIGFjdGlvbiwgYWRkcmVzcykKCWJyb2FkY2FzdF9zZWN1cml0eSB7CgkJdHlwZSA9ICdmaWx0ZXInOwoJCWxpc3QgPSBsaXN0OwoJCWFjdGlvbiA9IGFjdGlvbjsKCQlhZGRyZXNzID0gYWRkcmVzczsKCX0KZW5kCgpmdW5jdGlvbiBzZWN1cml0eS5hbGxvd2xpc3RBZGQoYWRkcmVzcykKCWlmIGZpbHRlci5hbGxvd2xpc3RfYWRkKGFkZHJlc3MpIHRoZW4KCQlicm9hZGNhc3RGaWx0ZXJVcGRhdGUoJ2FsbG93JywgJ2FkZCcsIGFkZHJlc3MpCgllbmQKZW5kCgpmdW5jdGlvbiBzZWN1cml0eS5kZW55bGlzdEFkZChhZGRyZXNzKQoJaWYgZmlsdGVyLmRlbnlsaXN0X2FkZChhZGRyZXNzKSB0aGVuCgkJYnJvYWRjYXN0RmlsdGVyVXBkYXRlKCdkZW55JywgJ2FkZCcsIGFkZHJlc3MpCgllbmQKZW5kCgpmdW5jdGlvbiBzZWN1cml0eS5hbGxvd2xpc3REZWwoYWRkcmVzcykKCWlmIGZpbHRlci5hbGxvd2xpc3RfZGVsKGFkZHJlc3MpIHRoZW4KCQlicm9hZGNhc3RGaWx0ZXJVcGRhdGUoJ2FsbG93JywgJ2RlbCcsIGFkZHJlc3MpCgllbmQKZW5kCgpmdW5jdGlvbiBzZWN1cml0eS5kZW55bGlzdERlbChhZGRyZXNzKQoJaWYgZmlsdGVyLmRlbnlsaXN0X2RlbChhZGRyZXNzKSB0aGVuCgkJYnJvYWRjYXN0RmlsdGVyVXBkYXRlKCdkZW55JywgJ2RlbCcsIGFkZHJlc3MpCgllbmQKZW5kCgpmdW5jdGlvbiBzZWN1cml0eS5hbGxvd2xpc3RTeW5jKCkKCWZpbHRlci5hbGxvd2xpc3Rfc3luY2goKQplbmQKCmZ1bmN0aW9uIHNlY3VyaXR5LmRlbnlsaXN0U3luYygpCglmaWx0ZXIuZGVueWxpc3Rfc3luY2goKQplbmQKCmZ1bmN0aW9uIHNlY3VyaXR5LnNldFByZWZlck1hbnVhbCh2YWx1ZSkKCXByZWZlck1hbnVhbFByb3BlcnR5OnNldCh2YWx1ZSkKZW5kCmpvYi5saXZlZGF0YS5zdWJzY3JpYmUocHJlZmVyTWFudWFsUHJvcGVydHksIGZ1bmN0aW9uKHZhbHVlKQoJYnJvYWRjYXN0U2V0dGluZygncHJlZmVyX21hbnVhbCcsIHZhbHVlKQplbmQpCgpmdW5jdGlvbiBzZWN1cml0eS5zZXRBZHZhbmNlZERpYWwodmFsdWUpCglhZHZhbmNlZERpYWxQcm9wZXJ0eTpzZXQodmFsdWUpCmVuZApqb2IubGl2ZWRhdGEuc3Vic2NyaWJlKGFkdmFuY2VkRGlhbFByb3BlcnR5LCBmdW5jdGlvbih2YWx1ZSkKCWJyb2FkY2FzdFNldHRpbmcoJ2FkdmFuY2VkX2RpYWwnLCB2YWx1ZSkKZW5kKQoKZnVuY3Rpb24gc2VjdXJpdHkuc2V0QXV0b0lyaXModmFsdWUpCglhdXRvSXJpc1Byb3BlcnR5OnNldCh2YWx1ZSkKZW5kCmpvYi5saXZlZGF0YS5zdWJzY3JpYmUoYXV0b0lyaXNQcm9wZXJ0eSwgZnVuY3Rpb24odmFsdWUpCglicm9hZGNhc3RTZXR0aW5nKCdhdXRvX2lyaXMnLCB2YWx1ZSkKZW5kKQoKZnVuY3Rpb24gc2VjdXJpdHkuc2V0QXV0b0Nsb3NlKHZhbHVlKQoJYXV0b0Nsb3NlUHJvcGVydHk6c2V0KHZhbHVlKQplbmQKam9iLmxpdmVkYXRhLnN1YnNjcmliZShhdXRvQ2xvc2VQcm9wZXJ0eSwgZnVuY3Rpb24odmFsdWUpCglicm9hZGNhc3RTZXR0aW5nKCdhdXRvX2Nsb3NlJywgdmFsdWUpCmVuZCkKCmZ1bmN0aW9uIHNlY3VyaXR5LnNldElyaXNQcm90ZWN0KHZhbHVlKQoJaXJpc1Byb3RlY3RQcm9wZXJ0eTpzZXQodmFsdWUpCmVuZApqb2IubGl2ZWRhdGEuc3Vic2NyaWJlKGlyaXNQcm90ZWN0UHJvcGVydHksIGZ1bmN0aW9uKHZhbHVlKQoJYnJvYWRjYXN0U2V0dGluZygnaXJpc19wcm90ZWN0JywgdmFsdWUpCmVuZCkKCmZ1bmN0aW9uIHNlY3VyaXR5LnNldE5vS2F3b29zaCh2YWx1ZSkKCW5vS2F3b29zaFByb3BlcnR5OnNldCh2YWx1ZSkKZW5kCmpvYi5saXZlZGF0YS5zdWJzY3JpYmUobm9LYXdvb3NoUHJvcGVydHksIGZ1bmN0aW9uKHZhbHVlKQoJYnJvYWRjYXN0U2V0dGluZygnbm9fa2F3b29zaCcsIHZhbHVlKQplbmQpCgpmdW5jdGlvbiBzZWN1cml0eS5zZXRFbmFibGVBdWRpdCh2YWx1ZSkKCWVuYWJsZUF1ZGl0UHJvcGVydHk6c2V0KHZhbHVlKQplbmQKam9iLmxpdmVkYXRhLnN1YnNjcmliZShlbmFibGVBdWRpdFByb3BlcnR5LCBmdW5jdGlvbih2YWx1ZSkKCWJyb2FkY2FzdFNldHRpbmcoJ2VuYWJsZV9hdWRpdCcsIHZhbHVlKQplbmQpCgpmdW5jdGlvbiBzZWN1cml0eS5vcGVuSXJpcygpCglpZiBpcmlzUHJvcGVydHkudmFsdWUgdGhlbgoJCXN0YXJnYXRlLm9wZW5JcmlzKCkKCWVuZAplbmQKCmZ1bmN0aW9uIHNlY3VyaXR5LmNsb3NlSXJpcygpCglpZiBpcmlzUHJvcGVydHkudmFsdWUgdGhlbgoJCXN0YXJnYXRlLmNsb3NlSXJpcygpCgllbmQKZW5kCgpmdW5jdGlvbiBzZWN1cml0eS50YWlsKHNraXAsIHNpemUpCglyZXR1cm4gYXVkaXQudGFpbChza2lwLCBzaXplKQplbmQKCmZ1bmN0aW9uIHNlY3VyaXR5LmhlYWQoc2tpcCwgc2l6ZSkKCXJldHVybiBhdWRpdC5oZWFkKHNraXAsIHNpemUpCmVuZAoKZnVuY3Rpb24gc2VjdXJpdHkuZXJhc2Uoc2l6ZSkKCXJldHVybiBhdWRpdC5lcmFzZShzaXplKQplbmQKCmF1ZGl0LmRlZmluZSgnd29ybWhvbGUnLCB7ICdkaXJlY3Rpb24nLCAnYWRkcmVzcycgfSkKYXVkaXQuZGVmaW5lKCd0cmF2ZWwnLCB7ICdkaXJlY3Rpb24nLCAndHlwZScsICduYW1lJywgJ3V1aWQnLCAnZGVzdHJveWVkJyB9KQoKam9iLmxpdmVkYXRhLmRldGVybWluZXMoZW5hYmxlQXVkaXRQcm9wZXJ0eSwgZnVuY3Rpb24oKQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQl3aGlsZSB0cnVlIGRvCgkJCWxvY2FsIF8sIF8sIGFkZHJlc3MgPSBvcy5wdWxsRXZlbnQoJ3N0YXJnYXRlX2luY29taW5nX3dvcm1ob2xlJykKCQkJbG9jYWwgcmVjb3JkID0gewoJCQkJZGlyZWN0aW9uID0gJ2luY29taW5nJzsKCQkJCWFkZHJlc3MgPSBhZGRyZXNzIGFuZCBzdGFyZ2F0ZS5hZGRyZXNzVG9TdHJpbmcoYWRkcmVzcykgb3IgIiIKCQkJfQoJCQlzYXZlQXVkaXRFdmVudCgnd29ybWhvbGUnLCByZWNvcmQpCgkJZW5kCgllbmQpCglqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJbG9jYWwgXywgXywgYWRkcmVzcyA9IG9zLnB1bGxFdmVudCgnc3RhcmdhdGVfb3V0Z29pbmdfd29ybWhvbGUnKQoJCQlsb2NhbCByZWNvcmQgPSB7CgkJCQlkaXJlY3Rpb24gPSAnb3V0Z29pbmcnOwoJCQkJYWRkcmVzcyA9IGFkZHJlc3MgYW5kIHN0YXJnYXRlLmFkZHJlc3NUb1N0cmluZyhhZGRyZXNzKSBvciAiIgoJCQl9CgkJCXNhdmVBdWRpdEV2ZW50KCd3b3JtaG9sZScsIHJlY29yZCkKCQllbmQKCWVuZCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJd2hpbGUgdHJ1ZSBkbwoJCQlsb2NhbCBfLCBfLCB0eXBlLCBuYW1lLCB1dWlkLCBkZXN0cm95ZWQgPSBvcy5wdWxsRXZlbnQoJ3N0YXJnYXRlX2RlY29uc3RydWN0aW5nX2VudGl0eScpCgkJCWxvY2FsIHJlY29yZCA9IHsKCQkJCWRpcmVjdGlvbiA9ICdvdXRnb2luZyc7CgkJCQl0eXBlID0gdHlwZTsKCQkJCW5hbWUgPSBuYW1lOwoJCQkJdXVpZCA9IHV1aWQ7CgkJCQlkZXN0cm95ZWQgPSB0b3N0cmluZyhkZXN0cm95ZWQpOwoJCQl9CgkJCXNhdmVBdWRpdEV2ZW50KCd0cmF2ZWwnLCByZWNvcmQpCgkJZW5kCgllbmQpCglqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJbG9jYWwgXywgXywgdHlwZSwgbmFtZSwgdXVpZCA9IG9zLnB1bGxFdmVudCgnc3RhcmdhdGVfcmVjb25zdHJ1Y3RpbmdfZW50aXR5JykKCQkJbG9jYWwgcmVjb3JkID0gewoJCQkJZGlyZWN0aW9uID0gJ2luY29taW5nJzsKCQkJCXR5cGUgPSB0eXBlOwoJCQkJbmFtZSA9IG5hbWU7CgkJCQl1dWlkID0gdXVpZDsKCQkJCWRlc3Ryb3llZCA9ICdmYWxzZSc7CgkJCX0KCQkJc2F2ZUF1ZGl0RXZlbnQoJ3RyYXZlbCcsIHJlY29yZCkKCQllbmQKCWVuZCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJbG9jYWwgXywgXywgdHlwZSwgbmFtZSwgdXVpZCA9IG9zLnB1bGxFdmVudCgnaXJpc190aHVkJykKCQlsb2NhbCByZWNvcmQgPSB7CgkJCWRpcmVjdGlvbiA9ICdpbmNvbWluZyc7CgkJCXR5cGUgPSB0eXBlOwoJCQluYW1lID0gbmFtZTsKCQkJdXVpZCA9IHV1aWQ7CgkJCWRlc3Ryb3llZCA9ICd0cnVlJzsKCQl9CgkJc2F2ZUF1ZGl0RXZlbnQoJ3RyYXZlbCcsIHJlY29yZCkKCWVuZCkKZW5kKQoKam9iLmxpdmVkYXRhLnN1YnNjcmliZShkaXNjb3ZlcnlFdmVudEJyb2FkY2FzdExhdGNoLCBmdW5jdGlvbih2YWx1ZSkKCWlmIHZhbHVlIHRoZW4KCQlzbGVlcCgpCgkJYnJvYWRjYXN0X3B1YmxpYyB7CgkJCXR5cGUgPSAnZGlzY292ZXInOwoJCQlkYXRhID0gZGlzY292ZXJ5TWVzc2FnZVByb3BlcnR5LnZhbHVlOwoJCX0KCQlkaXNjb3ZlcnlFdmVudEJyb2FkY2FzdExhdGNoOnNldChmYWxzZSkKCWVuZAplbmQpCgpqb2IuYXN5bmMoZnVuY3Rpb24oKQoJd2hpbGUgdHJ1ZSBkbwoJCWxvY2FsIF8sIF8sIG1lc3NhZ2UgPSBvcy5wdWxsRXZlbnQoJ3N0YXJnYXRlX21lc3NhZ2VfcmVjZWl2ZWQnKQoJCWpvYi5hc3luYyhmdW5jdGlvbiAoKQoJCQlicm9hZGNhc3RfcHVibGljIHsKCQkJCXR5cGUgPSAnbWVzc2FnZSc7CgkJCQlkYXRhID0gbWVzc2FnZTsKCQkJfQoJCWVuZCkKCWVuZAplbmQpCgpkbwoJbG9jYWwgY29tbWFuZHMgPSBycGMuc2ltcGxlX2NvbW1hbmRzKGhhbmRsZXJzKQoJZm9yIF8sIG1vZGVtIGluIGlwYWlycyhtb2RlbXMpIGRvCgkJcnBjLnNlcnZlcl9uZXR3b3JrKGNvbW1hbmRzLCBtb2RlbSwgQ0hBTk5FTF9DT01NQU5EKSAtLSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CgkJcnBjLnNlcnZlcl9uZXR3b3JrKGNvbW1hbmRzLCBtb2RlbSwgQ0hBTk5FTF9DT01NQU5ELCBpZCkKCWVuZAplbmQKCmRvCglsb2NhbCBjb21tYW5kcyA9IHJwYy5zaW1wbGVfY29tbWFuZHMoc2VjdXJpdHkpCglmb3IgXywgbW9kZW0gaW4gaXBhaXJzKG1vZGVtcykgZG8KCQlpZiBpc1dpcmVkTW9kZW0obW9kZW0pIHRoZW4KCQkJcnBjLnNlcnZlcl9uZXR3b3JrKGNvbW1hbmRzLCBtb2RlbSwgU0VDVVJJVFlfQ09NTUFORCkKCQllbmQKCWVuZAplbmQKCmxvY2FsIGZ1bmN0aW9uIHN0YXJnYXRlTWVzc2FnZUV4Y2hhbmdlcihoYW5kbGVyKQoJbG9jYWwgXywgXywgbWVzc2FnZSA9IG9zLnB1bGxFdmVudCgnc3RhcmdhdGVfbWVzc2FnZV9yZWNlaXZlZCcpCglsb2NhbCByZXF1ZXN0ID0gdGV4dHV0aWxzLnVuc2VyaWFsaXplKG1lc3NhZ2UpCglpZiByZXF1ZXN0IHRoZW4KCQlsb2NhbCByZXNwb25zZSA9IGhhbmRsZXIocmVxdWVzdCkKCQlpZiByZXNwb25zZSB0aGVuCgkJCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJCQlzdGFyZ2F0ZS5zZW5kU3RhcmdhdGVNZXNzYWdlKHRvc3RyaW5nKGNvbnRhaW5lci5kYXR1bShyZXNwb25zZSwgdHJ1ZSkpKQoJCQllbmQpCgkJZW5kCgllbmQKZW5kCgpycGMuc2VydmVyKHJwYy5zaW1wbGVfY29tbWFuZHMob3RoZXJzaWRlKSwgc3RhcmdhdGVNZXNzYWdlRXhjaGFuZ2VyKQoKam9iLmxpdmVkYXRhLnN1YnNjcmliZShlbmFibGVBdWRpdFByb3BlcnR5LCBmdW5jdGlvbih2YWx1ZSkKCXNldHRpbmdzLnNldCgiZW5hYmxlQXVkaXQiLCB2YWx1ZSkKCXNldHRpbmdzLnNhdmUoKQplbmQpCgpqb2IubGl2ZWRhdGEuc3Vic2NyaWJlKHByZWZlck1hbnVhbFByb3BlcnR5LCBmdW5jdGlvbih2YWx1ZSkKCXNldHRpbmdzLnNldCgicHJlZmVyTWFudWFsIiwgdmFsdWUpCglzZXR0aW5ncy5zYXZlKCkKZW5kKQoKam9iLmxpdmVkYXRhLnN1YnNjcmliZShhZHZhbmNlZERpYWxQcm9wZXJ0eSwgZnVuY3Rpb24odmFsdWUpCglzZXR0aW5ncy5zZXQoInBzZy5hZHZhbmNlZERpYWwiLCB2YWx1ZSkKCXNldHRpbmdzLnNhdmUoKQplbmQpCgpqb2IubGl2ZWRhdGEuc3Vic2NyaWJlKGF1dG9JcmlzUHJvcGVydHksIGZ1bmN0aW9uKHZhbHVlKQoJc2V0dGluZ3Muc2V0KCJhdXRvSXJpcyIsIHZhbHVlKQoJc2V0dGluZ3Muc2F2ZSgpCmVuZCkKCmpvYi5saXZlZGF0YS5zdWJzY3JpYmUoYXV0b0Nsb3NlUHJvcGVydHksIGZ1bmN0aW9uKHZhbHVlKQoJc2V0dGluZ3Muc2V0KCJwc2cuYXV0b0Nsb3NlIiwgdmFsdWUpCglzZXR0aW5ncy5zYXZlKCkKZW5kKQoKam9iLmxpdmVkYXRhLnN1YnNjcmliZShpcmlzUHJvdGVjdFByb3BlcnR5LCBmdW5jdGlvbih2YWx1ZSkKCXNldHRpbmdzLnNldCgicHNnLmlyaXNQcm90ZWN0IiwgdmFsdWUpCglzZXR0aW5ncy5zYXZlKCkKZW5kKQoKam9iLmxpdmVkYXRhLnN1YnNjcmliZShub0thd29vc2hQcm9wZXJ0eSwgZnVuY3Rpb24odmFsdWUpCglzZXR0aW5ncy5zZXQoInBzZy5ub0thd29vc2giLCB2YWx1ZSkKCXNldHRpbmdzLnNhdmUoKQplbmQpCgppZiBzdGFyZ2F0ZS5nZXRJcmlzIHRoZW4KCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJd2hpbGUgdHJ1ZSBkbwoJCQlvcy5wdWxsRXZlbnQoJ2lyaXNfdGh1ZCcpCgkJCWlyaXNEdXJhYmlsaXR5UHJvcGVydHk6c2V0KGlyaXNEdXJhYmlsaXR5UHJvcGVydHkudmFsdWUgLSAxKQoJCQltSXJpc1RodWQgPSBtSXJpc1RodWQgKyAxCgkJCWxvY2FsIGlyaXNQcm90ZWN0ID0gaXJpc1Byb3RlY3RQcm9wZXJ0eS52YWx1ZQoJCQlpZiBpcmlzUHJvdGVjdCB+PSAwIGFuZCBpcmlzUHJvdGVjdCA8PSBtSXJpc1RodWQgdGhlbgoJCQkJc3RhcmdhdGUuZGlzY29ubmVjdFN0YXJnYXRlKCkKCQkJZW5kCgkJZW5kCgllbmQpCgoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQl3aGlsZSB0cnVlIGRvCgkJCXNsZWVwKDEpCgkJCWlyaXNQcm9wZXJ0eTpzZXQoc3RhcmdhdGUuZ2V0SXJpcygpKQoJCQlpcmlzRHVyYWJpbGl0eVByb3BlcnR5OnNldChzdGFyZ2F0ZS5nZXRJcmlzRHVyYWJpbGl0eSgpKQoJCQlpcmlzTWF4RHVyYWJpbGl0eVByb3BlcnR5OnNldChzdGFyZ2F0ZS5nZXRJcmlzTWF4RHVyYWJpbGl0eSgpKQoJCWVuZAoJZW5kKQoKCWpvYi5saXZlZGF0YS5zdWJzY3JpYmUoaXJpc0R1cmFiaWxpdHlQcm9wZXJ0eSwgZnVuY3Rpb24oZHVyYWJpbGl5KQoJCWlmIGR1cmFiaWxpeSA9PSAwIHRoZW4KCQkJaXJpc01heER1cmFiaWxpdHlQcm9wZXJ0eTpzZXQoMCkKCQkJaXJpc1Byb3BlcnR5OnNldChuaWwpCgkJZW5kCgllbmQpCgoJbG9jYWwgaXJpc1N0YXRlUHJvcGVydHkgPSBqb2IubGl2ZWRhdGEuY29tYmluZShmdW5jdGlvbihpcmlzLCBkdXJhYmlsaXR5LCBtYXhEdXJhYmlsaXR5KQoJCXJldHVybiB7CgkJCWlyaXMgPSBpcmlzOwoJCQlkdXJhYmlsaXR5ID0gZHVyYWJpbGl0eTsKCQkJbWF4RHVyYWJpbGl0eSA9IG1heER1cmFiaWxpdHk7CgkJfQoJZW5kLCBpcmlzUHJvcGVydHksIGlyaXNEdXJhYmlsaXR5UHJvcGVydHksIGlyaXNNYXhEdXJhYmlsaXR5UHJvcGVydHkpCgoJam9iLmxpdmVkYXRhLnN1YnNjcmliZShpcmlzU3RhdGVQcm9wZXJ0eSwgZnVuY3Rpb24oaXJpc1N0YXRlKQoJCWJyb2FkY2FzdFNldHRpbmcoJ2lyaXMnLCBpcmlzU3RhdGUpCgllbmQpCmVuZAoKaWYgbm90IHJhbmRvbS5pc0luaXQoKSB0aGVuCglyYW5kb20uaW5pdFdpdGhUaW1pbmcoKQplbmQKCnNldHRpbmdzLnNhdmUoKQoKcHJpbnQoIlN0YXJnYXRlIFNlcnZlciAoU0dTKSIsIHZlcnNpb24pCgplbmQpCg=="
  73. return load(base64.decode(entrypoint), "@/"..shell.getRunningProgram(), 't', _ENV)(...)
  74. ]]):gsub("<$<", "[["):gsub(">$>", "]]")
  75. local entrypoint = base64.decode "cHJpbnQoIkluc3RhbGxpbmcgU0dTLi4uIikKcHJpbnQoIkNoZWNraW5nIHBlcmlwaGVyYWxzLi4uIikKaWYgbm90IChwZXJpcGhlcmFsLmZpbmQgImFkdmFuY2VkX2NyeXN0YWxfaW50ZXJmYWNlIiBvciBwZXJpcGhlcmFsLmZpbmQgImNyeXN0YWxfaW50ZXJmYWNlIiBvciBwZXJpcGhlcmFsLmZpbmQgImJhc2ljX2ludGVyZmFjZSIpIHRoZW4KCXByaW50KCJTdGFyZ2F0ZSBpbnRlcmZhY2Ugbm90IGZvdW5kISIpCgl0eXBlWSgpCmVuZAppZiBub3QgcGVyaXBoZXJhbC5maW5kKCJtb2RlbSIpIHRoZW4KCXByaW50KCJNb2RlbSBub3QgZm91bmQhIikKCXR5cGVZKCkKZW5kCnByaW50KCJQZXJpcGhlcmFscyBPSyIpCgp3cml0ZSgiTmFtZSBjdXJyZW50IHNvbGFyIHN5c3RlbTogIikKbG9jYWwgc29sYXJTeXN0ZW0gPSByZWFkKG5pbCwgbmlsLCBuaWwsIHNldHRpbmdzLmdldCgic29sYXJTeXN0ZW0iLCAic2dqb3VybmV5OnRlcnJhIikpCgpsb2NhbCBvbGRHYWxheGllcyA9IHNldHRpbmdzLmdldCgiZ2FsYXhpZXMiLCB7InNnam91cm5leTptaWxreV93YXkifSkKbG9jYWwgZ2FsYXhpZXMgPSB7fQoKcHJpbnQoIlBsZWFzZSwgZW50ZXIgbmFtZXMgb2YgZ2FsYXhpZXMgd2hlcmUgdGhlIHN0YXJnYXRlIGlzIGxvY2F0ZWQgYXQgKGVtcHR5IGlucHV0IG1lYW5zIGVuZCBvZiBsaXN0KSIpCndoaWxlIHRydWUgZG8KCWxvY2FsIG4gPSAjZ2FsYXhpZXMgKyAxCgl3cml0ZSgiTmFtZSBnYWxheHkgIyIuLm4uLiI6ICIpCglsb2NhbCBnYWxheHkgPSByZWFkKG5pbCwgbmlsLCBuaWwsIG9sZEdhbGF4aWVzW25dKQoJaWYgZ2FsYXh5ID09ICIiIHRoZW4gYnJlYWsgZW5kCgl0YWJsZS5pbnNlcnQoZ2FsYXhpZXMsIGdhbGF4eSkKZW5kCgpsb2NhbCBBRERSRVNTX1BBVFRFUk4gPSAoIiglZCspLiIpOnJlcCg3KS4uIiglZCspIgoKbG9jYWwgZnVuY3Rpb24gYWRkcjJzdHIoYWRkcmVzcykKCXJldHVybiAnLScuLnRhYmxlLmNvbmNhdChhZGRyZXNzLCAnLScpLi4nLScKZW5kCmxvY2FsIGxvY2FsQWRkcmVzcywgbG9jYWxBZGRyZXNzU3RyaW5nCmxvY2FsQWRkcmVzcyA9IHNldHRpbmdzLmdldCgicHNnLmxvY2FsQWRkcmVzcyIpCmlmIGxvY2FsQWRkcmVzcyB0aGVuCglsb2NhbEFkZHJlc3NTdHJpbmcgPSBhZGRyMnN0cihsb2NhbEFkZHJlc3MpCmVuZApwcmludCgiWW91IGNhbiBzcGVjaWZ5IGxvY2FsIGFkZHJlc3MgKHJlYWwgb3IgZmFrZSkiKQp3aGlsZSB0cnVlIGRvCgl3cml0ZSgiTG9jYWwgYWRkcmVzczogIikKCWxvY2FsQWRkcmVzc1N0cmluZyA9IHJlYWQobmlsLCBuaWwsIG5pbCwgbG9jYWxBZGRyZXNzU3RyaW5nKQoJaWYgbG9jYWxBZGRyZXNzU3RyaW5nID09ICIiIHRoZW4KCQlwcmludCgiTm8gbG9jYWwgYWRkcmVzcyBzcGVjaWZpZWQiKQoJCWxvY2FsQWRkcmVzcyA9IG5pbAoJCWJyZWFrCgllbmQKCWxvY2FsIGFkZHJlc3MgPSB7IGxvY2FsQWRkcmVzc1N0cmluZzptYXRjaChBRERSRVNTX1BBVFRFUk4pIH0KCWlmICNhZGRyZXNzID4gMCB0aGVuCgkJbG9jYWxBZGRyZXNzID0gYWRkcmVzcwoJCXByaW50KCJTZXR0aW5nIGxvY2FsIGFkZHJlc3MuLi4iKQoJCWJyZWFrCgllbHNlCgkJcHJpbnQoIkludmFsaWQgYWRkcmVzcywgcGxlYXNlIHJldHJ5IikKCWVuZAplbmQKCnByaW50KCJEbyB5b3UgcHJlZmVyIG1hbnVhbCBkaWFsaW5nPyAoZW50ZXIgJ3llcycgaWYgc28pIikKbG9jYWwgcHJlZmVyTWFudWFsID0gcmVhZChuaWwsIG5pbCwgbmlsLCBzZXR0aW5ncy5nZXQoInByZWZlck1hbnVhbCIsIGZhbHNlKSBhbmQgInllcyIgb3IgIm5vIikKCnByaW50KCJNb2RpZnlpbmcgY29uZmlndXJhdGlvbiBmaWxlLi4uIikKc2V0dGluZ3Muc2V0KCJzb2xhclN5c3RlbSIsIHNvbGFyU3lzdGVtKQpzZXR0aW5ncy5zZXQoImdhbGF4aWVzIiwgZ2FsYXhpZXMpCmlmIGxvY2FsQWRkcmVzcyB0aGVuCglzZXR0aW5ncy5zZXQoInBzZy5sb2NhbEFkZHJlc3MiLCBsb2NhbEFkZHJlc3MpCmVsc2UKCXNldHRpbmdzLnVuc2V0KCJwc2cubG9jYWxBZGRyZXNzIikKZW5kCnNldHRpbmdzLnNldCgicHJlZmVyTWFudWFsIiwgcHJlZmVyTWFudWFsID09ICJ5ZXMiIG9yIHByZWZlck1hbnVhbCA9PSAieSIpCnNldHRpbmdzLnNhdmUoKQpwcmludCgiQ29uZmlndXJhdGlvbiBPSyIpCgpwcmludCgiVW5wYWNraW5nIGZpbGVzLi4uIikKc2F2ZUV4dHJhKCJkaWFsaW5nLmRmcHdtIikKc2F2ZUV4dHJhKCJvZmZ3b3JsZC5kZnB3bSIpCnNhdmVQcm9ncmFtKCJzdGFydHVwLmx1YSIpCgpwcmludCgiRmlsZXMgdW5wYWNrZWQhIikKcHJpbnQoIlJlc3RhcnRpbmcuLi4iKQoKc2hlbGwuZXhlY3V0ZSAncmVib290Jwo="
  76. return load(entrypoint, "@[included]/installer.lua", 't', _ENV)(...)
  77.  
Comments
Add Comment
Please, Sign In to add comment