local I=math.pow local j=math.sin local b=math.cos local o=math.pi local u=math.sqrt local K=math.abs local t=math.asin local function z(I,j,b,o)return(b*I)/o+j end local function N(j,b,o,u)j=j/u return o*I(j,2)+b end local function D(I,j,b,o)I=I/o return(-b*I)*(I-2)+j end local function U(j,b,o,u)j=(j/u)*2 if j<1 then return(o/2)*I(j,2)+b else return(-o/2)*((j-1)*(j-3)-1)+b end end local function g(I,j,b,o)if I<o/2 then return D(I*2,j,b/2,o)else return N(I*2-o,j+b/2,b/2,o)end end local function V(j,b,o,u)j=j/u return o*I(j,3)+b end local function c(j,b,o,u)j=j/u-1 return o*(I(j,3)+1)+b end local function Z(I,j,b,o)I=(I/o)*2 if I<1 then return(((b/2)*I)*I)*I+j else I=I-2 return(b/2)*((I*I)*I+2)+j end end local function M(I,j,b,o)if I<o/2 then return c(I*2,j,b/2,o)else return V(I*2-o,j+b/2,b/2,o)end end local function Y(j,b,o,u)j=j/u return o*I(j,4)+b end local function F(j,b,o,u)j=j/u-1 return-o*(I(j,4)-1)+b end local function w(j,b,o,u)j=(j/u)*2 if j<1 then return(o/2)*I(j,4)+b else j=j-2 return(-o/2)*(I(j,4)-2)+b end end local function S(I,j,b,o)if I<o/2 then return F(I*2,j,b/2,o)else return Y(I*2-o,j+b/2,b/2,o)end end local function y(j,b,o,u)j=j/u return o*I(j,5)+b end local function m(j,b,o,u)j=j/u-1 return o*(I(j,5)+1)+b end local function i(j,b,o,u)j=(j/u)*2 if j<1 then return(o/2)*I(j,5)+b else j=j-2 return(o/2)*(I(j,5)+2)+b end end local function q(I,j,b,o)if I<o/2 then return m(I*2,j,b/2,o)else return y(I*2-o,j+b/2,b/2,o)end end local function e(I,j,u,K)return(-u*b((I/K)*(o/2))+u)+j end local function Q(I,b,u,K)return u*j((I/K)*(o/2))+b end local function r(I,j,u,K)return(-u/2)*(b((o*I)/K)-1)+j end local function a(I,j,b,o)if I<o/2 then return Q(I*2,j,b/2,o)else return e(I*2-o,j+b/2,b/2,o)end end local function O(j,b,o,u)if j==0 then return b else return(o*I(2,10*(j/u-1))+b)-o*.001 end end local function J(j,b,o,u)if j==u then return b+o else return(o*1.001)*(-I(2,(-10*j)/u)+1)+b end end local function n(j,b,o,u)if j==0 then return b end if j==u then return b+o end j=(j/u)*2 if j<1 then return((o/2)*I(2,10*(j-1))+b)-o*.0005 else j=j-1 return((o/2)*1.0005)*(-I(2,-10*j)+2)+b end end local function d(I,j,b,o)if I<o/2 then return J(I*2,j,b/2,o)else return O(I*2-o,j+b/2,b/2,o)end end local function C(j,b,o,K)j=j/K return-o*(u(1-I(j,2))-1)+b end local function H(j,b,o,K)j=j/K-1 return o*u(1-I(j,2))+b end local function P(I,j,b,o)I=(I/o)*2 if I<1 then return(-b/2)*(u(1-I*I)-1)+j else I=I-2 return(b/2)*(u(1-I*I)+1)+j end end local function E(I,j,b,o)if I<o/2 then return H(I*2,j,b/2,o)else return C(I*2-o,j+b/2,b/2,o)end end local function A(b,u,z,N,D,U)if b==0 then return u end b=b/N if b==1 then return u+z end if not U then U=N*.3 end local g if not D or D<K(z)then D=z g=U/4 else g=(U/(2*o))*t(z/D)end b=b-1 return-((D*I(2,10*b))*j(((b*N-g)*(2*o))/U))+u end
-- For all easing functions:
-- t = elapsed time
-- b = begin
-- c = change == ending - beginning
-- d = duration (total time)

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
