local t=math.pow local f=math.sin local h=math.cos local x=math.pi local g=math.sqrt local W=math.abs local a=math.asin local function U(t,f,h,x)return(h*t)/x+f end local function T(f,h,x,g)f=f/g return x*t(f,2)+h end local function v(t,f,h,x)t=t/x return(-h*t)*(t-2)+f end local function J(f,h,x,g)f=(f/g)*2 if f<1 then return(x/2)*t(f,2)+h else return(-x/2)*((f-1)*(f-3)-1)+h end end local function E(t,f,h,x)if t<x/2 then return v(t*2,f,h/2,x)else return T(t*2-x,f+h/2,h/2,x)end end local function k(f,h,x,g)f=f/g return x*t(f,3)+h end local function i(f,h,x,g)f=f/g-1 return x*(t(f,3)+1)+h end local function b(t,f,h,x)t=(t/x)*2 if t<1 then return(((h/2)*t)*t)*t+f else t=t-2 return(h/2)*((t*t)*t+2)+f end end local function I(t,f,h,x)if t<x/2 then return i(t*2,f,h/2,x)else return k(t*2-x,f+h/2,h/2,x)end end local function m(f,h,x,g)f=f/g return x*t(f,4)+h end local function o(f,h,x,g)f=f/g-1 return-x*(t(f,4)-1)+h end local function d(f,h,x,g)f=(f/g)*2 if f<1 then return(x/2)*t(f,4)+h else f=f-2 return(-x/2)*(t(f,4)-2)+h end end local function X(t,f,h,x)if t<x/2 then return o(t*2,f,h/2,x)else return m(t*2-x,f+h/2,h/2,x)end end local function w(f,h,x,g)f=f/g return x*t(f,5)+h end local function p(f,h,x,g)f=f/g-1 return x*(t(f,5)+1)+h end local function L(f,h,x,g)f=(f/g)*2 if f<1 then return(x/2)*t(f,5)+h else f=f-2 return(x/2)*(t(f,5)+2)+h end end local function O(t,f,h,x)if t<x/2 then return p(t*2,f,h/2,x)else return w(t*2-x,f+h/2,h/2,x)end end local function K(t,f,g,W)return(-g*h((t/W)*(x/2))+g)+f end local function q(t,h,g,W)return g*f((t/W)*(x/2))+h end local function l(t,f,g,W)return(-g/2)*(h((x*t)/W)-1)+f end local function Q(t,f,h,x)if t<x/2 then return q(t*2,f,h/2,x)else return K(t*2-x,f+h/2,h/2,x)end end local function Y(f,h,x,g)if f==0 then return h else return(x*t(2,10*(f/g-1))+h)-x*.001 end end local function D(f,h,x,g)if f==g then return h+x else return(x*1.001)*(-t(2,(-10*f)/g)+1)+h end end local function s(f,h,x,g)if f==0 then return h end if f==g then return h+x end f=(f/g)*2 if f<1 then return((x/2)*t(2,10*(f-1))+h)-x*.0005 else f=f-1 return((x/2)*1.0005)*(-t(2,-10*f)+2)+h end end local function M(t,f,h,x)if t<x/2 then return D(t*2,f,h/2,x)else return Y(t*2-x,f+h/2,h/2,x)end end local function F(f,h,x,W)f=f/W return-x*(g(1-t(f,2))-1)+h end local function P(f,h,x,W)f=f/W-1 return x*g(1-t(f,2))+h end local function c(t,f,h,x)t=(t/x)*2 if t<1 then return(-h/2)*(g(1-t*t)-1)+f else t=t-2 return(h/2)*(g(1-t*t)+1)+f end end local function A(t,f,h,x)if t<x/2 then return P(t*2,f,h/2,x)else return F(t*2-x,f+h/2,h/2,x)end end local function Z(h,g,U,T,v,J)if h==0 then return g end h=h/T if h==1 then return g+U end if not J then J=T*.3 end local E if not v or v<W(U)then v=U E=J/4 else E=(J/(2*x))*a(U/v)end h=h-1 return-((v*t(2,10*h))*f(((h*T-E)*(2*x))/J))+g end


local pow = math.pow
local sin = math.sin
local cos = math.cos
local pi = math.pi
local sqrt = math.sqrt
local abs = math.abs
local asin  = math.asin

local function linear(t, b, c, d)
	return c * t / d + b
end

local function inQuad(t, b, c, d)
	t = t / d
	return c * pow(t, 2) + b
end

local function outQuad(t, b, c, d)
	t = t / d
	return -c * t * (t - 2) + b
end

local function inOutQuad(t, b, c, d)
	t = t / d * 2
	if t < 1 then
		return c / 2 * pow(t, 2) + b
	else
		return -c / 2 * ((t - 1) * (t - 3) - 1) + b
	end
end

