Jump to content
Korean Random
Dragon armor

Мод "Эмулятор сервера World of Tanks".

Recommended Posts

Признавайтесь, кто уже собрал список message id в пакетах? Что там вообще бывает?

У меня пока 2,5 не считая пакета в котором клиенту приходят ip и порт на который нужно переключиться. 
А в base entity create всё хорошо кроме последнего байта 0x0f, который непонятно что означает.
 


@dataclass
class CounterMessage(BaseMessage):
    counter: int

    @classmethod
    def from_data(cls, data: BytesIO):
        counter, = struct.unpack('B', data.read(1))

        return cls(
            counter=counter
        )


@dataclass
class MethodCallMessage(BaseMessage):
    _METHOD_ID_OFFSET = 0x44

    method_id: int

    definitions = get_definitions(version='0_11_10')
    entity_def = definitions.get_entity_def_by_name('Account')
    methods = dict(enumerate(entity_def.client().get_exposed_index_map()))

    entity = Entity(
        id_=1,
        spec=entity_def)

    @classmethod
    def from_data(cls, data: BytesIO):
        method_id = struct.unpack('B', data.read(1))[0] - cls._METHOD_ID_OFFSET
        logging.info('Decoding message id as = %s', hex(method_id))
        method = cls.methods[method_id]
        logging.info('Method is = %s', method)

        # variable size message
        payload_size = method.get_size_in_bytes() - method._variable_header_size
        if method.get_size_in_bytes() > 0xFFFF:
            payload_size, = struct.unpack('B', data.read(1))
        logging.info('payload_size = %s', payload_size)
        payload = BytesIO(data.read(payload_size))
        logging.info('payload is = %s', payload.getvalue())

        try:
            args, kwargs = method.create_from_stream(payload)
        except Exception as e:
            logging.warning('Unpack error %s', e)

        logging.info('method = %s args = %s kwargs = %s', method, args, kwargs)

        return cls(
            method_id=method_id
        )


@dataclass
class BaseEntityCreateMessage(BaseMessage):
    unknown_header: int
    entity_id: int
    deninition_id: int
    unknown_uint8: int

    definitions = get_definitions(version='0_11_10')


    @classmethod
    def from_data(cls, data: BytesIO):
        unknown_header, = struct.unpack('H', data.read(2))
        entity_id, = struct.unpack('I', data.read(4))
        deninition_id, = struct.unpack('H', data.read(2))
        unknown_uint8, = struct.unpack('B', data.read(1))

        entity_def = cls.definitions.get_entity_def_by_index(deninition_id)
        entity = Entity(
            id_=entity_id,
            spec=entity_def)

        for index, prop in enumerate(entity.base_properties):
            logging.warning('setting base property %s', prop)
            entity.set_base_property(index, data)
        logging.info('New base entity created %s: %s', entity, entity.properties)


        return cls(
            unknown_header=unknown_header,
            entity_id=entity_id,
            deninition_id=deninition_id,
            unknown_uint8=unknown_uint8,
        )


    _MESSAGE_ID_TO_TYPE = {
        0x13: CounterMessage,
        0x5: BaseEntityCreateMessage,
        0x1a: MethodCallMessage,

        0x3e: UnknownFixedLengthMessage(message_len=8),
        0x02: UnknownFixedLengthMessage(message_len=21)
    }

E.g.
 

2022-11-10 20:11:12,120 WARNING Packet from_data Receiving message with id=0x2
2022-11-10 20:11:12,120 WARNING Packet from_data Receiving message with id=0x5
2022-11-10 20:11:12,121 WARNING Packet from_data setting base property name (<String>)
2022-11-10 20:11:12,121 WARNING Packet from_data setting base property spaID (<Int64>)
2022-11-10 20:11:12,122 WARNING Packet from_data setting base property attrs (<UInt64>)
2022-11-10 20:11:12,122 WARNING Packet from_data setting base property isClientOnline (<UInt8>)
2022-11-10 20:11:12,123 INFO Packet from_data New base entity created Account<939598900>: {'client': {}, 'cell': {}, 'base': {'name': 'Monstrofil', 'spaID': 509114719, 'attrs': 4176, 'isClientOnline': 0}}

2022-11-10 20:11:13,474 WARNING Packet from_data Receiving message with id=0x13
2022-11-10 20:11:13,474 WARNING Packet from_data Receiving message with id=0x1a
2022-11-10 20:11:13,475 INFO Packet from_data Decoding message id as = 0x58
2022-11-10 20:11:13,475 INFO Packet from_data Method is = onUpdateParentalControlRestrictionStatus ([status: <UInt32>, message: <String>, expirationTime: <UInt32>])
2022-11-10 20:11:13,475 INFO Packet from_data payload_size = 9
2022-11-10 20:11:13,475 INFO Packet from_data payload is = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2022-11-10 20:11:13,476 INFO Packet from_data method = onUpdateParentalControlRestrictionStatus ([status: <UInt32>, message: <String>, expirationTime: <UInt32>]) args = [] kwargs = {'status': 0, 'message': '', 'expirationTime': 0}

 

Share this post


Link to post

Short link
Share on other sites

@Dragon armorМожет немного не в тему, но надеюсь здесь подскажут ответ. В снайперском режиме, после выстрела клиент отрисовывает начальную траекторию движения снаряда, следовательно ему известно в какую точку полетит снаряд и можно подкорректировать это дело на стороне клиента ? Или сам сервер присылает значение разброса сразу после события нажатия на кнопку ?

Share this post


Link to post

Short link
Share on other sites
Только что, cofe_cofe_cofe1 сказал:

@Dragon armorМожет немного не в тему, но надеюсь здесь подскажут ответ. В снайперском режиме, после выстрела клиент отрисовывает начальную траекторию движения снаряда, следовательно ему известно в какую точку полетит снаряд и можно подкорректировать это дело на стороне клиента ? Или сам сервер присылает значение разброса сразу после события нажатия на кнопку ?

 

Сервер присылает инфу клиенту игры, что куда полетело и куда прилетело на сервере. Клиент только рисует. Ничего подкорректировать нельзя.

Share this post


Link to post

Short link
Share on other sites
07.11.2022 в 13:03, Monstrofil сказал:

FLAG_IS_RELIABLE на первой странице это опечатка, или действительно поменяли идентификатор

Флаги не менялись. Были лишь добавлены новые. Видимо, опечатка (хотя не смотрел).

 

07.11.2022 в 18:43, Monstrofil сказал:

upd: целый день с этим провозился и только сейчас заметил что размер blob по какой-то причине дописан в конец payload, сразу после uint8.

Да. Исходники BigWorld рекомендую посмотреть. Как и по следующему вопросу.

07.11.2022 в 18:43, Monstrofil сказал:

Разбирался сегодня с выравниванием под blowfish.

Потому что шифрование и логика сетевого протокола не менялась кардинально с тех времён.

3 часа назад, cofe_cofe_cofe1 сказал:

после выстрела клиент отрисовывает начальную траекторию движения снаряда,

Добавлю предыдущий ответ. Клиент отрисовать может заранее, чтобы меньше видно было лаг ответа. Поэтому возникают такие темы и видео, где чётко видно трассер, влетающий в борт, но сбивается гусеница. Это не заговор, а предсказание клиента. Иначе без этого всё воспринималось бы как ватность в управлении и отзывчивости игры. А на сервере всё может быть совсем иначе. Клиент на это никак повлиять не может.

23 часа назад, Monstrofil сказал:

кроме последнего байта 0x0f

FF FF FF 0F? Packet number.

Edited by Dragon armor

Share this post


Link to post

Short link
Share on other sites
Только что, Dragon armor сказал:

Добавлю предыдущий ответ. Клиент отрисовать может заранее, чтобы меньше видно было лаг ответа. Поэтому возникают такие темы и видео, где чётко видно трассер, влетающий в борт, но сбивается гусеница. Это не заговор, а предсказание клиента. Иначе без этого всё воспринималось бы как ватность в управлении и отзывчивости игры. А на сервере всё может быть совсем иначе. Клиент на это никак повлиять не может.

 

Я бы не называл это предсказаниями, так как экстраполяционной математики или математики предсказаний на клиенте нет. Это что-то вроде инерционности, но она на уровне физики, а не игровых событий. Например на клиенте продублирован с сервера код для расчета движения, поворотов танка, орудия и башни, физики гусениц, сведения прицела и перезарядки орудия. Клиент отрисовывает именно по этом коду, но раз в 0,1 сек приходят правильные "корректирующие" данные, которыми и заменяются посчитанные.

 

