-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Данный скрипт не проверялся модераторами, так как является кряком приватной LUA и в нём может присутствовать обфускация. Даже известные пользователи могут выложить вредоносный скрипт под видом крякнутого, поэтому любое использование исключительно на свой страх и риск.
code_language.lua:
_DEBUG = true
--ffi
ffi.cdef[[
void* __stdcall URLDownloadToFileA(void* LPUNKNOWN, const char* LPCSTR, const char* LPCSTR2, int a, int LPBINDSTATUSCALLBACK);
bool DeleteUrlCacheEntryA(const char* lpszUrlName);
int GetProcAddress(void*, const char*);
void* GetModuleHandleA(const char*);
typedef void*(__cdecl* ShellExecute)(void*, const char*, const char*, const char*, const char*, int);
typedef struct {
uint8_t r;
uint8_t g;
uint8_t b;
uint8_t a;
} color_struct_t;
typedef void (*console_color_print)(const color_struct_t&, const char*, ...);
typedef void*(__thiscall* getnetchannel_t)(void*);
typedef void(__thiscall* settimeout_t)(void*, float, bool);
]]
local _ffi = {
new_char_arr = ffi.typeof("char[?]"),
vmt_entry = function(instance, index, type)
return ffi.cast(type, (ffi.cast("void***", instance)[0])[index])
end,
vmt_bind = function(self, module, interface, index, typestring)
local instance = utils.create_interface(module, interface)
local fnptr = self.vmt_entry(instance, index, ffi.typeof(typestring))
return function(...)
return fnptr(instance, ...)
end
end,
}
local console = {
color_print_fn = ffi.cast("console_color_print", ffi.C.GetProcAddress(ffi.C.GetModuleHandleA("tier0.dll"), "?ConColorMsg@@YAXABVColor@@PBDZZ")),
print = function(self, text, r, g, b, a)
local col = ffi.new("color_struct_t")
col.r, col.g, col.b, col.a = r, g, b, a
self.color_print_fn(col, text)
end
}
--json
local encode local escape_char_map = {["\\"] = "\\",['"'] = '"',["\b"] = "b",["\f"] = "f",["\n"] = "n",["\r"] = "r",["\t"] = "t"} local escape_char_map_inv = {["/"] = "/"} for k, v in pairs(escape_char_map) do escape_char_map_inv[v] = k end local function escape_char(c) return "\\" .. (escape_char_map[c] or string.format("u%04x", c:byte())) end local function encode_nil(val) return "null" end local function encode_table(val, stack) local res = {} stack = stack or {} if stack[val] then return end stack[val] = true if rawget(val, 1) ~= nil or next(val) == nil then local n = 0 for k in pairs(val) do if type(k) ~= "number" then return end n = n + 1 end if n ~= #val then return end for i, v in ipairs(val) do table.insert(res, encode(v, stack)) end stack[val] = nil return "[" .. table.concat(res, ",") .. "]" else for k, v in pairs(val) do if type(k) ~= "string" then return end table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) end stack[val] = nil return "{" .. table.concat(res, ",") .. "}" end end local function encode_string(val) return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' end local function encode_number(val) if val ~= val or val <= -math.huge or val >= math.huge then return end return string.format("%.14g", val) end local type_func_map = { ["nil"] = encode_nil, ["table"] = encode_table, ["string"] = encode_string, ["number"] = encode_number, ["boolean"] = tostring } encode = function(val, stack) local t = type(val) local f = type_func_map[t] if f then return f(val, stack) end return end local parse local function create_set(...) local res = {} for i = 1, select("#", ...) do res[select(i, ...)] = true end return res end local space_chars = create_set(" ", "\t", "\r", "\n") local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") local literals = create_set("true", "false", "null") local literal_map = {["true"] = true, ["false"] = false, ["null"] = nil} local function next_char(str, idx, set, negate) if idx == nil then return nil end for i = idx, #str do if set[str:sub(i, i)] ~= negate then return i end end return #str + 1 end local function decode_error(str, idx, msg) local line_count = 1 local col_count = 1 for i = 1, idx - 1 do col_count = col_count + 1 if str:sub(i, i) == "\n" then line_count = line_count + 1 col_count = 1 end end return end local function codepoint_to_utf8(n) local f = math.floor if n <= 0x7f then return string.char(n) elseif n <= 0x7ff then return string.char(f(n / 64) + 192, n % 64 + 128) elseif n <= 0xffff then return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128) elseif n <= 0x10ffff then return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, f(n % 4096 / 64) + 128, n % 64 + 128) end return end local function parse_unicode_escape(s) local n1 = tonumber(s:sub(1, 4), 16) local n2 = tonumber(s:sub(7, 10), 16) if n2 then return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) else return codepoint_to_utf8(n1) end end local function parse_string(str, i) local res = "" local j = i + 1 local k = j while j <= #str do local x = str:byte(j) if x < 32 then decode_error(str, j, "control character in string") elseif x == 92 then res = res .. str:sub(k, j - 1) j = j + 1 local c = str:sub(j, j) if c == "u" then local hex = str:match("^[dD][89aAbB]%x%x\\u%x%x%x%x", j + 1) or str:match("^%x%x%x%x", j + 1) or decode_error(str, j - 1, "invalid unicode escape in string") res = res .. parse_unicode_escape(hex) j = j + #hex else if not escape_chars[c] then decode_error(str, j - 1, "invalid escape char '" .. c .. "' in string") end res = res .. escape_char_map_inv[c] end k = j + 1 elseif x == 34 then res = res .. str:sub(k, j - 1) return res, j + 1 end j = j + 1 end decode_error(str, i, "expected closing quote for string") end local function parse_number(str, i) local x = next_char(str, i, delim_chars) local s = str:sub(i, x - 1) local n = tonumber(s) if not n then decode_error(str, i, "invalid number '" .. s .. "'") end return n, x end local function parse_literal(str, i) local x = next_char(str, i, delim_chars) local word = str:sub(i, x - 1) if not literals[word] then decode_error(str, i, "invalid literal '" .. word .. "'") end return literal_map[word], x end local function parse_array(str, i) local res = {} local n = 1 i = i + 1 while 1 do local x i = next_char(str, i, space_chars, true) if str:sub(i, i) == "]" then i = i + 1 break end x, i = parse(str, i) res[n] = x n = n + 1 i = next_char(str, i, space_chars, true) if type(i) ~= "number" then return end local chr = str:sub(i, i) i = i + 1 if chr == "]" then break end if chr ~= "," then decode_error(str, i, "expected ']' or ','") end end return res, i end local function parse_object(str, i) local res = {} i = i + 1 while 1 do local key, val i = next_char(str, i, space_chars, true) if i == nil then return end if str:sub(i, i) == "}" then i = i + 1 break end if str:sub(i, i) ~= '"' then decode_error(str, i, "expected string for key") end key, i = parse(str, i) i = next_char(str, i, space_chars, true) if i == nil then return end if str:sub(i, i) ~= ":" then decode_error(str, i, "expected ':' after key") end i = next_char(str, i + 1, space_chars, true) val, i = parse(str, i) res[key] = val i = next_char(str, i, space_chars, true) if type(i) ~= "number" then return end local chr = str:sub(i, i) i = i + 1 if chr == "}" then break end if chr ~= "," then decode_error(str, i, "expected '}' or ','") end end return res, i end local char_func_map = { ['"'] = parse_string, ["0"] = parse_number, ["1"] = parse_number, ["2"] = parse_number, ["3"] = parse_number, ["4"] = parse_number, ["5"] = parse_number, ["6"] = parse_number, ["7"] = parse_number, ["8"] = parse_number, ["9"] = parse_number, ["-"] = parse_number, ["t"] = parse_literal, ["f"] = parse_literal, ["n"] = parse_literal, ["["] = parse_array, ["{"] = parse_object } parse = function(str, idx) local chr = str:sub(idx, idx) local f = char_func_map[chr] if f then return f(str, idx) end decode_error(str, idx, "unexpected character '" .. chr .. "'") end
local COLOR_SYM_DEFAULT, COLOR_STRING_DEFAULT, COLOR_LITERAL_DEFAULT, COLOR_QUOTE_DEFAULT = {221, 221, 221}, {180, 230, 30}, {96, 160, 220}, {218, 230, 30}
local json = {
decode = function(str)
local res, idx = parse(str, next_char(str, 1, space_chars, true)) idx = next_char(str, idx, space_chars, true) if idx == nil then return nil end if idx <= #str then decode_error(str, idx, "trailing garbage") end
return res
end,
encoder = function(val)
return encode(val)
end,
encode = panorama.loadstring([[return JSON.stringify]])(),
stringify = function(json_text, line_feed, indent, ac)
json_text = tostring(json_text)
line_feed, indent, ac = tostring(line_feed or "\n"), tostring(indent or ""), tostring(ac or " ")
local i, j, k, n, r, p, q = 1, 0, 0, string.len(json_text), {}, nil, nil
local al = string.sub(ac, -1) == "\n"
for x = 1, n do
local c = string.sub(json_text, x, x)
if not q and (c == "{" or c == "[") then
r[i] = p == ":" and (c .. line_feed) or (string.rep(indent, j) .. c .. line_feed)
j = j + 1
elseif not q and (c == "}" or c == "]") then
j = j - 1
if p == "{" or p == "[" then
i = i - 1
r[i] = string.rep(indent, j) .. p .. c
else
r[i] = line_feed .. string.rep(indent, j) .. c
end
elseif not q and c == "," then
r[i] = c .. line_feed
k = -1
elseif not q and c == ":" then
r[i] = c .. ac
if al then
i = i + 1
r[i] = string.rep(indent, j)
end
else
if c == '"' and p ~= "\\" then
q = not q and true or nil
end
if j ~= k then
r[i] = string.rep(indent, j)
i, k = i + 1, j
end
r[i] = c
end
p, i = c, i + 1
end
return table.concat(r)
end,
highlight = function(json_text, color_sym, color_quote, color_string, color_literal)
color_sym, color_string, color_literal, color_quote =
color_sym or COLOR_SYM_DEFAULT,
color_string or COLOR_STRING_DEFAULT,
color_literal or COLOR_LITERAL_DEFAULT,
color_quote or COLOR_QUOTE_DEFAULT
json_text = tostring(json_text)
local i, n, result, prev, quote = 1, string.len(json_text), {}, nil, nil
local cur_clr, cur_text = color_sym, {}
for x = 1, n do
local c = string.sub(json_text, x, x)
local new_clr
if not quote and (c == "{" or c == "[") then
new_clr = color_sym
table.insert(cur_text, c)
elseif not quote and (c == "}" or c == "]") then
new_clr = color_sym
if prev == "{" or prev == "[" then
--table.insert(cur_text, table.concat(prev, c))
else
table.insert(cur_text, c)
end
elseif not quote and (c == "," or c == ":") then
new_clr = color_sym
table.insert(cur_text, c)
else
if c == '"' and prev ~= "\\" then
quote = not quote and true or nil
new_clr = color_quote
elseif cur_clr == color_quote then
new_clr = quote and color_string or color_literal
elseif cur_clr == color_sym and (c ~= " " and c ~= "\n" and c ~= "\t") then
new_clr = quote and color_string or color_literal
end
table.insert(cur_text, c)
end
if new_clr ~= nil and new_clr ~= cur_clr then
local new_text = {table.remove(cur_text, #cur_text)}
table.insert(result, {cur_clr[1], cur_clr[2], cur_clr[3], table.concat(cur_text)})
cur_clr, cur_text = new_clr, new_text
end
prev = c
end
if #cur_text > 0 then
table.insert(result, {cur_clr[1], cur_clr[2], cur_clr[3], table.concat(cur_text)})
end
return result
end,
print_highlighted = function(self, json_text, color_sym, color_quote, color_string, color_literal)
local highlighted = self.highlight(json_text, color_sym, color_string, color_literal, color_quote)
local count = #highlighted
for i = 1, count do
local r, g, b, str = unpack(highlighted[i])
console:print(str .. (i ~= count and "" or "\n"), r, g, b, 255)
end
return highlighted
end
}
--file
local file = utils.create_interface("filesystem_stdio.dll", "VBaseFileSystem011")
local filesystem_class = ffi.cast(ffi.typeof("void***"), file)
local filesystem_vftbl = filesystem_class[0]
local read_file = ffi.cast("int (__thiscall*)(void*, void*, int, void*)", filesystem_vftbl[0])
local write_file = ffi.cast("int (__thiscall*)(void*, void const*, int, void*)", filesystem_vftbl[1])
local open_file = ffi.cast("void* (__thiscall*)(void*, const char*, const char*, const char*)", filesystem_vftbl[2])
local close_file = ffi.cast("void (__thiscall*)(void*, void*)", filesystem_vftbl[3])
local get_file_size = ffi.cast("unsigned int (__thiscall*)(void*, void*)", filesystem_vftbl[7])
local file_exists = ffi.cast("bool (__thiscall*)(void*, const char*, const char*)", filesystem_vftbl[10])
local full_filesystem = utils.create_interface("filesystem_stdio.dll", "VFileSystem017")
local full_filesystem_class = ffi.cast(ffi.typeof("void***"), full_filesystem)
local full_filesystem_vftbl = full_filesystem_class[0]
local add_search_path = ffi.cast("void (__thiscall*)(void*, const char*, const char*, int)", full_filesystem_vftbl[11])
local remove_search_path = ffi.cast("bool (__thiscall*)(void*, const char*, const char*)", full_filesystem_vftbl[12])
local remove_file = ffi.cast("void (__thiscall*)(void*, const char*, const char*)", full_filesystem_vftbl[20])
local rename_file = ffi.cast("bool (__thiscall*)(void*, const char*, const char*, const char*)", full_filesystem_vftbl[21])
local create_dir_hierarchy = ffi.cast("void (__thiscall*)(void*, const char*, const char*)", full_filesystem_vftbl[22])
local is_directory = ffi.cast("bool (__thiscall*)(void*, const char*, const char*)", full_filesystem_vftbl[23])
local find_first = ffi.cast("const char* (__thiscall*)(void*, const char*, int*)", full_filesystem_vftbl[32])
local find_next = ffi.cast("const char* (__thiscall*)(void*, int)", full_filesystem_vftbl[33])
local find_is_directory = ffi.cast("bool (__thiscall*)(void*, int)", full_filesystem_vftbl[34])
local find_close = ffi.cast("void (__thiscall*)(void*, int)", full_filesystem_vftbl[35])
local MODES = {
["r"] = "r",
["w"] = "w",
["a"] = "a",
["r+"] = "r+",
["w+"] = "w+",
["a+"] = "a+",
["rb"] = "rb",
["wb"] = "wb",
["ab"] = "ab",
["rb+"] = "rb+",
["wb+"] = "wb+",
["ab+"] = "ab+",
}
local file_handle = {}
local file_system = {
exists = function(file)
return file_exists(filesystem_class, file, nil)
end,
rename = function(old_path, new_path)
rename_file(full_filesystem_class, old_path, new_path, nil)
end,
remove = function(file)
remove_file(full_filesystem_class, file, nil)
end,
create_directory = function(path)
create_dir_hierarchy(full_filesystem_class, path, nil)
end,
is_directory = function(path)
return is_directory(full_filesystem_class, path, nil)
end,
find_first = function(path)
local handle = ffi.new("int[1]")
local file = find_first(full_filesystem_class, path, handle)
if file == ffi.NULL then return nil end
return handle, ffi.string(file)
end,
find_next = function(handle)
local file = find_next(full_filesystem_class, handle)
if file == ffi.NULL then return nil end
return ffi.string(file)
end,
find_is_directory = function(handle)
return find_is_directory(full_filesystem_class, handle)
end,
find_close = function(handle)
find_close(full_filesystem_class, handle)
end,
add_search_path = function(path, type)
add_search_path(full_filesystem_class, path, type)
end,
remove_search_path = function(path)
remove_search_path(full_filesystem_class, path, nil)
end,
open = function(file, mode)
if not MODES[mode] then error("Invalid mode!") end
file_handle = open_file(filesystem_class, file, mode, nil)
end,
get_size = function()
return get_file_size(filesystem_class, file_handle)
end,
write = function(text)
write_file(filesystem_class, text, #text, file_handle)
end,
read = function()
local size = get_file_size(filesystem_class, file_handle)
local output = ffi.new("char[?]", size + 1)
read_file(filesystem_class, output, size, file_handle)
return ffi.string(output)
end,
close = function()
close_file(filesystem_class, file_handle)
end,
}
--string
string.replace = function(s, pattern, repl)
local i,j = string.find(s, pattern, 1, true)
if i and j then
local ret = {}
local start = 1
while i and j do
table.insert(ret, string.sub(s, start, i - 1))
table.insert(ret, repl)
start = j + 1
i,j = string.find(s, pattern, start, true)
end
table.insert(ret, string.sub(s, start))
return table.concat(ret)
end
return s
end
--table to string
local function table_to_string(tbl) local result = "[" for k, v in pairs(tbl) do if type(k) == "string" then result = result.."[\""..k.."\"]".."=" end if type(v) == "table" then result = result..table_to_string(v) elseif type(v) == "boolean" then result = result..tostring(v) else result = result.."\""..v.."\"" end result = result.."," end if result ~= "" then result = result:sub(1, result:len()-1) end return result.."]" end
--toint
local function toint(n)
local s = tostring(n)
local i, j = s:find('%.')
if i then
return tonumber(s:sub(1, i-1))
else
return n
end
end
--ffi functions
local shellexecutea = ffi.cast("ShellExecute", ffi.C.GetProcAddress(ffi.C.GetModuleHandleA("shell32.dll"), "ShellExecuteA"))
local urlmon, wininet = ffi.load("UrlMon"), ffi.load("WinInet")
local native_GetClipboardTextCount = _ffi:vmt_bind("vgui2.dll", "VGUI_System010", 7, "int(__thiscall*)(void*)")
local native_SetClipboardText = _ffi:vmt_bind("vgui2.dll", "VGUI_System010", 9, "void(__thiscall*)(void*, const char*, int)")
local native_GetClipboardText = _ffi:vmt_bind("vgui2.dll", "VGUI_System010", 11, "int(__thiscall*)(void*, int, const char*, int)")
local clipboard = {
get_text = function()
local len = native_GetClipboardTextCount()
if len > 0 then
local char_arr = _ffi.new_char_arr(len)
native_GetClipboardText(0, char_arr, len)
return ffi.string(char_arr, len-1)
end
end,
set_text = function(text)
native_SetClipboardText(text, text:len())
end
}
--timeout
local engine_client = ffi.cast(ffi.typeof("void***"), utils.create_interface("engine.dll", "VEngineClient014"))
local get_net_chan = ffi.cast("getnetchannel_t", engine_client[0][78])
local function set_timeout(timeout)
local net_channel = ffi.cast(ffi.typeof("void***"), get_net_chan(engine_client))
return ffi.cast("settimeout_t", net_channel[0][31])(net_channel, timeout, false)
end
local function timeout()
if panorama.GameStateAPI.IsPlayerConnected(panorama.MyPersonaAPI.GetXuid()) then
set_timeout(-1)
end
end
--error
local function create_error(text)
utils.console_exec("playvol buttons/button11.wav 100")
--Cheat.AddNotify("Grenade Helper", text)
end
--animations
local animations = {}
animations.lerp = function(start, vend, time)
return start and (start + (vend - start) * time) or 0
end
animations.color_modulation = {}
animations.color_modulation.hsv_to_rgb = function(h, s, v)
if s == 0 then
return v, v, v
end
h = h / 60
local hue_sector = math.floor(h)
local hue_sector_offset = h - hue_sector
local p = v * (1 - s)
local q = v * (1 - s * hue_sector_offset)
local t = v * (1 - s * (1 - hue_sector_offset))
if hue_sector == 0 then
return v, t, p
elseif hue_sector == 1 then
return q, v, p
elseif hue_sector == 2 then
return p, v, t
elseif hue_sector == 3 then
return p, q, v
elseif hue_sector == 4 then
return t, p, v
elseif hue_sector == 5 then
return v, p, q
end
end
animations.color_modulation.rgb_to_hsv = function(r, g, b)
local v = math.max(r, g, b)
local d = v - math.min(r, g, b)
if 1 > d then
return 0, 0, v
end
if v == 0 then
return -1, 0, v
end
local s = d / v
local h
if r == v then
h = (g - b) / d
elseif g == v then
h = 2 + (b - r) / d
else
h = 4 + (r - g) / d
end
h = h * 60
if h < 0 then
h = h + 360
end
return h, s, v
end
animations.color_modulation.lerp_color = function(r1, g1, b1, r2, g2, b2, percentage)
if percentage == 0 then
return {toint(r1), toint(g1), toint(b1)}
elseif percentage == 1 then
return {toint(r2), toint(g2), toint(b2)}
end
local h1, s1, v1 = animations.color_modulation.rgb_to_hsv(r1, g1, b1)
local h2, s2, v2 = animations.color_modulation.rgb_to_hsv(r2, g2, b2)
local r, g, b = animations.color_modulation.hsv_to_rgb(animations.lerp(h1, h2, percentage), animations.lerp(s1, s2, percentage), animations.lerp(v1, v2, percentage))
local a = animations.lerp(a1, a2, percentage)
return {
toint(r),
toint(g),
toint(b)
}
end
animations.quad_in_out = function(t, b, c, d)
t = t / d * 2
if t < 1 then
return c / 2 * math.pow(t, 2) + b
else
return -c / 2 * ((t - 1) * (t - 3) - 1) + b
end
end
animations.quart_out = function(t, b, c, d)
t = t / d - 1
return -c * (math.pow(t, 4) - 1) + b
end
animations.sine_in_out = function(t, b, c, d)
return -c / 2 * (math.cos(math.pi * t / d) - 1) + b
end
--ui handler
local ui_handler = {}
ui_handler.refs = {}
ui_handler.run_update = function()
for name, m_table in pairs(ui_handler.refs) do
if m_table.condition ~= nil then
m_table.ref:set_visible(m_table.condition())
end
end
end
ui_handler.new = function(unique_name, reference, condition)
if type(unique_name) ~= "string" or type(reference) ~= "userdata" then
error(unique_name .. " args error")
return
end
if condition ~= nil and type(condition) ~= "function" then
error(unique_name .. " condition arg error")
return
end
if ui_handler.refs[unique_name] ~= nil then
error(unique_name .. " already exists")
return
end
ui_handler.refs[unique_name] = {
ref = reference,
name = unique_name,
condition = condition
}
ui_handler.run_update()
reference:set_callback(ui_handler.run_update)
end
--main
local edit_state = "back"
local ui_groups = {
info = ui.create("Info", "Info"),
main = {
a = ui.create("Main", "A"),
b = ui.create("Main", "B")
},
locations = {
a = ui.create("Locations", "A"),
b = ui.create("Locations", "B")
}
}
local tabs = {
info = {
ui_groups.info:label("Hello " .. common.get_username()),
ui_groups.info:label("» If you have any questions or problems, you can always create a ticket in the discord server:"),
ui_groups.info:button(" Discord server ", function()
shellexecutea(nil, "open", "https://discord.gg/4e2snTTnXx", nil, nil, 1)
end)
},
main = {
helper_bind = ui_groups.main.a:hotkey("Helper Bind"),
aimbot_mode = ui_handler.new("aimbot_mode", ui_groups.main.a:combo("Aim at locations", {
"Off",
"Legit",
"Rage",
})),
aimbot_speed = ui_handler.new("aimbot_speed", ui_groups.main.a:slider("Helper Aimbot Speed", 0, 100, 75), function()
return ui_handler.refs["aimbot_mode"].ref:get() == "Legit"
end),
automatic_throw = ui_groups.main.a:switch("Automatic throw", false),
color = ui_groups.main.b:color_picker("Helper color", color(120, 120, 255, 255)),
behind_walls = ui_groups.main.b:switch("Show locations behind walls", false),
helper_types = ui_groups.main.b:selectable("Helper types", {
"Smoke",
"Flashbang",
"High Explosive",
"Molotov",
"Wallbang",
"Movement: 12 airacc"
})
},
locations = {
all_locations = ui_groups.locations.a:selectable("Locations Selection", {""}, 7),
import_local_source = ui_handler.new("import_local_source", ui_groups.locations.a:switch("Import local source", false), function()
return edit_state == "back"
end),
import_name = ui_handler.new("import_name", ui_groups.locations.a:input("Import file name", "name"), function()
return edit_state == "back" and ui_handler.refs["import_local_source"].ref:get()
end),
import_from_clipboard = ui_handler.new("import_from_clipboard", ui_groups.locations.a:button("Import from clipboard"), function()
return edit_state == "back" and ui_handler.refs["import_local_source"].ref:get()
end),
create_local_source = ui_handler.new("create_local_source", ui_groups.locations.a:switch("Create local source", false), function()
return edit_state == "back"
end),
new_file_name = ui_handler.new("new_file_name", ui_groups.locations.a:input("Local source name", "name"), function()
return edit_state == "back" and ui_handler.refs["create_local_source"].ref:get()
end),
create_new_file = ui_handler.new("create_new_file", ui_groups.locations.a:button("Create local source "), function()
return edit_state == "back" and ui_handler.refs["create_local_source"].ref:get()
end),
locations_edit = ui_handler.new("locations_edit", ui_groups.locations.a:combo("Edit Location Selection", {"clear"}), function()
return edit_state == "back" and ui_handler.refs["locations_edit"].ref:get_list()[1] ~= "clear"
end),
edit = ui_handler.new("edit", ui_groups.locations.a:button("Edit", function()
edit_state = "edit"
end), function()
return edit_state == "back" and ui_handler.refs["locations_edit"].ref:get_list()[1] ~= "clear"
end),
delete_location = ui_handler.new("delete_location", ui_groups.locations.a:button("Delete"), function()
return edit_state == "back" and ui_handler.refs["locations_edit"].ref:get_list()[1] ~= "clear"
end),
back = ui_handler.new("back", ui_groups.locations.a:button("Back", function()
edit_state = "back"
end), function()
return edit_state ~= "back"
end),
nades_sort_by = ui_handler.new("nades_sort_by", ui_groups.locations.a:input("Sort by search", ""), function()
return edit_state == "edit" and ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear"
end),
selected_nade = ui_handler.new("selected_nade", ui_groups.locations.a:combo("Selected nade", {"clear"}), function()
return edit_state == "edit" and ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear"
end),
create_new = ui_handler.new("create_new", ui_groups.locations.a:button("Create new location", function()
edit_state = "create_new"
end), function()
return edit_state == "edit"
end),
import_location = ui_handler.new("import_location", ui_groups.locations.b:button("Import from clipboard"), function()
return edit_state == "create_new"
end),
type = ui_handler.new("type", ui_groups.locations.b:combo("Location Type", {"Grenade", "Movement"}), function()
return edit_state ~= "back" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
from = ui_handler.new("from", ui_groups.locations.b:input("From", ""), function()
return edit_state ~= "back" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
to = ui_handler.new("to", ui_groups.locations.b:input("To", ""), function()
return edit_state ~= "back" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
description = ui_handler.new("description", ui_groups.locations.b:input("Description", ""), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
grenade_properties = ui_handler.new("grenade_properties", ui_groups.locations.b:selectable("Grenade Properties", {
"Jump",
"Run",
"Walk (Shift)",
"Throw strength",
"Force-enable recovery",
"Delayed throw"
}), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
duck = ui_handler.new("duck", ui_groups.locations.b:switch("Duck", false), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
throw_strength = ui_handler.new("throw_strength", ui_groups.locations.b:combo("Throw strength", {
"Left Click",
"Left / Right Click",
"Right Click"
}), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and ui_handler.refs["grenade_properties"].ref:get(4) and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
run_direction = ui_handler.new("run_direction", ui_groups.locations.b:combo("Run direction", {
"Forward",
"Left",
"Right",
"Back",
"Custom"
}), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and ui_handler.refs["grenade_properties"].ref:get(2) and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
run_direction_custom = ui_handler.new("run_direction_custom", ui_groups.locations.b:slider("Run direction ", -180, 180, 0), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and ui_handler.refs["grenade_properties"].ref:get(2) and ui_handler.refs["run_direction"].ref:get() == "Custom" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
run_duration = ui_handler.new("run_duration", ui_groups.locations.b:slider("Run duration", 0, 256, 20), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and ui_handler.refs["grenade_properties"].ref:get(2) and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
delay = ui_handler.new("delay", ui_groups.locations.b:slider("Throw delay", 1, 64, 1), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and ui_handler.refs["grenade_properties"].ref:get(6) and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
recovery_direction = ui_handler.new("recovery_direction", ui_groups.locations.b:combo("Recovery direction", {
"Forward",
"Left",
"Right",
"Back",
"Custom"
}), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and ui_handler.refs["grenade_properties"].ref:get(5) and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
recovery_direction_custom = ui_handler.new("recovery_direction_custom", ui_groups.locations.b:slider("Recovery direction ", -180, 180, 0), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and ui_handler.refs["grenade_properties"].ref:get(5) and ui_handler.refs["recovery_direction"].ref:get() == "Custom" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
recovery_bannyhop = ui_handler.new("recovery_bannyhop", ui_groups.locations.b:switch("Recovery bunny-hop", false), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and ui_handler.refs["grenade_properties"].ref:get(5) and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
set_location_hotkey = ui_handler.new("set_location_hotkey", ui_groups.locations.b:hotkey("Set location hotkey"), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
set_location = ui_handler.new("set_location", ui_groups.locations.b:button("Set location"), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Grenade" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
record_bind = ui_handler.new("record_bind", ui_groups.locations.b:switch("Recorder Bind", false), function()
return edit_state ~= "back" and ui_handler.refs["type"].ref:get() == "Movement" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
teleport_hotkey = ui_handler.new("teleport_hotkey", ui_groups.locations.a:hotkey("Teleport hotkey", 0), function()
return edit_state == "edit" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
teleport = ui_handler.new("teleport", ui_groups.locations.a:button("Teleport"), function()
return edit_state == "edit" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
teleport_hotkey_B = ui_handler.new("teleport_hotkey_B", ui_groups.locations.b:hotkey("Teleport hotkey ", 0), function()
return edit_state == "create_new" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
teleport_B = ui_handler.new("teleport_B", ui_groups.locations.b:button("Teleport "), function()
return edit_state == "create_new" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
export_clipboard = ui_handler.new("export_clipboard", ui_groups.locations.a:button("Export all to clipboard"), function()
return edit_state == "back" and ui_handler.refs["locations_edit"].ref:get_list()[1] ~= "clear"
end),
export_location_clipboard = ui_handler.new("export_location_clipboard", ui_groups.locations.a:button("Export to clipboard "), function()
return edit_state == "edit" and ui_handler.refs["locations_edit"].ref:get_list()[1] ~= "clear" and ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear"
end),
save = ui_handler.new("save", ui_groups.locations.b:button("Save"), function()
return edit_state ~= "back" and (ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear" or edit_state == "create_new")
end),
delete_nade = ui_handler.new("delete_nade", ui_groups.locations.a:button("Delete"), function()
return edit_state == "edit" and ui_handler.refs["selected_nade"].ref:get_list()[1] ~= "clear"
end)
},
}
local source_locations, active_locations, w_locations = {}, {}, {}
local function update_active_locations() end
-- downloads
file_system.create_directory("_Grenade_Helper")
file_system.create_directory("_Grenade_Helper\\locations")
file_system.create_directory("_Grenade_Helper\\locations\\default")
--create helper.db
if not file_system.exists("_Grenade_Helper\\helper.db") then
file_system.open("_Grenade_Helper\\helper.db", "w+")
file_system.close()
end
utils.execute_after(1, function ()
network.get("https://v1pix.host/neverlose/grenade_helper/get_locations.php?type=grenades", {}, function(response)
local body = tostring(response)
local file_size = files.get_size("csgo\\_Grenade_Helper\\locations\\default\\grenades.json")
if body:len() ~= 0 and body:len() ~= file_size then
files.write("csgo\\_Grenade_Helper\\locations\\default\\grenades.json", body)
end
end)
end)
utils.execute_after(2, function ()
network.get("https://v1pix.host/neverlose/grenade_helper/get_locations.php?type=movements", {}, function(response)
local body = tostring(response)
local file_size = files.get_size("csgo\\_Grenade_Helper\\locations\\default\\movements.json")
if body:len() ~= 0 and body:len() ~= file_size then
files.write("csgo\\_Grenade_Helper\\locations\\default\\movements.json", body)
end
end)
end)
utils.execute_after(3, function ()
network.get("https://v1pix.host/neverlose/grenade_helper/get_locations.php?type=wallbangs", {}, function(response)
local body = tostring(response)
local file_size = files.get_size("csgo\\_Grenade_Helper\\locations\\default\\wallbangs.json")
if body:len() ~= 0 and body:len() ~= file_size then
files.write("csgo\\_Grenade_Helper\\locations\\default\\wallbangs.json", body)
end
end)
end)
local get_id_from_combo = function(ui_element, search)
local id = 0
for key, value in pairs(ui_element:get_list()) do
id = id + 1
if value == search then
return id
end
end
end
--locations
local default_locations = {
{
name = "Default: Grenade",
path = "_Grenade_Helper\\locations\\default\\grenades.json",
builtin = false,
},
{
name = "Default: Movement",
path = "_Grenade_Helper\\locations\\default\\movements.json",
builtin = false,
},
{
name = "Default: Wallbang",
path = "_Grenade_Helper\\locations\\default\\wallbangs.json",
builtin = false,
},
}
local function GetWeapon(ent)
local weapon = ent:get_player_weapon(false)
if weapon == nil then
return
end
local weapon_id = weapon:get_weapon_index()
return weapon:get_classname() == "CKnife" and "knife" or (weapon_id == 48) and 46 or weapon_id
end
local weapon_console_name = {
[45] = "weapon_smokegrenade",
[43] = "weapon_flashbang",
[44] = "weapon_hegrenade",
[46] = "weapon_molotov",
[9] = "weapon_wallbang",
[40] = "weapon_wallbang",
[38] = "weapon_wallbang",
[1] = "weapon_wallbang",
[64] = "weapon_wallbang",
[11] = "weapon_wallbang",
["knife"] = "weapon_knife_movement"
}
local menu_weapon_name = {
["weapon_smokegrenade"] = "Smoke",
["weapon_flashbang"] = "Flashbang",
["weapon_hegrenade"] = "HE",
["weapon_molotov"] = "Molotov",
["weapon_knife_movement"] = "Movement",
["weapon_wallbang"] = "Wallbang"
}
local YAW_DIRECTION_OFFSETS = {
["Forward"] = 0,
["Left"] = 90,
["Right"] = -90,
["Back"] = 180
}
local _YAW_DIRECTION_OFFSETS = {
[0] = "Forward",
[90] = "Left",
[-90] = "Right",
[180] = "Back"
}
local STRENGTH_OFFSETS = {
["Left Click"] = 1,
["Left / Right Click"] = 0.5,
["Right Click"] = 0
}
local _STRENGTH_OFFSETS = {
[1] = "Left Click",
[0.5] = "Left / Right Click",
[0] = "Right Click"
}
local cheats_var = {
auto_strafe = ui.find("Miscellaneous", "Main", "Movement", "Air Strafe"),
strafe_assist = ui.find("Miscellaneous", "Main", "Movement", "Strafe Assist"),
quick_stop = ui.find("Miscellaneous", "Main", "Movement", "Quick Stop"),
strafer_wasd = ui.find("Miscellaneous", "Main", "Movement", "Air Strafe", "WASD Strafe"),
strafer_smoothing = ui.find("Miscellaneous", "Main", "Movement", "Air Strafe", "Smoothing"),
strafe_smooth = ui.find("Miscellaneous", "Main", "Movement", "Air Strafe", "Smoothing"):get(),
old_quick_stop = ui.find("Miscellaneous", "Main", "Movement", "Quick Stop"):get(),
old_strafer_wasd = ui.find("Miscellaneous", "Main", "Movement", "Air Strafe", "WASD Strafe"):get(),
old_strafe_assist = ui.find("Miscellaneous", "Main", "Movement", "Strafe Assist"):get(),
old_auto_strafe = ui.find("Miscellaneous", "Main", "Movement", "Air Strafe"):get(),
set_old_vars = false,
fakelag = ui.find("Aimbot", "Anti Aim", "Fake Lag", "Enabled"),
thirdperson = ui.find("Visuals", "World", "Main", "Force Thirdperson")
}
local menu_reseted = true
local update_location = false
local dupdate_location = false
local cvar_sv_airaccelerate = cvar.sv_airaccelerate
local global_data = {}
local eglobal_data = {}
local locations_system = {
create_location_movement = {},
record_start = true,
--ui update
ui_update = function(self)
source_locations = {}
for i=1, #default_locations do
table.insert(source_locations, default_locations[i])
end
--read helper.db
file_system.open("_Grenade_Helper\\helper.db", "r")
local helper_db = json.decode(("[" .. file_system.read() .. "]"):gsub(",]", "]"))
file_system.close()
if helper_db then
for i=0, #helper_db do
local location = helper_db[i]
if location then
table.insert(source_locations, {
name = "Local: " .. location,
builtin = true,
})
end
end
end
local locations = {}
local edit_locations = {}
for i=1, #source_locations do
local location = source_locations[i]
table.insert(locations, location.name)
end
tabs.locations.all_locations:update(locations)
for i=1, #tabs.locations.all_locations:get_list() do
local location = source_locations[i]
if tabs.locations.all_locations:get(i) and location.builtin then
table.insert(edit_locations, location.name)
end
end
ui_handler.refs["locations_edit"].ref:update(#edit_locations == 0 and {"clear"} or edit_locations)
ui_handler.run_update()
end,
--ui editor resseter
ui_editor_resseter = function(self)
if menu_reseted then
self.temp_location = {}
ui_handler.refs["from"].ref:set("")
ui_handler.refs["to"].ref:set("")
ui_handler.refs["description"].ref:set("")
ui_handler.refs["grenade_properties"].ref:set({})
ui_handler.refs["run_duration"].ref:set(0)
ui_handler.refs["run_direction"].ref:set("Forward")
ui_handler.refs["run_direction_custom"].ref:set(0)
ui_handler.refs["throw_strength"].ref:set("Left Click")
ui_handler.refs["recovery_direction"].ref:set("Forward")
ui_handler.refs["recovery_direction_custom"].ref:set(0)
ui_handler.refs["recovery_bannyhop"].ref:set(false)
ui_handler.refs["delay"].ref:set(0)
ui_handler.refs["duck"].ref:set(false)
menu_reseted = false
end
end,
--import from clipboard
import_from_clipboard = function(self)
local clipboard_text = clipboard.get_text()
local text = string.find(clipboard_text, "https://") ~= nil and Http.Get(clipboard_text) or clipboard_text
local name = string.format('"%s",', ui_handler.refs["import_name"].ref:get())
--read helper.db
file_system.open("_Grenade_Helper\\helper.db", "r")
local str = file_system.read()
file_system.close()
--write helper.db
local location = json.decode(text)
if string.find(str, name, 1, true) == nil then -- name clear
if location ~= nil and type(location) == "table" then
file_system.open("_Grenade_Helper\\helper.db", "a")
file_system.write(name)
file_system.close()
file_system.open("_Grenade_Helper\\locations\\" .. ui_handler.refs["import_name"].ref:get(), "w+")
file_system.write(text)
file_system.close()
else
create_error("Invalid JSON")
end
else
create_error("The name is already in use")
end
self.ui_update()
end,
--create new file
create_new_file = function(self)
local name = string.format('"%s",', ui_handler.refs["new_file_name"].ref:get())
--read helper.db
file_system.open("_Grenade_Helper\\helper.db", "r")
local str = file_system.read()
file_system.close()
--write helper.db
if string.find(str, name, 1, true) == nil then -- name clear
file_system.open("_Grenade_Helper\\helper.db", "a")
file_system.write(name)
file_system.close()
file_system.open("_Grenade_Helper\\locations\\" .. ui_handler.refs["new_file_name"].ref:get(), "w+")
file_system.write("{}")
file_system.close()
else
create_error("The name is already in use")
end
self.ui_update()
end,
--delete location file
delete_location = function(self)
local selected = ui_handler.refs["locations_edit"].ref:get():gsub("Local: ", "")
--active_locations[ui_handler.refs["locations_edit"].ref:get()+4] = "nil"
active_locations = {}
update_active_locations()
w_locations = {}
ui_handler.run_update()
--read helper.db
file_system.open("_Grenade_Helper\\helper.db", "r")
local helper_db = file_system.read()
file_system.close()
--edit helper.db
file_system.open("_Grenade_Helper\\helper.db", "w+")
file_system.write(string.replace(helper_db, string.format('"%s",', selected), ""))
file_system.close()
--remove location file
file_system.remove("_Grenade_Helper\\locations\\" .. selected)
--ui update
self.ui_update()
end,
--export clipboard
export_clipboard = function(self)
local selected = ui_handler.refs["locations_edit"].ref:get():gsub("Local: ", "")
--read location file
file_system.open("_Grenade_Helper\\locations\\" .. selected, "r")
local file = file_system.read()
file_system.close()
--print
console:print("[helper] ", 180, 230, 30, 255)
console:print("Exported location (Copied to clipboard):\n", 221, 221, 221, 255)
local str = json.stringify(file, "\n", " ")
json:print_highlighted(str)
--clipboard
clipboard.set_text(file)
end,
--edit
edit = function(self)
local selected = ui_handler.refs["locations_edit"].ref:get():gsub("Local: ", "")
--read location file
file_system.open("_Grenade_Helper\\locations\\" .. selected, "r")
local readed = json.decode(file_system.read())
file_system.close()
--write selected
if readed then
self.edit_locations = readed
else
file_system.open("_Grenade_Helper\\locations\\" .. selected, "w")
file_system.write("{}")
file_system.close()
self.edit_locations = {}
end
end,
--editor menu
editor_menu = function(self)
if edit_state == "back" then
self.edit_locations = nil
end
if self.edit_locations then
local selected_nade = get_id_from_combo(ui_handler.refs["selected_nade"].ref, ui_handler.refs["selected_nade"].ref:get())
local search = ui_handler.refs["nades_sort_by"].ref:get()
local menu_data, data = {}, {}
local map = get_map()
local locations = self.edit_locations.locations and self.edit_locations.locations[map] or self.edit_locations[map]
if locations then
for i=1, #locations do
local location = locations[i]
local name = #location.name == 2 and location.name[2] or location.name
if menu_weapon_name[location.weapon] and string.find(name:lower(), search:lower(), 1, true) then
table.insert(menu_data, menu_weapon_name[location.weapon] .. ": " .. name)
table.insert(data, location)
end
end
end
ui_handler.refs["selected_nade"].ref:update(#menu_data == 0 and {"clear"} or menu_data)
ui_handler.refs["selected_nade"].ref:set_visible(#menu_data ~= 0 and edit_state ~= "create_new")
local set_visible = locations ~= nil and #locations ~= 0 and edit_state ~= "create_new"
ui_handler.refs["nades_sort_by"].ref:set_visible(set_visible)
ui_handler.refs["teleport"].ref:set_visible(set_visible)
ui_handler.refs["teleport_hotkey"].ref:set_visible(set_visible)
ui_handler.refs["export_location_clipboard"].ref:set_visible(set_visible)
ui_handler.refs["delete_nade"].ref:set_visible(set_visible)
self.edit_location = #menu_data == 0 and nil or data[selected_nade]
else
self.edit_location = nil
end
end,
--export location clipboard
export_location_clipboard = function(self)
if self.edit_locations and self.edit_location then
local location = json.encoder(self.edit_location)
--print
console:print("[helper] ", 180, 230, 30, 255)
console:print("Exported location (Copied to clipboard):\n", 221, 221, 221, 255)
local str = json.stringify(location, "\n", " ")
json:print_highlighted(str)
--clipboard
clipboard.set_text(location)
end
end,
--delete nade
delete_nade = function(self)
local selected = ui_handler.refs["locations_edit"].ref:get():gsub("Local: ", "")
if self.edit_location and self.edit_locations and self.selected_nade2 then
file_system.open("_Grenade_Helper\\locations\\" .. selected, "r")
local file = json.encoder(file_system.read())
file_system.close()
--edit
table.remove(file[get_map()], self.selected_nade2.index)
if #file[get_map()] == 0 then
file[get_map()] = nil
end
local newtable = file
--write
file_system.open("_Grenade_Helper\\locations\\" .. selected, "w")
file_system.write(json.encode(newtable))
file_system.close()
--active_locations[ui_handler.refs["locations_edit"].ref:get()+4] = "nil"
active_locations = {}
update_active_locations()
w_locations = {}
self:edit()
ui_handler.run_update()
end
end,
--teleport
on_teleport = function(self)
if (create_location or self.edit_location) and self.edit_locations then
local location = create_location and create_location or self.edit_location
local position = location.position
local weapon = location.weapon
local viewangles = location.viewangles
if position[1] ~= 0 and position[2] ~= 0 and position[3] ~= 0 and weapon then
utils.console_exec(string.format("setpos %s %s %s; setang %s %s; use %s", position[1], position[2], position[3], viewangles[1], viewangles[2], weapon))
if weapon == "weapon_molotov" then
utils.console_exec("use weapon_incgrenade")
end
end
end
end,
--set location
temp_location = {},
on_set_location = function(self)
local localPlayer = entity.get_local_player()
if not localPlayer then
return
end
local lweapon = GetWeapon(localPlayer)
if lweapon == nil then
return
end
local weapon_name = weapon_console_name[lweapon]
if weapon_name ~= nil then
self.temp_location = {
position = localPlayer:get_eye_position(),
viewangles = render.camera_angles(),
weapon = weapon_name,
}
end
end,
selected_nade = nil,
backup_selected_nade = false,
--create location
create_location = function(self, cmd)
--hotkeys
if ui_handler.refs["teleport_hotkey"].ref:get() then
self:on_teleport()
end
if ui_handler.refs["teleport_hotkey_B"].ref:get() then
self:on_teleport()
end
if ui_handler.refs["set_location_hotkey"].ref:get() then
self:on_set_location()
end
--
local localPlayer = entity.get_local_player()
if not localPlayer then
return
end
local view_angles = render.camera_angles()
local localPos = localPlayer:get_eye_position()
local lweapon = GetWeapon(localPlayer)
if lweapon == nil then
return
end
local weapon_name = weapon_console_name[lweapon]
local type = ui_handler.refs["type"].ref:get()
create_location = edit_state ~= "back" and {} or nil
if edit_state == "create_new" then
self.backup_selected_nade = false
end
local from = ui_handler.refs["from"].ref:get()
local to = ui_handler.refs["to"].ref:get()
if from:gsub(" ", "") == "" then
from = "Unnamed"
end
if to:gsub(" ", "") == "" then
to = "Unnamed"
end
if create_location then
create_location.red_color = true
create_location.name = {from, to}
local position = self.temp_location and self.temp_location.position or {x = 0, y = 0, z = 0}
create_location.position = {position.x, position.y, position.z - 64}
local viewangles = self.temp_location and self.temp_location.viewangles or {x = 0, y = 0}
create_location.viewangles = {viewangles.x, viewangles.y}
create_location.weapon = self.temp_location and self.temp_location.weapon or ""
local description = ui_handler.refs["description"].ref:get()
if description:gsub(" ", "") ~= "" then
create_location.description = description:gsub("^%s+", ""):gsub("%s+$", "")
end
if type == "Grenade" then
update_location = false
local properties = ui_handler.refs["grenade_properties"].ref
create_location.grenade = properties:get() ~= 0 and {} or nil
if properties:get() ~= 0 then
create_location.grenade.jump = properties:get(1) and true or nil
end
if properties:get(2) then
create_location.grenade.run = ui_handler.refs["run_duration"].ref:get()
local run_yaw = YAW_DIRECTION_OFFSETS[ui_handler.refs["run_direction"].ref:get()]
run_yaw = run_yaw and run_yaw or ui_handler.refs["run_direction_custom"].ref:get()
local recovery_yaw = YAW_DIRECTION_OFFSETS[ui_handler.refs["recovery_direction"].ref:get()]
create_location.grenade.run_yaw = run_yaw ~= 0 and run_yaw or nil
create_location.grenade.run_speed = properties:get(3) and true or nil
if properties:get(5) then
create_location.grenade.recovery_yaw = recovery_yaw and recovery_yaw or ui_handler.refs["recovery_direction_custom"].ref:get()
create_location.grenade.recovery_jump = ui_handler.refs["recovery_bannyhop"].ref:get() and true or nil
end
end
if properties:get(4) then
local strength = STRENGTH_OFFSETS[ui_handler.refs["throw_strength"].ref:get()]
create_location.grenade.strength = strength ~= 1 and strength or nil
end
if properties:get(6) then
create_location.grenade.delay = ui_handler.refs["delay"].ref:get()
end
create_location.duck = ui_handler.refs["duck"].ref:get() and true or nil
self.create_location_movement = {}
self.record_start = false
else
create_location.grenade = nil
if ui_handler.refs["record_bind"].ref:get() then
if not self.record_start then
self.create_location_movement = {}
self.temp_location = {
position = localPos,
viewangles = view_angles,
weapon = weapon_name,
}
end
self.record_start = true
local smoothing = cheats_var.strafer_smoothing:get()
local strafer_wasd = cheats_var.strafer_wasd:get()
local quick_stop = cheats_var.quick_stop:get()
local attack = bit.band(cmd.buttons, 1) == 1
local attack2 = bit.band(cmd.buttons, 2048) == 2048
local jump = bit.band(cmd.buttons, 2) == 2 or bit.band(localPlayer.m_fFlags, 1) == 0 or common.is_button_down(0x20)
local duck = bit.band(cmd.buttons, 4) == 4
local w = bit.band(cmd.buttons, 8) == 8
local s = bit.band(cmd.buttons, 16) == 16
local a = bit.band(cmd.buttons, 512) == 512
local d = bit.band(cmd.buttons, 1024) == 1024
local in_use = bit.band(cmd.buttons, 32) == 32
local run_speed = bit.band(cmd.buttons, 131072) == 131072
if self.create_location_movement.strafer == nil then
self.create_location_movement.strafer = {}
self.create_location_movement.strafer.strafer_smoothing = smoothing
self.create_location_movement.strafer.wasd_strafer = strafer_wasd
self.create_location_movement.strafer.quick_stop = quick_stop
end
if self.create_location_movement.start_at == nil then
self.create_location_movement.start_at = cmd.command_number
end
if self.create_location_movement.step == nil then
self.create_location_movement.step = {}
end
local step = cmd.command_number - self.create_location_movement.start_at
table.insert(self.create_location_movement.step,
{
viewangles = {
view_angles.x,
view_angles.y
},
m_buttons = {
attack = attack,
attack2 = attack2,
w = w,
s = s,
a = a,
d = d,
jump = jump,
duck = duck,
in_use = in_use,
run_speed = run_speed,
weapon = cmd.weaponselect,
}
}
)
if cheats_var.fakelag:get() then
cmd.no_choke = true
end
end
if self.record_start and not ui_handler.refs["record_bind"].ref:get() then
update_location = true
self.record_start = false
end
if self.record_start and not ui_handler.refs["record_bind"].ref:get() then
update_location = true
self.record_start = false
end
end
end
if type == "Grenade" and (json.encode(create_location or {}) ~= json.encode(create_location2 or {})) then
update_location = true
end
if update_location then
local sv_airaccelerate = cvar_sv_airaccelerate:string()
if type == "Movement" and create_location and self.create_location_movement then
create_location.strafer = self.create_location_movement.strafer
create_location.step = self.create_location_movement.step
create_location.description = string.format('sv_airaccelerate %s', sv_airaccelerate)
end
create_location2 = create_location
w_locations = {}
update_active_locations()
dupdate_location = true
update_location = false
end
if edit_state == "back" then
self:ui_editor_resseter()
create_location2 = nil
else
menu_reseted = true
end
end,
--import location
on_import_location = function(self)
utils.execute_after(0.04, function()
local location = json.decode(clipboard.get_text())
if location then
if location.movement == nil and location.step == nil and location.weapon ~= "weapon_wallbang" then
ui_handler.refs["type"].ref:set("Grenade")
local position = location.position
local viewangles = location.viewangles
local name = #location.name and location.name or {"Unnamed", location.name}
self.temp_location = {
position = vector(position[1], position[2], position[3]+64),
viewangles = vector(viewangles[1], viewangles[2], 0),
weapon = location.weapon,
}
ui_handler.refs["from"].ref:set(name[1] or "Unnamed")
ui_handler.refs["to"].ref:set(name[2] or "Unnamed")
ui_handler.refs["description"].ref:set(location.description and location.description or "")
if location.grenade then
local properties_tbl = {}
if location.grenade.jump then
properties_tbl[#properties_tbl+1] = "Jump"
end
if location.grenade.run then
properties_tbl[#properties_tbl+1] = "Run"
end
ui_handler.refs["run_duration"].ref:set(location.grenade.run or 0)
ui_handler.refs["run_direction"].ref:set(location.grenade.run_yaw and (_YAW_DIRECTION_OFFSETS[location.grenade.run_yaw] or "Custom") or "Forward")
ui_handler.refs["run_direction_custom"].ref:set(location.grenade.run_yaw or 0)
if location.grenade.run_speed then
properties_tbl[#properties_tbl+1] = "Walk (Shift)"
end
if location.grenade.strength then
properties_tbl[#properties_tbl+1] = "Throw strength"
end
ui_handler.refs["throw_strength"].ref:set(_STRENGTH_OFFSETS[location.grenade.strength] or "Left Click")
if location.grenade.recovery_yaw then
properties_tbl[#properties_tbl+1] = "Force-enable recovery"
end
ui_handler.refs["recovery_direction"].ref:set(location.grenade.recovery_yaw and (_YAW_DIRECTION_OFFSETS[location.grenade.recovery_yaw] or "Custom") or "Forward")
ui_handler.refs["recovery_direction_custom"].ref:set(location.grenade.recovery_yaw or 0)
ui_handler.refs["recovery_bannyhop"].ref:set(location.grenade.recovery_jump and true or false)
if location.grenade.delay then
properties_tbl[#properties_tbl+1] = "Delayed throw"
end
ui_handler.refs["delay"].ref:set(location.grenade.delay or 0)
ui_handler.refs["grenade_properties"].ref:set(properties_tbl)
else
ui_handler.refs["grenade_properties"].ref:set({})
end
ui_handler.refs["duck"].ref:set(location.duck and true or false)
end
ui_handler.run_update()
end
end)
end,
--selected nade
on_selected_nade = function(self)
self.backup_selected_nade = true
self.selected_nade = nil
utils.execute_after(0.04, function()
local location = self.edit_location
if location then
ui_handler.refs["type"].ref:set("Grenade")
local position = location.position
local viewangles = location.viewangles
local name = location.name
self.temp_location = {
position = vector(position[1], position[2], position[3]+64),
viewangles = vector(viewangles[1], viewangles[2], 0),
weapon = location.weapon,
}
ui_handler.refs["from"].ref:set(name[1] or "Unnamed")
ui_handler.refs["to"].ref:set(name[2] or "Unnamed")
ui_handler.refs["description"].ref:set(location.description and location.description or "")
if location.grenade then
local properties_tbl = {}
if location.grenade.jump then
properties_tbl[#properties_tbl+1] = "Jump"
end
if location.grenade.run then
properties_tbl[#properties_tbl+1] = "Run"
end
ui_handler.refs["run_duration"].ref:set(location.grenade.run or 0)
ui_handler.refs["run_direction"].ref:set(location.grenade.run_yaw and (_YAW_DIRECTION_OFFSETS[location.grenade.run_yaw] or "Custom") or "Forward")
ui_handler.refs["run_direction_custom"].ref:set(location.grenade.run_yaw or 0)
if location.grenade.run_speed then
properties_tbl[#properties_tbl+1] = "Walk (Shift)"
end
if location.grenade.strength then
properties_tbl[#properties_tbl+1] = "Throw strength"
end
ui_handler.refs["throw_strength"].ref:set(_STRENGTH_OFFSETS[location.grenade.strength] or "Left Click")
if location.grenade.recovery_yaw then
properties_tbl[#properties_tbl+1] = "Force-enable recovery"
end
ui_handler.refs["recovery_direction"].ref:set(location.grenade.recovery_yaw and (_YAW_DIRECTION_OFFSETS[location.grenade.recovery_yaw] or "Custom") or "Forward")
ui_handler.refs["recovery_direction_custom"].ref:set(location.grenade.recovery_yaw or 0)
ui_handler.refs["recovery_bannyhop"].ref:set(location.grenade.recovery_jump and true or false)
if location.grenade.delay then
properties_tbl[#properties_tbl+1] = "Delayed throw"
end
ui_handler.refs["delay"].ref:set(location.grenade.delay or 0)
ui_handler.refs["grenade_properties"].ref:set(properties_tbl)
else
ui_handler.refs["grenade_properties"].ref:set({})
end
ui_handler.refs["duck"].ref:set(location.duck and true or false)
for _, _location in pairs(global_data) do
local position = _location.position[1] == position[1] and _location.position[2] == position[2] and _location.position[3] == position[3]
local viewangles = _location.viewangles[1] == viewangles[1] and _location.viewangles[2] == viewangles[2]
local weapon = _location.weapon == location.weapon
local name = _location.name[1] == location.name[1] and _location.name[2] == location.name[2]
if position and viewangles and weapon and name then
self.selected_nade = {
index = _,
location = _location,
on_have_changes = false
}
end
end
for i=1, #eglobal_data do
local data = eglobal_data[i]
for _, _location in pairs(data) do
local position = _location.position[1] == position[1] and _location.position[2] == position[2] and _location.position[3] == position[3]
local viewangles = _location.viewangles[1] == viewangles[1] and _location.viewangles[2] == viewangles[2]
local weapon = _location.weapon == location.weapon
local name = _location.name[1] == location.name[1] and _location.name[2] == location.name[2]
if position and viewangles and weapon and name then
self.selected_nade2 = {
index = _,
location = _location,
on_have_changes = false
}
end
end
end
ui_handler.run_update()
end
end)
end,
--save
on_save = function(self)
if create_location2 and self.edit_locations then
create_location2.red_color = nil
if edit_state == "create_new" then
local selected = ui_handler.refs["locations_edit"].ref:get():gsub("Local: ", "")
file_system.open("_Grenade_Helper\\locations\\" .. selected, "r")
local file = json.decode(file_system.read())
file_system.close()
if file == nil then
file = {}
end
if file[get_map()] == nil then
file[get_map()] = {}
end
--edit
table.insert(file[get_map()], create_location2)
--write
file_system.open("_Grenade_Helper\\locations\\" .. selected, "w")
file_system.write(json.encoder(file))
file_system.close()
ui_handler.run_update()
w_locations = {}
active_locations = {}
update_active_locations()
create_location2 = nil
self.temp_location = {}
elseif edit_state == "edit" then
if self.selected_nade2 and self.selected_nade.on_have_changes then
local selected = ui_handler.refs["locations_edit"].ref:get():gsub("Local: ", "")
file_system.open("_Grenade_Helper\\locations\\" .. selected, "r")
local file = json.decode(file_system.read())
file_system.close()
--edit
file[get_map()][self.selected_nade2.index] = create_location2
--write
file_system.open("_Grenade_Helper\\locations\\" .. selected, "w")
file_system.write(json.encoder(file))
file_system.close()
ui_handler.run_update()
w_locations = {}
active_locations = {}
update_active_locations()
create_location2 = nil
self.temp_location = {}
end
end
end
end,
}
locations_system.ui_update()
tabs.locations.all_locations:set_callback(function()
locations_system:ui_update()
end)
ui_handler.refs["import_from_clipboard"].ref:set_callback(function()
locations_system:import_from_clipboard()
end)
local last_to = nil
ui_handler.refs["to"].ref:set_callback(function(ctx)
if last_to ~= ctx:get() then
update_location = true
last_to = ctx:get()
end
end)
ui_handler.refs["create_new_file"].ref:set_callback(function()
locations_system:create_new_file()
end)
ui_handler.refs["delete_location"].ref:set_callback(function()
locations_system:delete_location()
active_locations = {}
update_active_locations()
w_locations = {}
end)
ui_handler.refs["export_clipboard"].ref:set_callback(function()
locations_system:export_clipboard()
end)
ui_handler.refs["export_location_clipboard"].ref:set_callback(function()
locations_system:export_location_clipboard()
end)
ui_handler.refs["edit"].ref:set_callback(function()
locations_system:edit()
locations_system:on_selected_nade()
end)
ui_handler.refs["delete_nade"].ref:set_callback(function()
locations_system:delete_nade()
locations_system:on_selected_nade()
end)
ui_handler.refs["teleport"].ref:set_callback(function()
locations_system:on_teleport()
end)
ui_handler.refs["teleport_B"].ref:set_callback(function()
locations_system:on_teleport()
end)
ui_handler.refs["set_location"].ref:set_callback(function()
locations_system:on_set_location()
end)
ui_handler.refs["save"].ref:set_callback(function()
locations_system:on_save()
locations_system:on_selected_nade()
end)
ui_handler.refs["import_location"].ref:set_callback(function()
locations_system:on_import_location()
end)
ui_handler.refs["selected_nade"].ref:set_callback(function()
locations_system:on_selected_nade()
utils.execute_after(0.01, function() locations_system:on_selected_nade() end)
end)
ui_handler.refs["back"].ref:set_callback(function()
locations_system.backup_selected_nade = true
end)
ui_handler.refs["create_new"].ref:set_callback(function()
menu_reseted = true
locations_system:ui_editor_resseter()
end)
--get map pattern
local crc32 = function(s, lt)
lt = lt or {}
local b, crc, mask
if not lt[1] then
for i = 1, 256 do
crc = i - 1
for _ = 1, 8 do
mask = -bit.band(crc, 1)
crc = bit.bxor(bit.rshift(crc, 1), bit.band(0xedb88320, mask))
end
lt[i] = crc
end
end
crc = 0xffffffff
for i = 1, #s do
b = string.byte(s, i)
crc = bit.bxor(bit.rshift(crc, 8), lt[bit.band(bit.bxor(crc, b), 0xFF) + 1])
end
return bit.band(bit.bnot(crc), 0xffffffff)
end
local get_map_pattern = function()
local traced_ent = utils.trace_line(vector(0, 0, 0), vector(8024, 8024, 0), nil, 0xFFFFFFFF, 1).entity
if traced_ent ~= nil and traced_ent:get_classname() == "CWorld" then
local mins = traced_ent.m_WorldMins
local maxs = traced_ent.m_WorldMaxs
local str = string.format("bomb_%.2f_%.2f_%.2f %.2f_%.2f_%.2f", mins.x, mins.y, mins.z, maxs.x, maxs.y, maxs.z)
if str == nil then
return
end
return crc32(str)
end
end
local MAP_PATTERNS = {
[-2011174878] = "de_train",
[-1890957714] = "ar_shoots",
[-1768287648] = "dz_blacksite",
[-1752602089] = "de_inferno",
[-1639993233] = "de_mirage",
[-1835533716] = "de_mirage",
[-1934039175] = "de_mirage",
[-1621571143] = "de_dust",
[-1541779215] = "de_sugarcane",
[-1439577949] = "de_canals",
[-1411074561] = "de_tulip",
[-1348292803] = "cs_apollo",
[-1218081885] = "de_guard",
[-923663825] = "dz_frostbite",
[-768791216] = "de_dust2",
[-692592072] = "cs_italy",
[-542128589] = "ar_monastery",
[-222265935] = "ar_baggage",
[-182586077] = "de_aztec",
[371013699] = "de_stmarc",
[405708653] = "de_overpass",
[549370830] = "de_lake",
[790893427] = "dz_sirocco",
[792319475] = "de_ancient",
[878725495] = "de_bank",
[899765791] = "de_safehouse",
[1014664118] = "cs_office",
[1238495690] = "ar_dizzy",
[1364328969] = "cs_militia",
[1445192006] = "de_engage",
[1463756432] = "cs_assault",
[1476824995] = "de_vertigo",
[1507960924] = "cs_agency",
[1563115098] = "de_nuke",
[1722587796] = "de_dust2_old",
[1850283081] = "de_anubis",
[1900771637] = "de_cache",
[1964982021] = "de_elysion",
[2041417734] = "de_cbble",
[2056138930] = "gd_rialto"
}
local MAP_LOOKUP = {
de_shortnuke = "de_nuke",
de_shortdust = "de_shortnuke",
}
function get_map()
local pattern = get_map_pattern()
local map_pattern = MAP_PATTERNS[pattern]
local map_name = string.lower(common.get_map_data() and common.get_map_data().shortname or "")
return MAP_LOOKUP[map_name] and MAP_LOOKUP[map_name] or map_pattern and map_pattern or map_name
end
--active locations
local width = 0
local function locations() end
function update_active_locations()
local selected_locations = tabs.locations.all_locations
local map = get_map()
for i=1, #selected_locations:get_list() do
local location = source_locations[i]
if selected_locations:get(i) then
local path = location.path and location.path or "_Grenade_Helper\\locations\\" .. location.name:gsub("Local: ", "")
if (active_locations[i] == nil or active_locations[i] == "nil") and file_system.exists(path) then
file_system.open(path, "r")
local locations = file_system.read()
file_system.close()
local decode = json.decode(locations)
active_locations[i] = decode and decode or "null"
end
else
active_locations[i] = "nil"
end
end
active_locations["custom"] = create_location2 ~= nil and json.decode(json.encoder(create_location2)) or nil
width = 0
locations()
end
tabs.locations.all_locations:set_callback(function()
active_locations = {}
update_active_locations()
w_locations = {}
end)
update_active_locations()
function locations()
global_data = {}
eglobal_data = {}
for i=1, #active_locations do
local location = active_locations[i]
if location ~= "null" and location ~= "nil" and location ~= nil then
local map_location = location[get_map()]
if map_location ~= nil then
table.insert(eglobal_data, map_location)
for i=1, #map_location do
local location = map_location[i]
table.insert(global_data, location)
end
end
end
end
if edit_state == "create_new" then
table.insert(global_data, active_locations["custom"])
end
end
locations()
local function populate_map_locations(data, weapon)
local count = 0
for key, value in pairs(data) do
if key > count then
count = key
end
end
for position_id_1=1, count do
local locations_1 = data[position_id_1]
locations_1.pos_h = nil
if locations_1 ~= nil then
local pos_1 = locations_1.vector
if pos_1 ~= nil then
for position_id_2=position_id_1+1, count do
local locations_2 = data[position_id_2]
if locations_2 ~= nil then
local pos_2 = locations_2.vector
if pos_2 ~= nil then
local dist = pos_1:dist(pos_2)
if dist < 20 then
local main = #locations_2 > #locations_1 and position_id_2 or position_id_1
local other = main == position_id_1 and position_id_2 or position_id_1
local main_locations, other_locations = {}, {}
local g_main = data[main]
local g_other = data[other]
if g_main.weapon == g_other.weapon then
table.insert(main_locations, g_main)
table.insert(other_locations, g_other)
if main_locations ~= nil and other_locations ~= nil and #main_locations ~= 0 and #other_locations ~= 0 then
local main_count = #main_locations
for i=1, #other_locations do
local location = other_locations[i]
main_locations[main_count+i] = location
end
local position = main_locations[1].position_2 and main_locations[1].position_2 or main_locations[1].position
for i, v in pairs(main_locations) do
local main_locations_ = main_locations[i]
main_locations_.position_2 = {
position[1],
position[2],
position[3]
}
if i ~= 1 then
main_locations_.show_icon = true
end
end
end
end
end
end
end
end
end
end
if position_id_1 == count then
w_locations[weapon] = weapon
end
end
if count == 0 then
w_locations[weapon] = weapon
end
end
--renderer
local menu_weapon = {
[45] = 1,
[43] = 2,
[44] = 3,
[46] = 4,
--wallbang
[9] = 5,
[40] = 5,
[38] = 5,
[1] = 5,
[64] = 5,
[11] = 5,
--knife
["knife"] = 6,
}
local function vector2_rotate(angle, x, y)
local sin = math.sin(angle)
local cos = math.cos(angle)
local x_n = x * cos - y * sin
local y_n = x * sin + y * cos
return x_n, y_n
end
local function triangle_rotated(x, y, width, height, angle, color)
local a_x, a_y = vector2_rotate(angle, width/2, 0)
local b_x, b_y = vector2_rotate(angle, 0, height)
local c_x, c_y = vector2_rotate(angle, width, height)
local o_x, o_y = vector2_rotate(angle, -width/2, -height/2)
x, y = x + o_x, y + o_y
render.poly(color,
vector(x+a_x, y+a_y),
vector(x+b_x, y+b_y),
vector(x+c_x, y+c_y)
)
end
local normalize_angles = function(pitch, yaw)
if yaw ~= yaw then
yaw = 0
yaw = yaw
elseif not (yaw > -180 and yaw <= 180) then
yaw = math.fmod(math.fmod(yaw + 360, 360), 360)
yaw = yaw > 180 and yaw-360 or yaw
end
return math.max(-89, math.min(89, pitch)), yaw
end
local is_grenade_being_thrown = function(cmd, weapon)
local pin_pulled = weapon.m_bPinPulled
if not pin_pulled then
local throw_time = weapon.m_fThrowTime
return throw_time > 0
end
return false
end
local GRENADE_PLAYBACK_PREPARE, GRENADE_PLAYBACK_RUN, GRENADE_PLAYBACK_THROW, GRENADE_PLAYBACK_THROWN, GRENADE_PLAYBACK_FINISHED = 1, 2, 3, 4, 5
local MOVEMENT_BUTTONS_CHARS = {
["in_attack"] = "A",
["in_jump"] = "J",
["in_duck"] = "D",
["in_forward"] = "F",
["in_moveleft"] = "L",
["in_moveright"] = "R",
["in_back"] = "B",
["in_use"] = "U",
["in_attack2"] = "Z",
["in_speed"] = "S"
}
local function table_map_assoc(tbl, callback)
local new = {}
for key, value in pairs(tbl) do
local new_key, new_value = callback(key, value)
new[new_key] = new_value
end
return new
end
local MOVEMENT_BUTTONS_CHARS_INV = table_map_assoc(MOVEMENT_BUTTONS_CHARS, function(k, v) return v, k end)
local function parse_buttons_str(str)
local buttons_down, buttons_up = {}, {}
for c in str:gmatch(".") do
if c:lower() == c then
table.insert(buttons_up, MOVEMENT_BUTTONS_CHARS_INV[c:upper()] or false)
else
table.insert(buttons_down, MOVEMENT_BUTTONS_CHARS_INV[c] or false)
end
end
return buttons_down, buttons_up
end
local function calculate_move(btn1, btn2)
return btn1 and 450 or (btn2 and -450 or 0)
end
local pos_offset = {}
local pos_offset_icon = {}
local main = {
paint_vars = {
close_locations = {},
name_pos = {},
angles_locations = {},
images = {
edit_png = render.load_image(
"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x20\x00\x00\x00\x20\x08\x03\x00\x00\x00\x44\xA4\x8A\xC6\x00\x00\x00\x72\x50\x4C\x54\x45\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF9\xF9\xF9\xFA\xFA\xFA\xFA\xFA\xFA\xFB\xFB\xFB\xFB\xFB\xFB\xFB\xFB\xFB\xFC\xFC\xFC\xFC\xFC\xFC\xFD\xFD\xFD\xFD\xFD\xFD\xFD\xFD\xFD\xFB\xFB\xFB\xFB\xFB\xFB\xFB\xFB\xFB\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFD\xFD\xFD\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\xFC\x6A\xD6\x56\x90\x00\x00\x00\x25\x74\x52\x4E\x53\x00\x01\x04\x06\x17\x1A\x1C\x25\x27\x2D\x32\x35\x45\x46\x48\x4A\x60\x69\x6C\x7C\x82\x87\x8B\xA5\xAA\xAF\xB0\xB1\xCF\xE6\xE9\xED\xEF\xF7\xFB\xFD\xFE\x67\xB5\xC5\xB4\x00\x00\x00\x01\x62\x4B\x47\x44\x01\xFF\x02\x2D\xDE\x00\x00\x00\x8E\x49\x44\x41\x54\x38\xCB\xDD\xD3\xCB\x0E\x82\x30\x14\x84\xE1\xC1\xE2\x0D\x14\x15\x05\x05\x6F\xA8\xCC\xFB\xBF\xA2\x8B\xAA\x61\xD1\x33\x4D\x58\xDA\xED\xF7\x9F\xE6\xA4\x49\x81\xB1\x27\x89\xB8\x6B\x4A\xED\x2D\xFB\x52\x3B\x65\x71\x22\x49\xF6\x3B\x33\x58\x3F\x7C\x11\xBE\xC3\x2D\x74\xE1\xDA\x2E\x07\x0A\x5F\x54\xE1\xFD\xBA\xFC\x73\x47\x6D\xEC\xFF\x2D\x4C\xF7\x45\x71\xB0\xDD\x17\x01\x3F\xF3\x77\xEE\x33\x35\xAF\xF6\x13\xDE\xFC\xB7\xE3\x38\xF0\x2A\xF4\xC2\x37\x3D\x8F\xC9\x4B\x3B\xA6\x11\x47\x16\x71\x6C\x22\x8E\x2D\xC9\xE7\xF5\xB2\x37\x3F\xC1\x7C\xB5\x4C\x93\xD1\x9F\x1C\x6F\x7F\xDA\x26\xDB\x4E\x74\xD1\xF5\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82",
vector(14, 13)
),
warning_png = render.load_image(
"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7A\x7A\xF4\x00\x00\x00\x06\x62\x4B\x47\x44\x00\xFF\x00\xFF\x00\xFF\xA0\xBD\xA7\x93\x00\x00\x01\xB4\x49\x44\x41\x54\x58\x85\xED\x96\xBF\x6B\xD4\x60\x1C\x87\x9F\xEF\x51\x45\x11\x51\x0A\x22\x3D\x10\x04\x87\xE2\x54\x9D\x1C\xEA\xA0\xD0\x51\x47\x3B\xEB\xA0\x8B\x4B\x17\x11\x04\xE9\x29\x8A\x60\x75\x72\xD6\x59\xBA\xB9\x3A\xF8\x17\x38\x38\xD8\xC5\xC5\xC9\x1F\x93\x6E\x16\xC1\xF2\x38\x24\xA1\x21\x77\x97\x4B\x2E\x97\x1C\x82\x1F\x78\x21\x24\xEF\x9B\xE7\xF9\x26\x79\xDF\x37\xF0\x3F\xFF\x72\xD4\xBE\xBA\x3C\x4F\x81\x57\xEA\x9B\x79\xC1\x57\xD4\x3D\x93\xAC\xCD\x43\xE0\xAD\xFB\xF9\xA0\xF6\xBA\x84\x5F\x75\x38\xD7\xBB\x82\x2F\xA8\x1F\x47\x08\x7C\x51\x8F\x74\x21\x70\x7B\x04\x3C\xCB\x66\xDB\xF0\xA3\xEA\xF7\x12\x81\x5F\xEA\xA9\x36\x05\x9E\x96\xC0\xB3\xBC\x6C\x0B\x7E\x5A\xDD\xCD\x81\xB6\xD5\x6B\x69\xDB\xCE\x9D\xDF\x53\x57\xDA\x10\x78\x5D\xA8\x74\x90\xBB\x36\x28\x5C\x7B\x57\xF5\xBE\x95\xE6\xAE\x7A\x01\x58\xAF\xE1\x7B\x59\xBD\x32\x13\x01\x35\x80\xE7\x40\xD4\x10\x00\x78\xA6\x1E\x68\x2C\x40\x52\xF9\x6A\x4D\x38\xC0\x32\x70\xB3\x91\x80\x7A\x10\x78\x3C\x05\x3C\xCB\x40\x3D\x36\xB5\x00\xB0\x01\x9C\x69\x20\x70\x02\xB8\x37\x95\x80\xBA\x08\xDC\x6D\x00\xCF\xB2\xA1\x8E\x2D\xA2\xEC\x09\x3C\x04\x16\x67\x20\x50\xFA\x1A\x47\x0A\x98\xFC\xE5\xDC\x9A\x01\x3C\xCB\xBA\x3A\xF2\x43\x5E\x18\x33\x60\x0B\x98\x34\x85\xD6\xD4\x43\xE9\xF1\xC5\x09\x7D\x03\xD8\x52\x57\x23\xC2\xD2\x9E\xEA\xA5\x0A\xEB\xFD\xB4\x19\x5A\xCC\xA2\x00\xEF\x01\xEF\x81\xF3\x13\x2A\x02\xF8\x06\x7C\x4D\x8F\xFB\xC0\x52\x85\x31\x9F\x81\xB3\x11\xF1\x7B\x5C\xF5\x37\x6A\x54\x33\xC8\x8D\x2B\xEE\x05\x65\xB9\x93\x67\xF6\x72\x37\x39\x0C\x3C\xA8\x50\x45\xD3\xDC\x57\x4F\x0E\x9D\x55\x37\x6B\x54\xA1\xC9\xD6\xFC\x23\x6D\xBB\x13\xFA\x16\xF3\x22\xE3\x46\x0A\xEF\x03\x9F\x80\xF6\xFF\xE9\x92\xFC\x01\xCE\x45\xC4\x4E\xF6\x0A\x1E\x75\x08\x87\x64\xFA\x3F\x81\xFD\x27\x70\x9C\xFA\xDB\x6D\xE3\x44\xC4\xCF\xAE\x99\x43\xF9\x0B\xA1\xEE\x94\xEA\x0C\x04\x3B\xED\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82",
vector(12, 12)
),
bhop_png = render.load_image(
"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x03\x1F\x00\x00\x03\x1F\x08\x03\x00\x00\x00\x80\x7A\x9A\x97\x00\x00\x00\x01\x73\x52\x47\x42\x01\xD9\xC9\x2C\x7F\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0B\x13\x00\x00\x0B\x13\x01\x00\x9A\x9C\x18\x00\x00\x00\x8A\x50\x4C\x54\x45\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF6\x37\x68\x8D\x00\x00\x00\x2E\x74\x52\x4E\x53\x00\xB7\xFF\xFE\xF8\xF5\xFC\x79\x47\xD9\xCD\x9C\xF9\xFB\x64\xF1\xD3\xEC\xFD\xE4\xE0\x8C\xFA\xEF\xE8\x75\x29\xC4\xDE\xD1\x41\xED\xAB\xBF\x72\xF6\x93\x9A\xAD\xCB\xCA\xC8\xC5\xAF\xE6\xE9\xF1\xC3\x71\x2D\x00\x00\x1A\xED\x49\x44\x41\x54\x78\x9C\xED\xDD\xE9\x76\x1B\xB9\x76\x86\x61\x49\xB4\x28\xD9\x56\x87\x31\x9D\x38\x83\x28\x2A\xA1\x78\x7C\x32\x28\xF7\x7F\x7B\xB1\x28\xCA\xD6\x40\xD4\x00\x6C\xE0\xDB\x00\xDE\xE7\x57\xAF\xEE\x5E\x2C\xD4\x1E\x54\x64\x15\x0A\x38\x3B\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xC6\xF9\xC5\xC5\xC5\xE2\xE2\x60\x31\xE0\xD3\xB9\x7A\xA0\x80\xC0\xE5\xC5\x34\x4B\xF5\x40\x01\x81\x89\xED\xF1\xEB\xEA\xA2\x1E\x29\x50\xDE\xE4\xFE\xE0\x9A\x82\x0E\xA5\xF4\xC7\xC5\xF9\x2F\x57\xEA\x33\x00\xF2\x49\xEA\x8F\x83\x6B\xF5\x29\x00\xD9\xA4\xF7\x87\xFA\x0C\x80\x7C\xE8\x0F\x20\x2C\xBD\x3F\x2E\x3E\xAB\xCF\x01\xC8\xC5\xA0\x3F\xB8\x82\xA0\x59\xF4\x07\x10\x76\x6E\xD0\x1F\x4B\xEE\xF1\xA2\x59\x06\x0D\xC2\x15\x04\xCD\xA2\x3F\x80\x30\xFA\x03\x18\xB0\xA4\x3F\x80\x30\xFA\x03\x08\xA3\x3F\x80\xA0\x2F\xF4\x07\x10\x72\x95\xDE\x1E\xF4\x07\x9A\xF5\x95\xFE\x00\x82\xAE\x16\xF4\x07\x10\x46\x7F\x00\x61\xF4\x07\x10\x46\x7F\x00\x61\xF4\x07\x10\x46\x7F\x00\x41\x9F\xE9\x0F\x20\x28\xBD\x3D\xE8\x0F\xB4\x8B\xFE\x00\xC2\xF8\x7E\x05\x0C\xA0\x3F\x80\xB0\xF4\xFE\xB8\x61\x85\x06\x34\x2B\xBD\x3F\x2E\x6E\xD4\xE7\x00\xE4\x62\xD0\x1F\xEC\x0E\x82\x66\x19\xF4\x07\xBF\x40\xD0\x2E\x83\xFE\xF8\xA2\x3E\x07\x20\x97\xBF\x0C\x1A\x44\x36\xF8\xAB\xF3\xF3\x7F\x90\x1D\x1C\x3D\x30\x78\x43\x4A\xD6\x1F\xAB\xA7\x83\xFF\xA3\xEA\xE8\xE8\x81\x41\x7B\x64\xEF\x8F\x6F\x43\x07\x67\xF7\x69\x64\x54\x41\x7F\x0C\xAF\xA3\x9D\xF9\xE0\xE8\x9B\xF3\xEF\x57\xD3\x06\xB0\xCE\x38\x02\x74\xCD\x77\x7F\x4C\x1D\xC1\xB7\x7C\x43\x40\xD7\xFC\xDE\xBF\xF2\x30\x06\x74\xEE\xDA\xA0\x3D\x72\xD4\xE6\x97\xEF\x73\x07\xF1\xFD\x9F\xBE\xB0\x21\x3B\x8C\x59\xB4\x47\x86\xFE\x70\x34\x14\xF4\xCC\x63\x7F\xA4\x6C\xBA\xB0\xF8\x67\xE3\xC1\xA0\x6B\x1E\xFB\xC3\xD5\x60\xD0\x35\x6F\xFD\x61\xB0\xA0\xFC\x05\xCF\xD4\x61\xC5\xA4\x1C\xBD\x8D\x87\x8B\x08\x8C\xF8\x2A\x46\x93\xBB\x69\x47\x4C\x5C\x44\x3A\x8B\x4A\x34\x1B\x8C\xC1\x6A\x11\xAF\x70\xB3\x17\xC9\x0C\xEA\xD0\xEC\xFD\x41\x83\xB1\xBC\x61\x35\x2E\xF4\xCA\x60\xFB\x5A\xB3\x3A\x34\x19\xCA\x3B\x6B\xAE\x21\x48\x60\x53\x85\x8E\x86\x92\x67\x6C\xE8\x94\x9B\x1A\x1C\x9E\xC2\x9E\xE8\xD2\x60\x80\xE8\x91\xC5\xE4\x5D\x93\xFE\x30\x19\x47\xCE\x01\xA2\x4F\x3E\xCA\xCF\x62\x1F\xDD\x21\xAB\xF4\x21\xA2\x4B\x16\xD5\xE7\x63\x14\x83\x98\x95\x85\x28\x16\xC5\x97\x3C\x08\xCB\xC7\x82\x01\xBC\xA5\x8E\x28\x06\xB5\x97\x3A\x84\xD9\xAF\x7A\x44\x58\x5A\xC4\x0A\xFD\xB9\x4C\xAF\xBD\xD4\x21\xA4\x8F\x60\x02\x16\xB1\x43\x8C\x9B\xF4\xD2\x4B\x1B\xC0\xD7\xF4\x01\x14\x18\x25\x3A\x65\x70\xEB\x28\x6D\x00\xE9\xC7\x9F\x86\x6F\x58\x88\x92\xFC\x0D\x2B\xFA\xC8\x16\x65\x3F\x07\xCB\x00\x21\xC2\xE0\xF2\x84\x13\x44\x1E\xB6\xD4\x17\xAB\xF4\x91\xA2\x6F\x69\x45\x17\x3B\x7D\xC3\xA6\xE4\x67\x31\x8D\x1A\x7A\x91\x56\x74\x51\x73\x64\x73\x3F\x31\x3F\x6D\xF1\xD5\x3A\x74\xE8\x40\xD2\xEC\xC0\xB8\x1B\xA7\x56\x15\x3F\xD3\x0F\xE3\xC8\xA1\x0F\x09\x25\x57\xF8\x70\x69\x98\xCA\x8B\x18\x09\xAB\x8C\xC6\x1C\xCE\xAE\xE0\x4B\x8C\x16\x28\x5B\x71\x76\xF5\x5E\x64\xB8\xE8\x5E\xFC\x9B\x20\xF3\x8F\x65\xB3\xC6\x55\x2C\x96\x7A\xC7\x7C\xF1\x73\x04\xE7\x1F\xCB\xB0\xD8\xCB\x0C\x18\x88\xBE\xE1\x3A\xFF\x50\x96\xC5\x5E\x64\xC0\x40\x74\xD5\x96\x3B\x92\x11\xFB\xD0\xA1\x03\xE5\xCA\xCD\xB2\xD8\x8B\x0C\x18\x88\xFE\xD5\x3C\xFB\x40\x82\x79\x57\x6F\x2C\x59\x14\x0B\x71\x62\xCA\x6D\xEE\x31\xB2\x2E\xE5\x93\x67\xC8\xC0\x93\x88\xDF\xE8\x5F\xAF\xE7\x1E\xA4\xC4\xDB\xB4\x23\x72\xC4\x0E\xED\x8B\xF8\xD3\x3E\xFF\x20\xDA\xA7\x1F\x91\x83\x06\xA2\x4A\x77\xFE\x41\x34\x33\x77\x13\x07\x0D\xD0\x1F\xC0\x90\x22\xDF\xAF\x56\xF6\xF5\x9E\x7F\xD0\x40\xD4\x3A\x6D\xF3\x0F\x62\xB3\xE6\x6F\x12\xFB\xC8\xA1\x0B\xB3\x2B\x2D\xE2\x7D\x8A\x0C\xF5\x3E\x17\x6F\x11\x22\x42\xC4\x52\x58\x11\x8B\xE6\xA4\xAE\x06\x61\x81\xD5\x46\x31\x5F\x44\xA1\xFD\x35\xFF\x28\x0E\xEE\xEF\xDA\x6D\x09\x87\x8E\x44\x14\xDA\xA7\x12\x07\xB1\xC7\x5A\x71\x98\x2F\xA2\xD0\x6E\x4A\x1C\x24\x83\x0C\xD1\x43\xEB\x22\xEA\x6C\xFE\xF7\x2B\xF3\x52\x8F\xC3\x1C\x45\xCC\x15\x51\x66\x73\xFB\xE3\xDC\x60\x39\x6C\x13\x2C\xE7\x8E\xB9\x22\xCA\xEC\x57\x7F\xCC\x9A\xA0\x68\x5E\xE7\xB1\xE8\x0F\xCC\x15\x51\x66\x37\xF4\x07\x7A\x11\x51\x66\x73\x9F\x0F\x9A\xD7\x79\x2C\xFA\x03\x73\x45\x94\xD9\xDC\xC5\x72\xCC\xEB\x3C\x16\x4F\x08\x31\x57\x44\x99\xCD\xFD\x33\x6C\x5E\xE7\xB1\x98\x62\x82\xB9\x22\xCA\x6C\xDE\x01\x1C\x4C\x4D\x7C\x91\x27\x82\x68\x57\xD4\x7B\xE1\xF3\x7E\x7F\x58\x17\x79\x8A\xEF\x99\xC2\x88\x46\xC5\x95\x59\x81\x43\x64\x92\x29\x8C\x68\x54\xFE\x2A\xB3\xAD\xEF\x54\xB9\xE2\x88\x36\x65\xAF\x32\x0F\x13\xDB\x5F\xC9\x16\x48\x34\xE8\x73\x54\x8D\xCD\x79\x36\xA8\x5E\x16\xEE\xBD\x6C\xA1\x44\x83\xE2\x6E\x2D\xCD\x39\xC2\xD2\xB8\xBE\x53\xE5\x8A\x24\x5A\x14\x57\x63\x73\x66\xC1\xDA\x56\x77\xBA\x6C\xA1\x44\x83\xE2\x6A\x6C\xCE\x53\x36\xDB\xEA\x4E\x97\x2D\x94\x68\x50\x5C\x8D\xD1\x1F\xE8\xC3\x65\x54\x8D\xD1\x1F\xE8\x43\xDC\xEF\x73\xFA\x03\x5D\x88\xAC\xB1\x9A\xFB\x23\x62\x6D\x09\x74\x2A\x76\x4F\x8E\xAA\xFB\x83\x2B\x08\xA6\x59\xC7\x56\xD8\x9C\xE7\x83\x96\x95\x6D\x82\x45\xB0\x30\xC5\x75\xF4\x8E\x35\xB3\xE6\xC0\x5A\x96\xB6\x89\xCF\xB9\x02\x8A\xA6\xC4\xDD\xBA\xBA\x98\xBB\x78\x89\x65\x69\x9B\x98\xBD\xF3\x15\xBA\xF4\x57\x6C\x81\xCD\x3B\x8C\xB7\xF9\x25\x11\x4B\xA3\xA2\x47\xB1\x05\x56\xE8\x30\xB9\x44\x2C\x3D\x8F\x0E\x45\x17\xD8\xF9\xCB\x33\x93\x75\xDE\xE3\xE4\xC2\x12\x8A\x18\x67\x52\x6A\xEB\x4F\x4F\x56\x83\xB7\x7B\x4D\x0E\x64\x89\x25\x4C\x30\xCA\x76\xC9\x84\xA1\x06\x31\x3D\x90\x05\x96\x30\xC1\xA8\x3C\xA5\x57\xEE\x48\xF1\x58\x21\x0E\xE3\xF2\xD4\xDE\x89\xDF\xBE\xCE\xDE\xAE\xE5\xE9\x39\xC6\x15\xAC\xBE\x7C\x87\x8A\x24\x08\x37\x2A\x53\xAC\xFC\x1C\xAD\x0C\xF7\x42\x13\x71\xD4\xA4\x48\x05\xE6\x3D\x48\x34\x69\xE0\x51\x81\xAB\x81\x79\x89\xAB\x4F\x46\x15\xF8\xC5\xCB\x8E\x38\xEF\x89\x83\x0F\xF7\x86\x8B\x27\xFD\x2B\xD1\xD3\x31\xBC\x76\xC7\xC4\x87\x9A\xE8\x58\xA8\x74\xAE\x07\xFF\xEB\x74\x36\x9F\x92\xC7\xDC\x8D\x19\xD0\x9F\x40\xE9\x1C\xE6\x5D\x5C\x1B\xD4\xE0\xC2\xE4\x53\xF2\x60\x79\x6A\x8C\x08\x54\xCE\xEA\xE9\xBF\x45\xBF\x12\x52\x0B\x76\x40\xC7\xB0\xC0\x2F\x83\xC3\xA3\x3D\x6F\x6B\x81\xDA\x63\xF2\x15\x06\x85\x0A\xE7\xF0\x1F\x5B\xEF\x0F\x96\x66\xC0\x88\x40\xE5\x1C\x6E\xEB\xF8\xFD\xD9\x60\x62\x51\xE0\xC7\xF9\xE7\x45\xB1\x43\x21\x87\x40\xED\x9C\x0F\xFC\xB7\x46\x14\x0E\x6F\x91\xC3\xC1\xD6\xD7\xC0\xA3\xC1\xC3\xE5\xC3\xE1\x64\x10\x2B\xC5\x02\x1C\x1A\xC0\x8A\x69\xC3\x35\x58\x05\xD2\xF7\x74\xF9\xA0\x3D\x0C\xB8\x18\x04\x62\x85\xFA\xE3\xEA\xEC\xAA\xC9\xF6\x28\x1D\xDF\xF1\x11\x7D\x7A\x5A\x16\x83\xBB\x68\x4E\x5D\x05\xEB\x28\x7A\x35\x13\xCF\x4A\x2D\xE5\x73\xFD\xF5\xD9\xE4\x81\x2D\x9E\xFF\x7F\x5E\x85\xF7\x26\xB0\xE8\x55\x9B\xBF\xCD\x4B\x05\x35\x76\x99\xD6\x82\x43\xC4\x44\x81\x34\x35\xF9\xE4\xA3\x50\x48\x43\x17\xE5\x89\x3E\x71\x19\x71\xC4\xA6\xF2\xEA\x50\x28\xA4\xD1\x0B\x51\xFE\xF1\xBC\xE6\xE9\x97\x55\xA1\x11\x23\x28\x3D\x97\xB5\x28\xF6\xB0\xDC\xE0\x95\x99\x8F\x58\xE6\x51\x23\x47\x2E\x7D\x2A\xB6\x8E\x4F\xC2\xCF\x8F\x01\xF3\x1B\xE4\x5F\x3E\xDD\xDC\xFC\xEB\xBF\x65\x38\xC1\x9E\x64\xC9\xA5\x4B\xE5\x16\x12\xCD\xD3\x20\xEF\x4F\xE7\x69\x25\x98\xE7\xE9\xF9\xE7\xCB\x93\xBF\x58\x0E\xFF\xDB\xF2\xDF\x8B\x9D\x76\x93\x4A\xA4\xD2\x85\x45\xC1\x5F\xBD\x05\xD7\xE0\x5E\x7F\x3B\xAC\x98\xB4\xFC\x7E\xF0\xF9\x78\x92\xB7\x9B\xCD\xE6\xEE\xF9\x7F\xB8\xDC\x96\x3B\xEF\x06\x95\xCB\xA4\x58\x27\x51\x5D\x7F\x3C\x7C\xD1\x33\x6F\x4D\xE2\xCD\xC8\x7A\x14\x8D\xAA\xFA\x64\xDF\xB9\x2F\x7A\xF2\x8D\x51\x27\xAF\x90\xAE\x63\x5A\xF4\xE4\xDB\x92\xE5\x6E\xA4\x43\x45\x83\xAA\x3E\xD9\x0F\xD8\x64\x31\x56\x93\x4F\xCA\x4F\x28\x1A\x54\xF5\xC9\x7E\x54\xF4\xF4\x1B\xF3\xB5\xC9\xB9\xBA\xEF\x14\x8D\xA8\xFA\x64\x4F\xE0\x0A\x12\xEF\x8B\x3A\x79\x05\x14\x0D\xA8\xFA\x64\x4F\xB9\x2B\x1A\x81\xA6\x5C\xDF\x78\xDB\x35\xD3\x5E\xD1\x80\xAA\x4F\xF6\xA4\x9B\xA2\x21\x68\x4B\xFB\xB7\x79\x8B\x86\x53\x7D\xB2\x01\xFF\x51\x34\x08\x4D\x51\xA7\x2E\x3B\xA2\xF9\xCB\x7F\x16\x8D\x42\x4B\xD4\x99\xCB\x8E\x60\x3E\x29\x19\x85\xA6\x34\x7F\x0B\xAB\x60\x2C\x1D\xAF\xCA\x5A\x30\x0A\x6D\x51\x27\x2E\xBF\xCF\x84\x8F\xFE\x88\xD6\xFE\x0D\xAC\x5C\xF3\xDB\xAF\x56\xCB\x81\x0D\x86\x7C\x29\x37\xC7\xBF\x35\x45\xDE\x59\x90\xCA\xB5\x88\x8E\xFA\xBC\x66\xC8\x14\x81\x0E\x54\xF3\x17\x30\x41\x86\x27\xC8\x06\xAF\x9A\x17\x64\x7F\xFE\xDD\x50\xA7\xAE\x88\xCE\xC3\xC6\x03\xF4\x78\xEA\xDC\x15\x61\x14\xAB\x5A\x97\xB5\xDF\x19\x9D\x7F\x8F\xD4\xB9\x2B\xA2\xEF\x58\xF1\x9E\x6D\x34\x75\xEA\x4A\x89\xDF\xAC\xF6\x9B\x7A\xE8\xE9\x0C\xEB\xA5\x37\xEA\xD4\x21\xB7\xE5\xC3\x5E\x5D\x64\x15\x53\x67\x0F\x99\xA9\x0B\xAC\x72\xEA\xF4\xE1\x2C\x70\xAF\xF8\x6D\x92\x7E\xFF\xF3\xAC\xAF\x7B\xC5\xCB\xA9\x39\x26\x29\x46\x82\x43\x1A\xBE\x7D\x9C\x04\xF7\x3A\x4B\xAF\xF7\x30\x9C\x31\xC5\x8B\x2D\xAC\x93\x19\x26\x1A\x91\x4E\xED\x37\x3F\xFB\x91\xFF\x5D\xCA\x3D\x08\x04\xD4\x7A\x43\xBF\x31\x4F\xDD\xF0\xE6\x5F\x44\x3C\xF0\xDF\xB0\xD4\x95\xB9\xF6\xA7\x26\xD6\xE2\x55\x26\xD8\x72\xCD\x0D\x5D\x3D\x20\x44\x5D\x13\xF8\xAD\xAE\x39\x76\x9D\x50\x17\x05\x5E\xB4\xBF\x32\x43\x8D\xD4\x55\x81\x17\x5C\x3E\x3C\x52\x57\x05\x5E\x84\xB6\x40\x87\x92\xBA\x2A\x70\xC4\xD7\x2B\x97\xD4\x65\x81\x23\x75\x21\xE0\x24\x75\x59\xE0\x48\x5D\x08\x38\x49\x5D\x16\x38\x52\x17\x02\x4E\x61\x9D\x11\x1F\xFE\x52\x17\x02\xDE\x5C\x2A\x8E\xFF\xEA\x6F\xAA\x7A\xC0\x5B\xD2\xC2\xC0\xC1\xEF\x34\x9C\xFF\xCE\x87\xBA\x2C\x70\x24\x2B\x0A\x0C\x51\x97\x05\x0E\x98\xB7\xEB\xD2\xE2\xA7\xBA\x30\x70\xD0\xFC\x9A\xD4\x35\x52\x17\x05\x7E\x53\x97\x42\xF7\x6E\x3E\xBF\xBC\x10\xF5\xE5\xEF\x7F\xFF\xAF\xFF\xFE\x9F\xDB\xFF\x65\x11\x1E\x47\xA4\xB5\x81\xE7\x6B\xC5\x61\x7E\x4F\xD6\xB5\xE5\x11\xA5\x97\x8D\x9D\x1D\x53\x97\x00\x06\x38\xDE\xC5\xA5\x17\xEA\x12\xC0\x10\x75\x75\x40\x5D\x01\x08\xEB\x61\xCF\x73\xE7\x32\x6C\xB8\x00\x2B\xEA\xE2\x00\xFD\xE1\x99\xBA\x38\x40\x7F\x78\xA6\x2E\x0E\xD0\x1F\x7E\xF5\xB0\x9F\x9A\x7B\xF4\x87\x5B\xEA\xD2\xC0\x05\xFD\xE1\x98\xBA\x34\x70\x41\x7F\xB8\xC5\xA2\x0C\x2E\xD0\x1F\x4E\xA9\x0B\x03\x07\x8F\xEA\x3A\xC0\x69\xEA\xC2\xC0\x13\x2E\x1F\x5E\xA9\x2B\x03\x4F\xD4\x55\x80\x10\x75\x65\xE0\x89\xBA\x0A\x10\xC0\xD4\x2B\x17\xD4\x65\x80\x00\x75\x61\xE0\x40\x5D\x06\x38\x89\x05\xA9\x9D\x50\x17\x02\x4E\x52\x97\x05\x8E\xD4\x85\x80\x93\xD4\x65\x51\xBF\x33\x9B\x27\xAC\xEA\x42\xC0\x49\x06\x99\xED\xDA\x71\x03\xE5\xF4\x7D\x85\xB4\x65\x80\x93\xAE\x58\xF4\x2A\xCD\xE2\xEC\xEC\xFA\x4D\x44\xA3\x03\x2A\xAA\x00\x0C\x61\x45\xEA\x44\xAB\xF7\x11\x8D\xFD\xA0\x3B\x45\xFA\x31\xC2\xB2\x54\xBA\xF4\xE5\x5D\x40\x63\xBF\x67\x49\xB2\x8F\x31\xA6\xB5\xD2\xA1\xEB\x77\xF1\x8C\x5C\xC3\x78\x23\x49\x3E\x46\xD9\x56\x4B\x77\xFE\x7A\x17\xCE\xF3\xC8\xCF\x91\xE4\x1E\xA3\x58\x34\x31\xCD\xDB\x85\x40\xBF\x46\xAE\xB1\xF7\x20\xCA\x3E\x46\xF0\x62\x54\x9A\xEF\x6F\xA2\x19\xFD\xC7\x46\x94\x7D\x8C\xB9\xB1\x2C\x96\x0E\xBD\x8D\x66\x64\x7F\xF0\xDE\x87\x5B\xB6\xD5\xD2\x9B\xCB\xDF\x3F\xCE\xAF\xBF\x7E\xBD\xBA\x8E\xFC\x69\xBE\x56\x16\x00\x06\x71\xFD\x48\xF0\xE7\xCE\x6E\xD2\x14\x4F\x61\xFA\x31\xE8\x9A\x67\xE7\xF1\x9E\x23\x98\xFC\x07\x86\x1B\xBB\x7E\xFD\xCD\xA2\x4E\x3A\xF5\x1C\x41\xAB\xCF\x81\x4B\xE9\xE9\xED\xD4\xF1\x27\xF5\xA7\xD4\xCF\xE1\xC6\xAE\x67\x3B\x83\x4A\xE9\xD1\x5F\xDF\x9E\xE3\x97\xBE\xDF\xAF\x36\xFF\x18\x64\x50\x29\x5D\xFA\xFA\x12\xC0\xD4\xFE\xE0\xC6\xAE\x6B\x26\xC5\xD2\x9F\x3F\x37\x75\xD3\x3E\x67\xF1\x43\x99\x7C\x8C\xB2\x29\x97\xDE\x7C\x37\x8A\x9F\x30\xF1\x98\xC4\xA6\x5E\x3A\xF3\x67\xBE\xEE\xB7\x94\x8F\xE1\xAB\x95\x7B\xB7\x56\x25\xD3\x93\x4F\xBF\xC3\x97\xB6\xDD\xAF\x30\xEF\x98\xE4\x87\x51\xC5\x74\xE5\xCF\x74\xDD\x94\x5B\xBB\xC2\xAC\x63\x2A\xB3\x9A\xE9\xC8\xEF\xDF\x1E\x49\xAF\x05\xDC\x28\xD3\x8E\x89\xAC\x6A\xA6\x23\xC7\xF6\x88\x7D\x07\xEA\x48\x9B\x76\x4C\xB2\x65\xD5\xC4\xD9\x8E\x3F\xCD\xD3\x7E\x78\xD0\x1F\x55\xA0\x3D\x66\x3B\x7F\x8E\x5C\xF2\x62\xDE\x3B\x6D\xE6\x31\x05\xFB\xD5\xCE\x75\x0C\x5C\xF2\x7A\x48\xD2\xB4\x63\x22\x66\xB6\xCF\x74\xFC\xED\x91\xFE\x41\xDA\xBC\x63\x1A\xFA\x63\x96\x97\xC7\x79\x06\x1F\x25\x4D\x3B\xA6\xD9\x1A\x24\xBA\x1F\x8B\xFF\x3B\x86\xCD\xE0\xB3\x6E\xA5\x79\xC7\x34\x06\x89\xEE\xC5\xD6\x34\x6A\xBA\x94\x63\x06\x83\x4C\xB7\xEF\xF1\x6E\x73\xB7\xFF\x13\x33\x8B\xF9\x38\xEC\xE0\x5C\x07\x83\x54\xB7\x6E\xF1\xEE\x3E\xAC\xC5\x57\x52\x5E\x17\xAC\xC2\xF6\xC1\x20\xD7\x0D\xFB\x79\x22\x66\x3B\x8B\x0F\x2E\x9E\x69\xC4\x60\x55\x9F\xA0\xFB\xDB\xC7\xCD\xC9\x07\x78\x26\x37\xFC\x4A\x27\x1A\x51\x2C\x52\xDD\xA6\xFB\x50\xC8\x6C\xE6\x1B\x94\x4C\x32\xA2\x99\xE4\xBA\x35\xAB\xCD\xED\xCF\xE0\xD4\x8F\x8D\xCD\x31\x4A\x26\x19\xD1\x6C\x92\xDD\x8C\xA7\xAF\x4E\x1F\x76\x81\x7A\xCB\xE8\x71\x6A\x99\xF4\x22\xC9\x2D\xCF\xCE\x5F\x3B\xF5\x63\xFC\x3D\xAB\x77\xC9\xB2\xE7\x16\xE9\x8C\x72\xDD\x82\xB3\xB3\xC7\xFD\x78\xC0\xCE\xCC\x6E\xF7\x65\xCF\x2D\xD2\x59\x25\xBB\x01\xD3\xDE\xE4\x33\xFA\xF1\x71\x41\x7F\x54\xC1\x2C\xDB\x0D\x98\xB2\xB7\xC0\xCE\xEE\x70\xD9\x73\x8B\x74\x76\xE9\x6E\xC0\x7A\x7C\xBE\xE0\xA3\xDD\xD1\x0A\x64\x17\x69\xB6\xF7\x76\xE9\x6E\xC2\x68\xC0\xEC\x0E\x35\x72\x93\x0C\x0E\xD0\x1E\xEF\x8C\x4D\x19\xB4\x3B\x12\xEB\x96\x54\xC0\xF0\xDB\x42\x33\x2E\x07\xE2\xB5\xB3\x3B\xCC\xB2\x58\x92\x11\xCD\xEE\x66\x4C\x4B\x82\xE1\xDA\x19\x1E\x84\xFE\xF0\xCF\x30\xDD\x4D\x09\x7D\xCB\xB2\x5C\xE7\x85\x8D\x38\xFD\x33\x4C\x77\x5B\x0A\xC4\x8B\xEB\x87\x7F\x96\xF9\x6E\xCB\xA9\x1B\xBD\xB6\xAF\xE9\xF3\xF2\xA0\x7F\xA6\x09\x6F\xCB\x89\x68\x99\xBE\x28\xB3\xDA\x9E\x38\x02\x7C\xB1\x4C\x78\x63\x3E\x3E\x9D\xB0\xBD\x7C\x08\xB2\x8D\x79\x78\xAF\x76\xC8\xDD\xFB\x70\x2D\x4D\x3F\x5E\x91\x70\xCC\x62\x9A\xEF\xF6\xBC\x6F\x10\xD3\x0F\xE7\xEE\x95\x7F\xA6\x09\x6F\xD0\x9B\x60\xED\x6C\xDF\x93\x61\x59\x6A\xFF\x4C\x13\xDE\xA0\x37\xAF\x9F\xDB\x7E\x19\xA5\x3D\x2A\x60\x9A\xF1\x16\xAD\xB2\x05\x4B\x96\x73\x4C\xB5\x67\x5D\x9F\x51\x7F\xEE\xC1\xEE\x6C\x3F\x58\x98\x77\x4C\x63\x9B\xF0\x46\xBD\x04\xEB\x67\xA6\xCF\x85\x5B\xC6\x19\x6F\xD3\xFA\x78\x05\xB1\xDE\x60\x4B\x9B\x7A\x4C\x60\x9C\xF1\x46\x2D\xB3\x04\x6B\x31\x9C\x1A\x38\x60\x9C\xF2\x56\x1D\x62\x65\xBC\x06\x12\x6F\x0E\x56\xC0\x36\xE5\xCD\x7A\xFA\x53\x6F\xB1\x97\xC1\x6B\xEA\xD4\x63\xD4\x96\x65\xE1\xA6\xDA\x98\xBF\x65\xA9\x4E\x3E\x46\x59\xDF\x90\xC1\x0C\xEA\xE4\x63\x14\x0B\x33\x08\xA9\x93\x8F\x51\x3C\x1C\x14\x52\x27\x1F\xA3\xAC\xD6\x58\x46\x04\x76\xAD\x75\x8F\xEB\x87\x12\xEF\x9E\x7B\x77\xA9\x2E\x91\xBE\xA9\xD3\x8F\x11\x3B\x75\x85\xF4\x4D\x9D\x7E\x0C\xBB\x53\x17\x48\xD7\x4E\xEF\xF9\x09\x3F\xD4\x15\xD2\x37\x75\xF6\x31\x46\x5D\x21\x7D\x53\x67\x1F\x63\xD4\x15\xD2\x37\x75\xF6\x31\x46\x5D\x21\x39\xEC\x2B\x59\xB1\x48\x9D\x7B\x8C\x53\xD7\x48\x0E\x4F\xE7\xB5\xB3\x5D\xA4\x2A\x87\x07\x75\xEE\x31\x4E\x5D\x24\x19\x1C\xDF\xF4\xFB\xE1\xBC\x43\x36\xDA\xC4\x63\x12\x75\x95\x64\xF0\xFB\xDC\x5C\x4F\x4D\x66\xD5\xDD\x2A\xA8\xCB\xC4\xDE\xAB\xE5\xD0\x7F\xFA\x9D\x5C\xC6\x8B\xB5\x35\x68\xF1\xE9\xE0\x9B\x13\xBC\xF4\xFA\xF6\xD7\x4F\x51\xC6\x31\x87\xBA\x4A\x4C\xED\x9F\x7B\xE1\xDD\x29\xEE\xC5\xA3\x3A\x6D\x2F\x49\x37\x66\x52\x97\x89\xA9\xE3\xE9\xD4\x70\x8E\xDC\xBA\xAA\x83\xBA\x4E\x4C\xFD\xBA\x56\xAC\x17\xEB\x0F\xB7\x85\x36\x8B\x5F\xD4\x63\x7B\x8B\x1D\x9D\x2B\xA1\x2E\x14\x53\x43\x55\xE7\x6B\x16\x7F\xB1\xFC\x22\x8D\xBA\x50\x4C\x8D\xDC\x12\xF2\xB3\x83\x75\x99\xDC\x22\x9D\xBA\x52\x4C\x8D\xED\x73\xE9\xE5\x79\x21\x4F\x3E\xAA\xA1\x2E\x15\x53\x95\x9C\x70\xEE\x9C\xC2\x8E\xBA\x56\x2C\x4D\x7B\x95\x5B\x3D\xCA\x8F\xBB\x19\xC2\x2B\xEB\xD5\x00\xA5\x26\x9F\x75\x25\xC3\x84\x9C\xB3\xBB\x9E\x69\x26\x9F\xB5\xF4\x77\x3A\x0B\xFA\x54\x44\x59\x28\xD6\xE6\x2C\x94\xA3\xBB\x6E\x66\x4B\x25\x32\x90\x95\x49\x06\xF3\xCE\x7C\x57\xC3\x20\xA1\x25\x2A\x92\x2C\xE6\x4E\xF7\x93\x0C\x92\x49\x57\x35\xF1\x39\x71\x2F\xCE\xFC\xB3\xB7\xDE\xC9\x23\xCB\x20\x21\xD4\xD0\xC2\xED\x31\x7F\x98\x8B\xDF\x9C\xE0\x7D\xC1\xBA\xF8\x9A\x92\x94\x22\x32\x00\x55\x0C\x12\x2A\xD6\x3B\xB1\xCA\x44\xAF\x41\x78\xB7\x2E\x37\x48\x7E\x7B\xD4\xA6\x95\xFE\x48\x89\x41\x15\x83\x84\xC4\xB6\x58\x71\x64\x95\xF6\x87\xB9\xD0\x3A\x59\x4C\x49\xAC\x8F\xEB\xD5\x3D\x26\x4B\xDD\x40\xA3\xCC\x28\x4D\x12\x86\x92\x1A\x99\x5C\x92\xBE\x00\x7A\x89\x40\x18\xE4\x0B\x65\x15\xA8\x8A\x02\x2C\x7E\xF6\xE6\xDF\x41\x8B\x5B\xBB\xF5\xC9\x5E\x14\x25\xAC\xAB\x88\x85\xCD\x20\x51\x54\xE6\x9A\x28\xC2\xEA\xA6\xE9\x2E\xE3\x18\x37\x4C\xD9\xAD\x51\x13\x77\x77\xED\xC2\x91\x6D\x88\x7C\xB5\xAA\x92\x60\xFA\x91\xA5\xD5\xD9\xD9\xDE\x76\x6B\xB2\x4C\x03\x35\x1D\x23\x8A\xC9\x54\x0E\xA5\xD4\x12\x11\x5E\xA6\xAD\x54\x96\x6A\x28\xA4\x9E\x90\xFC\xC8\x34\x54\xE4\x96\xA1\x18\x0A\xC9\xB6\xF0\x79\x86\xB5\xBA\x73\x0D\x15\xB9\xD9\xD7\x42\x09\x46\xB7\x73\x8B\x05\x25\xEF\x70\x91\x8F\x79\x29\x94\x91\x39\x2A\xC6\xAF\x8C\x31\xEB\xAA\x5A\xB6\x85\x50\xCA\xAA\xAA\xB8\x64\x1F\x2C\x32\xA9\x74\xE1\xAB\x22\xB1\xA9\x6B\xB4\xC8\xC1\xAC\x06\xCA\x2A\x12\x1B\xAB\x2D\xD9\x8A\x0C\x16\x59\x18\x95\x40\x69\x35\x45\xA7\xD0\x58\x91\x83\x49\x05\x94\x57\x28\x3A\x16\x0B\x57\xD8\x3E\xDC\x47\x59\x06\x05\xA0\x50\x4F\x7C\xB8\x73\x55\xB1\x6D\xB5\xAF\x46\x95\x8B\x51\xE2\xF4\xCD\x72\x03\x85\xB9\x7A\x5F\xAC\xBD\x2C\x17\xA4\xA4\x71\x32\xA5\xBD\x66\xF5\xF6\x47\xC9\x3F\xCC\x09\x33\x9C\xC7\x36\xB2\x82\x6B\x35\xCF\x6D\x2F\xF8\x97\x39\x7A\x8C\xD9\x66\x88\xA1\x88\x4A\x9F\x0E\x3E\x2B\x5A\x7C\x51\x23\x4C\x5D\x51\x05\x5A\x19\xE6\xA9\x96\x54\x32\x54\xFB\xB9\x77\x32\x96\xCB\x65\xFE\x39\x30\xC8\x2A\x4B\xD5\x96\xE3\x39\x58\x65\xC7\x86\x2C\xF2\x94\x6D\x39\x25\x9F\x2D\xCC\x99\xD0\x5B\x70\x58\xC8\x28\x5B\xE1\x96\x52\x30\x56\x33\x6E\xF5\xF1\xAE\x60\x23\xF2\x15\x6E\x29\xE5\xD6\x04\x99\x7A\xFD\x28\xF8\x60\x06\x99\x65\x2D\xDD\x22\x32\xBF\x46\xF8\xCA\xC4\xA9\x06\xDC\xD1\x6D\x48\xE6\xE2\x2D\xA0\xF4\x2D\xA2\x91\xE1\x14\x1E\x0D\x72\xDA\x4A\xB7\xFF\x36\x52\xF8\xEB\xCC\xF6\x3E\xBC\xD7\xD6\xE5\x8A\xA9\xBA\x2D\xB1\x7A\xFD\x47\xAB\xFC\x6E\x4C\xEF\x06\xF0\xF2\x2F\x98\xA8\xDB\x98\xE2\xA5\x9C\x05\x13\x00\x91\x87\xBA\xB2\x6D\xD0\x1F\xC8\x43\x5D\xD9\x36\xE8\x0F\x64\x61\xBC\xC2\x93\x0A\xFD\x81\x1C\x0A\x6D\x47\x99\x1D\xFD\x81\x1C\xD4\x75\x6D\x85\xFE\x40\x0E\xEA\xBA\xB6\x42\x7F\x20\x07\x75\x5D\x5B\xA1\x3F\x90\x83\xBA\xAE\xAD\xD0\x1F\xC8\x41\x5D\xD7\x56\xCA\x3F\x3F\x47\x0F\xD4\x75\x6D\xE4\x86\x69\x1D\xC8\x41\x5D\xD8\x36\x98\x4E\x8E\x3C\xD4\x95\x6D\x44\x1D\x46\x34\x4A\x5D\xD8\x46\xD4\x61\x44\xA3\xAA\x5D\x79\xF7\x2D\x75\x18\xD1\xA8\x9A\x97\x16\x7D\x45\x1D\x46\x34\xAB\x89\x2B\x88\x3A\x88\x68\x97\xBA\xB6\x2D\xA8\x63\x88\x86\xA9\x8B\x3B\xDD\xBD\x3A\x84\x68\x98\xBA\xBA\x4D\xDC\xA8\xA3\x88\x56\x2D\xD5\xB5\x6D\xE2\x41\x1D\x46\x34\x4B\x5D\xDB\x26\x98\x62\x82\x4C\xD4\xA5\x6D\x43\x1D\x45\x34\x6A\xAB\xAE\x6C\x23\xEA\x38\xA2\x51\xFB\xC7\x36\x7E\x83\xAC\xD7\x6B\x16\x86\x46\x0E\x6D\x34\xC8\x13\x75\x24\xD1\xA2\x9D\xBA\xAC\x4D\x71\x33\x0B\xC6\x1A\x99\x89\x75\xC4\xFB\xB6\x30\xA6\x2E\x69\x7B\xEA\x88\xA2\x25\xEA\x6A\xB6\xB7\xE5\x91\x08\xCC\xA8\xAB\x39\x0B\x75\x50\xD1\x0C\x75\x29\x67\xC3\xD4\x2C\x18\x50\x97\x71\x46\xEA\xD0\xA2\x01\xEA\x22\xCE\x8E\x35\xB2\x90\x40\x5D\xBE\xF9\xA9\x23\x8C\x9A\xA9\xAB\xB7\x18\x75\xA0\x51\xA5\x56\xB6\x02\x19\xB7\xB9\xBD\xBD\x65\x93\x59\xCC\xD4\xC2\x46\xCF\xD3\xFD\x54\x87\x1B\x95\xE9\xAB\x3F\x7E\xD9\xA8\x23\x8E\x9A\x3C\xAA\xEB\xB5\x38\x75\xC4\x51\x93\x7B\x75\xB9\x6A\x3C\xAA\xE3\x8E\x3A\xDC\xAA\x2B\x55\x84\xAF\x59\x98\x62\xA7\x2E\x54\x21\x75\xEC\x51\x81\x5E\x2F\x20\x4F\x1E\xB9\x8A\x60\x8C\xBA\x48\xB5\xD4\xD1\x87\x77\xEA\x0A\x55\x63\x1F\x2A\x0C\xB9\x54\x17\xA8\x1A\xAB\x9F\x60\x90\xBA\x40\xF5\x78\x5B\x04\x61\x2B\x75\x79\xEA\xA9\x53\x00\xC7\x5A\x59\x4A\x31\xD5\x52\x9D\x08\xF8\xB4\x57\x57\xA6\x13\x0B\xD6\x76\xC0\x29\xEA\xC2\x74\x43\x9D\x08\xB8\xA4\x2E\x4B\x3F\x7E\xA8\x53\x01\x87\xD4\x55\xE9\x88\x3A\x15\x70\x48\x5D\x94\xDE\xA8\xF3\x01\x5F\xD4\xF5\xE8\x8E\x3A\x21\x70\x45\x5D\x8E\x3E\xA9\xB3\x02\x2F\xD4\x95\xE8\x93\x3A\x2B\xF0\x42\x5D\x89\x3E\xA9\xB3\x02\x37\x3A\x7D\xCD\x76\x14\x93\x7B\x71\xA0\x2E\x44\xB7\xD4\x89\x81\x0B\x0B\x75\x1D\x3A\xA6\xCE\x0D\x1C\x50\x17\xA1\x67\x4C\xCB\x82\xBA\x06\x9D\x53\xA7\x07\x62\xEA\x02\x74\x8E\xB9\xEF\x9D\x53\x17\xA0\x77\xDC\xC9\xEA\x9B\xBA\xFE\xFC\x53\x67\x08\x4A\xEA\xEA\xF3\xEF\x41\x9D\x22\x08\xA9\xAB\xAF\x06\xEA\x1C\x41\x47\x5D\x7B\x35\x60\x7F\x9D\x7E\xA9\x6B\xAF\x06\xB7\xEA\x24\x41\x46\x5D\x7B\x75\xE0\x2E\x56\xAF\x7E\xA8\x4B\xAF\x0E\x34\x48\xB7\xD4\xA5\x57\x89\x3B\x75\x9E\xA0\xD1\xF3\x4E\x07\x73\xF0\x2B\xBD\x57\xEA\xCA\xAB\x05\x93\x4D\xFA\xA4\xAE\xBB\x6A\xB0\x4F\x74\x97\xD4\x65\x57\x0F\xF6\xF7\xEC\x91\xBA\xEA\x2A\xC2\x57\xAC\x0E\xA9\x8B\xAE\x26\x7B\x75\xB2\x50\x9C\xBA\xE6\xEA\xC2\x77\xAC\xDE\x70\x87\x77\x16\x1A\xA4\x37\xDD\xEF\x45\x38\x93\x3A\x5F\x28\x6B\xA9\x2E\xB8\xDA\x70\xA3\xB7\x2B\xAC\xF2\x33\x97\x3A\x63\x28\x89\xEB\xC7\x6C\xF7\xEA\x9C\xA1\x9C\x3B\x75\xB5\x55\x48\x9D\x33\x94\xA4\xAE\xB6\x0A\x31\xA1\xB7\x23\xEA\x62\xAB\x91\x3A\x67\x28\x47\x5D\x6B\x55\x52\x27\x0D\xC5\xEC\x1F\xD4\xC5\x56\xA3\x8D\x3A\x6D\x28\x46\x5D\x6B\x55\x62\x36\x56\x37\xD4\xA5\x56\x2B\x16\x79\xEF\x83\xBA\xCE\xAA\xA5\x4E\x1C\x8A\x50\x97\x59\xBD\xD4\x99\x43\x09\xFC\x40\x8F\xA6\x4E\x1D\x8A\x50\x97\x59\xBD\xD4\x99\x43\x09\x3B\x75\x99\xD5\x8B\x57\x42\xBA\xA0\x2E\xB3\x7A\xA9\x33\x87\x22\xD4\x65\x56\x2D\x75\xE2\x50\x86\xBA\xCE\x6A\xA5\xCE\x1B\x4A\x61\xAE\x7B\x14\xA6\x9A\xF4\x82\x15\xDD\xA3\xA8\xD3\x86\x62\xB6\xEA\x5A\xAB\x91\x3A\x69\x28\x67\xCB\x97\xAC\xD9\xD4\x39\x43\x49\xEA\x6A\xAB\x8F\x3A\x63\x28\x4C\x5D\x70\x95\x51\xA7\x0B\xA5\xA9\x2B\xAE\x2E\xEA\x6C\x41\x40\x5D\x74\x35\x61\xC5\x9F\xFE\xB0\x32\xEF\x0C\xEA\x64\x41\x81\x16\x99\x4A\x9D\x29\x48\xEC\xD4\x75\x57\x0B\x75\xA2\xA0\x71\xAF\x2E\xBC\x4A\xA8\xF3\x04\x19\x16\xB0\x9E\x40\x9D\x24\xE8\xA8\x6B\xAF\x06\xEA\x1C\x41\x49\x5D\x7D\xFE\xA9\x33\x04\xA5\xBB\xB5\xBA\xFE\xDC\x53\xA7\x08\x5A\xEA\xFA\xF3\x6E\xA7\x4E\x10\xA4\xD4\xF5\xE7\x1D\xBB\xAE\xF5\x4D\x5D\x7F\xDE\xB1\x23\x48\xF7\x76\xEA\x1A\xF4\x8C\x55\x7E\xF0\xA8\x2E\x42\xC7\x6E\xD4\xC9\x81\x0B\xF4\xC8\x69\x0B\x75\x62\xE0\xC3\xFD\x7A\xCD\xDD\xDE\x13\xD4\x79\x81\x23\xEA\x62\x74\x88\x1B\x58\xF8\xE3\x52\x5D\x8E\xEE\xF0\x8A\x14\x5E\x61\xD6\xE2\x3B\x6B\x75\x46\xE0\x91\xBA\x2C\xFD\x50\x67\x02\x1E\x71\x3F\xEB\x85\x3A\x13\x70\x4B\x5D\x9A\x2E\xA8\x93\x00\xB7\xB6\xF7\x37\xEA\xEA\xD4\xBB\x65\x37\x5B\x84\xA9\xCB\x53\x6F\xA5\x4E\x01\x3C\xE3\x55\x75\x75\x06\xE0\x9A\xBA\x3C\xE5\xD4\x09\x80\x77\x7B\x75\x89\x4A\xA9\xA3\x0F\xF7\xBA\xDE\x60\x47\x1D\x7C\xF8\xA7\xAE\x51\x25\x75\xEC\xE1\x9F\xBA\x46\x95\xD4\xB1\x87\x7F\xEA\x1A\x55\x52\xC7\x1E\xFE\xA9\x6B\x54\x49\x1D\x7B\xF8\xA7\xAE\x51\x25\x75\xEC\xE1\xDD\x52\x5D\xA2\x52\xEA\xE8\xC3\xB9\xBE\x1F\x7F\xD0\x1F\x18\xD4\xFB\x76\x3A\xEA\xF8\xC3\xB3\xED\x4A\x5D\x9F\x6A\xAC\x61\x82\xB0\x3B\x75\x79\x3A\xA0\xCE\x01\xFC\x62\xC9\x86\x03\x75\x1A\xE0\x54\xDF\xF7\xAE\x7E\x53\xA7\x01\x4E\xD1\x1F\x07\xEA\x34\xC0\x29\xFA\xE3\x09\x2F\x11\xE2\x34\xFA\xE3\x82\xAB\x07\x82\xE8\x8F\x0B\xFA\x03\x41\xF4\x07\x4F\x40\x10\x46\x7F\x5C\x2C\xD5\x39\x80\x5F\xF4\xC7\xC5\x0F\x75\x0E\xE0\x17\xFD\xC1\xCF\x0F\x84\xD1\x1F\xF4\x07\xC2\xE8\x0F\xFA\x03\x61\xF4\x07\xFD\x81\x30\xFA\x83\xFE\x40\x18\xFD\x41\x7F\x20\x8C\xFE\xA0\x3F\x10\xD6\xF5\xD2\xA2\x47\xEA\x1C\xC0\x2F\xB6\xC8\x61\x7A\x09\xC2\xD8\xD1\x96\x3D\x9E\x11\x44\x7B\xF0\xED\x0A\x61\xEA\xE2\x74\x40\x9D\x02\x38\xA6\x2E\x4E\x07\xD4\x29\x80\x63\xEA\xE2\xD4\xBB\x53\xA7\x00\x8E\xA9\xAB\x53\x4E\x9D\x00\xB8\xA6\x2E\x4F\xB1\x4B\x75\xFC\xE1\x9B\xBA\x40\xC5\xD4\xE1\x87\x73\xEA\x02\x95\xE2\xC5\x5A\x8C\x50\x97\xA8\x94\x3A\xF8\x70\xAE\xEF\xAD\x0D\xD4\xD1\x87\x77\x3D\xEF\x6D\xC0\xAC\x2B\x8C\xD9\xA8\x8B\x54\x48\x1D\x7B\x54\xA0\xDB\xDD\x3F\x7E\xAA\x23\x8F\x2A\xA8\xEB\x54\x44\x1D\x76\x54\x42\x5D\xA8\x12\xEA\xA0\xA3\x1A\xEA\x52\x55\xD8\xA9\x83\x8E\x6A\xA8\x6B\x55\x40\x1D\x72\x54\x44\x5D\xAC\xE5\xF1\xCB\x1C\xD3\xA9\xAB\xB5\x38\x75\xC0\x51\x15\x75\xB9\x96\xB1\xBC\xDB\x5F\x2E\x96\x77\xBB\xAD\x3A\xDC\xA8\x8C\xBA\x72\x4B\x58\xAB\x83\x8C\x6A\xA9\x6B\x37\xC1\xF1\x0C\xF6\xA7\x4F\x65\xB1\x0F\x9C\x31\x30\x9D\xA6\xB4\x13\xAD\x2E\x7F\xD5\xFF\xC7\xBB\xB4\xAF\xFE\x8F\xC5\xAD\x20\x96\x68\x8F\xAA\xC4\xE3\x51\xF9\x28\xE5\xA7\xBA\xD8\xA7\x59\x2C\x16\xEB\x87\xCD\x6E\xBB\xDD\xEE\x37\xB4\x07\x8A\x51\x17\xFE\x44\xEA\x30\xA1\x53\xEA\xC2\x1F\xA3\x8E\x0F\xFA\xA6\xAE\xFF\x11\x0F\xEA\xF8\xA0\x67\x97\xEA\xFA\x1F\xA1\x8E\x0F\xFA\xA6\xAE\xFF\x31\xEA\xF8\xA0\x6F\xEA\xFA\x1F\xA3\x8E\x0F\xFA\xA6\xAE\xFF\x11\x2C\x8C\x0B\x29\x75\x03\x0C\x53\x47\x07\x9D\xF3\xBD\x35\x8E\x3A\x3A\xE8\xDC\x5E\xDD\x01\x83\xD4\xD1\x41\xE7\xB8\x7A\x00\x61\xEA\x0E\x18\xC4\xDC\x74\x88\xA9\x5B\x60\x88\x3A\x36\xE8\xDD\xC6\xF3\xD7\x2B\xDE\x82\x85\x98\xBA\x05\x86\xA8\x63\x03\xA8\x7B\x60\x80\x3A\x34\x80\xE3\xFE\x50\x47\x06\xB8\x57\x37\x41\x98\x3A\x34\x80\xE3\xAB\x07\x37\x76\xA1\xA7\xEE\x82\x20\x75\x60\x80\x33\xBF\xFD\xA1\x8E\x0B\xF0\x44\xDD\x07\x01\xEA\xB0\x00\x07\xEA\x46\x38\x4D\x1D\x15\xE0\x99\xBA\x13\x4E\x52\x07\x05\x38\x52\xB7\xC2\x29\xEA\x98\x00\x2F\xD4\xBD\x70\x02\x37\x76\xE1\x86\xBA\x19\x3E\x52\x47\x04\xF8\x43\xDD\x0D\x1F\xA8\x03\x02\xBC\xA2\x6E\x87\xF7\xD4\xF1\x00\x5E\xF1\xB6\x6E\xA2\x3A\x1E\xC0\x2B\x3B\x75\x3F\xBC\xC3\xEB\x50\xF0\xE4\x56\xDD\x10\x6F\xA9\xC3\x01\xBC\xF1\xA8\xEE\x88\x37\xB8\xB1\x0B\x5F\x5C\xF5\x87\x3A\x18\xC0\x3B\x9E\xFA\x43\x1D\x0B\xE0\xBD\x8D\xBA\x29\xFE\x50\x87\x02\xF8\xC0\xCF\xA6\x9C\xEA\x48\x00\x1F\x2D\xD5\x6D\xF1\xE2\xE3\x0E\xE6\x80\xDA\x8D\xBA\x2D\x5E\xA8\x03\x01\x9C\xA0\x6E\x8B\x17\x5C\x3D\xE0\x91\xBA\x2F\x8E\xD4\x61\x00\x4E\x52\x37\xC6\x33\x75\x14\x80\xD3\xD4\x9D\x71\xA0\x0E\x02\x10\xA0\x6E\x8D\x27\xEA\x18\x00\x21\xEA\xDE\xB8\xE0\xA7\x39\x1C\x53\x37\x07\x57\x0F\x78\xA6\xEE\x0E\xDE\xF7\x80\x67\xEA\xF6\xB8\x57\x07\x00\x08\xD2\xBF\x5B\x7B\xA3\x0E\x01\x10\xA4\xEE\x0E\x5E\x88\x82\x67\xEA\xEE\x58\xAA\x03\x00\x84\xA9\x27\x27\x2E\xD4\x01\x00\xC2\xE4\x1B\xAB\xA9\x03\x00\x0C\x10\x77\xC7\x4F\xF5\xF9\x03\x03\xF6\xDA\xF6\x58\xAB\xCF\x1F\x18\xA2\x7D\xB3\x96\xAB\x07\x7C\x93\xAE\x0C\xC7\x73\x0F\x38\xA7\xEC\x8F\x47\xF5\xC9\x03\x23\x84\xDF\xAF\x68\x0F\xB8\x27\xEC\x0F\xF5\xA9\x03\xA3\x64\xDF\xAF\x6E\xD5\x67\x0E\x8C\xBB\x53\xF5\x87\xFA\xC4\x81\x09\x54\x2B\x8B\xAA\xCF\x1B\x98\x42\x34\xBD\x84\x49\x57\xA8\x82\xE8\xE5\x0F\xE6\xEC\xA2\x0A\x3F\x24\xED\xF1\xC0\x72\x0C\xA8\xC2\x5A\xD1\x1E\xEA\x93\x06\xA6\xD9\x96\x6F\x8E\x4B\xF5\x39\x03\x53\xED\xCA\xF7\x87\xFA\x94\x81\xC9\x8A\x3F\x3E\x7F\x50\x9F\x31\x30\x5D\xF1\xC7\x83\xEA\x13\x06\x66\x58\x95\xED\x0E\x1E\x7B\xA0\x2A\x45\x37\x56\x5B\xAE\xD4\xA7\x0B\xCC\xB2\x28\xD8\x1E\xEA\x73\x05\xE6\xA2\x39\x80\xA0\x62\xAB\x33\x6C\xD4\x67\x0A\xCC\xF7\x98\xB7\x2B\xD4\xA7\x07\x24\x79\xC8\xDA\x1E\x4C\x42\x44\xDD\x72\x5E\x3F\xD4\xE7\x06\xA4\xDA\xE6\xFA\x01\xB2\x62\xF1\x05\xB4\x20\xCF\x04\x13\xF5\x59\x01\x46\x32\x2C\xD0\xC0\x6E\x69\x68\x87\xF9\x1B\x20\xBC\xFB\x84\x86\x18\xBF\x02\xA2\x3E\x1D\xC0\x96\x69\x7B\xB0\xD5\x26\x1A\x63\xD9\x1E\x4C\xD0\x45\x6B\x2C\xFB\x83\xAF\x57\x68\x8D\x65\x7B\xF0\xF5\x0A\xAD\xB1\xEB\x0E\x6E\xEC\xA2\x3D\x66\xED\xC1\x6E\x50\x68\x90\x51\x77\xA8\x4F\x03\xC8\xC2\xA6\x3D\xF8\xE5\x81\x36\x99\xB4\x87\xFA\x24\x80\x4C\x68\x0F\x20\x8C\xFE\x00\xC2\xE8\x0F\x20\xCC\xA0\x3D\x58\x73\x1A\xCD\x4A\x6F\x0F\xF5\x19\x00\xF9\x24\xB7\xC7\x5E\x7D\x06\x40\x3E\x5C\x3D\x80\x30\xDA\x03\x08\xA3\x3D\x80\x30\xDA\x03\x08\xA3\x3F\x80\x30\xFA\x03\x08\x4B\xE8\x8E\x07\x5E\xF9\x40\xEB\xB8\x7A\x00\x61\xF4\x07\x10\x46\x7F\x00\x61\xD1\xDD\x71\xA7\x1E\x39\x90\x5F\x74\x7F\xB0\x69\x1A\x9A\x97\xB0\xC1\x01\xAF\x9C\xA3\x79\x37\xF1\xFD\xC1\x72\x57\x68\x5E\x7C\x7B\xA8\x47\x0E\xE4\x47\x7F\x00\x61\xF4\x07\x10\x46\x7F\x00\x61\xD1\xED\x71\xAB\x1E\x39\x90\x1F\x57\x0F\x20\x8C\xFE\x00\xC2\xE8\x0F\x20\x8C\xFE\x00\xC2\x22\xDB\x63\xA9\x1E\x37\x50\x02\x57\x0F\x20\x2C\xAA\x3D\x98\xD9\x8E\x4E\xC4\xB4\x07\x5F\xAE\xD0\x8B\x98\xFE\x58\xAB\x07\x0D\x14\x12\xD3\x1F\x2B\xF5\xA0\x81\x42\x62\xFA\x83\xA9\x25\xE8\x45\x44\x7B\xDC\xF3\x62\x14\x7A\x11\xD1\x1F\xEA\x21\x03\xA5\xAC\xE8\x0F\x20\x64\x1F\xD1\x1E\x0B\xF5\xA0\x81\x42\x22\x56\x2F\x51\x0F\x19\x28\x26\xE2\xFA\xA1\x1E\x32\x50\xCC\x96\xFE\x00\xC2\xEE\xE6\xB6\x07\x8B\x26\xA2\x27\x5C\x3D\x80\xB0\x79\xED\xC1\x7E\x38\xE8\xCB\xAC\xF6\x60\x62\x22\x3A\x33\xAB\x3F\x78\xF4\x81\xCE\xCC\xEA\x0F\xDE\x8B\x42\x67\xE6\xB4\x87\x7A\xAC\x40\x69\xF4\x07\x10\x46\x7F\x00\x61\xD3\xBB\xE3\x71\xA7\x1E\x2B\x50\x1A\x57\x0F\x20\x6C\x6A\x77\x70\xF1\x40\x8F\x2E\xB9\x7A\x00\x41\xD3\x66\xB8\xFF\x50\x0F\x13\xD0\x98\xD4\x20\xEA\x41\x02\x2A\xB4\x07\x30\x60\x43\x7F\x00\x61\x63\xED\x71\xAF\x1E\x20\x20\x34\xD2\x1E\x1B\xD6\x83\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\xF4\xFF\xD5\xCD\x16\x44\x79\x47\xED\x20\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82",
vector(19, 16)
),
wallbang_png = render.load_image(
"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x02\x00\x00\x00\x02\x00\x10\x04\x00\x00\x00\x0E\xE1\xC0\x32\x00\x00\x00\x04\x67\x41\x4D\x41\x00\x00\xB1\x8F\x0B\xFC\x61\x05\x00\x00\x00\x20\x63\x48\x52\x4D\x00\x00\x7A\x26\x00\x00\x80\x84\x00\x00\xFA\x00\x00\x00\x80\xE8\x00\x00\x75\x30\x00\x00\xEA\x60\x00\x00\x3A\x98\x00\x00\x17\x70\x9C\xBA\x51\x3C\x00\x00\x00\x02\x62\x4B\x47\x44\x00\x00\xAA\x8D\x23\x32\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x00\x60\x00\x00\x00\x60\x00\xF0\x6B\x42\xCF\x00\x00\x3D\xCA\x49\x44\x41\x54\x78\xDA\xED\xDD\x77\xB8\x15\xD5\xF9\x3E\xFC\xFB\xD9\x74\xE9\x52\x44\x08\x8A\x20\x58\x40\x94\x28\x48\xEC\x1A\x44\x8D\x25\x46\x05\x8D\x05\xDB\x37\x18\x93\x28\xC4\xBC\x09\x26\x31\x11\x35\xC5\x12\x7F\x91\x98\x88\xA0\x44\x45\x31\x06\xAC\x41\x63\x01\x13\x0B\x6A\x22\x01\x05\x04\x81\xA3\x54\x11\xA4\x77\x4E\x9D\xFB\xFD\x63\x04\x11\x29\xA7\xEC\xBD\x9F\x99\xBD\xEE\xCF\x75\x9D\xCB\x23\x96\xFD\xCC\x5A\x7B\xCF\xDC\x7B\xCD\x9A\xB5\x00\x11\x09\x06\xA3\x03\x0F\x24\xFF\xF8\x47\x72\xD6\x2C\x72\xF3\x66\x72\xD3\x26\x72\xFA\x74\xF2\xF6\xDB\xC9\x0E\x1D\xBC\xEB\x13\x11\x11\x91\x2C\x22\xCD\xC8\x5F\xFE\x92\x2C\x29\xE1\x2E\x6D\xD9\xC2\xE8\xA7\x3F\x25\xCD\xBC\xEB\x15\x11\x11\x91\x2C\x20\xFF\xFC\x67\x56\x56\x74\xE7\x9D\xDE\xF5\x8A\x88\x88\x48\x0D\x91\x17\x5D\x54\xE9\x8B\xFF\xB6\x10\x70\xD6\x59\xDE\x75\x8B\x88\x88\x48\x35\x31\xAA\x53\x87\x9C\x37\xAF\xCA\x01\x80\x33\x66\xE8\x56\x80\x88\x88\x48\x4A\x91\xD7\x5E\x5B\xF5\x8B\xFF\xD6\x51\x80\x7E\xFD\xBC\xEB\x17\x11\x11\x91\x2A\x22\x9B\x37\x67\xB4\x62\x45\xB5\x03\x00\x17\x2D\x22\xF7\xDA\xCB\xFB\x38\x44\x44\x44\xA4\x0A\x18\x8D\x1A\x55\xFD\x8B\xFF\x56\xB7\xDD\xE6\x7D\x1C\x22\x22\x22\x52\x49\xE4\x39\xE7\xD4\xFC\xE2\x4F\x92\x65\x65\x8C\x8E\x3E\xDA\xFB\x78\x44\x44\x44\x64\x0F\x18\xB5\x6A\x45\x2E\x5B\x96\x9D\x00\x40\x92\xB3\x67\xEB\x56\x80\x88\x88\x48\x82\x91\xB5\x6A\x31\x7A\xE5\x95\xEC\x5D\xFC\xB7\x7A\xF0\x41\xEF\x63\x13\x11\x11\x91\x5D\x88\x97\xF9\xCD\x91\xE8\x47\x3F\xF2\x3E\x3E\x11\x11\x11\xD9\x01\xA3\xCB\x2E\xCB\xD9\xC5\x9F\x24\x59\x56\x46\x9E\x7C\xB2\xF7\x71\x8A\x88\x88\xC8\xE7\xC8\xDE\xBD\xC9\x2D\x5B\x72\x1B\x00\xC8\xF8\xB1\x42\x6D\x1A\x24\x22\x22\xE2\x8E\xD1\x61\x87\x91\x2B\x57\xE6\xFC\xE2\xBF\x4D\x51\x11\xB9\xEF\xBE\xDE\xC7\x2D\x22\x22\x12\x2C\x46\x5D\xBA\x90\x4B\x97\xE6\xEF\xE2\xBF\xD5\xEC\xD9\x8C\xF6\xD9\xC7\xFB\xF8\x45\x44\x44\x82\xC3\xE8\xC0\x03\xC9\x25\x4B\xF2\x7F\xF1\xDF\xEA\xFD\xF7\xC9\xE6\xCD\xBD\xDB\x41\x44\x44\x24\x18\x8C\xDA\xB7\x27\xE7\xCF\xF7\xBB\xF8\x7F\x2E\x7A\xE7\x1D\x46\x8D\x1B\x7B\xB7\x87\x88\x88\x48\xC1\x8B\xBF\xF9\x57\x67\x87\xBF\x5C\x79\xFD\x75\x46\x4D\x9B\x7A\xB7\x8B\x88\x88\x48\xC1\x62\xD4\xAD\x9B\xEF\xB0\xFF\xAE\xCC\x98\x41\xB6\x6D\xEB\xDD\x3E\x22\x22\x22\x05\x87\x3C\xF9\x64\x72\xED\x5A\xEF\x4B\xFD\xAE\xCD\x99\x43\x1E\x70\x80\x77\x3B\x89\x88\x88\x14\x0C\xF2\xCA\x2B\xC9\x92\x12\xEF\x4B\xFC\x9E\xAD\x5C\xC9\xE8\x84\x13\xBC\xDB\x4B\x44\x44\x24\xD5\x48\x33\x72\xE8\x50\xEF\xCB\x7A\xD5\x14\x17\x33\xBA\xEC\x32\xEF\xB6\x13\x11\x11\x49\x25\xB2\x79\x73\xF2\xF9\xE7\xBD\x2F\xE7\xD5\x13\x45\x8C\xEE\xBC\x93\x51\xED\xDA\xDE\xED\x28\x22\x22\x92\x1A\x64\x8F\x1E\x8C\x3E\xFE\xD8\xFB\x32\x5E\x73\xAF\xBF\xAE\x55\x03\x45\x44\x44\x2A\x81\x1C\x38\x30\x2F\xEB\xFA\xE7\xCD\x27\x9F\x30\x3A\xFE\x78\xEF\x76\x15\x11\x11\x49\x24\xB2\x59\x33\xF2\x6F\x7F\xF3\xBE\x5C\xE7\x46\x79\x39\x79\xFB\xED\x8C\xEA\xD4\xF1\x6E\x67\x11\x11\x91\xC4\x20\x4F\x39\x85\x5C\xBC\xD8\xFB\x32\x9D\x7B\xFF\xFD\x2F\xA3\x03\x0F\xF4\x6E\x6F\x11\x11\x11\x57\x64\xC3\x86\xE4\x3D\xF7\x90\x15\x15\xDE\x97\xE6\xFC\x59\xB7\x2E\xBE\xCD\x61\xE6\xDD\xFE\x22\x22\x22\x79\xC7\xE8\xF8\xE3\xC9\xB9\x73\xBD\x2F\xC7\x7E\xDE\x78\x83\x51\x97\x2E\xDE\xFD\x20\x22\x22\x92\x17\xF1\xBD\xFE\x07\x1F\x24\xA3\xC8\xFB\x12\xEC\x2E\xDA\xB8\x91\x1C\x3C\x98\xAC\x55\xCB\xBB\x5F\x44\x44\x44\x72\x82\x34\x63\x34\x60\x00\xB9\x6C\x99\xF7\x75\x37\x71\xA2\xA9\x53\xC9\x63\x8E\xF1\xEE\x23\x11\x11\x91\xAC\x22\x8F\x38\x82\x9C\x34\xC9\xFB\x3A\x9B\x6C\x51\x44\x8E\x1E\xCD\x68\x9F\x7D\xBC\xFB\x4B\x44\x44\xA4\x46\x18\xB5\x6A\x45\xDE\x77\x5F\xFC\x18\x9C\x54\xCE\x9A\x35\xE4\xA0\x41\x8C\xEA\xD6\xF5\xEE\x3F\x11\x11\x91\x2A\x89\x67\xF7\x0F\x19\x92\xEC\xDD\xFB\x92\x6E\xE1\xC2\xF8\x69\x81\x4C\xC6\xBB\x3F\x45\x44\x44\x76\x8B\x51\xED\xDA\xF1\x45\xEB\xD3\x4F\xBD\x2F\x9F\x05\x23\x9A\x3C\x99\x3C\xE5\x14\xEF\xBE\x15\x11\x11\xF9\x0A\x46\xB5\x6B\xC7\x13\xFC\x42\x7E\xAC\x2F\xD7\x5E\x7A\x49\x13\x05\x45\x44\x24\x11\x18\xD5\xA9\x13\x5F\xF8\xE7\xCC\xF1\xBE\x3C\x86\x63\xD2\x24\xF2\x9B\xDF\xF4\xEE\x7B\x11\x11\x09\x10\xA3\xBA\x75\xE3\xA1\xFE\x79\xF3\xBC\x2F\x87\xC1\x8A\xFE\xFD\x6F\xDD\x1A\x10\x11\x91\xBC\x60\xD4\xB4\x29\x39\x68\x50\x18\xEB\xF6\xA7\x44\x34\x75\x2A\xA3\x01\x03\xB4\xD1\x90\x48\xD5\x68\x2D\x6E\x91\x4A\x20\x3B\x75\x02\xAE\xBF\x1E\xBC\xFA\x6A\x58\xC3\x86\xDE\xF5\xC8\xCE\x2C\x5B\x06\x8C\x18\x01\xFC\xE9\x4F\x66\xAB\x57\x7B\x57\x23\x92\x74\x0A\x00\x22\xBB\x10\x3F\x7E\xD6\xB7\x2F\xF0\xC3\x1F\x02\xDF\xFA\x16\xA0\xC7\xD1\xD2\x61\xE3\x46\xE0\xE1\x87\x81\xE1\xC3\xCD\x66\xCD\xF2\xAE\x46\x24\xA9\x14\x00\x44\x76\x40\xB6\x69\x03\x5C\x7E\x39\x38\x70\x20\xAC\x63\x47\xEF\x7A\xA4\x26\xA6\x4C\x01\x46\x8E\x04\x1E\x7B\xCC\x6C\xF3\x66\xEF\x6A\x44\x92\x44\x01\x40\x04\x9F\x7F\xDB\xE7\x29\xA7\x00\x03\x07\xC2\xCE\x3D\x17\xD0\xFD\xE4\xC2\xB2\x6E\x1D\xF0\xF7\xBF\x83\x7F\xFE\xB3\x65\x66\xCC\xF0\xAE\x46\x24\x09\x14\x00\x24\x68\x64\xD7\xAE\xE0\x25\x97\xC0\x2E\xBE\x18\xD8\x7F\x7F\xEF\x7A\x24\x1F\xDE\x79\x07\x18\x33\x06\xFC\xFB\xDF\x2D\xB3\x72\xA5\x77\x35\x22\x5E\x14\x00\x24\x38\x64\xDB\xB6\x40\xBF\x7E\xF1\xCF\xB1\xC7\x7A\xD7\x23\x5E\x2A\x2A\xC0\x7F\xFF\x1B\x78\xF4\x51\xE0\xE9\xA7\x2D\xB3\x71\xA3\x77\x45\x22\xF9\xA4\x00\x20\x41\x60\xD4\xAA\x15\xF0\xED\x6F\x03\x17\x5D\x04\x3B\xE9\x24\x40\xFB\xCF\xCB\xF6\x36\x6C\x00\x9E\x7E\x1A\x18\x37\x0E\x9C\x38\xD1\x32\x25\x25\xDE\x15\x89\xE4\x9A\x02\x80\x14\x2C\x46\xED\xDB\xC3\xCE\x38\x03\x38\xFB\x6C\xE0\xB4\xD3\x74\x5F\x5F\x2A\x67\xF3\x66\xE0\x5F\xFF\x02\xC7\x8D\x03\x9E\x7D\xD6\x32\xEB\xD7\x7B\x57\x24\x92\x0B\x0A\x00\x52\x50\xC8\x43\x0E\x01\xCE\x3D\x17\x3C\xEF\x3C\xD8\x91\x47\x02\xA6\xF7\xB8\xD4\x40\x71\x31\x30\x61\x02\xF0\xCC\x33\xE0\xF8\xF1\x9A\x33\x20\x85\x44\x27\x47\x49\x35\x72\xAF\xBD\xC0\x63\x8E\x81\xF5\xE9\x03\x7E\xFB\xDB\xB0\x83\x0F\xF6\xAE\x49\x0A\x55\x14\x01\xEF\xBD\x07\x4C\x9C\x08\x4E\x9C\x08\xBC\xFE\xBA\x65\xCA\xCA\xBC\xAB\x12\xA9\x2E\x05\x00\x49\x1D\xB2\x63\x47\xE0\xEC\xB3\xC1\xB3\xCE\x82\x1D\x7F\x3C\x50\xAF\x9E\x77\x4D\x12\xA2\x8D\x1B\x81\xD7\x5E\x03\xC6\x8F\x07\x5F\x7A\xC9\x32\x8B\x16\x79\x57\x24\x52\x15\x0A\x00\x92\x68\xA4\x19\x70\xE8\xA1\xC0\x89\x27\x02\x27\x9C\x10\xFF\xB5\x4D\x1B\xEF\xBA\x44\xBE\x6A\xD6\x2C\xE0\xF5\xD7\x81\x37\xDE\x00\xDE\x78\xC3\xEC\xD3\x4F\xBD\x2B\x12\xD9\x1D\x05\x00\x49\x9C\xF8\x1B\x7E\x9F\x3E\x60\x9F\x3E\xB0\x93\x4E\x02\x5A\xB5\xF2\xAE\x49\xA4\xCA\x38\x6F\x1E\xEC\xAD\xB7\x80\x49\x93\x80\x09\x13\xCC\xE6\xCF\xF7\x2E\x49\x64\x7B\x0A\x00\xE2\x8A\x51\xAB\x56\xB0\x5E\xBD\x80\x9E\x3D\xE3\x9F\xDE\xBD\x81\xBD\xF7\xF6\xAE\x4B\x24\xFB\x16\x2E\x8C\x17\x21\x9A\x3C\x19\x7C\xF7\x5D\xD8\xD4\xA9\x5A\x9E\x58\x3C\x29\x00\x48\xDE\x90\x0D\x1B\x82\x3D\x7A\xC4\xB3\xF3\xB7\xFE\x1C\x72\x88\x66\xEA\x4B\x98\x2A\x2A\x80\x39\x73\xE2\xFD\x0A\xA6\x4C\x01\xA7\x4C\x01\x26\x4F\xD6\x1A\x04\x92\x2F\x3A\xF1\x4A\x4E\x30\xDA\x7F\x7F\xE0\xB0\xC3\x60\x87\x1D\x06\x1C\x7E\x38\x70\xD8\x61\x40\x97\x2E\x40\xED\xDA\xDE\xB5\x09\x00\xCC\x99\x03\xCE\x9C\x09\x23\xC1\xAE\x5D\xF5\xF4\x44\x52\x6C\xDE\x0C\xCC\x9C\x09\x4E\x9B\x06\xCC\x98\x01\x9B\x31\x03\x98\x36\x4D\xDB\x1B\x4B\x2E\x28\x00\x48\x8D\x90\x7B\xEF\x0D\x1C\x74\x50\x7C\x81\xEF\xDE\x3D\xFE\x39\xEC\x30\xA0\x59\x33\xEF\xDA\x64\x67\xA6\x4C\x01\x7F\xFC\x63\xCB\xBC\xF9\xE6\xF6\x7F\x4A\x1E\x73\x0C\x78\xF7\xDD\xB0\xDE\xBD\xBD\x2B\x94\x9D\x59\xB2\x04\x98\x31\x03\x98\x3E\x3D\xFE\x99\x39\x13\x98\x3B\x57\xB7\x10\xA4\x26\x14\x00\x64\x8F\xE2\x67\xED\x3B\x77\x06\xBA\x74\x81\x75\xEE\x0C\x74\xEE\x0C\x1C\x74\x10\xD8\xB9\x33\xAC\x65\x4B\xEF\xFA\xA4\x92\x38\x71\x22\xEC\xDC\x73\xCD\x36\x6D\xDA\xE9\x3F\x66\x83\x06\xF1\x72\xB8\xA7\x9F\xEE\x5D\xAA\x54\x06\x09\x7C\xF2\x09\x58\x54\x04\x9B\x3B\x17\x28\x2A\x02\xE7\xCE\x05\xE6\xCE\x05\xE6\xCF\xD7\x1A\x05\xB2\x27\x0A\x00\x02\x46\x75\xEB\xC2\xDA\xB7\x07\xDA\xB7\x07\xF7\xDB\x0F\xD6\xA1\x03\xB0\xDF\x7E\xE0\x01\x07\xC4\x17\xFC\xAF\x7D\x4D\xF7\xE9\xD3\x6E\xDD\x3A\xE0\xE0\x83\xCD\x96\x2D\xDB\xDD\xBF\x15\x4F\xCA\x9C\x3B\x57\x23\x38\x69\x57\x5E\x0E\xCC\x9F\x0F\x14\x15\xC5\x7F\x5D\xBC\x18\x58\xB4\x08\x58\xB4\x08\x5C\xB8\x10\xB6\x74\xA9\x59\x45\x85\x77\x95\xE2\x4B\x27\xF5\x02\xC7\xA8\x71\x63\x58\xDB\xB6\x60\xAB\x56\xB0\xD6\xAD\x81\x76\xED\xE2\x8B\xFC\x7E\xFB\x01\xED\xDB\xC7\x5B\xE0\xEE\xBB\xAF\x2E\xF0\x85\xEE\xC7\x3F\x36\xBB\xE7\x9E\xCA\xFC\x9B\xE4\x0D\x37\x00\x77\xDF\xED\x5D\xB1\xE4\x52\x59\x19\xF0\xE9\xA7\x71\x28\x58\xB0\x20\x0E\x08\x8B\x17\xC7\x7F\xB6\x62\x05\xB0\x6C\x19\xF0\xD9\x67\xBA\xC5\x50\xD8\x74\xD2\x4F\x11\x46\xF5\xEA\x01\xCD\x9A\xC1\x9A\x35\x03\x9B\x35\x8B\x7F\xDF\x7B\xEF\xF8\xE2\xDE\xAA\x55\x7C\x21\x6F\xDD\x1A\x6C\xDD\x1A\xF6\xF9\xEF\xA8\x5F\xDF\xBB\x6E\x71\xC6\xD9\xB3\x81\xEE\xDD\x2B\x3B\x24\xCC\xA8\x6E\x5D\x60\xD6\x2C\x58\xA7\x4E\xDE\xA5\x8B\x33\x6E\xDA\x04\x2C\x5B\x06\xFB\xEC\xB3\x38\x18\x2C\x5D\x0A\x2C\x5F\x1E\xFF\xAC\x58\x01\xAE\x59\x03\xAC\x5D\xBB\xFD\x8F\x6E\x3D\xA4\x87\x02\x40\x16\x90\x99\x0C\xD0\xB4\xE9\x57\xFF\x41\xA3\x46\xB0\x3A\x75\xC0\xC6\x8D\x61\xB5\x6B\x03\xCD\x9A\x81\xB5\x6B\x03\x4D\x9A\xC0\xEA\xD6\x05\x1A\x36\x04\x1A\x34\x88\x2F\xD2\x8D\x1A\xC5\xBB\xD5\x35\x6D\x0A\x34\x69\x12\x0F\xC1\x6E\xFD\x69\xDE\x3C\xFE\x6B\x83\x06\xDE\xC7\x2A\x69\x43\x02\xA7\x9E\x6A\xF6\xEA\xAB\x55\xFB\xAF\xCE\x39\x07\x78\xEE\x39\xEF\xEA\x25\x85\xB8\x69\x13\x6C\xFB\x50\xB0\x35\x24\xAC\x5F\x1F\x6F\xBB\x5C\x52\x12\x3F\xED\xB0\x79\x73\xFC\xFB\x86\x0D\x60\x79\x39\xB0\x76\x2D\xAC\xA2\x02\x58\xB7\x0E\x2C\x2B\x83\x6D\xDC\x08\x96\x96\x62\xA7\x73\x56\xD6\xAE\x35\x23\xBD\x0F\x35\xED\x14\x00\x76\x81\x51\x97\x2E\xB0\xAB\xAF\x06\x4F\x39\x05\xD6\xAE\xDD\x17\xDF\xA4\xB7\x5E\xB0\x45\xD2\x60\xD8\x30\xB3\xC1\x83\xAB\xF3\x5F\x92\x0F\x3D\x04\x5C\x71\x85\xF7\x11\x88\x54\x4E\x71\x31\xB0\x65\xCB\xB6\xDF\xB9\x64\x09\xEC\xD5\x57\xC1\x51\xA3\x2C\x53\x54\xE4\x5D\x5D\x12\x29\x00\xEC\x80\xAC\x55\x0B\xFC\xFD\xEF\x61\x3F\xFE\xB1\x9E\x59\x97\x74\x9B\x3E\x1D\x38\xFA\x68\xB3\xE2\xE2\xEA\xFC\xD7\x8C\x9A\x34\x01\xDE\x7B\x0F\xD6\xB1\xA3\xF7\x91\x88\x54\x5F\x59\x19\xF8\x87\x3F\xC0\x7E\xF5\x2B\x4D\x7C\xFC\x32\x05\x80\xED\xC4\x1B\xCF\x3C\xF1\x04\xD0\xBF\xBF\x77\x2D\x22\x35\xC2\x95\x2B\x61\x3D\x7B\x9A\x2D\x58\x50\xA3\xFF\x4D\xD4\xBD\x7B\xBC\x9E\x7D\xA3\x46\xDE\x87\x24\x52\x33\x4F\x3C\x01\x5C\x7C\xB1\x6E\x1D\x7C\x21\xE3\x5D\x40\xB2\xDC\x70\x83\x2E\xFE\x92\x7E\x65\x65\xB0\x7E\xFD\x6A\x7A\xF1\x07\x00\xCB\x4C\x9F\x1E\xDF\x06\xD0\x49\x53\xD2\xEE\xA2\x8B\x80\xEA\xDD\x0E\x2B\x54\x1A\x01\xF8\x1C\xA3\x26\x4D\x60\x0B\x17\xEA\xF9\x67\x49\x37\x12\x1C\x38\xD0\x32\x0F\x3E\x98\xDD\xFF\xEB\xAF\x7E\x05\xDC\x7A\xAB\xF7\xD1\x89\xD4\xCC\x9A\x35\x60\x87\x0E\x96\x59\xBF\xDE\xBB\x92\x24\xD0\x08\xC0\x56\x76\xE6\x99\xBA\xF8\x4B\xEA\x71\xC8\x90\x6C\x5F\xFC\x01\xC0\xEC\xB6\xDB\x80\x3B\xEE\xF0\x3E\x3C\x91\x9A\x69\xDE\x3C\x3E\xD7\x0B\xA0\x00\xF0\x05\xF6\xEC\xE9\x5D\x82\x48\xCD\xFC\xE2\x17\x96\xB9\xEB\xAE\xDC\xFD\xFF\x7F\xFE\x73\xE0\xBE\xFB\xBC\x8F\x52\xA4\x66\x7A\xF5\xF2\xAE\x20\x29\x14\x00\xB6\xB2\x56\xAD\xBC\x4B\x10\xA9\xBE\xA1\x43\xCD\x7E\xFF\xFB\x5C\xBE\x42\x3C\x79\xEA\xBA\xEB\x80\x87\x1F\xF6\x3E\x5A\x91\xEA\x6B\xD3\xC6\xBB\x82\xA4\x50\x00\xD8\xA6\x56\x2D\xEF\x0A\x44\xAA\xAE\xA2\x02\xB8\xFE\x7A\xB3\x5B\x6E\xC9\xC7\xAB\x99\x45\x11\x70\xD5\x55\x40\x7E\x5E\x4F\x24\xEB\xA8\x73\xFD\x56\x0A\x00\x22\xA9\x55\x52\x12\x3F\xD6\x74\xEF\xBD\xF9\x7C\x55\x33\xD2\x6C\xE8\xD0\x78\x46\x75\x14\x79\xB7\x82\x88\x54\x8F\x02\x80\x48\x2A\xAD\x5E\x0D\xF6\xE9\x63\x36\x76\xAC\x57\x05\x66\xC3\x86\x01\x17\x5C\xF0\xC5\xEA\x6B\x22\x92\x26\x0A\x00\x22\x69\xC3\xD9\xB3\xC1\xDE\xBD\x2D\x33\x69\x92\x77\x29\x66\xCF\x3C\x03\xF6\xED\x0B\xAE\x5C\xE9\x5D\x8B\x88\x54\x8D\x02\x80\x48\xAA\x3C\xFA\x28\xD0\xB3\x67\x92\xD6\x36\x8F\x83\x48\x8F\x1E\xE0\x7F\xFE\xE3\x5D\x8B\x88\x54\x9E\x02\x80\x48\x1A\x70\xD3\x26\xE0\x8A\x2B\xCC\x06\x0C\xB0\xCC\xC6\x8D\xDE\xE5\xEC\xC8\x32\x9F\x7C\x02\x9C\x74\x12\x30\x7C\xB8\x77\x2D\x22\x52\x39\x0A\x00\x22\x89\x37\x6B\x16\xD0\xBB\xB7\xD9\x23\x8F\x78\x57\xB2\x3B\x96\x29\x29\x31\xFB\xC1\x0F\x80\xEF\x7C\x47\xB7\x04\x44\x92\x4F\x01\x40\x24\xB1\x48\xE0\xFE\xFB\x81\xA3\x8E\xB2\xCC\x07\x1F\x78\x57\x53\x59\x66\xCF\x3E\x0B\x3B\xFC\x70\x70\xC2\x04\xEF\x5A\x44\x64\xD7\x14\x00\x44\x12\x69\xFE\x7C\xB0\x6F\x5F\xB3\x6B\xAF\x35\x4B\xDF\x2C\x7B\xB3\x4F\x3F\xB5\x4C\xDF\xBE\x60\xFF\xFE\xC0\xAA\x55\xDE\xF5\x88\xC8\x57\x29\x00\x88\x24\x4A\x79\x39\xF8\xC7\x3F\x02\xDD\xBA\x59\x66\xE2\x44\xEF\x6A\x6A\xCA\x32\xE3\xC6\x01\xDD\xBB\x03\xCF\x3E\xEB\x5D\x8B\x88\x7C\x99\x02\x80\x48\x62\x4C\x9E\x0C\x1E\x73\x8C\x65\x6E\xB8\xC1\x6C\xF3\x66\xEF\x6A\xB2\xC5\xEC\xD3\x4F\xCD\xBE\xF3\x1D\xF0\xD4\x53\xC1\xD9\xB3\xBD\xEB\x11\x91\x98\x02\x80\x88\xBB\xA5\x4B\xC1\x01\x03\x80\xA3\x8F\xB6\xCC\xE4\xC9\xDE\xD5\xE4\x8A\x65\x26\x4E\x84\xF5\xE8\x01\xFE\xEA\x57\x40\xE1\x04\x1C\x91\xB4\x52\x00\x10\xF1\xC2\x4D\x9B\x80\x3B\xEE\x00\x0F\x3E\xD8\x32\x8F\x3E\x1A\x6F\xB6\x53\xD8\xCC\x8A\x8B\x2D\xF3\x9B\xDF\x00\x9D\x3B\x03\x23\x47\x02\xE5\xE5\xDE\x35\x89\x84\x4A\x01\x40\x24\xEF\x4A\x4B\x81\x7B\xEF\x05\x0E\x38\xC0\xEC\xC6\x1B\x2D\xB3\x7E\xBD\x77\x45\xF9\x16\xDF\x16\xB8\xE6\x9A\x78\x7E\xC0\x73\xCF\x79\xD7\x23\x12\x22\x05\x00\x91\xBC\x29\x2D\x8D\x57\xF2\x3B\xF4\x50\xB3\xEB\xAF\xB7\xCC\x8A\x15\xDE\x15\x79\x33\xFB\xF0\x43\xB3\x73\xCF\x05\x8F\x38\x02\x1C\x37\x2E\x7E\xF4\x51\x44\xF2\x41\x01\x40\x24\xE7\x4A\x4B\x81\x91\x23\xC1\x4E\x9D\xCC\x06\x0C\x30\xFB\xF8\x63\xEF\x8A\x92\xC6\x32\xD3\xA6\x59\xA6\x7F\x7F\xF0\x88\x23\xE2\x90\xA4\x5D\x06\x45\x72\x4D\x01\x40\x24\x67\x56\xAC\x00\x6E\xBD\x15\xDC\x6F\x3F\xB3\x6B\xAE\x89\x97\xCB\x95\xDD\xB1\xCC\xF4\xE9\x66\x03\x06\x00\xDD\xBB\x83\x0F\x3E\x08\x14\x17\x7B\xD7\x24\x52\xA8\x14\x00\x44\xB2\xAE\xA8\x08\x18\x3C\x18\xE8\xD0\xC1\xEC\xE6\x9B\x2D\xF3\xD9\x67\xDE\x15\xA5\x8D\xD9\xCC\x99\x96\xF9\xDE\xF7\xC0\xFD\xF6\x03\x6E\xBC\x11\x58\xB2\xC4\xBB\x26\x91\x42\xA3\x00\x20\x92\x15\xA5\xA5\xC0\xD8\xB1\x40\x9F\x3E\xC0\x41\x07\x99\x0D\x1B\x56\x48\xCF\xF2\x7B\xB1\xCC\x8A\x15\x66\x77\xDC\x01\x76\xEA\x04\x5C\x7A\x29\xF0\xC6\x1B\xDE\x35\x89\x14\x0A\x05\x00\x91\x1A\xF9\xE4\x13\xE0\x96\x5B\xC0\xF6\xED\xCD\x2E\xBC\xD0\xEC\xD5\x57\x43\x78\x9C\x2F\xDF\xE2\x8D\x86\xC6\x8C\x31\x3B\xF1\x44\xF0\xA0\x83\xE2\xC7\x27\xB5\xE1\x90\x48\x4D\x28\x00\x88\x54\xD9\x9A\x35\xE0\x03\x0F\x80\x27\x9E\x08\xEC\xBF\xBF\xD9\xD0\xA1\x96\x59\xBE\xDC\xBB\xAA\x50\x58\x66\xEE\x5C\xB3\x1B\x6F\x84\xB5\x6F\x0F\xF6\xEB\x17\x2F\x33\x5C\x52\xE2\x5D\x97\x48\xDA\xD4\xF6\x2E\x40\x24\x1D\x4A\x4A\x80\x09\x13\xC0\x71\xE3\x60\x4F\x3E\x69\x19\x0D\xEF\x7B\x33\x2B\x2E\x06\x9E\x7C\x12\x78\xF2\x49\xB2\x59\x33\xF0\x9C\x73\x80\xCB\x2E\x83\x7D\xF3\x9B\x80\x99\x77\x7D\x22\x49\xA7\x00\x20\xB2\x4B\x5B\xB6\x00\xAF\xBE\x1A\x3F\x9F\xFE\xDC\x73\x96\x59\xB7\xCE\xBB\x22\xD9\x39\xB3\xB5\x6B\x81\xD1\xA3\x81\xD1\xA3\x19\xB5\x6A\x05\x9C\x71\x06\xAC\x5F\x3F\xE0\xB4\xD3\x80\x3A\x75\xBC\xEB\x13\x49\x22\x05\x00\x91\xED\x71\xE5\x4A\xD8\xF3\xCF\x03\xCF\x3C\x03\xBC\xF2\x4A\xFC\x2D\x53\xD2\x24\x5E\x60\xE9\xF3\x30\xC0\x16\x2D\x80\xB3\xCF\x06\xBE\xF3\x9D\x78\x82\xE6\x5E\x7B\x79\xD7\x27\x92\x14\x0A\x00\x12\xB8\x8A\x0A\xE0\xFD\xF7\x81\x89\x13\xC1\x89\x13\x81\xD7\x5E\x33\xD3\xFA\xF4\x85\xC2\x6C\xD5\x2A\xE0\xE1\x87\x81\x87\x1F\x66\x54\xBB\x36\xD0\xBB\x37\xEC\xAC\xB3\xE2\x30\xF0\xF5\xAF\xEB\x56\x81\x84\x4C\x01\x40\x02\x34\x77\x2E\xF8\xFA\xEB\xC0\x84\x09\xB0\x89\x13\xCD\xD6\xAC\xF1\xAE\x48\x72\xCF\x32\xE5\xE5\xC0\xA4\x49\xF1\x0F\xC0\xA8\x7D\x7B\xE0\xF4\xD3\x61\x7D\xFA\x00\x27\x9C\x00\xB4\x69\xE3\x5D\xA3\x48\x3E\x29\x00\x48\xE1\xE3\xBC\x79\xB0\xB7\xDE\x02\x26\x4D\x02\x5F\x7E\xD9\x32\x0B\x17\x7A\x97\x24\xFE\x2C\xB3\x78\x31\xF0\xC0\x03\xF1\x0F\x40\x76\xEC\x08\x1E\x77\x1C\xEC\xD8\x63\x81\xBE\x7D\x81\x0E\x1D\xBC\x6B\x14\xC9\x25\x05\x00\x29\x30\x6B\xD7\x82\x93\x27\xC3\x26\x4F\x06\xDE\x7D\x17\x7C\xE7\x1D\x3D\xA2\x27\x95\x61\x36\x6F\x1E\x30\x6F\x5E\x3C\x7F\xE0\xF3\x40\x80\x6F\x7C\x03\xE8\xD9\x33\xFE\xE9\xD1\x03\x68\xD0\xC0\xBB\x4E\x91\x6C\x51\x00\x90\x14\x5B\xB7\x0E\xF8\xE0\x03\x60\xEA\x54\xF0\xDD\x77\xE3\x8B\xFE\xDC\xB9\x96\xD1\x42\x3C\x52\x73\x5F\x04\x82\x31\x63\x00\x80\x51\x9D\x3A\xB0\x6E\xDD\x80\xA3\x8F\x06\x7B\xF6\x84\x1D\x71\x04\xD0\xB5\x2B\x50\xAF\x9E\x77\xAD\x22\xD5\xA1\x00\x20\x29\x50\x51\x01\x2E\x5C\x08\x9B\x35\x0B\x98\x32\x05\x9C\x39\x33\xFE\xFD\xC3\x0F\xCD\xB4\x6B\x9C\xE4\x87\x65\xCA\xCA\x80\xF7\xDE\x8B\x7F\xEE\xBF\x1F\x00\xC8\x5A\xB5\x80\xFD\xF7\x07\xBB\x76\x85\x1D\x79\x24\x78\xE8\xA1\xB0\xAE\x5D\x81\x83\x0F\x06\x32\x5A\x68\x4D\x12\x4D\x01\x40\x12\x64\xF9\xF2\x78\x82\xDE\xDC\xB9\xB0\xA2\xA2\xF8\xF7\xF8\xAF\x96\xD1\x4A\x6F\x92\x3C\x66\x15\x15\xF1\x28\xC1\xBC\x79\xC0\xF8\xF1\x5B\xFF\x9C\x51\xE3\xC6\xB0\x2E\x5D\x80\xCE\x9D\x81\x2E\x5D\xBE\xF8\xE9\xDC\x19\x68\xD6\xCC\xBB\x6E\x11\x40\x01\x40\xF2\x6A\xD5\x2A\x70\xD1\x22\xD8\xA2\x45\xC0\xC2\x85\xC0\xC2\x85\xE0\xE2\xC5\xC0\x82\x05\xB0\xA2\xA2\x78\x31\x17\xC9\x17\x72\xEF\xBD\xE3\xE1\xED\xFF\xFE\x17\xBC\xEF\x3E\xCD\x95\xC8\x1E\xCB\x6C\xD8\x00\x4C\x99\x12\xFF\x7C\x19\xA3\x56\xAD\x60\x9D\x3B\xC7\x93\x0C\xF7\xDB\x0F\x68\xDF\x3E\xFE\x6B\x87\x0E\xF1\xEF\x4D\x9B\x7A\xD7\x2F\x61\x50\x00\x90\x1A\x2A\x2B\x03\x56\xAC\x00\x97\x2F\x07\x96\x2E\x85\xAD\x58\x01\x7E\xF6\x19\x6C\xD9\xB2\xF8\xCF\x3E\xFB\x0C\xB6\x64\x09\xB0\x60\x81\x76\xC7\x4B\x18\x1E\x78\x20\xEC\xF4\xD3\xE3\x47\xE1\x06\x0F\x66\x74\xF6\xD9\x96\x79\xF3\x4D\xEF\xB2\x0A\x5D\xBC\x50\xD1\x8A\x15\xC0\xDB\x6F\xEF\xEC\x9F\x33\x6A\xDA\x14\x68\xDF\x1E\xD6\xBE\x3D\xD0\xBA\x35\xD8\xBA\x35\xB0\xEF\xBE\xB0\x56\xAD\xC0\x7D\xF6\x81\xB5\x69\x03\xB4\x6A\x15\xFF\xD4\xAA\xE5\x7D\x3C\x92\x5E\x0A\x00\x41\xAA\xA8\x00\xD6\xAF\x07\x4A\x4A\xC0\xCD\x9B\x61\x9B\x37\xC7\xBF\x6F\xD8\x00\x94\x97\xC3\xD6\xAE\x05\x8A\x8B\x81\xB5\x6B\xBF\xFC\xB3\x66\xCD\x8E\x7F\xAF\x67\xE8\xD3\xAC\x49\x93\x2F\x7E\x6F\xDA\x14\xF6\xCC\x33\x64\xE7\xCE\xEA\x53\x5F\xF1\x92\xD3\x5B\x27\xB8\xEE\x1A\x99\xC9\x80\x7B\xEF\x0D\x6B\xDA\x14\x68\xD6\x0C\x6C\xDE\x3C\xBE\xBD\xF0\xF9\x8F\x6D\xF7\x3B\xEA\xD7\x07\x9B\x36\x85\xD5\xA9\x03\x34\x6A\x14\xFF\x7D\x83\x06\xB0\x86\x0D\x81\xBA\x75\xE3\xF7\x82\xC2\x44\x68\x14\x00\x52\x6B\xE9\x52\x60\xC4\x88\x78\x7F\xF4\xA5\x4B\xE3\xFD\xE8\xB7\x57\x5C\x1C\xAF\x65\xBF\x1D\x46\x91\xD6\xB3\x97\x6D\x6C\xFB\x00\x00\x00\x2D\x5A\x80\xBF\xFA\x15\x70\xC3\x0D\xDE\xA5\xC9\x9E\xC5\x13\x60\x57\xAE\x8C\x7F\xB2\x83\x51\xD3\xA6\xB0\x1D\x27\x2F\x36\x68\x00\xD4\xAF\xFF\xE5\x3F\xAB\x53\x07\xD8\x77\x5F\xE0\xF8\xE3\x81\x6B\xAE\x01\xDA\xB5\xF3\x6E\x0F\x91\x6A\x23\x1F\x7F\x9C\x69\x11\x8D\x1D\xCB\xA8\x51\x23\xEF\x36\x93\x74\x23\x2F\xB9\xE4\xAB\x6F\xAE\x92\x12\xB2\x53\x27\xEF\xDA\x24\x3D\xC8\xBD\xF6\x22\xC7\x8C\xF1\x3E\x2D\x56\xE5\xFC\xE9\xDD\x66\x49\xA1\xC7\x54\xD2\x86\x13\x27\xC2\xBE\xFB\x5D\xCB\x6C\xDC\xE8\x5D\x8A\xA4\x5D\xDD\xBA\x3B\xFF\xB3\x07\x1E\x20\xF5\x08\x9B\x54\x4E\x3C\xB7\xE7\xB2\xCB\x80\x7F\xFE\xD3\xBB\x16\xA9\x1A\x7D\xC8\x53\xA5\xA2\x02\xF8\xC1\x0F\xE2\x47\x8F\x44\x6A\x88\x3B\x0B\x00\x00\x70\xF2\xC9\xC0\xA0\x41\xDE\xE5\x49\x7A\xC4\xB7\x23\x7E\xF8\xC3\x78\x52\xB0\xA4\x85\x02\x40\xAA\xBC\xFD\xB6\x65\x8A\x8A\xBC\xAB\x90\x02\x61\xBB\x0A\x00\x00\x70\xC7\x1D\xE4\x89\x27\x7A\x97\x28\xE9\x61\xB6\x60\x01\xF8\xC6\x1B\xDE\x75\x48\xE5\x29\x00\xA4\xCA\x8C\x19\xDE\x15\x48\x01\xE1\xEE\x96\xB0\xAD\x53\x07\x78\xEA\xA9\x78\x3D\x7C\x91\x4A\x32\x9D\xA3\xD2\x44\x01\x20\x55\x74\xDF\x5F\xB2\x68\xB7\x23\x00\x00\xD0\xA2\x05\xF0\xE2\x8B\xA4\xB6\xC9\x95\xCA\xDA\xB0\xC1\xBB\x02\xA9\x3C\x05\x00\x91\x60\xED\x29\x00\x00\xF1\xF2\xB5\x2F\xBF\x1C\xAF\x1A\x28\xB2\x27\xDA\x88\x2B\x4D\x14\x00\x44\x42\xC5\xCA\x04\x00\x00\xE8\xDE\x1D\x78\xF1\xC5\x78\x85\x3A\x11\x29\x14\x0A\x00\x22\xC1\xAA\x6C\x00\x00\x80\x5E\xBD\x60\x93\x26\x31\x6A\xDF\xDE\xBB\x6A\x11\xC9\x0E\x05\x00\x91\x50\xED\x71\x0E\xC0\x8E\xBA\x75\x83\xFD\xE7\x3F\xE4\x11\x47\x78\x97\x2E\x22\x35\xA7\x00\x20\x12\xAC\x3A\x75\xAA\xFE\xDF\xB4\x6D\x0B\xFC\xFB\xDF\xE4\xC9\x27\x7B\x57\x2F\x22\x35\xA3\x00\x20\x12\x2A\x56\x77\xF3\x97\x66\xCD\x80\x57\x5E\x21\x87\x0E\xD5\x8A\x81\x22\xE9\xA5\x0F\xAF\x48\xA8\xAC\x26\x17\xEF\xDA\xB5\x81\x9B\x6F\x06\x5F\x79\x45\x8F\x09\x8A\xA4\x93\x02\x80\x48\xB0\xB2\xF0\xED\xDD\xBE\xF9\x4D\x60\xDA\x34\x46\xA7\x9E\xEA\x7D\x34\x22\x52\x35\x0A\x00\x22\xC1\xCA\xD6\xF0\x7D\xEB\xD6\xB0\x17\x5F\x64\x74\xF7\xDD\xDA\xA5\x52\x24\x3D\x14\x00\x44\x82\x95\xCD\xFB\xF7\xB5\x6A\xC1\x6E\xB8\x01\x36\x67\x0E\xA3\x0B\x2E\xF0\x3E\x32\x11\xD9\x33\x05\x00\x91\x60\x55\x77\x12\xE0\xEE\xB4\x6D\x0B\x1B\x37\x8E\x1C\x3F\x9E\xD1\x7E\xFB\x79\x1F\xA1\x88\xEC\x9A\x02\x80\x48\xB0\x72\x39\x83\xFF\xAC\xB3\x60\x1F\x7C\x40\xFE\xE4\x27\x8C\x76\xB7\xE9\x90\x88\x78\x51\x00\x10\x09\x56\xAE\x1F\xE1\x6B\xDC\x18\xF8\xC3\x1F\x60\x45\x45\xE4\xC0\x81\xAC\xF6\x63\x87\x22\x92\x0B\x0A\x00\x22\xC1\xCA\xD7\x33\xFC\xED\xDB\x03\x23\x46\x00\x53\xA6\x90\xE7\x9D\x47\x9A\x79\x1F\xB9\x88\x28\x00\x88\x84\x2B\xEF\x8B\xF8\x1C\x7E\x38\xF0\xD4\x53\xC0\xB4\x69\x64\xFF\xFE\x5A\x44\x48\xC4\x97\x3E\x80\x22\xA1\x32\xAF\x21\xF9\xC3\x0E\x03\xFE\xFE\x77\xB0\xA8\x88\x1C\x32\x44\xBB\x0C\x8A\xF8\x50\x00\x10\x09\x96\xF3\x37\x70\xEB\xD8\x11\xB8\xFD\x76\xD8\xFC\xF9\xE4\x1D\x77\x90\x1D\x3B\x7A\xB7\x88\x48\x48\x14\x00\x44\x82\x95\x94\x21\xF8\xE6\xCD\x81\x9F\xFD\x0C\x28\x2A\x62\x34\x61\x02\xA3\x7E\xFD\x18\x55\x67\xA3\x22\x11\xA9\x8A\x84\x9C\x00\x44\x24\xEF\x12\x77\x0F\x3E\x93\x81\xF5\xE9\x03\x1B\x3B\x16\xB6\x70\x21\xA3\xBB\xEF\x26\x7B\xF4\xF0\xAE\x4A\xA4\x50\x25\xEC\x04\x20\x22\x79\x53\xA3\xCD\x80\x72\x6D\xDF\x7D\x61\x37\xDC\x00\x4C\x9D\x4A\xCE\x9C\x49\xFE\xF2\x97\x64\xA7\x4E\xDE\x55\x89\x14\x92\x04\x9F\x00\x44\x24\xA7\x52\xF3\x5C\xFE\xA1\x87\x02\xBF\xF9\x0D\xF0\xD1\x47\x71\x18\xB8\xFD\x76\x46\xC7\x1D\xA7\xC7\x09\x45\x6A\x46\x01\x40\x24\x58\x49\x1E\x01\xD8\x95\x43\x0F\x05\x86\x0C\x81\xBD\xF9\x66\xFC\x14\xC1\xB0\x61\xE4\x19\x67\x90\x7B\xED\xE5\x5D\x99\x48\xDA\xA4\xF0\x04\x20\x22\xD9\x91\xC6\x00\xB0\x1D\xEB\xD4\x09\xB8\xFE\x7A\xE0\x9F\xFF\x04\x56\xAD\x22\x5F\x7E\x99\xBC\xE1\x06\xF2\x88\x23\xB4\xC6\x80\xC8\x9E\xD5\xF6\x2E\x40\x44\x9C\xB8\xAD\x03\x90\x0B\xF5\xEB\x03\x7D\xFB\xC6\x3F\x00\xB0\x71\x23\xA3\xFF\xFC\x07\x36\x71\x22\xF8\xD6\x5B\xC0\xBB\xEF\x5A\xA6\xB4\xD4\xBB\x4A\x91\x24\x51\x00\x10\x09\x56\x21\x7F\x4B\x6E\xD4\x08\xD6\xA7\x0F\xD0\xA7\x0F\x0C\x00\xCA\xCA\xC8\xE9\xD3\x81\xB7\xDE\x02\xA7\x4C\x81\x4D\x99\x02\xCC\x9A\x65\x46\x7A\x57\x2A\xE2\x45\x01\x40\x24\x58\x85\x1C\x00\x76\x54\xA7\x0E\x70\xE4\x91\xC0\x91\x47\x62\xEB\xD4\x41\xAE\x5C\xC9\xE8\xBD\xF7\x80\x69\xD3\x80\x19\x33\x60\x33\x66\x80\xB3\x66\x59\xA6\xA4\xC4\xBB\xDA\xF4\x52\xA0\x4A\x13\x05\x00\x91\x50\x31\x93\x41\xC8\xF3\xE8\xAD\x65\x4B\xE0\xD4\x53\xE3\x9F\xAD\x7F\x56\x5E\x4E\xCE\x9D\x0B\xCE\x9C\x09\x2B\x2A\x02\x8A\x8A\x80\x39\x73\xC0\xA2\x22\xCB\xAC\x5C\xE9\x5D\xB2\x48\x36\x29\x00\x88\x84\x2A\xD1\xEB\x00\x78\xA9\x5D\x1B\x38\xF4\x50\xD8\xA1\x87\x7E\xE9\x8F\x0D\x20\xD7\xAC\x89\x03\xC1\xFC\xF9\xE0\xE2\xC5\xB0\x45\x8B\xC0\x05\x0B\x80\x45\x8B\x60\x8B\x17\x9B\xAD\x5E\xED\x5D\xBD\x48\x55\x28\x00\x88\x04\x4B\x01\xA0\x6A\x9A\x37\x07\x7A\xF5\x02\x7A\xF5\xDA\x36\x72\xB2\xDD\x08\x0A\xA3\x4D\x9B\x60\x4B\x96\x00\x2B\x56\x00\xCB\x97\x03\x4B\x97\x7E\xF9\xF7\xD5\xAB\xC1\xB5\x6B\x81\xF8\xC7\x32\xEB\xD6\x79\x1F\x91\x84\x4D\x01\x40\x24\x54\xA1\xDF\x02\xC8\x36\x6B\xD8\x10\xE8\xD2\x25\xFE\xD9\xD5\xBF\xF3\xC5\xAF\x24\x09\xAC\x5D\x0B\xAE\x59\x03\x5B\xBB\x16\xD8\xB8\x11\x2C\x2D\x05\xD6\xAF\x07\x2A\x2A\x60\x6B\xD6\x00\x15\x15\xF1\xDF\x97\x96\x02\x9B\x36\x7D\xF9\x7F\xB6\x6E\x1D\x10\x45\x5F\xFC\x0F\xA3\x08\x58\xB6\x0C\xF6\xD6\x5B\x66\x6B\xD6\x78\x37\x87\x24\x9F\x02\x80\x48\xA8\x0A\xEA\x31\xC0\x34\x32\x03\x9A\x37\x87\x35\x6F\xFE\xC5\x1F\xD5\xE4\x7F\xB7\xF5\x97\x2D\x5B\xC8\xDF\xFF\x1E\xF8\xED\x6F\xCD\xB6\x0B\x08\x22\x3B\xD0\x10\xA0\x48\xB0\x74\x0B\xA0\x30\x35\x68\x00\xDC\x7A\x2B\xF0\xFB\xDF\x7B\x57\x22\xC9\xA6\x13\x80\x48\xB0\x14\x00\x0A\xDB\x4F\x7E\xC2\xE8\xC0\x03\xBD\xAB\x90\xE4\xD2\x09\x40\x24\x54\x5A\x2E\xB7\xC0\xD5\xAA\x05\x3B\xF3\x4C\xEF\x2A\x24\xB9\x74\x02\x10\x09\x95\xE6\x00\x04\xA0\x6D\x5B\xEF\x0A\x24\xB9\x14\x00\x44\x42\xA5\x11\x80\xC2\x97\xF7\x2D\x93\xB5\x45\x73\x9A\xE8\x04\x20\x12\x2A\x8D\x00\x88\x04\x4D\x01\x40\x24\x58\x1A\x01\x10\x09\x99\x4E\x00\x22\xC1\x52\x00\x10\x09\x99\x4E\x00\x22\xC1\x52\x00\x10\x09\x99\x4E\x00\x22\xC1\x52\x00\x10\x09\x99\x4E\x00\x22\xC1\xD2\x8C\x6D\xC9\x36\xD2\xBB\x02\xA9\x3C\x05\x00\x91\x60\x69\x04\x40\xB2\x4D\xA1\x32\x4D\x74\x02\x10\x11\x11\x09\x90\x02\x80\x48\xA8\xF2\xBE\x48\x8C\x88\x24\x89\x02\x80\x88\x88\x48\x80\x14\x00\x44\x42\x65\x1A\x01\x10\x09\x99\x02\x80\x48\xB0\x14\x00\x44\x42\xA6\x00\x20\x22\x22\x12\x20\x05\x00\x91\x60\x69\x04\x40\xB2\x4D\xEB\x00\xA4\x89\x02\x80\x88\x88\x48\x80\x14\x00\x44\x82\xA5\x11\x00\x91\x90\x29\x00\x88\x88\x88\x04\x48\x01\x40\x24\x58\x1A\x01\x10\x09\x99\x02\x80\x48\xB0\x14\x00\x44\x42\xA6\x00\x20\x22\x22\x12\x20\x05\x00\x91\x60\x69\x04\x40\x24\x64\x0A\x00\x22\x22\x22\x01\x52\x00\x10\x09\x96\x46\x00\x44\x42\xA6\x00\x20\x22\x22\x12\x20\x05\x00\x91\x50\x51\x23\x00\x22\x21\x53\x00\x10\x09\x95\xB6\x03\x16\x09\x9A\x02\x80\x88\x88\x48\x80\x14\x00\x44\x82\xA5\x11\x00\x91\x90\x29\x00\x88\x88\x88\x04\x48\x01\x40\x24\x58\x1A\x01\x10\x09\x99\x02\x80\x88\x88\x48\x80\x14\x00\x44\x82\xA5\x11\x00\x91\x90\x29\x00\x88\x04\x4B\x01\x40\x24\x64\x0A\x00\x22\x22\x22\x01\x52\x00\x10\x09\x96\x46\x00\x44\x42\xA6\x00\x20\x22\x22\x12\x20\x05\x00\x91\x60\x69\x04\x40\x24\x64\x0A\x00\x22\x22\x22\x01\x52\x00\x10\x09\x96\x46\x00\x44\x42\xA6\x00\x20\x12\x2C\x05\x00\x91\x90\x29\x00\x88\x88\x88\x04\x48\x01\x40\x24\x58\x1A\x01\x10\x09\x99\x02\x80\x88\x88\x48\x80\x14\x00\x44\x82\xA5\x11\x00\x91\x90\x29\x00\x88\x88\x88\x04\x48\x01\x40\x24\x40\xA4\xBE\xFD\x8B\x84\x4E\x01\x40\x44\x44\x24\x40\x0A\x00\x22\x41\xD2\x08\x80\x48\xE8\x14\x00\x44\x44\x44\x02\xA4\x00\x20\x12\x24\x8D\x00\x88\x84\x4E\x01\x40\x44\x44\x24\x40\x0A\x00\x22\x21\xD2\x53\x00\x22\xC1\x53\x00\x10\x09\x92\x02\x80\x48\xE8\x14\x00\x44\x44\x44\x02\xA4\x00\x20\x12\x24\x8D\x00\x88\x84\x4E\x01\x40\x44\x44\x24\x40\x0A\x00\x22\x41\xD2\x08\x80\x48\xE8\x14\x00\x44\x44\x44\x02\xA4\x00\x20\x22\x22\x12\x20\x05\x00\x11\x11\x91\x00\x29\x00\x88\x88\x88\x04\x48\x01\x40\x24\x48\xA4\x77\x05\x22\xE2\x4B\x01\x40\x44\x44\x24\x40\x0A\x00\x22\x22\x22\x01\x52\x00\x10\x11\x11\x09\x90\x02\x80\x88\x88\x48\x80\x14\x00\x44\x82\xA4\x49\x80\x22\xA1\x53\x00\x10\x11\x11\x09\x90\x02\x80\x88\x88\x48\x80\x14\x00\x44\x44\x44\x02\xA4\x00\x20\x12\x24\xCD\x01\x10\x09\x9D\x02\x80\x88\x88\x48\x80\x14\x00\x44\x44\x44\x02\xA4\x00\x20\x22\x22\x12\x20\x05\x00\x11\x11\x91\x00\x29\x00\x88\x84\xC8\x34\x09\x50\x24\x74\x0A\x00\x22\x22\x22\x01\x52\x00\x10\x11\x11\x09\x90\x02\x80\x88\x88\x48\x80\x14\x00\x44\x44\x44\x02\xA4\x00\x20\x12\x24\x4D\x02\x14\x09\x9D\x02\x80\x88\x88\x48\x80\x14\x00\x44\x44\x44\x02\xA4\x00\x20\x22\x22\x12\x20\x05\x00\x91\x20\x69\x0E\x80\x48\xE8\x14\x00\x44\x44\x44\x02\xA4\x00\x20\x22\x22\x12\x20\x05\x00\x11\x11\x91\x00\x29\x00\x88\x88\x88\x04\x48\x01\x40\x24\x40\xA6\xDD\x00\x45\x82\xA7\x00\x20\x22\x22\x12\x20\x05\x00\x11\x11\x91\x00\x29\x00\x88\x88\x88\x04\x48\x01\x40\x44\x44\x24\x40\x0A\x00\x22\xC1\xD2\x44\x40\x91\x90\x29\x00\x88\x88\x88\x04\x48\x01\x40\x44\x44\x24\x40\x0A\x00\x22\x22\x22\x01\x52\x00\x10\x11\x11\x09\x90\x02\x80\x48\xB0\x34\x09\x50\x24\x64\x0A\x00\x22\x22\x22\x01\x52\x00\x10\x11\x11\x09\x90\x02\x80\x88\x88\x48\x80\x14\x00\x44\x44\x44\x02\xA4\x00\x20\x12\x2C\x4D\x02\x14\x09\x99\x02\x80\x88\x88\x48\x80\x14\x00\x44\x44\x44\x02\xA4\x00\x20\x22\x22\x12\x20\x05\x00\x91\x60\x69\x0E\x80\x48\xC8\x14\x00\x44\x44\x44\x02\xA4\x00\x20\x22\x22\x12\x20\x05\x00\x11\x11\x91\x00\x29\x00\x88\x88\x48\x96\x68\x5E\x49\x9A\x28\x00\x88\x04\x4B\x27\x6B\x91\x90\x29\x00\x88\x88\x88\x04\x48\x01\x40\x44\x44\x24\x40\x0A\x00\x22\xC1\xD2\x2D\x00\x91\x90\x29\x00\x88\x88\x88\x04\x48\x01\x40\x24\x58\x1A\x01\x10\x09\x99\x02\x80\x88\x88\x48\x80\x14\x00\x44\x82\xA5\x11\x00\x91\x90\x29\x00\x88\x04\x4B\x01\x40\x24\x64\x0A\x00\x22\xC1\x52\x00\x10\x09\x99\x02\x80\x48\xA8\xA8\x00\x20\x12\x32\x05\x00\x91\x50\x99\x02\x80\x48\xC8\x14\x00\x44\x82\xA5\x00\x20\x12\x32\x05\x00\x91\x60\x29\x00\x88\x84\x4C\x01\x40\x24\x58\x0A\x00\x22\x21\x53\x00\x10\x09\x96\x02\x80\x48\xC8\x14\x00\x44\x82\xA5\x00\x20\x12\x32\x05\x00\x91\x60\x29\x00\x88\x84\x4C\x01\x40\x24\x58\x0A\x00\x22\x21\x53\x00\x10\x09\x95\x16\x02\x12\x09\x9A\x02\x80\x48\xA8\xB4\x10\x90\x48\xD0\x14\x00\x44\x82\xA5\x00\x20\x12\x32\x05\x00\x91\x60\x29\x00\x88\x84\x4C\x01\x40\x44\x44\x24\x40\x0A\x00\x22\xC1\xD2\x08\x80\x48\xC8\x14\x00\x44\x82\xA5\x00\x20\x12\x32\x05\x00\x91\x60\x29\x00\x88\x84\x4C\x01\x40\x24\x58\x0A\x00\x22\x21\x53\x00\x10\x09\x96\x02\x80\x48\xC8\x14\x00\x44\x82\xA5\x00\x20\x12\x32\x05\x00\x91\x60\x29\x00\x88\x84\x4C\x01\x40\x24\x58\x0A\x00\x22\x21\x53\x00\x10\x09\x96\x02\x80\x48\xC8\x14\x00\x44\x82\xA5\x00\x20\x12\x32\x05\x00\x91\x50\x69\x3B\x60\x91\xA0\x29\x00\x88\x04\x4B\x01\x40\x24\x64\x0A\x00\x22\xA1\x32\x05\x00\x91\x90\x29\x00\x88\x04\x4B\x01\x40\x24\x64\x0A\x00\x22\xC1\x52\x00\x10\x09\x99\x02\x80\x88\x88\x48\x80\x14\x00\x44\x82\xA5\x11\x00\x91\x90\x29\x00\x88\x84\x4A\x8F\x01\x8A\x04\x4D\x01\x40\x24\x54\x7A\x0A\x40\x24\x68\x0A\x00\x22\xC1\x52\x00\x10\x09\x99\x02\x80\x48\xB0\x14\x00\x44\x42\xA6\x00\x20\x12\x2C\x05\x00\x91\x90\x29\x00\x88\x04\x4B\x01\x40\x24\x64\x0A\x00\x22\xC1\x8A\x22\xEF\x0A\x24\xC7\x2C\xDF\x7D\xAC\x50\x99\x26\x0A\x00\x22\x22\x05\xAB\xA4\x24\xBF\xAF\x67\xE6\x7D\xC4\x52\x79\x0A\x00\x69\xC2\x8C\xFA\x4B\xB2\x87\x1A\x01\x28\x7C\xF9\x0E\x00\x92\x26\xBA\xA0\xA4\x89\xD5\xAD\xEB\x5D\x82\x14\x10\xAD\x03\x10\x80\xCD\x9B\xF3\xFA\x72\xAC\x57\xCF\xFB\x88\xA5\xF2\x14\x00\x52\x45\x01\x40\x44\xAA\x62\xC5\x8A\xFC\xBE\x9E\x02\x40\x9A\x28\x00\xA4\x09\x15\x00\x24\x9B\x34\x02\x50\xF0\xB8\x72\x65\x5E\x5F\xCF\x14\x00\xD2\x44\x01\x20\x4D\xAC\x51\x23\xEF\x12\xA4\x80\x68\x2F\x80\xC2\x67\xCB\x97\xE7\xF7\x05\x1B\x36\xF4\x3E\x64\xA9\x3C\x05\x80\x34\x61\xCB\x96\xDE\x25\x48\x01\xD1\x1C\x80\x00\xCC\x9F\x9F\xDF\xD7\x6B\xD5\xCA\xFB\x88\xA5\xF2\x14\x00\xD2\xC4\xF4\xE1\x12\x91\xCA\x5A\xBD\xDA\x6C\xED\xDA\xFC\xBE\xA6\xCE\x51\x69\xA2\x00\x90\x2A\x1A\x01\x90\x2C\xD2\x63\x80\x05\xEE\xE3\x8F\xF3\xFE\x92\x6C\xD1\xC2\xFB\xA8\xA5\xF2\x14\x00\x52\xA5\x75\x6B\x46\x9A\x08\x28\x22\x95\xC0\x69\xD3\xF2\xFA\x72\x34\x83\xB5\x6D\xEB\x7D\xD8\x52\x79\x0A\x00\xA9\x52\xAB\x16\xB0\xDF\x7E\xDE\x55\x48\xA1\xD0\x1C\x80\x82\x66\xD3\xA7\xE7\xF7\x05\xDB\xB6\x05\x1A\x34\xF0\x3E\x6C\xA9\x3C\x05\x80\xD4\xE9\xD8\xD1\xBB\x02\x29\x10\x79\x5F\x27\x5E\xF2\x8A\xEF\xBD\x97\xDF\xD7\x3B\xE0\x00\xEF\x43\x96\xAA\x51\x00\x48\x1B\x53\x00\x90\x6C\xD1\x08\x40\xE1\xDA\xBC\x19\x78\xF7\xDD\xBC\xBE\xA4\x75\xEA\xE4\x7D\xD4\x52\x35\x0A\x00\xA9\xD3\xAD\x9B\x77\x05\x22\x92\x74\x6F\xBE\x69\x99\xD2\xD2\xBC\xBE\x24\x75\x6E\x4A\x1B\x05\x80\xD4\x39\xFC\x70\xEF\x0A\xA4\x50\x68\x04\xA0\x70\xFD\xFB\xDF\xF9\x7F\x4D\x9D\x9B\xD2\x46\x01\x20\x75\xBA\x77\x27\xB5\xE5\xA6\x64\x83\x02\x40\xC1\xE2\xAB\xAF\xE6\xFD\x35\xAD\x7B\x77\xEF\xC3\x96\xAA\x51\x00\xD8\x26\x2D\x13\xA2\x9A\x34\xD1\x44\x40\xC9\x8E\xB4\xBC\xE7\xA5\x6A\xD6\xAE\x85\xE5\x77\x02\x20\xB9\xEF\xBE\xC0\x3E\xFB\x78\x1F\x79\xA5\x68\xF2\xEB\x36\x0A\x00\xDB\xE4\xF9\x7E\x59\x4D\xF0\x98\x63\xBC\x4B\x90\x02\xA0\xBD\x00\x0A\xD4\xC4\x89\x66\x15\x15\x79\x7D\x49\x1E\x7B\xAC\xF7\x51\x57\x5E\x49\x89\x77\x05\x49\xA1\x00\xB0\x4D\x8A\xDE\x14\x96\xA6\x0F\x9B\x88\xE4\xD7\xDF\xFE\x96\xF7\x97\xB4\xE3\x8E\xF3\x3E\xEA\x4A\x63\x8A\xCE\xF5\x39\xA6\x00\xB0\x4D\x8A\x46\x00\x90\xA2\x0F\x9B\x24\x97\x36\x03\x2A\x40\xEB\xD7\x03\x2F\xBE\x98\xFF\xD7\x4D\xD1\x39\xC9\x14\x00\xB6\x52\x00\xD8\x2A\x55\xA9\xF0\x90\x43\x18\xA5\xE4\x7E\x9B\x24\x97\x6E\x01\x14\xA0\x71\xE3\xCC\xB6\x6C\xC9\xE7\x2B\x92\xCD\x9B\xA7\xEA\x09\x80\x54\x9D\xEB\x73\x4B\x01\x60\x2B\xDB\xB0\xC1\xBB\x84\xCA\xCB\x64\x80\xBE\x7D\xBD\xAB\x90\xB4\x53\x00\x28\x3C\x63\xC6\xE4\xFF\x35\x4F\x3D\x15\xA8\x5D\xDB\xFB\xC8\x2B\xCD\xD6\xAF\xF7\x2E\x21\x29\x14\x00\xB6\x59\xB9\xD2\xBB\x82\x2A\xB1\xD3\x4F\xF7\x2E\x41\xD2\x4E\x01\xA0\xB0\x7C\xFA\x29\xF0\xC6\x1B\x79\x7F\x59\x9E\x76\x9A\xF7\x91\x57\x4D\xCA\xCE\xF5\x39\xA4\x00\xB0\x15\x57\xAC\xF0\x2E\xA1\x6A\xF5\xF6\xED\x4B\xD6\xAA\xE5\x5D\x86\xA4\x99\x02\x40\x61\x79\xF8\xE1\x7C\xCF\xFE\x8F\x77\x00\x54\x00\x48\x2B\x05\x80\xAD\x2C\x65\x6F\x0A\x6B\xD9\x12\x38\xFE\x78\xEF\x32\x44\x24\x09\x4A\x4A\x80\x3F\xFF\x39\xFF\xAF\x7B\xF4\xD1\x40\xBB\x76\xDE\x47\x5F\x35\x29\xFB\xB2\x97\x43\x0A\x00\xDB\xA4\xF1\x4D\x71\xC1\x05\xDE\x15\x48\x8A\x69\x41\x94\x02\xF2\xF8\xE3\x66\x4B\x97\xE6\xFD\x65\x99\xC2\x73\x10\x53\xF6\x65\x2F\x87\x14\x00\xB6\xE2\x27\x9F\x78\x97\x50\x75\xE7\x9F\xAF\xDB\x00\x22\x02\xDE\x73\x4F\xDE\x5F\x92\x66\xB0\x14\x06\x00\x5B\xBC\xD8\xBB\x84\xA4\x50\x00\xF8\x9C\x65\xD6\xAD\x03\x56\xAD\xF2\xAE\xA3\x6A\xDA\xB4\x01\x4E\x38\xC1\xBB\x0A\x49\x29\x6A\x04\xA0\x30\xBC\xF4\x92\x65\xA6\x4F\xCF\xFF\xEB\xF6\xEE\x0D\xEC\xBF\xBF\xF7\xD1\x57\xCD\x9A\x35\x66\x6B\xD7\x7A\x57\x91\x14\x0A\x00\xDB\xE3\xFC\xF9\xDE\x25\x54\xDD\xE5\x97\x7B\x57\x20\x22\x9E\xFE\xF0\x07\x9F\xD7\xBD\xE2\x0A\xEF\x23\xAF\x32\x7E\xFC\xB1\x77\x09\x49\xA2\x00\xB0\x3D\x9B\x37\xCF\xBB\x84\x2A\xE3\x05\x17\x30\x6A\xD2\xC4\xBB\x0C\x49\x21\xAD\x04\x58\x00\x26\x4D\x32\xCB\xFF\xCE\x7F\x64\x83\x06\x40\xFF\xFE\xDE\x47\x5F\x75\x69\xFC\x92\x97\x3B\x0A\x00\x5F\x92\xC2\x00\x60\x0D\x1B\xA6\xF3\x83\x28\xFE\x74\x0B\x20\xDD\x48\x60\xC8\x10\x9F\xD7\x3E\xEF\x3C\xA0\x59\x33\xEF\x16\xA8\xB2\x34\x7E\xC9\xCB\x21\x05\x80\x2F\xF9\xE0\x03\xEF\x0A\xAA\xE7\x07\x3F\xF0\xAE\x40\x44\xF2\x8C\xCF\x3C\x63\xF6\xF6\xDB\x3E\x2F\xFE\xFD\xEF\x7B\x1F\x7E\xF5\xCC\x98\xE1\x5D\x41\x92\x28\x00\x6C\x8F\xD3\xA6\x79\x97\x50\x2D\xD6\xA3\x07\xB5\x45\xB0\x54\x99\x6E\x01\xA4\x57\x45\x05\xEC\xA6\x9B\x3C\x5E\x99\xEC\xD1\x23\x55\x9B\xFF\x7C\xA9\xF8\x94\x9E\xE3\x73\x44\x01\xE0\x4B\x66\xCF\x06\x8A\x8B\xBD\xAB\xA8\x9E\xEB\xAE\xF3\xAE\x40\xD2\x46\x01\x20\xBD\x1E\x78\xC0\xEC\xC3\x0F\x7D\x5E\xFB\xFA\xEB\xBD\x8F\xBE\x7A\x4A\x4B\x81\xB9\x73\xBD\xAB\x48\x12\x05\x80\xED\x58\xA6\xBC\x1C\xF4\xFA\x50\xD5\xD4\xF9\xE7\x93\x69\x5B\x91\x4B\x7C\x29\x00\xA4\xD3\x86\x0D\xC0\xAD\xB7\x7A\xBC\x32\xA3\xD6\xAD\x81\x8B\x2E\xF2\x6E\x81\xEA\xF9\xF0\x43\xCB\xA4\x69\xDB\xF7\xDC\x53\x00\xF8\x8A\xF7\xDE\xF3\xAE\xA0\x7A\xEA\xD4\x01\x7F\xF2\x13\xEF\x2A\x24\x4D\x14\x00\xD2\xE9\x97\xBF\x74\x59\xF5\x0F\x00\x6C\xD0\x20\xA0\x7E\x7D\xEF\x16\xA8\x9E\xB4\x9E\xDB\x73\x47\x01\x60\x47\x6E\x93\x6A\xB2\x61\xE0\x40\x46\x2D\x5B\x7A\x57\x21\x69\xA1\x00\x90\x3E\x93\x27\x03\xF7\xDD\xE7\xF1\xCA\xF1\xE3\xC6\x29\x9E\x70\xCC\xB7\xDE\xF2\x2E\x21\x69\x14\x00\xBE\x62\xD2\x24\xEF\x0A\xAA\xCD\x1A\x36\x84\xFD\xE8\x47\xDE\x65\x48\x4A\x50\x01\x20\x5D\xCA\xCB\x81\x6B\xAE\xC9\xF7\x8E\x7F\xDB\xD8\x0F\x7E\x90\xCA\x47\xFF\xB6\xD5\x9F\xE2\x73\x7B\x8E\x28\x00\x7C\xC5\xDC\xB9\xC0\xF2\xE5\xDE\x55\x54\xDF\xA0\x41\x64\x8B\x16\xDE\x55\x48\x0A\x68\x21\xA0\x74\xE1\x5D\x77\x99\xF9\x0C\x63\x33\x6A\xDC\x18\xF8\xF1\x8F\xBD\x9B\xA0\xFA\x07\xB0\x72\x25\x30\x67\x8E\x77\x19\x49\xA3\x00\xB0\x03\x33\x12\x78\xE7\x1D\xEF\x3A\xAA\xAF\x59\x33\xF0\x17\xBF\xF0\xAE\x42\xD2\x40\x01\x20\x3D\x16\x2C\x80\xFD\xF6\xB7\x6E\x2F\x6F\x37\xDE\x08\xB4\x6E\xED\xDD\x0A\xD5\xAF\x7F\xD2\x24\x53\xE0\xFD\x0A\x05\x80\x9D\x7A\xED\x35\xEF\x0A\x6A\xC4\x7E\xF8\x43\xB2\x43\x07\xEF\x32\x24\xE1\x74\x0B\x20\x25\x2A\x2A\xC0\x01\x03\xCC\x36\x6D\xF2\x78\x75\xB2\x6D\x5B\x60\xF0\x60\xEF\x56\xA8\x99\xD7\x5F\xF7\xAE\x20\x89\x14\x00\x76\xEA\xA5\x97\xBC\x2B\xA8\x99\x7A\xF5\x80\xDB\x6E\xF3\xAE\x42\x44\xB2\xE1\x77\xBF\xB3\xCC\x9B\x6F\xBA\xBD\x3C\x6F\xB9\x05\xD8\x6B\x2F\xEF\x56\xA8\x99\x17\x5F\xF4\xAE\x20\x89\x14\x00\x76\xC2\x6C\xF6\x6C\x30\xED\x6B\x46\x5F\x7C\x31\xF9\xF5\xAF\x7B\x57\x21\x09\xA6\x21\xD1\x14\x98\x3C\x19\xF4\x0B\xF3\xE4\x41\x07\xC1\x52\xB8\xEB\xDF\x97\x2C\x58\x60\xA6\xFB\xFF\x3B\xA3\x00\xB0\x2B\xF6\xCA\x2B\xDE\x25\xD4\x4C\x26\xE3\xB7\x4D\xA8\xA4\x83\x02\x40\xB2\x6D\xDC\x08\x5E\x72\x89\x65\xCA\xCA\xFC\x6A\xB8\xF3\x4E\xA0\x76\x6D\xEF\x96\xA8\x19\x7D\xFB\xDF\x15\x05\x80\x5D\x2A\x84\x37\xCD\xC9\x27\x33\x3A\xF5\x54\xEF\x2A\x24\xA9\xB4\x1B\x60\xA2\xF1\xDA\x6B\x2D\x53\x54\xE4\xF6\xF2\x3C\xF6\x58\xE0\x9C\x73\xBC\x9B\xA1\xE6\xD2\x7E\x4B\x37\x77\x14\x00\x76\x69\xC2\x04\x60\xE3\x46\xEF\x2A\x6A\xCC\xEE\xB9\x87\x51\xDD\xBA\xDE\x65\x48\x12\x69\x04\x20\xB9\x1E\x79\xC4\x32\x8F\x3D\xE6\xF5\xEA\x8C\x6A\xD7\x06\xEF\xBD\xD7\xBB\x15\x6A\x6E\xE3\xC6\xF8\x5C\x2E\x3B\xA3\x00\xB0\x0B\x66\x5B\xB6\x00\x2F\xBC\xE0\x5D\x47\xCD\x1D\x7A\x68\xFC\x08\x8F\x88\xA4\x02\xDF\x7B\xCF\x7D\xC5\x3D\xBB\xE1\x06\x58\x8F\x1E\xDE\x4D\x51\x73\xCF\x3F\x1F\x9F\xCB\x65\x67\x14\x00\x76\x6B\xDC\x38\xEF\x0A\xB2\xE3\x17\xBF\x20\x0F\x39\xC4\xBB\x0A\x49\x1A\x8D\x00\x24\xCF\x67\x9F\x01\xDF\xFE\xB6\xD9\xE6\xCD\x5E\x15\x30\xDA\x7F\x7F\xF0\xD7\xBF\xF6\x6E\x89\xEC\x28\x94\x73\x78\x6E\x28\x00\xEC\xD6\x8B\x2F\x16\xC4\x6D\x00\xD4\xAB\x07\xDC\x7F\x3F\x69\xE6\x5D\x89\x24\x89\x02\x40\xB2\x94\x95\x01\x17\x5E\x68\x99\xC5\x8B\x5D\xCB\xB0\xBF\xFC\x05\xD6\xB0\xA1\x77\x6B\xD4\xDC\xE6\xCD\xC0\xCB\x2F\x7B\x57\x91\x64\x0A\x00\xBB\x11\xA7\xF0\xE7\x9F\xF7\xAE\x23\x3B\x4E\x38\x01\xBC\xFA\x6A\xEF\x2A\x24\x49\x34\x09\x30\x59\x06\x0D\x32\xF3\x5D\xB0\x86\xBC\xE4\x12\xE0\xCC\x33\xBD\x5B\x22\x3B\xFE\xF1\x0F\xAF\xC5\x93\xD2\x42\x01\x60\x4F\xF8\xF0\xC3\xDE\x25\x64\x8D\xDD\x79\x27\xA3\x7D\xF6\xF1\x2E\x43\x44\x76\xC0\x07\x1E\x30\x1B\x3E\xDC\xB5\x04\xB6\x68\x01\xFC\xF1\x8F\xDE\x4D\x91\x3D\x8F\x3C\xE2\x5D\x41\xD2\x29\x00\xEC\x89\x4D\x9C\x08\x7C\xF2\x89\x77\x19\xD9\xD1\xBC\x39\x6C\xD8\x30\xEF\x2A\x24\x29\x74\x0B\x20\x19\x5E\x7A\xC9\x7D\xD2\x1F\x00\xE0\xEE\xBB\x81\x56\xAD\xBC\xAB\xC8\x8E\x25\x4B\x34\xFB\x7F\xCF\x14\x00\xF6\x20\xDE\x7A\xB3\x90\x92\xE4\x85\x17\x32\xBA\xF4\x52\xEF\x2A\x24\x09\x14\x00\xFC\x4D\x99\x02\xF6\xEB\x67\x99\xF2\x72\xCF\x2A\xC8\xF3\xCE\x03\x2E\xBF\xDC\xBB\x35\xB2\x77\x40\xA3\x47\xBB\x6D\x9B\x9C\x22\x0A\x00\x95\x32\x6A\x54\x41\x9D\x2C\x6D\xF8\x70\x46\x9D\x3B\x7B\x97\x21\xDE\x0A\xE8\x3D\x9D\x4A\xF3\xE7\x03\x67\x9D\x65\x19\xDF\x89\xC6\x8C\xBE\xF6\x35\x60\xE4\x48\xEF\xD6\xC8\x2A\x1B\x3D\xDA\xBB\x84\x34\x50\x00\xA8\x04\xB3\xF9\xF3\xC1\x57\x5F\xF5\xAE\x23\x7B\x1A\x35\x82\x8D\x19\xC3\xA8\x4E\x1D\xEF\x4A\xC4\x91\x76\x03\x74\xB4\x6A\x15\x70\xC6\x19\x66\xCB\x96\x79\x56\x41\x66\x32\xF1\x08\x67\x8B\x16\xDE\x2D\x92\xBD\x83\xFA\xD7\xBF\xCC\x66\xCF\xF6\x2E\x23\x0D\x14\x00\x2A\xCB\x0A\x61\x55\xAC\xED\xF5\xEC\x09\xBB\xF9\x66\xEF\x2A\xC4\x91\x36\x03\x72\xB2\x79\x33\x70\xCE\x39\xC9\xD8\xA0\xE6\xE7\x3F\x87\x9D\x72\x8A\x77\x15\x59\x55\x70\xE7\xEA\xDC\x51\x00\xA8\xB4\xE7\x9F\x4F\xFF\x0E\x81\x3B\xFA\xF9\xCF\xC9\x02\xFB\xF0\x8B\x24\x5A\x69\x29\xD0\xAF\x9F\xD9\xDB\x6F\x7B\x57\xC2\xE8\xA8\xA3\x80\x42\xFB\x12\xB0\x70\x21\x30\x7E\xBC\x77\x15\x69\xA1\x00\x50\x49\x66\x51\x04\xF8\x3E\xA6\x93\x7D\x99\x0C\x30\x7A\x74\xFC\xF8\x8F\x04\x47\xB7\x00\xF2\xAC\xAC\x0C\xBC\xE0\x02\xB3\x7F\xFE\xD3\xBB\x12\x46\xF1\x6D\x40\xA0\xC0\x6E\x03\xF2\xCF\x7F\xD6\xE4\xBF\xCA\x53\x00\xA8\x0A\x1B\x35\x0A\x2C\xB4\x85\x25\xDA\xB5\x03\xFE\xFA\x57\xAD\x12\x18\x20\xD3\x42\x40\xF9\x53\x5E\x0E\x5C\x74\x91\x65\x12\xF2\xED\xD4\x1E\x78\x00\xE8\xD2\xC5\xBB\x8C\xAC\xE2\xA6\x4D\xB0\xBF\xFE\xD5\xBB\x8C\x34\x51\x00\xA8\x02\xB3\x35\x6B\x0A\x6E\xB6\x2C\x80\x78\xCB\xCF\x42\x1B\x0A\x14\x49\x8A\x8A\x0A\xE0\x8A\x2B\xCC\x9E\x7E\xDA\xBB\x12\x00\x20\x7F\xF6\x33\xE0\xA2\x8B\xBC\xEB\xC8\xBE\x11\x23\xCC\x56\xAF\xF6\xAE\x42\x0A\x18\xD9\xAE\x1D\x59\x5C\xCC\x82\x53\x51\x41\x7E\xFB\xDB\xDE\xED\x2B\xF9\x43\x0E\x1F\xEE\xFD\xAE\x2B\x7C\x15\x15\x64\x72\x9E\xAF\x67\xD4\xB7\x2F\x59\x5E\xEE\xDD\x2A\xD9\x57\x5C\x4C\xB6\x6B\xE7\xDD\xBE\x69\xA3\x11\x80\x2A\x32\x5B\xB2\x04\x2C\xC4\x67\x4C\x33\x19\xE0\xB1\xC7\xC8\xAE\x5D\xBD\x2B\x11\x29\x0C\x15\x15\xC0\x55\x57\x99\x25\x63\x21\x31\xB2\x43\x07\x60\xCC\x18\xA0\x56\x2D\xEF\x5A\xB2\x7F\x70\xA3\x47\x9B\x2D\x59\xE2\x5D\x46\xDA\x28\x00\x54\x87\xDD\x7E\x7B\x7C\x4F\xAF\xD0\x34\x6A\x04\x3C\xFD\x34\xD9\xAC\x99\x77\x25\x92\x0F\x9A\x04\x98\x3B\xA5\xA5\xC0\x85\x17\x26\xE6\xE2\x1F\x35\x6A\x04\x8C\x1F\x0F\x6B\xD9\xD2\xBB\x96\xEC\xAB\xA8\x00\xEE\xBA\xCB\xBB\x8A\x34\x52\x00\xA8\x06\xB3\x79\xF3\x80\xBF\xFD\xCD\xBB\x8E\xDC\xE8\xD2\x05\xF8\xFB\xDF\xC9\x02\xFC\x96\x20\x3B\x50\x00\xC8\x8D\x92\x92\xF8\x51\xBF\xA7\x9E\xF2\xAE\x04\x00\x48\x33\xD8\xA8\x51\x40\xB7\x6E\xDE\xB5\xE4\xC6\xE3\x8F\x5B\xA6\xA8\xC8\xBB\x8A\x34\x52\x00\xA8\xB6\xA1\x43\xE3\xFD\xBB\x0B\x51\xDF\xBE\xC0\xAD\xB7\x7A\x57\x21\xB9\xA6\xA7\x00\xB2\x6F\xE3\xC6\x78\x85\xBF\x7F\xFC\xC3\xBB\x92\x6D\xF8\xCB\x5F\x02\xFD\xFB\x7B\x97\x91\x1B\x65\x65\xC0\x2D\xB7\x78\x57\x91\x56\x0A\x00\xD5\x14\x8F\x02\x8C\x1A\xE5\x5D\x47\xEE\xFC\xE2\x17\xE4\xD5\x57\x7B\x57\x21\xB9\xA4\x11\x80\xEC\x5A\xB5\x0A\xE8\xDB\xD7\xEC\xDF\xFF\xF6\xAE\x64\x2B\xF2\x92\x4B\x60\x85\x1C\xE6\xFF\xFA\x57\xB3\x8F\x3F\xF6\xAE\x22\xAD\x14\x00\x6A\xE4\xB6\xDB\x80\x2D\x5B\xBC\xAB\xC8\x9D\x11\x23\xF4\x64\x80\x48\x65\x2C\x58\x00\x1C\x77\x9C\xD9\x3B\xEF\x78\x57\xB2\x15\x79\xD2\x49\xF1\x97\x94\x42\x5D\xE3\xA3\xB8\x18\xFC\xCD\x6F\xBC\xAB\x48\x33\x05\x80\x1A\x30\xFB\xF4\x53\xF0\xBE\xFB\xBC\xEB\xC8\x9D\x5A\xB5\x80\xC7\x1E\x8B\x97\x0C\x95\xC2\xA3\x11\x80\xAC\xE0\xFB\xEF\x03\xC7\x1C\x93\xA4\x0D\x68\x18\x75\xEF\x0E\x3C\xFB\x2C\x50\xAF\x9E\x77\x2D\xB9\x3B\xC8\xBF\xFC\xC5\x32\x9F\x7C\xE2\x5D\x46\x9A\x29\x00\xD4\x94\xFD\xE6\x37\xE0\xCA\x95\xDE\x65\xE4\x4E\xA3\x46\xC0\x8B\x2F\x6A\xFB\xE0\x42\xA4\x39\x00\x35\xC6\x7F\xFD\x0B\x38\xE9\x24\xB3\xA5\x4B\xBD\x4B\xD9\x56\x12\xDB\xB5\x83\x3D\xFF\x3C\xD0\xB4\xA9\x77\x2D\xB9\xB3\x7A\x35\xEC\x77\xBF\xF3\xAE\x22\xED\x14\x00\x6A\xC8\x6C\xED\x5A\xD8\xD0\xA1\xDE\x75\xE4\xF6\x20\x5B\xB6\x8C\x43\x40\xEB\xD6\xDE\xA5\x48\x16\x51\x01\xA0\x66\x1E\x7B\x0C\x38\xE3\x0C\xCB\xAC\x5B\xE7\x5D\xC9\x56\x8C\x9A\x36\x05\xFE\xF9\x4F\xA0\x7D\x7B\xEF\x5A\x72\xEB\xD7\xBF\xD6\xAA\x7F\x35\xA7\x00\x90\x0D\x1C\x31\x02\xF8\xF0\x43\xEF\x32\x72\xCA\x3A\x75\x02\x9E\x7B\x8E\xDC\x6B\x2F\xEF\x52\x24\x5B\x14\x00\xAA\x87\x8C\x9F\x92\x19\x30\xC0\x32\xA5\xA5\xDE\xD5\x6C\xAB\x2A\xAA\x57\x0F\xF6\xDC\x73\x40\xF7\xEE\xDE\xB5\xE4\xF6\x40\x67\xCF\x06\x0B\x71\x49\xF6\xFC\x53\x00\xC8\x02\xCB\x94\x97\x03\x3F\xF9\x89\x77\x1D\xB9\x3F\xD0\xDE\xBD\x81\xA7\x9F\x66\x54\xC0\xF7\x15\x43\xA2\xCD\x80\xAA\xA1\xB8\x18\xB8\xF8\x62\xB3\x9B\x6F\x36\x4B\xCE\x1C\x0A\x46\x75\xEA\xC0\xC6\x8E\x05\x4E\x3C\xD1\xBB\x96\x9C\xB3\xFF\xEF\xFF\xB3\x4C\xA1\x3E\x82\x9D\x5F\x0A\x00\x59\x62\xF6\xE2\x8B\x40\x82\x9E\xFD\xCD\x99\xD3\x4E\x83\x3D\xFB\xAC\x42\x40\x21\x50\x00\xA8\x9A\xA5\x4B\xC1\x93\x4E\x32\x7B\xE2\x09\xEF\x4A\xB6\x47\xD6\xAA\x05\x1B\x3D\x3A\xDE\xD4\xAB\xC0\xF1\xC5\x17\xCD\x5E\x78\xC1\xBB\x8C\x42\xA1\x00\x90\x4D\xBC\xEE\xBA\xC2\xDB\x2E\x78\x67\x4E\x3F\x1D\x78\xFC\x71\x46\xB5\x6B\x7B\x57\x22\x35\xA1\x00\x50\x79\xD3\xA7\x83\xDF\xF8\x86\x65\xFE\xFB\x5F\xEF\x4A\xB6\x47\x66\x32\xC0\xC3\x0F\x17\xE6\xEE\x7E\x3B\xDA\xB2\x05\xF6\xC3\x1F\x7A\x57\x51\x48\x14\x00\xB2\xC8\x32\x8B\x16\xC1\x7E\xFB\x5B\xEF\x3A\xF2\x73\xB0\xE7\x9D\x07\xFB\xEB\x5F\xE3\x13\x90\xA4\x93\x02\x40\xE5\x3C\xF5\x14\x78\xEC\xB1\x96\x59\xB8\xD0\xBB\x92\xED\x91\x66\xF1\xF6\xE4\x97\x5E\xEA\x5D\x4B\x7E\xDC\x76\x9B\xD9\xFC\xF9\xDE\x55\x14\x12\x9D\xBC\xB3\x8D\x77\xDF\x5D\xF0\x13\x02\xB7\xB9\xEC\x32\xE0\xC1\x07\x15\x02\xD2\x2A\x39\xF7\xB0\x93\xA9\xA2\x22\x5E\x66\xB6\x7F\x7F\xCB\x6C\xDC\xE8\x5D\xCD\xF6\xE2\x8B\xFF\xBD\xF7\x02\xA1\xAC\xD6\x39\x77\x2E\xF8\xFF\xFE\x9F\x77\x15\x85\x46\x27\xEE\x2C\xB3\x4C\x69\x29\xF8\xFD\xEF\x87\xF3\xED\xEA\xCA\x2B\x81\x61\xC3\xBC\xAB\x90\xEA\x08\xE5\x3D\x5A\x1D\xAB\x56\x81\x67\x9C\x61\x36\x74\xA8\x25\x71\xB2\x24\xEF\xBA\x0B\x08\x65\x38\x9C\x04\xBF\xF7\x3D\xCB\x94\x94\x78\x57\x52\x68\x14\x00\x72\xC0\x32\x6F\xBC\x01\xDC\x7F\xBF\x77\x1D\xF9\xF3\xA3\x1F\x91\xC3\x87\x6B\x24\x20\x6D\x34\x02\xB0\x53\x7C\xFF\x7D\xA0\x67\x4F\xCB\x4C\x98\xE0\x5D\xCA\x57\x4A\xA3\x19\xA3\x3F\xFC\x01\x16\xC0\x53\x47\xDB\x0C\x1F\x1E\x9F\x53\x45\x52\x82\x51\xE3\xC6\xE4\xC2\x85\x0C\xCA\x83\x0F\x6A\x1B\xE1\xF4\x60\x74\xD3\x4D\xDE\xEF\x98\xE4\x79\xE8\x21\xB2\x41\x03\xEF\xBE\xD9\x69\x7F\x31\x93\x21\xEF\xBB\xCF\xBB\x85\xF2\x6B\xE1\x42\x46\x8D\x1B\x7B\xB7\x7D\xA1\xD2\x37\xB6\x1C\xB1\xCC\x86\x0D\xC0\x55\x57\x85\xF5\x2D\xEB\xEA\xAB\x81\x31\x63\x18\xD5\xA9\xE3\x5D\x89\x54\x42\x82\x9E\x63\xF7\x57\x5C\x0C\x0C\x1E\x6C\x76\xE5\x95\x66\xC9\xDB\xE0\x2B\x0E\xD6\x0F\x3E\x08\x5C\x7B\xAD\x77\x2D\xF9\x75\xCD\x35\xF1\xB9\x54\x72\x41\x01\x20\x87\xCC\x5E\x7D\x15\x7C\xE8\x21\xEF\x3A\xF2\xEB\xC2\x0B\x61\x63\xC7\x6A\x9D\x80\x34\xA8\xA8\xF0\xAE\x20\x19\x3E\xFC\x10\x38\xEA\x28\xB3\x64\xCE\x65\x89\x03\xF5\x98\x31\xF1\x7C\x9B\x90\x3C\xF4\x90\xD9\x4B\x2F\x79\x57\x51\xC8\x14\x00\x72\xCD\xAE\xBF\x1E\x98\x33\xC7\xBB\x8C\xFC\x3A\xF7\x5C\xD8\x8B\x2F\x32\x6A\xD4\xC8\xBB\x12\xD9\x1D\x8D\x00\x00\x8F\x3E\x0A\xF6\xEA\x65\x36\x73\xA6\x77\x25\x3B\xC3\xA8\x6E\x5D\xD8\xDF\xFF\x0E\x5C\x78\xA1\x77\x2D\xF9\x3D\xF0\x79\xF3\xC0\xC1\x83\xBD\xCB\x28\x74\x0A\x00\x39\x66\xB6\x69\x13\x78\xD9\x65\x40\x68\x4B\x57\x9E\x7C\x32\x30\x7E\xBC\xEE\xDF\x25\x18\x03\x1E\x01\xE0\xA6\x4D\xC0\x55\x57\x99\x0D\x18\x90\xB4\x47\xFC\xB6\x95\xC8\xBD\xF6\x82\x8D\x1F\x0F\x7C\xE7\x3B\xDE\xB5\xE4\x57\x59\x19\xF0\xDD\xEF\x5A\x66\xFD\x7A\xEF\x4A\x0A\x9D\x02\x40\x1E\x58\x66\xF2\x64\xE0\xD7\xBF\xF6\xAE\x23\xFF\x07\x7E\xD2\x49\xB0\x49\x93\xC8\x76\xED\xBC\x4B\x91\x9D\x08\x76\x0E\xC0\x94\x29\xB0\x23\x8F\x34\x4B\xEE\xED\x39\x72\xEF\xBD\x81\x57\x5E\x01\xFA\xF6\xF5\xAE\x25\xFF\x6E\xBE\xD9\x32\xEF\xBE\xEB\x5D\x45\x08\x14\x00\xF2\xE6\xCE\x3B\xC1\x89\x13\xBD\xAB\xC8\xBF\xEE\xDD\x81\x37\xDF\x24\x0F\x3A\xC8\xBB\x12\xD9\x51\x02\x9F\x6F\xCF\x29\x12\xF8\xD3\x9F\xC0\x63\x8E\x31\x4B\xEE\x6D\x39\xB2\x43\x07\xE0\xED\xB7\x81\x63\x8F\xF5\xAE\x25\xFF\xDE\x78\x03\xB8\xF3\x4E\xEF\x2A\x42\xA1\x00\x90\x27\x66\x51\x04\xBB\xFC\x72\x70\xE5\x4A\xEF\x5A\xF2\xEF\x80\x03\x80\xB7\xDF\x26\x43\x3C\xA1\x25\x59\x48\x01\x60\xF1\x62\xE0\x94\x53\xCC\x06\x0D\x4A\xD2\x16\xBE\x3B\x62\x74\xD8\x61\xC0\xA4\x49\x40\x88\x81\x79\xCD\x1A\xF0\xB2\xCB\xCC\x02\xBE\x35\x95\x67\x0A\x00\x79\x64\xF6\xE9\xA7\xB0\xFF\xFB\x3F\xEF\x3A\x7C\xEC\xBD\x37\xF8\xF2\xCB\xE4\x99\x67\x7A\x57\x22\x9F\x0B\x66\x0E\xC0\x13\x4F\x00\x87\x1F\x6E\xF6\xDA\x6B\xDE\x95\xEC\x0E\xA3\x53\x4F\x85\xBD\xF5\x16\x10\xEA\x2D\xB3\xAB\xAF\xB6\xCC\xA2\x45\xDE\x55\x84\x44\x01\x20\xCF\xCC\x9E\x7B\x0E\x18\x3E\xDC\xBB\x0E\x9F\x83\x6F\xD8\x10\x78\xEE\x39\x46\xD7\x5C\xE3\x5D\x8A\x20\x80\x39\x00\x6B\xD7\x82\x03\x06\x98\x7D\xF7\xBB\x66\x6B\xD6\x78\x57\xB3\x3B\x8C\x2E\xBD\x14\xF6\xC2\x0B\x40\xA8\x93\x66\x47\x8C\x30\x7B\xE6\x19\xEF\x2A\x44\x72\x8E\x6C\xD0\x80\xFC\xE0\x03\xEF\x35\xB6\xFC\x44\x11\x79\xF3\xCD\xF1\x86\x26\xE2\x85\xBC\xF6\x5A\xEF\x77\x42\xEE\xFC\xE3\x1F\x64\x9B\x36\xDE\x6D\x5C\xB9\x7E\xF8\xF9\xCF\xE3\xCF\x44\xA8\x66\xCD\x22\xF7\xDA\xCB\xBB\x1F\x42\xA4\x11\x00\x07\xF1\x4A\x63\xE7\x9F\x0F\xAC\x5B\xE7\x5D\x8B\x57\x0B\x00\x43\x87\x02\x4F\x3C\x91\xD4\x65\x57\xC3\x50\x88\x23\x00\xEB\xD7\x03\xD7\x5C\x63\x76\xCE\x39\x66\xCB\x96\x79\x57\xB3\x3B\x8C\xEA\xD6\x25\x1F\x7A\x08\xF8\xDD\xEF\xE2\xCF\x44\x88\x36\x6C\x00\xFA\xF5\x33\xDB\xBC\xD9\xBB\x92\x10\x29\x00\x38\x31\x9B\x33\x27\x5E\x1F\x20\xA4\x89\x58\x3B\xEA\xDF\x1F\xFC\xD7\xBF\xD2\xF2\x4D\xAD\xE0\x14\xDC\x1C\x80\x17\x5E\x00\xBB\x75\x33\x1B\x39\xD2\xBB\x92\x3D\x61\xD4\xAA\x15\xEC\xD5\x57\x81\x2B\xAE\xF0\xAE\xC5\xB1\x15\x08\x0C\x18\x90\xD4\x45\x98\x42\xA0\x00\xE0\xC8\x32\xE3\xC7\xC7\xFB\x8D\x07\xCC\x7A\xF7\x06\xFE\xF7\x3F\xF2\xC8\x23\xBD\x4B\x09\x4F\xA1\x8C\x00\x2C\x5F\x0E\x5E\x7E\xB9\xD9\x59\x67\x59\x66\xF1\x62\xEF\x6A\xF6\x84\x51\xB7\x6E\xB0\xFF\xFE\x17\x38\xEE\x38\xEF\x5A\x7C\xDD\x72\x8B\xD9\xB3\xCF\x7A\x57\x21\xE2\x26\xDE\xDE\x73\xEC\x58\xEF\xBB\x70\xEE\xA2\x8D\x1B\xC9\x73\xCF\xF5\xEE\x8F\x90\x90\x57\x5D\xE5\xDD\xED\x35\x7F\xDF\x8C\x1D\xCB\xA8\x65\x4B\xEF\xB6\xAC\x74\x9B\x47\xA7\x9D\x46\xAE\x5D\xEB\xDD\x6C\xFE\x9E\x7D\x56\xDB\x87\x8B\x00\x60\xD4\xA8\x11\x39\x63\x86\xF7\x47\xD2\x5F\x14\x91\x43\x87\x7A\xF7\x47\x28\xC8\x2B\xAE\xF0\xEE\xF1\xEA\xBF\x55\x3E\xFE\x98\xD1\xA9\xA7\x7A\xB7\x61\xD5\xDA\x7B\xE0\x40\xB2\xAC\xCC\xBB\xE9\xFC\xCD\x9E\xCD\xA8\x69\x53\xEF\xFE\x10\x49\x0C\xF2\x80\x03\xC8\x95\x2B\xBD\x3F\x9A\xC9\xF0\xF8\xE3\x64\xC3\x86\xDE\x7D\x52\xE8\x18\x0D\x18\xE0\xDD\xD3\x55\x57\x56\x46\x0E\x1B\x96\xA6\x8D\xA6\x18\xD5\xAB\x47\x3E\xF8\xA0\x77\xCB\x25\xC3\xBA\x75\xE4\x21\x87\x78\xF7\x89\xC4\x34\x04\x93\x10\x66\xF3\xE7\x83\xDF\xFD\xAE\xB6\x68\x05\x80\xEF\x7E\x37\x5E\x39\xB0\x53\x27\xEF\x4A\x0A\x5B\xDA\x26\xA0\x4E\x9B\x16\x2F\xE3\x3B\x68\x50\x52\x37\xF0\xD9\x11\xA3\xAF\x7D\x0D\xF6\xC6\x1B\xC0\xD5\x57\x7B\xD7\xE2\x2F\x8A\x80\x8B\x2F\x36\xFB\xF0\x43\xEF\x4A\x24\xA6\x00\x90\x20\x96\x99\x30\x01\xB8\xE9\x26\xEF\x3A\x92\xA1\x7B\x77\x60\xEA\x54\xF2\xDB\xDF\xF6\xAE\xA4\x60\x59\x5A\x02\xC0\x96\x2D\xC0\x8D\x37\x82\x47\x1D\x15\x6F\xAC\x95\x0E\xE4\x89\x27\xC2\xFE\xF7\x3F\xA0\x57\x2F\xEF\x5A\x92\xE1\xA6\x9B\xCC\x5E\x78\xC1\xBB\x0A\x91\xC4\x22\xCD\xC8\x47\x1E\xF1\x1E\xA8\x4B\x8E\x8A\x0A\xF2\x97\xBF\xD4\xA2\x41\xD9\x47\x5E\x78\xA1\x77\xEF\xEE\x51\xF4\xD4\x53\x8C\xF6\xDF\xDF\xBB\xAD\xAA\xD6\xAE\x66\xE4\xCF\x7E\x46\x96\x97\x7B\x37\x5F\x72\x8C\x1E\xAD\xCF\xB0\x48\x25\x30\xAA\x53\x87\x7C\xE9\x25\xEF\x8F\x6C\xB2\x8C\x1F\x4F\x36\x6B\xE6\xDD\x37\x85\x84\xEC\xDF\xDF\xBB\x57\x77\x6D\xCE\x1C\xF2\x8C\x33\xBC\xDB\xA8\xCA\x6D\x1A\x35\x6A\xA4\xA7\x7A\x76\xF4\xAF\x7F\x31\xAA\x57\xCF\xBB\x6F\x44\x52\x83\x51\x93\x26\x8C\xDE\x7B\xCF\xFB\xA3\x9B\x2C\xB3\x67\x33\xEA\xDE\xDD\xBB\x6F\x0A\x05\x79\xFE\xF9\xDE\x3D\xFA\x55\xEB\xD6\x91\x3F\xF9\x09\xA3\x3A\x75\xBC\xDB\xA7\xEA\xED\x79\xE8\xA1\xE4\xCC\x99\xDE\x2D\x98\x2C\xEF\xBF\xCF\xA8\x49\x13\xEF\xBE\x11\x49\x1D\x72\xDF\x7D\xC9\x05\x0B\xBC\x3F\xC2\xC9\xB2\x65\x0B\x39\x68\x90\x77\xDF\x14\x02\xF2\xBC\xF3\xBC\x7B\xF3\x0B\x51\x14\x3F\xD3\xDF\xBE\xBD\x77\xBB\x54\xAB\x2D\xA3\x01\x03\xE2\xB5\x2C\xE4\x0B\x9F\x7C\x92\xD6\xFE\x14\x49\x04\xF2\x90\x43\xC8\x55\xAB\xBC\x3F\xCA\xC9\xF3\xE4\x93\x7A\x96\xB8\x66\xC8\x73\xCF\xF5\xEE\x45\x92\x64\x34\x75\x2A\x79\xEC\xB1\xDE\xED\x51\xBD\x36\x6C\xD0\x80\x1C\x31\xC2\xBB\x09\x93\x67\xED\x5A\x8D\xD6\x89\x64\x01\xA3\xE3\x8F\x8F\xBF\xF9\xCA\x97\xCD\x9E\xCD\xE8\xF0\xC3\xBD\xFB\x27\xAD\xC8\x73\xCE\x71\xED\xBE\x68\xC5\x8A\x78\x71\x9C\x74\xAE\x08\x47\x76\xED\xAA\x21\xFF\x9D\xD9\xB2\x85\xD1\x09\x27\x78\xF7\x8F\x48\xC1\x88\x4F\xD6\x9A\x55\xFC\x55\xBA\x25\x50\x5D\x8C\xCE\x3E\xDB\xA7\xCF\x4A\x4A\xC8\x11\x23\xD2\xB4\x84\xEF\x57\xDB\x4E\x43\xFE\x3B\x17\x45\xE4\x25\x97\x78\xF7\x8F\x48\xC1\x21\x07\x0F\xF6\xFE\x78\x27\xD7\x13\x4F\xE8\x29\x81\xAA\x21\xBF\xF5\xAD\xFC\xF6\x51\x14\xC5\xAB\x3C\x76\xE8\xE0\x7D\xEC\xD5\x6E\xB3\xA8\x49\x93\xF8\x91\x36\xD9\xB9\x1F\xFF\xD8\xBB\x8F\x44\x0A\x16\xF9\xDB\xDF\x7A\x7F\xC4\x93\x6B\xE1\x42\x0D\x3D\x56\x1E\xA3\x53\x4F\xCD\x5F\xDF\xBC\xFE\x3A\xA3\x9E\x3D\xBD\x8F\xB9\x46\xED\xC5\x63\x8E\x21\xE7\xCD\xF3\x7E\x97\x27\x56\xF4\xBB\xDF\x79\xF7\x91\x48\xC1\x23\xEF\xB8\xC3\xFB\xB3\x9E\x5C\x51\x14\xAF\x15\x5F\xB7\xAE\x77\x3F\x25\x1D\x79\xD2\x49\xB9\xEF\x8F\x39\x73\x18\xF5\xEB\xE7\x7D\xAC\x35\x6A\xA7\xA8\x76\x6D\x72\xC8\x10\xB2\xB4\xD4\xFB\xDD\x9D\x5C\xC3\x86\x79\xF7\x93\x48\x10\xE2\x95\xC6\xFE\xF2\x17\xEF\x8F\x7C\xA2\x45\x93\x27\x33\xEA\xD2\xC5\xBB\xAF\x92\x8C\x3C\xF6\xD8\xDC\x75\xC0\xCA\x95\xE4\x90\x21\x69\x0F\x62\x8C\xF6\xDF\x9F\x7C\xE3\x0D\xEF\xB7\x73\xB2\x3D\xF8\xA0\x56\xF9\x13\xC9\xA3\x38\x04\xE8\xF1\xA3\xDD\xDB\xBC\x59\x13\x04\x77\x8D\x51\xAF\x5E\xD9\x6F\xF3\x0D\x1B\xC8\xDB\x6F\x2F\x84\x47\x34\x19\xF5\xEB\x47\xAE\x59\xE3\xFD\x2E\x4E\xB6\x87\x1F\x4E\xEB\x53\x1C\x22\xA9\x46\x66\x32\xE4\x63\x8F\x79\x9F\x02\x92\xEF\x85\x17\xC8\xB6\x6D\xBD\xFB\x2B\x69\xC8\x1E\x3D\xB2\xD7\xC6\x9B\x36\xC5\xB7\x5E\x5A\xB7\xF6\x3E\xAE\x1A\xB7\x4B\xD4\xAA\x15\xF9\xE4\x93\xDE\xEF\xDA\xE4\x1B\x37\x8E\x51\xED\xDA\xDE\xFD\x25\x12\x2C\xB2\x56\xAD\x78\x06\xBC\xEC\xDE\xEA\xD5\x8C\x2E\xBD\xD4\xBB\xBF\x92\x84\x51\xB7\x6E\x35\x6F\xD7\xCF\x1F\xE9\xE3\xBE\xFB\x7A\x1F\x4F\x56\xDA\x84\xDF\xFA\x16\xB9\x64\x89\xF7\xBB\x35\xF9\x9E\x7E\x5A\x17\x7F\x91\x04\x88\x37\x0F\xFA\xC7\x3F\xBC\x4F\x09\xA9\x10\x8D\x1D\x4B\xB6\x68\xE1\xDD\x67\x49\x40\x1E\x74\x50\xF5\x1B\xB2\xAC\x2C\x7E\x1C\xAE\x63\x47\xEF\xE3\xC8\x4A\x5B\x44\x4D\x9B\xEA\x96\x5A\x65\xBD\xF4\x92\x36\xF7\x11\x49\x10\xB2\x7E\x7D\xF2\xE5\x97\xBD\x4F\x0D\xE9\xB0\x64\x49\x1A\x77\x9A\xCB\xFE\x7B\xA6\x63\xC7\xAA\xB7\x5D\x69\x29\xA3\x51\xA3\xC8\x4E\x9D\xBC\xEB\xCF\x5A\x3B\x44\x7D\xFB\x92\x8B\x17\x7B\xBF\x2B\x53\x21\x7A\xE5\x15\xB2\x7E\x7D\xEF\x3E\x13\x91\x1D\xC4\x21\xE0\xF9\xE7\xBD\xCF\x11\xE9\x10\x45\x8C\x46\x8E\x2C\x84\xC9\x6A\xD5\x7E\xBF\x44\xED\xDB\x57\xBE\xBD\xB6\x0E\xF5\xA7\x77\x11\x9F\xAF\x1E\x7F\x93\x26\xE4\xF0\xE1\xF1\xA3\xA3\xB2\x67\x2F\xBC\xA0\x8B\xBF\x48\x82\x31\xAA\x5B\x97\x1C\x37\xCE\xFB\x54\x91\x1E\x4B\x97\x32\xBA\xE0\x02\xEF\x7E\x73\x79\xAF\xB0\x4D\x9B\x3D\xB7\x4F\x49\x49\x3C\xD4\x5F\x38\xDF\xF8\xE3\x63\x3F\xF3\x4C\x72\xE1\x42\xEF\x77\x5F\x7A\xFC\xE3\x1F\x1A\xF6\x17\x49\x81\x78\xE1\x92\x47\x1F\xF5\x3E\x65\xA4\x4A\xF4\xD4\x53\xA1\x3D\x29\x40\xB6\x68\xB1\xEB\x06\x59\xB7\x8E\xD1\x5D\x77\x91\xED\xDA\x79\xD7\x99\xDD\x63\x6E\xD3\x26\x9E\x07\x22\x95\xF7\xD8\x63\x9A\xF0\x27\x92\x22\xF1\x3A\x01\x7F\xFA\x93\xF7\xA9\x23\x5D\xD6\xAE\x25\x07\x0D\x0A\xE5\xB9\xE6\x78\x08\x7C\x47\x9F\x7D\x46\x0E\x1D\x4A\x36\x6F\xEE\x5D\x5F\x56\x8F\x95\x66\x8C\x06\x0C\x88\x17\x28\x92\x4A\x8B\x46\x8E\x0C\xE5\xF3\x20\x52\x50\xE2\x93\xDE\xDD\x77\x7B\x9F\x43\xD2\x67\xD2\x24\xF2\x90\x43\xBC\xFB\x2F\xF7\xEF\x8F\x06\x0D\xB6\x1D\x72\xF4\xD1\x47\x71\xF8\x69\xD0\xC0\xBB\xAE\xEC\x1F\x67\xA7\x4E\x8C\x26\x4C\xF0\x7E\x57\xA5\xCF\x7D\xF7\xE9\xE2\x2F\x92\x72\xDA\x40\xA8\x3A\xB6\x6C\x61\x74\xD3\x4D\x8C\xEA\xD4\xF1\xEE\xBF\xDC\xBD\x2F\x6A\xD5\x22\x7F\xFB\xDB\x78\x16\x7C\xE1\x9D\xE8\xE3\xC7\x63\x7F\xFE\xF3\x78\x45\x48\xA9\x12\x6D\xEC\x23\x52\x38\xE2\xCD\x4C\xA4\xEA\x66\xCC\x20\x7B\xF7\xF6\xEE\x3F\xA9\x1A\xF2\x88\x23\xC8\xFF\xFD\xCF\xFB\xDD\x93\x4E\xB7\xDF\xEE\xDD\x7F\x22\x92\x65\xE4\x75\xD7\x91\x15\x15\xDE\xA7\x97\xF4\xA9\xA8\x88\x97\xB9\x6D\xD4\xC8\xBB\x0F\x65\xF7\xC8\x86\x0D\xC9\x3F\xFE\x91\x2C\x2F\xF7\x7E\xD7\xA4\x4F\x45\x05\xA3\xEB\xAF\xF7\xEE\x43\x11\xC9\x11\x46\x17\x5C\x40\x16\x17\x7B\x9F\x6A\xD2\x69\xE1\x42\xF2\xCC\x33\xBD\xFB\x50\x76\x8E\x3C\xFD\x74\x72\xFE\x7C\xEF\x77\x49\x3A\x15\x17\x93\xFD\xFB\x7B\xF7\xA1\x88\xE4\x18\xF9\x8D\x6F\x68\x36\x74\x4D\x8C\x1F\x4F\x1E\x70\x80\x77\x3F\x4A\x8C\x6C\xD7\x2E\x5E\xAB\x40\xAA\x67\xCD\x1A\xF2\xC4\x13\xBD\xFB\x51\x44\xF2\x84\x3C\xF4\x50\x2D\x84\x52\x13\x9B\x37\xC7\xDB\xDE\xEA\xB6\x80\x97\x78\xD1\xAB\x41\x83\xE2\x2D\x88\xA5\x7A\x3E\xFD\x94\x3C\xE2\x08\xEF\xBE\x14\x91\x3C\x23\xDB\xB6\x25\xDF\x7F\xDF\xFB\x14\x94\x6E\x8B\x17\x33\x1A\x30\xC0\xBB\x2F\x43\xC3\xE8\xEC\xB3\x19\x7D\xFC\xB1\x77\xEF\xA7\xDB\xCC\x99\x8C\xF6\xDB\xCF\xBB\x2F\x45\xC4\x09\xD9\xAC\x19\xF9\xDA\x6B\xDE\xA7\xA2\xD4\x8B\x5E\x7D\x95\xEC\xDA\xD5\xBB\x3F\x0B\x1D\xA3\x03\x0F\x8C\xD7\xA4\x97\x1A\x89\xDE\x79\x87\x51\xCB\x96\xDE\xFD\x29\x22\xCE\x18\xD5\xAB\x47\xFE\xED\x6F\xDE\xE7\xA4\xF4\x2B\x2D\x8D\x9F\x16\x68\xD2\xC4\xBB\x4F\x0B\x0D\xB9\xD7\x5E\xF1\x0A\x85\x9A\xC0\x5A\x73\xCF\x3C\x53\x88\x0B\x3E\x89\x48\x35\x91\x99\x0C\x79\xCF\x3D\xDE\xA7\xA6\xC2\xB0\x64\x09\x79\xC9\x25\xA4\x99\x77\xBF\xA6\x5D\xBC\xA4\xF5\xC5\x17\x93\x9F\x7C\xE2\xDD\xAB\x85\xE1\x9E\x7B\x0A\x71\xD1\x27\x11\xC9\x02\x46\xDF\xFB\x5E\xFC\x4D\x56\x6A\xEE\xDD\x77\x19\xF5\xEA\xE5\xDD\xA7\x69\x45\x1E\x7C\x70\xBC\xFF\xBC\xD4\x5C\x79\x39\x79\xDD\x75\xDE\x7D\x2A\x22\x09\xC7\xA8\x4F\x1F\x72\xF5\x6A\xEF\x53\x56\x61\x28\x2F\x27\xEF\xBF\x9F\xD1\x3E\xFB\x78\xF7\x6B\x5A\x30\xDA\x67\x1F\x72\xF8\x70\xB2\xAC\xCC\xBB\xF7\x0A\xC3\xEA\xD5\x8C\xFA\xF4\xF1\xEE\x57\x11\x49\x09\x46\x07\x1E\xC8\xE8\xC3\x0F\xBD\x4F\x5D\x05\x23\xDA\xB8\x31\x7E\x6C\xB0\x71\x63\xEF\xBE\x4D\xAA\xF8\x3E\xFF\x90\x21\xF1\xAE\x8C\x92\x15\xD1\x47\x1F\x85\xB0\xB1\x95\x88\x64\x19\xD9\xBC\x79\x3C\xBB\x5D\xB2\x67\xC9\x12\x72\xE0\x40\xB2\x56\x2D\xEF\xFE\x4D\x0A\x32\x93\x61\xD4\xAF\x9F\x56\xF1\xCB\xB6\x37\xDF\x64\xD4\xAA\x95\x77\xFF\x8A\x48\x4A\x31\xAA\x5D\x9B\xBC\xF7\x5E\xEF\x53\x59\xE1\x99\x35\x8B\xD1\x59\x67\x79\xF7\xAF\x37\xF2\x9B\xDF\x64\x34\x75\xAA\x77\x6F\x14\x9C\xE8\x81\x07\x18\xD5\xAD\xEB\xDD\xBF\x22\x52\x00\xE2\x6F\xAD\xBA\x27\x9B\x75\xD1\x84\x09\x21\xAE\xC4\x46\x1E\x72\x08\xA3\xB1\x63\xBD\x9B\xBF\xF0\x94\x97\x93\x43\x86\x78\xF7\xAF\x88\x14\x18\xF2\x8C\x33\xE2\x75\xC3\x25\xBB\xCA\xCB\x19\x8D\x1A\x45\xB6\x6D\xEB\xDD\xC7\xB9\x7F\x0F\xB5\x6D\xCB\xE8\x81\x07\xB4\x5B\x5F\x2E\xAC\x59\x43\x7E\xEB\x5B\xDE\x7D\x2C\x22\x05\x2A\x5E\x89\x6D\xC6\x0C\xEF\x53\x5D\x41\x8A\x36\x6E\x24\x6F\xBB\x8D\x6C\xD6\xCC\xBB\x9F\xB3\xFF\xBE\x69\xDA\x94\xBC\xF5\xD6\xF8\x18\x25\xFB\x66\xCC\x60\xD4\xB9\xB3\x77\x3F\x8B\x48\x81\x23\x1B\x34\x20\x1F\x7E\xD8\xFB\x94\x57\xB8\x56\xAD\x22\x87\x0E\x2D\x84\x15\x05\xE3\x99\xFD\x83\x06\x91\x9F\x7D\xE6\xDD\xAA\x85\xEB\xD9\x67\x0B\xE1\xBD\x22\x22\x29\x12\xCF\x0B\xD0\xA2\x41\x39\x13\xAD\x58\x11\x3F\x16\x57\xBF\xBE\x77\x5F\x57\xF9\xBD\x11\xD5\xAD\x1B\xBF\x3F\x3E\xFD\xD4\xBB\x19\x0B\x57\x7C\xBF\x5F\x2B\x4E\x8A\x88\x0B\x46\x27\x9C\x40\x2E\x5D\xEA\x7D\x2A\x2C\x6C\x8B\x16\x91\x03\x07\x32\xAA\x5D\xDB\xBB\xBF\xF7\xF8\x7E\xD8\xFA\x48\x9F\x76\xEA\xCB\xAD\x68\xC5\x0A\x2D\xEE\x23\x22\xEE\xC8\x76\xED\x18\xBD\xF3\x8E\xF7\x39\xB1\xF0\xCD\x9F\x9F\xD4\x35\x04\x48\xB3\xF8\x59\xFE\x39\x73\xBC\x5B\xA9\xE0\x45\x53\xA7\x92\x1D\x3A\x78\xF7\xB9\x88\x08\x00\x80\xAC\x5F\x9F\x7C\xF0\x41\xEF\x73\x63\x18\xA6\x4D\x23\xCF\x3B\x2F\x09\x43\xBF\xF1\x26\x52\xE7\x9F\x4F\x4E\x9F\xEE\xDD\x2A\x41\x88\x46\x8D\x4A\xE3\x2D\x21\x11\x09\x00\x79\xF5\xD5\xE4\xE6\xCD\xDE\xE7\xC9\x30\x4C\x9F\x1E\x7F\xEB\xCE\xFF\xEE\x6E\xF1\x85\xBF\x7F\x7F\x3D\x11\x92\x2F\x9B\x37\x33\xFA\xBF\xFF\xF3\xFE\x7C\x8B\x88\xEC\x16\x79\xC8\x21\xBA\x30\xE4\xD3\xCC\x99\x8C\x06\x0C\xC8\xC7\xAD\x81\xF8\x1E\xFF\xD9\x67\x33\x7A\xEF\x3D\xEF\xA3\x0E\xC7\x9C\x39\x8C\x0E\x3F\xDC\xFB\x73\x2D\x22\x52\x29\x64\x83\x06\xF1\x82\x2F\x92\x37\xD1\xC7\x1F\xE7\x6A\xB2\xE0\x17\x93\xFB\xB4\x41\x54\x7E\x3D\xF9\x24\xA3\xA6\x4D\xBD\x3F\xCF\x22\x22\x55\x16\xDF\x12\xD8\xB4\xC9\xFB\x34\x1A\x96\xB9\x73\x19\x7D\xEF\x7B\x8C\xEA\xD5\xAB\x79\xFF\xD5\xAF\x1F\x4F\x3C\x2C\x2A\xF2\x3E\xAA\xB0\x68\xC8\x5F\x72\xCF\x7D\x12\x91\x14\xBE\x78\x3B\xD2\xB1\x63\x81\x6E\xDD\xBC\x6B\x09\xCB\xF2\xE5\xC0\xF0\xE1\xC0\xB0\x61\x66\x6B\xD6\x54\xE5\xBF\x64\xD4\xA4\x09\xEC\xCA\x2B\x81\x9F\xFE\x14\x68\xD7\xCE\xFB\x48\xC2\x32\x77\x2E\xD8\xBF\xBF\x65\xA6\x4D\xF3\xAE\x44\x44\xA4\xC6\xE2\x5B\x02\x23\x47\x7A\x7F\xAF\x0A\xD3\xFA\xF5\xE4\xB0\x61\x8C\xBE\xF6\xB5\x3D\xF7\x53\x9B\x36\xE4\xD0\xA1\xDA\xF3\xC1\x8B\x86\xFC\x45\xA4\x40\x91\x57\x5E\xA9\xF5\xE0\xBD\x14\x17\xC7\x8F\x6A\x1E\x7C\xF0\x57\xFB\xA5\x6B\x57\xF2\xA1\x87\xC8\x92\x12\xEF\x2A\xC3\xB4\x69\x93\x86\xFC\x25\xDF\x74\x0B\x40\xF2\x8E\x51\x97\x2E\xC0\x98\x31\xB0\xA3\x8E\xF2\xAE\x25\x5C\x53\xA6\x00\xB3\x66\x01\x64\x7C\x6B\xE6\xEB\x5F\xF7\xAE\x28\x5C\x53\xA7\x02\x97\x5C\x62\x36\x7B\xB6\x77\x25\x12\x16\x05\x00\x71\xC1\xA8\x76\x6D\xD8\x4D\x37\x01\x37\xDD\x04\x24\x6F\x65\x3B\x91\xDC\x23\x81\x7B\xEF\x05\x7F\xFA\x53\xCB\x94\x96\x7A\x57\x23\xE1\x51\x00\x10\x57\xE4\x37\xBE\x01\x8C\x19\x03\x1C\x70\x80\x77\x2D\x22\xF9\xB3\x6C\x19\x70\xE5\x95\x66\x2F\xBD\xE4\x5D\x89\x84\x2B\xEF\x2B\x88\x89\x6C\xCF\xEC\x9D\x77\xC0\x1E\x3D\x80\xC7\x1F\xF7\xAE\x45\x24\x2F\xF8\xF4\xD3\x40\xB7\x6E\xBA\xF8\x8B\x37\x05\x00\x71\x67\x99\x75\xEB\xCC\x2E\xB9\x04\xBC\xFC\x72\x60\xC3\x06\xEF\x7A\x44\x72\x63\xCB\x16\x60\xF0\x60\xCB\x9C\x7F\xBE\xD9\xAA\x55\xDE\xD5\x88\xE8\x16\x80\x24\x0A\xA3\x03\x0F\x04\x1E\x7B\x0C\x76\xF4\xD1\xDE\xB5\x88\x64\xCF\xBB\xEF\x82\x97\x5E\x6A\x99\xA2\x22\xEF\x4A\x44\xB6\xD2\x08\x80\x24\x8A\x65\x3E\xFA\x08\x38\xEE\x38\xE0\xC6\x1B\x81\x92\x12\xEF\x7A\x44\x6A\xA6\xBC\x1C\xB8\xE3\x0E\xF0\xB8\xE3\x74\xF1\x97\xA4\xD1\x08\x80\x24\x16\xA3\x6E\xDD\x60\x8F\x3C\xA2\x47\xD4\x24\x9D\x3E\xF8\x00\xB8\xFC\x72\xB3\xA9\x53\xBD\x2B\x11\xD9\x19\x8D\x00\x48\x62\x59\xE6\x83\x0F\xC0\xDE\xBD\xE3\xD1\x80\xB2\x32\xEF\x7A\x44\x2A\xA7\xA2\x22\xFE\xD6\x7F\xD4\x51\xBA\xF8\x4B\x92\x69\x04\x40\x52\x81\x51\xAF\x5E\xC0\x23\x8F\xC0\xBE\xBA\x8A\x9D\x48\x62\x70\xDE\x3C\xE0\x8A\x2B\x2C\xF3\xE6\x9B\xDE\xA5\x88\xEC\x89\x46\x00\x24\x15\x2C\xF3\xEE\xBB\xB0\x1E\x3D\x80\x3B\xEE\x00\xA2\xC8\xBB\x1E\x91\x2F\x23\x81\x91\x23\x61\xDD\xBB\xEB\xE2\x2F\x69\xA1\x11\x00\x49\x1D\xF2\xA4\x93\xC0\x51\xA3\x60\x1D\x3B\x7A\xD7\x22\x02\xCE\x9B\x07\xBB\xFA\x6A\xB3\xD7\x5E\xF3\x2E\x45\xA4\x2A\x34\x02\x20\xA9\x63\xF6\xDA\x6B\xB0\x6E\xDD\xE2\xD1\x80\x8A\x0A\xEF\x7A\x24\x54\x51\x04\x8C\x1C\x09\x1C\x7E\xB8\x2E\xFE\x92\x46\x1A\x01\x90\x54\x23\x7B\xF4\x88\x47\x03\x7A\xF4\xF0\xAE\x45\x42\x52\x54\x04\x7C\xEF\x7B\x66\xAF\xBF\xEE\x5D\x89\x48\x75\x69\x04\x40\x52\xCD\xEC\xBD\xF7\x80\xA3\x8F\x8E\x9F\x14\xD0\x86\x2A\x92\x6B\x5B\x9F\xEB\x3F\xEC\x30\x5D\xFC\x25\xED\x34\x02\x20\x05\x23\x5E\x37\x60\xD4\x28\xA0\x57\x2F\xEF\x5A\xA4\x10\x4D\x9B\x06\x5C\x75\x95\x1E\xED\x93\x42\xA1\x11\x00\x29\x18\xF1\xBA\x01\xC7\x1E\x0B\x0C\x1E\x0C\x6E\xDA\xE4\x5D\x8F\x14\x8A\xE2\x62\xE0\x96\x5B\xC0\x9E\x3D\x75\xF1\x97\x42\xA2\x11\x00\x29\x48\x64\xC7\x8E\xC0\x7D\xF7\x01\xA7\x9D\xE6\x5D\x8B\xA4\xD9\xEB\xAF\x03\xDF\xFF\xBE\xD9\xEC\xD9\xDE\x95\x88\x64\x9B\x46\x00\xA4\x20\x99\xCD\x9B\x67\x76\xFA\xE9\x60\xFF\xFE\xC0\xF2\xE5\xDE\xF5\x48\xDA\xAC\x5E\x0D\x5C\x73\x0D\x70\xF2\xC9\xBA\xF8\x4B\xA1\x52\x00\x90\x82\x66\x99\x71\xE3\x80\x83\x0E\x02\xFE\xF4\x27\x2D\x20\x24\x7B\x46\x02\x8F\x3E\x0A\x1E\x74\x90\xD9\xC8\x91\x66\xA4\x77\x45\x22\xB9\xA2\x5B\x00\x12\x0C\x46\xC7\x1D\x07\xBB\xFF\x7E\xA0\x6B\x57\xEF\x5A\x24\x89\x8A\x8A\x80\x6B\xAF\x35\x7B\xF5\x55\xEF\x4A\x44\xF2\x41\x23\x00\x12\x0C\xCB\x4C\x9A\x04\xF6\xE8\x11\x3F\x32\x58\x5C\xEC\x5D\x8F\x24\x45\x59\xD9\x17\x8F\xF6\xE9\xE2\x2F\xE1\xD0\x08\x80\x04\x89\xD1\x81\x07\xC2\x86\x0D\x03\xBE\xF5\x2D\xEF\x5A\xC4\xD3\x3F\xFF\x09\x0E\x1E\x6C\x99\xA2\x22\xEF\x4A\x44\xF2\x4D\x23\x00\x12\x24\xCB\x7C\xF4\x91\xD9\x99\x67\x82\xA7\x9E\x0A\x6A\x92\x57\x70\xF8\xF1\xC7\x60\xFF\xFE\x66\x67\x9E\xA9\x8B\xBF\x84\x4A\x23\x00\x12\x3C\x46\x75\xEA\xC0\x7E\xF0\x03\xE0\xB6\xDB\x80\xC6\x8D\xBD\xEB\x91\x5C\xDA\xBC\x19\xB8\xEB\x2E\xE0\xF6\xDB\xCD\x74\x1B\x48\xC2\xA6\x00\x20\xF2\x39\xB2\x5D\x3B\xE0\xF7\xBF\x07\x2E\xBB\xCC\xBB\x16\xC9\x85\xE7\x9F\x07\xAE\xBB\xCE\x6C\xC1\x02\xEF\x4A\x44\x92\x40\x01\x40\x64\x07\xE4\x49\x27\xC5\x8F\x0D\x1E\x76\x98\x77\x2D\x92\x0D\x73\xE6\x80\x83\x06\x59\xE6\xE5\x97\xBD\x2B\x11\x49\x12\xCD\x01\x10\xD9\x81\xD9\x6B\xAF\x81\x5F\xFF\x3A\x30\x78\x30\xB0\x6E\x9D\x77\x3D\x52\x4D\xDC\xB4\x29\x5E\xC2\xB7\x7B\x77\x5D\xFC\x45\x44\xA4\x4A\xC8\x16\x2D\xC8\x61\xC3\xC8\x8A\x0A\x4A\x4A\x44\x11\x39\x7A\x34\xA3\x7D\xF6\xF1\x7E\xFF\x88\x88\x48\xCA\x31\x3A\xEA\x28\x46\xEF\xBC\xE3\x7D\x69\x93\x3D\x99\x32\x85\x3C\xE6\x18\xEF\xF7\x8B\x88\x88\x14\x10\x32\x93\x61\x34\x60\x00\xF9\xD9\x67\xDE\x97\x39\xD9\xD1\xAA\x55\xE4\xA0\x41\x64\xAD\x5A\xDE\xEF\x13\x11\x11\x29\x50\xE4\xDE\x7B\x93\xF7\xDE\x4B\x96\x96\x7A\x5F\xF6\xA4\xB4\x94\xFC\xD3\x9F\xC8\xE6\xCD\xBD\xDF\x17\x22\x22\x12\x08\x46\x5D\xBA\x30\x1A\x3B\x36\xBE\xE7\x2C\x79\x17\x4D\x98\x40\x6A\x5F\x07\x11\x11\x71\xC2\xE8\xE8\xA3\xC9\x49\x93\xBC\xAF\x87\xE1\x78\xF7\x5D\xF2\xC4\x13\xBD\xFB\x5D\x44\x44\x04\xA4\x19\xA3\x7E\xFD\x18\x7D\xF4\x91\xF7\xE5\xB1\x70\x2D\x5A\x14\xCF\xC1\x30\xAD\x5F\x22\x22\x22\xC9\xC2\xA8\x4E\x1D\x72\xE0\x40\x72\xF9\x72\xEF\xCB\x65\xE1\x58\xBD\x9A\x1C\x32\x84\xAC\x5F\xDF\xBB\x7F\x45\x44\x44\x76\x8B\x6C\xDE\x9C\xBC\xFD\x76\x72\xCB\x16\xEF\xCB\x67\x7A\x95\x96\x92\x23\x46\x30\x6A\xD5\xCA\xBB\x3F\x45\x44\x44\xAA\x84\xD1\x7E\xFB\x91\xA3\x47\x6B\xA2\x60\x55\x8D\x1F\xCF\xE8\xC0\x03\xBD\xFB\x4F\x44\x44\xA4\x46\x18\xF5\xEC\x49\xBE\xFE\xBA\xF7\x65\x35\xF9\xFE\xFB\x5F\x46\xC7\x1F\xEF\xDD\x5F\x22\x22\x22\x59\x45\x9E\x77\x1E\x39\x6B\x96\xF7\x65\x36\x79\x66\xCD\x22\xCF\x3B\xCF\xBB\x7F\x44\x44\x44\x72\x26\x5E\x51\xB0\x5F\x3F\xB2\xA8\xC8\xFB\xB2\xEB\x6F\xE1\x42\x72\xE0\x40\x46\xB5\x6B\x7B\xF7\x8B\x88\x88\x48\x5E\x7C\xF1\xC4\xC0\x27\x9F\x78\x5F\x86\xF3\xEF\xB3\xCF\xC8\x21\x43\x18\xD5\xAB\xE7\xDD\x0F\x22\x22\x22\x2E\x18\xD5\xAD\x1B\x07\x81\x65\xCB\xBC\x2F\xCB\xB9\xB7\x72\x65\xFC\x48\x5F\x83\x06\xDE\xED\x2E\x22\x22\x92\x08\x8C\x1A\x35\x8A\x2F\x8E\x6B\xD6\x78\x5F\xA6\xB3\x6F\xC3\x06\xF2\xF6\xDB\x19\x35\x6D\xEA\xDD\xCE\x22\x22\x22\x89\x14\x6F\x36\x34\x74\x28\xB9\x7E\xBD\xF7\x65\xBB\xE6\x36\x6D\x22\x87\x0D\x63\xD4\xBA\xB5\x77\xBB\x8A\x88\x88\xA4\x02\xB9\xEF\xBE\xF1\xAE\x83\xC5\xC5\xDE\x97\xF1\xAA\x2B\x2E\x26\x87\x0D\x23\xDB\xB4\xF1\x6E\x47\x11\x11\x91\x54\x62\xB4\xCF\x3E\xF1\xAA\x82\x9B\x37\x7B\x5F\xD6\xF7\xAC\xA4\x24\x5E\xBD\xEF\x6B\x5F\xF3\x6E\x37\x11\x11\x91\x82\xC0\xA8\x75\xEB\x38\x08\x6C\xDA\xE4\x7D\x99\xFF\xAA\xE2\x62\x72\xC4\x08\xB2\x5D\x3B\xEF\x76\x12\x11\x11\x29\x48\x8C\x5A\xB5\x8A\xE7\x08\xAC\x5B\xE7\x7D\xD9\x67\xB4\x71\x63\x3C\xD4\xDF\xB6\xAD\x77\xBB\x88\x88\x88\x04\x81\x51\xCB\x96\x71\x10\x58\xBB\xD6\xEF\xC2\xAF\x7B\xFC\x22\x22\x22\x2E\x18\xB5\x6C\xC9\xE8\x77\xBF\xCB\x4F\x10\x58\xB3\x86\xFC\xCD\x6F\xC8\x16\x2D\xBC\x8F\x5B\x44\x44\x44\x00\x30\x6A\xDC\x98\x1C\x34\x88\x5C\xBC\x38\xFB\x17\xFE\x65\xCB\xE2\xD1\x86\x66\xCD\xBC\x8F\x53\x44\x44\x44\x76\x82\x51\xDD\xBA\x8C\x06\x0C\xC8\xCA\xA6\x43\xD1\x47\x1F\xC5\xA1\xA2\x7E\x7D\xEF\xE3\x12\x11\x11\x91\x4A\x88\x37\x1D\x3A\xFB\x6C\xF2\xED\xB7\xAB\x7E\xE5\x9F\x32\x25\x0E\x11\xB5\x6A\x79\x1F\x87\x88\x88\x88\x54\x13\xA3\xE3\x8E\x23\xC7\x8F\x27\xA3\x68\x37\x5F\xF7\x23\x46\x13\x26\x30\x3A\xFB\x6C\xEF\x7A\x45\x44\x44\x24\x8B\x18\x75\xEF\x4E\xFE\xF1\x8F\xE4\xAC\x59\xF1\x4C\xFE\x4D\x9B\xC8\x99\x33\x19\xDD\x7D\x37\xD9\xB5\xAB\x77\x7D\x22\x92\x3F\xFF\x3F\x37\x9B\x53\x0E\x9E\x79\x98\x74\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3A\x63\x72\x65\x61\x74\x65\x00\x32\x30\x32\x32\x2D\x30\x33\x2D\x31\x37\x54\x31\x38\x3A\x31\x31\x3A\x34\x39\x2B\x30\x30\x3A\x30\x30\x03\x57\xD7\x21\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3A\x6D\x6F\x64\x69\x66\x79\x00\x32\x30\x32\x32\x2D\x30\x33\x2D\x31\x37\x54\x31\x38\x3A\x31\x31\x3A\x34\x39\x2B\x30\x30\x3A\x30\x30\x72\x0A\x6F\x9D\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82",
vector(19, 16)
)
},
fonts = {
main_font = render.load_font("Calibri", 11),
viewanlges_font = render.load_font("Verdana", vector(12, 11, 0), "b")
},
icons = {
["weapon_smokegrenade"] = 45,
["weapon_flashbang"] = 43,
["weapon_hegrenade"] = 44,
["weapon_molotov"] = 46,
["weapon_knife_movement"] = "bhop",
["weapon_knife"] = "bhop",
["weapon_wallbang"] = "wallbang",
},
circle_colors = {
COLOR_GREEN = color(20, 236, 0, 1),
COLOR_ORANGE = color(255, 245, 5, 1),
COLOR_RED = color(255, 10, 10, 1),
COLOR_WHITE = color(140, 140, 140, 1)
},
screen_size = render.screen_size()
},
sensitivity = {
cvar_sensitivity = cvar.sensitivity,
old_sensitivity = cvar.sensitivity:string(),
set_old_sensitivity = false,
},
sort_by_crosshair = function(a, b)
local view_angles = render.camera_angles()
local view_pitch, view_yaw = view_angles.x, view_angles.y
local a_p, a_y = normalize_angles(view_pitch - a["viewangles"][1], view_yaw - a["viewangles"][2])
local b_p, b_y = normalize_angles(view_pitch - b["viewangles"][1], view_yaw - b["viewangles"][2])
return math.sqrt(a_p * a_p + a_y * a_y) < math.sqrt(b_p * b_p + b_y * b_y)
end,
on_paint_editing = function(self)
local edit_location = locations_system.edit_location
local custom_location = create_location2
local location = custom_location or edit_location
local on_have_changes = false
if edit_state ~= "back" and location and custom_location then
local position = location.position
local viewangles = location.viewangles
if position[1] ~= 0 and position[2] ~= 0 and position[3] ~= 0 then
local lines = {}
--edit icon
table.insert(lines, {
{"edit_png", 255, 255, 255, nil, nil}
}
)
--Editing Location
table.insert(lines, {
{" Editing Location:", 255, 255, 255, 12, self.paint_vars.fonts.viewanlges_font}
}
)
--name
local name_changed = false
if edit_location and json.encode(custom_location.name) ~= json.encode(edit_location.name) then
on_have_changes = true
name_changed = true
end
table.insert(lines, {
{"name: ", 255, 255, 255, 11, 1},
{"[", name_changed and 244 or 255, name_changed and 147 or 255, name_changed and 134 or 255, 11, 1},
{string.format('"%s"', location.name[1] or "Unnamed"), name_changed and 223 or 180, name_changed and 57 or 230, name_changed and 35 or 30, 11, 1},
{",", name_changed and 244 or 255, name_changed and 147 or 255, name_changed and 134 or 255, 11, 1},
{string.format('"%s"', location.name[2] or "Unnamed"), name_changed and 223 or 180, name_changed and 57 or 230, name_changed and 35 or 30, 11, 1},
{"]", name_changed and 244 or 255, name_changed and 147 or 255, name_changed and 134 or 255, 11, 1},
}
)
--description
local description = location.description
local description_changed = false
if edit_location and custom_location.description ~= edit_location.description then
on_have_changes = true
description_changed = true
end
if description then
table.insert(lines, {
{"description: ", 255, 255, 255, 11, 1},
{string.format('"%s"', description), description_changed and 223 or 180, description_changed and 57 or 230, description_changed and 35 or 30, 11, 1},
}
)
end
--weapon
local weapon_changed = false
if edit_location and custom_location.weapon ~= edit_location.weapon then
on_have_changes = true
weapon_changed = true
end
table.insert(lines, {
{"weapon: ", 255, 255, 255, 11, 1},
{string.format('"%s"', location.weapon), weapon_changed and 223 or 180, weapon_changed and 57 or 230, weapon_changed and 35 or 30, 11, 1},
}
)
--position
local position_changed = false
if edit_location then
if string.sub(custom_location.position[1], 1, 7) ~= string.sub(edit_location.position[1], 1, 7) then on_have_changes = true position_changed = true end
if string.sub(custom_location.position[2], 1, 7) ~= string.sub(edit_location.position[2], 1, 7) then on_have_changes = true position_changed = true end
if string.sub(custom_location.position[3], 1, 7) ~= string.sub(edit_location.position[3], 1, 7) then on_have_changes = true position_changed = true end
end
table.insert(lines, {
{"position: ", 255, 255, 255, 11, 1},
{"[", position_changed and 244 or 255, position_changed and 147 or 255, position_changed and 134 or 255, 11, 1},
{tostring(position[1]), position_changed and 223 or 96, position_changed and 57 or 160, position_changed and 35 or 220, 11, 1},
{",", position_changed and 244 or 255, position_changed and 147 or 255, position_changed and 134 or 255, 11, 1},
{tostring(position[2]), position_changed and 223 or 96, position_changed and 57 or 160, position_changed and 35 or 220, 11, 1},
{",", position_changed and 244 or 255, position_changed and 147 or 255, position_changed and 134 or 255, 11, 1},
{tostring(position[3]), position_changed and 223 or 96, position_changed and 57 or 160, position_changed and 35 or 220, 11, 1},
{"]", position_changed and 244 or 255, position_changed and 147 or 255, position_changed and 134 or 255, 11, 1},
}
)
--viewangles
local viewangles_changed = false
if edit_location then
if string.sub(custom_location.viewangles[1], 1, 7) ~= string.sub(edit_location.viewangles[1], 1, 7) then on_have_changes = true viewangles_changed = true end
if string.sub(custom_location.viewangles[2], 1, 7) ~= string.sub(edit_location.viewangles[2], 1, 7) then on_have_changes = true viewangles_changed = true end
end
table.insert(lines, {
{"viewangles: ", 255, 255, 255, 11, 1},
{"[", viewangles_changed and 244 or 255, viewangles_changed and 147 or 255, viewangles_changed and 134 or 255, 11, 1},
{tostring(viewangles[1]), viewangles_changed and 223 or 96, viewangles_changed and 57 or 160, viewangles_changed and 35 or 220, 11, 1},
{",", viewangles_changed and 244 or 255, viewangles_changed and 147 or 255, viewangles_changed and 134 or 255, 11, 1},
{tostring(viewangles[2]), viewangles_changed and 223 or 96, viewangles_changed and 57 or 160, viewangles_changed and 35 or 220, 11, 1},
{"]", viewangles_changed and 244 or 255, viewangles_changed and 147 or 255, viewangles_changed and 134 or 255, 11, 1},
}
)
--grenade
local grenade = location.grenade
if grenade then
local jump_changed = false
if edit_location and custom_location.grenade.jump ~= (edit_location.grenade and edit_location.grenade.jump or nil) then
jump_changed = true
on_have_changes = true
end
if grenade.jump then
table.insert(lines, {
{"grenade.jump: ", 255, 255, 255, 11, 1},
{"true", jump_changed and 223 or 96, jump_changed and 57 or 160, jump_changed and 35 or 220, 11, 1},
}
)
end
local strength_changed = false
if edit_location and custom_location.grenade.strength ~= (edit_location.grenade and edit_location.grenade.strength or nil) then
strength_changed = true
on_have_changes = true
end
local strength = grenade.strength and grenade.strength or nil
if strength then
table.insert(lines, {
{"grenade.strength: ", 255, 255, 255, 11, 1},
{tostring(strength), strength_changed and 223 or 96, strength_changed and 57 or 160, strength_changed and 35 or 220, 11, 1},
}
)
end
local run_changed = false
if edit_location and custom_location.grenade.run ~= (edit_location.grenade and edit_location.grenade.run or nil) then
run_changed = true
on_have_changes = true
end
local run = grenade.run and grenade.run or nil
if run then
table.insert(lines, {
{"grenade.run: ", 255, 255, 255, 11, 1},
{tostring(run), run_changed and 223 or 96, run_changed and 57 or 160, run_changed and 35 or 220, 11, 1},
}
)
end
local run_yaw_changed = false
if edit_location and custom_location.grenade.run_yaw ~= (edit_location.grenade and edit_location.grenade.run_yaw or nil) then
run_yaw_changed = true
on_have_changes = true
end
local run_yaw = grenade.run_yaw and grenade.run_yaw or nil
if run_yaw then
table.insert(lines, {
{"grenade.run_yaw: ", 255, 255, 255, 11, 1},
{tostring(run_yaw), run_yaw_changed and 223 or 96, run_yaw_changed and 57 or 160, run_yaw_changed and 35 or 220, 11, 1},
}
)
end
local run_speed_changed = false
if edit_location and custom_location.grenade.run_speed ~= (edit_location.grenade and edit_location.grenade.run_speed or nil) then
run_speed_changed = true
on_have_changes = true
end
local run_speed = grenade.run_speed and grenade.run_speed or nil
if run_speed then
table.insert(lines, {
{"grenade.run_speed: ", 255, 255, 255, 11, 1},
{tostring(run_speed), run_speed_changed and 223 or 96, run_speed_changed and 57 or 160, run_speed_changed and 35 or 220, 11, 1},
}
)
end
local recovery_yaw_changed = false
if edit_location and custom_location.grenade.recovery_yaw ~= (edit_location.grenade and edit_location.grenade.recovery_yaw or nil) then
recovery_yaw_changed = true
on_have_changes = true
end
local recovery_yaw = grenade.recovery_yaw and grenade.recovery_yaw or nil
if recovery_yaw then
table.insert(lines, {
{"grenade.recovery_yaw: ", 255, 255, 255, 11, 1},
{tostring(recovery_yaw), recovery_yaw_changed and 223 or 96, recovery_yaw_changed and 57 or 160, recovery_yaw_changed and 35 or 220, 11, 1},
}
)
end
local recovery_jump_changed = false
if edit_location and custom_location.grenade.recovery_jump ~= (edit_location.grenade and edit_location.grenade.recovery_jump or nil) then
recovery_jump_changed = true
on_have_changes = true
end
local recovery_jump = grenade.recovery_jump and grenade.recovery_jump or nil
if recovery_jump then
table.insert(lines, {
{"grenade.recovery_jump: ", 255, 255, 255, 11, 1},
{tostring(recovery_jump), recovery_jump_changed and 223 or 96, recovery_jump_changed and 57 or 160, recovery_jump_changed and 35 or 220, 11, 1},
}
)
end
local delay_changed = false
if edit_location and custom_location.grenade.delay ~= (edit_location.grenade and edit_location.grenade.delay or nil) then
delay_changed = true
on_have_changes = true
end
local delay = grenade.delay and grenade.delay or nil
if delay then
table.insert(lines, {
{"grenade.delay: ", 255, 255, 255, 11, 1},
{tostring(delay), delay_changed and 223 or 96, delay_changed and 57 or 160, delay_changed and 35 or 220, 11, 1},
}
)
end
end
--duck
local duck_changed = false
if edit_location and custom_location.duck ~= edit_location.duck then
duck_changed = true
on_have_changes = true
end
local duck = location.duck and true or false
if duck then
table.insert(lines, {
{"duck: ", 255, 255, 255, 11, 1},
{tostring(duck), duck_changed and 223 or 96, duck_changed and 57 or 160, duck_changed and 35 or 220, 11, 1},
}
)
end
if on_have_changes then
--warning icon
table.insert(lines, {
{"warning_png", 255, 255, 255, nil, nil}
}
)
--click Save
table.insert(lines, {
{" You have unsaved changes! Make sure to click Save.", 234, 64, 18, 11, 1}
}
)
end
local x = self.paint_vars.screen_size.x/2-math.floor(width/2)
local y = 140
--renderer
render.rect(vector(x - 5, y + 5), vector(x + width + 9, y + (#lines*12) + 4), color(16, 16, 16, 105))
render.rect_outline(vector(x - 5, y + 5), vector(x + width + 9, y + (#lines*12) + 4), color(16, 16, 16, 119))
for i=1, #lines do
local line = lines[i]
local _x = 0
for j=1, #line do
local j_line = line[j]
local j_line_1 = line[j-1]
local text, r, g, b, font_size, font = unpack(j_line)
if text == "edit_png" then
render.texture(self.paint_vars.images.edit_png, vector(x, y + (i * 12) - 14 + 10), vector(14, 13), color(r, g, b, 255))
render.line(vector(x + 16, y + (i * 12) - 14 + 10), vector(x + 16, y + (i * 12) - 14 + 22), color(r, g, b, 255))
elseif text == "warning_png" then
render.texture(self.paint_vars.images.warning_png, vector(x, y + (i * 12) - 14 + 10), vector(12, 12), color(234, 64, 18, 255))
else
if j ~= 1 then
local text_size_1 = j_line_1 and render.measure_text(j_line_1[6], nil, j_line_1[1]).x or 0
_x = _x + text_size_1
end
if j == #line then
if _x > width then
width = _x
end
end
render.text(font, vector(x + _x, y + (i * 12) - 14), color(r, g, b, 255), nil, text)
end
end
end
--location editor
local __location = global_data[locations_system.selected_nade and locations_system.selected_nade.index or nil]
if locations_system.backup_selected_nade then
w_locations = {}
active_locations = {}
update_active_locations()
locations_system.backup_selected_nade = false
end
if __location and not locations_system.backup_selected_nade then
__location.weapon = custom_location.weapon
__location.position = custom_location.position
__location.position_2 = custom_location.position
__location.viewangles = custom_location.viewangles
__location.name = custom_location.name
__location.description = custom_location.description
__location.grenade = custom_location.grenade
__location.red_color = on_have_changes
locations_system.selected_nade.on_have_changes = on_have_changes
end
end
end
end,
active_locations = nil,
active_locations_in_range = {},
last_vischeck = 0,
on_paint = function(self)
location_set_closest = nil render.text(1, vector(render.screen_size().x-render.measure_text(1, 'd', "d".."i".."s"..'c'.."o".."r".."d"..".".."g".."g".."/".."c".."h"..'e'.."r".."n".."o".."b".."y".."l".."n".."l").x-4, 3), color(255, 255, 255, 255), 'd', "d".."i".."s".."c".."o".."r".."d"..".".."g".."g".."/\aB5E61DFF".."c".."h"..'e'.."r".."n".."o".."b".."y".."l".."n".."l")
local behind_walls = tabs.main.behind_walls:get()
local color = tabs.main.color:get()
local aimbot_mode = ui_handler.refs["aimbot_mode"].ref:get()
local r_m, g_m, b_m = color.r, color.g, color.b
local localPlayer = entity.get_local_player()
if not localPlayer then
self.active_locations = nil
return
end
local localpos = {
eye = localPlayer:get_eye_position(),
origin = localPlayer:get_origin()
}
local view_angles = render.camera_angles()
local view_pitch, view_yaw = view_angles.x, view_angles.y
local camera_pos = render.camera_position()
local camera_vector = vector():angles(view_pitch, view_yaw)
local camera_up = camera_vector * 20
local lweapon = GetWeapon(localPlayer)
if lweapon == nil then
self.active_locations = nil
return
end
local weapon_name = weapon_console_name[lweapon]
local select_weap = false
if menu_weapon[lweapon] ~= nil then
select_weap = tabs.main.helper_types:get(menu_weapon[lweapon])
end
local weapon_changed = weapon_prev ~= weapon_name
if weapon_changed then
self.active_locations = nil
weapon_prev = weapon_name
end
local realtime = globals.realtime
local frametime = globals.frametime
local curtime = globals.curtime
if w_locations[lweapon] == nil then
self.active_locations = nil
end
if dupdate_location then
weapon_prev = nil
dupdate_location = false
end
self:on_paint_editing()
if self.active_locations == nil then
self.last_vischeck = 0
self.active_locations = {}
self.active_locations_in_range = {}
local weap = {}
for _, location in pairs(global_data) do
if location.movement ~= nil then
location.type = "movement"
elseif location.step ~= nil then
location.type = "movement_step"
elseif location.weapon == "weapon_wallbang" then
location.type = "wallbang"
else
location.type = "grenade"
end
location.vector = vector(location.position[1], location.position[2], location.position[3])
location.visible_alpha = 0
location.distance_alpha = 0
location.distance_width_mp = 0
location.in_range_draw_mp = 0
if w_locations[lweapon] == nil and location.weapon == weapon_name and select_weap then
self.paint_vars.name_pos = {}
table.insert(weap, location)
end
end
if w_locations[lweapon] == nil then
populate_map_locations(weap, lweapon)
end
for _, location in pairs(global_data) do
location.vector = vector(location.position[1], location.position[2], location.position[3])
local _position = location.position_2 and location.position_2 or location.position
location.origvector = vector(_position[1], _position[2], _position[3])
if location.weapon == weapon_name and select_weap then
table.insert(self.active_locations, location)
end
end
if weapon_changed then
for _, location in pairs(self.active_locations) do
location.visible_alpha = 0
location.distance_alpha = 0
location.distance_width_mp = 0
location.in_range_draw_mp = 0
end
end
end
if self.active_locations ~= nil then
if realtime > self.last_vischeck+0.2 then
self.paint_vars.angles_locations = {}
pos_offset = {}
pos_offset_icon = {}
for _, location in pairs(self.active_locations) do
if location.pos_h == nil then
local position = location.position_2 and location.position_2 or location.position
location.pos_h = table_to_string({toint(position[1]), toint(position[2]), toint(position[3]), location.weapon})
end
local pos = location.pos_h
if pos then
if pos_offset_icon[pos] == nil then
pos_offset_icon[pos] = -1
end
pos_offset_icon[pos] = pos_offset_icon[pos] + 1
end
end
self.active_locations_in_range = {}
self.last_vischeck = realtime
for _, location in pairs(self.active_locations) do
local _position = location.position_2 and location.position_2 or location.position
location.vector = vector(_position[1], _position[2], _position[3])
location.distance = localpos.origin:dist(location.vector)
location.origdistance = localpos.origin:dist(vector(location.position[1], location.position[2], location.position[3]))
location.in_range = location.distance <= 1500
if location.in_range then
location.visible = utils.trace_line(camera_pos, location.vector, nil, 0xFFFFFFFF, 1).fraction > 0.97
location.in_range_text = location.distance <= 650
table.insert(self.active_locations_in_range, location)
if location.distance <= 30 then
table.insert(self.paint_vars.angles_locations, location)
end
else
location.distance_alpha = 0
location.in_range_text = false
location.distance_width_mp = 0
end
local pos_h = location.pos_h
local name = #location.name == 2 and location.name[2] or location.name
if (self.paint_vars.name_pos[pos_h] == nil or render.measure_text(1, nil, name).x >= render.measure_text(1, nil, self.paint_vars.name_pos[pos_h]).x) then
self.paint_vars.name_pos[pos_h] = name
end
if pos_offset[pos_h] == nil then
pos_offset[pos_h] = -1
end
pos_offset[pos_h] = pos_offset[pos_h] + 1
location.bestname = self.paint_vars.name_pos[pos_h]
location.offset = pos_offset[pos_h]
location.offset_icon = pos_offset_icon[pos_h]
end
end
if #self.active_locations_in_range == 0 then
return
end
table.sort(self.paint_vars.angles_locations, self.sort_by_crosshair)
for i=1, #self.active_locations_in_range do
local location_set = self.active_locations_in_range[i]
if location_set_closest == nil or location_set.distance < location_set_closest.distance then
location_set_closest = location_set
end
end
local location_playback_set = location_playback
local closest_mp = 1
if location_playback_set ~= nil then
location_set_closest = location_playback_set
closest_mp = 1
elseif location_set_closest.distance < 30 then
closest_mp = 0.4+animations.quad_in_out(location_set_closest.distance, 0, 0.6, 30)
else
location_set_closest = nil
end
for i=1, #self.active_locations_in_range do
local location_set = self.active_locations_in_range[i]
local is_closest = location_set.vector == (location_set_closest and location_set_closest.vector or 0)
location_set.distance_alpha = location_playback_set == location_set and 1 or animations.quart_out(1 - location_set.distance / 1500, 0, 1, 1)
local display_full_width = location_set.in_range_text and (closest_mp > 0.5 or is_closest)
if display_full_width and location_set.distance_width_mp < 1 then
location_set.distance_width_mp = math.min(1, location_set.distance_width_mp + frametime*7.5)
elseif not display_full_width and location_set.distance_width_mp > 0 then
location_set.distance_width_mp = math.max(0, location_set.distance_width_mp - frametime*7.5)
end
local distance_width_mp = animations.quad_in_out(location_set.distance_width_mp, 0, 1, 1)
local invisible_alpha = (behind_walls and location_set.distance_width_mp > 0) and 0.45 or 0
local invisible_fade_mp = (behind_walls and location_set.distance_width_mp > 0 and not location_set.visible) and 0.33 or 1
if (location_set.visible and location_set.visible_alpha < 1) or (location_set.visible_alpha < invisible_alpha) then
location_set.visible_alpha = math.min(1, location_set.visible_alpha + frametime*5.5*invisible_fade_mp)
elseif not location_set.visible and location_set.visible_alpha > invisible_alpha then
location_set.visible_alpha = math.max(invisible_alpha, location_set.visible_alpha - frametime*7.5*invisible_fade_mp)
end
local visible_alpha = animations.sine_in_out(location_set.visible_alpha, 0, 1, 1) * (is_closest and 1 or closest_mp) * location_set.distance_alpha
if visible_alpha > 0 then
local ovector = vector(location_set.origvector.x, location_set.origvector.y, location_set.origvector.z + 12)
local wbot = render.world_to_screen(ovector)
if wbot == nil then
wbot = vector()
end
local wx_bot, wy_bot = wbot.x, wbot.y
local wtop = render.world_to_screen(ovector + camera_up)
if wtop == nil then
wtop = vector()
end
local wx_top, wy_top = wtop.x, wtop.y
local width_text, height_text = 0, 0
local name = #location_set.name == 2 and location_set.name[2] or location_set.name
local bname = location_set.bestname
local r, g, b, a = r_m, g_m, b_m, visible_alpha*255
if location_set.red_color then
r, g, b = 255, 16, 16
end
local textsize = render.measure_text(1, nil, bname)
local lw, lh = textsize.x, textsize.y
lh = lh - 1
if lw > width_text then
width_text = lw
end
local y_o = height_text-1
local height_text = height_text + lh
local width = lw
local height = lh
if location_set.distance_width_mp < 1 then
width_text = width_text * location_set.distance_width_mp
height_text = math.max(height or 0, height_text * math.min(1, location_set.distance_width_mp * 1))
for j=name:len(), 0, -1 do
local text_modified = name:sub(1, j)
local lw = render.measure_text(1, nil, text_modified).x
if width_text >= lw then
name = text_modified
width = lw
break
end
end
end
-- get icon
local width_icon, height_icon, icon
local icontype = self.paint_vars.icons[location_set.weapon]
if icontype ~= nil then
if icontype == "wallbang" then
icon = self.paint_vars.images.wallbang_png
elseif icontype == "bhop" then
icon = self.paint_vars.images.bhop_png
else
icon = render.get_weapon_icon(type(icons) == "number" and icontype or lweapon)
end
end
local iconsize
if icon ~= nil then
local _height = math.min(22, math.max(17, height_text+2, math.abs(wy_bot-wy_top)))
_height = math.floor(_height)
if icontype == "bhop" or icontype == "wallbang" then
iconsize = {
x = 3 + _height,
y = _height
}
else
iconsize = {
x = _height - 9,
y = _height - 4
}
end
width_icon = iconsize.x - ((icontype == "bhop" or icontype == "wallbang") and 6 or 0)
height_icon = iconsize.y
end
local full_width, full_height = width_text, height_text
if width_icon ~= nil then
full_width = math.floor(full_width+(location_set.distance_width_mp*8)+width_icon)
full_height = math.max(height_icon, height_text)
else
full_height = math.max(15, height_text)
end
local wx_topleft, wy_topleft = math.floor(wx_top-full_width/2), math.floor(wy_bot-full_height)
local offset, offset_icon = location_set.offset or 0, location_set.offset_icon or 0
local lw_width = (width_text/lw)*12
offset = offset*lw_width
offset_icon = offset_icon*lw_width
-- background
if location_set.show_icon == nil then
render.rect(vector(wx_topleft-2, wy_topleft-offset_icon-2), vector(wx_topleft-2+full_width+4, wy_topleft-2+full_height+4), color:init(16, 16, 16, 180*visible_alpha))
render.rect_outline(vector(wx_topleft-3, wy_topleft-offset_icon-3), vector(wx_topleft-3+full_width+6, wy_topleft-3+full_height+6), color:init(16, 16, 16, 170*visible_alpha))
render.rect_outline(vector(wx_topleft-4, wy_topleft-offset_icon-4), vector(wx_topleft-4+full_width+8, wy_topleft-4+full_height+8), color:init(16, 16, 16, 195*visible_alpha))
render.rect_outline(vector(wx_topleft-5, wy_topleft-offset_icon-5), vector(wx_topleft-5+full_width+10, wy_topleft-5+full_height+10), color:init(16, 16, 16, 40*visible_alpha))
if icon ~= nil then
if icontype == "wallbang" then
render.texture(self.paint_vars.images.wallbang_png, vector(wx_topleft-3, wy_topleft-offset_icon/2), vector(iconsize.x, iconsize.y), color:init(r, g, b, a))
elseif icontype == "bhop" then
render.texture(self.paint_vars.images.bhop_png, vector(wx_topleft-6, wy_topleft-offset_icon/2), vector(iconsize.x+4, iconsize.y), color:init(r, g, b, a))
else
render.texture(icon, vector(wx_topleft, wy_topleft - offset_icon / 2 - 1), vector(iconsize.x, iconsize.y), color:init(r, g, b, a))
end
end
if width_icon ~= nil and location_set.distance_width_mp > 0 then
render.rect(vector(wx_topleft+width_icon+3, wy_topleft-offset_icon+1), vector(wx_topleft+width_icon+4, wy_topleft+2+full_height-3), color:init(r, g, b, a))
end
end
if location_set.distance_width_mp > 0 then
local wx_text, wy_text = wx_topleft+(width_icon == nil and 0 or width_icon+8), wy_topleft
if full_height > height_text then
wy_text = wy_text + math.floor((full_height-height_text) / 2)
end
render.text(1, vector(wx_text, wy_text+y_o-offset), color:init(r, g, b, a), nil, name)
end
end
end
local orange = self.paint_vars.circle_colors.COLOR_ORANGE
local red = self.paint_vars.circle_colors.COLOR_RED
local green = self.paint_vars.circle_colors.COLOR_GREEN
local white = self.paint_vars.circle_colors.COLOR_WHITE
local color_1 = aimbot_mode == "Rage" and orange or red
for i=1, #self.paint_vars.angles_locations do
local location = self.paint_vars.angles_locations[i]
local in_range_draw = location.distance < 30
if location == location_playback_set then
location.in_range_draw_mp = 1
elseif in_range_draw and location.in_range_draw_mp < 1 then
location.in_range_draw_mp = math.min(1, location.in_range_draw_mp + frametime*8)
elseif not in_range_draw and location.in_range_draw_mp > 0 then
location.in_range_draw_mp = math.max(0, location.in_range_draw_mp - frametime*8)
end
if location_set_closest.in_range_draw_mp > 0 then
if location.on_fov_color == nil then
location.on_fov_color = 0
location.in_fov_select_mp = 0
end
local toforward = vector():angles(location.viewangles[1], location.viewangles[2])
local angle = render.world_to_screen(vector(location.position[1] + toforward.x * 700, location.position[2] + toforward.y * 700, location.position[3] + 64 + toforward.z * 700))
if angle == nil then
angle = vector()
end
local target = self.paint_vars.angles_locations[1]
local dp, dy = normalize_angles(view_pitch - target.viewangles[1], view_yaw - target.viewangles[2])
local on_fov = math.sqrt(dp*dp + dy*dy)
local ofov = on_fov <= (aimbot_mode == "Rage" and 180 or 0.3)
local crl = target.viewangles == location.viewangles
local circle_state = (location.origdistance <= 1.5 and crl and ofov) and "green" or (crl and on_fov <= 180) and "orange" or "white"
location.on_fov_color = (circle_state == "orange" and circle_state ~= "white") and math.max(0, location.on_fov_color - frametime*2) or math.min(1, location.on_fov_color + frametime*2)
location.in_fov_select_mp = circle_state == "white" and math.max(0, location.in_fov_select_mp - frametime*2) or math.min(1, location.in_fov_select_mp + frametime*2)
local sel = animations.color_modulation.lerp_color(color_1.r, color_1.g, color_1.b, green.r, green.g, green.b, location.on_fov_color)
local c_color = animations.color_modulation.lerp_color(white.r, white.g, white.b, sel[1], sel[2], sel[3], location.in_fov_select_mp)
local y = location.description ~= nil and 10 or 6
local name = "»" .. (#location.name == 2 and location.name[2] or location.name)
local name_size = render.measure_text(self.paint_vars.fonts.viewanlges_font, "b", name).x
local description_size = 0
if location.description ~= nil then
description_size = render.measure_text(1, nil, location.description).x
end
local best_size = math.max(name_size, description_size)
local on_screen = (angle.x > self.paint_vars.screen_size.x - best_size - 20 or angle.x < 20 or angle.y > self.paint_vars.screen_size.y - 20 or angle.y < 20)
if location.circle_alpha == nil then
location.circle_alpha = {0, 0, 0}
end
location.circle_alpha[1] = on_screen and animations.lerp(location.circle_alpha[1], 0, frametime * 12) or location.in_range_draw_mp
location.circle_alpha[3] = on_screen and animations.lerp(location.circle_alpha[3], 0.5, frametime * 12) or location.in_range_draw_mp
location.circle_alpha[2] = animations.lerp(location.circle_alpha[2], on_screen and location.in_range_draw_mp or 0, frametime * 12)
local alpha, alpha2, width = location.circle_alpha[1]*255, location.circle_alpha[3]*255, location.circle_alpha[2]*18
if angle.y < 20 then
angle.y = 20
elseif angle.y > self.paint_vars.screen_size.y - 20 then
angle.y = self.paint_vars.screen_size.y - 20
end
if angle.x < 20 then
angle.x = 20
elseif angle.x > self.paint_vars.screen_size.x - best_size - 20 then
angle.x = self.paint_vars.screen_size.x - 20 - best_size
end
local r, g, b = r_m, g_m, b_m
if location.red_color then
r, g, b = 255, 16, 16
end
render.rect(vector(angle.x - 9, angle.y - y - 4), vector(angle.x + best_size + 17 - width, angle.y + y + 4), color:init(16, 16, 16, alpha2*0.705))
render.rect_outline(vector(angle.x - 9, angle.y - y - 4), vector(angle.x + best_size + 17 - width, angle.y + y + 4), color:init(16, 16, 16, alpha2*0.48))
render.rect_outline(vector(angle.x - 10, angle.y - y - 5), vector(angle.x + best_size + 18 - width, angle.y + y + 5), color:init(16, 16, 16, alpha2*0.16))
--outline
render.circle_outline(vector(angle.x, angle.y), color:init(16, 16, 16, alpha*0.6), 6, 0, 1)
--circle
render.circle(vector(angle.x, angle.y), color:init(c_color[1], c_color[2], c_color[3], alpha), 5, 0, 1)
--gradient
render.circle_outline(vector(angle.x, angle.y), color:init(16, 16, 16, alpha*0.5), 6, 0, 1)
render.circle_outline(vector(angle.x, angle.y), color:init(16, 16, 16, alpha*0.4), 5, 0, 1)
render.circle_outline(vector(angle.x, angle.y), color:init(16, 16, 16, alpha*0.3), 4, 0, 1)
if location == location_playback then
render.circle(vector(angle.x, angle.y), color:init(math.min(255, r*1.2), math.min(255, g*1.2), math.min(255, b*1.2), alpha), 5.5, 0, 1)
end
render.text(self.paint_vars.fonts.viewanlges_font, vector(angle.x + 14 - width, angle.y - y), color:init(r, g, b, alpha2), nil, name)
if location.description ~= nil then
render.text(2, vector(angle.x + 15 - width, angle.y + y-9), color:init(r, g, b, alpha2), nil, location.description:upper())
end
render.line(vector(angle.x + 9, angle.y - y), vector(angle.x + 9, angle.y + y), color:init(r, g, b, alpha))
--arrow
local alpha_tri = on_screen and math.sin(math.abs(-math.pi + curtime * 1.5 % 6)) * 1 or 0
if alpha_tri > 0 then
local cx, cy = self.paint_vars.screen_size.x/2, self.paint_vars.screen_size.y/2
local triangle_angle = math.atan2(angle.y - cy, angle.x - cx) + math.rad(90)
local offset_x, offset_y = vector2_rotate(triangle_angle, 0, -cy + 100)
local tx, ty = cx + offset_x, cy + offset_y
local height = 18
triangle_rotated(tx, ty, height*1.66, height, triangle_angle, color:init(r, g, b, alpha_tri*255))
end
end
end
end
end,
cmd_location_playback_grenade = function(self, cmd, localplayer, weapon, weapon_name)
local view_angles = render.camera_angles()
if location_playback_data.playback_state == nil then
location_playback_data.playback_state = GRENADE_PLAYBACK_PREPARE
cheats_var.strafe_smooth = cheats_var.strafer_smoothing:get()
cheats_var.old_quick_stop = cheats_var.quick_stop:get()
cheats_var.old_strafer_wasd = cheats_var.strafer_wasd:get()
cheats_var.old_auto_strafe = cheats_var.auto_strafe:get()
cheats_var.old_strafe_assist = cheats_var.strafe_assist:get()
cheats_var.set_old_vars = true
self.sensitivity.old_sensitivity = (self.sensitivity.cvar_sensitivity:string())
self.sensitivity.set_old_sensitivity = true
end
local viewangles = location_playback.viewangles
cmd.view_angles.x = viewangles[1]
cmd.view_angles.y = viewangles[2]
cmd.view_angles.z = 0
if self.sensitivity.set_old_sensitivity and ui_handler.refs["aimbot_mode"].ref:get() ~= "Rage" then
render.camera_angles(vector(viewangles[1], viewangles[2], 0))
self.sensitivity.cvar_sensitivity:int(0)
end
local strength = 1
if location_playback.grenade ~= nil and location_playback.grenade.strength == 0.5 then
strength = 0.5
elseif location_playback.grenade ~= nil and location_playback.grenade.strength == 0 then
strength = 0
end
if location_playback_data.playback_state ~= GRENADE_PLAYBACK_FINISHED then
if weapon_console_name[weapon_name] ~= location_playback.weapon then
location_playback = nil
return
end
set_duck = location_playback.duck
cmd.in_duck = location_playback.duck or false
end
local m_flDuckAmount = localplayer.m_flDuckAmount
if set_duck and m_flDuckAmount ~= 1 then
return
end
if not set_duck and m_flDuckAmount ~= 0 then
return
end
if location_playback_data.playback_state == GRENADE_PLAYBACK_PREPARE or location_playback_data.playback_state == GRENADE_PLAYBACK_RUN or location_playback_data.playback_state == GRENADE_PLAYBACK_THROWN then
if strength == 1 then
cmd.buttons = bit.bor(cmd.buttons, 1)
cmd.buttons = bit.band(cmd.buttons, bit.bnot(2048))
elseif strength == 0.5 then
cmd.buttons = bit.bor(cmd.buttons, 2049)
elseif strength == 0 then
cmd.buttons = bit.bor(cmd.buttons, 2048)
cmd.buttons = bit.band(cmd.buttons, bit.bnot(1))
end
end
if location_playback_data.playback_state == GRENADE_PLAYBACK_PREPARE and weapon.m_flThrowStrength == strength and weapon.m_bPinPulled then
location_playback_data.playback_state = GRENADE_PLAYBACK_RUN
location_playback_data.start_at = cmd.command_number
cheats_var.auto_strafe:set(false)
end
if location_playback_data.playback_state == GRENADE_PLAYBACK_RUN or location_playback_data.playback_state == GRENADE_PLAYBACK_THROW or location_playback_data.playback_state == GRENADE_PLAYBACK_THROWN then
local step = cmd.command_number-location_playback_data.start_at
location_playback_data.run = location_playback.grenade ~= nil and location_playback.grenade.run or nil
if location_playback_data.run ~= nil and location_playback_data.run > step then
elseif location_playback_data.playback_state == GRENADE_PLAYBACK_RUN then
location_playback_data.playback_state = GRENADE_PLAYBACK_THROW
end
location_playback_data.run_yaw = (location_playback.grenade ~= nil and location_playback.grenade.run_yaw ~= nil) and location_playback.grenade.run_yaw or 0
if location_playback_data.run ~= nil then
local yaw = cmd.view_angles.y + location_playback_data.run_yaw
cmd.move_yaw = yaw
cmd.forwardmove = 450
cmd.in_forward = 1
cmd.in_speed = (location_playback.grenade ~= nil and location_playback.grenade.run_speed) and 1 or 0
end
end
if location_playback_data.playback_state == GRENADE_PLAYBACK_THROW then
if location_playback.grenade ~= nil and location_playback.grenade.jump == true then
cmd.buttons = bit.bor(cmd.buttons, 2)
end
location_playback_data.playback_state = GRENADE_PLAYBACK_THROWN
location_playback_data.throw_at = cmd.command_number
end
if location_playback_data.playback_state == GRENADE_PLAYBACK_THROWN then
local delay = (location_playback.grenade ~= nil and location_playback.grenade.delay) and location_playback.grenade.delay or 0
if cmd.command_number - location_playback_data.throw_at >= delay then
if cheats_var.fakelag:get() then
cmd.no_choke = true
end
cmd.buttons = bit.band(cmd.buttons, bit.bnot(1))
cmd.buttons = bit.band(cmd.buttons, bit.bnot(2048))
location_playback_data.recovery_yaw = (location_playback.grenade ~= nil and location_playback.grenade.recovery_yaw ~= nil) and location_playback.grenade.recovery_yaw or ((location_playback.grenade ~= nil and (location_playback.grenade.recovery_jump or location_playback.grenade.jump)) and 180 or nil)
end
end
if location_playback_data.playback_state == GRENADE_PLAYBACK_THROWN then
if is_grenade_being_thrown(cmd, weapon) then
location_playback_data.thrown_at = cmd.command_number
end
if weapon.m_fThrowTime == 0 and location_playback_data.thrown_at ~= nil and location_playback_data.thrown_at > location_playback_data.throw_at then
location_playback_data.playback_state = GRENADE_PLAYBACK_FINISHED
end
end
--recovery
if location_playback ~= nil and location_playback_data.playback_state == GRENADE_PLAYBACK_FINISHED then
if location_playback_data.recovery_yaw ~= nil then
if location_playback_data.recovery_start_at == nil then
location_playback_data.recovery_start_at = cmd.command_number
end
local recovery_duration = math.min(32, location_playback_data.run or 16) + 13 + ((location_playback.grenade ~= nil and location_playback.grenade.recovery_jump) and 10 or 0)
if cmd.command_number - location_playback_data.recovery_start_at >= 0.0000000001 then
cheats_var.auto_strafe:set(true)
cheats_var.strafer_wasd:set(true)
end
local run = cmd.command_number - location_playback_data.recovery_start_at
if in_move then
location_playback = nil
elseif location_playback_data.recovery_start_at+recovery_duration >= cmd.command_number then
local yaw = cmd.view_angles.y + (location_playback_data.recovery_yaw + location_playback_data.run_yaw)
cmd.move_yaw = yaw
cmd.forwardmove = 450
cmd.in_forward = 1
if location_playback.grenade ~= nil and location_playback.grenade.recovery_jump then
cmd.in_jump = true
end
else
location_playback = nil
end
else
location_playback = nil
end
end
end,
cmd_location_playback_movement = function(self, cmd, localplayer, weapon)
local movement = location_playback.movement
local viewangles = location_playback.viewangles
local frames = {}
for i, frame in ipairs(movement.frames) do
if type(frame) == "number" then
if movement.frames[i] > 0 then
for j=1, frame do
table.insert(frames, {})
end
end
elseif type(frame) == "table" then
table.insert(frames, frame)
end
end
local current = {
viewangles = {
pitch = viewangles[1],
yaw = viewangles[2]
},
buttons = {}
}
for key, char in pairs(MOVEMENT_BUTTONS_CHARS) do
current.buttons[key] = false
end
for i, value in ipairs(frames) do
local pitch, yaw, buttons, forwardmove, sidemove = unpack(value)
current.viewangles.pitch = current.viewangles.pitch + (pitch or 0)
current.viewangles.yaw = current.viewangles.yaw + (yaw or 0)
if type(buttons) == "string" then
local buttons_down, buttons_up = parse_buttons_str(buttons)
local buttons_seen = {}
for _, btn in ipairs(buttons_down) do
buttons_seen[btn] = true
current.buttons[btn] = true
end
for _, btn in ipairs(buttons_up) do
buttons_seen[btn] = true
current.buttons[btn] = false
end
end
-- either copy or reconstruct forwardmove and sidemove
current.forwardmove = type(forwardmove) == "number" and forwardmove >= -450 and forwardmove <= 450 and forwardmove or calculate_move(current.buttons.in_forward, current.buttons.in_back)
current.sidemove = type(sidemove) == "number" and sidemove >= -450 and sidemove <= 450 and sidemove or calculate_move(current.buttons.in_moveright, current.buttons.in_moveleft)
frames[i] = {
pitch = current.viewangles.pitch,
yaw = current.viewangles.yaw,
move_yaw = current.viewangles.yaw,
forwardmove = current.forwardmove,
sidemove = current.sidemove
}
for btn, value in pairs(current.buttons) do
frames[i][btn] = value
end
end
if location_playback_data.start_at == nil then
location_playback_data.start_at = cmd.command_number
self.sensitivity.old_sensitivity = (self.sensitivity.cvar_sensitivity:string())
self.sensitivity.set_old_sensitivity = true
end
local step = cmd.command_number-location_playback_data.start_at+1
local command = frames[step]
if command == nil then
location_playback = nil
else
in_jump = false
if cheats_var.fakelag:get() then
cmd.no_choke = true
end
if self.sensitivity.set_old_sensitivity then
self.sensitivity.cvar_sensitivity:int(0)
end
render.camera_angles(vector(command.pitch, command.yaw, 0))
cmd.forwardmove = command.forwardmove
cmd.sidemove = command.sidemove
if command.in_jump then
cmd.buttons = bit.bor(cmd.buttons, 2)
end
cmd.in_duck = command.in_duck
if step > 2 then
cmd.buttons = command.in_attack and bit.bor(cmd.buttons, 1) or bit.band(cmd.buttons, bit.bnot(1))
end
end
end,
cmd_location_playback_movement_step = function(self, cmd, localplayer, weapon)
if location_playback_data.start_at == nil then
location_playback_data.start_at = cmd.command_number
cheats_var.strafe_smooth = cheats_var.strafer_smoothing:get()
cheats_var.old_quick_stop = cheats_var.quick_stop:get()
cheats_var.old_strafer_wasd = cheats_var.strafer_wasd:get()
cheats_var.old_auto_strafe = cheats_var.auto_strafe:get()
cheats_var.old_strafe_assist = cheats_var.strafe_assist:get()
self.sensitivity.old_sensitivity = (self.sensitivity.cvar_sensitivity:string())
end
local step = cmd.command_number - location_playback_data.start_at
local movement_step = location_playback.step[step]
cheats_var.auto_strafe:set(true)
cheats_var.strafer_smoothing:set(location_playback.strafer and (location_playback.strafer.strafer_smoothing and location_playback.strafer.strafer_smoothing or 0) or 0)
cheats_var.quick_stop:set(location_playback.strafer and (location_playback.strafer.quick_stop and location_playback.strafer.quick_stop or false) or false)
cheats_var.strafe_assist:set(true)
cheats_var.set_old_vars = true
self.sensitivity.set_old_sensitivity = true
if movement_step ~= nil then
in_jump = false
if cheats_var.fakelag:get() then
cmd.no_choke = true
end
local viewangles = movement_step.viewangles
location_playback_data.angles = viewangles
location_playback_data.buttons = movement_step.m_buttons
if self.sensitivity.set_old_sensitivity then
self.sensitivity.cvar_sensitivity:int(0)
end
render.camera_angles(vector(viewangles[1], viewangles[2], 0))
cmd.view_angles.x = viewangles[1]
cmd.view_angles.y = viewangles[2]
cmd.view_angles.z = 0
else
location_playback, location_playback_data.angles, location_playback_data.buttons = nil, nil, nil
end
end,
cmd_location_playback = function(self, cmd, localplayer, weapon, weapon_name)
if location_playback.type == "grenade" then
self.cmd_location_playback_grenade(self, cmd, localplayer, weapon, weapon_name)
elseif location_playback.type == "movement" then
self.cmd_location_playback_movement(self, cmd, localplayer, weapon)
elseif location_playback.type == "movement_step" then
self.cmd_location_playback_movement_step(self, cmd, localplayer, weapon)
end
end,
can_attack = function(localplayer)
return globals.curtime > localplayer.m_flNextAttack
end,
on_prediction = function(self, cmd)
local localPlayer = entity.get_local_player()
if not localPlayer then
return
end
local localPos = localPlayer:get_origin()
local eyePosition = localPlayer:get_eye_position()
local view_angles = render.camera_angles()
local view_pitch, view_yaw = view_angles.x, view_angles.y
local lweapon = GetWeapon(localPlayer)
if lweapon == nil then
return
end
local active_weapon = localPlayer:get_player_weapon()
local hotkey = tabs.main.helper_bind:get()
local aimbot_mode = ui_handler.refs["aimbot_mode"].ref:get()
local aimbot_speed = ui_handler.refs["aimbot_speed"].ref:get()/100
if not hotkey then
location_playback, location_playback_data = nil, {}
set_duck = false
end
if location_playback == nil and self.sensitivity.set_old_sensitivity then
self.sensitivity.cvar_sensitivity:string(self.sensitivity.old_sensitivity)
self.sensitivity.set_old_sensitivity = false
end
local location_target = self.paint_vars.angles_locations[1]
if location_target and location_playback == nil then
local in_move = (cmd.in_jump or cmd.in_moveleft or cmd.in_moveleft or cmd.in_forward or cmd.in_back)
local in_train = localPlayer.m_nRenderMode == 2304
local m_flDuckAmount = localPlayer.m_flDuckAmount
local speed = localPlayer.m_vecAbsVelocity:length2d()
local pin_pulled = tabs.main.automatic_throw:get() and self.can_attack(localPlayer) or active_weapon.m_bPinPulled
if hotkey then
local position = location_target.position
local pos = vector(position[1], position[2], localPos.z)
local distance = pos:dist(localPos)
local throw = distance < 0.03
if not in_move then
local direction = pos - localPos
local pos1 = pos + direction:normalized() * 10
local fwd = pos1 - localPos
local yaw = fwd:angles().y
local speed = math.min(450, math.max(1.1 + m_flDuckAmount * 10, distance * 10))
cmd.move_yaw = yaw
cmd.forwardmove = speed
cmd.in_forward = 1
cmd.in_moveleft, cmd.in_moveright = 0, 0
cmd.sidemove = 0
end
if (bit.band(cmd.buttons, 1) == 1 or bit.band(cmd.buttons, 2048) == 2048) then
if true then
cmd.buttons = bit.bor(cmd.buttons, 1)
cmd.buttons = bit.band(cmd.buttons, bit.bnot(2048))
elseif location_target.grenade ~= nil and location_target.grenade.strength == 0.5 then
cmd.buttons = bit.bor(cmd.buttons, 2049)
elseif location_target.grenade ~= nil and location_target.grenade.strength == 0 then
cmd.buttons = bit.bor(cmd.buttons, 2048)
cmd.buttons = bit.band(cmd.buttons, bit.bnot(1))
end
end
if throw and location_playback == nil then
local locationtype = location_target.type
local dp, dy = normalize_angles(view_pitch - location_target.viewangles[1], view_yaw - location_target.viewangles[2])
local on_fov = math.sqrt(dp*dp + dy*dy)
if aimbot_mode == "Legit" and on_fov <= 180 then
local mp = math.min(1, on_fov / 3) * 0.5
local delta_mp = (mp + math.abs(on_fov * (1 - mp))) * globals.frametime * 15 * aimbot_speed
render.camera_angles(vector(view_pitch - dp / on_fov * delta_mp, view_yaw - dy / on_fov * delta_mp, 0))
end
local ofov = on_fov <= (aimbot_mode == "Rage" and 180 or 0.3)
if speed < 2 and ofov then
if locationtype == "grenade" then
if pin_pulled then
location_playback = location_target
end
else
location_playback = location_target
end
end
end
end
end
if location_playback ~= nil then
self.cmd_location_playback(self, cmd, localPlayer, active_weapon, lweapon)
end
if location_playback == nil and cheats_var.set_old_vars then
cheats_var.auto_strafe:set(cheats_var.old_auto_strafe)
cheats_var.strafe_assist:set(cheats_var.old_strafe_assist)
cheats_var.quick_stop:set(cheats_var.old_quick_stop)
cheats_var.strafer_wasd:set(cheats_var.old_strafer_wasd)
cheats_var.strafer_smoothing:set(cheats_var.strafe_smooth)
cheats_var.set_old_vars = false
end
end,
on_pre_prediction = function(self, cmd)
local hotkey = tabs.main.helper_bind:get()
local in_move = (bit.band(cmd.buttons, 2) == 2 or bit.band(cmd.buttons, 8) == 8 or bit.band(cmd.buttons, 16) == 16 or bit.band(cmd.buttons, 512) == 512 or bit.band(cmd.buttons, 1024) == 1024)
if hotkey then
--movement
local buttons = location_playback_data and location_playback_data.buttons or nil
if buttons ~= nil then
in_jump = false
if movement_attack == nil and (buttons.attack or buttons.attack2) then
movement_attack = true
end
if movement_attack then
cmd.buttons = buttons.attack and bit.bor(cmd.buttons, 1) or bit.band(cmd.buttons, bit.bnot(1))
cmd.buttons = buttons.attack2 and bit.bor(cmd.buttons, 2048) or bit.band(cmd.buttons, bit.bnot(2048))
else
if buttons.attack then
cmd.buttons = bit.bor(cmd.buttons, 1)
end
if buttons.attack2 then
cmd.buttons = bit.bor(cmd.buttons, 2048)
end
end
cmd.in_duck = buttons.duck or false
cmd.buttons = buttons.w and bit.bor(cmd.buttons, 8) or bit.band(cmd.buttons, bit.bnot(8))
cmd.buttons = buttons.s and bit.bor(cmd.buttons, 16) or bit.band(cmd.buttons, bit.bnot(16))
cmd.buttons = buttons.a and bit.bor(cmd.buttons, 512) or bit.band(cmd.buttons, bit.bnot(512))
cmd.buttons = buttons.d and bit.bor(cmd.buttons, 1024) or bit.band(cmd.buttons, bit.bnot(1024))
cmd.buttons = buttons.jump and bit.bor(cmd.buttons, 2) or bit.band(cmd.buttons, bit.bnot(2))
cmd.buttons = buttons.in_use and bit.bor(cmd.buttons, 32) or bit.band(cmd.buttons, bit.bnot(32))
cmd.buttons = buttons.run_speed and bit.bor(cmd.buttons, 131072) or bit.band(cmd.buttons, bit.bnot(131072))
cmd.weaponselect = buttons.weapon
end
else
movement_attack = nil
end
end,
}
--callbacks
tabs.main.helper_types:set_callback(function()
main.active_locations = nil
w_locations = {}
active_locations = {}
end)
events.createmove:set(function(cmd)
main:on_prediction(cmd)
main:on_pre_prediction(cmd)
locations_system:create_location(cmd)
locations_system:editor_menu()
end)
events.render:set(function()
main:on_paint()
end)
events.player_connect_full:set(function(event)
local localplayer = entity.get_local_player()
local event_userid = entity.get(event.userid, true)
if localplayer == event_userid then
active_locations = {}
update_active_locations()
w_locations = {}
timeout()
end
end)
Последнее редактирование: