Advertisement
Guest User

Uncompressed

a guest
Aug 23rd, 2013
352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.72 KB | None | 0 0
  1. local i,h,b,m,l,d,e,y,r,w,u,v,l,l=assert,error,ipairs,pairs,tostring,type,setmetatable,io,math,table.sort,math.max,string.char,io.open,_G;local function p(n)local l={};local e=e({},l)function l:__index(l)local n=n(l);e[l]=n
  2.     return n
  3. end
  4. return e
  5. end
  6. local function l(n,l)l=l or 1
  7.     h({n},l+1)end
  8.     local function _(n)local l={}l.outbs=n
  9.         l.wnd={}l.wnd_pos=1
  10.         return l
  11.     end
  12.     local function t(l,e)local n=l.wnd_pos
  13.         l.outbs(e)l.wnd[n]=e
  14.         l.wnd_pos=n%32768+1
  15.     end
  16.     local function n(l)return i(l,'unexpected end of file')end
  17.     local function o(n,l)return n%(l+l)>=l
  18.     end
  19.     local a=p(function(l)return 2^l end)local c=e({},{__mode='k'})local function g(o)local l=1
  20.     local e={}function e:read()local n
  21.         if l<=#o then
  22.             n=o:byte(l)l=l+1
  23.         end
  24.         return n
  25.     end
  26.     return e
  27. end
  28. local l
  29. local function s(d)local n,l,o=0,0,{};function o:nbits_left_in_byte()return l
  30. end
  31. function o:read(e)e=e or 1
  32.     while l<e do
  33.         local e=d:read()if not e then return end
  34.         n=n+a[l]*e
  35.         l=l+8
  36.     end
  37.     local o=a[e]local a=n%o
  38.     n=(n-a)/o
  39.     l=l-e
  40.     return a
  41. end
  42. c[o]=true
  43. return o
  44. end
  45. local function f(l)return c[l]and l or s(g(l))end
  46. local function s(l)local n
  47.     if y.type(l)=='file'then
  48.         n=function(n)l:write(v(n))end
  49.     elseif d(l)=='function'then
  50.         n=l
  51.     end
  52.     return n
  53. end
  54. local function d(e,o)local l={}if o then
  55.     for e,n in m(e)do
  56.         if n~=0 then
  57.             l[#l+1]={val=e,nbits=n}end
  58.         end
  59.     else
  60.         for n=1,#e-2,2 do
  61.             local o,n,e=e[n],e[n+1],e[n+2]if n~=0 then
  62.             for e=o,e-1 do
  63.                 l[#l+1]={val=e,nbits=n}end
  64.             end
  65.         end
  66.     end
  67.     w(l,function(n,l)return n.nbits==l.nbits and n.val<l.val or n.nbits<l.nbits
  68.     end)local e=1
  69.     local o=0
  70.     for n,l in b(l)do
  71.         if l.nbits~=o then
  72.             e=e*a[l.nbits-o]o=l.nbits
  73.         end
  74.         l.code=e
  75.         e=e+1
  76.     end
  77.     local e=r.huge
  78.     local c={}for n,l in b(l)do
  79.     e=r.min(e,l.nbits)c[l.code]=l.val
  80. end
  81. local function o(n,e)local l=0
  82.     for e=1,e do
  83.         local e=n%2
  84.         n=(n-e)/2
  85.         l=l*2+e
  86.     end
  87.     return l
  88. end
  89. local d=p(function(l)return a[e]+o(l,e)end)function l:read(a)local o,l=1,0
  90. while 1 do
  91.     if l==0 then
  92.         o=d[n(a:read(e))]l=l+e
  93.     else
  94.         local n=n(a:read())l=l+1
  95.         o=o*2+n
  96.     end
  97.     local l=c[o]if l then
  98.     return l
  99. end
  100. end
  101. end
  102. return l
  103. end
  104. local function b(l)local a=2^1
  105.     local e=2^2
  106.     local c=2^3
  107.     local d=2^4
  108.     local n=l:read(8)local n=l:read(8)local n=l:read(8)local n=l:read(8)local t=l:read(32)local t=l:read(8)local t=l:read(8)if o(n,e)then
  109.     local n=l:read(16)local e=0
  110.     for n=1,n do
  111.         e=l:read(8)end
  112.     end
  113.     if o(n,c)then
  114.         while l:read(8)~=0 do end
  115.     end
  116.     if o(n,d)then
  117.         while l:read(8)~=0 do end
  118.     end
  119.     if o(n,a)then
  120.         l:read(16)end
  121.     end
  122.     local function p(l)local f=l:read(5)local i=l:read(5)local e=n(l:read(4))local a=e+4
  123.         local e={}local o={16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}for n=1,a do
  124.         local l=l:read(3)local n=o[n]e[n]=l
  125.     end
  126.     local e=d(e,true)local function r(o)local t={}local a
  127.         local c=0
  128.         while c<o do
  129.             local o=e:read(l)local e
  130.             if o<=15 then
  131.                 e=1
  132.                 a=o
  133.             elseif o==16 then
  134.                 e=3+n(l:read(2))elseif o==17 then
  135.                 e=3+n(l:read(3))a=0
  136.             elseif o==18 then
  137.                 e=11+n(l:read(7))a=0
  138.             else
  139.                 h'ASSERT'end
  140.                 for l=1,e do
  141.                     t[c]=a
  142.                     c=c+1
  143.                 end
  144.             end
  145.             local l=d(t,true)return l
  146.         end
  147.         local n=f+257
  148.         local l=i+1
  149.         local n=r(n)local l=r(l)return n,l
  150.     end
  151.     local a
  152.     local o
  153.     local c
  154.     local r
  155.     local function h(e,n,l,d)local l=l:read(e)if l<256 then
  156.         t(n,l)elseif l==256 then
  157.         return true
  158.     else
  159.         if not a then
  160.             local l={[257]=3}local e=1
  161.             for n=258,285,4 do
  162.                 for n=n,n+3 do l[n]=l[n-1]+e end
  163.                 if n~=258 then e=e*2 end
  164.             end
  165.             l[285]=258
  166.             a=l
  167.         end
  168.         if not o then
  169.             local l={}for e=257,285 do
  170.             local n=u(e-261,0)l[e]=(n-(n%4))/4
  171.         end
  172.         l[285]=0
  173.         o=l
  174.     end
  175.     local a=a[l]local l=o[l]local l=e:read(l)local o=a+l
  176.     if not c then
  177.         local e={[0]=1}local l=1
  178.         for n=1,29,2 do
  179.             for n=n,n+1 do e[n]=e[n-1]+l end
  180.             if n~=1 then l=l*2 end
  181.         end
  182.         c=e
  183.     end
  184.     if not r then
  185.         local n={}for e=0,29 do
  186.         local l=u(e-2,0)n[e]=(l-(l%2))/2
  187.     end
  188.     r=n
  189. end
  190. local l=d:read(e)local a=c[l]local l=r[l]local l=e:read(l)local l=a+l
  191. for e=1,o do
  192.     local l=(n.wnd_pos-1-l)%32768+1
  193.     t(n,i(n.wnd[l],'invalid distance'))end
  194. end
  195. return false
  196. end
  197. local function u(l,a)local i=l:read(1)local e=l:read(2)local r=0
  198.     local o=1
  199.     local c=2
  200.     local f=3
  201.     if e==r then
  202.         l:read(l:nbits_left_in_byte())local e=l:read(16)local o=n(l:read(16))for e=1,e do
  203.         local l=n(l:read(8))t(a,l)end
  204.     elseif e==o or e==c then
  205.         local n,o
  206.         if e==c then
  207.             n,o=p(l)else
  208.             n=d{0,8,144,9,256,7,280,8,288,nil}o=d{0,5,32,nil}end
  209.             repeat until h(l,a,n,o);end
  210.             return i~=0
  211.         end
  212.         local function e(l)local n,l=f(l.input),_(s(l.output))repeat until u(n,l)end
  213.         return function(n)local l=f(n.input)local n=s(n.output)b(l)e{input=l,output=n}l:read(l:nbits_left_in_byte())l:read()end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement