From 0eb2789a2d66256b3d1503d5c0fc5e0236b837bb Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 30 Jan 2019 16:13:44 -0800 Subject: [PATCH] Improve mat4:set; Ended up removing the diagonal variant, sorry holo. --- src/api/graphics.c | 18 +- src/api/math.h | 2 +- src/api/math.lua | 62 ++++- src/api/math.lua.h | 622 +++++++++++++++++++++++------------------- src/api/types/mat4.c | 16 +- src/api/types/mesh.c | 2 +- src/api/types/model.c | 2 +- 7 files changed, 415 insertions(+), 309 deletions(-) diff --git a/src/api/graphics.c b/src/api/graphics.c index 71dcb8c2..7f1cb87a 100644 --- a/src/api/graphics.c +++ b/src/api/graphics.c @@ -643,14 +643,14 @@ static int l_lovrGraphicsScale(lua_State* L) { static int l_lovrGraphicsTransform(lua_State* L) { float transform[16]; - luax_readmat4(L, 1, transform, 3, NULL); + luax_readmat4(L, 1, transform, 3); lovrGraphicsMatrixTransform(transform); return 0; } static int l_lovrGraphicsSetProjection(lua_State* L) { float transform[16]; - luax_readmat4(L, 1, transform, 3, NULL); + luax_readmat4(L, 1, transform, 3); lovrGraphicsSetProjection(transform); return 0; } @@ -755,7 +755,7 @@ static int l_lovrGraphicsPlane(lua_State* L) { style = luaL_checkoption(L, 1, NULL, DrawStyles); } float transform[16]; - luax_readmat4(L, 2, transform, 2, NULL); + luax_readmat4(L, 2, transform, 2); lovrGraphicsPlane(style, material, transform); return 0; } @@ -769,7 +769,7 @@ static int luax_rectangularprism(lua_State* L, int scaleComponents) { style = luaL_checkoption(L, 1, NULL, DrawStyles); } float transform[16]; - luax_readmat4(L, 2, transform, scaleComponents, NULL); + luax_readmat4(L, 2, transform, scaleComponents); lovrGraphicsBox(style, material, transform); return 0; } @@ -796,7 +796,7 @@ static int l_lovrGraphicsArc(lua_State* L) { mode = luaL_checkoption(L, index++, NULL, ArcModes); } float transform[16]; - index = luax_readmat4(L, index, transform, 1, NULL); + index = luax_readmat4(L, index, transform, 1); float r1 = luax_optfloat(L, index++, 0.f); float r2 = luax_optfloat(L, index++, 2.f * M_PI); int segments = luaL_optinteger(L, index, 64) * (MIN(fabsf(r2 - r1), 2 * M_PI) / (2 * M_PI)); @@ -813,7 +813,7 @@ static int l_lovrGraphicsCircle(lua_State* L) { style = luaL_checkoption(L, 1, NULL, DrawStyles); } float transform[16]; - int index = luax_readmat4(L, 2, transform, 1, NULL); + int index = luax_readmat4(L, 2, transform, 1); int segments = luaL_optinteger(L, index, 32); lovrGraphicsCircle(style, material, transform, segments); return 0; @@ -823,7 +823,7 @@ static int l_lovrGraphicsCylinder(lua_State* L) { float transform[16]; int index = 1; Material* material = lua_isuserdata(L, index) ? luax_checktype(L, index++, Material) : NULL; - index = luax_readmat4(L, index, transform, 1, NULL); + index = luax_readmat4(L, index, transform, 1); float r1 = luax_optfloat(L, index++, 1.f); float r2 = luax_optfloat(L, index++, 1.f); bool capped = lua_isnoneornil(L, index) ? true : lua_toboolean(L, index++); @@ -836,7 +836,7 @@ static int l_lovrGraphicsSphere(lua_State* L) { float transform[16]; int index = 1; Material* material = lua_isuserdata(L, index) ? luax_checktype(L, index++, Material) : NULL; - index = luax_readmat4(L, index, transform, 1, NULL); + index = luax_readmat4(L, index, transform, 1); int segments = luaL_optinteger(L, index, 30); lovrGraphicsSphere(material, transform, segments); return 0; @@ -856,7 +856,7 @@ static int l_lovrGraphicsPrint(lua_State* L) { size_t length; const char* str = luaL_checklstring(L, 1, &length); float transform[16]; - int index = luax_readmat4(L, 2, transform, 1, NULL); + int index = luax_readmat4(L, 2, transform, 1); float wrap = luax_optfloat(L, index++, 0.f); HorizontalAlign halign = luaL_checkoption(L, index++, "center", HorizontalAligns); VerticalAlign valign = luaL_checkoption(L, index++, "middle", VerticalAligns); diff --git a/src/api/math.h b/src/api/math.h index 28cbba97..2b3f5065 100644 --- a/src/api/math.h +++ b/src/api/math.h @@ -8,7 +8,7 @@ float* luax_checkmathtype(lua_State* L, int index, MathType type, const char* ex int luax_readvec3(lua_State* L, int index, vec3 v, const char* expected); int luax_readscale(lua_State* L, int index, vec3 v, int components, const char* expected); int luax_readquat(lua_State* L, int index, quat q, const char* expected); -int luax_readmat4(lua_State* L, int index, mat4 m, int scaleComponents, const char* expected); +int luax_readmat4(lua_State* L, int index, mat4 m, int scaleComponents); Seed luax_checkrandomseed(lua_State* L, int index); int l_lovrRandomGeneratorRandom(lua_State* L); int l_lovrRandomGeneratorRandomNormal(lua_State* L); diff --git a/src/api/math.lua b/src/api/math.lua index f07200d2..27fc84f9 100644 --- a/src/api/math.lua +++ b/src/api/math.lua @@ -349,19 +349,57 @@ ffi.metatype(mat4, { m.m[12], m.m[13], m.m[14], m.m[15] end, - set = function(m, x, ...) - checkmat4(m) - if not x then - m:identity() - elseif not ... and type(x) == 'number' then - m.m[0], m.m[5], m.m[10], m.m[15] = x, x, x, x - elseif ... then - m.m[0], m.m[1], m.m[2], m.m[3], - m.m[4], m.m[5], m.m[6], m.m[7], - m.m[8], m.m[9], m.m[10], m.m[11], - m.m[12], m.m[13], m.m[14], m.m[15] = x, ... + set = function(M, ...) + checkmat4(M) + + if ... == nil then + return C.mat4_identity(M) end - return m + + if select('#', ...) >= 16 then + M.m[0] , M.m[1] , M.m[2] , M.m[3], + M.m[4] , M.m[5] , M.m[6] , M.m[7], + M.m[8] , M.m[9] , M.m[10], M.m[11], + M.m[12], M.m[13], M.m[14], M.m[15] = ... + return M + end + + if istype(mat4, ...) then + return C.mat4_set(M, ...) + end + + local i = 1 + C.mat4_identity(M) + + -- Position + local x, y, z = ... + if istype(vec3, x) then + M.m[12], M.m[13], M.m[14] = x.x, x.y, x.z + i = i + 1 + else + assert(type(x) == 'number' and type(y) == 'number' and type(z) == 'number', 'Expected position as 3 numbers or a vec3') + M.m[12], M.m[13], M.m[14] = x, y, z + i = i + 3 + end + + -- Scale + local sx, sy, sz = select(i, ...) + if istype(vec3, sx) then + sx, sy, sz = sx.x, sx.y, sx.z + i = i + 1 + else + i = i + 3 + end + + -- Rotate + local angle, ax, ay, az = select(i, ...) + if istype(quat, angle) then + C.mat4_rotateQuat(M, angle) + else + C.mat4_rotate(M, angle, ax, ay, az) + end + + return C.mat4_scale(M, sx, sy, sz) end, save = function(m) diff --git a/src/api/math.lua.h b/src/api/math.lua.h index 2224e92c..8320d927 100644 --- a/src/api/math.lua.h +++ b/src/api/math.lua.h @@ -768,292 +768,362 @@ unsigned char math_lua[] = { 0x6d, 0x2e, 0x6d, 0x5b, 0x31, 0x35, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, - 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x78, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, - 0x3a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x28, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, - 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x2e, - 0x6d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x35, 0x5d, - 0x2c, 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x31, 0x30, 0x5d, 0x2c, 0x20, 0x6d, - 0x2e, 0x6d, 0x5b, 0x31, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x78, 0x2c, 0x20, - 0x78, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x2e, 0x2e, 0x2e, + 0x28, 0x4d, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, + 0x28, 0x4d, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6d, 0x2e, - 0x6d, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x32, 0x5d, - 0x2c, 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x33, 0x5d, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x34, 0x5d, - 0x2c, 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x6d, 0x2e, - 0x6d, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x37, 0x5d, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x2e, - 0x6d, 0x5b, 0x38, 0x5d, 0x2c, 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x39, 0x5d, - 0x2c, 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x31, 0x30, 0x5d, 0x2c, 0x20, 0x6d, - 0x2e, 0x6d, 0x5b, 0x31, 0x31, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x31, 0x32, 0x5d, 0x2c, - 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x31, 0x33, 0x5d, 0x2c, 0x20, 0x6d, 0x2e, - 0x6d, 0x5b, 0x31, 0x34, 0x5d, 0x2c, 0x20, 0x6d, 0x2e, 0x6d, 0x5b, 0x31, - 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x78, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x73, 0x61, 0x76, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, - 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x29, - 0x3a, 0x73, 0x65, 0x74, 0x28, 0x6d, 0x3a, 0x75, 0x6e, 0x70, 0x61, 0x63, - 0x6b, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, + 0x61, 0x74, 0x34, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x28, 0x4d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x23, 0x27, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x31, 0x36, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4d, 0x2e, 0x6d, 0x5b, 0x30, 0x5d, 0x20, 0x2c, 0x20, 0x4d, 0x2e, 0x6d, + 0x5b, 0x31, 0x5d, 0x20, 0x2c, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, 0x32, 0x5d, + 0x20, 0x2c, 0x20, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, 0x33, 0x5d, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, + 0x34, 0x5d, 0x20, 0x2c, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, 0x35, 0x5d, 0x20, + 0x2c, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, 0x36, 0x5d, 0x20, 0x2c, 0x20, 0x20, + 0x4d, 0x2e, 0x6d, 0x5b, 0x37, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, 0x38, 0x5d, 0x20, 0x2c, + 0x20, 0x4d, 0x2e, 0x6d, 0x5b, 0x39, 0x5d, 0x20, 0x2c, 0x20, 0x4d, 0x2e, + 0x6d, 0x5b, 0x31, 0x30, 0x5d, 0x2c, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, 0x31, + 0x31, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4d, 0x2e, 0x6d, 0x5b, 0x31, 0x32, 0x5d, 0x2c, 0x20, 0x4d, 0x2e, 0x6d, + 0x5b, 0x31, 0x33, 0x5d, 0x2c, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, 0x31, 0x34, + 0x5d, 0x2c, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, 0x31, 0x35, 0x5d, 0x20, 0x3d, + 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x73, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x6d, 0x61, 0x74, 0x34, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, + 0x74, 0x34, 0x5f, 0x73, 0x65, 0x74, 0x28, 0x4d, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x28, 0x4d, 0x29, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x20, + 0x3d, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x69, 0x73, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x65, + 0x63, 0x33, 0x2c, 0x20, 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, + 0x31, 0x32, 0x5d, 0x2c, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, 0x31, 0x33, 0x5d, + 0x2c, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, 0x31, 0x34, 0x5d, 0x20, 0x3d, 0x20, + 0x78, 0x2e, 0x78, 0x2c, 0x20, 0x78, 0x2e, 0x79, 0x2c, 0x20, 0x78, 0x2e, + 0x7a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x79, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x7a, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x27, 0x2c, 0x20, 0x27, 0x45, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x73, 0x20, 0x33, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x76, 0x65, 0x63, 0x33, + 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4d, + 0x2e, 0x6d, 0x5b, 0x31, 0x32, 0x5d, 0x2c, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, + 0x31, 0x33, 0x5d, 0x2c, 0x20, 0x4d, 0x2e, 0x6d, 0x5b, 0x31, 0x34, 0x5d, + 0x20, 0x3d, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, + 0x20, 0x2b, 0x20, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, + 0x20, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x78, 0x2c, 0x20, 0x73, + 0x79, 0x2c, 0x20, 0x73, 0x7a, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x28, 0x69, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x73, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x76, 0x65, 0x63, 0x33, 0x2c, 0x20, 0x73, 0x78, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x78, 0x2c, 0x20, 0x73, 0x79, 0x2c, 0x20, 0x73, 0x7a, + 0x20, 0x3d, 0x20, 0x73, 0x78, 0x2e, 0x78, 0x2c, 0x20, 0x73, 0x78, 0x2e, + 0x79, 0x2c, 0x20, 0x73, 0x78, 0x2e, 0x7a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, + 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x69, 0x20, 0x2b, 0x20, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6e, + 0x67, 0x6c, 0x65, 0x2c, 0x20, 0x61, 0x78, 0x2c, 0x20, 0x61, 0x79, 0x2c, + 0x20, 0x61, 0x7a, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x28, 0x69, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x73, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x71, 0x75, 0x61, 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x67, 0x6c, 0x65, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x72, 0x6f, + 0x74, 0x61, 0x74, 0x65, 0x51, 0x75, 0x61, 0x74, 0x28, 0x4d, 0x2c, 0x20, + 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x72, 0x6f, 0x74, + 0x61, 0x74, 0x65, 0x28, 0x4d, 0x2c, 0x20, 0x61, 0x6e, 0x67, 0x6c, 0x65, + 0x2c, 0x20, 0x61, 0x78, 0x2c, 0x20, 0x61, 0x79, 0x2c, 0x20, 0x61, 0x7a, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, - 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x69, - 0x6e, 0x76, 0x65, 0x72, 0x74, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x66, + 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x28, 0x4d, 0x2c, 0x20, 0x73, 0x78, 0x2c, 0x20, 0x73, 0x79, + 0x2c, 0x20, 0x73, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x61, 0x76, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, + 0x61, 0x74, 0x34, 0x28, 0x29, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x6d, 0x3a, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, - 0x34, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x28, - 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, - 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, - 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, - 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, - 0x74, 0x65, 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, - 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x76, 0x65, 0x63, 0x33, 0x28, 0x78, 0x2c, 0x20, 0x31, - 0x2c, 0x20, 0x27, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6f, 0x72, 0x20, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, - 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, - 0x61, 0x74, 0x65, 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x2e, 0x78, 0x2c, 0x20, - 0x78, 0x2e, 0x79, 0x2c, 0x20, 0x78, 0x2e, 0x7a, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x6f, - 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x61, 0x6e, 0x67, 0x6c, 0x65, - 0x2c, 0x20, 0x61, 0x78, 0x2c, 0x20, 0x61, 0x79, 0x2c, 0x20, 0x61, 0x7a, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, - 0x6e, 0x67, 0x6c, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x72, 0x6f, 0x74, - 0x61, 0x74, 0x65, 0x28, 0x6d, 0x2c, 0x20, 0x61, 0x6e, 0x67, 0x6c, 0x65, - 0x2c, 0x20, 0x61, 0x78, 0x2c, 0x20, 0x61, 0x79, 0x2c, 0x20, 0x61, 0x7a, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, - 0x63, 0x6b, 0x71, 0x75, 0x61, 0x74, 0x28, 0x61, 0x6e, 0x67, 0x6c, 0x65, - 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x27, 0x71, 0x75, 0x61, 0x74, 0x20, 0x6f, - 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x72, 0x6f, 0x74, - 0x61, 0x74, 0x65, 0x51, 0x75, 0x61, 0x74, 0x28, 0x6d, 0x2c, 0x20, 0x61, - 0x6e, 0x67, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, - 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, - 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, - 0x2c, 0x20, 0x73, 0x78, 0x2c, 0x20, 0x73, 0x79, 0x2c, 0x20, 0x73, 0x7a, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, - 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, - 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, - 0x6d, 0x2c, 0x20, 0x73, 0x78, 0x2c, 0x20, 0x73, 0x79, 0x20, 0x6f, 0x72, - 0x20, 0x73, 0x78, 0x2c, 0x20, 0x73, 0x7a, 0x20, 0x6f, 0x72, 0x20, 0x73, - 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x76, 0x65, 0x63, 0x33, 0x28, 0x73, 0x78, 0x2c, 0x20, - 0x31, 0x2c, 0x20, 0x27, 0x76, 0x65, 0x63, 0x33, 0x20, 0x6f, 0x72, 0x20, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, - 0x28, 0x6d, 0x2c, 0x20, 0x73, 0x78, 0x2e, 0x78, 0x2c, 0x20, 0x73, 0x78, - 0x2e, 0x79, 0x2c, 0x20, 0x73, 0x78, 0x2e, 0x7a, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x75, - 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x29, + 0x34, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x28, 0x6d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x73, 0x74, 0x79, 0x70, 0x65, 0x28, - 0x6d, 0x61, 0x74, 0x34, 0x2c, 0x20, 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x28, 0x6d, 0x2c, 0x20, - 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, - 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, - 0x65, 0x77, 0x28, 0x27, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5b, 0x33, 0x5d, - 0x27, 0x2c, 0x20, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x2c, 0x20, 0x79, - 0x20, 0x6f, 0x72, 0x20, 0x30, 0x2c, 0x20, 0x7a, 0x20, 0x6f, 0x72, 0x20, - 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, - 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x6f, 0x72, 0x6d, 0x28, 0x6d, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x30, - 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x66, 0x20, 0x2b, - 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x5b, 0x30, 0x5d, 0x2c, - 0x20, 0x66, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x32, 0x5d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x76, 0x65, 0x63, 0x33, 0x28, 0x78, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x27, - 0x6d, 0x61, 0x74, 0x34, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x33, 0x2c, 0x20, - 0x6f, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x2e, 0x6d, 0x61, - 0x74, 0x34, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, - 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x2e, 0x5f, 0x70, 0x20, 0x2b, 0x20, 0x30, - 0x2c, 0x20, 0x78, 0x2e, 0x5f, 0x70, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, - 0x78, 0x2e, 0x5f, 0x70, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x6f, 0x72, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x28, 0x27, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x5b, 0x31, 0x30, 0x5d, 0x27, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x67, - 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, - 0x6d, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x30, 0x2c, 0x20, 0x66, 0x20, - 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x32, 0x2c, 0x20, - 0x66, 0x20, 0x2b, 0x20, 0x33, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x34, - 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x35, 0x2c, 0x20, 0x66, 0x20, 0x2b, - 0x20, 0x36, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x37, 0x2c, 0x20, 0x66, - 0x20, 0x2b, 0x20, 0x38, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x39, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x66, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x31, 0x5d, - 0x2c, 0x20, 0x66, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x33, 0x5d, - 0x2c, 0x20, 0x66, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x35, 0x5d, - 0x2c, 0x20, 0x66, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x37, 0x5d, - 0x2c, 0x20, 0x66, 0x5b, 0x38, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x39, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x6f, 0x72, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, - 0x7a, 0x2c, 0x20, 0x73, 0x78, 0x2c, 0x20, 0x73, 0x79, 0x2c, 0x20, 0x73, - 0x7a, 0x2c, 0x20, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2c, 0x20, 0x61, 0x78, - 0x2c, 0x20, 0x61, 0x79, 0x2c, 0x20, 0x61, 0x7a, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, - 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, - 0x5f, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, - 0x6d, 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x2c, - 0x20, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x2c, 0x20, 0x7a, 0x20, 0x6f, - 0x72, 0x20, 0x30, 0x2c, 0x20, 0x73, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x31, - 0x2c, 0x20, 0x73, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x78, 0x20, 0x6f, - 0x72, 0x20, 0x31, 0x2c, 0x20, 0x73, 0x7a, 0x20, 0x6f, 0x72, 0x20, 0x73, - 0x78, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x2c, 0x20, 0x61, 0x6e, 0x67, 0x6c, - 0x65, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x2c, 0x20, 0x61, 0x78, 0x20, 0x6f, - 0x72, 0x20, 0x30, 0x2c, 0x20, 0x61, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x31, - 0x2c, 0x20, 0x61, 0x7a, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, - 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, - 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x73, 0x74, 0x79, 0x70, - 0x65, 0x28, 0x76, 0x65, 0x63, 0x33, 0x2c, 0x20, 0x78, 0x29, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x20, - 0x3d, 0x20, 0x78, 0x2e, 0x78, 0x2c, 0x20, 0x78, 0x2e, 0x79, 0x2c, 0x20, - 0x78, 0x2e, 0x7a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, - 0x6e, 0x65, 0x77, 0x28, 0x27, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5b, 0x33, - 0x5d, 0x27, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, - 0x34, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, - 0x6d, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x30, 0x2c, 0x20, 0x66, 0x20, - 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x66, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x31, 0x5d, 0x2c, - 0x20, 0x66, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x65, 0x72, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x6e, 0x65, - 0x61, 0x72, 0x2c, 0x20, 0x66, 0x61, 0x72, 0x2c, 0x20, 0x66, 0x6f, 0x76, - 0x2c, 0x20, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, - 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, - 0x5f, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x28, 0x6d, 0x2c, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x66, 0x61, - 0x72, 0x2c, 0x20, 0x66, 0x6f, 0x76, 0x2c, 0x20, 0x61, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, - 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x72, 0x74, 0x68, 0x6f, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x6c, 0x65, 0x66, - 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x74, 0x6f, - 0x70, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x2c, 0x20, 0x6e, - 0x65, 0x61, 0x72, 0x2c, 0x20, 0x66, 0x61, 0x72, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, - 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, - 0x5f, 0x6f, 0x72, 0x74, 0x68, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, - 0x63, 0x28, 0x6d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, - 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x62, - 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x2c, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x2c, - 0x20, 0x66, 0x61, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, - 0x6d, 0x75, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, + 0x61, 0x74, 0x34, 0x5f, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x28, 0x6d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x73, 0x65, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x2c, + 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, - 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, - 0x69, 0x73, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x2c, - 0x20, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x6d, 0x2c, 0x20, 0x78, + 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x76, 0x65, 0x63, 0x33, + 0x28, 0x78, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x27, 0x76, 0x65, 0x63, 0x33, + 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x6d, 0x2c, 0x20, + 0x78, 0x2e, 0x78, 0x2c, 0x20, 0x78, 0x2e, 0x79, 0x2c, 0x20, 0x78, 0x2e, + 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, + 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2c, 0x20, 0x61, 0x78, 0x2c, 0x20, 0x61, + 0x79, 0x2c, 0x20, 0x61, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, + 0x34, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x28, 0x6d, 0x2c, 0x20, + 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2c, 0x20, 0x61, 0x78, 0x2c, 0x20, 0x61, + 0x79, 0x2c, 0x20, 0x61, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x71, 0x75, 0x61, 0x74, 0x28, + 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x27, 0x71, + 0x75, 0x61, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, + 0x34, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x51, 0x75, 0x61, 0x74, + 0x28, 0x6d, 0x2c, 0x20, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x73, 0x78, 0x2c, 0x20, 0x73, + 0x79, 0x2c, 0x20, 0x73, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x73, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x28, 0x6d, 0x2c, 0x20, 0x73, 0x78, 0x2c, 0x20, + 0x73, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x78, 0x2c, 0x20, 0x73, 0x7a, + 0x20, 0x6f, 0x72, 0x20, 0x73, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x76, 0x65, 0x63, 0x33, + 0x28, 0x73, 0x78, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x27, 0x76, 0x65, 0x63, + 0x33, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x6d, 0x2c, 0x20, 0x73, 0x78, 0x2e, + 0x78, 0x2c, 0x20, 0x73, 0x78, 0x2e, 0x79, 0x2c, 0x20, 0x73, 0x78, 0x2e, + 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6d, 0x75, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x2c, 0x20, + 0x79, 0x2c, 0x20, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x73, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x61, 0x74, 0x34, 0x2c, 0x20, 0x78, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x79, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x28, - 0x6d, 0x29, 0x2c, 0x20, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6e, 0x2c, 0x20, 0x32, - 0x2c, 0x20, 0x27, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x72, 0x20, 0x76, - 0x65, 0x63, 0x33, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x79, 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x28, 0x27, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x5b, 0x33, 0x5d, 0x27, 0x2c, 0x20, 0x78, 0x20, 0x6f, 0x72, + 0x20, 0x30, 0x2c, 0x20, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x2c, 0x20, + 0x7a, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x6d, 0x2c, 0x20, + 0x66, 0x20, 0x2b, 0x20, 0x30, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x31, + 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x31, 0x5d, 0x2c, 0x20, + 0x66, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x76, 0x65, 0x63, 0x33, 0x28, 0x78, 0x2c, + 0x20, 0x32, 0x2c, 0x20, 0x27, 0x6d, 0x61, 0x74, 0x34, 0x2c, 0x20, 0x76, + 0x65, 0x63, 0x33, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x2e, 0x5f, + 0x70, 0x20, 0x2b, 0x20, 0x30, 0x2c, 0x20, 0x78, 0x2e, 0x5f, 0x70, 0x20, + 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x78, 0x2e, 0x5f, 0x70, 0x20, 0x2b, 0x20, + 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, + 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, - 0x77, 0x28, 0x27, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5b, 0x33, 0x5d, 0x27, - 0x2c, 0x20, 0x6e, 0x2e, 0x78, 0x2c, 0x20, 0x6e, 0x2e, 0x79, 0x2c, 0x20, - 0x6e, 0x2e, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, - 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x6f, 0x72, 0x6d, 0x28, 0x6d, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x30, - 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x66, 0x20, 0x2b, - 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x76, 0x65, - 0x63, 0x33, 0x28, 0x66, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x31, - 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, - 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x27, 0x6d, 0x61, 0x74, 0x34, 0x27, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x7d, 0x29, 0x0a + 0x77, 0x28, 0x27, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5b, 0x31, 0x30, 0x5d, + 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x2e, 0x6d, + 0x61, 0x74, 0x34, 0x5f, 0x67, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x6d, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, + 0x30, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x66, 0x20, + 0x2b, 0x20, 0x32, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x33, 0x2c, 0x20, + 0x66, 0x20, 0x2b, 0x20, 0x34, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x35, + 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x36, 0x2c, 0x20, 0x66, 0x20, 0x2b, + 0x20, 0x37, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x38, 0x2c, 0x20, 0x66, + 0x20, 0x2b, 0x20, 0x39, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x5b, 0x30, 0x5d, 0x2c, + 0x20, 0x66, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x32, 0x5d, 0x2c, + 0x20, 0x66, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x34, 0x5d, 0x2c, + 0x20, 0x66, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x36, 0x5d, 0x2c, + 0x20, 0x66, 0x5b, 0x37, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x38, 0x5d, 0x2c, + 0x20, 0x66, 0x5b, 0x39, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x78, + 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x2c, 0x20, 0x73, 0x78, 0x2c, 0x20, + 0x73, 0x79, 0x2c, 0x20, 0x73, 0x7a, 0x2c, 0x20, 0x61, 0x6e, 0x67, 0x6c, + 0x65, 0x2c, 0x20, 0x61, 0x78, 0x2c, 0x20, 0x61, 0x79, 0x2c, 0x20, 0x61, + 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, + 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x6d, 0x2c, 0x20, 0x78, 0x20, + 0x6f, 0x72, 0x20, 0x30, 0x2c, 0x20, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x30, + 0x2c, 0x20, 0x7a, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x2c, 0x20, 0x73, 0x78, + 0x20, 0x6f, 0x72, 0x20, 0x31, 0x2c, 0x20, 0x73, 0x79, 0x20, 0x6f, 0x72, + 0x20, 0x73, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x2c, 0x20, 0x73, 0x7a, + 0x20, 0x6f, 0x72, 0x20, 0x73, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x2c, + 0x20, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x2c, + 0x20, 0x61, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x2c, 0x20, 0x61, 0x79, + 0x20, 0x6f, 0x72, 0x20, 0x31, 0x2c, 0x20, 0x61, 0x7a, 0x20, 0x6f, 0x72, + 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x78, + 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, + 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x69, 0x73, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x65, 0x63, 0x33, 0x2c, + 0x20, 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x78, 0x2c, 0x20, + 0x79, 0x2c, 0x20, 0x7a, 0x20, 0x3d, 0x20, 0x78, 0x2e, 0x78, 0x2c, 0x20, + 0x78, 0x2e, 0x79, 0x2c, 0x20, 0x78, 0x2e, 0x7a, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x28, 0x27, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x5b, 0x33, 0x5d, 0x27, 0x2c, 0x20, 0x78, 0x2c, 0x20, + 0x79, 0x2c, 0x20, 0x7a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x6d, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, + 0x30, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x66, 0x20, + 0x2b, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x5b, 0x30, 0x5d, 0x2c, 0x20, + 0x66, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x32, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6d, 0x2c, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x66, 0x61, 0x72, + 0x2c, 0x20, 0x66, 0x6f, 0x76, 0x2c, 0x20, 0x61, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, + 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x28, 0x6d, 0x2c, 0x20, 0x6e, 0x65, 0x61, + 0x72, 0x2c, 0x20, 0x66, 0x61, 0x72, 0x2c, 0x20, 0x66, 0x6f, 0x76, 0x2c, + 0x20, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, + 0x72, 0x74, 0x68, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, + 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x2c, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x66, 0x61, + 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, + 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x6f, 0x72, 0x74, 0x68, 0x6f, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x28, 0x6d, 0x2c, 0x20, 0x6c, 0x65, + 0x66, 0x74, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x74, + 0x6f, 0x70, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x2c, 0x20, + 0x6e, 0x65, 0x61, 0x72, 0x2c, 0x20, 0x66, 0x61, 0x72, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x7d, 0x2c, 0x0a, + 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x6d, 0x75, 0x6c, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x6e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6d, + 0x61, 0x74, 0x34, 0x28, 0x6d, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x73, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6d, 0x61, 0x74, 0x34, 0x2c, 0x20, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, + 0x6d, 0x61, 0x74, 0x34, 0x28, 0x6d, 0x29, 0x2c, 0x20, 0x6e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x76, 0x65, 0x63, 0x33, + 0x28, 0x6e, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x27, 0x6d, 0x61, 0x74, 0x34, + 0x20, 0x6f, 0x72, 0x20, 0x76, 0x65, 0x63, 0x33, 0x27, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x28, 0x27, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x5b, 0x33, 0x5d, 0x27, 0x2c, 0x20, 0x6e, 0x2e, 0x78, 0x2c, 0x20, + 0x6e, 0x2e, 0x79, 0x2c, 0x20, 0x6e, 0x2e, 0x7a, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x43, 0x2e, 0x6d, 0x61, 0x74, 0x34, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x6d, 0x2c, 0x20, + 0x66, 0x20, 0x2b, 0x20, 0x30, 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x31, + 0x2c, 0x20, 0x66, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, + 0x74, 0x68, 0x2e, 0x76, 0x65, 0x63, 0x33, 0x28, 0x66, 0x5b, 0x30, 0x5d, + 0x2c, 0x20, 0x66, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x66, 0x5b, 0x32, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6d, 0x61, 0x74, + 0x34, 0x27, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x7d, 0x29, 0x0a }; -unsigned int math_lua_len = 12667; +unsigned int math_lua_len = 13512; diff --git a/src/api/types/mat4.c b/src/api/types/mat4.c index 63506360..3a602901 100644 --- a/src/api/types/mat4.c +++ b/src/api/types/mat4.c @@ -3,7 +3,7 @@ #include "math/math.h" #include "lib/math.h" -int luax_readmat4(lua_State* L, int index, mat4 m, int scaleComponents, const char* expected) { +int luax_readmat4(lua_State* L, int index, mat4 m, int scaleComponents) { switch (lua_type(L, index)) { case LUA_TNIL: case LUA_TNONE: @@ -45,14 +45,12 @@ static int l_lovrMat4Unpack(lua_State* L) { int l_lovrMat4Set(lua_State* L) { mat4 m = luax_checkmathtype(L, 1, MATH_MAT4, NULL); - switch (lua_gettop(L)) { - case 1: mat4_identity(m); break; - case 2: m[0] = m[5] = m[10] = m[15] = luax_checkfloat(L, 2); break; - default: - for (int i = 0; i < 16; i++) { - m[i] = luax_checkfloat(L, i + 2); - } - break; + if (lua_gettop(L) >= 17) { + for (int i = 2; i <= 17; i++) { + *m++ = luaL_checknumber(L, i); + } + } else { + luax_readmat4(L, 2, m, 3); } lua_settop(L, 1); return 1; diff --git a/src/api/types/mesh.c b/src/api/types/mesh.c index b2972a49..d42f5cfe 100644 --- a/src/api/types/mesh.c +++ b/src/api/types/mesh.c @@ -74,7 +74,7 @@ int l_lovrMeshDetachAttributes(lua_State* L) { int l_lovrMeshDraw(lua_State* L) { Mesh* mesh = luax_checktype(L, 1, Mesh); float transform[16]; - int index = luax_readmat4(L, 2, transform, 1, NULL); + int index = luax_readmat4(L, 2, transform, 1); int instances = luaL_optinteger(L, index, 1); uint32_t vertexCount = lovrMeshGetVertexCount(mesh); uint32_t indexCount = lovrMeshGetIndexCount(mesh); diff --git a/src/api/types/model.c b/src/api/types/model.c index 775a4591..fcec6342 100644 --- a/src/api/types/model.c +++ b/src/api/types/model.c @@ -5,7 +5,7 @@ int l_lovrModelDraw(lua_State* L) { Model* model = luax_checktype(L, 1, Model); float transform[16]; - int index = luax_readmat4(L, 2, transform, 1, NULL); + int index = luax_readmat4(L, 2, transform, 1); int instances = luaL_optinteger(L, index, 1); lovrModelDraw(model, transform, instances); return 0;