Причина описанной же выше ситуации с попаданием и уроном обусловлена рассинхронизированным с логикой событий отсылом и/или получением инфы с сервера игры и рассинхронизированной с логикой событий отрисовкой на клиенте. Сервер обсчитал траекториию, точку попадания нашел, посчитал пробитие в точке и применил урон к противнику. Клиенту он отсылает вектор выстрела, закодированную геометрически точку попадания на коллижене и урон противнику, однако дойти они могут не в такой последовательности. Кроме того, если полет снаряда по времени больше 1 тика сервера (0,1 сек), то данные о попадании придут с другим тиком. Но даже если дошли все данные за один тик и в правильной последовательности, то клиент игры отрисовывывает события параллельно и потому видимые результаты, исходя из трудоемкости отрисовки и времени отрисовки, могут быть рассинхронизированы во времени. Например, отрисовать отлетающий урон проще и быстрее чем траекторию полета снаряда, отсюда игрок может заметить, как от врага отлетает урон еще до того как трассер в него влетел. На производительном ПК это конечно мало заметно. Но могут быть хорошо видны несовпадения по времени, вызванные проблемами с передачей данных.

 

Все это давно известно как рассинхроны WOT и при текущей архитектуре игры аля "аватар" они часты и бывают хорошо видны.

Share this post


Link to post

Short link
Share on other sites
Да. Исходники BigWorld рекомендую посмотреть. Как и по следующему вопросу.

Я в них посматриваю, но там черт ногу сломит и нет самого важного - актуальных message id по которым можно было бы выстраивать дальнейший парсинг пакетов. Максимум можно подсмотреть часто используемые структуры данных.

 

2 часа назад, Dragon armor сказал:

FF FF FF 0F? Packet number.

Нет, тот который перед footer, сразу после BASE свойств переданных для создания entity.

Попадается 0x0f у Account и 0x01 у Login.

# Account: props = [name (<String>), spaID (<Int64>), attrs (<UInt64>), isClientOnline (<UInt8>)]
#                                 entity create  ???????     entity_id      xml id   ??  name          spaID                  attrs                         isClientOnline  ????    footer
# entity_create = b'X\x04\x13\x9a \x05           $\x00       0\xfa\t0      \x03\x00 \x00 \nMonstrofil _yX\x1e\x00\x00\x00\x00 P\x10\x00\x00\x00\x00\x00\x00 \x00            \x0f    \x03\x00\x00\x00 \x01\x00\x00\x00 \xef\xbe\xad\xde'
# entity_create = b'X\x04\x133    \x05           $\x00       c\xe1\x108    \x03\x00 \x00 \nMonstrofil _yX\x1e\x00\x00\x00\x00 P\x10\x00\x00\x00\x00\x00\x00 \x00            \x0f    \x02\x00\x00\x00 \x01\x00\x00\x00 \xef\xbe\xad\xde'
# Login: props = []
# entity_create = b'X\x04\x135    \x05           \x08\x00    \x06\x00\x0f0 \x06\x00 \x00                                                                                    \x01    \x02\x00\x00\x00 \x01\x00\x00\x00 \xef\xbe\xad\xde'

Пакеты в примере выше очищены от выравнивания для blowfish ^^

 

 

Кстати, сегодня столкнулся с ещё одним "нюансом" - если exposed method_id для ClientEntityMethodCall меньше 0xa1, то его номер просто записывается сразу после id сообщения. А если превышает, то в id сообщения записывается 0x1a, потом размер сообщения, а потом смещение которое нужно прибавить к 0x1a. 

_MAGIC_OFFSET_MSG_ID = 0xa1
        
        method_id = struct.unpack('B', data.read(1))[0]
        if method_id == cls._MAGIC_OFFSET_MSG_ID:
            payload_size, = struct.unpack('B', data.read(1))
            method_id = cls._MAGIC_OFFSET_MSG_ID + struct.unpack('B', data.read(1))[0] - cls._METHOD_ID_OFFSET

            logging.info('Decoding message id as = %s', hex(method_id))
            method = cls.methods[method_id]
            logging.info('Method is = %s', method)
        else:
            method_id -= cls._METHOD_ID_OFFSET

            logging.info('Decoding message id as = %s', hex(method_id))
            method = cls.methods[method_id]
            logging.info('Method is = %s', method)

            # variable size message
            payload_size = method.get_size_in_bytes() - method._variable_header_size
            if method.get_size_in_bytes() > 0xFFFF:
                payload_size, = struct.unpack('B', data.read(1))

Только после таких плясок с бубном начали корректно парситься пакеты с большими id. В реплеях, кстати, таких танцев с бубном не нужно =/
 

INFO:root:method = receiveShotKills ([unknown: <Array> [<FixedDict> {'ownerID': <Int32>, 'hitType': <UInt8>, 'kills': <Array> [<FixedDict> {'pos': <Vector3>, 'shotID': <UInt16>}, ...]}, ...]]) 
args = [[{'ownerID': 771744, 'hitType': 96, 'kills': [{'pos': (-106.69949340820312, 0.10629188269376755, -25.293855667114258), 'shotID': 88}]}]] kwargs = {}

INFO:root:method = onGameRoomStateChanged ([playersData: <Blob>, botsData: <Blob>, observersData: <Blob>]) 
args = [] kwargs = {'playersData': b'\x80\x02]q\x01]q\x02(K\tK\x02\x86q\x03K\x0bJ\xacc\x010\x86q\x04ea.', 'botsData': b'\x80\x02]q\x01]q\x02(K\nJ\xe9Q\x07\x10\x86q\x03K\x0c\x89\x86q\x04ea.', 'observersData': b'\x80\x02]q\x01.'}

И вот таких нюансов в исходниках BW я тоже не находил. Либо они скрыты в слоях абстракций которые там навертели, либо это было добавлено позже.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Внезапный вопрос в зал. В каком патче после введения новой кастомизации в 0.9.21 игра научилась запоминать конфигурацию стилей, если переключаться с готового стиля на свой стиль и наоборот, без необходимости пересобирать его вручную? Начиная с 1.9.1, существует секция CustomizationInvData.OUTFITS_POOL, в которую складываются камуфляжи (и, видимо, выбранный стиль), чтобы потом сразу переключиться на нужный пресет нажатием одной кнопки.

Меня память подводит или в игре уже до этого была подобная функция?

image.png.c6ad6e10928092f11b6dd5165689b58e.png

Edited by DrWeb7_1

Share this post


Link to post

Short link
Share on other sites

А, ну понятно зачем такой изврат с магической константой, которую я описывал выше.

_MAGIC_OFFSET_MSG_ID = 0xa1

Начиная с индекса 0xA2 в том же пакете 0x1A уже данные о property приходят, а не вызовы методов. Соответственно таким образом расширяли диапазон количества доступных методов.

@Dragon armorа где ты накопал эти все константы? 0x44 для методов, 0xA2 для property? Мне кажется, или в исходниках BW их нет?

Share this post


Link to post

Short link
Share on other sites
31 минуту назад, Monstrofil сказал:

а где ты накопал эти все константы? 0x44 для методов, 0xA2 для property?

Из исполняемого файла. Актуальны для определённой версии. И они считаются от количества методов и свойств. Это не константа. На момент того комментария не было мне это известно, поэтому и писал их константами.

 

1 час назад, Monstrofil сказал:

Попадается 0x0f у Account и 0x01 у Login.

Приведи полный пример пакета с флагами и счётчиками без blowfish данных.

 

1 час назад, Monstrofil сказал:

если exposed method_id для ClientEntityMethodCall меньше 0xa1, то его номер просто записывается сразу после id сообщения. А если превышает, то в id сообщения записывается 0x1a, потом размер сообщения, а потом смещение которое нужно прибавить к 0x1a.

В исходниках BigWorld есть этот момент. Там всё есть, что нужно. Точнее, основная база. Корабли были позже, поэтому там были изменения какие-то, утверждать не буду, но не одинаково. Но часть неизменна. Размер сообщения указывается только для тех сообщений, размер которых изменяется. Если константа, то не ставится.

У тебя парсер def-файлов есть? Ты смотрел в исполняемом файле, как он происходит? В корабликах свои особенности могут быть.

 

2 часа назад, Monstrofil сказал:

но там черт ногу сломит

Есть такое.

 

Ты из исполняемого файла достал базовые методы? Хз как их правильно назвать, те, что создают энтити и прочие.

Share this post


Link to post

Short link
Share on other sites
11.11.2022 в 23:46, Dragon armor сказал:

Приведи полный пример пакета с флагами и счётчиками без blowfish данных.

 

Я их как раз в прошлом сообщении и привел,
https://koreanrandom.com/forum/?app=core&module=system&controller=content&do=find&content_class=forums_Topic&content_id=45855&content_commentid=529521


Вот пример в hex, если так будет понятнее:

# 5804133305240063e110380300000a4d6f6e7374726f66696c5f79581e000000005010000000000000000f0200000001000000efbeadde01
# header   tickSync    entity create  ???     entity id   xml id  ??    str len  str = Monstorfil     spaId (int64)      attrs            isClientOnline  ??  
# 5804     1333        05             2400    63e11038    0300    00    0a       4d6f6e7374726f66696c 5f79581e00000000   5010000000000000 00              0f    02000000 01000000 efbeadde 01

 

Цитата

В исходниках BigWorld есть этот момент. Там всё есть, что нужно. 

Не нахожу :(
 

Цитата

Размер сообщения указывается только для тех сообщений, размер которых изменяется.

Это я уже понял и написал.

 

Цитата

У тебя парсер def-файлов есть? 

Есть, давно, парсить def, находить method id, списки свойств entity - всё это я уже умею.

 

Цитата

Ты из исполняемого файла достал базовые методы?

Частично. Я нашел место в клиенте где они описаны, но пока не заморочился настолько что бы достать их id. Сейчас они у меня просто выписаны в черновик в том порядке в котором они объявлены в коде, но этот порядок, похоже, не соответствует message id. С этим разбираться буду немного позже.

        # 0x6: createCellPlayer,
        # 0x7: spaceData,
        # 0x8: enterAoI,
        # 0x9: enterAoIOnVehicle,
        # 0x10: leaveAoI,
        # 0x11: createEntity,
        # 0x12: updateEntity,
        # 0x13: voiceData
        # 0x14: restoreClient
        # 0x15: switchBaseApp
        # 0x0a: resourceHeader
        # 0x0b: resourceFragment
        # 0x0c: loggedOff


 

 

Есть ещё более актуальный вопрос, почему иногда три первых байта сообщения (не пакета!) переносятся в конец сообщения? Пока что заметил такое поведение только в пакетах с FLAG_IS_PARTIAL.
Вот пример где INT64 (arenaID) таким образом разделило. Opts - тот же метод, но уже в реплее, там эти три байта в правильном месте.

state_received = '1a' \
                 'a1ffe93500' \
                 '00' \
                 # must be 1b7c6f639cbd0e00
                 '639cbd0e00' \
                 '022880027d7101284b005d7102284e4e4e4e4e4e4e4e4e654b015d7103284e4e4e4e4e4e4e4e4e65752effd6140080025d7101285d7102284b004adfba301e8671034b01888671044b024ad8410f008671054b036343616d6f75666c616765496e666f0a43616d6f75666c616765496e666f0a71064b004b00868171078671084b044b008671094b054b0086710a4b06580000000086710b4b075d710c2849343239333034343031360a5d710d284b004b004b004b00656586710e4b085d710f2849343239333930353332380a49343231353232393336300a658671104b094b008671114b0a898671124b0b4ae2e408308671134b0c888671144b0d898671154b0e888671164b0f898671174b10888671184b11888671194b128986711a4b138986711b4b148986711c4b158986711d4b164b0086711e4b174d561386711f4b18550d4a617669657247616c6c65676f71208671214b1963506c617965724d6f64654465660a506c617965724d6f64650a7122298171237d712428550e706c617965724d6f64655479706571254b00550e6f627365727665645465616d496471264b0075628671274b1a4b008671284b1b4b008671294b1c4b0086712a4b1d55024555712b86712c4b1e7d712d28550a616972446566656e7365712e550c415f416972446566656e7365712f55096162696c6974696573713055104162696c697469657344656661756c7471315509617274696c6c6572797132550b415f417274696c6c6572797133550a64697665426f6d6265727134551544697665426f6d6265725479706544656661756c7471355504617462617136550b4154424144656661756c747137550c61697273686970506c616e657138551741697273686970506c616e655479706544656661756c7471395503776373713a551a576561706f6e436f6e74726f6c53797374656d44656661756c74713b550d666c69676874436f6e74726f6c713c5514466c69676874436f6e74726f6c44656661756c74713d550a736b6970426f6d626572713e5515536b6970426f6d6265725479706544656661756c74713f550d746f727065646f426f6d62657271405518546f727065646f426f6d6265725479706544656661756c747141550b61697241726d616d656e747142551241697241726d616d656e7444656661756c747143550763616d657261737144550743616d6572617371455510756e646572776174657243616d65726171465510556e646572776174657243616d6572617147550a616972537570706f727471485511616972537570706f727444656661756c7471495506726164617273714a550d52616461727344656661756c74714b550d696d70756c73654c6173657273714c5514496d70756c73654c617365727344656661756c74714d5506656e67696e65714e5508415f456e67696e65714f550468756c6c71505506415f48756c6c71515509746f727065646f657371525510546f727065646f657344656661756c747153550573636f75747154551053636f75745479706544656661756c74715555086169506172616d73715655084149506172616d737157550577617665737158551457617665417274696c6c65727944656661756c747159550766696e64657273715a5509415f46696e64657273715b550670696e676572715c551050696e67657247756e44656661756c74715d550766696768746572715e5512466967687465725479706544656661756c74715f550c6368617267654c6173657273716055134368617267654c617365727344656661756c74716155087370656369616c737162550f5370656369616c7344656661756c747163550b66697265436f6e74726f6c7164550e41315f46697265436f6e74726f6c716555096469726563746f72737166550b415f4469726563746f727371675509617869734c6173657271685510417869734c6173657244656661756c747169550e617578696c69617279506c616e65716a5519417578696c69617279506c616e655479706544656661756c74716b550c646570746843686172676573716c5516446570746843686172676547756e7344656661756c74716d7586716e4b1f55940100000030b7eeff220000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000b06f1dff000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000b0ef4fffb0efaffeb0ef0ffe000000001e000000716f8671704b204ad9410f008671714b2149343239333833343534340a8671724b2249343239333833343534340a8671734b234b008671744b2489867175655d7176284b004a5f79581e8671774b01888671784b024ada410f008671794b03680786717a4b044b0086717b4b054b0086717c4b06580000000086717d4b075d717e2849343239333034343031360a5d717f284b004b004b004b0065658671804b085d71812849343239333930353332380a49343239333837323536300a658671824b094b008671834b0a898671844b0b4a83a60a308671854b0c888671864b0d888671874b0e888671884b0f898671894b108986718a4b118886718b4b128986718c4b138986718d4b148986718e4b158986718f4b164b008671904b174d94118671914b18550a4d6f6e7374726f66696c71928671934b196822298171947d71952868254b0068264b0075628671964b1a4b008671974b1b4b008671984b1c4b008671994b1d55024555719a86719b4b1e7d719c28682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f6860686168626863686468656866686768686869686a686b686c686d7586719d4b1f55900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000719e86719f4b204adb410f008671a04b2149343239333833343534340a8671a14b2249343239333833343534340a8671a24b234b008671a34b24898671a4655d71a5284b004a8cb1c8238671a64b01888671a74b024adc410f008671a84b0368078671a94b044b008671aa4b054b008671ab4b0658000000008671ac4b075d71ad284b005d71ae284b004b004b004b0065658671af4b085d71b02849343239333930353332380a49343239333837323536300a658671b14b094b008671b24b0a898671b34b0b4a042d0d308671b44b0c888671b54b0d898671b64b0e888671b74b0f898671b84b10888671b94b11888671ba4b12898671bb4b13898671bc4b14898671bd4b15898671be4b164b008671bf4b174d1e148671c04b18550d3332343432346466726631323371c18671c24b196822298171c37d71c42868254b0068264b0075628671c54b1a4b008671c64b1b4b008671c74b1c4b008671c84b1d5502455571c98671ca4b1e7d71cb28682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f686068616862686368646865686655104469726563746f727344656661756c7471cc68686869686a686b686c686d758671cd4b1f559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071ce8671cf4b204add410f008671d04b2149343235363038353731320a8671d14b2249343235363038353731320a8671d24b234b008671d34b24898671d4655d71d5284b004a0a63fc228671d64b01888671d74b024ade410f008671d84b0368078671d94b044ab3b3b3008671da4b054a930fd01d8671db4b065805000000412d4e2d4571dc8671dd4b075d71de2849343239333034333530340a5d71df284b004b004b004b0065658671e04b085d71e12849343237383137363638380a49343233383239383033320a658671e24b094b008671e34b0a898671e44b0b4a4b1d06388671e54b0c888671e64b0d898671e74b0e888671e84b0f898671e94b10888671ea4b11888671eb4b12898671ec4b13898671ed4b14898671ee4b15898671ef4b164b008671f04b174d7e1d8671f14b185509546f6d6173696e353771f28671f34b196822298171f47d71f52868254b0068264b0075628671f64b1a4b008671f74b1b4b008671f84b1c4b008671f94b1d5502455571fa8671fb4b1e7d71fc28682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f686068616862686368646865686668cc68686869686a686b686c686d758671fd4b1f55900100000030b5aef9210000000e000000302decff30adefff0000000030ade6ff30adedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071fe8671ff4b204adf410f008672000100004b2149343138383937363433320a8672010100004b2249343138383937363433320a8672020100004b234b008672030100004b2489867204010000655d7205010000284b004ab8e390238672060100004b01888672070100004b024ae0410f008672080100004b03680649343239323830303433320a4b008681720901000086720a0100004b044b0086720b0100004b054b0086720c0100004b06580000000086720d0100004b075d720e0100002849343239333034343230380a5d720f010000284b004b004b004b0065658672100100004b085d72110100002849343237383137363638380a49343239303732363833320a658672120100004b094b008672130100004b0a898672140100004b0b4ab20709308672150100004b0c888672160100004b0d898672170100004b0e888672180100004b0f898672190100004b108886721a0100004b118886721b0100004b128986721c0100004b138986721d0100004b148986721e0100004b158986721f0100004b164b008672200100004b174d56138672210100004b18550a53616e79694b6161614872220100008672230100004b196822298172240100007d72250100002868254b0068264b0075628672260100004b1a4b008672270100004b1b4b008672280100004b1c4b008672290100004b1d55024555722a01000086722b0100004b1e7d722c01000028682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e550d456e67696e6544656661756c74722d0100006850685168526853685468556856685768586859685a550e46696e6465727344656661756c74722e010000685c685d685e685f6860686168626863686468656866686768686869686a686b686c686d7586722f0100004b1f559401000000f0b7eeff220000000e000000f02fecfff0afdfff00000000f0afe6fff0afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000b0efdeff000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072300100008672310100004b204ae1410f008672320100004b2149343239333833343733360a8672330100004b2249343239333833343733360a8672340100004b234b008672350100004b2489867236010000655d7237010000284b004af1c1c8238672380100004b01888672390100004b024ae2410f0086723a0100004b03680786723b0100004b044b0086723c0100004b054b0086723d0100004b06580000000086723e0100004b075d723f010000284b005d7240010000284b004b004b004b0065658672410100004b085d72420100002849343239333930353332380a49343239333837323536300a658672430100004b094b008672440100004b0a898672450100004b0b4a13830c308672460100004b0c888672470100004b0d898672480100004b0e888672490100004b0f8986724a0100004b108886724b0100004b118886724c0100004b128986724d0100004b138986724e0100004b148986724f0100004b15898672500100004b164b008672510100004b174d94118672520100004b18550b4f736b61725f6c696d616b72530100008672540100004b196822298172550100007d72560100002868254b0068264b0075628672570100004b1a4b008672580100004b1b4b008672590100004b1c4b0086725a0100004b1d55024555725b01000086725c0100004b1e7d725d01000028682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f6860686168626863686468656866686768686869686a686b686c686d7586725e0100004b1f55900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000725f0100008672600100004b204ae3410f008672610100004b2149343239333833343534340a8672620100004b2249343239333833343534340a8672630100004b234b008672640100004b248986726501000065652effce200080025d7101285d7102284b004a8024f4ef8671034b01888671044b026343616d6f75666c616765496e666f0a43616d6f75666c616765496e666f0a71054b004b00868171068671074b034b008671084b044b008671094b05580000000086710a4b065d710b284b005d710c284b004b004b00656586710d4b075d710e2849343239333930353332380a49343239333837323536300a6586710f4b084b008671104b09898671114b0a4a80db0b108671124b0b898671134b0c888671144b0d888671154b0e898671164b0f898671174b104b008671184b114d1e148671194b1255083a5772696768743a711a86711b4b1355024555711c86711d4b147d711e28550a616972446566656e7365711f550c415f416972446566656e7365712055096162696c6974696573712155104162696c697469657344656661756c7471225509617274696c6c6572797123550b415f417274696c6c6572797124550a64697665426f6d6265727125551544697665426f6d6265725479706544656661756c7471265504617462617127550b4154424144656661756c747128550c61697273686970506c616e657129551741697273686970506c616e655479706544656661756c74712a5503776373712b551a576561706f6e436f6e74726f6c53797374656d44656661756c74712c550d666c69676874436f6e74726f6c712d5514466c69676874436f6e74726f6c44656661756c74712e550a736b6970426f6d626572712f5515536b6970426f6d6265725479706544656661756c747130550d746f727065646f426f6d62657271315518546f727065646f426f6d6265725479706544656661756c747132550b61697241726d616d656e747133551241697241726d616d656e7444656661756c747134550763616d657261737135550743616d6572617371365510756e646572776174657243616d65726171375510556e646572776174657243616d6572617138550a616972537570706f727471395511616972537570706f727444656661756c74713a5506726164617273713b550d52616461727344656661756c74713c550d696d70756c73654c6173657273713d5514496d70756c73654c617365727344656661756c74713e5506656e67696e65713f5508415f456e67696e657140550468756c6c71415506415f48756c6c71425509746f727065646f657371435510546f727065646f657344656661756c747144550573636f75747145551053636f75745479706544656661756c74714655086169506172616d73714755084149506172616d737148550577617665737149551457617665417274696c6c65727944656661756c74714a550766696e64657273714b5509415f46696e64657273714c550670696e676572714d551050696e67657247756e44656661756c74714e550766696768746572714f5512466967687465725479706544656661756c747150550c6368617267654c6173657273715155134368617267654c617365727344656661756c74715255087370656369616c737153550f5370656369616c7344656661756c747154550b66697265436f6e74726f6c7155550e41315f46697265436f6e74726f6c715655096469726563746f7273715755104469726563746f727344656661756c7471585509617869734c6173657271595510417869734c6173657244656661756c74715a550e617578696c69617279506c616e65715b5519417578696c69617279506c616e655479706544656661756c74715c550c646570746843686172676573715d5516446570746843686172676547756e7344656661756c74715e7586715f4b15559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071608671614b164ae4410f008671624b1749343235363038353731320a8671634b1849343235363038353731320a8671644b194b018671654b1a89867166655d7167284b004a7f24f4ef8671684b01888671694b02680686716a4b034b0086716b4b044b0086716c4b05580000000086716d4b065d716e284b005d716f284b004b004b0065658671704b075d71712849343239333930353332380a49343239333837323536300a658671724b084b008671734b09898671744b0a4a81db0b108671754b0b898671764b0c888671774b0d888671784b0e898671794b0f8986717a4b104b0086717b4b114d321986717c4b12550c3a4275636b6d61737465723a717d86717e4b1355024555717f8671804b147d718128681f6820682168226823550c41315f417274696c6c657279718268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b550e46696e6465727344656661756c747183684d684e684f68506851685268536854685568566857550b415f4469726563746f727371846859685a685b685c685d685e758671854b15559001000000d0b7aef9210000000e000000d02fecffd0afefff00000000d0afe6ffd0afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071868671874b164ae5410f008671884b1749343138383937373130340a8671894b1849343138383937373130340a86718a4b194b0186718b4b1a8986718c655d718d284b004a7e24f4ef86718e4b018886718f4b0268068671904b034b008671914b044b008671924b0558000000008671934b065d7194284b005d7195284b004b004b0065658671964b075d71972849343239333930353332380a49343239333837323536300a658671984b084b008671994b098986719a4b0a4a82db0b1086719b4b0b8986719c4b0c8886719d4b0d8886719e4b0e8986719f4b0f898671a04b104b008671a14b114d56138671a24b12550a3a496e67656e6f686c3a71a38671a44b135502455571a58671a64b147d71a728681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f550d456e67696e6544656661756c7471a8684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768846859685a685b685c685d685e758671a94b15559001000000f0b7eeff210000000e000000f02fecfff0afdfff00000000f0afe6fff0afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071aa8671ab4b164ae6410f008671ac4b1749343239333833343733360a8671ad4b1849343239333833343733360a8671ae4b194b018671af4b1a898671b0655d71b1284b004a7d24f4ef8671b24b01888671b34b0268068671b44b034b008671b54b044b008671b64b0558000000008671b74b065d71b8284b005d71b9284b004b004b0065658671ba4b075d71bb2849343239333930353332380a49343239333837323536300a658671bc4b084b008671bd4b09898671be4b0a4a83db0b108671bf4b0b898671c04b0c888671c14b0d888671c24b0e898671c34b0f898671c44b104b008671c54b114d7e1d8671c64b1255083a47616c6c65723a71c78671c84b135502455571c98671ca4b147d71cb28681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758671cc4b1555900100000030b5aef9210000000e000000302decff30adefff0000000030ade6ff30adedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071cd8671ce4b164ae7410f008671cf4b1749343138383937363433320a8671d04b1849343138383937363433320a8671d14b194b018671d24b1a898671d3655d71d4284b004a7c24f4ef8671d54b01888671d64b0268068671d74b034b008671d84b044b008671d94b0558000000008671da4b065d71db284b005d71dc284b004b004b0065658671dd4b075d71de2849343239333930353332380a49343239333837323536300a658671df4b084b008671e04b09898671e14b0a4a84db0b108671e24b0b898671e34b0c888671e44b0d888671e54b0e898671e64b0f898671e74b104b008671e84b114d94118671e94b1255093a537475726465653a71ea8671eb4b135502455571ec8671ed4b147d71ee28681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768846859685a685b685c685d685e758671ef4b1555900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071f08671f14b164ae8410f008671f24b1749343239333833343534340a8671f34b1849343239333833343534340a8671f44b194b018671f54b1a898671f6655d71f7284b004a7b24f4ef8671f84b01888671f94b0268068671fa4b034b008671fb4b044b008671fc4b0558000000008671fd4b065d71fe284b005d71ff284b004b004b0065658672000100004b075d72010100002849343239333930353332380a49343239333837323536300a658672020100004b084b008672030100004b09898672040100004b0a4a85db0b108672050100004b0b898672060100004b0c888672070100004b0d888672080100004b0e898672090100004b0f8986720a0100004b104b0086720b0100004b114d941186720c0100004b1255083a426f757665743a720d01000086720e0100004b1355024555720f0100008672100100004b147d721101000028681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768846859685a685b685c685d685e758672120100004b1555900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072130100008672140100004b164ae9410f008672150100004b1749343239333833343534340a8672160100004b1849343239333833343534340a8672170100004b194b018672180100004b1a89867219010000655d721a010000284b004a7a24f4ef86721b0100004b018886721c0100004b02680686721d0100004b034b0086721e0100004b044b0086721f0100004b0558000000008672200100004b065d7221010000284b005d7222010000284b004b004b0065658672230100004b075d72240100002849343239333930353332380a49343239333837323536300a658672250100004b084b008672260100004b09898672270100004b0a4a86db0b108672280100004b0b898672290100004b0c8886722a0100004b0d8886722b0100004b0e8986722c0100004b0f8986722d0100004b104b0086722e0100004b114de81c86722f0100004b1255083a48616c67616e3a72300100008672310100004b135502455572320100008672330100004b147d723401000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672350100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072360100008672370100004b164aea410f008672380100004b1749343138383937363937360a8672390100004b1849343138383937363937360a86723a0100004b194b0186723b0100004b1a8986723c010000655d723d010000284b004a7924f4ef86723e0100004b018886723f0100004b0268068672400100004b034b008672410100004b044b008672420100004b0558000000008672430100004b065d7244010000284b005d7245010000284b004b004b0065658672460100004b075d72470100002849343239333930353332380a49343239333837323536300a658672480100004b084b008672490100004b098986724a0100004b0a4a87db0b1086724b0100004b0b8986724c0100004b0c8886724d0100004b0d8886724e0100004b0e8986724f0100004b0f898672500100004b104b008672510100004b114de81c8672520100004b1255093a436f75726265743a72530100008672540100004b135502455572550100008672560100004b147d725701000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672580100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000725901000086725a0100004b164aeb410f0086725b0100004b1749343138383937363937360a86725c0100004b1849343138383937363937360a86725d0100004b194b0186725e0100004b1a8986725f010000655d7260010000284b004a7824f4ef8672610100004b01888672620100004b0268068672630100004b034b008672640100004b044b008672650100004b0558000000008672660100004b065d7267010000284b005d7268010000284b004b004b0065658672690100004b075d726a0100002849343239333930353332380a49343239333837323536300a6586726b0100004b084b0086726c0100004b098986726d0100004b0a4a88db0b1086726e0100004b0b8986726f0100004b0c888672700100004b0d888672710100004b0e898672720100004b0f898672730100004b104b008672740100004b114d1e148672750100004b12550c3a546567657474686f66663a72760100008672770100004b135502455572780100008672790100004b147d727a01000028681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e7586727b0100004b15559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000727c01000086727d0100004b164aec410f0086727e0100004b1749343235363038353731320a86727f0100004b1849343235363038353731320a8672800100004b194b018672810100004b1a89867282010000655d7283010000284b004a8324f4ef8672840100004b01888672850100004b0268068672860100004b034b008672870100004b044b008672880100004b0558000000008672890100004b065d728a010000284b005d728b010000284b004b004b00656586728c0100004b075d728d0100002849343239333930353332380a49343239333837323536300a6586728e0100004b084b0086728f0100004b09898672900100004b0a4a7ddb0b108672910100004b0b898672920100004b0c888672930100004b0d888672940100004b0e898672950100004b0f898672960100004b104b008672970100004b114de81c8672980100004b1255083a42756368616e3a729901000086729a0100004b1355024555729b01000086729c0100004b147d729d01000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e7586729e0100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000729f0100008672a00100004b164aed410f008672a10100004b1749343138383937363937360a8672a20100004b1849343138383937363937360a8672a30100004b194b008672a40100004b1a898672a5010000655d72a6010000284b004a8224f4ef8672a70100004b01888672a80100004b0268068672a90100004b034b008672aa0100004b044b008672ab0100004b0558000000008672ac0100004b065d72ad010000284b005d72ae010000284b004b004b0065658672af0100004b075d72b00100002849343239333930353332380a49343239333837323536300a658672b10100004b084b008672b20100004b09898672b30100004b0a4a7edb0b108672b40100004b0b898672b50100004b0c888672b60100004b0d888672b70100004b0e898672b80100004b0f898672b90100004b104b008672ba0100004b114de81c8672bb0100004b1255073a4d6f6f72653a72bc0100008672bd0100004b135502455572be0100008672bf0100004b147d72c001000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672c10100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072c20100008672c30100004b164aee410f008672c40100004b1749343138383937363937360a8672c50100004b1849343138383937363937360a8672c60100004b194b008672c70100004b1a898672c8010000655d72c9010000284b004a8124f4ef8672ca0100004b01888672cb0100004b0268068672cc0100004b034b008672cd0100004b044b008672ce0100004b0558000000008672cf0100004b065d72d0010000284b005d72d1010000284b004b004b0065658672d20100004b075d72d30100002849343239333930353332380a49343239333837323536300a658672d40100004b084b008672d50100004b09898672d60100004b0a4a7fdb0b108672d70100004b0b898672d80100004b0c888672d90100004b0d888672da0100004b0e898672db0100004b0f898672dc0100004b104b008672dd0100004b114d1e148672de0100004b12550a3a4e616b68696d6f763a72df0100008672e00100004b135502455572e10100008672e20100004b147d72e301000028681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672e40100004b15559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072e50100008672e60100004b164aef410f008672e70100004b1749343235363038353731320a8672e80100004b1849343235363038353731320a8672e90100004b194b008672ea0100004b1a898672eb01000065652e' \
                 '04' \
                 '80025d2e' \
                 '04' \
                 '80025d2e' \
                  # why this part is in the end?
                 '241b7c6f'
opts = [
    4149129054747675,  # 1b7c6f639cbd0e00
    2,
    '80027d7101284b005d7102284e4e4e4e4e4e4e4e4e654b015d7103284e4e4e4e4e4e4e4e4e65752e',
    '80025d7101285d7102284b004adfba301e8671034b01888671044b024ad8410f008671054b036343616d6f75666c616765496e666f0a43616d6f75666c616765496e666f0a71064b004b00868171078671084b044b008671094b054b0086710a4b06580000000086710b4b075d710c2849343239333034343031360a5d710d284b004b004b004b00656586710e4b085d710f2849343239333930353332380a49343231353232393336300a658671104b094b008671114b0a898671124b0b4ae2e408308671134b0c888671144b0d898671154b0e888671164b0f898671174b10888671184b11888671194b128986711a4b138986711b4b148986711c4b158986711d4b164b0086711e4b174d561386711f4b18550d4a617669657247616c6c65676f71208671214b1963506c617965724d6f64654465660a506c617965724d6f64650a7122298171237d712428550e706c617965724d6f64655479706571254b00550e6f627365727665645465616d496471264b0075628671274b1a4b008671284b1b4b008671294b1c4b0086712a4b1d55024555712b86712c4b1e7d712d28550a616972446566656e7365712e550c415f416972446566656e7365712f55096162696c6974696573713055104162696c697469657344656661756c7471315509617274696c6c6572797132550b415f417274696c6c6572797133550a64697665426f6d6265727134551544697665426f6d6265725479706544656661756c7471355504617462617136550b4154424144656661756c747137550c61697273686970506c616e657138551741697273686970506c616e655479706544656661756c7471395503776373713a551a576561706f6e436f6e74726f6c53797374656d44656661756c74713b550d666c69676874436f6e74726f6c713c5514466c69676874436f6e74726f6c44656661756c74713d550a736b6970426f6d626572713e5515536b6970426f6d6265725479706544656661756c74713f550d746f727065646f426f6d62657271405518546f727065646f426f6d6265725479706544656661756c747141550b61697241726d616d656e747142551241697241726d616d656e7444656661756c747143550763616d657261737144550743616d6572617371455510756e646572776174657243616d65726171465510556e646572776174657243616d6572617147550a616972537570706f727471485511616972537570706f727444656661756c7471495506726164617273714a550d52616461727344656661756c74714b550d696d70756c73654c6173657273714c5514496d70756c73654c617365727344656661756c74714d5506656e67696e65714e5508415f456e67696e65714f550468756c6c71505506415f48756c6c71515509746f727065646f657371525510546f727065646f657344656661756c747153550573636f75747154551053636f75745479706544656661756c74715555086169506172616d73715655084149506172616d737157550577617665737158551457617665417274696c6c65727944656661756c747159550766696e64657273715a5509415f46696e64657273715b550670696e676572715c551050696e67657247756e44656661756c74715d550766696768746572715e5512466967687465725479706544656661756c74715f550c6368617267654c6173657273716055134368617267654c617365727344656661756c74716155087370656369616c737162550f5370656369616c7344656661756c747163550b66697265436f6e74726f6c7164550e41315f46697265436f6e74726f6c716555096469726563746f72737166550b415f4469726563746f727371675509617869734c6173657271685510417869734c6173657244656661756c747169550e617578696c69617279506c616e65716a5519417578696c69617279506c616e655479706544656661756c74716b550c646570746843686172676573716c5516446570746843686172676547756e7344656661756c74716d7586716e4b1f55940100000030b7eeff220000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000b06f1dff000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000b0ef4fffb0efaffeb0ef0ffe000000001e000000716f8671704b204ad9410f008671714b2149343239333833343534340a8671724b2249343239333833343534340a8671734b234b008671744b2489867175655d7176284b004a5f79581e8671774b01888671784b024ada410f008671794b03680786717a4b044b0086717b4b054b0086717c4b06580000000086717d4b075d717e2849343239333034343031360a5d717f284b004b004b004b0065658671804b085d71812849343239333930353332380a49343239333837323536300a658671824b094b008671834b0a898671844b0b4a83a60a308671854b0c888671864b0d888671874b0e888671884b0f898671894b108986718a4b118886718b4b128986718c4b138986718d4b148986718e4b158986718f4b164b008671904b174d94118671914b18550a4d6f6e7374726f66696c71928671934b196822298171947d71952868254b0068264b0075628671964b1a4b008671974b1b4b008671984b1c4b008671994b1d55024555719a86719b4b1e7d719c28682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f6860686168626863686468656866686768686869686a686b686c686d7586719d4b1f55900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000719e86719f4b204adb410f008671a04b2149343239333833343534340a8671a14b2249343239333833343534340a8671a24b234b008671a34b24898671a4655d71a5284b004a8cb1c8238671a64b01888671a74b024adc410f008671a84b0368078671a94b044b008671aa4b054b008671ab4b0658000000008671ac4b075d71ad284b005d71ae284b004b004b004b0065658671af4b085d71b02849343239333930353332380a49343239333837323536300a658671b14b094b008671b24b0a898671b34b0b4a042d0d308671b44b0c888671b54b0d898671b64b0e888671b74b0f898671b84b10888671b94b11888671ba4b12898671bb4b13898671bc4b14898671bd4b15898671be4b164b008671bf4b174d1e148671c04b18550d3332343432346466726631323371c18671c24b196822298171c37d71c42868254b0068264b0075628671c54b1a4b008671c64b1b4b008671c74b1c4b008671c84b1d5502455571c98671ca4b1e7d71cb28682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f686068616862686368646865686655104469726563746f727344656661756c7471cc68686869686a686b686c686d758671cd4b1f559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071ce8671cf4b204add410f008671d04b2149343235363038353731320a8671d14b2249343235363038353731320a8671d24b234b008671d34b24898671d4655d71d5284b004a0a63fc228671d64b01888671d74b024ade410f008671d84b0368078671d94b044ab3b3b3008671da4b054a930fd01d8671db4b065805000000412d4e2d4571dc8671dd4b075d71de2849343239333034333530340a5d71df284b004b004b004b0065658671e04b085d71e12849343237383137363638380a49343233383239383033320a658671e24b094b008671e34b0a898671e44b0b4a4b1d06388671e54b0c888671e64b0d898671e74b0e888671e84b0f898671e94b10888671ea4b11888671eb4b12898671ec4b13898671ed4b14898671ee4b15898671ef4b164b008671f04b174d7e1d8671f14b185509546f6d6173696e353771f28671f34b196822298171f47d71f52868254b0068264b0075628671f64b1a4b008671f74b1b4b008671f84b1c4b008671f94b1d5502455571fa8671fb4b1e7d71fc28682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f686068616862686368646865686668cc68686869686a686b686c686d758671fd4b1f55900100000030b5aef9210000000e000000302decff30adefff0000000030ade6ff30adedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071fe8671ff4b204adf410f008672000100004b2149343138383937363433320a8672010100004b2249343138383937363433320a8672020100004b234b008672030100004b2489867204010000655d7205010000284b004ab8e390238672060100004b01888672070100004b024ae0410f008672080100004b03680649343239323830303433320a4b008681720901000086720a0100004b044b0086720b0100004b054b0086720c0100004b06580000000086720d0100004b075d720e0100002849343239333034343230380a5d720f010000284b004b004b004b0065658672100100004b085d72110100002849343237383137363638380a49343239303732363833320a658672120100004b094b008672130100004b0a898672140100004b0b4ab20709308672150100004b0c888672160100004b0d898672170100004b0e888672180100004b0f898672190100004b108886721a0100004b118886721b0100004b128986721c0100004b138986721d0100004b148986721e0100004b158986721f0100004b164b008672200100004b174d56138672210100004b18550a53616e79694b6161614872220100008672230100004b196822298172240100007d72250100002868254b0068264b0075628672260100004b1a4b008672270100004b1b4b008672280100004b1c4b008672290100004b1d55024555722a01000086722b0100004b1e7d722c01000028682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e550d456e67696e6544656661756c74722d0100006850685168526853685468556856685768586859685a550e46696e6465727344656661756c74722e010000685c685d685e685f6860686168626863686468656866686768686869686a686b686c686d7586722f0100004b1f559401000000f0b7eeff220000000e000000f02fecfff0afdfff00000000f0afe6fff0afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000b0efdeff000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072300100008672310100004b204ae1410f008672320100004b2149343239333833343733360a8672330100004b2249343239333833343733360a8672340100004b234b008672350100004b2489867236010000655d7237010000284b004af1c1c8238672380100004b01888672390100004b024ae2410f0086723a0100004b03680786723b0100004b044b0086723c0100004b054b0086723d0100004b06580000000086723e0100004b075d723f010000284b005d7240010000284b004b004b004b0065658672410100004b085d72420100002849343239333930353332380a49343239333837323536300a658672430100004b094b008672440100004b0a898672450100004b0b4a13830c308672460100004b0c888672470100004b0d898672480100004b0e888672490100004b0f8986724a0100004b108886724b0100004b118886724c0100004b128986724d0100004b138986724e0100004b148986724f0100004b15898672500100004b164b008672510100004b174d94118672520100004b18550b4f736b61725f6c696d616b72530100008672540100004b196822298172550100007d72560100002868254b0068264b0075628672570100004b1a4b008672580100004b1b4b008672590100004b1c4b0086725a0100004b1d55024555725b01000086725c0100004b1e7d725d01000028682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e685f6860686168626863686468656866686768686869686a686b686c686d7586725e0100004b1f55900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000725f0100008672600100004b204ae3410f008672610100004b2149343239333833343534340a8672620100004b2249343239333833343534340a8672630100004b234b008672640100004b248986726501000065652e', '80025d7101285d7102284b004a8024f4ef8671034b01888671044b026343616d6f75666c616765496e666f0a43616d6f75666c616765496e666f0a71054b004b00868171068671074b034b008671084b044b008671094b05580000000086710a4b065d710b284b005d710c284b004b004b00656586710d4b075d710e2849343239333930353332380a49343239333837323536300a6586710f4b084b008671104b09898671114b0a4a80db0b108671124b0b898671134b0c888671144b0d888671154b0e898671164b0f898671174b104b008671184b114d1e148671194b1255083a5772696768743a711a86711b4b1355024555711c86711d4b147d711e28550a616972446566656e7365711f550c415f416972446566656e7365712055096162696c6974696573712155104162696c697469657344656661756c7471225509617274696c6c6572797123550b415f417274696c6c6572797124550a64697665426f6d6265727125551544697665426f6d6265725479706544656661756c7471265504617462617127550b4154424144656661756c747128550c61697273686970506c616e657129551741697273686970506c616e655479706544656661756c74712a5503776373712b551a576561706f6e436f6e74726f6c53797374656d44656661756c74712c550d666c69676874436f6e74726f6c712d5514466c69676874436f6e74726f6c44656661756c74712e550a736b6970426f6d626572712f5515536b6970426f6d6265725479706544656661756c747130550d746f727065646f426f6d62657271315518546f727065646f426f6d6265725479706544656661756c747132550b61697241726d616d656e747133551241697241726d616d656e7444656661756c747134550763616d657261737135550743616d6572617371365510756e646572776174657243616d65726171375510556e646572776174657243616d6572617138550a616972537570706f727471395511616972537570706f727444656661756c74713a5506726164617273713b550d52616461727344656661756c74713c550d696d70756c73654c6173657273713d5514496d70756c73654c617365727344656661756c74713e5506656e67696e65713f5508415f456e67696e657140550468756c6c71415506415f48756c6c71425509746f727065646f657371435510546f727065646f657344656661756c747144550573636f75747145551053636f75745479706544656661756c74714655086169506172616d73714755084149506172616d737148550577617665737149551457617665417274696c6c65727944656661756c74714a550766696e64657273714b5509415f46696e64657273714c550670696e676572714d551050696e67657247756e44656661756c74714e550766696768746572714f5512466967687465725479706544656661756c747150550c6368617267654c6173657273715155134368617267654c617365727344656661756c74715255087370656369616c737153550f5370656369616c7344656661756c747154550b66697265436f6e74726f6c7155550e41315f46697265436f6e74726f6c715655096469726563746f7273715755104469726563746f727344656661756c7471585509617869734c6173657271595510417869734c6173657244656661756c74715a550e617578696c69617279506c616e65715b5519417578696c69617279506c616e655479706544656661756c74715c550c646570746843686172676573715d5516446570746843686172676547756e7344656661756c74715e7586715f4b15559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071608671614b164ae4410f008671624b1749343235363038353731320a8671634b1849343235363038353731320a8671644b194b018671654b1a89867166655d7167284b004a7f24f4ef8671684b01888671694b02680686716a4b034b0086716b4b044b0086716c4b05580000000086716d4b065d716e284b005d716f284b004b004b0065658671704b075d71712849343239333930353332380a49343239333837323536300a658671724b084b008671734b09898671744b0a4a81db0b108671754b0b898671764b0c888671774b0d888671784b0e898671794b0f8986717a4b104b0086717b4b114d321986717c4b12550c3a4275636b6d61737465723a717d86717e4b1355024555717f8671804b147d718128681f6820682168226823550c41315f417274696c6c657279718268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b550e46696e6465727344656661756c747183684d684e684f68506851685268536854685568566857550b415f4469726563746f727371846859685a685b685c685d685e758671854b15559001000000d0b7aef9210000000e000000d02fecffd0afefff00000000d0afe6ffd0afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071868671874b164ae5410f008671884b1749343138383937373130340a8671894b1849343138383937373130340a86718a4b194b0186718b4b1a8986718c655d718d284b004a7e24f4ef86718e4b018886718f4b0268068671904b034b008671914b044b008671924b0558000000008671934b065d7194284b005d7195284b004b004b0065658671964b075d71972849343239333930353332380a49343239333837323536300a658671984b084b008671994b098986719a4b0a4a82db0b1086719b4b0b8986719c4b0c8886719d4b0d8886719e4b0e8986719f4b0f898671a04b104b008671a14b114d56138671a24b12550a3a496e67656e6f686c3a71a38671a44b135502455571a58671a64b147d71a728681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f550d456e67696e6544656661756c7471a8684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768846859685a685b685c685d685e758671a94b15559001000000f0b7eeff210000000e000000f02fecfff0afdfff00000000f0afe6fff0afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071aa8671ab4b164ae6410f008671ac4b1749343239333833343733360a8671ad4b1849343239333833343733360a8671ae4b194b018671af4b1a898671b0655d71b1284b004a7d24f4ef8671b24b01888671b34b0268068671b44b034b008671b54b044b008671b64b0558000000008671b74b065d71b8284b005d71b9284b004b004b0065658671ba4b075d71bb2849343239333930353332380a49343239333837323536300a658671bc4b084b008671bd4b09898671be4b0a4a83db0b108671bf4b0b898671c04b0c888671c14b0d888671c24b0e898671c34b0f898671c44b104b008671c54b114d7e1d8671c64b1255083a47616c6c65723a71c78671c84b135502455571c98671ca4b147d71cb28681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758671cc4b1555900100000030b5aef9210000000e000000302decff30adefff0000000030ade6ff30adedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071cd8671ce4b164ae7410f008671cf4b1749343138383937363433320a8671d04b1849343138383937363433320a8671d14b194b018671d24b1a898671d3655d71d4284b004a7c24f4ef8671d54b01888671d64b0268068671d74b034b008671d84b044b008671d94b0558000000008671da4b065d71db284b005d71dc284b004b004b0065658671dd4b075d71de2849343239333930353332380a49343239333837323536300a658671df4b084b008671e04b09898671e14b0a4a84db0b108671e24b0b898671e34b0c888671e44b0d888671e54b0e898671e64b0f898671e74b104b008671e84b114d94118671e94b1255093a537475726465653a71ea8671eb4b135502455571ec8671ed4b147d71ee28681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768846859685a685b685c685d685e758671ef4b1555900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000071f08671f14b164ae8410f008671f24b1749343239333833343534340a8671f34b1849343239333833343534340a8671f44b194b018671f54b1a898671f6655d71f7284b004a7b24f4ef8671f84b01888671f94b0268068671fa4b034b008671fb4b044b008671fc4b0558000000008671fd4b065d71fe284b005d71ff284b004b004b0065658672000100004b075d72010100002849343239333930353332380a49343239333837323536300a658672020100004b084b008672030100004b09898672040100004b0a4a85db0b108672050100004b0b898672060100004b0c888672070100004b0d888672080100004b0e898672090100004b0f8986720a0100004b104b0086720b0100004b114d941186720c0100004b1255083a426f757665743a720d01000086720e0100004b1355024555720f0100008672100100004b147d721101000028681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768846859685a685b685c685d685e758672120100004b1555900100000030b7eeff210000000e000000302fecff30afefff0000000030afe6ff30afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072130100008672140100004b164ae9410f008672150100004b1749343239333833343534340a8672160100004b1849343239333833343534340a8672170100004b194b018672180100004b1a89867219010000655d721a010000284b004a7a24f4ef86721b0100004b018886721c0100004b02680686721d0100004b034b0086721e0100004b044b0086721f0100004b0558000000008672200100004b065d7221010000284b005d7222010000284b004b004b0065658672230100004b075d72240100002849343239333930353332380a49343239333837323536300a658672250100004b084b008672260100004b09898672270100004b0a4a86db0b108672280100004b0b898672290100004b0c8886722a0100004b0d8886722b0100004b0e8986722c0100004b0f8986722d0100004b104b0086722e0100004b114de81c86722f0100004b1255083a48616c67616e3a72300100008672310100004b135502455572320100008672330100004b147d723401000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672350100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072360100008672370100004b164aea410f008672380100004b1749343138383937363937360a8672390100004b1849343138383937363937360a86723a0100004b194b0186723b0100004b1a8986723c010000655d723d010000284b004a7924f4ef86723e0100004b018886723f0100004b0268068672400100004b034b008672410100004b044b008672420100004b0558000000008672430100004b065d7244010000284b005d7245010000284b004b004b0065658672460100004b075d72470100002849343239333930353332380a49343239333837323536300a658672480100004b084b008672490100004b098986724a0100004b0a4a87db0b1086724b0100004b0b8986724c0100004b0c8886724d0100004b0d8886724e0100004b0e8986724f0100004b0f898672500100004b104b008672510100004b114de81c8672520100004b1255093a436f75726265743a72530100008672540100004b135502455572550100008672560100004b147d725701000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672580100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000725901000086725a0100004b164aeb410f0086725b0100004b1749343138383937363937360a86725c0100004b1849343138383937363937360a86725d0100004b194b0186725e0100004b1a8986725f010000655d7260010000284b004a7824f4ef8672610100004b01888672620100004b0268068672630100004b034b008672640100004b044b008672650100004b0558000000008672660100004b065d7267010000284b005d7268010000284b004b004b0065658672690100004b075d726a0100002849343239333930353332380a49343239333837323536300a6586726b0100004b084b0086726c0100004b098986726d0100004b0a4a88db0b1086726e0100004b0b8986726f0100004b0c888672700100004b0d888672710100004b0e898672720100004b0f898672730100004b104b008672740100004b114d1e148672750100004b12550c3a546567657474686f66663a72760100008672770100004b135502455572780100008672790100004b147d727a01000028681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e7586727b0100004b15559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000727c01000086727d0100004b164aec410f0086727e0100004b1749343235363038353731320a86727f0100004b1849343235363038353731320a8672800100004b194b018672810100004b1a89867282010000655d7283010000284b004a8324f4ef8672840100004b01888672850100004b0268068672860100004b034b008672870100004b044b008672880100004b0558000000008672890100004b065d728a010000284b005d728b010000284b004b004b00656586728c0100004b075d728d0100002849343239333930353332380a49343239333837323536300a6586728e0100004b084b0086728f0100004b09898672900100004b0a4a7ddb0b108672910100004b0b898672920100004b0c888672930100004b0d888672940100004b0e898672950100004b0f898672960100004b104b008672970100004b114de81c8672980100004b1255083a42756368616e3a729901000086729a0100004b1355024555729b01000086729c0100004b147d729d01000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e7586729e0100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff0000000000000000000000000000000000000000040000000000000000000000000000000000000000000000729f0100008672a00100004b164aed410f008672a10100004b1749343138383937363937360a8672a20100004b1849343138383937363937360a8672a30100004b194b008672a40100004b1a898672a5010000655d72a6010000284b004a8224f4ef8672a70100004b01888672a80100004b0268068672a90100004b034b008672aa0100004b044b008672ab0100004b0558000000008672ac0100004b065d72ad010000284b005d72ae010000284b004b004b0065658672af0100004b075d72b00100002849343239333930353332380a49343239333837323536300a658672b10100004b084b008672b20100004b09898672b30100004b0a4a7edb0b108672b40100004b0b898672b50100004b0c888672b60100004b0d888672b70100004b0e898672b80100004b0f898672b90100004b104b008672ba0100004b114de81c8672bb0100004b1255073a4d6f6f72653a72bc0100008672bd0100004b135502455572be0100008672bf0100004b147d72c001000028681f6820682168226823688268256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b6883684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672c10100004b1555900100000050b7aef9210000000e000000502fecff50afefff0000000050afe6ff50afedff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072c20100008672c30100004b164aee410f008672c40100004b1749343138383937363937360a8672c50100004b1849343138383937363937360a8672c60100004b194b008672c70100004b1a898672c8010000655d72c9010000284b004a8124f4ef8672ca0100004b01888672cb0100004b0268068672cc0100004b034b008672cd0100004b044b008672ce0100004b0558000000008672cf0100004b065d72d0010000284b005d72d1010000284b004b004b0065658672d20100004b075d72d30100002849343239333930353332380a49343239333837323536300a658672d40100004b084b008672d50100004b09898672d60100004b0a4a7fdb0b108672d70100004b0b898672d80100004b0c888672d90100004b0d888672da0100004b0e898672db0100004b0f898672dc0100004b104b008672dd0100004b114d1e148672de0100004b12550a3a4e616b68696d6f763a72df0100008672e00100004b135502455572e10100008672e20100004b147d72e301000028681f6820682168226823682468256826682768286829682a682b682c682d682e682f6830683168326833683468356836683768386839683a683b683c683d683e683f6840684168426843684468456846684768486849684a684b684c684d684e684f6850685168526853685468556856685768586859685a685b685c685d685e758672e40100004b15559001000000d0b6aefd210000000e000000d02eccffd0aecfff00000000d0aec6ffd0aeddff000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000005000000b09f62ff000000000000000000000000000000000000000004000000000000000000000000000000000000000000000072e50100008672e60100004b164aef410f008672e70100004b1749343235363038353731320a8672e80100004b1849343235363038353731320a8672e90100004b194b008672ea0100004b1a898672eb01000065652e',
    '80025d2e',
    '80025d2e']

 

Share this post


Link to post

Short link
Share on other sites
2 часа назад, Monstrofil сказал:

Вот пример в hex, если так будет понятнее:

Да, так понятнее.

2 часа назад, Monstrofil сказал:

header tickSync entity create ???

Внезапно, размер пакета.

2 часа назад, Monstrofil сказал:

xml id ??

Ленишься в дизасемблере сидеть. Строка. Её длина равна нулю, поэтому дальше данных нет.

А дальше начинаются свойства. У тебя def-файл есть же. Прикрепи или скопируй сюда от логина, он должен быть самым коротким. Тогда будет понятно назначение 0x0f.

2 часа назад, Monstrofil сказал:

Не нахожу :(

Сам уже не помню где. Это в определении длины пакета. Либо при создании. Там действительно трудно ориентироваться, пока не знаешь, что именно искать.

 

2 часа назад, Monstrofil сказал:

но пока не заморочился настолько что бы достать их id.

Брекпойнт ставишь и в лог выводишь все параметры. Там есть единая функция создания у них. Порядок вызовов покажет их идентификатор. Либо перед выходом из той функции, что ещё лучше, потому что результат функции будет id (вроде бы, уже мог и забыть).

2 часа назад, Monstrofil сказал:

почему иногда три первых байта сообщения (не пакета!) переносятся в конец сообщения?

Спорный, на мой взгляд, способ уместить данные. Ты разобрался уже, что количество байт, в котором указывается размер сообщения, может быть от 1 до 4? То есть, это размер размера сообщения. Когда размер больше, чем может быть указано в, кхм, размере, создатели BigWorld сделали так, как ты описал. Где-то тоже было в исходниках, но даже примерно найти не могу, куда копать.

8 минут назад, Dragon armor сказал:

но даже примерно найти не могу, куда копать

Посмотри тут InterfaceElement::specialExpandLength.

Share this post


Link to post

Short link
Share on other sites
Только что, Dragon armor сказал:

Ты разобрался уже, что количество байт, в котором указывается размер сообщения, может быть от 1 до 4? То есть, это размер размера сообщения.

 

(Я тоже так делаю, когда что-то нативно храню :smile:)

Share this post


Link to post

Short link
Share on other sites
1 час назад, Dragon armor сказал:

Внезапно, размер пакета.

 

Да, причем двухбайтный, похоже, определено это в VARIABLE_MESSAGE, как в старых исходниках, это я уже нашел.
https://github.com/Monstrofil/bigworld-2.0/blob/5969290b3f1710910c7cecdad6a34b2016fad9e7/lib/connection/client_interface.hpp#L81
 

 

Цитата

Строка. Её длина равна нулю, поэтому дальше данных нет.

Строка это внезапно. У меня пока даже нет идей что это может быть за строка, видимо опять в исходники BW лезть. Это точно не часть свойств, т.к. свойства начинаются с name и расположены дальше.

 

1 час назад, Dragon armor сказал:

Прикрепи или скопируй сюда от логина, он должен быть самым коротким. Тогда будет понятно назначение 0x0f.

У логина там все то же самое, но пустой набор свойств и в конце 0x01. Это не размер свойств и не их количество. Когда-нибудь догадаюсь, но не сегодня =(

 

Share this post


Link to post

Short link
Share on other sites
41 минуту назад, Monstrofil сказал:

У меня пока даже нет идей что это может быть за строка, видимо опять в исходники BW лезть

Там, насколько помню, этого нет. Появилось позже и это общее между танками и кораблями, либо похоже. Ни разу эта строка мне не попадалась и что там может быть - не знаю.

41 минуту назад, Monstrofil сказал:

У логина там все то же самое, но пустой набор свойств и в конце 0x01

Тоже покажи этот пакет. Там как минимум одно свойство есть. И в танках нет единицы в конце Login.

А ты привёл пример энтити Account? Ну покажи def-файл его. 0x0F - это что-то в свойствах. Оно точно входит в это сообщение, судя по указанному размеру в самом сообщении.

Edited by Dragon armor

Share this post


Link to post

Short link
Share on other sites
11 часов назад, Dragon armor сказал:

Тоже покажи этот пакет. Там как минимум одно свойство есть. И в танках нет единицы в конце Login.

А ты привёл пример энтити Account? Ну покажи def-файл его. 0x0F - это что-то в свойствах. Оно точно входит в это сообщение, судя по указанному размеру в самом сообщении.


Login:

# header message_1   base entity create   size      entity id   xml id   ??  ??   footer
# 5804   13 8f       05                   0800      e9e01330    0600     00  01   02000000 01000000 efbeadde 05

Вот вообще все свойства которые есть у entity Login, включая те что в интерфейсах:

[_EntityHelperAPI__lastGeneratedRequestID (<UInt32>), lastGeneratedTransactionNumber (<UInt16>)]
  
  		<_EntityHelperAPI__lastGeneratedRequestID>
			<Type> UINT32 </Type>
			<Flags> BASE </Flags>
			<Persistent> False </Persistent>
		</_EntityHelperAPI__lastGeneratedRequestID>
  
  		<lastGeneratedTransactionNumber>
			<Type> UINT16 </Type>
			<Flags> BASE </Flags>
			<Default> 0 </Default>
		</lastGeneratedTransactionNumber>

 

Share this post


Link to post

Short link
Share on other sites

@Monstrofil Если сравнивать с танками, то для свойств остаётся один байт, тот, что 0х01. Потому что предпоследний байт - строка нулевой длины. Если смотреть на свойства, то единственное, что подходит - lastGeneratedTransactionNumber. Тогда строки не будет. Но если посмотреть на флаги свойств, то тут только BASE, а если бы были свойства для клиента, то было бы BASE_AND_CLIENT как в танках.

  <Properties>
    <accountDBID_s>
      <Type>	STRING	</Type>
      <Flags>	BASE_AND_CLIENT	</Flags>
      <Persistent>	true	</Persistent>
      <DatabaseLength>	96	</DatabaseLength>
      <Identifier>	true	</Identifier>
    </accountDBID_s>
    <loginPriority>
      <Type>	UINT32	</Type>
      <Flags>	BASE	</Flags>
    </loginPriority>
  </Properties>

Клиенту здесь передаётся только accountDBID_s.

Тебе надо в исполняемый файл лезть и искать место, где идёт создание энтити. И уже по месту смотреть, что именно с данными происходит.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
1 час назад, Dragon armor сказал:

lastGeneratedTransactionNumber

Не подходит, там BASE и размер UINT32.
 

 

1 час назад, Dragon armor сказал:

Тебе надо в исполняемый файл лезть и искать место, где идёт создание энтити. И уже по месту смотреть, что именно с данными происходит.

Понял, значит вопрос пока откладывается, для моих целей он пока не критичный.

Share this post


Link to post

Short link
Share on other sites

Вижу тут очень интересную тему по ББ. Но интересно, возможно ли такое реализовать в мобильной версии игры? По идее там даже будет проще это сделать

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...