local function outInQuad(t, b, c, d)
	if t < d / 2 then
		return outQuad (t * 2, b, c / 2, d)
	else
		return inQuad((t * 2) - d, b + c / 2, c / 2, d)
	end
end

local function inCubic (t, b, c, d)
	t = t / d
	return c * pow(t, 3) + b
end

local function outCubic(t, b, c, d)
	t = t / d - 1
	return c * (pow(t, 3) + 1) + b
end

local function inOutCubic(t, b, c, d)
	t = t / d * 2
	if t < 1 then
		return c / 2 * t * t * t + b
	else
		t = t - 2
		return c / 2 * (t * t * t + 2) + b
	end
end

local function outInCubic(t, b, c, d)
	if t < d / 2 then
		return outCubic(t * 2, b, c / 2, d)
	else
		return inCubic((t * 2) - d, b + c / 2, c / 2, d)
	end
end

local function inQuart(t, b, c, d)
	t = t / d
	return c * pow(t, 4) + b
end

local function outQuart(t, b, c, d)
	t = t / d - 1
	return -c * (pow(t, 4) - 1) + b
end

local function inOutQuart(t, b, c, d)
	t = t / d * 2
	if t < 1 then
		return c / 2 * pow(t, 4) + b
	else
		t = t - 2
		return -c / 2 * (pow(t, 4) - 2) + b
	end
end

local function outInQuart(t, b, c, d)
	if t < d / 2 then
		return outQuart(t * 2, b, c / 2, d)
	else
		return inQuart((t * 2) - d, b + c / 2, c / 2, d)
	end
end

local function inQuint(t, b, c, d)
	t = t / d
	return c * pow(t, 5) + b
end

local function outQuint(t, b, c, d)
	t = t / d - 1
	return c * (pow(t, 5) + 1) + b
end

local function inOutQuint(t, b, c, d)
	t = t / d * 2
	if t < 1 then
		return c / 2 * pow(t, 5) + b
	else
		t = t - 2
		return c / 2 * (pow(t, 5) + 2) + b
	end
end

local function outInQuint(t, b, c, d)
	if t < d / 2 then
		return outQuint(t * 2, b, c / 2, d)
	else
		return inQuint((t * 2) - d, b + c / 2, c / 2, d)
	end
end

local function inSine(t, b, c, d)
	return -c * cos(t / d * (pi / 2)) + c + b
end

local function outSine(t, b, c, d)
	return c * sin(t / d * (pi / 2)) + b
end

local function inOutSine(t, b, c, d)
	return -c / 2 * (cos(pi * t / d) - 1) + b
end

local function outInSine(t, b, c, d)
	if t < d / 2 then
		return outSine(t * 2, b, c / 2, d)
	else
		return inSine((t * 2) -d, b + c / 2, c / 2, d)
	end
end

local function inExpo(t, b, c, d)
	if t == 0 then
		return b
	else
		return c * pow(2, 10 * (t / d - 1)) + b - c * 0.001
	end
end

local function outExpo(t, b, c, d)
	if t == d then
		return b + c
	else
		return c * 1.001 * (-pow(2, -10 * t / d) + 1) + b
	end
end

local function inOutExpo(t, b, c, d)
	if t == 0 then return b end
	if t == d then return b + c end
	t = t / d * 2
	if t < 1 then
		return c / 2 * pow(2, 10 * (t - 1)) + b - c * 0.0005
	else
		t = t - 1
		return c / 2 * 1.0005 * (-pow(2, -10 * t) + 2) + b
	end
end

local function outInExpo(t, b, c, d)
	if t < d / 2 then
		return outExpo(t * 2, b, c / 2, d)
	else
		return inExpo((t * 2) - d, b + c / 2, c / 2, d)
	end
end

local function inCirc(t, b, c, d)
	t = t / d
	return(-c * (sqrt(1 - pow(t, 2)) - 1) + b)
end

local function outCirc(t, b, c, d)
	t = t / d - 1
	return(c * sqrt(1 - pow(t, 2)) + b)
end

local function inOutCirc(t, b, c, d)
	t = t / d * 2
	if t < 1 then
		return -c / 2 * (sqrt(1 - t * t) - 1) + b
	else
		t = t - 2
		return c / 2 * (sqrt(1 - t * t) + 1) + b
	end
end

local function outInCirc(t, b, c, d)
	if t < d / 2 then
		return outCirc(t * 2, b, c / 2, d)
	else
		return inCirc((t * 2) - d, b + c / 2, c / 2, d)
	end
end

local function inElastic(t, b, c, d, a, p)
	if t == 0 then return b end

	t = t / d

	if t == 1  then return b + c end

	if not p then p = d * 0.3 end

	local s

	if not a or a < abs(c) then
		a = c
		s = p / 4
	else
		s = p / (2 * pi) * asin(c/a)
	end

	t = t - 1

	return -(a * pow(2, 10 * t) * sin((t * d - s) * (2 * pi) / p)) + b
end
