From 0c1538307d3db3258b5c14bc6b71481c5fdf23bc Mon Sep 17 00:00:00 2001 From: Roman Zlobin Date: Wed, 25 Sep 2024 18:31:56 +0300 Subject: [PATCH 1/6] add type hints to standard condition init methods --- chatsky/conditions/standard.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/chatsky/conditions/standard.py b/chatsky/conditions/standard.py index cf1a45013..1acf4de40 100644 --- a/chatsky/conditions/standard.py +++ b/chatsky/conditions/standard.py @@ -69,7 +69,7 @@ class HasText(BaseCondition): Text to search for in the last request. """ - def __init__(self, text): + def __init__(self, text: str): super().__init__(text=text) async def call(self, ctx: Context) -> bool: @@ -94,7 +94,7 @@ class Regexp(BaseCondition): Flags to pass to ``re.compile``. """ - def __init__(self, pattern, *, flags=0): + def __init__(self, pattern: Union[str, Pattern], *, flags: Union[int, re.RegexFlag] = 0): super().__init__(pattern=pattern, flags=flags) @computed_field @@ -120,7 +120,7 @@ class Any(BaseCondition): List of conditions. """ - def __init__(self, *conditions): + def __init__(self, *conditions: BaseCondition): super().__init__(conditions=list(conditions)) async def call(self, ctx: Context) -> bool: @@ -137,7 +137,7 @@ class All(BaseCondition): List of conditions. """ - def __init__(self, *conditions): + def __init__(self, *conditions: BaseCondition): super().__init__(conditions=list(conditions)) async def call(self, ctx: Context) -> bool: @@ -154,7 +154,7 @@ class Negation(BaseCondition): Condition to negate. """ - def __init__(self, condition): + def __init__(self, condition: BaseCondition): super().__init__(condition=condition) async def call(self, ctx: Context) -> bool: @@ -189,7 +189,11 @@ class CheckLastLabels(BaseCondition): """ def __init__( - self, *, flow_labels=None, labels: Optional[List[AbsoluteNodeLabelInitTypes]] = None, last_n_indices=1 + self, + *, + flow_labels: Optional[List[str]] = None, + labels: Optional[List[AbsoluteNodeLabelInitTypes]] = None, + last_n_indices: int = 1 ): if flow_labels is None: flow_labels = [] @@ -216,7 +220,7 @@ class HasCallbackQuery(BaseCondition): Query string to find in last request's attachments. """ - def __init__(self, query_string): + def __init__(self, query_string: str): super().__init__(query_string=query_string) async def call(self, ctx: Context) -> bool: From cde9df9579da44c3975e09a7ecf4f8e8a5b7bd36 Mon Sep 17 00:00:00 2001 From: Roman Zlobin Date: Wed, 25 Sep 2024 18:43:30 +0300 Subject: [PATCH 2/6] update getting started from source installation instruction --- docs/source/get_started.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/source/get_started.rst b/docs/source/get_started.rst index 4a6c5e9b2..f5dc1a4b5 100644 --- a/docs/source/get_started.rst +++ b/docs/source/get_started.rst @@ -39,8 +39,7 @@ Additionally, you also have the option to download the source code directly from git clone https://github.com/deeppavlov/chatsky.git cd chatsky -Once you are in the directory, you can run the command ``make venv`` to set up all the necessary requirements for the library. -If you need to update the requirements, use the command ``make clean`` to remove `venv` first. +Once you are in the directory, you can run the command ``poetry install --all-extras`` to set up all the requirements for the library. Key concepts ~~~~~~~~~~~~ From 0830d384f1af05a4c087b67ae036005f6abd7599 Mon Sep 17 00:00:00 2001 From: Roman Zlobin Date: Wed, 25 Sep 2024 23:16:24 +0300 Subject: [PATCH 3/6] update advanced telegram tutorial * Move callback transitions to local node * Fix markdown parse mode for hash message * Expand documentation on extra fields --- .../messengers/telegram/test_happy_paths.json | 302 ++++-------------- tutorials/messengers/telegram/3_advanced.py | 157 +++++---- 2 files changed, 129 insertions(+), 330 deletions(-) diff --git a/tests/messengers/telegram/test_happy_paths.json b/tests/messengers/telegram/test_happy_paths.json index 9749d23d2..0422c45bd 100644 --- a/tests/messengers/telegram/test_happy_paths.json +++ b/tests/messengers/telegram/test_happy_paths.json @@ -475,28 +475,22 @@ "original_message": "gASVXwsAAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUTowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9qb2luX3JlcXVl\nc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVsZXRlZF9idXNp\nbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5l\nbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROjAdtZXNzYWdllIwRdGVs\nZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1lbnSU\njBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2UjAV2\nYWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowLYm9v\nc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRpb25f\nZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3NldJRO\njAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0ZV9j\naGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9pZJRO\njAhlbnRpdGllc5SMF3RlbGVncmFtLl9tZXNzYWdlZW50aXR5lIwNTWVzc2FnZUVudGl0eZSTlCmB\nlH2UKIwPY3VzdG9tX2Vtb2ppX2lklE6MCGxhbmd1YWdllE6MBmxlbmd0aJRLBowGb2Zmc2V0lEsA\naBJoE4wRTWVzc2FnZUVudGl0eVR5cGWUk5SMC2JvdF9jb21tYW5klIWUUpSMA3VybJROjAR1c2Vy\nlE5oG4hoHGhdSwBLBoeUaB59lHVihZSMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Ns\nb3NlZJROjBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1\nbV90b3BpY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROjAlmcm9tX3VzZXKUjA50ZWxlZ3Jh\nbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2FuX2Nvbm5l\nY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9ncm91cF9t\nZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdlX2NvZGWU\njAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGgefZR1YowE\nZ2FtZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVtX3RvcGlj\nX3VuaGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZlYXdheV9j\ncmVhdGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImMEWhhc19t\nZWRpYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6MFGlzX2F1\ndG9tYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNzYWdllE6M\nEGxlZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRpb26UTowO\nbWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRvX2RlbGV0ZV90aW1lcl9jaGFuZ2VklE6MEW1l\nc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJvbV9jaGF0X2lklE6MEm1pZ3JhdGVfdG9fY2hh\ndF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5ld19jaGF0X3Bob3RvlCmMDm5ld19jaGF0X3Rp\ndGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+UKYwOcGlubmVkX21lc3NhZ2WUTowEcG9sbJRO\njBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6MBXF1b3RllE6MDHJlcGx5X21hcmt1cJROjBBy\nZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6MEnNlbmRlcl9ib29zdF9jb3VudJRO\njBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0lE6MGHNob3dfY2FwdGlvbl9hYm92\nZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nlc3NmdWxfcGF5bWVudJROjBdzdXBl\ncmdyb3VwX2NoYXRfY3JlYXRlZJSJjAR0ZXh0lIwGL3N0YXJ0lIwMdXNlcnNfc2hhcmVklE6MBXZl\nbnVllE6MB3ZpYV9ib3SUTowFdmlkZW+UTowQdmlkZW9fY2hhdF9lbmRlZJROjB92aWRlb19jaGF0\nX3BhcnRpY2lwYW50c19pbnZpdGVklE6MFHZpZGVvX2NoYXRfc2NoZWR1bGVklE6MEnZpZGVvX2No\nYXRfc3RhcnRlZJROjAp2aWRlb19ub3RllE6MBXZvaWNllE6MDHdlYl9hcHBfZGF0YZROjBR3cml0\nZV9hY2Nlc3NfYWxsb3dlZJROjARjaGF0lGgJjARkYXRllIwIZGF0ZXRpbWWUjAhkYXRldGltZZST\nlEMKB+gFFRMJFAAAAJSMBHB5dHqUjARfVVRDlJOUKVKUhpRSlIwKbWVzc2FnZV9pZJRLAWgbiGgc\nSwFoCYaUaB59lHVijBBtZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSU\nTowObXlfY2hhdF9tZW1iZXKUTmiVTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5\nlE6MEnJlbW92ZWRfY2hhdF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSwFo\nG4hoHEsBhZRoHn2UdWIu\n" }, "response_message": { - "text": null, - "attachments": [ - { - "chatsky_attachment_type": "location", - "longitude": 27.792887, - "latitude": 58.43161, - "reply_markup": "gASV4gMAAAAAAACMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxp\nbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9p\nbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2U\nKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJs\nlE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hv\nc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1\ndGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTowHX2Zyb3plbpSIjAlfaWRfYXR0\ncnOUKGgUTk5oDE5OTk5OdJSMCmFwaV9rd2FyZ3OUfZR1YoWUaAgpgZR9lChoC4wLYXR0YWNobWVu\ndHOUaA1OaA5OaA9OaBBOaBFOaBJOaBOMFU11bHRpcGxlIGF0dGFjaG1lbnRzIZRoFU5oFk5oF4ho\nGChoIE5OaB9OTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAZzZWNyZXSUaA1OaA5OaA9OaBBOaBFO\naBJOaBOMDVNlY3JldCBpbWFnZSGUaBVOaBZOaBeIaBgoaCdOTmgmTk5OTk50lGgafZR1YoWUaAgp\ngZR9lChoC4wJdGh1bWJuYWlslGgNTmgOTmgPTmgQTmgRTmgSTmgTjBhEb2N1bWVudCB3aXRoIHRo\ndW1ibmFpbCGUaBVOaBZOaBeIaBgoaC5OTmgtTk5OTk50lGgafZR1YoWUaAgpgZR9lChoC4wEaGFz\naJRoDU5oDk5oD05oEE5oEU5oEk5oE4wcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRoFU5o\nFk5oF4hoGChoNU5OaDROTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAdyZXN0YXJ0lGgNTmgOTmgP\nTmgQTmgRTmgSTmgTjAhSZXN0YXJ0IZRoFU5oFk5oF4hoGChoPE5OaDtOTk5OTnSUaBp9lHViaAgp\ngZR9lChoC4wEcXVpdJRoDU5oDk5oD05oEE5oEU5oEk5oE4wFUXVpdCGUaBVOaBZOaBeIaBgoaEJO\nTmhBTk5OTk50lGgafZR1YoaUdJRoF4hoGGhGhZRoGn2UdWIu\n", - "__pickled_extra_fields__": [ - "reply_markup" - ] - } - ], + "text": "Welcome! Choose what you want to receive.", + "attachments": null, "annotations": null, "misc": null, - "original_message": null + "original_message": null, + "reply_markup": "gASVkgMAAAAAAACMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxp\nbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9p\nbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2U\nKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJs\nlE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hv\nc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1\ndGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTowHX2Zyb3plbpSIjAlfaWRfYXR0\ncnOUKGgUTk5oDE5OTk5OdJSMCmFwaV9rd2FyZ3OUfZR1YoWUaAgpgZR9lChoC4wLYXR0YWNobWVu\ndHOUaA1OaA5OaA9OaBBOaBFOaBJOaBOMFU11bHRpcGxlIGF0dGFjaG1lbnRzIZRoFU5oFk5oF4ho\nGChoIE5OaB9OTk5OTnSUaBp9lHViaAgpgZR9lChoC4wGc2VjcmV0lGgNTmgOTmgPTmgQTmgRTmgS\nTmgTjA1TZWNyZXQgaW1hZ2UhlGgVTmgWTmgXiGgYKGgmTk5oJU5OTk5OdJRoGn2UdWJoCCmBlH2U\nKGgLjAl0aHVtYm5haWyUaA1OaA5OaA9OaBBOaBFOaBJOaBOMGERvY3VtZW50IHdpdGggdGh1bWJu\nYWlsIZRoFU5oFk5oF4hoGChoLE5OaCtOTk5OTnSUaBp9lHVih5RoCCmBlH2UKGgLjARoYXNolGgN\nTmgOTmgPTmgQTmgRTmgSTmgTjBxGaXJzdCBhdHRhY2htZW50IGJ5dGVzIGhhc2ghlGgVTmgWTmgX\niGgYKGgzTk5oMk5OTk5OdJRoGn2UdWKFlGgIKYGUfZQoaAuMB3Jlc3RhcnSUaA1OaA5OaA9OaBBO\naBFOaBJOaBOMCFJlc3RhcnQhlGgVTmgWTmgXiGgYKGg6Tk5oOU5OTk5OdJRoGn2UdWKFlHSUaBeI\naBhoPoWUaBp9lHViLg==\n", + "__pickled_extra_fields__": [ + "reply_markup" + ] }, "response_functions": [ - "send_location(42, 58.43161, 27.792887, horizontal_accuracy=None, disable_notification=None, protect_content=None, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), message_effect_id=None, reply_to_message_id=None)" + "send_message(42, 'Welcome! Choose what you want to receive.', parse_mode=None, disable_notification=None, protect_content=None, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'), InlineKeyboardButton(callback_data='secret', text='Secret image!'), InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!')), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'),))), message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)" ] }, { - "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='formatted', from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='1', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 20, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=16, is_bot=True, username='chatsky_bot'), group_chat_created=False, location=Location(latitude=58.43162, longitude=27.792879), message_id=2, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), supergroup_chat_created=False)), update_id=2)", + "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='formatted', from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='1', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 20, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=16, is_bot=True, username='chatsky_bot'), group_chat_created=False, text='Welcome! Choose what you want to receive.', message_id=2, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'), InlineKeyboardButton(callback_data='secret', text='Secret image!'), InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), ))), supergroup_chat_created=False)), update_id=2)", "received_message": { "text": null, "attachments": [ @@ -507,10 +501,10 @@ ], "annotations": null, "misc": null, - "original_message": "gASV/g8AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjAlmb3JtYXR0ZWSUjAlmcm9tX3VzZXKUjA50\nZWxlZ3JhbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2Fu\nX2Nvbm5lY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9n\ncm91cF9tZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdl\nX2NvZGWUjAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGge\nfZR1YowPZ2FtZV9zaG9ydF9uYW1llE5oDYwBMZSMEWlubGluZV9tZXNzYWdlX2lklE6MB21lc3Nh\nZ2WUjBF0ZWxlZ3JhbS5fbWVzc2FnZZSMB01lc3NhZ2WUk5QpgZR9lCiMFV9lZmZlY3RpdmVfYXR0\nYWNobWVudJSMHHRlbGVncmFtLl91dGlscy5kZWZhdWx0dmFsdWWUjAxEZWZhdWx0VmFsdWWUk5Qp\ngZROfZSMBXZhbHVllE5zhpRijAlhbmltYXRpb26UTowFYXVkaW+UTowQYXV0aG9yX3NpZ25hdHVy\nZZROjAtib29zdF9hZGRlZJROjBZidXNpbmVzc19jb25uZWN0aW9uX2lklE6MB2NhcHRpb26UTowQ\nY2FwdGlvbl9lbnRpdGllc5QpjBRjaGFubmVsX2NoYXRfY3JlYXRlZJSJjBNjaGF0X2JhY2tncm91\nbmRfc2V0lE6MC2NoYXRfc2hhcmVklE6MEWNvbm5lY3RlZF93ZWJzaXRllE6MB2NvbnRhY3SUTowR\nZGVsZXRlX2NoYXRfcGhvdG+UiYwEZGljZZROjAhkb2N1bWVudJROjAllZGl0X2RhdGWUTowJZWZm\nZWN0X2lklE6MCGVudGl0aWVzlCmMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Nsb3Nl\nZJROjBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1bV90\nb3BpY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROaC9oMSmBlH2UKGg0Tmg1Tmg2Tmg3TmgL\njANCb3SUaA1LEGg4iGg5Tmg6TmgPTmg8TmgZjAtjaGF0c2t5X2JvdJRoG4hoHEsQhZRoHn2UdWKM\nBGdhbWWUTowaZ2VuZXJhbF9mb3J1bV90b3BpY19oaWRkZW6UTowcZ2VuZXJhbF9mb3J1bV90b3Bp\nY191bmhpZGRlbpROjAhnaXZlYXdheZROjBJnaXZlYXdheV9jb21wbGV0ZWSUTowQZ2l2ZWF3YXlf\nY3JlYXRlZJROjBBnaXZlYXdheV93aW5uZXJzlE6MEmdyb3VwX2NoYXRfY3JlYXRlZJSJjBFoYXNf\nbWVkaWFfc3BvaWxlcpROjBVoYXNfcHJvdGVjdGVkX2NvbnRlbnSUTowHaW52b2ljZZROjBRpc19h\ndXRvbWF0aWNfZm9yd2FyZJROjA9pc19mcm9tX29mZmxpbmWUTowQaXNfdG9waWNfbWVzc2FnZZRO\njBBsZWZ0X2NoYXRfbWVtYmVylE6MFGxpbmtfcHJldmlld19vcHRpb25zlE6MCGxvY2F0aW9ulIwY\ndGVsZWdyYW0uX2ZpbGVzLmxvY2F0aW9ulIwITG9jYXRpb26Uk5QpgZR9lCiMB2hlYWRpbmeUTowT\naG9yaXpvbnRhbF9hY2N1cmFjeZROjAhsYXRpdHVkZZRHQE03P1L8JleMC2xpdmVfcGVyaW9klE6M\nCWxvbmdpdHVkZZRHQDvK+h4+r2iMFnByb3hpbWl0eV9hbGVydF9yYWRpdXOUTmgbiGgcR0A7yvoe\nPq9oR0BNNz9S/CZXhpRoHn2UdWKMDm1lZGlhX2dyb3VwX2lklE6MIW1lc3NhZ2VfYXV0b19kZWxl\ndGVfdGltZXJfY2hhbmdlZJROjBFtZXNzYWdlX3RocmVhZF9pZJROjBRtaWdyYXRlX2Zyb21fY2hh\ndF9pZJROjBJtaWdyYXRlX3RvX2NoYXRfaWSUTowQbmV3X2NoYXRfbWVtYmVyc5QpjA5uZXdfY2hh\ndF9waG90b5QpjA5uZXdfY2hhdF90aXRsZZROjA1wYXNzcG9ydF9kYXRhlE6MBXBob3RvlCmMDnBp\nbm5lZF9tZXNzYWdllE6MBHBvbGyUTowZcHJveGltaXR5X2FsZXJ0X3RyaWdnZXJlZJROjAVxdW90\nZZROjAxyZXBseV9tYXJrdXCUjCV0ZWxlZ3JhbS5faW5saW5lLmlubGluZWtleWJvYXJkbWFya3Vw\nlIwUSW5saW5lS2V5Ym9hcmRNYXJrdXCUk5QpgZR9lCiMD2lubGluZV9rZXlib2FyZJQojCV0ZWxl\nZ3JhbS5faW5saW5lLmlubGluZWtleWJvYXJkYnV0dG9ulIwUSW5saW5lS2V5Ym9hcmRCdXR0b26U\nk5QpgZR9lCiMDWNhbGxiYWNrX2RhdGGUaC6MDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJslE6M\nA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hvc2Vu\nX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1dGUg\nZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTmgbiGgcKGiuTk5oLk5OTk5OdJRoHn2U\ndWKFlGijKYGUfZQoaKaMC2F0dGFjaG1lbnRzlGinTmioTmipTmiqTmirTmisTmitjBVNdWx0aXBs\nZSBhdHRhY2htZW50cyGUaK9OaLBOaBuIaBwoaLdOTmi2Tk5OTk50lGgefZR1YoWUaKMpgZR9lCho\npowGc2VjcmV0lGinTmioTmipTmiqTmirTmisTmitjA1TZWNyZXQgaW1hZ2UhlGivTmiwTmgbiGgc\nKGi+Tk5ovU5OTk5OdJRoHn2UdWKFlGijKYGUfZQoaKaMCXRodW1ibmFpbJRop05oqE5oqU5oqk5o\nq05orE5orYwYRG9jdW1lbnQgd2l0aCB0aHVtYm5haWwhlGivTmiwTmgbiGgcKGjFTk5oxE5OTk5O\ndJRoHn2UdWKFlGijKYGUfZQoaKaMBGhhc2iUaKdOaKhOaKlOaKpOaKtOaKxOaK2MHEZpcnN0IGF0\ndGFjaG1lbnQgYnl0ZXMgaGFzaCGUaK9OaLBOaBuIaBwoaMxOTmjLTk5OTk50lGgefZR1YoWUaKMp\ngZR9lChopowHcmVzdGFydJRop05oqE5oqU5oqk5oq05orE5orYwIUmVzdGFydCGUaK9OaLBOaBuI\naBwoaNNOTmjSTk5OTk50lGgefZR1YmijKYGUfZQoaKaMBHF1aXSUaKdOaKhOaKlOaKpOaKtOaKxO\naK2MBVF1aXQhlGivTmiwTmgbiGgcKGjZTk5o2E5OTk5OdJRoHn2UdWKGlHSUaBuIaBxo3YWUaB59\nlHVijBByZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6MEnNlbmRlcl9ib29zdF9j\nb3VudJROjBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0lE6MGHNob3dfY2FwdGlv\nbl9hYm92ZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nlc3NmdWxfcGF5bWVudJRO\njBdzdXBlcmdyb3VwX2NoYXRfY3JlYXRlZJSJaK1OjAx1c2Vyc19zaGFyZWSUTowFdmVudWWUTowH\ndmlhX2JvdJROjAV2aWRlb5ROjBB2aWRlb19jaGF0X2VuZGVklE6MH3ZpZGVvX2NoYXRfcGFydGlj\naXBhbnRzX2ludml0ZWSUTowUdmlkZW9fY2hhdF9zY2hlZHVsZWSUTowSdmlkZW9fY2hhdF9zdGFy\ndGVklE6MCnZpZGVvX25vdGWUTowFdm9pY2WUTowMd2ViX2FwcF9kYXRhlE6MFHdyaXRlX2FjY2Vz\nc19hbGxvd2VklE6MBGNoYXSUaAmMBGRhdGWUjAhkYXRldGltZZSMCGRhdGV0aW1llJOUQwoH6AUV\nEwkUAAAAlIwEcHl0epSMBF9VVEOUk5QpUpSGlFKUjAptZXNzYWdlX2lklEsCaBuIaBxLAmgJhpRo\nHn2UdWJoG4hoHGhAhZRoHn2UdWKMDGNoYW5uZWxfcG9zdJROjApjaGF0X2Jvb3N0lE6MEWNoYXRf\nam9pbl9yZXF1ZXN0lE6MC2NoYXRfbWVtYmVylE6MFGNob3Nlbl9pbmxpbmVfcmVzdWx0lE6MGWRl\nbGV0ZWRfYnVzaW5lc3NfbWVzc2FnZXOUTowXZWRpdGVkX2J1c2luZXNzX21lc3NhZ2WUTowTZWRp\ndGVkX2NoYW5uZWxfcG9zdJROjA5lZGl0ZWRfbWVzc2FnZZROjAxpbmxpbmVfcXVlcnmUTmhCTowQ\nbWVzc2FnZV9yZWFjdGlvbpROjBZtZXNzYWdlX3JlYWN0aW9uX2NvdW50lE6MDm15X2NoYXRfbWVt\nYmVylE5ol06MC3BvbGxfYW5zd2VylE6MEnByZV9jaGVja291dF9xdWVyeZROjBJyZW1vdmVkX2No\nYXRfYm9vc3SUTowOc2hpcHBpbmdfcXVlcnmUTowJdXBkYXRlX2lklEsCaBuIaBxLAoWUaB59lHVi\nLg==\n" + "original_message": "gASVGQ8AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjAlmb3JtYXR0ZWSUjAlmcm9tX3VzZXKUjA50\nZWxlZ3JhbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2Fu\nX2Nvbm5lY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9n\ncm91cF9tZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdl\nX2NvZGWUjAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGge\nfZR1YowPZ2FtZV9zaG9ydF9uYW1llE5oDYwBMZSMEWlubGluZV9tZXNzYWdlX2lklE6MB21lc3Nh\nZ2WUjBF0ZWxlZ3JhbS5fbWVzc2FnZZSMB01lc3NhZ2WUk5QpgZR9lCiMFV9lZmZlY3RpdmVfYXR0\nYWNobWVudJSMHHRlbGVncmFtLl91dGlscy5kZWZhdWx0dmFsdWWUjAxEZWZhdWx0VmFsdWWUk5Qp\ngZROfZSMBXZhbHVllE5zhpRijAlhbmltYXRpb26UTowFYXVkaW+UTowQYXV0aG9yX3NpZ25hdHVy\nZZROjAtib29zdF9hZGRlZJROjBZidXNpbmVzc19jb25uZWN0aW9uX2lklE6MB2NhcHRpb26UTowQ\nY2FwdGlvbl9lbnRpdGllc5QpjBRjaGFubmVsX2NoYXRfY3JlYXRlZJSJjBNjaGF0X2JhY2tncm91\nbmRfc2V0lE6MC2NoYXRfc2hhcmVklE6MEWNvbm5lY3RlZF93ZWJzaXRllE6MB2NvbnRhY3SUTowR\nZGVsZXRlX2NoYXRfcGhvdG+UiYwEZGljZZROjAhkb2N1bWVudJROjAllZGl0X2RhdGWUTowJZWZm\nZWN0X2lklE6MCGVudGl0aWVzlCmMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Nsb3Nl\nZJROjBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1bV90\nb3BpY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROaC9oMSmBlH2UKGg0Tmg1Tmg2Tmg3TmgL\njANCb3SUaA1LEGg4iGg5Tmg6TmgPTmg8TmgZjAtjaGF0c2t5X2JvdJRoG4hoHEsQhZRoHn2UdWKM\nBGdhbWWUTowaZ2VuZXJhbF9mb3J1bV90b3BpY19oaWRkZW6UTowcZ2VuZXJhbF9mb3J1bV90b3Bp\nY191bmhpZGRlbpROjAhnaXZlYXdheZROjBJnaXZlYXdheV9jb21wbGV0ZWSUTowQZ2l2ZWF3YXlf\nY3JlYXRlZJROjBBnaXZlYXdheV93aW5uZXJzlE6MEmdyb3VwX2NoYXRfY3JlYXRlZJSJjBFoYXNf\nbWVkaWFfc3BvaWxlcpROjBVoYXNfcHJvdGVjdGVkX2NvbnRlbnSUTowHaW52b2ljZZROjBRpc19h\ndXRvbWF0aWNfZm9yd2FyZJROjA9pc19mcm9tX29mZmxpbmWUTowQaXNfdG9waWNfbWVzc2FnZZRO\njBBsZWZ0X2NoYXRfbWVtYmVylE6MFGxpbmtfcHJldmlld19vcHRpb25zlE6MCGxvY2F0aW9ulE6M\nDm1lZGlhX2dyb3VwX2lklE6MIW1lc3NhZ2VfYXV0b19kZWxldGVfdGltZXJfY2hhbmdlZJROjBFt\nZXNzYWdlX3RocmVhZF9pZJROjBRtaWdyYXRlX2Zyb21fY2hhdF9pZJROjBJtaWdyYXRlX3RvX2No\nYXRfaWSUTowQbmV3X2NoYXRfbWVtYmVyc5QpjA5uZXdfY2hhdF9waG90b5QpjA5uZXdfY2hhdF90\naXRsZZROjA1wYXNzcG9ydF9kYXRhlE6MBXBob3RvlCmMDnBpbm5lZF9tZXNzYWdllE6MBHBvbGyU\nTowZcHJveGltaXR5X2FsZXJ0X3RyaWdnZXJlZJROjAVxdW90ZZROjAxyZXBseV9tYXJrdXCUjCV0\nZWxlZ3JhbS5faW5saW5lLmlubGluZWtleWJvYXJkbWFya3VwlIwUSW5saW5lS2V5Ym9hcmRNYXJr\ndXCUk5QpgZR9lCiMD2lubGluZV9rZXlib2FyZJQojCV0ZWxlZ3JhbS5faW5saW5lLmlubGluZWtl\neWJvYXJkYnV0dG9ulIwUSW5saW5lS2V5Ym9hcmRCdXR0b26Uk5QpgZR9lCiMDWNhbGxiYWNrX2Rh\ndGGUaC6MDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJslE6MA3BheZROjBNzd2l0Y2hfaW5saW5l\nX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hvc2VuX2NoYXSUTowgc3dpdGNoX2lubGlu\nZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1dGUgZm9ybWF0dGVkIHRleHQhlIwDdXJs\nlE6MB3dlYl9hcHCUTmgbiGgcKGihTk5oLk5OTk5OdJRoHn2UdWKFlGiWKYGUfZQoaJmMC2F0dGFj\naG1lbnRzlGiaTmibTmicTmidTmieTmifTmigjBVNdWx0aXBsZSBhdHRhY2htZW50cyGUaKJOaKNO\naBuIaBwoaKpOTmipTk5OTk50lGgefZR1YmiWKYGUfZQoaJmMBnNlY3JldJRomk5om05onE5onU5o\nnk5on05ooIwNU2VjcmV0IGltYWdlIZRook5oo05oG4hoHChosE5OaK9OTk5OTnSUaB59lHViaJYp\ngZR9lChomYwJdGh1bWJuYWlslGiaTmibTmicTmidTmieTmifTmigjBhEb2N1bWVudCB3aXRoIHRo\ndW1ibmFpbCGUaKJOaKNOaBuIaBwoaLZOTmi1Tk5OTk50lGgefZR1YoeUaJYpgZR9lChomYwEaGFz\naJRomk5om05onE5onU5onk5on05ooIwcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRook5o\no05oG4hoHChovU5OaLxOTk5OTnSUaB59lHVihZRolimBlH2UKGiZjAdyZXN0YXJ0lGiaTmibTmic\nTmidTmieTmifTmigjAhSZXN0YXJ0IZRook5oo05oG4hoHChoxE5OaMNOTk5OTnSUaB59lHVihZR0\nlGgbiGgcaMiFlGgefZR1YowQcmVwbHlfdG9fbWVzc2FnZZROjA5yZXBseV90b19zdG9yeZROjBJz\nZW5kZXJfYm9vc3RfY291bnSUTowTc2VuZGVyX2J1c2luZXNzX2JvdJROjAtzZW5kZXJfY2hhdJRO\njBhzaG93X2NhcHRpb25fYWJvdmVfbWVkaWGUTowHc3RpY2tlcpROjAVzdG9yeZROjBJzdWNjZXNz\nZnVsX3BheW1lbnSUTowXc3VwZXJncm91cF9jaGF0X2NyZWF0ZWSUiWigjClXZWxjb21lISBDaG9v\nc2Ugd2hhdCB5b3Ugd2FudCB0byByZWNlaXZlLpSMDHVzZXJzX3NoYXJlZJROjAV2ZW51ZZROjAd2\naWFfYm90lE6MBXZpZGVvlE6MEHZpZGVvX2NoYXRfZW5kZWSUTowfdmlkZW9fY2hhdF9wYXJ0aWNp\ncGFudHNfaW52aXRlZJROjBR2aWRlb19jaGF0X3NjaGVkdWxlZJROjBJ2aWRlb19jaGF0X3N0YXJ0\nZWSUTowKdmlkZW9fbm90ZZROjAV2b2ljZZROjAx3ZWJfYXBwX2RhdGGUTowUd3JpdGVfYWNjZXNz\nX2FsbG93ZWSUTowEY2hhdJRoCYwEZGF0ZZSMCGRhdGV0aW1llIwIZGF0ZXRpbWWUk5RDCgfoBRUT\nCRQAAACUjARweXR6lIwEX1VUQ5STlClSlIaUUpSMCm1lc3NhZ2VfaWSUSwJoG4hoHEsCaAmGlGge\nfZR1YmgbiGgcaECFlGgefZR1YowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9q\nb2luX3JlcXVlc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVs\nZXRlZF9idXNpbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0\nZWRfY2hhbm5lbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROaEJOjBBt\nZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSUTowObXlfY2hhdF9tZW1i\nZXKUTmiKTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5lE6MEnJlbW92ZWRfY2hh\ndF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSwJoG4hoHEsChZRoHn2UdWIu\n" }, "response_message": { - "text": "\nVisit [this link](https://core.telegram.org/bots/api#formatting-options)\nfor more information about formatting options in telegram\\.\n\nRun /start command again to restart\\.\n", + "text": "\nVisit [this link](https://core.telegram.org/bots/api#formatting-options)\nfor more information about formatting options in telegram\\.\n", "attachments": null, "annotations": null, "misc": null, @@ -518,41 +512,11 @@ "parse_mode": "MarkdownV2" }, "response_functions": [ - "send_message(42, '\\nVisit [this link](https://core.telegram.org/bots/api#formatting-options)\\nfor more information about formatting options in telegram\\\\.\\n\\nRun /start command again to restart\\\\.\\n', parse_mode=, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)" + "send_message(42, '\\nVisit [this link](https://core.telegram.org/bots/api#formatting-options)\\nfor more information about formatting options in telegram\\\\.\\n', parse_mode=, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)" ] }, { - "update": "Update(message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 24, tzinfo=UTC), delete_chat_photo=False, entities=(MessageEntity(length=6, offset=0, type=MessageEntityType.BOT_COMMAND),), from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), group_chat_created=False, message_id=3, supergroup_chat_created=False, text='/start'), update_id=3)", - "received_message": { - "text": "/start", - "attachments": [], - "annotations": null, - "misc": null, - "original_message": "gASVXwsAAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUTowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9qb2luX3JlcXVl\nc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVsZXRlZF9idXNp\nbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5l\nbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROjAdtZXNzYWdllIwRdGVs\nZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1lbnSU\njBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2UjAV2\nYWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowLYm9v\nc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRpb25f\nZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3NldJRO\njAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0ZV9j\naGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9pZJRO\njAhlbnRpdGllc5SMF3RlbGVncmFtLl9tZXNzYWdlZW50aXR5lIwNTWVzc2FnZUVudGl0eZSTlCmB\nlH2UKIwPY3VzdG9tX2Vtb2ppX2lklE6MCGxhbmd1YWdllE6MBmxlbmd0aJRLBowGb2Zmc2V0lEsA\naBJoE4wRTWVzc2FnZUVudGl0eVR5cGWUk5SMC2JvdF9jb21tYW5klIWUUpSMA3VybJROjAR1c2Vy\nlE5oG4hoHGhdSwBLBoeUaB59lHVihZSMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Ns\nb3NlZJROjBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1\nbV90b3BpY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROjAlmcm9tX3VzZXKUjA50ZWxlZ3Jh\nbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2FuX2Nvbm5l\nY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9ncm91cF9t\nZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdlX2NvZGWU\njAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGgefZR1YowE\nZ2FtZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVtX3RvcGlj\nX3VuaGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZlYXdheV9j\ncmVhdGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImMEWhhc19t\nZWRpYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6MFGlzX2F1\ndG9tYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNzYWdllE6M\nEGxlZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRpb26UTowO\nbWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRvX2RlbGV0ZV90aW1lcl9jaGFuZ2VklE6MEW1l\nc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJvbV9jaGF0X2lklE6MEm1pZ3JhdGVfdG9fY2hh\ndF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5ld19jaGF0X3Bob3RvlCmMDm5ld19jaGF0X3Rp\ndGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+UKYwOcGlubmVkX21lc3NhZ2WUTowEcG9sbJRO\njBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6MBXF1b3RllE6MDHJlcGx5X21hcmt1cJROjBBy\nZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6MEnNlbmRlcl9ib29zdF9jb3VudJRO\njBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0lE6MGHNob3dfY2FwdGlvbl9hYm92\nZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nlc3NmdWxfcGF5bWVudJROjBdzdXBl\ncmdyb3VwX2NoYXRfY3JlYXRlZJSJjAR0ZXh0lIwGL3N0YXJ0lIwMdXNlcnNfc2hhcmVklE6MBXZl\nbnVllE6MB3ZpYV9ib3SUTowFdmlkZW+UTowQdmlkZW9fY2hhdF9lbmRlZJROjB92aWRlb19jaGF0\nX3BhcnRpY2lwYW50c19pbnZpdGVklE6MFHZpZGVvX2NoYXRfc2NoZWR1bGVklE6MEnZpZGVvX2No\nYXRfc3RhcnRlZJROjAp2aWRlb19ub3RllE6MBXZvaWNllE6MDHdlYl9hcHBfZGF0YZROjBR3cml0\nZV9hY2Nlc3NfYWxsb3dlZJROjARjaGF0lGgJjARkYXRllIwIZGF0ZXRpbWWUjAhkYXRldGltZZST\nlEMKB+gFFRMJGAAAAJSMBHB5dHqUjARfVVRDlJOUKVKUhpRSlIwKbWVzc2FnZV9pZJRLA2gbiGgc\nSwNoCYaUaB59lHVijBBtZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSU\nTowObXlfY2hhdF9tZW1iZXKUTmiVTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5\nlE6MEnJlbW92ZWRfY2hhdF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSwNo\nG4hoHEsDhZRoHn2UdWIu\n" - }, - "response_message": { - "text": null, - "attachments": [ - { - "chatsky_attachment_type": "location", - "longitude": 27.792887, - "latitude": 58.43161, - "reply_markup": "gASV4gMAAAAAAACMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxp\nbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9p\nbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2U\nKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJs\nlE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hv\nc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1\ndGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTowHX2Zyb3plbpSIjAlfaWRfYXR0\ncnOUKGgUTk5oDE5OTk5OdJSMCmFwaV9rd2FyZ3OUfZR1YoWUaAgpgZR9lChoC4wLYXR0YWNobWVu\ndHOUaA1OaA5OaA9OaBBOaBFOaBJOaBOMFU11bHRpcGxlIGF0dGFjaG1lbnRzIZRoFU5oFk5oF4ho\nGChoIE5OaB9OTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAZzZWNyZXSUaA1OaA5OaA9OaBBOaBFO\naBJOaBOMDVNlY3JldCBpbWFnZSGUaBVOaBZOaBeIaBgoaCdOTmgmTk5OTk50lGgafZR1YoWUaAgp\ngZR9lChoC4wJdGh1bWJuYWlslGgNTmgOTmgPTmgQTmgRTmgSTmgTjBhEb2N1bWVudCB3aXRoIHRo\ndW1ibmFpbCGUaBVOaBZOaBeIaBgoaC5OTmgtTk5OTk50lGgafZR1YoWUaAgpgZR9lChoC4wEaGFz\naJRoDU5oDk5oD05oEE5oEU5oEk5oE4wcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRoFU5o\nFk5oF4hoGChoNU5OaDROTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAdyZXN0YXJ0lGgNTmgOTmgP\nTmgQTmgRTmgSTmgTjAhSZXN0YXJ0IZRoFU5oFk5oF4hoGChoPE5OaDtOTk5OTnSUaBp9lHViaAgp\ngZR9lChoC4wEcXVpdJRoDU5oDk5oD05oEE5oEU5oEk5oE4wFUXVpdCGUaBVOaBZOaBeIaBgoaEJO\nTmhBTk5OTk50lGgafZR1YoaUdJRoF4hoGGhGhZRoGn2UdWIu\n", - "__pickled_extra_fields__": [ - "reply_markup" - ] - } - ], - "annotations": null, - "misc": null, - "original_message": null - }, - "response_functions": [ - "send_location(42, 58.43161, 27.792887, horizontal_accuracy=None, disable_notification=None, protect_content=None, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), message_effect_id=None, reply_to_message_id=None)" - ] - }, - { - "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='attachments', from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='3', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 24, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=16, is_bot=True, username='chatsky_bot'), group_chat_created=False, location=Location(latitude=58.43162, longitude=27.792879), message_id=4, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), supergroup_chat_created=False)), update_id=4)", + "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='attachments', from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='3', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 24, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=16, is_bot=True, username='chatsky_bot'), group_chat_created=False, text='Welcome! Choose what you want to receive.', message_id=2, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'), InlineKeyboardButton(callback_data='secret', text='Secret image!'), InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), ))), supergroup_chat_created=False)), update_id=3)", "received_message": { "text": null, "attachments": [ @@ -563,10 +527,10 @@ ], "annotations": null, "misc": null, - "original_message": "gASV/g8AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjAthdHRhY2htZW50c5SMCWZyb21fdXNlcpSM\nDnRlbGVncmFtLl91c2VylGgQk5QpgZR9lCiMGGFkZGVkX3RvX2F0dGFjaG1lbnRfbWVudZROjBdj\nYW5fY29ubmVjdF90b19idXNpbmVzc5ROjA9jYW5fam9pbl9ncm91cHOUTowbY2FuX3JlYWRfYWxs\nX2dyb3VwX21lc3NhZ2VzlE5oC2gMaA1LKowGaXNfYm90lImMCmlzX3ByZW1pdW2UTowNbGFuZ3Vh\nZ2VfY29kZZSMAmVulGgPaBCMF3N1cHBvcnRzX2lubGluZV9xdWVyaWVzlE5oGWgaaBuIaBxLKoWU\naB59lHVijA9nYW1lX3Nob3J0X25hbWWUTmgNjAEzlIwRaW5saW5lX21lc3NhZ2VfaWSUTowHbWVz\nc2FnZZSMEXRlbGVncmFtLl9tZXNzYWdllIwHTWVzc2FnZZSTlCmBlH2UKIwVX2VmZmVjdGl2ZV9h\ndHRhY2htZW50lIwcdGVsZWdyYW0uX3V0aWxzLmRlZmF1bHR2YWx1ZZSMDERlZmF1bHRWYWx1ZZST\nlCmBlE59lIwFdmFsdWWUTnOGlGKMCWFuaW1hdGlvbpROjAVhdWRpb5ROjBBhdXRob3Jfc2lnbmF0\ndXJllE6MC2Jvb3N0X2FkZGVklE6MFmJ1c2luZXNzX2Nvbm5lY3Rpb25faWSUTowHY2FwdGlvbpRO\njBBjYXB0aW9uX2VudGl0aWVzlCmMFGNoYW5uZWxfY2hhdF9jcmVhdGVklImME2NoYXRfYmFja2dy\nb3VuZF9zZXSUTowLY2hhdF9zaGFyZWSUTowRY29ubmVjdGVkX3dlYnNpdGWUTowHY29udGFjdJRO\njBFkZWxldGVfY2hhdF9waG90b5SJjARkaWNllE6MCGRvY3VtZW50lE6MCWVkaXRfZGF0ZZROjAll\nZmZlY3RfaWSUTowIZW50aXRpZXOUKYwOZXh0ZXJuYWxfcmVwbHmUTowSZm9ydW1fdG9waWNfY2xv\nc2VklE6ME2ZvcnVtX3RvcGljX2NyZWF0ZWSUTowSZm9ydW1fdG9waWNfZWRpdGVklE6MFGZvcnVt\nX3RvcGljX3Jlb3BlbmVklE6MDmZvcndhcmRfb3JpZ2lulE5oL2gxKYGUfZQoaDROaDVOaDZOaDdO\naAuMA0JvdJRoDUsQaDiIaDlOaDpOaA9OaDxOaBmMC2NoYXRza3lfYm90lGgbiGgcSxCFlGgefZR1\nYowEZ2FtZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVtX3Rv\ncGljX3VuaGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZlYXdh\neV9jcmVhdGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImMEWhh\nc19tZWRpYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6MFGlz\nX2F1dG9tYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNzYWdl\nlE6MEGxlZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRpb26U\njBh0ZWxlZ3JhbS5fZmlsZXMubG9jYXRpb26UjAhMb2NhdGlvbpSTlCmBlH2UKIwHaGVhZGluZ5RO\njBNob3Jpem9udGFsX2FjY3VyYWN5lE6MCGxhdGl0dWRllEdATTc/UvwmV4wLbGl2ZV9wZXJpb2SU\nTowJbG9uZ2l0dWRllEdAO8r6Hj6vaIwWcHJveGltaXR5X2FsZXJ0X3JhZGl1c5ROaBuIaBxHQDvK\n+h4+r2hHQE03P1L8JleGlGgefZR1YowObWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRvX2Rl\nbGV0ZV90aW1lcl9jaGFuZ2VklE6MEW1lc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJvbV9j\naGF0X2lklE6MEm1pZ3JhdGVfdG9fY2hhdF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5ld19j\naGF0X3Bob3RvlCmMDm5ld19jaGF0X3RpdGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+UKYwO\ncGlubmVkX21lc3NhZ2WUTowEcG9sbJROjBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6MBXF1\nb3RllE6MDHJlcGx5X21hcmt1cJSMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJr\ndXCUjBRJbmxpbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRl\nbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRv\nbpSTlCmBlH2UKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJ\nbG9naW5fdXJslE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVf\ncXVlcnlfY2hvc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowE\ndGV4dJSMFEN1dGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTmgbiGgcKGivTk5o\np05OTk5OdJRoHn2UdWKFlGijKYGUfZQoaKZoLmioTmipTmiqTmirTmisTmitTmiujBVNdWx0aXBs\nZSBhdHRhY2htZW50cyGUaLBOaLFOaBuIaBwoaLdOTmguTk5OTk50lGgefZR1YoWUaKMpgZR9lCho\npowGc2VjcmV0lGioTmipTmiqTmirTmisTmitTmiujA1TZWNyZXQgaW1hZ2UhlGiwTmixTmgbiGgc\nKGi+Tk5ovU5OTk5OdJRoHn2UdWKFlGijKYGUfZQoaKaMCXRodW1ibmFpbJRoqE5oqU5oqk5oq05o\nrE5orU5orowYRG9jdW1lbnQgd2l0aCB0aHVtYm5haWwhlGiwTmixTmgbiGgcKGjFTk5oxE5OTk5O\ndJRoHn2UdWKFlGijKYGUfZQoaKaMBGhhc2iUaKhOaKlOaKpOaKtOaKxOaK1OaK6MHEZpcnN0IGF0\ndGFjaG1lbnQgYnl0ZXMgaGFzaCGUaLBOaLFOaBuIaBwoaMxOTmjLTk5OTk50lGgefZR1YoWUaKMp\ngZR9lChopowHcmVzdGFydJRoqE5oqU5oqk5oq05orE5orU5orowIUmVzdGFydCGUaLBOaLFOaBuI\naBwoaNNOTmjSTk5OTk50lGgefZR1YmijKYGUfZQoaKaMBHF1aXSUaKhOaKlOaKpOaKtOaKxOaK1O\naK6MBVF1aXQhlGiwTmixTmgbiGgcKGjZTk5o2E5OTk5OdJRoHn2UdWKGlHSUaBuIaBxo3YWUaB59\nlHVijBByZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6MEnNlbmRlcl9ib29zdF9j\nb3VudJROjBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0lE6MGHNob3dfY2FwdGlv\nbl9hYm92ZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nlc3NmdWxfcGF5bWVudJRO\njBdzdXBlcmdyb3VwX2NoYXRfY3JlYXRlZJSJaK5OjAx1c2Vyc19zaGFyZWSUTowFdmVudWWUTowH\ndmlhX2JvdJROjAV2aWRlb5ROjBB2aWRlb19jaGF0X2VuZGVklE6MH3ZpZGVvX2NoYXRfcGFydGlj\naXBhbnRzX2ludml0ZWSUTowUdmlkZW9fY2hhdF9zY2hlZHVsZWSUTowSdmlkZW9fY2hhdF9zdGFy\ndGVklE6MCnZpZGVvX25vdGWUTowFdm9pY2WUTowMd2ViX2FwcF9kYXRhlE6MFHdyaXRlX2FjY2Vz\nc19hbGxvd2VklE6MBGNoYXSUaAmMBGRhdGWUjAhkYXRldGltZZSMCGRhdGV0aW1llJOUQwoH6AUV\nEwkYAAAAlIwEcHl0epSMBF9VVEOUk5QpUpSGlFKUjAptZXNzYWdlX2lklEsEaBuIaBxLBGgJhpRo\nHn2UdWJoG4hoHGhAhZRoHn2UdWKMDGNoYW5uZWxfcG9zdJROjApjaGF0X2Jvb3N0lE6MEWNoYXRf\nam9pbl9yZXF1ZXN0lE6MC2NoYXRfbWVtYmVylE6MFGNob3Nlbl9pbmxpbmVfcmVzdWx0lE6MGWRl\nbGV0ZWRfYnVzaW5lc3NfbWVzc2FnZXOUTowXZWRpdGVkX2J1c2luZXNzX21lc3NhZ2WUTowTZWRp\ndGVkX2NoYW5uZWxfcG9zdJROjA5lZGl0ZWRfbWVzc2FnZZROjAxpbmxpbmVfcXVlcnmUTmhCTowQ\nbWVzc2FnZV9yZWFjdGlvbpROjBZtZXNzYWdlX3JlYWN0aW9uX2NvdW50lE6MDm15X2NoYXRfbWVt\nYmVylE5ol06MC3BvbGxfYW5zd2VylE6MEnByZV9jaGVja291dF9xdWVyeZROjBJyZW1vdmVkX2No\nYXRfYm9vc3SUTowOc2hpcHBpbmdfcXVlcnmUTowJdXBkYXRlX2lklEsEaBuIaBxLBIWUaB59lHVi\nLg==\n" + "original_message": "gASVGQ8AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjAthdHRhY2htZW50c5SMCWZyb21fdXNlcpSM\nDnRlbGVncmFtLl91c2VylGgQk5QpgZR9lCiMGGFkZGVkX3RvX2F0dGFjaG1lbnRfbWVudZROjBdj\nYW5fY29ubmVjdF90b19idXNpbmVzc5ROjA9jYW5fam9pbl9ncm91cHOUTowbY2FuX3JlYWRfYWxs\nX2dyb3VwX21lc3NhZ2VzlE5oC2gMaA1LKowGaXNfYm90lImMCmlzX3ByZW1pdW2UTowNbGFuZ3Vh\nZ2VfY29kZZSMAmVulGgPaBCMF3N1cHBvcnRzX2lubGluZV9xdWVyaWVzlE5oGWgaaBuIaBxLKoWU\naB59lHVijA9nYW1lX3Nob3J0X25hbWWUTmgNjAEzlIwRaW5saW5lX21lc3NhZ2VfaWSUTowHbWVz\nc2FnZZSMEXRlbGVncmFtLl9tZXNzYWdllIwHTWVzc2FnZZSTlCmBlH2UKIwVX2VmZmVjdGl2ZV9h\ndHRhY2htZW50lIwcdGVsZWdyYW0uX3V0aWxzLmRlZmF1bHR2YWx1ZZSMDERlZmF1bHRWYWx1ZZST\nlCmBlE59lIwFdmFsdWWUTnOGlGKMCWFuaW1hdGlvbpROjAVhdWRpb5ROjBBhdXRob3Jfc2lnbmF0\ndXJllE6MC2Jvb3N0X2FkZGVklE6MFmJ1c2luZXNzX2Nvbm5lY3Rpb25faWSUTowHY2FwdGlvbpRO\njBBjYXB0aW9uX2VudGl0aWVzlCmMFGNoYW5uZWxfY2hhdF9jcmVhdGVklImME2NoYXRfYmFja2dy\nb3VuZF9zZXSUTowLY2hhdF9zaGFyZWSUTowRY29ubmVjdGVkX3dlYnNpdGWUTowHY29udGFjdJRO\njBFkZWxldGVfY2hhdF9waG90b5SJjARkaWNllE6MCGRvY3VtZW50lE6MCWVkaXRfZGF0ZZROjAll\nZmZlY3RfaWSUTowIZW50aXRpZXOUKYwOZXh0ZXJuYWxfcmVwbHmUTowSZm9ydW1fdG9waWNfY2xv\nc2VklE6ME2ZvcnVtX3RvcGljX2NyZWF0ZWSUTowSZm9ydW1fdG9waWNfZWRpdGVklE6MFGZvcnVt\nX3RvcGljX3Jlb3BlbmVklE6MDmZvcndhcmRfb3JpZ2lulE5oL2gxKYGUfZQoaDROaDVOaDZOaDdO\naAuMA0JvdJRoDUsQaDiIaDlOaDpOaA9OaDxOaBmMC2NoYXRza3lfYm90lGgbiGgcSxCFlGgefZR1\nYowEZ2FtZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVtX3Rv\ncGljX3VuaGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZlYXdh\neV9jcmVhdGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImMEWhh\nc19tZWRpYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6MFGlz\nX2F1dG9tYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNzYWdl\nlE6MEGxlZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRpb26U\nTowObWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRvX2RlbGV0ZV90aW1lcl9jaGFuZ2VklE6M\nEW1lc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJvbV9jaGF0X2lklE6MEm1pZ3JhdGVfdG9f\nY2hhdF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5ld19jaGF0X3Bob3RvlCmMDm5ld19jaGF0\nX3RpdGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+UKYwOcGlubmVkX21lc3NhZ2WUTowEcG9s\nbJROjBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6MBXF1b3RllE6MDHJlcGx5X21hcmt1cJSM\nJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxpbmVLZXlib2FyZE1h\ncmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5l\na2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2UKIwNY2FsbGJhY2tf\nZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJslE6MA3BheZROjBNz\nd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hvc2VuX2NoYXSUTowg\nc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1dGUgZm9ybWF0dGVk\nIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTmgbiGgcKGiiTk5omk5OTk5OdJRoHn2UdWKFlGiWKYGU\nfZQoaJloLmibTmicTmidTmieTmifTmigTmihjBVNdWx0aXBsZSBhdHRhY2htZW50cyGUaKNOaKRO\naBuIaBwoaKpOTmguTk5OTk50lGgefZR1YmiWKYGUfZQoaJmMBnNlY3JldJRom05onE5onU5onk5o\nn05ooE5ooYwNU2VjcmV0IGltYWdlIZRoo05opE5oG4hoHChosE5OaK9OTk5OTnSUaB59lHViaJYp\ngZR9lChomYwJdGh1bWJuYWlslGibTmicTmidTmieTmifTmigTmihjBhEb2N1bWVudCB3aXRoIHRo\ndW1ibmFpbCGUaKNOaKROaBuIaBwoaLZOTmi1Tk5OTk50lGgefZR1YoeUaJYpgZR9lChomYwEaGFz\naJRom05onE5onU5onk5on05ooE5ooYwcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRoo05o\npE5oG4hoHChovU5OaLxOTk5OTnSUaB59lHVihZRolimBlH2UKGiZjAdyZXN0YXJ0lGibTmicTmid\nTmieTmifTmigTmihjAhSZXN0YXJ0IZRoo05opE5oG4hoHChoxE5OaMNOTk5OTnSUaB59lHVihZR0\nlGgbiGgcaMiFlGgefZR1YowQcmVwbHlfdG9fbWVzc2FnZZROjA5yZXBseV90b19zdG9yeZROjBJz\nZW5kZXJfYm9vc3RfY291bnSUTowTc2VuZGVyX2J1c2luZXNzX2JvdJROjAtzZW5kZXJfY2hhdJRO\njBhzaG93X2NhcHRpb25fYWJvdmVfbWVkaWGUTowHc3RpY2tlcpROjAVzdG9yeZROjBJzdWNjZXNz\nZnVsX3BheW1lbnSUTowXc3VwZXJncm91cF9jaGF0X2NyZWF0ZWSUiWihjClXZWxjb21lISBDaG9v\nc2Ugd2hhdCB5b3Ugd2FudCB0byByZWNlaXZlLpSMDHVzZXJzX3NoYXJlZJROjAV2ZW51ZZROjAd2\naWFfYm90lE6MBXZpZGVvlE6MEHZpZGVvX2NoYXRfZW5kZWSUTowfdmlkZW9fY2hhdF9wYXJ0aWNp\ncGFudHNfaW52aXRlZJROjBR2aWRlb19jaGF0X3NjaGVkdWxlZJROjBJ2aWRlb19jaGF0X3N0YXJ0\nZWSUTowKdmlkZW9fbm90ZZROjAV2b2ljZZROjAx3ZWJfYXBwX2RhdGGUTowUd3JpdGVfYWNjZXNz\nX2FsbG93ZWSUTowEY2hhdJRoCYwEZGF0ZZSMCGRhdGV0aW1llIwIZGF0ZXRpbWWUk5RDCgfoBRUT\nCRgAAACUjARweXR6lIwEX1VUQ5STlClSlIaUUpSMCm1lc3NhZ2VfaWSUSwJoG4hoHEsCaAmGlGge\nfZR1YmgbiGgcaECFlGgefZR1YowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9q\nb2luX3JlcXVlc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVs\nZXRlZF9idXNpbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0\nZWRfY2hhbm5lbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROaEJOjBBt\nZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSUTowObXlfY2hhdF9tZW1i\nZXKUTmiKTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5lE6MEnJlbW92ZWRfY2hh\ndF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSwNoG4hoHEsDhZRoHn2UdWIu\n" }, "response_message": { - "text": "Here's your message with multiple attachments (a location and a sticker)!\nRun /start command again to restart.", + "text": "Here's your message with multiple attachments (a location and a sticker)!", "attachments": [ { "chatsky_attachment_type": "location", @@ -586,43 +550,13 @@ "original_message": null }, "response_functions": [ - "send_message(42, \"Here's your message with multiple attachments (a location and a sticker)!\\nRun /start command again to restart.\", parse_mode=None, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)", + "send_message(42, \"Here's your message with multiple attachments (a location and a sticker)!\", parse_mode=None, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)", "send_location(42, 59.9386, 30.3141, horizontal_accuracy=None, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None)", "send_sticker(42, 'CAACAgIAAxkBAAErBZ1mKAbZvEOmhscojaIL5q0u8vgp1wACRygAAiSjCUtLa7RHZy76ezQE', emoji=None, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None)" ] }, { - "update": "Update(message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 28, tzinfo=UTC), delete_chat_photo=False, entities=(MessageEntity(length=6, offset=0, type=MessageEntityType.BOT_COMMAND),), from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), group_chat_created=False, message_id=5, supergroup_chat_created=False, text='/start'), update_id=5)", - "received_message": { - "text": "/start", - "attachments": [], - "annotations": null, - "misc": null, - "original_message": "gASVXwsAAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUTowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9qb2luX3JlcXVl\nc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVsZXRlZF9idXNp\nbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5l\nbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROjAdtZXNzYWdllIwRdGVs\nZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1lbnSU\njBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2UjAV2\nYWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowLYm9v\nc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRpb25f\nZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3NldJRO\njAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0ZV9j\naGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9pZJRO\njAhlbnRpdGllc5SMF3RlbGVncmFtLl9tZXNzYWdlZW50aXR5lIwNTWVzc2FnZUVudGl0eZSTlCmB\nlH2UKIwPY3VzdG9tX2Vtb2ppX2lklE6MCGxhbmd1YWdllE6MBmxlbmd0aJRLBowGb2Zmc2V0lEsA\naBJoE4wRTWVzc2FnZUVudGl0eVR5cGWUk5SMC2JvdF9jb21tYW5klIWUUpSMA3VybJROjAR1c2Vy\nlE5oG4hoHGhdSwBLBoeUaB59lHVihZSMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Ns\nb3NlZJROjBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1\nbV90b3BpY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROjAlmcm9tX3VzZXKUjA50ZWxlZ3Jh\nbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2FuX2Nvbm5l\nY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9ncm91cF9t\nZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdlX2NvZGWU\njAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGgefZR1YowE\nZ2FtZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVtX3RvcGlj\nX3VuaGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZlYXdheV9j\ncmVhdGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImMEWhhc19t\nZWRpYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6MFGlzX2F1\ndG9tYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNzYWdllE6M\nEGxlZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRpb26UTowO\nbWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRvX2RlbGV0ZV90aW1lcl9jaGFuZ2VklE6MEW1l\nc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJvbV9jaGF0X2lklE6MEm1pZ3JhdGVfdG9fY2hh\ndF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5ld19jaGF0X3Bob3RvlCmMDm5ld19jaGF0X3Rp\ndGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+UKYwOcGlubmVkX21lc3NhZ2WUTowEcG9sbJRO\njBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6MBXF1b3RllE6MDHJlcGx5X21hcmt1cJROjBBy\nZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6MEnNlbmRlcl9ib29zdF9jb3VudJRO\njBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0lE6MGHNob3dfY2FwdGlvbl9hYm92\nZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nlc3NmdWxfcGF5bWVudJROjBdzdXBl\ncmdyb3VwX2NoYXRfY3JlYXRlZJSJjAR0ZXh0lIwGL3N0YXJ0lIwMdXNlcnNfc2hhcmVklE6MBXZl\nbnVllE6MB3ZpYV9ib3SUTowFdmlkZW+UTowQdmlkZW9fY2hhdF9lbmRlZJROjB92aWRlb19jaGF0\nX3BhcnRpY2lwYW50c19pbnZpdGVklE6MFHZpZGVvX2NoYXRfc2NoZWR1bGVklE6MEnZpZGVvX2No\nYXRfc3RhcnRlZJROjAp2aWRlb19ub3RllE6MBXZvaWNllE6MDHdlYl9hcHBfZGF0YZROjBR3cml0\nZV9hY2Nlc3NfYWxsb3dlZJROjARjaGF0lGgJjARkYXRllIwIZGF0ZXRpbWWUjAhkYXRldGltZZST\nlEMKB+gFFRMJHAAAAJSMBHB5dHqUjARfVVRDlJOUKVKUhpRSlIwKbWVzc2FnZV9pZJRLBWgbiGgc\nSwVoCYaUaB59lHVijBBtZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSU\nTowObXlfY2hhdF9tZW1iZXKUTmiVTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5\nlE6MEnJlbW92ZWRfY2hhdF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSwVo\nG4hoHEsFhZRoHn2UdWIu\n" - }, - "response_message": { - "text": null, - "attachments": [ - { - "chatsky_attachment_type": "location", - "longitude": 27.792887, - "latitude": 58.43161, - "reply_markup": "gASV4gMAAAAAAACMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxp\nbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9p\nbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2U\nKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJs\nlE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hv\nc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1\ndGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTowHX2Zyb3plbpSIjAlfaWRfYXR0\ncnOUKGgUTk5oDE5OTk5OdJSMCmFwaV9rd2FyZ3OUfZR1YoWUaAgpgZR9lChoC4wLYXR0YWNobWVu\ndHOUaA1OaA5OaA9OaBBOaBFOaBJOaBOMFU11bHRpcGxlIGF0dGFjaG1lbnRzIZRoFU5oFk5oF4ho\nGChoIE5OaB9OTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAZzZWNyZXSUaA1OaA5OaA9OaBBOaBFO\naBJOaBOMDVNlY3JldCBpbWFnZSGUaBVOaBZOaBeIaBgoaCdOTmgmTk5OTk50lGgafZR1YoWUaAgp\ngZR9lChoC4wJdGh1bWJuYWlslGgNTmgOTmgPTmgQTmgRTmgSTmgTjBhEb2N1bWVudCB3aXRoIHRo\ndW1ibmFpbCGUaBVOaBZOaBeIaBgoaC5OTmgtTk5OTk50lGgafZR1YoWUaAgpgZR9lChoC4wEaGFz\naJRoDU5oDk5oD05oEE5oEU5oEk5oE4wcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRoFU5o\nFk5oF4hoGChoNU5OaDROTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAdyZXN0YXJ0lGgNTmgOTmgP\nTmgQTmgRTmgSTmgTjAhSZXN0YXJ0IZRoFU5oFk5oF4hoGChoPE5OaDtOTk5OTnSUaBp9lHViaAgp\ngZR9lChoC4wEcXVpdJRoDU5oDk5oD05oEE5oEU5oEk5oE4wFUXVpdCGUaBVOaBZOaBeIaBgoaEJO\nTmhBTk5OTk50lGgafZR1YoaUdJRoF4hoGGhGhZRoGn2UdWIu\n", - "__pickled_extra_fields__": [ - "reply_markup" - ] - } - ], - "annotations": null, - "misc": null, - "original_message": null - }, - "response_functions": [ - "send_location(42, 58.43161, 27.792887, horizontal_accuracy=None, disable_notification=None, protect_content=None, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), message_effect_id=None, reply_to_message_id=None)" - ] - }, - { - "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='secret', from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='5', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 28, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=16, is_bot=True, username='chatsky_bot'), group_chat_created=False, location=Location(latitude=58.43162, longitude=27.792879), message_id=6, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), supergroup_chat_created=False)), update_id=6)", + "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='secret', from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='5', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 28, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=16, is_bot=True, username='chatsky_bot'), group_chat_created=False, text='Welcome! Choose what you want to receive.', message_id=2, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'), InlineKeyboardButton(callback_data='secret', text='Secret image!'), InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), ))), supergroup_chat_created=False)), update_id=4)", "received_message": { "text": null, "attachments": [ @@ -633,10 +567,10 @@ ], "annotations": null, "misc": null, - "original_message": "gASV/g8AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjAZzZWNyZXSUjAlmcm9tX3VzZXKUjA50ZWxl\nZ3JhbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2FuX2Nv\nbm5lY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9ncm91\ncF9tZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdlX2Nv\nZGWUjAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGgefZR1\nYowPZ2FtZV9zaG9ydF9uYW1llE5oDYwBNZSMEWlubGluZV9tZXNzYWdlX2lklE6MB21lc3NhZ2WU\njBF0ZWxlZ3JhbS5fbWVzc2FnZZSMB01lc3NhZ2WUk5QpgZR9lCiMFV9lZmZlY3RpdmVfYXR0YWNo\nbWVudJSMHHRlbGVncmFtLl91dGlscy5kZWZhdWx0dmFsdWWUjAxEZWZhdWx0VmFsdWWUk5QpgZRO\nfZSMBXZhbHVllE5zhpRijAlhbmltYXRpb26UTowFYXVkaW+UTowQYXV0aG9yX3NpZ25hdHVyZZRO\njAtib29zdF9hZGRlZJROjBZidXNpbmVzc19jb25uZWN0aW9uX2lklE6MB2NhcHRpb26UTowQY2Fw\ndGlvbl9lbnRpdGllc5QpjBRjaGFubmVsX2NoYXRfY3JlYXRlZJSJjBNjaGF0X2JhY2tncm91bmRf\nc2V0lE6MC2NoYXRfc2hhcmVklE6MEWNvbm5lY3RlZF93ZWJzaXRllE6MB2NvbnRhY3SUTowRZGVs\nZXRlX2NoYXRfcGhvdG+UiYwEZGljZZROjAhkb2N1bWVudJROjAllZGl0X2RhdGWUTowJZWZmZWN0\nX2lklE6MCGVudGl0aWVzlCmMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Nsb3NlZJRO\njBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1bV90b3Bp\nY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROaC9oMSmBlH2UKGg0Tmg1Tmg2Tmg3TmgLjANC\nb3SUaA1LEGg4iGg5Tmg6TmgPTmg8TmgZjAtjaGF0c2t5X2JvdJRoG4hoHEsQhZRoHn2UdWKMBGdh\nbWWUTowaZ2VuZXJhbF9mb3J1bV90b3BpY19oaWRkZW6UTowcZ2VuZXJhbF9mb3J1bV90b3BpY191\nbmhpZGRlbpROjAhnaXZlYXdheZROjBJnaXZlYXdheV9jb21wbGV0ZWSUTowQZ2l2ZWF3YXlfY3Jl\nYXRlZJROjBBnaXZlYXdheV93aW5uZXJzlE6MEmdyb3VwX2NoYXRfY3JlYXRlZJSJjBFoYXNfbWVk\naWFfc3BvaWxlcpROjBVoYXNfcHJvdGVjdGVkX2NvbnRlbnSUTowHaW52b2ljZZROjBRpc19hdXRv\nbWF0aWNfZm9yd2FyZJROjA9pc19mcm9tX29mZmxpbmWUTowQaXNfdG9waWNfbWVzc2FnZZROjBBs\nZWZ0X2NoYXRfbWVtYmVylE6MFGxpbmtfcHJldmlld19vcHRpb25zlE6MCGxvY2F0aW9ulIwYdGVs\nZWdyYW0uX2ZpbGVzLmxvY2F0aW9ulIwITG9jYXRpb26Uk5QpgZR9lCiMB2hlYWRpbmeUTowTaG9y\naXpvbnRhbF9hY2N1cmFjeZROjAhsYXRpdHVkZZRHQE03P1L8JleMC2xpdmVfcGVyaW9klE6MCWxv\nbmdpdHVkZZRHQDvK+h4+r2iMFnByb3hpbWl0eV9hbGVydF9yYWRpdXOUTmgbiGgcR0A7yvoePq9o\nR0BNNz9S/CZXhpRoHn2UdWKMDm1lZGlhX2dyb3VwX2lklE6MIW1lc3NhZ2VfYXV0b19kZWxldGVf\ndGltZXJfY2hhbmdlZJROjBFtZXNzYWdlX3RocmVhZF9pZJROjBRtaWdyYXRlX2Zyb21fY2hhdF9p\nZJROjBJtaWdyYXRlX3RvX2NoYXRfaWSUTowQbmV3X2NoYXRfbWVtYmVyc5QpjA5uZXdfY2hhdF9w\naG90b5QpjA5uZXdfY2hhdF90aXRsZZROjA1wYXNzcG9ydF9kYXRhlE6MBXBob3RvlCmMDnBpbm5l\nZF9tZXNzYWdllE6MBHBvbGyUTowZcHJveGltaXR5X2FsZXJ0X3RyaWdnZXJlZJROjAVxdW90ZZRO\njAxyZXBseV9tYXJrdXCUjCV0ZWxlZ3JhbS5faW5saW5lLmlubGluZWtleWJvYXJkbWFya3VwlIwU\nSW5saW5lS2V5Ym9hcmRNYXJrdXCUk5QpgZR9lCiMD2lubGluZV9rZXlib2FyZJQojCV0ZWxlZ3Jh\nbS5faW5saW5lLmlubGluZWtleWJvYXJkYnV0dG9ulIwUSW5saW5lS2V5Ym9hcmRCdXR0b26Uk5Qp\ngZR9lCiMDWNhbGxiYWNrX2RhdGGUjAlmb3JtYXR0ZWSUjA1jYWxsYmFja19nYW1llE6MCWxvZ2lu\nX3VybJROjANwYXmUTowTc3dpdGNoX2lubGluZV9xdWVyeZROjB9zd2l0Y2hfaW5saW5lX3F1ZXJ5\nX2Nob3Nlbl9jaGF0lE6MIHN3aXRjaF9pbmxpbmVfcXVlcnlfY3VycmVudF9jaGF0lE6MBHRleHSU\njBRDdXRlIGZvcm1hdHRlZCB0ZXh0IZSMA3VybJROjAd3ZWJfYXBwlE5oG4hoHChor05OaKdOTk5O\nTnSUaB59lHVihZRooymBlH2UKGimjAthdHRhY2htZW50c5RoqE5oqU5oqk5oq05orE5orU5orowV\nTXVsdGlwbGUgYXR0YWNobWVudHMhlGiwTmixTmgbiGgcKGi4Tk5ot05OTk5OdJRoHn2UdWKFlGij\nKYGUfZQoaKZoLmioTmipTmiqTmirTmisTmitTmiujA1TZWNyZXQgaW1hZ2UhlGiwTmixTmgbiGgc\nKGi+Tk5oLk5OTk5OdJRoHn2UdWKFlGijKYGUfZQoaKaMCXRodW1ibmFpbJRoqE5oqU5oqk5oq05o\nrE5orU5orowYRG9jdW1lbnQgd2l0aCB0aHVtYm5haWwhlGiwTmixTmgbiGgcKGjFTk5oxE5OTk5O\ndJRoHn2UdWKFlGijKYGUfZQoaKaMBGhhc2iUaKhOaKlOaKpOaKtOaKxOaK1OaK6MHEZpcnN0IGF0\ndGFjaG1lbnQgYnl0ZXMgaGFzaCGUaLBOaLFOaBuIaBwoaMxOTmjLTk5OTk50lGgefZR1YoWUaKMp\ngZR9lChopowHcmVzdGFydJRoqE5oqU5oqk5oq05orE5orU5orowIUmVzdGFydCGUaLBOaLFOaBuI\naBwoaNNOTmjSTk5OTk50lGgefZR1YmijKYGUfZQoaKaMBHF1aXSUaKhOaKlOaKpOaKtOaKxOaK1O\naK6MBVF1aXQhlGiwTmixTmgbiGgcKGjZTk5o2E5OTk5OdJRoHn2UdWKGlHSUaBuIaBxo3YWUaB59\nlHVijBByZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6MEnNlbmRlcl9ib29zdF9j\nb3VudJROjBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0lE6MGHNob3dfY2FwdGlv\nbl9hYm92ZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nlc3NmdWxfcGF5bWVudJRO\njBdzdXBlcmdyb3VwX2NoYXRfY3JlYXRlZJSJaK5OjAx1c2Vyc19zaGFyZWSUTowFdmVudWWUTowH\ndmlhX2JvdJROjAV2aWRlb5ROjBB2aWRlb19jaGF0X2VuZGVklE6MH3ZpZGVvX2NoYXRfcGFydGlj\naXBhbnRzX2ludml0ZWSUTowUdmlkZW9fY2hhdF9zY2hlZHVsZWSUTowSdmlkZW9fY2hhdF9zdGFy\ndGVklE6MCnZpZGVvX25vdGWUTowFdm9pY2WUTowMd2ViX2FwcF9kYXRhlE6MFHdyaXRlX2FjY2Vz\nc19hbGxvd2VklE6MBGNoYXSUaAmMBGRhdGWUjAhkYXRldGltZZSMCGRhdGV0aW1llJOUQwoH6AUV\nEwkcAAAAlIwEcHl0epSMBF9VVEOUk5QpUpSGlFKUjAptZXNzYWdlX2lklEsGaBuIaBxLBmgJhpRo\nHn2UdWJoG4hoHGhAhZRoHn2UdWKMDGNoYW5uZWxfcG9zdJROjApjaGF0X2Jvb3N0lE6MEWNoYXRf\nam9pbl9yZXF1ZXN0lE6MC2NoYXRfbWVtYmVylE6MFGNob3Nlbl9pbmxpbmVfcmVzdWx0lE6MGWRl\nbGV0ZWRfYnVzaW5lc3NfbWVzc2FnZXOUTowXZWRpdGVkX2J1c2luZXNzX21lc3NhZ2WUTowTZWRp\ndGVkX2NoYW5uZWxfcG9zdJROjA5lZGl0ZWRfbWVzc2FnZZROjAxpbmxpbmVfcXVlcnmUTmhCTowQ\nbWVzc2FnZV9yZWFjdGlvbpROjBZtZXNzYWdlX3JlYWN0aW9uX2NvdW50lE6MDm15X2NoYXRfbWVt\nYmVylE5ol06MC3BvbGxfYW5zd2VylE6MEnByZV9jaGVja291dF9xdWVyeZROjBJyZW1vdmVkX2No\nYXRfYm9vc3SUTowOc2hpcHBpbmdfcXVlcnmUTowJdXBkYXRlX2lklEsGaBuIaBxLBoWUaB59lHVi\nLg==\n" + "original_message": "gASVGQ8AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjAZzZWNyZXSUjAlmcm9tX3VzZXKUjA50ZWxl\nZ3JhbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2FuX2Nv\nbm5lY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9ncm91\ncF9tZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdlX2Nv\nZGWUjAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGgefZR1\nYowPZ2FtZV9zaG9ydF9uYW1llE5oDYwBNZSMEWlubGluZV9tZXNzYWdlX2lklE6MB21lc3NhZ2WU\njBF0ZWxlZ3JhbS5fbWVzc2FnZZSMB01lc3NhZ2WUk5QpgZR9lCiMFV9lZmZlY3RpdmVfYXR0YWNo\nbWVudJSMHHRlbGVncmFtLl91dGlscy5kZWZhdWx0dmFsdWWUjAxEZWZhdWx0VmFsdWWUk5QpgZRO\nfZSMBXZhbHVllE5zhpRijAlhbmltYXRpb26UTowFYXVkaW+UTowQYXV0aG9yX3NpZ25hdHVyZZRO\njAtib29zdF9hZGRlZJROjBZidXNpbmVzc19jb25uZWN0aW9uX2lklE6MB2NhcHRpb26UTowQY2Fw\ndGlvbl9lbnRpdGllc5QpjBRjaGFubmVsX2NoYXRfY3JlYXRlZJSJjBNjaGF0X2JhY2tncm91bmRf\nc2V0lE6MC2NoYXRfc2hhcmVklE6MEWNvbm5lY3RlZF93ZWJzaXRllE6MB2NvbnRhY3SUTowRZGVs\nZXRlX2NoYXRfcGhvdG+UiYwEZGljZZROjAhkb2N1bWVudJROjAllZGl0X2RhdGWUTowJZWZmZWN0\nX2lklE6MCGVudGl0aWVzlCmMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Nsb3NlZJRO\njBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1bV90b3Bp\nY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROaC9oMSmBlH2UKGg0Tmg1Tmg2Tmg3TmgLjANC\nb3SUaA1LEGg4iGg5Tmg6TmgPTmg8TmgZjAtjaGF0c2t5X2JvdJRoG4hoHEsQhZRoHn2UdWKMBGdh\nbWWUTowaZ2VuZXJhbF9mb3J1bV90b3BpY19oaWRkZW6UTowcZ2VuZXJhbF9mb3J1bV90b3BpY191\nbmhpZGRlbpROjAhnaXZlYXdheZROjBJnaXZlYXdheV9jb21wbGV0ZWSUTowQZ2l2ZWF3YXlfY3Jl\nYXRlZJROjBBnaXZlYXdheV93aW5uZXJzlE6MEmdyb3VwX2NoYXRfY3JlYXRlZJSJjBFoYXNfbWVk\naWFfc3BvaWxlcpROjBVoYXNfcHJvdGVjdGVkX2NvbnRlbnSUTowHaW52b2ljZZROjBRpc19hdXRv\nbWF0aWNfZm9yd2FyZJROjA9pc19mcm9tX29mZmxpbmWUTowQaXNfdG9waWNfbWVzc2FnZZROjBBs\nZWZ0X2NoYXRfbWVtYmVylE6MFGxpbmtfcHJldmlld19vcHRpb25zlE6MCGxvY2F0aW9ulE6MDm1l\nZGlhX2dyb3VwX2lklE6MIW1lc3NhZ2VfYXV0b19kZWxldGVfdGltZXJfY2hhbmdlZJROjBFtZXNz\nYWdlX3RocmVhZF9pZJROjBRtaWdyYXRlX2Zyb21fY2hhdF9pZJROjBJtaWdyYXRlX3RvX2NoYXRf\naWSUTowQbmV3X2NoYXRfbWVtYmVyc5QpjA5uZXdfY2hhdF9waG90b5QpjA5uZXdfY2hhdF90aXRs\nZZROjA1wYXNzcG9ydF9kYXRhlE6MBXBob3RvlCmMDnBpbm5lZF9tZXNzYWdllE6MBHBvbGyUTowZ\ncHJveGltaXR5X2FsZXJ0X3RyaWdnZXJlZJROjAVxdW90ZZROjAxyZXBseV9tYXJrdXCUjCV0ZWxl\nZ3JhbS5faW5saW5lLmlubGluZWtleWJvYXJkbWFya3VwlIwUSW5saW5lS2V5Ym9hcmRNYXJrdXCU\nk5QpgZR9lCiMD2lubGluZV9rZXlib2FyZJQojCV0ZWxlZ3JhbS5faW5saW5lLmlubGluZWtleWJv\nYXJkYnV0dG9ulIwUSW5saW5lS2V5Ym9hcmRCdXR0b26Uk5QpgZR9lCiMDWNhbGxiYWNrX2RhdGGU\njAlmb3JtYXR0ZWSUjA1jYWxsYmFja19nYW1llE6MCWxvZ2luX3VybJROjANwYXmUTowTc3dpdGNo\nX2lubGluZV9xdWVyeZROjB9zd2l0Y2hfaW5saW5lX3F1ZXJ5X2Nob3Nlbl9jaGF0lE6MIHN3aXRj\naF9pbmxpbmVfcXVlcnlfY3VycmVudF9jaGF0lE6MBHRleHSUjBRDdXRlIGZvcm1hdHRlZCB0ZXh0\nIZSMA3VybJROjAd3ZWJfYXBwlE5oG4hoHChook5OaJpOTk5OTnSUaB59lHVihZRolimBlH2UKGiZ\njAthdHRhY2htZW50c5Rom05onE5onU5onk5on05ooE5ooYwVTXVsdGlwbGUgYXR0YWNobWVudHMh\nlGijTmikTmgbiGgcKGirTk5oqk5OTk5OdJRoHn2UdWJolimBlH2UKGiZaC5om05onE5onU5onk5o\nn05ooE5ooYwNU2VjcmV0IGltYWdlIZRoo05opE5oG4hoHChosE5OaC5OTk5OTnSUaB59lHViaJYp\ngZR9lChomYwJdGh1bWJuYWlslGibTmicTmidTmieTmifTmigTmihjBhEb2N1bWVudCB3aXRoIHRo\ndW1ibmFpbCGUaKNOaKROaBuIaBwoaLZOTmi1Tk5OTk50lGgefZR1YoeUaJYpgZR9lChomYwEaGFz\naJRom05onE5onU5onk5on05ooE5ooYwcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRoo05o\npE5oG4hoHChovU5OaLxOTk5OTnSUaB59lHVihZRolimBlH2UKGiZjAdyZXN0YXJ0lGibTmicTmid\nTmieTmifTmigTmihjAhSZXN0YXJ0IZRoo05opE5oG4hoHChoxE5OaMNOTk5OTnSUaB59lHVihZR0\nlGgbiGgcaMiFlGgefZR1YowQcmVwbHlfdG9fbWVzc2FnZZROjA5yZXBseV90b19zdG9yeZROjBJz\nZW5kZXJfYm9vc3RfY291bnSUTowTc2VuZGVyX2J1c2luZXNzX2JvdJROjAtzZW5kZXJfY2hhdJRO\njBhzaG93X2NhcHRpb25fYWJvdmVfbWVkaWGUTowHc3RpY2tlcpROjAVzdG9yeZROjBJzdWNjZXNz\nZnVsX3BheW1lbnSUTowXc3VwZXJncm91cF9jaGF0X2NyZWF0ZWSUiWihjClXZWxjb21lISBDaG9v\nc2Ugd2hhdCB5b3Ugd2FudCB0byByZWNlaXZlLpSMDHVzZXJzX3NoYXJlZJROjAV2ZW51ZZROjAd2\naWFfYm90lE6MBXZpZGVvlE6MEHZpZGVvX2NoYXRfZW5kZWSUTowfdmlkZW9fY2hhdF9wYXJ0aWNp\ncGFudHNfaW52aXRlZJROjBR2aWRlb19jaGF0X3NjaGVkdWxlZJROjBJ2aWRlb19jaGF0X3N0YXJ0\nZWSUTowKdmlkZW9fbm90ZZROjAV2b2ljZZROjAx3ZWJfYXBwX2RhdGGUTowUd3JpdGVfYWNjZXNz\nX2FsbG93ZWSUTowEY2hhdJRoCYwEZGF0ZZSMCGRhdGV0aW1llIwIZGF0ZXRpbWWUk5RDCgfoBRUT\nCRwAAACUjARweXR6lIwEX1VUQ5STlClSlIaUUpSMCm1lc3NhZ2VfaWSUSwJoG4hoHEsCaAmGlGge\nfZR1YmgbiGgcaECFlGgefZR1YowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9q\nb2luX3JlcXVlc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVs\nZXRlZF9idXNpbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0\nZWRfY2hhbm5lbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROaEJOjBBt\nZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSUTowObXlfY2hhdF9tZW1i\nZXKUTmiKTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5lE6MEnJlbW92ZWRfY2hh\ndF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSwRoG4hoHEsEhZRoHn2UdWIu\n" }, "response_message": { - "text": "Here's your secret image! Run /start command again to restart.", + "text": "Here's your secret image!", "attachments": [ { "chatsky_attachment_type": "image", @@ -654,42 +588,12 @@ "original_message": null }, "response_functions": [ - "send_message(42, \"Here's your secret image! Run /start command again to restart.\", parse_mode=None, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)", + "send_message(42, \"Here's your secret image!\", parse_mode=None, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)", "send_photo(42, '9f39f64560e6415032325cae1fec1ca06b3cc1a3549208a8a35564c0d3749062', caption='DeepPavlov logo', parse_mode=None, disable_notification=None, protect_content=None, reply_markup=None, has_spoiler=True, message_effect_id=None, reply_to_message_id=None, filename='deeppavlov_logo.png')" ] }, { - "update": "Update(message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 34, tzinfo=UTC), delete_chat_photo=False, entities=(MessageEntity(length=6, offset=0, type=MessageEntityType.BOT_COMMAND),), from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), group_chat_created=False, message_id=7, supergroup_chat_created=False, text='/start'), update_id=7)", - "received_message": { - "text": "/start", - "attachments": [], - "annotations": null, - "misc": null, - "original_message": "gASVXwsAAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUTowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9qb2luX3JlcXVl\nc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVsZXRlZF9idXNp\nbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5l\nbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROjAdtZXNzYWdllIwRdGVs\nZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1lbnSU\njBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2UjAV2\nYWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowLYm9v\nc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRpb25f\nZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3NldJRO\njAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0ZV9j\naGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9pZJRO\njAhlbnRpdGllc5SMF3RlbGVncmFtLl9tZXNzYWdlZW50aXR5lIwNTWVzc2FnZUVudGl0eZSTlCmB\nlH2UKIwPY3VzdG9tX2Vtb2ppX2lklE6MCGxhbmd1YWdllE6MBmxlbmd0aJRLBowGb2Zmc2V0lEsA\naBJoE4wRTWVzc2FnZUVudGl0eVR5cGWUk5SMC2JvdF9jb21tYW5klIWUUpSMA3VybJROjAR1c2Vy\nlE5oG4hoHGhdSwBLBoeUaB59lHVihZSMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Ns\nb3NlZJROjBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1\nbV90b3BpY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROjAlmcm9tX3VzZXKUjA50ZWxlZ3Jh\nbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2FuX2Nvbm5l\nY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9ncm91cF9t\nZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdlX2NvZGWU\njAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGgefZR1YowE\nZ2FtZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVtX3RvcGlj\nX3VuaGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZlYXdheV9j\ncmVhdGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImMEWhhc19t\nZWRpYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6MFGlzX2F1\ndG9tYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNzYWdllE6M\nEGxlZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRpb26UTowO\nbWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRvX2RlbGV0ZV90aW1lcl9jaGFuZ2VklE6MEW1l\nc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJvbV9jaGF0X2lklE6MEm1pZ3JhdGVfdG9fY2hh\ndF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5ld19jaGF0X3Bob3RvlCmMDm5ld19jaGF0X3Rp\ndGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+UKYwOcGlubmVkX21lc3NhZ2WUTowEcG9sbJRO\njBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6MBXF1b3RllE6MDHJlcGx5X21hcmt1cJROjBBy\nZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6MEnNlbmRlcl9ib29zdF9jb3VudJRO\njBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0lE6MGHNob3dfY2FwdGlvbl9hYm92\nZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nlc3NmdWxfcGF5bWVudJROjBdzdXBl\ncmdyb3VwX2NoYXRfY3JlYXRlZJSJjAR0ZXh0lIwGL3N0YXJ0lIwMdXNlcnNfc2hhcmVklE6MBXZl\nbnVllE6MB3ZpYV9ib3SUTowFdmlkZW+UTowQdmlkZW9fY2hhdF9lbmRlZJROjB92aWRlb19jaGF0\nX3BhcnRpY2lwYW50c19pbnZpdGVklE6MFHZpZGVvX2NoYXRfc2NoZWR1bGVklE6MEnZpZGVvX2No\nYXRfc3RhcnRlZJROjAp2aWRlb19ub3RllE6MBXZvaWNllE6MDHdlYl9hcHBfZGF0YZROjBR3cml0\nZV9hY2Nlc3NfYWxsb3dlZJROjARjaGF0lGgJjARkYXRllIwIZGF0ZXRpbWWUjAhkYXRldGltZZST\nlEMKB+gFFRMJIgAAAJSMBHB5dHqUjARfVVRDlJOUKVKUhpRSlIwKbWVzc2FnZV9pZJRLB2gbiGgc\nSwdoCYaUaB59lHVijBBtZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSU\nTowObXlfY2hhdF9tZW1iZXKUTmiVTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5\nlE6MEnJlbW92ZWRfY2hhdF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSwdo\nG4hoHEsHhZRoHn2UdWIu\n" - }, - "response_message": { - "text": null, - "attachments": [ - { - "chatsky_attachment_type": "location", - "longitude": 27.792887, - "latitude": 58.43161, - "reply_markup": "gASV4gMAAAAAAACMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxp\nbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9p\nbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2U\nKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJs\nlE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hv\nc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1\ndGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTowHX2Zyb3plbpSIjAlfaWRfYXR0\ncnOUKGgUTk5oDE5OTk5OdJSMCmFwaV9rd2FyZ3OUfZR1YoWUaAgpgZR9lChoC4wLYXR0YWNobWVu\ndHOUaA1OaA5OaA9OaBBOaBFOaBJOaBOMFU11bHRpcGxlIGF0dGFjaG1lbnRzIZRoFU5oFk5oF4ho\nGChoIE5OaB9OTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAZzZWNyZXSUaA1OaA5OaA9OaBBOaBFO\naBJOaBOMDVNlY3JldCBpbWFnZSGUaBVOaBZOaBeIaBgoaCdOTmgmTk5OTk50lGgafZR1YoWUaAgp\ngZR9lChoC4wJdGh1bWJuYWlslGgNTmgOTmgPTmgQTmgRTmgSTmgTjBhEb2N1bWVudCB3aXRoIHRo\ndW1ibmFpbCGUaBVOaBZOaBeIaBgoaC5OTmgtTk5OTk50lGgafZR1YoWUaAgpgZR9lChoC4wEaGFz\naJRoDU5oDk5oD05oEE5oEU5oEk5oE4wcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRoFU5o\nFk5oF4hoGChoNU5OaDROTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAdyZXN0YXJ0lGgNTmgOTmgP\nTmgQTmgRTmgSTmgTjAhSZXN0YXJ0IZRoFU5oFk5oF4hoGChoPE5OaDtOTk5OTnSUaBp9lHViaAgp\ngZR9lChoC4wEcXVpdJRoDU5oDk5oD05oEE5oEU5oEk5oE4wFUXVpdCGUaBVOaBZOaBeIaBgoaEJO\nTmhBTk5OTk50lGgafZR1YoaUdJRoF4hoGGhGhZRoGn2UdWIu\n", - "__pickled_extra_fields__": [ - "reply_markup" - ] - } - ], - "annotations": null, - "misc": null, - "original_message": null - }, - "response_functions": [ - "send_location(42, 58.43161, 27.792887, horizontal_accuracy=None, disable_notification=None, protect_content=None, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), message_effect_id=None, reply_to_message_id=None)" - ] - }, - { - "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='thumbnail', from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='7', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 34, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=16, is_bot=True, username='chatsky_bot'), group_chat_created=False, location=Location(latitude=58.43162, longitude=27.792879), message_id=8, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), supergroup_chat_created=False)), update_id=8)", + "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='thumbnail', from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='7', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 34, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=16, is_bot=True, username='chatsky_bot'), group_chat_created=False, text='Welcome! Choose what you want to receive.', message_id=2, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'), InlineKeyboardButton(callback_data='secret', text='Secret image!'), InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), ))), supergroup_chat_created=False)), update_id=5)", "received_message": { "text": null, "attachments": [ @@ -700,10 +604,10 @@ ], "annotations": null, "misc": null, - "original_message": "gASV/g8AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjAl0aHVtYm5haWyUjAlmcm9tX3VzZXKUjA50\nZWxlZ3JhbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2Fu\nX2Nvbm5lY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9n\ncm91cF9tZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdl\nX2NvZGWUjAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGge\nfZR1YowPZ2FtZV9zaG9ydF9uYW1llE5oDYwBN5SMEWlubGluZV9tZXNzYWdlX2lklE6MB21lc3Nh\nZ2WUjBF0ZWxlZ3JhbS5fbWVzc2FnZZSMB01lc3NhZ2WUk5QpgZR9lCiMFV9lZmZlY3RpdmVfYXR0\nYWNobWVudJSMHHRlbGVncmFtLl91dGlscy5kZWZhdWx0dmFsdWWUjAxEZWZhdWx0VmFsdWWUk5Qp\ngZROfZSMBXZhbHVllE5zhpRijAlhbmltYXRpb26UTowFYXVkaW+UTowQYXV0aG9yX3NpZ25hdHVy\nZZROjAtib29zdF9hZGRlZJROjBZidXNpbmVzc19jb25uZWN0aW9uX2lklE6MB2NhcHRpb26UTowQ\nY2FwdGlvbl9lbnRpdGllc5QpjBRjaGFubmVsX2NoYXRfY3JlYXRlZJSJjBNjaGF0X2JhY2tncm91\nbmRfc2V0lE6MC2NoYXRfc2hhcmVklE6MEWNvbm5lY3RlZF93ZWJzaXRllE6MB2NvbnRhY3SUTowR\nZGVsZXRlX2NoYXRfcGhvdG+UiYwEZGljZZROjAhkb2N1bWVudJROjAllZGl0X2RhdGWUTowJZWZm\nZWN0X2lklE6MCGVudGl0aWVzlCmMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Nsb3Nl\nZJROjBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1bV90\nb3BpY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROaC9oMSmBlH2UKGg0Tmg1Tmg2Tmg3TmgL\njANCb3SUaA1LEGg4iGg5Tmg6TmgPTmg8TmgZjAtjaGF0c2t5X2JvdJRoG4hoHEsQhZRoHn2UdWKM\nBGdhbWWUTowaZ2VuZXJhbF9mb3J1bV90b3BpY19oaWRkZW6UTowcZ2VuZXJhbF9mb3J1bV90b3Bp\nY191bmhpZGRlbpROjAhnaXZlYXdheZROjBJnaXZlYXdheV9jb21wbGV0ZWSUTowQZ2l2ZWF3YXlf\nY3JlYXRlZJROjBBnaXZlYXdheV93aW5uZXJzlE6MEmdyb3VwX2NoYXRfY3JlYXRlZJSJjBFoYXNf\nbWVkaWFfc3BvaWxlcpROjBVoYXNfcHJvdGVjdGVkX2NvbnRlbnSUTowHaW52b2ljZZROjBRpc19h\ndXRvbWF0aWNfZm9yd2FyZJROjA9pc19mcm9tX29mZmxpbmWUTowQaXNfdG9waWNfbWVzc2FnZZRO\njBBsZWZ0X2NoYXRfbWVtYmVylE6MFGxpbmtfcHJldmlld19vcHRpb25zlE6MCGxvY2F0aW9ulIwY\ndGVsZWdyYW0uX2ZpbGVzLmxvY2F0aW9ulIwITG9jYXRpb26Uk5QpgZR9lCiMB2hlYWRpbmeUTowT\naG9yaXpvbnRhbF9hY2N1cmFjeZROjAhsYXRpdHVkZZRHQE03P1L8JleMC2xpdmVfcGVyaW9klE6M\nCWxvbmdpdHVkZZRHQDvK+h4+r2iMFnByb3hpbWl0eV9hbGVydF9yYWRpdXOUTmgbiGgcR0A7yvoe\nPq9oR0BNNz9S/CZXhpRoHn2UdWKMDm1lZGlhX2dyb3VwX2lklE6MIW1lc3NhZ2VfYXV0b19kZWxl\ndGVfdGltZXJfY2hhbmdlZJROjBFtZXNzYWdlX3RocmVhZF9pZJROjBRtaWdyYXRlX2Zyb21fY2hh\ndF9pZJROjBJtaWdyYXRlX3RvX2NoYXRfaWSUTowQbmV3X2NoYXRfbWVtYmVyc5QpjA5uZXdfY2hh\ndF9waG90b5QpjA5uZXdfY2hhdF90aXRsZZROjA1wYXNzcG9ydF9kYXRhlE6MBXBob3RvlCmMDnBp\nbm5lZF9tZXNzYWdllE6MBHBvbGyUTowZcHJveGltaXR5X2FsZXJ0X3RyaWdnZXJlZJROjAVxdW90\nZZROjAxyZXBseV9tYXJrdXCUjCV0ZWxlZ3JhbS5faW5saW5lLmlubGluZWtleWJvYXJkbWFya3Vw\nlIwUSW5saW5lS2V5Ym9hcmRNYXJrdXCUk5QpgZR9lCiMD2lubGluZV9rZXlib2FyZJQojCV0ZWxl\nZ3JhbS5faW5saW5lLmlubGluZWtleWJvYXJkYnV0dG9ulIwUSW5saW5lS2V5Ym9hcmRCdXR0b26U\nk5QpgZR9lCiMDWNhbGxiYWNrX2RhdGGUjAlmb3JtYXR0ZWSUjA1jYWxsYmFja19nYW1llE6MCWxv\nZ2luX3VybJROjANwYXmUTowTc3dpdGNoX2lubGluZV9xdWVyeZROjB9zd2l0Y2hfaW5saW5lX3F1\nZXJ5X2Nob3Nlbl9jaGF0lE6MIHN3aXRjaF9pbmxpbmVfcXVlcnlfY3VycmVudF9jaGF0lE6MBHRl\neHSUjBRDdXRlIGZvcm1hdHRlZCB0ZXh0IZSMA3VybJROjAd3ZWJfYXBwlE5oG4hoHChor05OaKdO\nTk5OTnSUaB59lHVihZRooymBlH2UKGimjAthdHRhY2htZW50c5RoqE5oqU5oqk5oq05orE5orU5o\nrowVTXVsdGlwbGUgYXR0YWNobWVudHMhlGiwTmixTmgbiGgcKGi4Tk5ot05OTk5OdJRoHn2UdWKF\nlGijKYGUfZQoaKaMBnNlY3JldJRoqE5oqU5oqk5oq05orE5orU5orowNU2VjcmV0IGltYWdlIZRo\nsE5osU5oG4hoHChov05OaL5OTk5OTnSUaB59lHVihZRooymBlH2UKGimaC5oqE5oqU5oqk5oq05o\nrE5orU5orowYRG9jdW1lbnQgd2l0aCB0aHVtYm5haWwhlGiwTmixTmgbiGgcKGjFTk5oLk5OTk5O\ndJRoHn2UdWKFlGijKYGUfZQoaKaMBGhhc2iUaKhOaKlOaKpOaKtOaKxOaK1OaK6MHEZpcnN0IGF0\ndGFjaG1lbnQgYnl0ZXMgaGFzaCGUaLBOaLFOaBuIaBwoaMxOTmjLTk5OTk50lGgefZR1YoWUaKMp\ngZR9lChopowHcmVzdGFydJRoqE5oqU5oqk5oq05orE5orU5orowIUmVzdGFydCGUaLBOaLFOaBuI\naBwoaNNOTmjSTk5OTk50lGgefZR1YmijKYGUfZQoaKaMBHF1aXSUaKhOaKlOaKpOaKtOaKxOaK1O\naK6MBVF1aXQhlGiwTmixTmgbiGgcKGjZTk5o2E5OTk5OdJRoHn2UdWKGlHSUaBuIaBxo3YWUaB59\nlHVijBByZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6MEnNlbmRlcl9ib29zdF9j\nb3VudJROjBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0lE6MGHNob3dfY2FwdGlv\nbl9hYm92ZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nlc3NmdWxfcGF5bWVudJRO\njBdzdXBlcmdyb3VwX2NoYXRfY3JlYXRlZJSJaK5OjAx1c2Vyc19zaGFyZWSUTowFdmVudWWUTowH\ndmlhX2JvdJROjAV2aWRlb5ROjBB2aWRlb19jaGF0X2VuZGVklE6MH3ZpZGVvX2NoYXRfcGFydGlj\naXBhbnRzX2ludml0ZWSUTowUdmlkZW9fY2hhdF9zY2hlZHVsZWSUTowSdmlkZW9fY2hhdF9zdGFy\ndGVklE6MCnZpZGVvX25vdGWUTowFdm9pY2WUTowMd2ViX2FwcF9kYXRhlE6MFHdyaXRlX2FjY2Vz\nc19hbGxvd2VklE6MBGNoYXSUaAmMBGRhdGWUjAhkYXRldGltZZSMCGRhdGV0aW1llJOUQwoH6AUV\nEwkiAAAAlIwEcHl0epSMBF9VVEOUk5QpUpSGlFKUjAptZXNzYWdlX2lklEsIaBuIaBxLCGgJhpRo\nHn2UdWJoG4hoHGhAhZRoHn2UdWKMDGNoYW5uZWxfcG9zdJROjApjaGF0X2Jvb3N0lE6MEWNoYXRf\nam9pbl9yZXF1ZXN0lE6MC2NoYXRfbWVtYmVylE6MFGNob3Nlbl9pbmxpbmVfcmVzdWx0lE6MGWRl\nbGV0ZWRfYnVzaW5lc3NfbWVzc2FnZXOUTowXZWRpdGVkX2J1c2luZXNzX21lc3NhZ2WUTowTZWRp\ndGVkX2NoYW5uZWxfcG9zdJROjA5lZGl0ZWRfbWVzc2FnZZROjAxpbmxpbmVfcXVlcnmUTmhCTowQ\nbWVzc2FnZV9yZWFjdGlvbpROjBZtZXNzYWdlX3JlYWN0aW9uX2NvdW50lE6MDm15X2NoYXRfbWVt\nYmVylE5ol06MC3BvbGxfYW5zd2VylE6MEnByZV9jaGVja291dF9xdWVyeZROjBJyZW1vdmVkX2No\nYXRfYm9vc3SUTowOc2hpcHBpbmdfcXVlcnmUTowJdXBkYXRlX2lklEsIaBuIaBxLCIWUaB59lHVi\nLg==\n" + "original_message": "gASVGQ8AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjAl0aHVtYm5haWyUjAlmcm9tX3VzZXKUjA50\nZWxlZ3JhbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2Fu\nX2Nvbm5lY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9n\ncm91cF9tZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdl\nX2NvZGWUjAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGge\nfZR1YowPZ2FtZV9zaG9ydF9uYW1llE5oDYwBN5SMEWlubGluZV9tZXNzYWdlX2lklE6MB21lc3Nh\nZ2WUjBF0ZWxlZ3JhbS5fbWVzc2FnZZSMB01lc3NhZ2WUk5QpgZR9lCiMFV9lZmZlY3RpdmVfYXR0\nYWNobWVudJSMHHRlbGVncmFtLl91dGlscy5kZWZhdWx0dmFsdWWUjAxEZWZhdWx0VmFsdWWUk5Qp\ngZROfZSMBXZhbHVllE5zhpRijAlhbmltYXRpb26UTowFYXVkaW+UTowQYXV0aG9yX3NpZ25hdHVy\nZZROjAtib29zdF9hZGRlZJROjBZidXNpbmVzc19jb25uZWN0aW9uX2lklE6MB2NhcHRpb26UTowQ\nY2FwdGlvbl9lbnRpdGllc5QpjBRjaGFubmVsX2NoYXRfY3JlYXRlZJSJjBNjaGF0X2JhY2tncm91\nbmRfc2V0lE6MC2NoYXRfc2hhcmVklE6MEWNvbm5lY3RlZF93ZWJzaXRllE6MB2NvbnRhY3SUTowR\nZGVsZXRlX2NoYXRfcGhvdG+UiYwEZGljZZROjAhkb2N1bWVudJROjAllZGl0X2RhdGWUTowJZWZm\nZWN0X2lklE6MCGVudGl0aWVzlCmMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Nsb3Nl\nZJROjBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1bV90\nb3BpY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROaC9oMSmBlH2UKGg0Tmg1Tmg2Tmg3TmgL\njANCb3SUaA1LEGg4iGg5Tmg6TmgPTmg8TmgZjAtjaGF0c2t5X2JvdJRoG4hoHEsQhZRoHn2UdWKM\nBGdhbWWUTowaZ2VuZXJhbF9mb3J1bV90b3BpY19oaWRkZW6UTowcZ2VuZXJhbF9mb3J1bV90b3Bp\nY191bmhpZGRlbpROjAhnaXZlYXdheZROjBJnaXZlYXdheV9jb21wbGV0ZWSUTowQZ2l2ZWF3YXlf\nY3JlYXRlZJROjBBnaXZlYXdheV93aW5uZXJzlE6MEmdyb3VwX2NoYXRfY3JlYXRlZJSJjBFoYXNf\nbWVkaWFfc3BvaWxlcpROjBVoYXNfcHJvdGVjdGVkX2NvbnRlbnSUTowHaW52b2ljZZROjBRpc19h\ndXRvbWF0aWNfZm9yd2FyZJROjA9pc19mcm9tX29mZmxpbmWUTowQaXNfdG9waWNfbWVzc2FnZZRO\njBBsZWZ0X2NoYXRfbWVtYmVylE6MFGxpbmtfcHJldmlld19vcHRpb25zlE6MCGxvY2F0aW9ulE6M\nDm1lZGlhX2dyb3VwX2lklE6MIW1lc3NhZ2VfYXV0b19kZWxldGVfdGltZXJfY2hhbmdlZJROjBFt\nZXNzYWdlX3RocmVhZF9pZJROjBRtaWdyYXRlX2Zyb21fY2hhdF9pZJROjBJtaWdyYXRlX3RvX2No\nYXRfaWSUTowQbmV3X2NoYXRfbWVtYmVyc5QpjA5uZXdfY2hhdF9waG90b5QpjA5uZXdfY2hhdF90\naXRsZZROjA1wYXNzcG9ydF9kYXRhlE6MBXBob3RvlCmMDnBpbm5lZF9tZXNzYWdllE6MBHBvbGyU\nTowZcHJveGltaXR5X2FsZXJ0X3RyaWdnZXJlZJROjAVxdW90ZZROjAxyZXBseV9tYXJrdXCUjCV0\nZWxlZ3JhbS5faW5saW5lLmlubGluZWtleWJvYXJkbWFya3VwlIwUSW5saW5lS2V5Ym9hcmRNYXJr\ndXCUk5QpgZR9lCiMD2lubGluZV9rZXlib2FyZJQojCV0ZWxlZ3JhbS5faW5saW5lLmlubGluZWtl\neWJvYXJkYnV0dG9ulIwUSW5saW5lS2V5Ym9hcmRCdXR0b26Uk5QpgZR9lCiMDWNhbGxiYWNrX2Rh\ndGGUjAlmb3JtYXR0ZWSUjA1jYWxsYmFja19nYW1llE6MCWxvZ2luX3VybJROjANwYXmUTowTc3dp\ndGNoX2lubGluZV9xdWVyeZROjB9zd2l0Y2hfaW5saW5lX3F1ZXJ5X2Nob3Nlbl9jaGF0lE6MIHN3\naXRjaF9pbmxpbmVfcXVlcnlfY3VycmVudF9jaGF0lE6MBHRleHSUjBRDdXRlIGZvcm1hdHRlZCB0\nZXh0IZSMA3VybJROjAd3ZWJfYXBwlE5oG4hoHChook5OaJpOTk5OTnSUaB59lHVihZRolimBlH2U\nKGiZjAthdHRhY2htZW50c5Rom05onE5onU5onk5on05ooE5ooYwVTXVsdGlwbGUgYXR0YWNobWVu\ndHMhlGijTmikTmgbiGgcKGirTk5oqk5OTk5OdJRoHn2UdWJolimBlH2UKGiZjAZzZWNyZXSUaJtO\naJxOaJ1OaJ5OaJ9OaKBOaKGMDVNlY3JldCBpbWFnZSGUaKNOaKROaBuIaBwoaLFOTmiwTk5OTk50\nlGgefZR1YmiWKYGUfZQoaJloLmibTmicTmidTmieTmifTmigTmihjBhEb2N1bWVudCB3aXRoIHRo\ndW1ibmFpbCGUaKNOaKROaBuIaBwoaLZOTmguTk5OTk50lGgefZR1YoeUaJYpgZR9lChomYwEaGFz\naJRom05onE5onU5onk5on05ooE5ooYwcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRoo05o\npE5oG4hoHChovU5OaLxOTk5OTnSUaB59lHVihZRolimBlH2UKGiZjAdyZXN0YXJ0lGibTmicTmid\nTmieTmifTmigTmihjAhSZXN0YXJ0IZRoo05opE5oG4hoHChoxE5OaMNOTk5OTnSUaB59lHVihZR0\nlGgbiGgcaMiFlGgefZR1YowQcmVwbHlfdG9fbWVzc2FnZZROjA5yZXBseV90b19zdG9yeZROjBJz\nZW5kZXJfYm9vc3RfY291bnSUTowTc2VuZGVyX2J1c2luZXNzX2JvdJROjAtzZW5kZXJfY2hhdJRO\njBhzaG93X2NhcHRpb25fYWJvdmVfbWVkaWGUTowHc3RpY2tlcpROjAVzdG9yeZROjBJzdWNjZXNz\nZnVsX3BheW1lbnSUTowXc3VwZXJncm91cF9jaGF0X2NyZWF0ZWSUiWihjClXZWxjb21lISBDaG9v\nc2Ugd2hhdCB5b3Ugd2FudCB0byByZWNlaXZlLpSMDHVzZXJzX3NoYXJlZJROjAV2ZW51ZZROjAd2\naWFfYm90lE6MBXZpZGVvlE6MEHZpZGVvX2NoYXRfZW5kZWSUTowfdmlkZW9fY2hhdF9wYXJ0aWNp\ncGFudHNfaW52aXRlZJROjBR2aWRlb19jaGF0X3NjaGVkdWxlZJROjBJ2aWRlb19jaGF0X3N0YXJ0\nZWSUTowKdmlkZW9fbm90ZZROjAV2b2ljZZROjAx3ZWJfYXBwX2RhdGGUTowUd3JpdGVfYWNjZXNz\nX2FsbG93ZWSUTowEY2hhdJRoCYwEZGF0ZZSMCGRhdGV0aW1llIwIZGF0ZXRpbWWUk5RDCgfoBRUT\nCSIAAACUjARweXR6lIwEX1VUQ5STlClSlIaUUpSMCm1lc3NhZ2VfaWSUSwJoG4hoHEsCaAmGlGge\nfZR1YmgbiGgcaECFlGgefZR1YowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9q\nb2luX3JlcXVlc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVs\nZXRlZF9idXNpbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0\nZWRfY2hhbm5lbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROaEJOjBBt\nZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSUTowObXlfY2hhdF9tZW1i\nZXKUTmiKTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5lE6MEnJlbW92ZWRfY2hh\ndF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSwVoG4hoHEsFhZRoHn2UdWIu\n" }, "response_message": { - "text": "Here's your document with tumbnail! Run /start command again to restart.", + "text": "Here's your document with thumbnail!", "attachments": [ { "chatsky_attachment_type": "document", @@ -724,42 +628,12 @@ "original_message": null }, "response_functions": [ - "send_message(42, \"Here's your document with tumbnail! Run /start command again to restart.\", parse_mode=None, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)", + "send_message(42, \"Here's your document with thumbnail!\", parse_mode=None, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)", "send_document(42, '08a7a36671950baba722d94a87dea286f03d7a6f7d0c32d5707d877cd211739a', caption='DeepPavlov article', parse_mode=None, disable_notification=None, protect_content=None, reply_markup=None, thumbnail='9f39f64560e6415032325cae1fec1ca06b3cc1a3549208a8a35564c0d3749062', message_effect_id=None, reply_to_message_id=None, filename='deeppavlov_article.pdf')" ] }, { - "update": "Update(message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 22, 19, 53, 42, tzinfo=UTC), delete_chat_photo=False, entities=(MessageEntity(length=6, offset=0, type=MessageEntityType.BOT_COMMAND),), from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), group_chat_created=False, message_id=9, supergroup_chat_created=False, text='/start'), update_id=9)", - "received_message": { - "text": "/start", - "attachments": [], - "annotations": null, - "misc": null, - "original_message": "gASVXwsAAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUTowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9qb2luX3JlcXVl\nc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVsZXRlZF9idXNp\nbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5l\nbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROjAdtZXNzYWdllIwRdGVs\nZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1lbnSU\njBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2UjAV2\nYWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowLYm9v\nc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRpb25f\nZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3NldJRO\njAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0ZV9j\naGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9pZJRO\njAhlbnRpdGllc5SMF3RlbGVncmFtLl9tZXNzYWdlZW50aXR5lIwNTWVzc2FnZUVudGl0eZSTlCmB\nlH2UKIwPY3VzdG9tX2Vtb2ppX2lklE6MCGxhbmd1YWdllE6MBmxlbmd0aJRLBowGb2Zmc2V0lEsA\naBJoE4wRTWVzc2FnZUVudGl0eVR5cGWUk5SMC2JvdF9jb21tYW5klIWUUpSMA3VybJROjAR1c2Vy\nlE5oG4hoHGhdSwBLBoeUaB59lHVihZSMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Ns\nb3NlZJROjBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1\nbV90b3BpY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROjAlmcm9tX3VzZXKUjA50ZWxlZ3Jh\nbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2FuX2Nvbm5l\nY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9ncm91cF9t\nZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdlX2NvZGWU\njAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGgefZR1YowE\nZ2FtZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVtX3RvcGlj\nX3VuaGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZlYXdheV9j\ncmVhdGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImMEWhhc19t\nZWRpYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6MFGlzX2F1\ndG9tYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNzYWdllE6M\nEGxlZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRpb26UTowO\nbWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRvX2RlbGV0ZV90aW1lcl9jaGFuZ2VklE6MEW1l\nc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJvbV9jaGF0X2lklE6MEm1pZ3JhdGVfdG9fY2hh\ndF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5ld19jaGF0X3Bob3RvlCmMDm5ld19jaGF0X3Rp\ndGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+UKYwOcGlubmVkX21lc3NhZ2WUTowEcG9sbJRO\njBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6MBXF1b3RllE6MDHJlcGx5X21hcmt1cJROjBBy\nZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6MEnNlbmRlcl9ib29zdF9jb3VudJRO\njBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0lE6MGHNob3dfY2FwdGlvbl9hYm92\nZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nlc3NmdWxfcGF5bWVudJROjBdzdXBl\ncmdyb3VwX2NoYXRfY3JlYXRlZJSJjAR0ZXh0lIwGL3N0YXJ0lIwMdXNlcnNfc2hhcmVklE6MBXZl\nbnVllE6MB3ZpYV9ib3SUTowFdmlkZW+UTowQdmlkZW9fY2hhdF9lbmRlZJROjB92aWRlb19jaGF0\nX3BhcnRpY2lwYW50c19pbnZpdGVklE6MFHZpZGVvX2NoYXRfc2NoZWR1bGVklE6MEnZpZGVvX2No\nYXRfc3RhcnRlZJROjAp2aWRlb19ub3RllE6MBXZvaWNllE6MDHdlYl9hcHBfZGF0YZROjBR3cml0\nZV9hY2Nlc3NfYWxsb3dlZJROjARjaGF0lGgJjARkYXRllIwIZGF0ZXRpbWWUjAhkYXRldGltZZST\nlEMKB+gFFhM1KgAAAJSMBHB5dHqUjARfVVRDlJOUKVKUhpRSlIwKbWVzc2FnZV9pZJRLCWgbiGgc\nSwloCYaUaB59lHVijBBtZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSU\nTowObXlfY2hhdF9tZW1iZXKUTmiVTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5\nlE6MEnJlbW92ZWRfY2hhdF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSwlo\nG4hoHEsJhZRoHn2UdWIu\n" - }, - "response_message": { - "text": null, - "attachments": [ - { - "chatsky_attachment_type": "location", - "longitude": 27.792887, - "latitude": 58.43161, - "reply_markup": "gASV4gMAAAAAAACMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxp\nbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9p\nbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2U\nKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJs\nlE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hv\nc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1\ndGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTowHX2Zyb3plbpSIjAlfaWRfYXR0\ncnOUKGgUTk5oDE5OTk5OdJSMCmFwaV9rd2FyZ3OUfZR1YoWUaAgpgZR9lChoC4wLYXR0YWNobWVu\ndHOUaA1OaA5OaA9OaBBOaBFOaBJOaBOMFU11bHRpcGxlIGF0dGFjaG1lbnRzIZRoFU5oFk5oF4ho\nGChoIE5OaB9OTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAZzZWNyZXSUaA1OaA5OaA9OaBBOaBFO\naBJOaBOMDVNlY3JldCBpbWFnZSGUaBVOaBZOaBeIaBgoaCdOTmgmTk5OTk50lGgafZR1YoWUaAgp\ngZR9lChoC4wJdGh1bWJuYWlslGgNTmgOTmgPTmgQTmgRTmgSTmgTjBhEb2N1bWVudCB3aXRoIHRo\ndW1ibmFpbCGUaBVOaBZOaBeIaBgoaC5OTmgtTk5OTk50lGgafZR1YoWUaAgpgZR9lChoC4wEaGFz\naJRoDU5oDk5oD05oEE5oEU5oEk5oE4wcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRoFU5o\nFk5oF4hoGChoNU5OaDROTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAdyZXN0YXJ0lGgNTmgOTmgP\nTmgQTmgRTmgSTmgTjAhSZXN0YXJ0IZRoFU5oFk5oF4hoGChoPE5OaDtOTk5OTnSUaBp9lHViaAgp\ngZR9lChoC4wEcXVpdJRoDU5oDk5oD05oEE5oEU5oEk5oE4wFUXVpdCGUaBVOaBZOaBeIaBgoaEJO\nTmhBTk5OTk50lGgafZR1YoaUdJRoF4hoGGhGhZRoGn2UdWIu\n", - "__pickled_extra_fields__": [ - "reply_markup" - ] - } - ], - "annotations": null, - "misc": null, - "original_message": null - }, - "response_functions": [ - "send_location(42, 58.43161, 27.792887, horizontal_accuracy=None, disable_notification=None, protect_content=None, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), message_effect_id=None, reply_to_message_id=None)" - ] - }, - { - "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='hash', from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='9', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 22, 19, 53, 42, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=6601664672, is_bot=True, username='chatsky_bot'), group_chat_created=False, location=Location(latitude=58.43162, longitude=27.792879), message_id=10, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), supergroup_chat_created=False)), update_id=10)", + "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='hash', from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='9', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 22, 19, 53, 42, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=6601664672, is_bot=True, username='chatsky_bot'), group_chat_created=False, text='Welcome! Choose what you want to receive.', message_id=2, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'), InlineKeyboardButton(callback_data='secret', text='Secret image!'), InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), ))), supergroup_chat_created=False)), update_id=6)", "received_message": { "text": null, "attachments": [ @@ -770,7 +644,7 @@ ], "annotations": null, "misc": null, - "original_message": "gASVCBAAAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjARoYXNolIwJZnJvbV91c2VylIwOdGVsZWdy\nYW0uX3VzZXKUaBCTlCmBlH2UKIwYYWRkZWRfdG9fYXR0YWNobWVudF9tZW51lE6MF2Nhbl9jb25u\nZWN0X3RvX2J1c2luZXNzlE6MD2Nhbl9qb2luX2dyb3Vwc5ROjBtjYW5fcmVhZF9hbGxfZ3JvdXBf\nbWVzc2FnZXOUTmgLaAxoDUsqjAZpc19ib3SUiYwKaXNfcHJlbWl1bZROjA1sYW5ndWFnZV9jb2Rl\nlIwCZW6UaA9oEIwXc3VwcG9ydHNfaW5saW5lX3F1ZXJpZXOUTmgZaBpoG4hoHEsqhZRoHn2UdWKM\nD2dhbWVfc2hvcnRfbmFtZZROaA2MATmUjBFpbmxpbmVfbWVzc2FnZV9pZJROjAdtZXNzYWdllIwR\ndGVsZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1l\nbnSUjBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2U\njAV2YWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowL\nYm9vc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRp\nb25fZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3Nl\ndJROjAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0\nZV9jaGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9p\nZJROjAhlbnRpdGllc5QpjA5leHRlcm5hbF9yZXBseZROjBJmb3J1bV90b3BpY19jbG9zZWSUTowT\nZm9ydW1fdG9waWNfY3JlYXRlZJROjBJmb3J1bV90b3BpY19lZGl0ZWSUTowUZm9ydW1fdG9waWNf\ncmVvcGVuZWSUTowOZm9yd2FyZF9vcmlnaW6UTmgvaDEpgZR9lChoNE5oNU5oNk5oN05oC4wDQm90\nlGgNigWgaH2JAWg4iGg5Tmg6TmgPTmg8TmgZjAtjaGF0c2t5X2JvdJRoG4hoHIoFoGh9iQGFlGge\nfZR1YowEZ2FtZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVt\nX3RvcGljX3VuaGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZl\nYXdheV9jcmVhdGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImM\nEWhhc19tZWRpYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6M\nFGlzX2F1dG9tYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNz\nYWdllE6MEGxlZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRp\nb26UjBh0ZWxlZ3JhbS5fZmlsZXMubG9jYXRpb26UjAhMb2NhdGlvbpSTlCmBlH2UKIwHaGVhZGlu\nZ5ROjBNob3Jpem9udGFsX2FjY3VyYWN5lE6MCGxhdGl0dWRllEdATTc/UvwmV4wLbGl2ZV9wZXJp\nb2SUTowJbG9uZ2l0dWRllEdAO8r6Hj6vaIwWcHJveGltaXR5X2FsZXJ0X3JhZGl1c5ROaBuIaBxH\nQDvK+h4+r2hHQE03P1L8JleGlGgefZR1YowObWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRv\nX2RlbGV0ZV90aW1lcl9jaGFuZ2VklE6MEW1lc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJv\nbV9jaGF0X2lklE6MEm1pZ3JhdGVfdG9fY2hhdF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5l\nd19jaGF0X3Bob3RvlCmMDm5ld19jaGF0X3RpdGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+U\nKYwOcGlubmVkX21lc3NhZ2WUTowEcG9sbJROjBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6M\nBXF1b3RllE6MDHJlcGx5X21hcmt1cJSMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRt\nYXJrdXCUjBRJbmxpbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiM\nJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1\ndHRvbpSTlCmBlH2UKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWU\nTowJbG9naW5fdXJslE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxp\nbmVfcXVlcnlfY2hvc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSU\nTowEdGV4dJSMFEN1dGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTmgbiGgcKGiv\nTk5op05OTk5OdJRoHn2UdWKFlGijKYGUfZQoaKaMC2F0dGFjaG1lbnRzlGioTmipTmiqTmirTmis\nTmitTmiujBVNdWx0aXBsZSBhdHRhY2htZW50cyGUaLBOaLFOaBuIaBwoaLhOTmi3Tk5OTk50lGge\nfZR1YoWUaKMpgZR9lChopowGc2VjcmV0lGioTmipTmiqTmirTmisTmitTmiujA1TZWNyZXQgaW1h\nZ2UhlGiwTmixTmgbiGgcKGi/Tk5ovk5OTk5OdJRoHn2UdWKFlGijKYGUfZQoaKaMCXRodW1ibmFp\nbJRoqE5oqU5oqk5oq05orE5orU5orowYRG9jdW1lbnQgd2l0aCB0aHVtYm5haWwhlGiwTmixTmgb\niGgcKGjGTk5oxU5OTk5OdJRoHn2UdWKFlGijKYGUfZQoaKZoLmioTmipTmiqTmirTmisTmitTmiu\njBxGaXJzdCBhdHRhY2htZW50IGJ5dGVzIGhhc2ghlGiwTmixTmgbiGgcKGjMTk5oLk5OTk5OdJRo\nHn2UdWKFlGijKYGUfZQoaKaMB3Jlc3RhcnSUaKhOaKlOaKpOaKtOaKxOaK1OaK6MCFJlc3RhcnQh\nlGiwTmixTmgbiGgcKGjTTk5o0k5OTk5OdJRoHn2UdWJooymBlH2UKGimjARxdWl0lGioTmipTmiq\nTmirTmisTmitTmiujAVRdWl0IZRosE5osU5oG4hoHCho2U5OaNhOTk5OTnSUaB59lHVihpR0lGgb\niGgcaN2FlGgefZR1YowQcmVwbHlfdG9fbWVzc2FnZZROjA5yZXBseV90b19zdG9yeZROjBJzZW5k\nZXJfYm9vc3RfY291bnSUTowTc2VuZGVyX2J1c2luZXNzX2JvdJROjAtzZW5kZXJfY2hhdJROjBhz\naG93X2NhcHRpb25fYWJvdmVfbWVkaWGUTowHc3RpY2tlcpROjAVzdG9yeZROjBJzdWNjZXNzZnVs\nX3BheW1lbnSUTowXc3VwZXJncm91cF9jaGF0X2NyZWF0ZWSUiWiuTowMdXNlcnNfc2hhcmVklE6M\nBXZlbnVllE6MB3ZpYV9ib3SUTowFdmlkZW+UTowQdmlkZW9fY2hhdF9lbmRlZJROjB92aWRlb19j\naGF0X3BhcnRpY2lwYW50c19pbnZpdGVklE6MFHZpZGVvX2NoYXRfc2NoZWR1bGVklE6MEnZpZGVv\nX2NoYXRfc3RhcnRlZJROjAp2aWRlb19ub3RllE6MBXZvaWNllE6MDHdlYl9hcHBfZGF0YZROjBR3\ncml0ZV9hY2Nlc3NfYWxsb3dlZJROjARjaGF0lGgJjARkYXRllIwIZGF0ZXRpbWWUjAhkYXRldGlt\nZZSTlEMKB+gFFhM1KgAAAJSMBHB5dHqUjARfVVRDlJOUKVKUhpRSlIwKbWVzc2FnZV9pZJRLCmgb\niGgcSwpoCYaUaB59lHViaBuIaBxoQIWUaB59lHVijAxjaGFubmVsX3Bvc3SUTowKY2hhdF9ib29z\ndJROjBFjaGF0X2pvaW5fcmVxdWVzdJROjAtjaGF0X21lbWJlcpROjBRjaG9zZW5faW5saW5lX3Jl\nc3VsdJROjBlkZWxldGVkX2J1c2luZXNzX21lc3NhZ2VzlE6MF2VkaXRlZF9idXNpbmVzc19tZXNz\nYWdllE6ME2VkaXRlZF9jaGFubmVsX3Bvc3SUTowOZWRpdGVkX21lc3NhZ2WUTowMaW5saW5lX3F1\nZXJ5lE5oQk6MEG1lc3NhZ2VfcmVhY3Rpb26UTowWbWVzc2FnZV9yZWFjdGlvbl9jb3VudJROjA5t\neV9jaGF0X21lbWJlcpROaJdOjAtwb2xsX2Fuc3dlcpROjBJwcmVfY2hlY2tvdXRfcXVlcnmUTowS\ncmVtb3ZlZF9jaGF0X2Jvb3N0lE6MDnNoaXBwaW5nX3F1ZXJ5lE6MCXVwZGF0ZV9pZJRLCmgbiGgc\nSwqFlGgefZR1Yi4=\n" + "original_message": "gASVIw8AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjARoYXNolIwJZnJvbV91c2VylIwOdGVsZWdy\nYW0uX3VzZXKUaBCTlCmBlH2UKIwYYWRkZWRfdG9fYXR0YWNobWVudF9tZW51lE6MF2Nhbl9jb25u\nZWN0X3RvX2J1c2luZXNzlE6MD2Nhbl9qb2luX2dyb3Vwc5ROjBtjYW5fcmVhZF9hbGxfZ3JvdXBf\nbWVzc2FnZXOUTmgLaAxoDUsqjAZpc19ib3SUiYwKaXNfcHJlbWl1bZROjA1sYW5ndWFnZV9jb2Rl\nlIwCZW6UaA9oEIwXc3VwcG9ydHNfaW5saW5lX3F1ZXJpZXOUTmgZaBpoG4hoHEsqhZRoHn2UdWKM\nD2dhbWVfc2hvcnRfbmFtZZROaA2MATmUjBFpbmxpbmVfbWVzc2FnZV9pZJROjAdtZXNzYWdllIwR\ndGVsZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1l\nbnSUjBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2U\njAV2YWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowL\nYm9vc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRp\nb25fZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3Nl\ndJROjAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0\nZV9jaGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9p\nZJROjAhlbnRpdGllc5QpjA5leHRlcm5hbF9yZXBseZROjBJmb3J1bV90b3BpY19jbG9zZWSUTowT\nZm9ydW1fdG9waWNfY3JlYXRlZJROjBJmb3J1bV90b3BpY19lZGl0ZWSUTowUZm9ydW1fdG9waWNf\ncmVvcGVuZWSUTowOZm9yd2FyZF9vcmlnaW6UTmgvaDEpgZR9lChoNE5oNU5oNk5oN05oC4wDQm90\nlGgNigWgaH2JAWg4iGg5Tmg6TmgPTmg8TmgZjAtjaGF0c2t5X2JvdJRoG4hoHIoFoGh9iQGFlGge\nfZR1YowEZ2FtZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVt\nX3RvcGljX3VuaGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZl\nYXdheV9jcmVhdGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImM\nEWhhc19tZWRpYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6M\nFGlzX2F1dG9tYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNz\nYWdllE6MEGxlZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRp\nb26UTowObWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRvX2RlbGV0ZV90aW1lcl9jaGFuZ2Vk\nlE6MEW1lc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJvbV9jaGF0X2lklE6MEm1pZ3JhdGVf\ndG9fY2hhdF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5ld19jaGF0X3Bob3RvlCmMDm5ld19j\naGF0X3RpdGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+UKYwOcGlubmVkX21lc3NhZ2WUTowE\ncG9sbJROjBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6MBXF1b3RllE6MDHJlcGx5X21hcmt1\ncJSMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxpbmVLZXlib2Fy\nZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9pbmxpbmUuaW5s\naW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2UKIwNY2FsbGJh\nY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJslE6MA3BheZRO\njBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hvc2VuX2NoYXSU\nTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1dGUgZm9ybWF0\ndGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTmgbiGgcKGiiTk5omk5OTk5OdJRoHn2UdWKFlGiW\nKYGUfZQoaJmMC2F0dGFjaG1lbnRzlGibTmicTmidTmieTmifTmigTmihjBVNdWx0aXBsZSBhdHRh\nY2htZW50cyGUaKNOaKROaBuIaBwoaKtOTmiqTk5OTk50lGgefZR1YmiWKYGUfZQoaJmMBnNlY3Jl\ndJRom05onE5onU5onk5on05ooE5ooYwNU2VjcmV0IGltYWdlIZRoo05opE5oG4hoHChosU5OaLBO\nTk5OTnSUaB59lHViaJYpgZR9lChomYwJdGh1bWJuYWlslGibTmicTmidTmieTmifTmigTmihjBhE\nb2N1bWVudCB3aXRoIHRodW1ibmFpbCGUaKNOaKROaBuIaBwoaLdOTmi2Tk5OTk50lGgefZR1YoeU\naJYpgZR9lChomWguaJtOaJxOaJ1OaJ5OaJ9OaKBOaKGMHEZpcnN0IGF0dGFjaG1lbnQgYnl0ZXMg\naGFzaCGUaKNOaKROaBuIaBwoaL1OTmguTk5OTk50lGgefZR1YoWUaJYpgZR9lChomYwHcmVzdGFy\ndJRom05onE5onU5onk5on05ooE5ooYwIUmVzdGFydCGUaKNOaKROaBuIaBwoaMROTmjDTk5OTk50\nlGgefZR1YoWUdJRoG4hoHGjIhZRoHn2UdWKMEHJlcGx5X3RvX21lc3NhZ2WUTowOcmVwbHlfdG9f\nc3RvcnmUTowSc2VuZGVyX2Jvb3N0X2NvdW50lE6ME3NlbmRlcl9idXNpbmVzc19ib3SUTowLc2Vu\nZGVyX2NoYXSUTowYc2hvd19jYXB0aW9uX2Fib3ZlX21lZGlhlE6MB3N0aWNrZXKUTowFc3RvcnmU\nTowSc3VjY2Vzc2Z1bF9wYXltZW50lE6MF3N1cGVyZ3JvdXBfY2hhdF9jcmVhdGVklIlooYwpV2Vs\nY29tZSEgQ2hvb3NlIHdoYXQgeW91IHdhbnQgdG8gcmVjZWl2ZS6UjAx1c2Vyc19zaGFyZWSUTowF\ndmVudWWUTowHdmlhX2JvdJROjAV2aWRlb5ROjBB2aWRlb19jaGF0X2VuZGVklE6MH3ZpZGVvX2No\nYXRfcGFydGljaXBhbnRzX2ludml0ZWSUTowUdmlkZW9fY2hhdF9zY2hlZHVsZWSUTowSdmlkZW9f\nY2hhdF9zdGFydGVklE6MCnZpZGVvX25vdGWUTowFdm9pY2WUTowMd2ViX2FwcF9kYXRhlE6MFHdy\naXRlX2FjY2Vzc19hbGxvd2VklE6MBGNoYXSUaAmMBGRhdGWUjAhkYXRldGltZZSMCGRhdGV0aW1l\nlJOUQwoH6AUWEzUqAAAAlIwEcHl0epSMBF9VVEOUk5QpUpSGlFKUjAptZXNzYWdlX2lklEsCaBuI\naBxLAmgJhpRoHn2UdWJoG4hoHGhAhZRoHn2UdWKMDGNoYW5uZWxfcG9zdJROjApjaGF0X2Jvb3N0\nlE6MEWNoYXRfam9pbl9yZXF1ZXN0lE6MC2NoYXRfbWVtYmVylE6MFGNob3Nlbl9pbmxpbmVfcmVz\ndWx0lE6MGWRlbGV0ZWRfYnVzaW5lc3NfbWVzc2FnZXOUTowXZWRpdGVkX2J1c2luZXNzX21lc3Nh\nZ2WUTowTZWRpdGVkX2NoYW5uZWxfcG9zdJROjA5lZGl0ZWRfbWVzc2FnZZROjAxpbmxpbmVfcXVl\ncnmUTmhCTowQbWVzc2FnZV9yZWFjdGlvbpROjBZtZXNzYWdlX3JlYWN0aW9uX2NvdW50lE6MDm15\nX2NoYXRfbWVtYmVylE5oik6MC3BvbGxfYW5zd2VylE6MEnByZV9jaGVja291dF9xdWVyeZROjBJy\nZW1vdmVkX2NoYXRfYm9vc3SUTowOc2hpcHBpbmdfcXVlcnmUTowJdXBkYXRlX2lklEsGaBuIaBxL\nBoWUaB59lHViLg==\n" }, "response_message": { "text": "Alright! Now send me a message with data attachment (audio, video, animation, image, sticker or document)!", @@ -784,7 +658,7 @@ ] }, { - "update": "Update(message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 22, 20, 12, 23, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), group_chat_created=False, message_id=12, sticker=Sticker(api_kwargs={'thumb': {'file_id': 'AAMCAgADGQEAAgS0Zk5Rpz6PkZu6Ef3Ef7GwnxAZYocAAiwCAAJHBkMF0YsKl8FLgq8BAAdtAAM1BA', 'file_unique_id': 'AQADLAIAAkcGQwVy', 'file_size': 5416, 'width': 128, 'height': 128}}, emoji='\ud83d\udc68', file_id='CAACAgIAAxkBAAIEtGZOUac-j5GbuhH9xH-xsJ8QGWKHAAIsAgACRwZDBdGLCpfBS4KvNQQ', file_size=29492, file_unique_id='AgADLAIAAkcGQwU', height=512, is_animated=False, is_video=False, set_name='citati_prosto', thumbnail=PhotoSize(file_id='AAMCAgADGQEAAgS0Zk5Rpz6PkZu6Ef3Ef7GwnxAZYocAAiwCAAJHBkMF0YsKl8FLgq8BAAdtAAM1BA', file_size=5416, file_unique_id='AQADLAIAAkcGQwVy', height=128, width=128), type=StickerType.REGULAR, width=512), supergroup_chat_created=False), update_id=11)", + "update": "Update(message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 22, 20, 12, 23, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), group_chat_created=False, message_id=7, sticker=Sticker(api_kwargs={'thumb': {'file_id': 'AAMCAgADGQEAAgS0Zk5Rpz6PkZu6Ef3Ef7GwnxAZYocAAiwCAAJHBkMF0YsKl8FLgq8BAAdtAAM1BA', 'file_unique_id': 'AQADLAIAAkcGQwVy', 'file_size': 5416, 'width': 128, 'height': 128}}, emoji='\ud83d\udc68', file_id='CAACAgIAAxkBAAIEtGZOUac-j5GbuhH9xH-xsJ8QGWKHAAIsAgACRwZDBdGLCpfBS4KvNQQ', file_size=29492, file_unique_id='AgADLAIAAkcGQwU', height=512, is_animated=False, is_video=False, set_name='citati_prosto', thumbnail=PhotoSize(file_id='AAMCAgADGQEAAgS0Zk5Rpz6PkZu6Ef3Ef7GwnxAZYocAAiwCAAJHBkMF0YsKl8FLgq8BAAdtAAM1BA', file_size=5416, file_unique_id='AQADLAIAAkcGQwVy', height=128, width=128), type=StickerType.REGULAR, width=512), supergroup_chat_created=False), update_id=7)", "received_message": { "text": null, "attachments": [ @@ -801,101 +675,66 @@ ], "annotations": null, "misc": null, - "original_message": "gASVDg0AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUTowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9qb2luX3JlcXVl\nc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVsZXRlZF9idXNp\nbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5l\nbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROjAdtZXNzYWdllIwRdGVs\nZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1lbnSU\njBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2UjAV2\nYWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowLYm9v\nc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRpb25f\nZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3NldJRO\njAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0ZV9j\naGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9pZJRO\njAhlbnRpdGllc5QpjA5leHRlcm5hbF9yZXBseZROjBJmb3J1bV90b3BpY19jbG9zZWSUTowTZm9y\ndW1fdG9waWNfY3JlYXRlZJROjBJmb3J1bV90b3BpY19lZGl0ZWSUTowUZm9ydW1fdG9waWNfcmVv\ncGVuZWSUTowOZm9yd2FyZF9vcmlnaW6UTowJZnJvbV91c2VylIwOdGVsZWdyYW0uX3VzZXKUaBCT\nlCmBlH2UKIwYYWRkZWRfdG9fYXR0YWNobWVudF9tZW51lE6MF2Nhbl9jb25uZWN0X3RvX2J1c2lu\nZXNzlE6MD2Nhbl9qb2luX2dyb3Vwc5ROjBtjYW5fcmVhZF9hbGxfZ3JvdXBfbWVzc2FnZXOUTmgL\naAxoDUsqjAZpc19ib3SUiYwKaXNfcHJlbWl1bZROjA1sYW5ndWFnZV9jb2RllIwCZW6UaA9oEIwX\nc3VwcG9ydHNfaW5saW5lX3F1ZXJpZXOUTmgZaBpoG4hoHEsqhZRoHn2UdWKMBGdhbWWUTowaZ2Vu\nZXJhbF9mb3J1bV90b3BpY19oaWRkZW6UTowcZ2VuZXJhbF9mb3J1bV90b3BpY191bmhpZGRlbpRO\njAhnaXZlYXdheZROjBJnaXZlYXdheV9jb21wbGV0ZWSUTowQZ2l2ZWF3YXlfY3JlYXRlZJROjBBn\naXZlYXdheV93aW5uZXJzlE6MEmdyb3VwX2NoYXRfY3JlYXRlZJSJjBFoYXNfbWVkaWFfc3BvaWxl\ncpROjBVoYXNfcHJvdGVjdGVkX2NvbnRlbnSUTowHaW52b2ljZZROjBRpc19hdXRvbWF0aWNfZm9y\nd2FyZJROjA9pc19mcm9tX29mZmxpbmWUTowQaXNfdG9waWNfbWVzc2FnZZROjBBsZWZ0X2NoYXRf\nbWVtYmVylE6MFGxpbmtfcHJldmlld19vcHRpb25zlE6MCGxvY2F0aW9ulE6MDm1lZGlhX2dyb3Vw\nX2lklE6MIW1lc3NhZ2VfYXV0b19kZWxldGVfdGltZXJfY2hhbmdlZJROjBFtZXNzYWdlX3RocmVh\nZF9pZJROjBRtaWdyYXRlX2Zyb21fY2hhdF9pZJROjBJtaWdyYXRlX3RvX2NoYXRfaWSUTowQbmV3\nX2NoYXRfbWVtYmVyc5QpjA5uZXdfY2hhdF9waG90b5QpjA5uZXdfY2hhdF90aXRsZZROjA1wYXNz\ncG9ydF9kYXRhlE6MBXBob3RvlCmMDnBpbm5lZF9tZXNzYWdllE6MBHBvbGyUTowZcHJveGltaXR5\nX2FsZXJ0X3RyaWdnZXJlZJROjAVxdW90ZZROjAxyZXBseV9tYXJrdXCUTowQcmVwbHlfdG9fbWVz\nc2FnZZROjA5yZXBseV90b19zdG9yeZROjBJzZW5kZXJfYm9vc3RfY291bnSUTowTc2VuZGVyX2J1\nc2luZXNzX2JvdJROjAtzZW5kZXJfY2hhdJROjBhzaG93X2NhcHRpb25fYWJvdmVfbWVkaWGUTowH\nc3RpY2tlcpSMF3RlbGVncmFtLl9maWxlcy5zdGlja2VylIwHU3RpY2tlcpSTlCmBlH2UKIwPY3Vz\ndG9tX2Vtb2ppX2lklE6MBWVtb2pplIwE8J+RqJSMBmhlaWdodJRNAAKMC2lzX2FuaW1hdGVklImM\nCGlzX3ZpZGVvlImMDW1hc2tfcG9zaXRpb26UTowQbmVlZHNfcmVwYWludGluZ5ROjBFwcmVtaXVt\nX2FuaW1hdGlvbpROjAhzZXRfbmFtZZSMDWNpdGF0aV9wcm9zdG+UaBJoE4wLU3RpY2tlclR5cGWU\nk5SMB3JlZ3VsYXKUhZRSlIwFd2lkdGiUTQACjAl0aHVtYm5haWyUjBl0ZWxlZ3JhbS5fZmlsZXMu\ncGhvdG9zaXpllIwJUGhvdG9TaXpllJOUKYGUfZQoaJVLgGiiS4CMB2ZpbGVfaWSUjE5BQU1DQWdB\nREdRRUFBZ1MwWms1UnB6NlBrWnU2RWYzRWY3R3dueEFaWW9jQUFpd0NBQUpIQmtNRjBZc0tsOEZM\nZ3E4QkFBZHRBQU0xQkGUjAlmaWxlX3NpemWUTSgVjA5maWxlX3VuaXF1ZV9pZJSMEEFRQURMQUlB\nQWtjR1F3VnmUaBuIaBxorYWUaB59lHViaKmMR0NBQUNBZ0lBQXhrQkFBSUV0R1pPVWFjLWo1R2J1\naEg5eEgteHNKOFFHV0tIQUFJc0FnQUNSd1pEQmRHTENwZkJTNEt2TlFRlGirTTRzaKyMD0FnQURM\nQUlBQWtjR1F3VZRoG4hoHGixhZRoHn2UjAV0aHVtYpR9lChoqWiqaKxorWirTSgVaKJLgGiVS4B1\nc3VijAVzdG9yeZROjBJzdWNjZXNzZnVsX3BheW1lbnSUTowXc3VwZXJncm91cF9jaGF0X2NyZWF0\nZWSUiYwEdGV4dJROjAx1c2Vyc19zaGFyZWSUTowFdmVudWWUTowHdmlhX2JvdJROjAV2aWRlb5RO\njBB2aWRlb19jaGF0X2VuZGVklE6MH3ZpZGVvX2NoYXRfcGFydGljaXBhbnRzX2ludml0ZWSUTowU\ndmlkZW9fY2hhdF9zY2hlZHVsZWSUTowSdmlkZW9fY2hhdF9zdGFydGVklE6MCnZpZGVvX25vdGWU\nTowFdm9pY2WUTowMd2ViX2FwcF9kYXRhlE6MFHdyaXRlX2FjY2Vzc19hbGxvd2VklE6MBGNoYXSU\naAmMBGRhdGWUjAhkYXRldGltZZSMCGRhdGV0aW1llJOUQwoH6AUWFAwXAAAAlIwEcHl0epSMBF9V\nVEOUk5QpUpSGlFKUjAptZXNzYWdlX2lklEsMaBuIaBxLDGgJhpRoHn2UdWKMEG1lc3NhZ2VfcmVh\nY3Rpb26UTowWbWVzc2FnZV9yZWFjdGlvbl9jb3VudJROjA5teV9jaGF0X21lbWJlcpROaIJOjAtw\nb2xsX2Fuc3dlcpROjBJwcmVfY2hlY2tvdXRfcXVlcnmUTowScmVtb3ZlZF9jaGF0X2Jvb3N0lE6M\nDnNoaXBwaW5nX3F1ZXJ5lE6MCXVwZGF0ZV9pZJRLC2gbiGgcSwuFlGgefZR1Yi4=\n" + "original_message": "gASVDg0AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUTowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9qb2luX3JlcXVl\nc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVsZXRlZF9idXNp\nbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5l\nbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROjAdtZXNzYWdllIwRdGVs\nZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1lbnSU\njBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2UjAV2\nYWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowLYm9v\nc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRpb25f\nZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3NldJRO\njAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0ZV9j\naGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9pZJRO\njAhlbnRpdGllc5QpjA5leHRlcm5hbF9yZXBseZROjBJmb3J1bV90b3BpY19jbG9zZWSUTowTZm9y\ndW1fdG9waWNfY3JlYXRlZJROjBJmb3J1bV90b3BpY19lZGl0ZWSUTowUZm9ydW1fdG9waWNfcmVv\ncGVuZWSUTowOZm9yd2FyZF9vcmlnaW6UTowJZnJvbV91c2VylIwOdGVsZWdyYW0uX3VzZXKUaBCT\nlCmBlH2UKIwYYWRkZWRfdG9fYXR0YWNobWVudF9tZW51lE6MF2Nhbl9jb25uZWN0X3RvX2J1c2lu\nZXNzlE6MD2Nhbl9qb2luX2dyb3Vwc5ROjBtjYW5fcmVhZF9hbGxfZ3JvdXBfbWVzc2FnZXOUTmgL\naAxoDUsqjAZpc19ib3SUiYwKaXNfcHJlbWl1bZROjA1sYW5ndWFnZV9jb2RllIwCZW6UaA9oEIwX\nc3VwcG9ydHNfaW5saW5lX3F1ZXJpZXOUTmgZaBpoG4hoHEsqhZRoHn2UdWKMBGdhbWWUTowaZ2Vu\nZXJhbF9mb3J1bV90b3BpY19oaWRkZW6UTowcZ2VuZXJhbF9mb3J1bV90b3BpY191bmhpZGRlbpRO\njAhnaXZlYXdheZROjBJnaXZlYXdheV9jb21wbGV0ZWSUTowQZ2l2ZWF3YXlfY3JlYXRlZJROjBBn\naXZlYXdheV93aW5uZXJzlE6MEmdyb3VwX2NoYXRfY3JlYXRlZJSJjBFoYXNfbWVkaWFfc3BvaWxl\ncpROjBVoYXNfcHJvdGVjdGVkX2NvbnRlbnSUTowHaW52b2ljZZROjBRpc19hdXRvbWF0aWNfZm9y\nd2FyZJROjA9pc19mcm9tX29mZmxpbmWUTowQaXNfdG9waWNfbWVzc2FnZZROjBBsZWZ0X2NoYXRf\nbWVtYmVylE6MFGxpbmtfcHJldmlld19vcHRpb25zlE6MCGxvY2F0aW9ulE6MDm1lZGlhX2dyb3Vw\nX2lklE6MIW1lc3NhZ2VfYXV0b19kZWxldGVfdGltZXJfY2hhbmdlZJROjBFtZXNzYWdlX3RocmVh\nZF9pZJROjBRtaWdyYXRlX2Zyb21fY2hhdF9pZJROjBJtaWdyYXRlX3RvX2NoYXRfaWSUTowQbmV3\nX2NoYXRfbWVtYmVyc5QpjA5uZXdfY2hhdF9waG90b5QpjA5uZXdfY2hhdF90aXRsZZROjA1wYXNz\ncG9ydF9kYXRhlE6MBXBob3RvlCmMDnBpbm5lZF9tZXNzYWdllE6MBHBvbGyUTowZcHJveGltaXR5\nX2FsZXJ0X3RyaWdnZXJlZJROjAVxdW90ZZROjAxyZXBseV9tYXJrdXCUTowQcmVwbHlfdG9fbWVz\nc2FnZZROjA5yZXBseV90b19zdG9yeZROjBJzZW5kZXJfYm9vc3RfY291bnSUTowTc2VuZGVyX2J1\nc2luZXNzX2JvdJROjAtzZW5kZXJfY2hhdJROjBhzaG93X2NhcHRpb25fYWJvdmVfbWVkaWGUTowH\nc3RpY2tlcpSMF3RlbGVncmFtLl9maWxlcy5zdGlja2VylIwHU3RpY2tlcpSTlCmBlH2UKIwPY3Vz\ndG9tX2Vtb2ppX2lklE6MBWVtb2pplIwE8J+RqJSMBmhlaWdodJRNAAKMC2lzX2FuaW1hdGVklImM\nCGlzX3ZpZGVvlImMDW1hc2tfcG9zaXRpb26UTowQbmVlZHNfcmVwYWludGluZ5ROjBFwcmVtaXVt\nX2FuaW1hdGlvbpROjAhzZXRfbmFtZZSMDWNpdGF0aV9wcm9zdG+UaBJoE4wLU3RpY2tlclR5cGWU\nk5SMB3JlZ3VsYXKUhZRSlIwFd2lkdGiUTQACjAl0aHVtYm5haWyUjBl0ZWxlZ3JhbS5fZmlsZXMu\ncGhvdG9zaXpllIwJUGhvdG9TaXpllJOUKYGUfZQoaJVLgGiiS4CMB2ZpbGVfaWSUjE5BQU1DQWdB\nREdRRUFBZ1MwWms1UnB6NlBrWnU2RWYzRWY3R3dueEFaWW9jQUFpd0NBQUpIQmtNRjBZc0tsOEZM\nZ3E4QkFBZHRBQU0xQkGUjAlmaWxlX3NpemWUTSgVjA5maWxlX3VuaXF1ZV9pZJSMEEFRQURMQUlB\nQWtjR1F3VnmUaBuIaBxorYWUaB59lHViaKmMR0NBQUNBZ0lBQXhrQkFBSUV0R1pPVWFjLWo1R2J1\naEg5eEgteHNKOFFHV0tIQUFJc0FnQUNSd1pEQmRHTENwZkJTNEt2TlFRlGirTTRzaKyMD0FnQURM\nQUlBQWtjR1F3VZRoG4hoHGixhZRoHn2UjAV0aHVtYpR9lChoqWiqaKxorWirTSgVaKJLgGiVS4B1\nc3VijAVzdG9yeZROjBJzdWNjZXNzZnVsX3BheW1lbnSUTowXc3VwZXJncm91cF9jaGF0X2NyZWF0\nZWSUiYwEdGV4dJROjAx1c2Vyc19zaGFyZWSUTowFdmVudWWUTowHdmlhX2JvdJROjAV2aWRlb5RO\njBB2aWRlb19jaGF0X2VuZGVklE6MH3ZpZGVvX2NoYXRfcGFydGljaXBhbnRzX2ludml0ZWSUTowU\ndmlkZW9fY2hhdF9zY2hlZHVsZWSUTowSdmlkZW9fY2hhdF9zdGFydGVklE6MCnZpZGVvX25vdGWU\nTowFdm9pY2WUTowMd2ViX2FwcF9kYXRhlE6MFHdyaXRlX2FjY2Vzc19hbGxvd2VklE6MBGNoYXSU\naAmMBGRhdGWUjAhkYXRldGltZZSMCGRhdGV0aW1llJOUQwoH6AUWFAwXAAAAlIwEcHl0epSMBF9V\nVEOUk5QpUpSGlFKUjAptZXNzYWdlX2lklEsHaBuIaBxLB2gJhpRoHn2UdWKMEG1lc3NhZ2VfcmVh\nY3Rpb26UTowWbWVzc2FnZV9yZWFjdGlvbl9jb3VudJROjA5teV9jaGF0X21lbWJlcpROaIJOjAtw\nb2xsX2Fuc3dlcpROjBJwcmVfY2hlY2tvdXRfcXVlcnmUTowScmVtb3ZlZF9jaGF0X2Jvb3N0lE6M\nDnNoaXBwaW5nX3F1ZXJ5lE6MCXVwZGF0ZV9pZJRLB2gbiGgcSweFlGgefZR1Yi4=\n" }, "response_message": { - "text": "Here's your previous request first attachment sha256 hash: `75681742958b21061e6d5ebb80340d62de4c7348e71fb8c1d2c356a2239b2334`!\nRun /start command again to restart.", + "text": "Here's your previous request first attachment sha256 hash:\n```\n75681742958b21061e6d5ebb80340d62de4c7348e71fb8c1d2c356a2239b2334\n```", "attachments": null, "annotations": null, "misc": null, - "original_message": null - }, - "response_functions": [ - "send_message(42, \"Here's your previous request first attachment sha256 hash: `75681742958b21061e6d5ebb80340d62de4c7348e71fb8c1d2c356a2239b2334`!\\nRun /start command again to restart.\", parse_mode=None, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)" - ] - }, - { - "update": "Update(message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 39, tzinfo=UTC), delete_chat_photo=False, entities=(MessageEntity(length=6, offset=0, type=MessageEntityType.BOT_COMMAND),), from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), group_chat_created=False, message_id=12, supergroup_chat_created=False, text='/start'), update_id=12)", - "received_message": { - "text": "/start", - "attachments": [], - "annotations": null, - "misc": null, - "original_message": "gASVXwsAAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUTowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9qb2luX3JlcXVl\nc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVsZXRlZF9idXNp\nbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5l\nbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROjAdtZXNzYWdllIwRdGVs\nZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1lbnSU\njBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2UjAV2\nYWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowLYm9v\nc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRpb25f\nZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3NldJRO\njAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0ZV9j\naGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9pZJRO\njAhlbnRpdGllc5SMF3RlbGVncmFtLl9tZXNzYWdlZW50aXR5lIwNTWVzc2FnZUVudGl0eZSTlCmB\nlH2UKIwPY3VzdG9tX2Vtb2ppX2lklE6MCGxhbmd1YWdllE6MBmxlbmd0aJRLBowGb2Zmc2V0lEsA\naBJoE4wRTWVzc2FnZUVudGl0eVR5cGWUk5SMC2JvdF9jb21tYW5klIWUUpSMA3VybJROjAR1c2Vy\nlE5oG4hoHGhdSwBLBoeUaB59lHVihZSMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Ns\nb3NlZJROjBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1\nbV90b3BpY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROjAlmcm9tX3VzZXKUjA50ZWxlZ3Jh\nbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2FuX2Nvbm5l\nY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9ncm91cF9t\nZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdlX2NvZGWU\njAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGgefZR1YowE\nZ2FtZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVtX3RvcGlj\nX3VuaGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZlYXdheV9j\ncmVhdGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImMEWhhc19t\nZWRpYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6MFGlzX2F1\ndG9tYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNzYWdllE6M\nEGxlZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRpb26UTowO\nbWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRvX2RlbGV0ZV90aW1lcl9jaGFuZ2VklE6MEW1l\nc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJvbV9jaGF0X2lklE6MEm1pZ3JhdGVfdG9fY2hh\ndF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5ld19jaGF0X3Bob3RvlCmMDm5ld19jaGF0X3Rp\ndGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+UKYwOcGlubmVkX21lc3NhZ2WUTowEcG9sbJRO\njBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6MBXF1b3RllE6MDHJlcGx5X21hcmt1cJROjBBy\nZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6MEnNlbmRlcl9ib29zdF9jb3VudJRO\njBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0lE6MGHNob3dfY2FwdGlvbl9hYm92\nZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nlc3NmdWxfcGF5bWVudJROjBdzdXBl\ncmdyb3VwX2NoYXRfY3JlYXRlZJSJjAR0ZXh0lIwGL3N0YXJ0lIwMdXNlcnNfc2hhcmVklE6MBXZl\nbnVllE6MB3ZpYV9ib3SUTowFdmlkZW+UTowQdmlkZW9fY2hhdF9lbmRlZJROjB92aWRlb19jaGF0\nX3BhcnRpY2lwYW50c19pbnZpdGVklE6MFHZpZGVvX2NoYXRfc2NoZWR1bGVklE6MEnZpZGVvX2No\nYXRfc3RhcnRlZJROjAp2aWRlb19ub3RllE6MBXZvaWNllE6MDHdlYl9hcHBfZGF0YZROjBR3cml0\nZV9hY2Nlc3NfYWxsb3dlZJROjARjaGF0lGgJjARkYXRllIwIZGF0ZXRpbWWUjAhkYXRldGltZZST\nlEMKB+gFFRMJJwAAAJSMBHB5dHqUjARfVVRDlJOUKVKUhpRSlIwKbWVzc2FnZV9pZJRLDGgbiGgc\nSwxoCYaUaB59lHVijBBtZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSU\nTowObXlfY2hhdF9tZW1iZXKUTmiVTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5\nlE6MEnJlbW92ZWRfY2hhdF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSwxo\nG4hoHEsMhZRoHn2UdWIu\n" - }, - "response_message": { - "text": null, - "attachments": [ - { - "chatsky_attachment_type": "location", - "longitude": 27.792887, - "latitude": 58.43161, - "reply_markup": "gASV4gMAAAAAAACMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxp\nbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9p\nbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2U\nKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJs\nlE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hv\nc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1\ndGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTowHX2Zyb3plbpSIjAlfaWRfYXR0\ncnOUKGgUTk5oDE5OTk5OdJSMCmFwaV9rd2FyZ3OUfZR1YoWUaAgpgZR9lChoC4wLYXR0YWNobWVu\ndHOUaA1OaA5OaA9OaBBOaBFOaBJOaBOMFU11bHRpcGxlIGF0dGFjaG1lbnRzIZRoFU5oFk5oF4ho\nGChoIE5OaB9OTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAZzZWNyZXSUaA1OaA5OaA9OaBBOaBFO\naBJOaBOMDVNlY3JldCBpbWFnZSGUaBVOaBZOaBeIaBgoaCdOTmgmTk5OTk50lGgafZR1YoWUaAgp\ngZR9lChoC4wJdGh1bWJuYWlslGgNTmgOTmgPTmgQTmgRTmgSTmgTjBhEb2N1bWVudCB3aXRoIHRo\ndW1ibmFpbCGUaBVOaBZOaBeIaBgoaC5OTmgtTk5OTk50lGgafZR1YoWUaAgpgZR9lChoC4wEaGFz\naJRoDU5oDk5oD05oEE5oEU5oEk5oE4wcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRoFU5o\nFk5oF4hoGChoNU5OaDROTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAdyZXN0YXJ0lGgNTmgOTmgP\nTmgQTmgRTmgSTmgTjAhSZXN0YXJ0IZRoFU5oFk5oF4hoGChoPE5OaDtOTk5OTnSUaBp9lHViaAgp\ngZR9lChoC4wEcXVpdJRoDU5oDk5oD05oEE5oEU5oEk5oE4wFUXVpdCGUaBVOaBZOaBeIaBgoaEJO\nTmhBTk5OTk50lGgafZR1YoaUdJRoF4hoGGhGhZRoGn2UdWIu\n", - "__pickled_extra_fields__": [ - "reply_markup" - ] - } - ], - "annotations": null, - "misc": null, - "original_message": null + "original_message": null, + "parse_mode": "MarkdownV2" }, "response_functions": [ - "send_location(42, 58.43161, 27.792887, horizontal_accuracy=None, disable_notification=None, protect_content=None, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), message_effect_id=None, reply_to_message_id=None)" + "send_message(42, \"Here's your previous request first attachment sha256 hash:\\n```\\n75681742958b21061e6d5ebb80340d62de4c7348e71fb8c1d2c356a2239b2334\\n```\", parse_mode=, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)" ] }, { - "update": "Update(message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 57, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), group_chat_created=False, message_id=13, supergroup_chat_created=False, text='some text'), update_id=13)", + "update": "Update(message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 57, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), group_chat_created=False, message_id=8, supergroup_chat_created=False, text='some text'), update_id=8)", "received_message": { "text": "some text", "attachments": [], "annotations": null, "misc": null, - "original_message": "gASVrAoAAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUTowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9qb2luX3JlcXVl\nc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVsZXRlZF9idXNp\nbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5l\nbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROjAdtZXNzYWdllIwRdGVs\nZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1lbnSU\njBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2UjAV2\nYWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowLYm9v\nc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRpb25f\nZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3NldJRO\njAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0ZV9j\naGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9pZJRO\njAhlbnRpdGllc5QpjA5leHRlcm5hbF9yZXBseZROjBJmb3J1bV90b3BpY19jbG9zZWSUTowTZm9y\ndW1fdG9waWNfY3JlYXRlZJROjBJmb3J1bV90b3BpY19lZGl0ZWSUTowUZm9ydW1fdG9waWNfcmVv\ncGVuZWSUTowOZm9yd2FyZF9vcmlnaW6UTowJZnJvbV91c2VylIwOdGVsZWdyYW0uX3VzZXKUaBCT\nlCmBlH2UKIwYYWRkZWRfdG9fYXR0YWNobWVudF9tZW51lE6MF2Nhbl9jb25uZWN0X3RvX2J1c2lu\nZXNzlE6MD2Nhbl9qb2luX2dyb3Vwc5ROjBtjYW5fcmVhZF9hbGxfZ3JvdXBfbWVzc2FnZXOUTmgL\naAxoDUsqjAZpc19ib3SUiYwKaXNfcHJlbWl1bZROjA1sYW5ndWFnZV9jb2RllIwCZW6UaA9oEIwX\nc3VwcG9ydHNfaW5saW5lX3F1ZXJpZXOUTmgZaBpoG4hoHEsqhZRoHn2UdWKMBGdhbWWUTowaZ2Vu\nZXJhbF9mb3J1bV90b3BpY19oaWRkZW6UTowcZ2VuZXJhbF9mb3J1bV90b3BpY191bmhpZGRlbpRO\njAhnaXZlYXdheZROjBJnaXZlYXdheV9jb21wbGV0ZWSUTowQZ2l2ZWF3YXlfY3JlYXRlZJROjBBn\naXZlYXdheV93aW5uZXJzlE6MEmdyb3VwX2NoYXRfY3JlYXRlZJSJjBFoYXNfbWVkaWFfc3BvaWxl\ncpROjBVoYXNfcHJvdGVjdGVkX2NvbnRlbnSUTowHaW52b2ljZZROjBRpc19hdXRvbWF0aWNfZm9y\nd2FyZJROjA9pc19mcm9tX29mZmxpbmWUTowQaXNfdG9waWNfbWVzc2FnZZROjBBsZWZ0X2NoYXRf\nbWVtYmVylE6MFGxpbmtfcHJldmlld19vcHRpb25zlE6MCGxvY2F0aW9ulE6MDm1lZGlhX2dyb3Vw\nX2lklE6MIW1lc3NhZ2VfYXV0b19kZWxldGVfdGltZXJfY2hhbmdlZJROjBFtZXNzYWdlX3RocmVh\nZF9pZJROjBRtaWdyYXRlX2Zyb21fY2hhdF9pZJROjBJtaWdyYXRlX3RvX2NoYXRfaWSUTowQbmV3\nX2NoYXRfbWVtYmVyc5QpjA5uZXdfY2hhdF9waG90b5QpjA5uZXdfY2hhdF90aXRsZZROjA1wYXNz\ncG9ydF9kYXRhlE6MBXBob3RvlCmMDnBpbm5lZF9tZXNzYWdllE6MBHBvbGyUTowZcHJveGltaXR5\nX2FsZXJ0X3RyaWdnZXJlZJROjAVxdW90ZZROjAxyZXBseV9tYXJrdXCUTowQcmVwbHlfdG9fbWVz\nc2FnZZROjA5yZXBseV90b19zdG9yeZROjBJzZW5kZXJfYm9vc3RfY291bnSUTowTc2VuZGVyX2J1\nc2luZXNzX2JvdJROjAtzZW5kZXJfY2hhdJROjBhzaG93X2NhcHRpb25fYWJvdmVfbWVkaWGUTowH\nc3RpY2tlcpROjAVzdG9yeZROjBJzdWNjZXNzZnVsX3BheW1lbnSUTowXc3VwZXJncm91cF9jaGF0\nX2NyZWF0ZWSUiYwEdGV4dJSMCXNvbWUgdGV4dJSMDHVzZXJzX3NoYXJlZJROjAV2ZW51ZZROjAd2\naWFfYm90lE6MBXZpZGVvlE6MEHZpZGVvX2NoYXRfZW5kZWSUTowfdmlkZW9fY2hhdF9wYXJ0aWNp\ncGFudHNfaW52aXRlZJROjBR2aWRlb19jaGF0X3NjaGVkdWxlZJROjBJ2aWRlb19jaGF0X3N0YXJ0\nZWSUTowKdmlkZW9fbm90ZZROjAV2b2ljZZROjAx3ZWJfYXBwX2RhdGGUTowUd3JpdGVfYWNjZXNz\nX2FsbG93ZWSUTowEY2hhdJRoCYwEZGF0ZZSMCGRhdGV0aW1llIwIZGF0ZXRpbWWUk5RDCgfoBRUT\nCTkAAACUjARweXR6lIwEX1VUQ5STlClSlIaUUpSMCm1lc3NhZ2VfaWSUSw1oG4hoHEsNaAmGlGge\nfZR1YowQbWVzc2FnZV9yZWFjdGlvbpROjBZtZXNzYWdlX3JlYWN0aW9uX2NvdW50lE6MDm15X2No\nYXRfbWVtYmVylE5ogk6MC3BvbGxfYW5zd2VylE6MEnByZV9jaGVja291dF9xdWVyeZROjBJyZW1v\ndmVkX2NoYXRfYm9vc3SUTowOc2hpcHBpbmdfcXVlcnmUTowJdXBkYXRlX2lklEsNaBuIaBxLDYWU\naB59lHViLg==\n" + "original_message": "gASVrAoAAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUTowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9qb2luX3JlcXVl\nc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVsZXRlZF9idXNp\nbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5l\nbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROjAdtZXNzYWdllIwRdGVs\nZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1lbnSU\njBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2UjAV2\nYWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowLYm9v\nc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRpb25f\nZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3NldJRO\njAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0ZV9j\naGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9pZJRO\njAhlbnRpdGllc5QpjA5leHRlcm5hbF9yZXBseZROjBJmb3J1bV90b3BpY19jbG9zZWSUTowTZm9y\ndW1fdG9waWNfY3JlYXRlZJROjBJmb3J1bV90b3BpY19lZGl0ZWSUTowUZm9ydW1fdG9waWNfcmVv\ncGVuZWSUTowOZm9yd2FyZF9vcmlnaW6UTowJZnJvbV91c2VylIwOdGVsZWdyYW0uX3VzZXKUaBCT\nlCmBlH2UKIwYYWRkZWRfdG9fYXR0YWNobWVudF9tZW51lE6MF2Nhbl9jb25uZWN0X3RvX2J1c2lu\nZXNzlE6MD2Nhbl9qb2luX2dyb3Vwc5ROjBtjYW5fcmVhZF9hbGxfZ3JvdXBfbWVzc2FnZXOUTmgL\naAxoDUsqjAZpc19ib3SUiYwKaXNfcHJlbWl1bZROjA1sYW5ndWFnZV9jb2RllIwCZW6UaA9oEIwX\nc3VwcG9ydHNfaW5saW5lX3F1ZXJpZXOUTmgZaBpoG4hoHEsqhZRoHn2UdWKMBGdhbWWUTowaZ2Vu\nZXJhbF9mb3J1bV90b3BpY19oaWRkZW6UTowcZ2VuZXJhbF9mb3J1bV90b3BpY191bmhpZGRlbpRO\njAhnaXZlYXdheZROjBJnaXZlYXdheV9jb21wbGV0ZWSUTowQZ2l2ZWF3YXlfY3JlYXRlZJROjBBn\naXZlYXdheV93aW5uZXJzlE6MEmdyb3VwX2NoYXRfY3JlYXRlZJSJjBFoYXNfbWVkaWFfc3BvaWxl\ncpROjBVoYXNfcHJvdGVjdGVkX2NvbnRlbnSUTowHaW52b2ljZZROjBRpc19hdXRvbWF0aWNfZm9y\nd2FyZJROjA9pc19mcm9tX29mZmxpbmWUTowQaXNfdG9waWNfbWVzc2FnZZROjBBsZWZ0X2NoYXRf\nbWVtYmVylE6MFGxpbmtfcHJldmlld19vcHRpb25zlE6MCGxvY2F0aW9ulE6MDm1lZGlhX2dyb3Vw\nX2lklE6MIW1lc3NhZ2VfYXV0b19kZWxldGVfdGltZXJfY2hhbmdlZJROjBFtZXNzYWdlX3RocmVh\nZF9pZJROjBRtaWdyYXRlX2Zyb21fY2hhdF9pZJROjBJtaWdyYXRlX3RvX2NoYXRfaWSUTowQbmV3\nX2NoYXRfbWVtYmVyc5QpjA5uZXdfY2hhdF9waG90b5QpjA5uZXdfY2hhdF90aXRsZZROjA1wYXNz\ncG9ydF9kYXRhlE6MBXBob3RvlCmMDnBpbm5lZF9tZXNzYWdllE6MBHBvbGyUTowZcHJveGltaXR5\nX2FsZXJ0X3RyaWdnZXJlZJROjAVxdW90ZZROjAxyZXBseV9tYXJrdXCUTowQcmVwbHlfdG9fbWVz\nc2FnZZROjA5yZXBseV90b19zdG9yeZROjBJzZW5kZXJfYm9vc3RfY291bnSUTowTc2VuZGVyX2J1\nc2luZXNzX2JvdJROjAtzZW5kZXJfY2hhdJROjBhzaG93X2NhcHRpb25fYWJvdmVfbWVkaWGUTowH\nc3RpY2tlcpROjAVzdG9yeZROjBJzdWNjZXNzZnVsX3BheW1lbnSUTowXc3VwZXJncm91cF9jaGF0\nX2NyZWF0ZWSUiYwEdGV4dJSMCXNvbWUgdGV4dJSMDHVzZXJzX3NoYXJlZJROjAV2ZW51ZZROjAd2\naWFfYm90lE6MBXZpZGVvlE6MEHZpZGVvX2NoYXRfZW5kZWSUTowfdmlkZW9fY2hhdF9wYXJ0aWNp\ncGFudHNfaW52aXRlZJROjBR2aWRlb19jaGF0X3NjaGVkdWxlZJROjBJ2aWRlb19jaGF0X3N0YXJ0\nZWSUTowKdmlkZW9fbm90ZZROjAV2b2ljZZROjAx3ZWJfYXBwX2RhdGGUTowUd3JpdGVfYWNjZXNz\nX2FsbG93ZWSUTowEY2hhdJRoCYwEZGF0ZZSMCGRhdGV0aW1llIwIZGF0ZXRpbWWUk5RDCgfoBRUT\nCTkAAACUjARweXR6lIwEX1VUQ5STlClSlIaUUpSMCm1lc3NhZ2VfaWSUSwhoG4hoHEsIaAmGlGge\nfZR1YowQbWVzc2FnZV9yZWFjdGlvbpROjBZtZXNzYWdlX3JlYWN0aW9uX2NvdW50lE6MDm15X2No\nYXRfbWVtYmVylE5ogk6MC3BvbGxfYW5zd2VylE6MEnByZV9jaGVja291dF9xdWVyeZROjBJyZW1v\ndmVkX2NoYXRfYm9vc3SUTowOc2hpcHBpbmdfcXVlcnmUTowJdXBkYXRlX2lklEsIaBuIaBxLCIWU\naB59lHViLg==\n" }, "response_message": { - "text": "Bot has entered unrecoverable state:/\nRun /start command again to restart.", + "text": "Bot has entered unrecoverable state:\nRun /start command again to restart.", "attachments": null, "annotations": null, "misc": null, "original_message": null }, "response_functions": [ - "send_message(42, 'Bot has entered unrecoverable state:/\\nRun /start command again to restart.', parse_mode=None, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)" + "send_message(42, 'Bot has entered unrecoverable state:\\nRun /start command again to restart.', parse_mode=None, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)" ] }, { - "update": "Update(message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 59, tzinfo=UTC), delete_chat_photo=False, entities=(MessageEntity(length=6, offset=0, type=MessageEntityType.BOT_COMMAND),), from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), group_chat_created=False, message_id=14, supergroup_chat_created=False, text='/start'), update_id=14)", + "update": "Update(message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 59, tzinfo=UTC), delete_chat_photo=False, entities=(MessageEntity(length=6, offset=0, type=MessageEntityType.BOT_COMMAND),), from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), group_chat_created=False, message_id=9, supergroup_chat_created=False, text='/start'), update_id=9)", "received_message": { "text": "/start", "attachments": [], "annotations": null, "misc": null, - "original_message": "gASVXwsAAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUTowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9qb2luX3JlcXVl\nc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVsZXRlZF9idXNp\nbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5l\nbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROjAdtZXNzYWdllIwRdGVs\nZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1lbnSU\njBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2UjAV2\nYWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowLYm9v\nc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRpb25f\nZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3NldJRO\njAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0ZV9j\naGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9pZJRO\njAhlbnRpdGllc5SMF3RlbGVncmFtLl9tZXNzYWdlZW50aXR5lIwNTWVzc2FnZUVudGl0eZSTlCmB\nlH2UKIwPY3VzdG9tX2Vtb2ppX2lklE6MCGxhbmd1YWdllE6MBmxlbmd0aJRLBowGb2Zmc2V0lEsA\naBJoE4wRTWVzc2FnZUVudGl0eVR5cGWUk5SMC2JvdF9jb21tYW5klIWUUpSMA3VybJROjAR1c2Vy\nlE5oG4hoHGhdSwBLBoeUaB59lHVihZSMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Ns\nb3NlZJROjBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1\nbV90b3BpY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROjAlmcm9tX3VzZXKUjA50ZWxlZ3Jh\nbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2FuX2Nvbm5l\nY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9ncm91cF9t\nZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdlX2NvZGWU\njAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGgefZR1YowE\nZ2FtZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVtX3RvcGlj\nX3VuaGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZlYXdheV9j\ncmVhdGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImMEWhhc19t\nZWRpYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6MFGlzX2F1\ndG9tYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNzYWdllE6M\nEGxlZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRpb26UTowO\nbWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRvX2RlbGV0ZV90aW1lcl9jaGFuZ2VklE6MEW1l\nc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJvbV9jaGF0X2lklE6MEm1pZ3JhdGVfdG9fY2hh\ndF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5ld19jaGF0X3Bob3RvlCmMDm5ld19jaGF0X3Rp\ndGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+UKYwOcGlubmVkX21lc3NhZ2WUTowEcG9sbJRO\njBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6MBXF1b3RllE6MDHJlcGx5X21hcmt1cJROjBBy\nZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6MEnNlbmRlcl9ib29zdF9jb3VudJRO\njBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0lE6MGHNob3dfY2FwdGlvbl9hYm92\nZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nlc3NmdWxfcGF5bWVudJROjBdzdXBl\ncmdyb3VwX2NoYXRfY3JlYXRlZJSJjAR0ZXh0lIwGL3N0YXJ0lIwMdXNlcnNfc2hhcmVklE6MBXZl\nbnVllE6MB3ZpYV9ib3SUTowFdmlkZW+UTowQdmlkZW9fY2hhdF9lbmRlZJROjB92aWRlb19jaGF0\nX3BhcnRpY2lwYW50c19pbnZpdGVklE6MFHZpZGVvX2NoYXRfc2NoZWR1bGVklE6MEnZpZGVvX2No\nYXRfc3RhcnRlZJROjAp2aWRlb19ub3RllE6MBXZvaWNllE6MDHdlYl9hcHBfZGF0YZROjBR3cml0\nZV9hY2Nlc3NfYWxsb3dlZJROjARjaGF0lGgJjARkYXRllIwIZGF0ZXRpbWWUjAhkYXRldGltZZST\nlEMKB+gFFRMJOwAAAJSMBHB5dHqUjARfVVRDlJOUKVKUhpRSlIwKbWVzc2FnZV9pZJRLDmgbiGgc\nSw5oCYaUaB59lHVijBBtZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSU\nTowObXlfY2hhdF9tZW1iZXKUTmiVTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5\nlE6MEnJlbW92ZWRfY2hhdF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSw5o\nG4hoHEsOhZRoHn2UdWIu\n" + "original_message": "gASVXwsAAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUTowMY2hhbm5lbF9wb3N0lE6MCmNoYXRfYm9vc3SUTowRY2hhdF9qb2luX3JlcXVl\nc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGluZV9yZXN1bHSUTowZZGVsZXRlZF9idXNp\nbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3NfbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5l\nbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGluZV9xdWVyeZROjAdtZXNzYWdllIwRdGVs\nZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVfZWZmZWN0aXZlX2F0dGFjaG1lbnSU\njBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVmYXVsdFZhbHVllJOUKYGUTn2UjAV2\nYWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1dGhvcl9zaWduYXR1cmWUTowLYm9v\nc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJROjAdjYXB0aW9ulE6MEGNhcHRpb25f\nZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwTY2hhdF9iYWNrZ3JvdW5kX3NldJRO\njAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZROjAdjb250YWN0lE6MEWRlbGV0ZV9j\naGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRpdF9kYXRllE6MCWVmZmVjdF9pZJRO\njAhlbnRpdGllc5SMF3RlbGVncmFtLl9tZXNzYWdlZW50aXR5lIwNTWVzc2FnZUVudGl0eZSTlCmB\nlH2UKIwPY3VzdG9tX2Vtb2ppX2lklE6MCGxhbmd1YWdllE6MBmxlbmd0aJRLBowGb2Zmc2V0lEsA\naBJoE4wRTWVzc2FnZUVudGl0eVR5cGWUk5SMC2JvdF9jb21tYW5klIWUUpSMA3VybJROjAR1c2Vy\nlE5oG4hoHGhdSwBLBoeUaB59lHVihZSMDmV4dGVybmFsX3JlcGx5lE6MEmZvcnVtX3RvcGljX2Ns\nb3NlZJROjBNmb3J1bV90b3BpY19jcmVhdGVklE6MEmZvcnVtX3RvcGljX2VkaXRlZJROjBRmb3J1\nbV90b3BpY19yZW9wZW5lZJROjA5mb3J3YXJkX29yaWdpbpROjAlmcm9tX3VzZXKUjA50ZWxlZ3Jh\nbS5fdXNlcpRoEJOUKYGUfZQojBhhZGRlZF90b19hdHRhY2htZW50X21lbnWUTowXY2FuX2Nvbm5l\nY3RfdG9fYnVzaW5lc3OUTowPY2FuX2pvaW5fZ3JvdXBzlE6MG2Nhbl9yZWFkX2FsbF9ncm91cF9t\nZXNzYWdlc5ROaAtoDGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVtlE6MDWxhbmd1YWdlX2NvZGWU\njAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBloGmgbiGgcSyqFlGgefZR1YowE\nZ2FtZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVtX3RvcGlj\nX3VuaGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZlYXdheV9j\ncmVhdGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImMEWhhc19t\nZWRpYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6MFGlzX2F1\ndG9tYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNzYWdllE6M\nEGxlZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRpb26UTowO\nbWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRvX2RlbGV0ZV90aW1lcl9jaGFuZ2VklE6MEW1l\nc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJvbV9jaGF0X2lklE6MEm1pZ3JhdGVfdG9fY2hh\ndF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5ld19jaGF0X3Bob3RvlCmMDm5ld19jaGF0X3Rp\ndGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+UKYwOcGlubmVkX21lc3NhZ2WUTowEcG9sbJRO\njBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6MBXF1b3RllE6MDHJlcGx5X21hcmt1cJROjBBy\nZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6MEnNlbmRlcl9ib29zdF9jb3VudJRO\njBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0lE6MGHNob3dfY2FwdGlvbl9hYm92\nZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nlc3NmdWxfcGF5bWVudJROjBdzdXBl\ncmdyb3VwX2NoYXRfY3JlYXRlZJSJjAR0ZXh0lIwGL3N0YXJ0lIwMdXNlcnNfc2hhcmVklE6MBXZl\nbnVllE6MB3ZpYV9ib3SUTowFdmlkZW+UTowQdmlkZW9fY2hhdF9lbmRlZJROjB92aWRlb19jaGF0\nX3BhcnRpY2lwYW50c19pbnZpdGVklE6MFHZpZGVvX2NoYXRfc2NoZWR1bGVklE6MEnZpZGVvX2No\nYXRfc3RhcnRlZJROjAp2aWRlb19ub3RllE6MBXZvaWNllE6MDHdlYl9hcHBfZGF0YZROjBR3cml0\nZV9hY2Nlc3NfYWxsb3dlZJROjARjaGF0lGgJjARkYXRllIwIZGF0ZXRpbWWUjAhkYXRldGltZZST\nlEMKB+gFFRMJOwAAAJSMBHB5dHqUjARfVVRDlJOUKVKUhpRSlIwKbWVzc2FnZV9pZJRLCWgbiGgc\nSwloCYaUaB59lHVijBBtZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSU\nTowObXlfY2hhdF9tZW1iZXKUTmiVTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5\nlE6MEnJlbW92ZWRfY2hhdF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSwlo\nG4hoHEsJhZRoHn2UdWIu\n" }, "response_message": { - "text": null, - "attachments": [ - { - "chatsky_attachment_type": "location", - "longitude": 27.792887, - "latitude": 58.43161, - "reply_markup": "gASV4gMAAAAAAACMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxp\nbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9p\nbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2U\nKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJs\nlE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hv\nc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1\ndGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTowHX2Zyb3plbpSIjAlfaWRfYXR0\ncnOUKGgUTk5oDE5OTk5OdJSMCmFwaV9rd2FyZ3OUfZR1YoWUaAgpgZR9lChoC4wLYXR0YWNobWVu\ndHOUaA1OaA5OaA9OaBBOaBFOaBJOaBOMFU11bHRpcGxlIGF0dGFjaG1lbnRzIZRoFU5oFk5oF4ho\nGChoIE5OaB9OTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAZzZWNyZXSUaA1OaA5OaA9OaBBOaBFO\naBJOaBOMDVNlY3JldCBpbWFnZSGUaBVOaBZOaBeIaBgoaCdOTmgmTk5OTk50lGgafZR1YoWUaAgp\ngZR9lChoC4wJdGh1bWJuYWlslGgNTmgOTmgPTmgQTmgRTmgSTmgTjBhEb2N1bWVudCB3aXRoIHRo\ndW1ibmFpbCGUaBVOaBZOaBeIaBgoaC5OTmgtTk5OTk50lGgafZR1YoWUaAgpgZR9lChoC4wEaGFz\naJRoDU5oDk5oD05oEE5oEU5oEk5oE4wcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRoFU5o\nFk5oF4hoGChoNU5OaDROTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAdyZXN0YXJ0lGgNTmgOTmgP\nTmgQTmgRTmgSTmgTjAhSZXN0YXJ0IZRoFU5oFk5oF4hoGChoPE5OaDtOTk5OTnSUaBp9lHViaAgp\ngZR9lChoC4wEcXVpdJRoDU5oDk5oD05oEE5oEU5oEk5oE4wFUXVpdCGUaBVOaBZOaBeIaBgoaEJO\nTmhBTk5OTk50lGgafZR1YoaUdJRoF4hoGGhGhZRoGn2UdWIu\n", - "__pickled_extra_fields__": [ - "reply_markup" - ] - } - ], + "text": "Welcome! Choose what you want to receive.", + "attachments": null, "annotations": null, "misc": null, - "original_message": null + "original_message": null, + "reply_markup": "gASVkgMAAAAAAACMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxp\nbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9p\nbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2U\nKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJs\nlE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hv\nc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1\ndGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTowHX2Zyb3plbpSIjAlfaWRfYXR0\ncnOUKGgUTk5oDE5OTk5OdJSMCmFwaV9rd2FyZ3OUfZR1YoWUaAgpgZR9lChoC4wLYXR0YWNobWVu\ndHOUaA1OaA5OaA9OaBBOaBFOaBJOaBOMFU11bHRpcGxlIGF0dGFjaG1lbnRzIZRoFU5oFk5oF4ho\nGChoIE5OaB9OTk5OTnSUaBp9lHViaAgpgZR9lChoC4wGc2VjcmV0lGgNTmgOTmgPTmgQTmgRTmgS\nTmgTjA1TZWNyZXQgaW1hZ2UhlGgVTmgWTmgXiGgYKGgmTk5oJU5OTk5OdJRoGn2UdWJoCCmBlH2U\nKGgLjAl0aHVtYm5haWyUaA1OaA5OaA9OaBBOaBFOaBJOaBOMGERvY3VtZW50IHdpdGggdGh1bWJu\nYWlsIZRoFU5oFk5oF4hoGChoLE5OaCtOTk5OTnSUaBp9lHVih5RoCCmBlH2UKGgLjARoYXNolGgN\nTmgOTmgPTmgQTmgRTmgSTmgTjBxGaXJzdCBhdHRhY2htZW50IGJ5dGVzIGhhc2ghlGgVTmgWTmgX\niGgYKGgzTk5oMk5OTk5OdJRoGn2UdWKFlGgIKYGUfZQoaAuMB3Jlc3RhcnSUaA1OaA5OaA9OaBBO\naBFOaBJOaBOMCFJlc3RhcnQhlGgVTmgWTmgXiGgYKGg6Tk5oOU5OTk5OdJRoGn2UdWKFlHSUaBeI\naBhoPoWUaBp9lHViLg==\n", + "__pickled_extra_fields__": [ + "reply_markup" + ] }, "response_functions": [ - "send_location(42, 58.43161, 27.792887, horizontal_accuracy=None, disable_notification=None, protect_content=None, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), message_effect_id=None, reply_to_message_id=None)" + "send_message(42, 'Welcome! Choose what you want to receive.', parse_mode=None, disable_notification=None, protect_content=None, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'), InlineKeyboardButton(callback_data='secret', text='Secret image!'), InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!')), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'),))), message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)" ] }, { - "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='restart', from_user=User(first_name='AlexaTestnder', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='14', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 59, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=16, is_bot=True, username='chatsky_bot'), group_chat_created=False, location=Location(latitude=58.43162, longitude=27.792879), message_id=15, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), supergroup_chat_created=False)), update_id=15)", + "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='restart', from_user=User(first_name='AlexaTestnder', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='14', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 9, 59, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=16, is_bot=True, username='chatsky_bot'), group_chat_created=False, text='Welcome! Choose what you want to receive.', message_id=10, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'), InlineKeyboardButton(callback_data='secret', text='Secret image!'), InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), ))), supergroup_chat_created=False)), update_id=10)", "received_message": { "text": null, "attachments": [ @@ -906,52 +745,21 @@ ], "annotations": null, "misc": null, - "original_message": "gASVDRAAAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjAdyZXN0YXJ0lIwJZnJvbV91c2VylIwOdGVs\nZWdyYW0uX3VzZXKUaBCTlCmBlH2UKIwYYWRkZWRfdG9fYXR0YWNobWVudF9tZW51lE6MF2Nhbl9j\nb25uZWN0X3RvX2J1c2luZXNzlE6MD2Nhbl9qb2luX2dyb3Vwc5ROjBtjYW5fcmVhZF9hbGxfZ3Jv\ndXBfbWVzc2FnZXOUTmgLjA1BbGV4YVRlc3RuZGVylGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVt\nlE6MDWxhbmd1YWdlX2NvZGWUjAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBlo\nGmgbiGgcSyqFlGgefZR1YowPZ2FtZV9zaG9ydF9uYW1llE5oDYwCMTSUjBFpbmxpbmVfbWVzc2Fn\nZV9pZJROjAdtZXNzYWdllIwRdGVsZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVf\nZWZmZWN0aXZlX2F0dGFjaG1lbnSUjBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVm\nYXVsdFZhbHVllJOUKYGUTn2UjAV2YWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1\ndGhvcl9zaWduYXR1cmWUTowLYm9vc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJRO\njAdjYXB0aW9ulE6MEGNhcHRpb25fZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwT\nY2hhdF9iYWNrZ3JvdW5kX3NldJROjAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZRO\njAdjb250YWN0lE6MEWRlbGV0ZV9jaGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRp\ndF9kYXRllE6MCWVmZmVjdF9pZJROjAhlbnRpdGllc5QpjA5leHRlcm5hbF9yZXBseZROjBJmb3J1\nbV90b3BpY19jbG9zZWSUTowTZm9ydW1fdG9waWNfY3JlYXRlZJROjBJmb3J1bV90b3BpY19lZGl0\nZWSUTowUZm9ydW1fdG9waWNfcmVvcGVuZWSUTowOZm9yd2FyZF9vcmlnaW6UTmgvaDEpgZR9lCho\nNE5oNU5oNk5oN05oC4wDQm90lGgNSxBoOYhoOk5oO05oD05oPU5oGYwLY2hhdHNreV9ib3SUaBuI\naBxLEIWUaB59lHVijARnYW1llE6MGmdlbmVyYWxfZm9ydW1fdG9waWNfaGlkZGVulE6MHGdlbmVy\nYWxfZm9ydW1fdG9waWNfdW5oaWRkZW6UTowIZ2l2ZWF3YXmUTowSZ2l2ZWF3YXlfY29tcGxldGVk\nlE6MEGdpdmVhd2F5X2NyZWF0ZWSUTowQZ2l2ZWF3YXlfd2lubmVyc5ROjBJncm91cF9jaGF0X2Ny\nZWF0ZWSUiYwRaGFzX21lZGlhX3Nwb2lsZXKUTowVaGFzX3Byb3RlY3RlZF9jb250ZW50lE6MB2lu\ndm9pY2WUTowUaXNfYXV0b21hdGljX2ZvcndhcmSUTowPaXNfZnJvbV9vZmZsaW5llE6MEGlzX3Rv\ncGljX21lc3NhZ2WUTowQbGVmdF9jaGF0X21lbWJlcpROjBRsaW5rX3ByZXZpZXdfb3B0aW9uc5RO\njAhsb2NhdGlvbpSMGHRlbGVncmFtLl9maWxlcy5sb2NhdGlvbpSMCExvY2F0aW9ulJOUKYGUfZQo\njAdoZWFkaW5nlE6ME2hvcml6b250YWxfYWNjdXJhY3mUTowIbGF0aXR1ZGWUR0BNNz9S/CZXjAts\naXZlX3BlcmlvZJROjAlsb25naXR1ZGWUR0A7yvoePq9ojBZwcm94aW1pdHlfYWxlcnRfcmFkaXVz\nlE5oG4hoHEdAO8r6Hj6vaEdATTc/UvwmV4aUaB59lHVijA5tZWRpYV9ncm91cF9pZJROjCFtZXNz\nYWdlX2F1dG9fZGVsZXRlX3RpbWVyX2NoYW5nZWSUTowRbWVzc2FnZV90aHJlYWRfaWSUTowUbWln\ncmF0ZV9mcm9tX2NoYXRfaWSUTowSbWlncmF0ZV90b19jaGF0X2lklE6MEG5ld19jaGF0X21lbWJl\ncnOUKYwObmV3X2NoYXRfcGhvdG+UKYwObmV3X2NoYXRfdGl0bGWUTowNcGFzc3BvcnRfZGF0YZRO\njAVwaG90b5QpjA5waW5uZWRfbWVzc2FnZZROjARwb2xslE6MGXByb3hpbWl0eV9hbGVydF90cmln\nZ2VyZWSUTowFcXVvdGWUTowMcmVwbHlfbWFya3VwlIwldGVsZWdyYW0uX2lubGluZS5pbmxpbmVr\nZXlib2FyZG1hcmt1cJSMFElubGluZUtleWJvYXJkTWFya3VwlJOUKYGUfZQojA9pbmxpbmVfa2V5\nYm9hcmSUKIwldGVsZWdyYW0uX2lubGluZS5pbmxpbmVrZXlib2FyZGJ1dHRvbpSMFElubGluZUtl\neWJvYXJkQnV0dG9ulJOUKYGUfZQojA1jYWxsYmFja19kYXRhlIwJZm9ybWF0dGVklIwNY2FsbGJh\nY2tfZ2FtZZROjAlsb2dpbl91cmyUTowDcGF5lE6ME3N3aXRjaF9pbmxpbmVfcXVlcnmUTowfc3dp\ndGNoX2lubGluZV9xdWVyeV9jaG9zZW5fY2hhdJROjCBzd2l0Y2hfaW5saW5lX3F1ZXJ5X2N1cnJl\nbnRfY2hhdJROjAR0ZXh0lIwUQ3V0ZSBmb3JtYXR0ZWQgdGV4dCGUjAN1cmyUTowHd2ViX2FwcJRO\naBuIaBwoaLBOTmioTk5OTk50lGgefZR1YoWUaKQpgZR9lChop4wLYXR0YWNobWVudHOUaKlOaKpO\naKtOaKxOaK1OaK5OaK+MFU11bHRpcGxlIGF0dGFjaG1lbnRzIZRosU5osk5oG4hoHChouU5OaLhO\nTk5OTnSUaB59lHVihZRopCmBlH2UKGinjAZzZWNyZXSUaKlOaKpOaKtOaKxOaK1OaK5OaK+MDVNl\nY3JldCBpbWFnZSGUaLFOaLJOaBuIaBwoaMBOTmi/Tk5OTk50lGgefZR1YoWUaKQpgZR9lChop4wJ\ndGh1bWJuYWlslGipTmiqTmirTmisTmitTmiuTmivjBhEb2N1bWVudCB3aXRoIHRodW1ibmFpbCGU\naLFOaLJOaBuIaBwoaMdOTmjGTk5OTk50lGgefZR1YoWUaKQpgZR9lChop4wEaGFzaJRoqU5oqk5o\nq05orE5orU5ork5or4wcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRosU5osk5oG4hoHCho\nzk5OaM1OTk5OTnSUaB59lHVihZRopCmBlH2UKGinaC5oqU5oqk5oq05orE5orU5ork5or4wIUmVz\ndGFydCGUaLFOaLJOaBuIaBwoaNROTmguTk5OTk50lGgefZR1YmikKYGUfZQoaKeMBHF1aXSUaKlO\naKpOaKtOaKxOaK1OaK5OaK+MBVF1aXQhlGixTmiyTmgbiGgcKGjaTk5o2U5OTk5OdJRoHn2UdWKG\nlHSUaBuIaBxo3oWUaB59lHVijBByZXBseV90b19tZXNzYWdllE6MDnJlcGx5X3RvX3N0b3J5lE6M\nEnNlbmRlcl9ib29zdF9jb3VudJROjBNzZW5kZXJfYnVzaW5lc3NfYm90lE6MC3NlbmRlcl9jaGF0\nlE6MGHNob3dfY2FwdGlvbl9hYm92ZV9tZWRpYZROjAdzdGlja2VylE6MBXN0b3J5lE6MEnN1Y2Nl\nc3NmdWxfcGF5bWVudJROjBdzdXBlcmdyb3VwX2NoYXRfY3JlYXRlZJSJaK9OjAx1c2Vyc19zaGFy\nZWSUTowFdmVudWWUTowHdmlhX2JvdJROjAV2aWRlb5ROjBB2aWRlb19jaGF0X2VuZGVklE6MH3Zp\nZGVvX2NoYXRfcGFydGljaXBhbnRzX2ludml0ZWSUTowUdmlkZW9fY2hhdF9zY2hlZHVsZWSUTowS\ndmlkZW9fY2hhdF9zdGFydGVklE6MCnZpZGVvX25vdGWUTowFdm9pY2WUTowMd2ViX2FwcF9kYXRh\nlE6MFHdyaXRlX2FjY2Vzc19hbGxvd2VklE6MBGNoYXSUaAmMBGRhdGWUjAhkYXRldGltZZSMCGRh\ndGV0aW1llJOUQwoH6AUVEwk7AAAAlIwEcHl0epSMBF9VVEOUk5QpUpSGlFKUjAptZXNzYWdlX2lk\nlEsPaBuIaBxLD2gJhpRoHn2UdWJoG4hoHGhBhZRoHn2UdWKMDGNoYW5uZWxfcG9zdJROjApjaGF0\nX2Jvb3N0lE6MEWNoYXRfam9pbl9yZXF1ZXN0lE6MC2NoYXRfbWVtYmVylE6MFGNob3Nlbl9pbmxp\nbmVfcmVzdWx0lE6MGWRlbGV0ZWRfYnVzaW5lc3NfbWVzc2FnZXOUTowXZWRpdGVkX2J1c2luZXNz\nX21lc3NhZ2WUTowTZWRpdGVkX2NoYW5uZWxfcG9zdJROjA5lZGl0ZWRfbWVzc2FnZZROjAxpbmxp\nbmVfcXVlcnmUTmhDTowQbWVzc2FnZV9yZWFjdGlvbpROjBZtZXNzYWdlX3JlYWN0aW9uX2NvdW50\nlE6MDm15X2NoYXRfbWVtYmVylE5omE6MC3BvbGxfYW5zd2VylE6MEnByZV9jaGVja291dF9xdWVy\neZROjBJyZW1vdmVkX2NoYXRfYm9vc3SUTowOc2hpcHBpbmdfcXVlcnmUTowJdXBkYXRlX2lklEsP\naBuIaBxLD4WUaB59lHViLg==\n" - }, - "response_message": { - "text": null, - "attachments": [ - { - "chatsky_attachment_type": "location", - "longitude": 27.792887, - "latitude": 58.43161, - "reply_markup": "gASV4gMAAAAAAACMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxp\nbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9p\nbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2U\nKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJs\nlE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hv\nc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1\ndGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTowHX2Zyb3plbpSIjAlfaWRfYXR0\ncnOUKGgUTk5oDE5OTk5OdJSMCmFwaV9rd2FyZ3OUfZR1YoWUaAgpgZR9lChoC4wLYXR0YWNobWVu\ndHOUaA1OaA5OaA9OaBBOaBFOaBJOaBOMFU11bHRpcGxlIGF0dGFjaG1lbnRzIZRoFU5oFk5oF4ho\nGChoIE5OaB9OTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAZzZWNyZXSUaA1OaA5OaA9OaBBOaBFO\naBJOaBOMDVNlY3JldCBpbWFnZSGUaBVOaBZOaBeIaBgoaCdOTmgmTk5OTk50lGgafZR1YoWUaAgp\ngZR9lChoC4wJdGh1bWJuYWlslGgNTmgOTmgPTmgQTmgRTmgSTmgTjBhEb2N1bWVudCB3aXRoIHRo\ndW1ibmFpbCGUaBVOaBZOaBeIaBgoaC5OTmgtTk5OTk50lGgafZR1YoWUaAgpgZR9lChoC4wEaGFz\naJRoDU5oDk5oD05oEE5oEU5oEk5oE4wcRmlyc3QgYXR0YWNobWVudCBieXRlcyBoYXNoIZRoFU5o\nFk5oF4hoGChoNU5OaDROTk5OTnSUaBp9lHVihZRoCCmBlH2UKGgLjAdyZXN0YXJ0lGgNTmgOTmgP\nTmgQTmgRTmgSTmgTjAhSZXN0YXJ0IZRoFU5oFk5oF4hoGChoPE5OaDtOTk5OTnSUaBp9lHViaAgp\ngZR9lChoC4wEcXVpdJRoDU5oDk5oD05oEE5oEU5oEk5oE4wFUXVpdCGUaBVOaBZOaBeIaBgoaEJO\nTmhBTk5OTk50lGgafZR1YoaUdJRoF4hoGGhGhZRoGn2UdWIu\n", - "__pickled_extra_fields__": [ - "reply_markup" - ] - } - ], - "annotations": null, - "misc": null, - "original_message": null - }, - "response_functions": [ - "send_location(42, 58.43161, 27.792887, horizontal_accuracy=None, disable_notification=None, protect_content=None, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), message_effect_id=None, reply_to_message_id=None)" - ] - }, - { - "update": "Update(callback_query=CallbackQuery(chat_instance='-1', data='quit', from_user=User(first_name='Test', id=42, is_bot=False, language_code='en', last_name='User', username='test_user'), id='15', message=Message(channel_chat_created=False, chat=Chat(first_name='Test', id=42, last_name='User', type=ChatType.PRIVATE, username='test_user'), date=datetime.datetime(2024, 5, 21, 19, 10, 1, tzinfo=UTC), delete_chat_photo=False, from_user=User(first_name='Bot', id=16, is_bot=True, username='chatsky_bot'), group_chat_created=False, location=Location(latitude=58.43162, longitude=27.792879), message_id=16, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'),), (InlineKeyboardButton(callback_data='secret', text='Secret image!'),), (InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!'),), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'), InlineKeyboardButton(callback_data='quit', text='Quit!')))), supergroup_chat_created=False)), update_id=16)", - "received_message": { - "text": null, - "attachments": [ - { - "chatsky_attachment_type": "callback_query", - "query_string": "quit" - } - ], - "annotations": null, - "misc": null, - "original_message": "gASV/w8AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjARxdWl0lIwJZnJvbV91c2VylIwOdGVsZWdy\nYW0uX3VzZXKUaBCTlCmBlH2UKIwYYWRkZWRfdG9fYXR0YWNobWVudF9tZW51lE6MF2Nhbl9jb25u\nZWN0X3RvX2J1c2luZXNzlE6MD2Nhbl9qb2luX2dyb3Vwc5ROjBtjYW5fcmVhZF9hbGxfZ3JvdXBf\nbWVzc2FnZXOUTmgLaAxoDUsqjAZpc19ib3SUiYwKaXNfcHJlbWl1bZROjA1sYW5ndWFnZV9jb2Rl\nlIwCZW6UaA9oEIwXc3VwcG9ydHNfaW5saW5lX3F1ZXJpZXOUTmgZaBpoG4hoHEsqhZRoHn2UdWKM\nD2dhbWVfc2hvcnRfbmFtZZROaA2MAjE1lIwRaW5saW5lX21lc3NhZ2VfaWSUTowHbWVzc2FnZZSM\nEXRlbGVncmFtLl9tZXNzYWdllIwHTWVzc2FnZZSTlCmBlH2UKIwVX2VmZmVjdGl2ZV9hdHRhY2ht\nZW50lIwcdGVsZWdyYW0uX3V0aWxzLmRlZmF1bHR2YWx1ZZSMDERlZmF1bHRWYWx1ZZSTlCmBlE59\nlIwFdmFsdWWUTnOGlGKMCWFuaW1hdGlvbpROjAVhdWRpb5ROjBBhdXRob3Jfc2lnbmF0dXJllE6M\nC2Jvb3N0X2FkZGVklE6MFmJ1c2luZXNzX2Nvbm5lY3Rpb25faWSUTowHY2FwdGlvbpROjBBjYXB0\naW9uX2VudGl0aWVzlCmMFGNoYW5uZWxfY2hhdF9jcmVhdGVklImME2NoYXRfYmFja2dyb3VuZF9z\nZXSUTowLY2hhdF9zaGFyZWSUTowRY29ubmVjdGVkX3dlYnNpdGWUTowHY29udGFjdJROjBFkZWxl\ndGVfY2hhdF9waG90b5SJjARkaWNllE6MCGRvY3VtZW50lE6MCWVkaXRfZGF0ZZROjAllZmZlY3Rf\naWSUTowIZW50aXRpZXOUKYwOZXh0ZXJuYWxfcmVwbHmUTowSZm9ydW1fdG9waWNfY2xvc2VklE6M\nE2ZvcnVtX3RvcGljX2NyZWF0ZWSUTowSZm9ydW1fdG9waWNfZWRpdGVklE6MFGZvcnVtX3RvcGlj\nX3Jlb3BlbmVklE6MDmZvcndhcmRfb3JpZ2lulE5oL2gxKYGUfZQoaDROaDVOaDZOaDdOaAuMA0Jv\ndJRoDUsQaDiIaDlOaDpOaA9OaDxOaBmMC2NoYXRza3lfYm90lGgbiGgcSxCFlGgefZR1YowEZ2Ft\nZZROjBpnZW5lcmFsX2ZvcnVtX3RvcGljX2hpZGRlbpROjBxnZW5lcmFsX2ZvcnVtX3RvcGljX3Vu\naGlkZGVulE6MCGdpdmVhd2F5lE6MEmdpdmVhd2F5X2NvbXBsZXRlZJROjBBnaXZlYXdheV9jcmVh\ndGVklE6MEGdpdmVhd2F5X3dpbm5lcnOUTowSZ3JvdXBfY2hhdF9jcmVhdGVklImMEWhhc19tZWRp\nYV9zcG9pbGVylE6MFWhhc19wcm90ZWN0ZWRfY29udGVudJROjAdpbnZvaWNllE6MFGlzX2F1dG9t\nYXRpY19mb3J3YXJklE6MD2lzX2Zyb21fb2ZmbGluZZROjBBpc190b3BpY19tZXNzYWdllE6MEGxl\nZnRfY2hhdF9tZW1iZXKUTowUbGlua19wcmV2aWV3X29wdGlvbnOUTowIbG9jYXRpb26UjBh0ZWxl\nZ3JhbS5fZmlsZXMubG9jYXRpb26UjAhMb2NhdGlvbpSTlCmBlH2UKIwHaGVhZGluZ5ROjBNob3Jp\nem9udGFsX2FjY3VyYWN5lE6MCGxhdGl0dWRllEdATTc/UvwmV4wLbGl2ZV9wZXJpb2SUTowJbG9u\nZ2l0dWRllEdAO8r6Hj6vaIwWcHJveGltaXR5X2FsZXJ0X3JhZGl1c5ROaBuIaBxHQDvK+h4+r2hH\nQE03P1L8JleGlGgefZR1YowObWVkaWFfZ3JvdXBfaWSUTowhbWVzc2FnZV9hdXRvX2RlbGV0ZV90\naW1lcl9jaGFuZ2VklE6MEW1lc3NhZ2VfdGhyZWFkX2lklE6MFG1pZ3JhdGVfZnJvbV9jaGF0X2lk\nlE6MEm1pZ3JhdGVfdG9fY2hhdF9pZJROjBBuZXdfY2hhdF9tZW1iZXJzlCmMDm5ld19jaGF0X3Bo\nb3RvlCmMDm5ld19jaGF0X3RpdGxllE6MDXBhc3Nwb3J0X2RhdGGUTowFcGhvdG+UKYwOcGlubmVk\nX21lc3NhZ2WUTowEcG9sbJROjBlwcm94aW1pdHlfYWxlcnRfdHJpZ2dlcmVklE6MBXF1b3RllE6M\nDHJlcGx5X21hcmt1cJSMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJ\nbmxpbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFt\nLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmB\nlH2UKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5f\ndXJslE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlf\nY2hvc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSM\nFEN1dGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTmgbiGgcKGivTk5op05OTk5O\ndJRoHn2UdWKFlGijKYGUfZQoaKaMC2F0dGFjaG1lbnRzlGioTmipTmiqTmirTmisTmitTmiujBVN\ndWx0aXBsZSBhdHRhY2htZW50cyGUaLBOaLFOaBuIaBwoaLhOTmi3Tk5OTk50lGgefZR1YoWUaKMp\ngZR9lChopowGc2VjcmV0lGioTmipTmiqTmirTmisTmitTmiujA1TZWNyZXQgaW1hZ2UhlGiwTmix\nTmgbiGgcKGi/Tk5ovk5OTk5OdJRoHn2UdWKFlGijKYGUfZQoaKaMCXRodW1ibmFpbJRoqE5oqU5o\nqk5oq05orE5orU5orowYRG9jdW1lbnQgd2l0aCB0aHVtYm5haWwhlGiwTmixTmgbiGgcKGjGTk5o\nxU5OTk5OdJRoHn2UdWKFlGijKYGUfZQoaKaMBGhhc2iUaKhOaKlOaKpOaKtOaKxOaK1OaK6MHEZp\ncnN0IGF0dGFjaG1lbnQgYnl0ZXMgaGFzaCGUaLBOaLFOaBuIaBwoaM1OTmjMTk5OTk50lGgefZR1\nYoWUaKMpgZR9lChopowHcmVzdGFydJRoqE5oqU5oqk5oq05orE5orU5orowIUmVzdGFydCGUaLBO\naLFOaBuIaBwoaNROTmjTTk5OTk50lGgefZR1YmijKYGUfZQoaKZoLmioTmipTmiqTmirTmisTmit\nTmiujAVRdWl0IZRosE5osU5oG4hoHCho2U5OaC5OTk5OTnSUaB59lHVihpR0lGgbiGgcaN2FlGge\nfZR1YowQcmVwbHlfdG9fbWVzc2FnZZROjA5yZXBseV90b19zdG9yeZROjBJzZW5kZXJfYm9vc3Rf\nY291bnSUTowTc2VuZGVyX2J1c2luZXNzX2JvdJROjAtzZW5kZXJfY2hhdJROjBhzaG93X2NhcHRp\nb25fYWJvdmVfbWVkaWGUTowHc3RpY2tlcpROjAVzdG9yeZROjBJzdWNjZXNzZnVsX3BheW1lbnSU\nTowXc3VwZXJncm91cF9jaGF0X2NyZWF0ZWSUiWiuTowMdXNlcnNfc2hhcmVklE6MBXZlbnVllE6M\nB3ZpYV9ib3SUTowFdmlkZW+UTowQdmlkZW9fY2hhdF9lbmRlZJROjB92aWRlb19jaGF0X3BhcnRp\nY2lwYW50c19pbnZpdGVklE6MFHZpZGVvX2NoYXRfc2NoZWR1bGVklE6MEnZpZGVvX2NoYXRfc3Rh\ncnRlZJROjAp2aWRlb19ub3RllE6MBXZvaWNllE6MDHdlYl9hcHBfZGF0YZROjBR3cml0ZV9hY2Nl\nc3NfYWxsb3dlZJROjARjaGF0lGgJjARkYXRllIwIZGF0ZXRpbWWUjAhkYXRldGltZZSTlEMKB+gF\nFRMKAQAAAJSMBHB5dHqUjARfVVRDlJOUKVKUhpRSlIwKbWVzc2FnZV9pZJRLEGgbiGgcSxBoCYaU\naB59lHViaBuIaBxoQIWUaB59lHVijAxjaGFubmVsX3Bvc3SUTowKY2hhdF9ib29zdJROjBFjaGF0\nX2pvaW5fcmVxdWVzdJROjAtjaGF0X21lbWJlcpROjBRjaG9zZW5faW5saW5lX3Jlc3VsdJROjBlk\nZWxldGVkX2J1c2luZXNzX21lc3NhZ2VzlE6MF2VkaXRlZF9idXNpbmVzc19tZXNzYWdllE6ME2Vk\naXRlZF9jaGFubmVsX3Bvc3SUTowOZWRpdGVkX21lc3NhZ2WUTowMaW5saW5lX3F1ZXJ5lE5oQk6M\nEG1lc3NhZ2VfcmVhY3Rpb26UTowWbWVzc2FnZV9yZWFjdGlvbl9jb3VudJROjA5teV9jaGF0X21l\nbWJlcpROaJdOjAtwb2xsX2Fuc3dlcpROjBJwcmVfY2hlY2tvdXRfcXVlcnmUTowScmVtb3ZlZF9j\naGF0X2Jvb3N0lE6MDnNoaXBwaW5nX3F1ZXJ5lE6MCXVwZGF0ZV9pZJRLEGgbiGgcSxCFlGgefZR1\nYi4=\n" + "original_message": "gASVKA8AAAAAAACMEHRlbGVncmFtLl91cGRhdGWUjAZVcGRhdGWUk5QpgZR9lCiMD19lZmZlY3Rp\ndmVfY2hhdJSMDnRlbGVncmFtLl9jaGF0lIwEQ2hhdJSTlCmBlH2UKIwKZmlyc3RfbmFtZZSMBFRl\nc3SUjAJpZJRLKowIaXNfZm9ydW2UTowJbGFzdF9uYW1llIwEVXNlcpSMBXRpdGxllE6MBHR5cGWU\njBJ0ZWxlZ3JhbS5jb25zdGFudHOUjAhDaGF0VHlwZZSTlIwHcHJpdmF0ZZSFlFKUjAh1c2VybmFt\nZZSMCXRlc3RfdXNlcpSMB19mcm96ZW6UiIwJX2lkX2F0dHJzlEsqhZSMCmFwaV9rd2FyZ3OUfZR1\nYowSX2VmZmVjdGl2ZV9tZXNzYWdllE6MEV9lZmZlY3RpdmVfc2VuZGVylE6MD19lZmZlY3RpdmVf\ndXNlcpROjBNidXNpbmVzc19jb25uZWN0aW9ulE6MEGJ1c2luZXNzX21lc3NhZ2WUTowOY2FsbGJh\nY2tfcXVlcnmUjBd0ZWxlZ3JhbS5fY2FsbGJhY2txdWVyeZSMDUNhbGxiYWNrUXVlcnmUk5QpgZR9\nlCiMDWNoYXRfaW5zdGFuY2WUjAItMZSMBGRhdGGUjAdyZXN0YXJ0lIwJZnJvbV91c2VylIwOdGVs\nZWdyYW0uX3VzZXKUaBCTlCmBlH2UKIwYYWRkZWRfdG9fYXR0YWNobWVudF9tZW51lE6MF2Nhbl9j\nb25uZWN0X3RvX2J1c2luZXNzlE6MD2Nhbl9qb2luX2dyb3Vwc5ROjBtjYW5fcmVhZF9hbGxfZ3Jv\ndXBfbWVzc2FnZXOUTmgLjA1BbGV4YVRlc3RuZGVylGgNSyqMBmlzX2JvdJSJjAppc19wcmVtaXVt\nlE6MDWxhbmd1YWdlX2NvZGWUjAJlbpRoD2gQjBdzdXBwb3J0c19pbmxpbmVfcXVlcmllc5ROaBlo\nGmgbiGgcSyqFlGgefZR1YowPZ2FtZV9zaG9ydF9uYW1llE5oDYwCMTSUjBFpbmxpbmVfbWVzc2Fn\nZV9pZJROjAdtZXNzYWdllIwRdGVsZWdyYW0uX21lc3NhZ2WUjAdNZXNzYWdllJOUKYGUfZQojBVf\nZWZmZWN0aXZlX2F0dGFjaG1lbnSUjBx0ZWxlZ3JhbS5fdXRpbHMuZGVmYXVsdHZhbHVllIwMRGVm\nYXVsdFZhbHVllJOUKYGUTn2UjAV2YWx1ZZROc4aUYowJYW5pbWF0aW9ulE6MBWF1ZGlvlE6MEGF1\ndGhvcl9zaWduYXR1cmWUTowLYm9vc3RfYWRkZWSUTowWYnVzaW5lc3NfY29ubmVjdGlvbl9pZJRO\njAdjYXB0aW9ulE6MEGNhcHRpb25fZW50aXRpZXOUKYwUY2hhbm5lbF9jaGF0X2NyZWF0ZWSUiYwT\nY2hhdF9iYWNrZ3JvdW5kX3NldJROjAtjaGF0X3NoYXJlZJROjBFjb25uZWN0ZWRfd2Vic2l0ZZRO\njAdjb250YWN0lE6MEWRlbGV0ZV9jaGF0X3Bob3RvlImMBGRpY2WUTowIZG9jdW1lbnSUTowJZWRp\ndF9kYXRllE6MCWVmZmVjdF9pZJROjAhlbnRpdGllc5QpjA5leHRlcm5hbF9yZXBseZROjBJmb3J1\nbV90b3BpY19jbG9zZWSUTowTZm9ydW1fdG9waWNfY3JlYXRlZJROjBJmb3J1bV90b3BpY19lZGl0\nZWSUTowUZm9ydW1fdG9waWNfcmVvcGVuZWSUTowOZm9yd2FyZF9vcmlnaW6UTmgvaDEpgZR9lCho\nNE5oNU5oNk5oN05oC4wDQm90lGgNSxBoOYhoOk5oO05oD05oPU5oGYwLY2hhdHNreV9ib3SUaBuI\naBxLEIWUaB59lHVijARnYW1llE6MGmdlbmVyYWxfZm9ydW1fdG9waWNfaGlkZGVulE6MHGdlbmVy\nYWxfZm9ydW1fdG9waWNfdW5oaWRkZW6UTowIZ2l2ZWF3YXmUTowSZ2l2ZWF3YXlfY29tcGxldGVk\nlE6MEGdpdmVhd2F5X2NyZWF0ZWSUTowQZ2l2ZWF3YXlfd2lubmVyc5ROjBJncm91cF9jaGF0X2Ny\nZWF0ZWSUiYwRaGFzX21lZGlhX3Nwb2lsZXKUTowVaGFzX3Byb3RlY3RlZF9jb250ZW50lE6MB2lu\ndm9pY2WUTowUaXNfYXV0b21hdGljX2ZvcndhcmSUTowPaXNfZnJvbV9vZmZsaW5llE6MEGlzX3Rv\ncGljX21lc3NhZ2WUTowQbGVmdF9jaGF0X21lbWJlcpROjBRsaW5rX3ByZXZpZXdfb3B0aW9uc5RO\njAhsb2NhdGlvbpROjA5tZWRpYV9ncm91cF9pZJROjCFtZXNzYWdlX2F1dG9fZGVsZXRlX3RpbWVy\nX2NoYW5nZWSUTowRbWVzc2FnZV90aHJlYWRfaWSUTowUbWlncmF0ZV9mcm9tX2NoYXRfaWSUTowS\nbWlncmF0ZV90b19jaGF0X2lklE6MEG5ld19jaGF0X21lbWJlcnOUKYwObmV3X2NoYXRfcGhvdG+U\nKYwObmV3X2NoYXRfdGl0bGWUTowNcGFzc3BvcnRfZGF0YZROjAVwaG90b5QpjA5waW5uZWRfbWVz\nc2FnZZROjARwb2xslE6MGXByb3hpbWl0eV9hbGVydF90cmlnZ2VyZWSUTowFcXVvdGWUTowMcmVw\nbHlfbWFya3VwlIwldGVsZWdyYW0uX2lubGluZS5pbmxpbmVrZXlib2FyZG1hcmt1cJSMFElubGlu\nZUtleWJvYXJkTWFya3VwlJOUKYGUfZQojA9pbmxpbmVfa2V5Ym9hcmSUKIwldGVsZWdyYW0uX2lu\nbGluZS5pbmxpbmVrZXlib2FyZGJ1dHRvbpSMFElubGluZUtleWJvYXJkQnV0dG9ulJOUKYGUfZQo\njA1jYWxsYmFja19kYXRhlIwJZm9ybWF0dGVklIwNY2FsbGJhY2tfZ2FtZZROjAlsb2dpbl91cmyU\nTowDcGF5lE6ME3N3aXRjaF9pbmxpbmVfcXVlcnmUTowfc3dpdGNoX2lubGluZV9xdWVyeV9jaG9z\nZW5fY2hhdJROjCBzd2l0Y2hfaW5saW5lX3F1ZXJ5X2N1cnJlbnRfY2hhdJROjAR0ZXh0lIwUQ3V0\nZSBmb3JtYXR0ZWQgdGV4dCGUjAN1cmyUTowHd2ViX2FwcJROaBuIaBwoaKNOTmibTk5OTk50lGge\nfZR1YoWUaJcpgZR9lChomowLYXR0YWNobWVudHOUaJxOaJ1OaJ5OaJ9OaKBOaKFOaKKMFU11bHRp\ncGxlIGF0dGFjaG1lbnRzIZRopE5opU5oG4hoHChorE5OaKtOTk5OTnSUaB59lHViaJcpgZR9lCho\nmowGc2VjcmV0lGicTmidTmieTmifTmigTmihTmiijA1TZWNyZXQgaW1hZ2UhlGikTmilTmgbiGgc\nKGiyTk5osU5OTk5OdJRoHn2UdWJolymBlH2UKGiajAl0aHVtYm5haWyUaJxOaJ1OaJ5OaJ9OaKBO\naKFOaKKMGERvY3VtZW50IHdpdGggdGh1bWJuYWlsIZRopE5opU5oG4hoHChouE5OaLdOTk5OTnSU\naB59lHVih5RolymBlH2UKGiajARoYXNolGicTmidTmieTmifTmigTmihTmiijBxGaXJzdCBhdHRh\nY2htZW50IGJ5dGVzIGhhc2ghlGikTmilTmgbiGgcKGi/Tk5ovk5OTk5OdJRoHn2UdWKFlGiXKYGU\nfZQoaJpoLmicTmidTmieTmifTmigTmihTmiijAhSZXN0YXJ0IZRopE5opU5oG4hoHChoxU5OaC5O\nTk5OTnSUaB59lHVihZR0lGgbiGgcaMmFlGgefZR1YowQcmVwbHlfdG9fbWVzc2FnZZROjA5yZXBs\neV90b19zdG9yeZROjBJzZW5kZXJfYm9vc3RfY291bnSUTowTc2VuZGVyX2J1c2luZXNzX2JvdJRO\njAtzZW5kZXJfY2hhdJROjBhzaG93X2NhcHRpb25fYWJvdmVfbWVkaWGUTowHc3RpY2tlcpROjAVz\ndG9yeZROjBJzdWNjZXNzZnVsX3BheW1lbnSUTowXc3VwZXJncm91cF9jaGF0X2NyZWF0ZWSUiWii\njClXZWxjb21lISBDaG9vc2Ugd2hhdCB5b3Ugd2FudCB0byByZWNlaXZlLpSMDHVzZXJzX3NoYXJl\nZJROjAV2ZW51ZZROjAd2aWFfYm90lE6MBXZpZGVvlE6MEHZpZGVvX2NoYXRfZW5kZWSUTowfdmlk\nZW9fY2hhdF9wYXJ0aWNpcGFudHNfaW52aXRlZJROjBR2aWRlb19jaGF0X3NjaGVkdWxlZJROjBJ2\naWRlb19jaGF0X3N0YXJ0ZWSUTowKdmlkZW9fbm90ZZROjAV2b2ljZZROjAx3ZWJfYXBwX2RhdGGU\nTowUd3JpdGVfYWNjZXNzX2FsbG93ZWSUTowEY2hhdJRoCYwEZGF0ZZSMCGRhdGV0aW1llIwIZGF0\nZXRpbWWUk5RDCgfoBRUTCTsAAACUjARweXR6lIwEX1VUQ5STlClSlIaUUpSMCm1lc3NhZ2VfaWSU\nSwpoG4hoHEsKaAmGlGgefZR1YmgbiGgcaEGFlGgefZR1YowMY2hhbm5lbF9wb3N0lE6MCmNoYXRf\nYm9vc3SUTowRY2hhdF9qb2luX3JlcXVlc3SUTowLY2hhdF9tZW1iZXKUTowUY2hvc2VuX2lubGlu\nZV9yZXN1bHSUTowZZGVsZXRlZF9idXNpbmVzc19tZXNzYWdlc5ROjBdlZGl0ZWRfYnVzaW5lc3Nf\nbWVzc2FnZZROjBNlZGl0ZWRfY2hhbm5lbF9wb3N0lE6MDmVkaXRlZF9tZXNzYWdllE6MDGlubGlu\nZV9xdWVyeZROaENOjBBtZXNzYWdlX3JlYWN0aW9ulE6MFm1lc3NhZ2VfcmVhY3Rpb25fY291bnSU\nTowObXlfY2hhdF9tZW1iZXKUTmiLTowLcG9sbF9hbnN3ZXKUTowScHJlX2NoZWNrb3V0X3F1ZXJ5\nlE6MEnJlbW92ZWRfY2hhdF9ib29zdJROjA5zaGlwcGluZ19xdWVyeZROjAl1cGRhdGVfaWSUSwpo\nG4hoHEsKhZRoHn2UdWIu\n" }, "response_message": { - "text": "Bot has entered unrecoverable state:/\nRun /start command again to restart.", + "text": "Welcome! Choose what you want to receive.", "attachments": null, "annotations": null, "misc": null, - "original_message": null + "original_message": null, + "reply_markup": "gASVkgMAAAAAAACMJXRlbGVncmFtLl9pbmxpbmUuaW5saW5la2V5Ym9hcmRtYXJrdXCUjBRJbmxp\nbmVLZXlib2FyZE1hcmt1cJSTlCmBlH2UKIwPaW5saW5lX2tleWJvYXJklCiMJXRlbGVncmFtLl9p\nbmxpbmUuaW5saW5la2V5Ym9hcmRidXR0b26UjBRJbmxpbmVLZXlib2FyZEJ1dHRvbpSTlCmBlH2U\nKIwNY2FsbGJhY2tfZGF0YZSMCWZvcm1hdHRlZJSMDWNhbGxiYWNrX2dhbWWUTowJbG9naW5fdXJs\nlE6MA3BheZROjBNzd2l0Y2hfaW5saW5lX3F1ZXJ5lE6MH3N3aXRjaF9pbmxpbmVfcXVlcnlfY2hv\nc2VuX2NoYXSUTowgc3dpdGNoX2lubGluZV9xdWVyeV9jdXJyZW50X2NoYXSUTowEdGV4dJSMFEN1\ndGUgZm9ybWF0dGVkIHRleHQhlIwDdXJslE6MB3dlYl9hcHCUTowHX2Zyb3plbpSIjAlfaWRfYXR0\ncnOUKGgUTk5oDE5OTk5OdJSMCmFwaV9rd2FyZ3OUfZR1YoWUaAgpgZR9lChoC4wLYXR0YWNobWVu\ndHOUaA1OaA5OaA9OaBBOaBFOaBJOaBOMFU11bHRpcGxlIGF0dGFjaG1lbnRzIZRoFU5oFk5oF4ho\nGChoIE5OaB9OTk5OTnSUaBp9lHViaAgpgZR9lChoC4wGc2VjcmV0lGgNTmgOTmgPTmgQTmgRTmgS\nTmgTjA1TZWNyZXQgaW1hZ2UhlGgVTmgWTmgXiGgYKGgmTk5oJU5OTk5OdJRoGn2UdWJoCCmBlH2U\nKGgLjAl0aHVtYm5haWyUaA1OaA5OaA9OaBBOaBFOaBJOaBOMGERvY3VtZW50IHdpdGggdGh1bWJu\nYWlsIZRoFU5oFk5oF4hoGChoLE5OaCtOTk5OTnSUaBp9lHVih5RoCCmBlH2UKGgLjARoYXNolGgN\nTmgOTmgPTmgQTmgRTmgSTmgTjBxGaXJzdCBhdHRhY2htZW50IGJ5dGVzIGhhc2ghlGgVTmgWTmgX\niGgYKGgzTk5oMk5OTk5OdJRoGn2UdWKFlGgIKYGUfZQoaAuMB3Jlc3RhcnSUaA1OaA5OaA9OaBBO\naBFOaBJOaBOMCFJlc3RhcnQhlGgVTmgWTmgXiGgYKGg6Tk5oOU5OTk5OdJRoGn2UdWKFlHSUaBeI\naBhoPoWUaBp9lHViLg==\n", + "__pickled_extra_fields__": [ + "reply_markup" + ] }, "response_functions": [ - "send_message(42, 'Bot has entered unrecoverable state:/\\nRun /start command again to restart.', parse_mode=None, disable_notification=None, protect_content=None, reply_markup=None, message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)" + "send_message(42, 'Welcome! Choose what you want to receive.', parse_mode=None, disable_notification=None, protect_content=None, reply_markup=InlineKeyboardMarkup(inline_keyboard=((InlineKeyboardButton(callback_data='formatted', text='Cute formatted text!'),), (InlineKeyboardButton(callback_data='attachments', text='Multiple attachments!'), InlineKeyboardButton(callback_data='secret', text='Secret image!'), InlineKeyboardButton(callback_data='thumbnail', text='Document with thumbnail!')), (InlineKeyboardButton(callback_data='hash', text='First attachment bytes hash!'),), (InlineKeyboardButton(callback_data='restart', text='Restart!'),))), message_effect_id=None, reply_to_message_id=None, disable_web_page_preview=None)" ] } ] diff --git a/tutorials/messengers/telegram/3_advanced.py b/tutorials/messengers/telegram/3_advanced.py index 76692e406..38bcd13cc 100644 --- a/tutorials/messengers/telegram/3_advanced.py +++ b/tutorials/messengers/telegram/3_advanced.py @@ -25,7 +25,7 @@ class and [python-telegram-bot](https://docs.python-telegram-bot.org/) from chatsky import ( RESPONSE, TRANSITIONS, - GLOBAL, + LOCAL, Message, Pipeline, BaseResponse, @@ -57,14 +57,27 @@ class and [python-telegram-bot](https://docs.python-telegram-bot.org/) 5. Document with a thumbnail. 6. Attachment bytes hash. +Last option ("Raw attachments!") button might be especially interesting, +because it shows how bot percepts different telegram attachments sent by user +in terms and datastructures of Chatsky. + +
+ +Tip + Check out -[this](https://docs.python-telegram-bot.org/en/latest/telegram.bot.html#telegram.Bot) +[this](https://docs.python-telegram-bot.org/en/v21.3/telegram.bot.html#telegram.Bot) class for information about different arguments for sending attachments, `send_...` methods. -Last option ("Raw attachments!") button might be especially interesting, -because it shows how bot percepts different telegram attachments sent by user -in terms and datastructures of Chatsky. +For example, documentation for `Image` extra fields can be found in the +[send_photo](https://docs.python-telegram-bot.org/en/v21.3/telegram.bot.html#telegram.Bot.send_photo) +method. + +The `Message` class also supports extra keywords as described in +[send_message](https://docs.python-telegram-bot.org/en/v21.3/telegram.bot.html#telegram.Bot.send_message). + +
""" # %% @@ -78,8 +91,6 @@ class for information about different arguments formatted_text = """ Visit [this link](https://core.telegram.org/bots/api#formatting-options) for more information about formatting options in telegram\. - -Run /start command again to restart\. """ # noqa: W605 location_data = {"latitude": 59.9386, "longitude": 30.3141} @@ -97,6 +108,8 @@ class for information about different arguments "has_spoiler": True, "filename": "deeppavlov_logo.png", } +# last 3 fields are extra keywords passed directly to the +# telegram.Bot.send_photo method document_data = { "source": HttpUrl(f"{EXAMPLE_ATTACHMENT_SOURCE}/deeppavlov-article.pdf"), @@ -119,81 +132,21 @@ async def call(self, ctx: Context) -> MessageInitTypes: ctx.pipeline.messenger_interface ) attachment_hash = sha256(attachment_bytes).hexdigest() - resp_format = ( - "Here's your previous request first attachment sha256 hash: " - "`{}`!\n" - "Run /start command again to restart." - ) - return resp_format.format( - attachment_hash, parse_mode=ParseMode.MARKDOWN_V2 + response = ( + "Here's your previous request first attachment sha256 hash:\n" + f"```\n{attachment_hash}\n```" ) + return Message(text=response, parse_mode=ParseMode.MARKDOWN_V2) else: - return ( - "Last request did not contain any data attachment!\n" - "Run /start command again to restart." - ) + return "Last request did not contain any data attachment!" # %% script = { - GLOBAL: { - TRANSITIONS: [ - Tr(dst=("main_flow", "main_node"), cnd=cnd.ExactMatch("/start")) - ] - }, "main_flow": { - "start_node": {}, - "main_node": { - RESPONSE: Message( - attachments=[ - Location( - latitude=58.431610, - longitude=27.792887, - reply_markup=InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton( - "Cute formatted text!", - callback_data="formatted", - ), - ], - [ - InlineKeyboardButton( - "Multiple attachments!", - callback_data="attachments", - ), - ], - [ - InlineKeyboardButton( - "Secret image!", callback_data="secret" - ), - ], - [ - InlineKeyboardButton( - "Document with thumbnail!", - callback_data="thumbnail", - ), - ], - [ - InlineKeyboardButton( - "First attachment bytes hash!", - callback_data="hash", - ), - ], - [ - InlineKeyboardButton( - "Restart!", callback_data="restart" - ), - InlineKeyboardButton( - "Quit!", callback_data="quit" - ), - ], - ], - ), - ), - ], - ), + LOCAL: { TRANSITIONS: [ + Tr(dst="main_node", cnd=cnd.ExactMatch("/start")), Tr(dst="formatted_node", cnd=cnd.HasCallbackQuery("formatted")), Tr( dst="attachments_node", @@ -203,8 +156,49 @@ async def call(self, ctx: Context) -> MessageInitTypes: Tr(dst="thumbnail_node", cnd=cnd.HasCallbackQuery("thumbnail")), Tr(dst="hash_init_node", cnd=cnd.HasCallbackQuery("hash")), Tr(dst="main_node", cnd=cnd.HasCallbackQuery("restart")), - Tr(dst="fallback_node", cnd=cnd.HasCallbackQuery("quit")), - ], + ] + }, + "start_node": {}, + "main_node": { + RESPONSE: Message( + text="Welcome! Choose what you want to receive.", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + "Cute formatted text!", + callback_data="formatted", + ), + ], + [ + InlineKeyboardButton( + "Multiple attachments!", + callback_data="attachments", + ), + InlineKeyboardButton( + "Secret image!", callback_data="secret" + ), + InlineKeyboardButton( + "Document with thumbnail!", + callback_data="thumbnail", + ), + ], + [ + InlineKeyboardButton( + "First attachment bytes hash!", + callback_data="hash", + ), + ], + [ + InlineKeyboardButton( + "Restart!", callback_data="restart" + ), + ], + ], + ), + # you can add extra fields to the message itself; + # they are passed to telegram.Bot.send_message + ), }, "formatted_node": { RESPONSE: Message( @@ -214,8 +208,7 @@ async def call(self, ctx: Context) -> MessageInitTypes: "attachments_node": { RESPONSE: Message( text="Here's your message with multiple attachments " - + "(a location and a sticker)!\n" - + "Run /start command again to restart.", + + "(a location and a sticker)!", attachments=[ Location(**location_data), Sticker(**sticker_data), @@ -224,15 +217,13 @@ async def call(self, ctx: Context) -> MessageInitTypes: }, "secret_node": { RESPONSE: Message( - text="Here's your secret image! " - + "Run /start command again to restart.", + text="Here's your secret image!", attachments=[Image(**image_data)], ), }, "thumbnail_node": { RESPONSE: Message( - text="Here's your document with tumbnail! " - + "Run /start command again to restart.", + text="Here's your document with thumbnail!", attachments=[Document(**document_data)], ), }, @@ -249,7 +240,7 @@ async def call(self, ctx: Context) -> MessageInitTypes: "fallback_node": { RESPONSE: Message( text="Bot has entered unrecoverable state:" - + "/\nRun /start command again to restart." + + "\nRun /start command again to restart." ), }, }, From 1392a284ed4fc18be849b862fbd9d53bbd7dfdcc Mon Sep 17 00:00:00 2001 From: ZergLev <64711614+ZergLev@users.noreply.github.com> Date: Sat, 28 Sep 2024 00:30:58 +0300 Subject: [PATCH 4/6] Service update (#378) # Description ## Breaking Changes - Service changes: - Pipeline no longer has `optimization_warnings` option -- not necessary with the service changes - Pipeline service group now has an empty name - Removed `Pipeline.add_global_handler` -- use `Pipeline.services_pipeline.add_extra_handler` instead - Replaced async flags with `concurrent` flag for components - Removed `pipeline` from component and extra handler arguments. Use `ctx.pipeline` instead - Component start condition now accepts `BaseCondition` instead of functions - Changed the logic behind giving names to components with no name - Removed `GlobalExtraHandlerType`: `add_extra_handler` accepts `ExtraHandlerType` instead - Removed ServiceRuntimeInfo: now `Service` can be subclassed allowing access to its fields - Extra handler runtime info now does not contain `func` and `component` is the instance of the component ## Features - `ServiceFinished` condition now has an option to wait for the specified component to complete; Service states are now initialized before services are executed ## Documentation - Pipeline tutorials renamed to service tutorials and rewritten for more clarity ## Fixes - Service component timeout is now always applied - Unsuccessful stat extraction no longer fails the component ## Devel - `FrameworkData.service_states` now contains objects of a new class `ServiceState` - Added support for non-function callables for `wrap_sync_function_in_async` --------- Co-authored-by: Roman Zlobin --- chatsky/__rebuild_pydantic_models__.py | 7 +- chatsky/conditions/__init__.py | 1 + chatsky/conditions/service.py | 40 +++ chatsky/core/context.py | 25 +- chatsky/core/pipeline.py | 84 +----- chatsky/core/script_function.py | 2 +- chatsky/core/service/__init__.py | 11 - chatsky/core/service/actor.py | 24 +- chatsky/core/service/component.py | 202 +++++---------- chatsky/core/service/conditions.py | 97 ------- chatsky/core/service/extra.py | 114 +++------ chatsky/core/service/group.py | 158 ++++-------- chatsky/core/service/service.py | 108 +++----- chatsky/core/service/types.py | 107 ++------ chatsky/core/utils.py | 58 +++-- chatsky/stats/default_extractors.py | 12 +- chatsky/stats/instrumentor.py | 72 +++--- chatsky/utils/devel/async_helpers.py | 9 +- docs/source/conf.py | 2 +- docs/source/tutorials.rst | 11 +- tests/core/test_actor.py | 22 +- tests/core/test_message.py | 2 +- tests/core/test_script_function.py | 2 +- tests/messengers/telegram/test_tutorials.py | 6 +- tests/pipeline/test_service.py | 242 ++++++++++++++++++ tests/pipeline/test_validation.py | 38 +-- tests/pipeline/utils.py | 64 +++++ tests/stats/test_defaults.py | 20 +- tests/stats/test_instrumentation.py | 22 ++ tests/stats/test_tutorials.py | 1 + tutorials/pipeline/1_basics.py | 82 ------ .../pipeline/2_pre_and_post_processors.py | 93 ------- .../3_pipeline_dict_with_services_basic.py | 117 --------- .../3_pipeline_dict_with_services_full.py | 167 ------------ .../pipeline/4_groups_and_conditions_basic.py | 123 --------- .../pipeline/4_groups_and_conditions_full.py | 223 ---------------- ..._asynchronous_groups_and_services_basic.py | 61 ----- ...5_asynchronous_groups_and_services_full.py | 151 ----------- tutorials/pipeline/6_extra_handlers_basic.py | 120 --------- tutorials/pipeline/6_extra_handlers_full.py | 187 -------------- .../7_extra_handlers_and_extensions.py | 138 ---------- tutorials/script/core/1_basics.py | 2 +- tutorials/service/1_basics.py | 85 ++++++ tutorials/service/2_advanced.py | 143 +++++++++++ tutorials/service/3_groups.py | 156 +++++++++++ tutorials/service/4_conditions_and_paths.py | 209 +++++++++++++++ tutorials/service/5_extra_handlers.py | 143 +++++++++++ tutorials/stats/1_extractor_functions.py | 22 +- tutorials/stats/2_pipeline_integration.py | 66 +++-- utils/stats/sample_data_provider.py | 18 +- 50 files changed, 1543 insertions(+), 2326 deletions(-) create mode 100644 chatsky/conditions/service.py delete mode 100644 chatsky/core/service/conditions.py create mode 100644 tests/pipeline/test_service.py create mode 100644 tests/pipeline/utils.py delete mode 100644 tutorials/pipeline/1_basics.py delete mode 100644 tutorials/pipeline/2_pre_and_post_processors.py delete mode 100644 tutorials/pipeline/3_pipeline_dict_with_services_basic.py delete mode 100644 tutorials/pipeline/3_pipeline_dict_with_services_full.py delete mode 100644 tutorials/pipeline/4_groups_and_conditions_basic.py delete mode 100644 tutorials/pipeline/4_groups_and_conditions_full.py delete mode 100644 tutorials/pipeline/5_asynchronous_groups_and_services_basic.py delete mode 100644 tutorials/pipeline/5_asynchronous_groups_and_services_full.py delete mode 100644 tutorials/pipeline/6_extra_handlers_basic.py delete mode 100644 tutorials/pipeline/6_extra_handlers_full.py delete mode 100644 tutorials/pipeline/7_extra_handlers_and_extensions.py create mode 100644 tutorials/service/1_basics.py create mode 100644 tutorials/service/2_advanced.py create mode 100644 tutorials/service/3_groups.py create mode 100644 tutorials/service/4_conditions_and_paths.py create mode 100644 tutorials/service/5_extra_handlers.py diff --git a/chatsky/__rebuild_pydantic_models__.py b/chatsky/__rebuild_pydantic_models__.py index f2fc1de44..1da4126a9 100644 --- a/chatsky/__rebuild_pydantic_models__.py +++ b/chatsky/__rebuild_pydantic_models__.py @@ -1,14 +1,17 @@ # flake8: noqa: F401 -from chatsky.core.service.types import ExtraHandlerRuntimeInfo, StartConditionCheckerFunction, ComponentExecutionState +from chatsky.core.service.types import ExtraHandlerRuntimeInfo, ComponentExecutionState from chatsky.core import Context, Script from chatsky.core.script import Node from chatsky.core.pipeline import Pipeline from chatsky.slots.slots import SlotManager -from chatsky.core.context import FrameworkData +from chatsky.core.context import FrameworkData, ServiceState +from chatsky.core.service import PipelineComponent +PipelineComponent.model_rebuild() Pipeline.model_rebuild() Script.model_rebuild() Context.model_rebuild() ExtraHandlerRuntimeInfo.model_rebuild() FrameworkData.model_rebuild() +ServiceState.model_rebuild() diff --git a/chatsky/conditions/__init__.py b/chatsky/conditions/__init__.py index b9a94b517..0d02477dd 100644 --- a/chatsky/conditions/__init__.py +++ b/chatsky/conditions/__init__.py @@ -10,3 +10,4 @@ HasCallbackQuery, ) from chatsky.conditions.slots import SlotsExtracted +from chatsky.conditions.service import ServiceFinished diff --git a/chatsky/conditions/service.py b/chatsky/conditions/service.py new file mode 100644 index 000000000..6742a0d15 --- /dev/null +++ b/chatsky/conditions/service.py @@ -0,0 +1,40 @@ +""" +Service Conditions +------------------ +Provides service-related conditions +""" + +from __future__ import annotations + +from chatsky.core.context import Context +from chatsky.core.script_function import BaseCondition + +from chatsky.core.service.types import ( + ComponentExecutionState, +) + + +class ServiceFinished(BaseCondition): + """ + Check if a :py:class:`~chatsky.core.service.service.Service` was executed successfully. + """ + + path: str + """The path of the condition pipeline component.""" + wait: bool = False + """ + Whether to wait for the service to be finished. + + This eliminates possible service states ``NOT_RUN`` and ``RUNNING``. + """ + + def __init__(self, path: str, *, wait: bool = False): + super().__init__(path=path, wait=wait) + + async def call(self, ctx: Context) -> bool: + if self.wait: + await ctx.framework_data.service_states[self.path].finished_event.wait() + + state = ctx.framework_data.service_states[self.path].execution_status + + return ComponentExecutionState[state] == ComponentExecutionState.FINISHED diff --git a/chatsky/core/context.py b/chatsky/core/context.py index e46ae718c..f0c03d3da 100644 --- a/chatsky/core/context.py +++ b/chatsky/core/context.py @@ -18,6 +18,7 @@ from __future__ import annotations import logging +import asyncio from uuid import UUID, uuid4 from typing import Any, Optional, Union, Dict, TYPE_CHECKING @@ -28,9 +29,9 @@ from chatsky.core.node_label import AbsoluteNodeLabel, AbsoluteNodeLabelInitTypes if TYPE_CHECKING: + from chatsky.core.service import ComponentExecutionState from chatsky.core.script import Node from chatsky.core.pipeline import Pipeline - from chatsky.core.service.types import ComponentExecutionState logger = logging.getLogger(__name__) @@ -53,13 +54,29 @@ class ContextError(Exception): """Raised when context methods are not used correctly.""" -class FrameworkData(BaseModel): +class ServiceState(BaseModel, arbitrary_types_allowed=True): + execution_status: ComponentExecutionState = Field(default="NOT_RUN") + """ + :py:class:`.ComponentExecutionState` of this pipeline service. + Cleared at the end of every turn. + """ + finished_event: asyncio.Event = Field(default_factory=asyncio.Event) + """ + Asyncio `Event` which can be awaited until this service finishes. + Cleared at the end of every turn. + """ + + +class FrameworkData(BaseModel, arbitrary_types_allowed=True): """ Framework uses this to store data related to any of its modules. """ - service_states: Dict[str, ComponentExecutionState] = Field(default_factory=dict, exclude=True) - "Statuses of all the pipeline services. Cleared at the end of every turn." + service_states: Dict[str, ServiceState] = Field(default_factory=dict, exclude=True) + """ + Dictionary containing :py:class:`.ServiceState` of all the pipeline components. + Cleared at the end of every turn. + """ current_node: Optional[Node] = Field(default=None, exclude=True) """ A copy of the current node provided by :py:meth:`~chatsky.core.script.Script.get_inherited_node`. diff --git a/chatsky/core/pipeline.py b/chatsky/core/pipeline.py index 2da7bf1dc..20caa74ea 100644 --- a/chatsky/core/pipeline.py +++ b/chatsky/core/pipeline.py @@ -24,12 +24,8 @@ from chatsky.slots.slots import GroupSlot from chatsky.core.service.group import ServiceGroup, ServiceGroupInitTypes from chatsky.core.service.extra import ComponentExtraHandlerInitTypes, BeforeHandler, AfterHandler -from chatsky.core.service.types import ( - GlobalExtraHandlerType, - ExtraHandlerFunction, -) from .service import Service -from .utils import finalize_service_group +from .utils import finalize_service_group, initialize_service_states from chatsky.core.service.actor import Actor from chatsky.core.node_label import AbsoluteNodeLabel, AbsoluteNodeLabelInitTypes from chatsky.core.script_parsing import JSONImporter, Path @@ -104,15 +100,6 @@ class Pipeline(BaseModel, extra="forbid", arbitrary_types_allowed=True): timeout: Optional[float] = None """ Timeout to add to pipeline root service group. - """ - optimization_warnings: bool = False - """ - Asynchronous pipeline optimization check request flag; - warnings will be sent to logs. Additionally, it has some calculated fields: - - - `services_pipeline` is a pipeline root :py:class:`~.ServiceGroup` object, - - `actor` is a pipeline actor, found among services. - """ parallelize_processing: bool = False """ @@ -136,7 +123,6 @@ def __init__( before_handler: ComponentExtraHandlerInitTypes = None, after_handler: ComponentExtraHandlerInitTypes = None, timeout: float = None, - optimization_warnings: bool = None, parallelize_processing: bool = None, ): if fallback_label is None: @@ -154,7 +140,6 @@ def __init__( "before_handler": before_handler, "after_handler": after_handler, "timeout": timeout, - "optimization_warnings": optimization_warnings, "parallelize_processing": parallelize_processing, } empty_fields = set() @@ -216,14 +201,11 @@ def services_pipeline(self) -> PipelineServiceGroup: after_handler=self.after_handler, timeout=self.timeout, ) - services_pipeline.name = "pipeline" - services_pipeline.path = ".pipeline" + services_pipeline.name = "" + services_pipeline.path = "" finalize_service_group(services_pipeline, path=services_pipeline.path) - if self.optimization_warnings: - services_pipeline.log_optimization_warnings() - return services_pipeline @model_validator(mode="after") @@ -240,60 +222,6 @@ def validate_fallback_label(self): raise ValueError(f"Unknown fallback_label={self.fallback_label}") return self - def add_global_handler( - self, - global_handler_type: GlobalExtraHandlerType, - extra_handler: ExtraHandlerFunction, - whitelist: Optional[List[str]] = None, - blacklist: Optional[List[str]] = None, - ): - """ - Method for adding global wrappers to pipeline. - Different types of global wrappers are called before/after pipeline execution - or before/after each pipeline component. - They can be used for pipeline statistics collection or other functionality extensions. - NB! Global wrappers are still wrappers, - they shouldn't be used for much time-consuming tasks (see :py:mod:`chatsky.core.service.extra`). - - :param global_handler_type: (required) indication where the wrapper - function should be executed. - :param extra_handler: (required) wrapper function itself. - :type extra_handler: ExtraHandlerFunction - :param whitelist: a list of services to only add this wrapper to. - :param blacklist: a list of services to not add this wrapper to. - :return: `None` - """ - - def condition(name: str) -> bool: - return (whitelist is None or name in whitelist) and (blacklist is None or name not in blacklist) - - if ( - global_handler_type is GlobalExtraHandlerType.BEFORE_ALL - or global_handler_type is GlobalExtraHandlerType.AFTER_ALL - ): - whitelist = ["pipeline"] - global_handler_type = ( - GlobalExtraHandlerType.BEFORE - if global_handler_type is GlobalExtraHandlerType.BEFORE_ALL - else GlobalExtraHandlerType.AFTER - ) - - self.services_pipeline.add_extra_handler(global_handler_type, extra_handler, condition) - - @property - def info_dict(self) -> dict: - """ - Property for retrieving info dictionary about this pipeline. - Returns info dict, containing most important component public fields as well as its type. - All complex or unserializable fields here are replaced with 'Instance of [type]'. - """ - return { - "type": type(self).__name__, - "messenger_interface": f"Instance of {type(self.messenger_interface).__name__}", - "context_storage": f"Instance of {type(self.context_storage).__name__}", - "services": [self.services_pipeline.info_dict], - } - async def _run_pipeline( self, request: Message, ctx_id: Optional[Hashable] = None, update_ctx_misc: Optional[dict] = None ) -> Context: @@ -329,12 +257,10 @@ async def _run_pipeline( ctx.framework_data.slot_manager.set_root_slot(self.slots) ctx.framework_data.pipeline = self + initialize_service_states(ctx, self.services_pipeline) ctx.add_request(request) - result = await self.services_pipeline(ctx, self) - - if asyncio.iscoroutine(result): - await result + await self.services_pipeline(ctx) ctx.framework_data.service_states.clear() ctx.framework_data.pipeline = None diff --git a/chatsky/core/script_function.py b/chatsky/core/script_function.py index 1c3524621..3ebeeb1d9 100644 --- a/chatsky/core/script_function.py +++ b/chatsky/core/script_function.py @@ -51,7 +51,7 @@ async def wrapped_call(self, ctx: Context, *, info: str = ""): logger.debug(f"Function {self.__class__.__name__} returned {result!r}. {info}") return result except Exception as exc: - logger.warning(f"An exception occurred in {self.__class__.__name__}. {info}", exc_info=exc) + logger.error(f"An exception occurred in {self.__class__.__name__}. {info}", exc_info=exc) return exc async def __call__(self, ctx: Context): diff --git a/chatsky/core/service/__init__.py b/chatsky/core/service/__init__.py index 500c8dc25..fdda149f5 100644 --- a/chatsky/core/service/__init__.py +++ b/chatsky/core/service/__init__.py @@ -5,25 +5,14 @@ """ from .component import PipelineComponent -from .conditions import ( - always_start_condition, - service_successful_condition, - not_condition, - all_condition, - any_condition, -) from .extra import BeforeHandler, AfterHandler from .group import ServiceGroup from .service import Service, to_service from .types import ( - ServiceRuntimeInfo, ExtraHandlerRuntimeInfo, - GlobalExtraHandlerType, ExtraHandlerType, PipelineRunnerFunction, ComponentExecutionState, - StartConditionCheckerFunction, ExtraHandlerConditionFunction, ExtraHandlerFunction, - ServiceFunction, ) diff --git a/chatsky/core/service/actor.py b/chatsky/core/service/actor.py index 3646e580d..3e61c48d2 100644 --- a/chatsky/core/service/actor.py +++ b/chatsky/core/service/actor.py @@ -15,8 +15,7 @@ from __future__ import annotations import logging import asyncio -from typing import TYPE_CHECKING, Dict -from pydantic import model_validator +from typing import Dict from chatsky.core.service.component import PipelineComponent from chatsky.core.transition import get_next_label @@ -25,9 +24,6 @@ from chatsky.core.context import Context from chatsky.core.script_function import BaseProcessing -if TYPE_CHECKING: - from chatsky.core.pipeline import Pipeline - logger = logging.getLogger(__name__) @@ -37,16 +33,14 @@ class Actor(PipelineComponent): according to the :py:class:`~chatsky.core.script.Script`. """ - @model_validator(mode="after") - def __tick_async_flag__(self): - self.calculated_async_flag = False - return self - @property def computed_name(self) -> str: + """ + "actor" + """ return "actor" - async def run_component(self, ctx: Context, pipeline: Pipeline) -> None: + async def run_component(self, ctx: Context) -> None: """ Process the context in the following way: @@ -56,17 +50,17 @@ async def run_component(self, ctx: Context, pipeline: Pipeline) -> None: 3. Run pre-response of the :py:attr:`.Context.current_node`. 4. Determine and save the response of the :py:attr:`.Context.current_node` """ - next_label = pipeline.fallback_label + next_label = ctx.pipeline.fallback_label try: - ctx.framework_data.current_node = pipeline.script.get_inherited_node(ctx.last_label) + ctx.framework_data.current_node = ctx.pipeline.script.get_inherited_node(ctx.last_label) logger.debug("Running pre_transition") await self._run_processing(ctx.current_node.pre_transition, ctx) logger.debug("Running transitions") - destination_result = await get_next_label(ctx, ctx.current_node.transitions, pipeline.default_priority) + destination_result = await get_next_label(ctx, ctx.current_node.transitions, ctx.pipeline.default_priority) if destination_result is not None: next_label = destination_result except Exception as exc: @@ -79,7 +73,7 @@ async def run_component(self, ctx: Context, pipeline: Pipeline) -> None: response = Message() try: - ctx.framework_data.current_node = pipeline.script.get_inherited_node(next_label) + ctx.framework_data.current_node = ctx.pipeline.script.get_inherited_node(next_label) logger.debug("Running pre_response") await self._run_processing(ctx.current_node.pre_response, ctx) diff --git a/chatsky/core/service/component.py b/chatsky/core/service/component.py index fea10809b..3a67467cd 100644 --- a/chatsky/core/service/component.py +++ b/chatsky/core/service/component.py @@ -7,28 +7,24 @@ """ from __future__ import annotations + import logging import abc import asyncio -from typing import Optional, Awaitable, TYPE_CHECKING -from pydantic import BaseModel, Field, model_validator +from typing import Optional, TYPE_CHECKING +from pydantic import BaseModel, Field, field_validator from chatsky.core.service.extra import BeforeHandler, AfterHandler -from chatsky.core.service.conditions import always_start_condition +from chatsky.core.script_function import AnyCondition from chatsky.core.service.types import ( - StartConditionCheckerFunction, ComponentExecutionState, - ServiceRuntimeInfo, - GlobalExtraHandlerType, - ExtraHandlerFunction, ExtraHandlerType, + ExtraHandlerFunction, ) -from ...utils.devel import wrap_sync_function_in_async logger = logging.getLogger(__name__) if TYPE_CHECKING: - from chatsky.core.pipeline import Pipeline from chatsky.core.context import Context @@ -47,111 +43,75 @@ class PipelineComponent(abc.ABC, BaseModel, extra="forbid", arbitrary_types_allo """ timeout: Optional[float] = None """ - (for asynchronous only!) Maximum component execution time (in seconds), + Maximum component execution time (in seconds), if it exceeds this time, it is interrupted. """ - requested_async_flag: Optional[bool] = None + concurrent: bool = False """ - Requested asynchronous property; if not defined, - :py:attr:`~PipelineComponent.calculated_async_flag` is used instead. + Optional flag that indicates whether this component + should be executed concurrently with adjacent concurrent components. """ - calculated_async_flag: bool = False + start_condition: AnyCondition = Field(default=True, validate_default=True) """ - Whether the component can be asynchronous or not. - """ - start_condition: StartConditionCheckerFunction = Field(default=always_start_condition) - """ - :py:data:`.StartConditionCheckerFunction` that is invoked before each component execution; + :py:data:`~.AnyCondition` that is invoked before each component execution; component is executed only if it returns ``True``. """ name: Optional[str] = None """ - Component name (should be unique in a single :py:class:`~chatsky.core.service.group.ServiceGroup`), - should not be blank or contain the ``.`` character. + Name of the component. Defaults to :py:attr:`.computed_name` potentially modified by + :py:func:`~chatsky.core.utils.rename_component_incrementing`. + + See :py:meth:`.validate_name` for rules. """ path: Optional[str] = None """ Separated by dots path to component, is universally unique. """ - @model_validator(mode="after") - def __pipeline_component_validator__(self): + @field_validator("name") + @classmethod + def validate_name(cls, name: str): """ - Validate this component. + Validate this component's name: - :raises ValueError: If component's name is blank or if it contains dots. - :raises Exception: In case component can't be async, but was requested to be. + Name cannot be empty or contain "." or "#". + + :raises ValueError: If name failed validation. """ - if self.name is not None: - if self.name == "": + if name is not None: + if name == "": raise ValueError("Name cannot be blank.") - if "." in self.name: - raise ValueError(f"Name cannot contain '.': {self.name!r}.") + if "." in name: + raise ValueError(f"Name cannot contain '.': {name!r}.") + if "#" in name: + raise ValueError(f"Name cannot contain '#': {name!r}.") - if not self.calculated_async_flag and self.requested_async_flag: - raise Exception(f"{type(self).__name__} '{self.name}' can't be asynchronous!") - return self + return name def _set_state(self, ctx: Context, value: ComponentExecutionState): """ Method for component runtime state setting, state is preserved in :py:attr:`.Context.framework_data`. - :param ctx: :py:class:`~.Context` to keep state in. + :param ctx: :py:class:`.Context` to keep state in. :param value: State to set. """ - ctx.framework_data.service_states[self.path] = value + ctx.framework_data.service_states[self.path].execution_status = value - def get_state(self, ctx: Context, default: Optional[ComponentExecutionState] = None) -> ComponentExecutionState: + def get_state(self, ctx: Context) -> ComponentExecutionState: """ Method for component runtime state getting, state is preserved in :py:attr:`.Context.framework_data`. :param ctx: :py:class:`~.Context` to get state from. - :param default: Default to return if no record found - (usually it's :py:attr:`~.ComponentExecutionState.NOT_RUN`). - :return: :py:class:`.ComponentExecutionState` of this service or default if not found. + :return: :py:class:`.ComponentExecutionState` of this service. """ - return ctx.framework_data.service_states.get(self.path, default if default is not None else None) - - @property - def asynchronous(self) -> bool: - """ - Property, that indicates, whether this component is synchronous or asynchronous. - It is calculated according to the following rules: - - - | If component **can** be asynchronous and :py:attr:`~requested_async_flag` is set, - it returns :py:attr:`~requested_async_flag`. - - | If component **can** be asynchronous and :py:attr:`~requested_async_flag` isn't set, - it returns `True`. - - | If component **can't** be asynchronous and :py:attr:`~requested_async_flag` is `False` or not set, - it returns `False`. - - | If component **can't** be asynchronous and :py:attr:`~requested_async_flag` is `True`, - an Exception is thrown in constructor. - - """ - return self.calculated_async_flag if self.requested_async_flag is None else self.requested_async_flag - - async def run_extra_handler(self, stage: ExtraHandlerType, ctx: Context, pipeline: Pipeline): - extra_handler = None - if stage == ExtraHandlerType.BEFORE: - extra_handler = self.before_handler - if stage == ExtraHandlerType.AFTER: - extra_handler = self.after_handler - if extra_handler is None: - return - try: - extra_handler_result = await extra_handler(ctx, pipeline, self._get_runtime_info(ctx)) - if extra_handler.asynchronous and isinstance(extra_handler_result, Awaitable): - await extra_handler_result - except asyncio.TimeoutError: - logger.warning(f"{type(self).__name__} '{self.name}' {extra_handler.stage} extra handler timed out!") + return ctx.framework_data.service_states[self.path].execution_status @abc.abstractmethod - async def run_component(self, ctx: Context, pipeline: Pipeline) -> Optional[ComponentExecutionState]: + async def run_component(self, ctx: Context) -> Optional[ComponentExecutionState]: """ Run this component. :param ctx: Current dialog :py:class:`~.Context`. - :param pipeline: This :py:class:`~.Pipeline`. """ raise NotImplementedError @@ -159,95 +119,65 @@ async def run_component(self, ctx: Context, pipeline: Pipeline) -> Optional[Comp def computed_name(self) -> str: """ Default name that is used if :py:attr:`~.PipelineComponent.name` is not defined. + In case two components in a :py:class:`~chatsky.core.service.group.ServiceGroup` have the same :py:attr:`.computed_name` an incrementing number is appended to the name. """ return "noname_service" - async def _run(self, ctx: Context, pipeline: Pipeline) -> None: + async def _run(self, ctx: Context) -> None: """ A method for running a pipeline component. Executes extra handlers before and after execution, launches :py:meth:`.run_component` method. This method is run after the component's timeout is set (if needed). :param ctx: Current dialog :py:class:`~.Context`. - :param pipeline: This :py:class:`~.Pipeline`. """ - try: - if await wrap_sync_function_in_async(self.start_condition, ctx, pipeline): - await self.run_extra_handler(ExtraHandlerType.BEFORE, ctx, pipeline) + + async def _inner_run(): + if await self.start_condition(ctx): + await self.before_handler(ctx, self) self._set_state(ctx, ComponentExecutionState.RUNNING) - if await self.run_component(ctx, pipeline) is not ComponentExecutionState.FAILED: + logger.debug(f"Running component {self.path!r}") + result = await self.run_component(ctx) + if isinstance(result, ComponentExecutionState): + self._set_state(ctx, result) + else: self._set_state(ctx, ComponentExecutionState.FINISHED) - await self.run_extra_handler(ExtraHandlerType.AFTER, ctx, pipeline) + await self.after_handler(ctx, self) else: self._set_state(ctx, ComponentExecutionState.NOT_RUN) + + try: + await asyncio.wait_for(_inner_run(), timeout=self.timeout) except Exception as exc: self._set_state(ctx, ComponentExecutionState.FAILED) logger.error(f"Service '{self.name}' execution failed!", exc_info=exc) + finally: + ctx.framework_data.service_states[self.path].finished_event.set() - async def __call__(self, ctx: Context, pipeline: Pipeline) -> Optional[Awaitable]: + async def __call__(self, ctx: Context) -> None: """ A method for calling pipeline components. - It sets up timeout if this component is asynchronous and executes it using :py:meth:`_run` method. + It sets up timeout and executes it using :py:meth:`_run` method. :param ctx: Current dialog :py:class:`~.Context`. - :param pipeline: This :py:class:`~.Pipeline`. - :return: ``None`` if the service is synchronous; an ``Awaitable`` otherwise. + :return: ``None`` """ - if self.asynchronous: - task = asyncio.create_task(self._run(ctx, pipeline)) - return asyncio.wait_for(task, timeout=self.timeout) - else: - return await self._run(ctx, pipeline) + await self._run(ctx) - def add_extra_handler(self, global_extra_handler_type: GlobalExtraHandlerType, extra_handler: ExtraHandlerFunction): + def add_extra_handler(self, extra_handler_type: ExtraHandlerType, extra_handler: ExtraHandlerFunction): """ - Method for adding a global extra handler to this particular component. + Add extra handler to this component. - :param global_extra_handler_type: A type of extra handler to add. - :param extra_handler: A :py:class:`~.GlobalExtraHandlerType` to add to the component as an extra handler. - :type extra_handler: :py:data:`~.ExtraHandlerFunction` - :return: `None` + :param extra_handler_type: A type of extra handler to add (before or after). + :param extra_handler: Function to add to the component as an extra handler. """ - target = ( - self.before_handler if global_extra_handler_type is GlobalExtraHandlerType.BEFORE else self.after_handler - ) + if extra_handler_type == ExtraHandlerType.BEFORE: + target = self.before_handler + elif extra_handler_type == ExtraHandlerType.AFTER: + target = self.after_handler + else: + raise ValueError(f"Unrecognized ExtraHandlerType: {extra_handler_type}") target.functions.append(extra_handler) - - def _get_runtime_info(self, ctx: Context) -> ServiceRuntimeInfo: - """ - Method for retrieving runtime info about this component. - - :param ctx: Current dialog :py:class:`~.Context`. - :return: :py:class:`.ServiceRuntimeInfo` - object where all not set fields are replaced with `[None]`. - """ - return ServiceRuntimeInfo( - name=self.name if self.name is not None else "[None]", - path=self.path if self.path is not None else "[None]", - timeout=self.timeout, - asynchronous=self.asynchronous, - execution_state=ctx.framework_data.service_states.copy(), - ) - - @property - def info_dict(self) -> dict: - """ - Property for retrieving info dictionary about this component. - All not set fields there are replaced with `[None]`. - - :return: Info dict, containing most important component public fields as well as its type. - """ - return { - "type": type(self).__name__, - "name": self.name, - "path": self.path if self.path is not None else "[None]", - "asynchronous": self.asynchronous, - "start_condition": self.start_condition.__name__, - "extra_handlers": { - "before": self.before_handler.info_dict, - "after": self.after_handler.info_dict, - }, - } diff --git a/chatsky/core/service/conditions.py b/chatsky/core/service/conditions.py deleted file mode 100644 index e5560336b..000000000 --- a/chatsky/core/service/conditions.py +++ /dev/null @@ -1,97 +0,0 @@ -""" -Conditions ----------- -The conditions module contains functions that determine whether the pipeline component should be executed or not. - -The standard set of them allows user to set up dependencies between pipeline components. -""" - -from __future__ import annotations -from typing import Optional, TYPE_CHECKING - -from chatsky.core.context import Context - -from chatsky.core.service.types import ( - StartConditionCheckerFunction, - ComponentExecutionState, - StartConditionCheckerAggregationFunction, -) - -if TYPE_CHECKING: - from chatsky.core.pipeline import Pipeline - - -def always_start_condition(_: Context, __: Pipeline) -> bool: - """ - Condition that always allows service execution. It's the default condition for all services. - - :param _: Current dialog context. - :param __: Pipeline. - """ - return True - - -def service_successful_condition(path: Optional[str] = None) -> StartConditionCheckerFunction: - """ - Condition that allows service execution, only if the other service was executed successfully. - Returns :py:data:`~.StartConditionCheckerFunction`. - - :param path: The path of the condition pipeline component. - """ - - def check_service_state(ctx: Context, _: Pipeline): - state = ctx.framework_data.service_states.get(path, ComponentExecutionState.NOT_RUN) - return ComponentExecutionState[state] == ComponentExecutionState.FINISHED - - return check_service_state - - -def not_condition(func: StartConditionCheckerFunction) -> StartConditionCheckerFunction: - """ - Condition that returns opposite boolean value to the one returned by incoming function. - Returns :py:data:`~.StartConditionCheckerFunction`. - - :param func: The function to return opposite of. - """ - - def not_function(ctx: Context, pipeline: Pipeline): - return not func(ctx, pipeline) - - return not_function - - -def aggregate_condition( - aggregator: StartConditionCheckerAggregationFunction, *functions: StartConditionCheckerFunction -) -> StartConditionCheckerFunction: - """ - Condition that returns aggregated boolean value from all booleans returned by incoming functions. - Returns :py:data:`~.StartConditionCheckerFunction`. - - :param aggregator: The function that accepts list of booleans and returns a single boolean. - :param functions: Functions to aggregate. - """ - - def aggregation_function(ctx: Context, pipeline: Pipeline): - return aggregator([func(ctx, pipeline) for func in functions]) - - return aggregation_function - - -def all_condition(*functions: StartConditionCheckerFunction) -> StartConditionCheckerFunction: - """ - Condition that returns `True` only if all incoming functions return `True`. - Returns :py:data:`~.StartConditionCheckerFunction`. - - :param functions: Functions to aggregate. - """ - return aggregate_condition(all, *functions) - - -def any_condition(*functions: StartConditionCheckerFunction) -> StartConditionCheckerFunction: - """ - Condition that returns `True` if any of incoming functions returns `True`. - Returns :py:data:`~.StartConditionCheckerFunction`. - - :param functions: Functions to aggregate. - """ - return aggregate_condition(any, *functions) diff --git a/chatsky/core/service/extra.py b/chatsky/core/service/extra.py index a6bf4eec9..275839605 100644 --- a/chatsky/core/service/extra.py +++ b/chatsky/core/service/extra.py @@ -9,15 +9,16 @@ import asyncio import logging import inspect -from typing import Optional, List, TYPE_CHECKING, Any, ClassVar, Union, Callable +import abc +from typing import Optional, List, Any, ClassVar, Union, Callable, TYPE_CHECKING from typing_extensions import Annotated, TypeAlias -from pydantic import BaseModel, computed_field, model_validator, Field + +from pydantic import BaseModel, model_validator, Field from chatsky.core.context import Context from chatsky.utils.devel.async_helpers import wrap_sync_function_in_async from chatsky.core.service.types import ( - ServiceRuntimeInfo, ExtraHandlerType, ExtraHandlerFunction, ExtraHandlerRuntimeInfo, @@ -26,35 +27,35 @@ logger = logging.getLogger(__name__) if TYPE_CHECKING: - from chatsky.core.pipeline import Pipeline + from chatsky.core.service import PipelineComponent -class ComponentExtraHandler(BaseModel, extra="forbid", arbitrary_types_allowed=True): +class ComponentExtraHandler(BaseModel, abc.ABC, extra="forbid", arbitrary_types_allowed=True): """ Class, representing an extra handler for pipeline components. A component extra handler is a set of functions, attached to pipeline component (before or after it). Extra handlers should execute supportive tasks (like time or resources measurement, minor data transformations). - Extra handlers should NOT edit context or pipeline, use services for that purpose instead. """ functions: List[ExtraHandlerFunction] = Field(default_factory=list) """ A list or instance of :py:data:`~.ExtraHandlerFunction`. """ - stage: ClassVar[ExtraHandlerType] = ExtraHandlerType.UNDEFINED + stage: ClassVar[ExtraHandlerType] """ An :py:class:`~.ExtraHandlerType`, specifying whether this handler will be executed before or after pipeline component. """ timeout: Optional[float] = None """ - (for asynchronous only!) Maximum component execution time (in seconds), + Maximum component execution time (in seconds), if it exceeds this time, it is interrupted. """ - requested_async_flag: Optional[bool] = None + concurrent: bool = False """ - Requested asynchronous property. + A flag that indicates whether the extra handler's functions + should be executed concurrently. False by default. """ @model_validator(mode="before") @@ -76,98 +77,45 @@ def functions_validator(cls, data: Any): result["functions"] = [result["functions"]] return result - @computed_field(repr=False) - def calculated_async_flag(self) -> bool: - return all([asyncio.iscoroutinefunction(func) for func in self.functions]) - - @property - def asynchronous(self) -> bool: - """ - Property, that indicates, whether this component extra handler is synchronous or asynchronous. - It is calculated according to the following rules: - - - | If component **can** be asynchronous and :py:attr:`~requested_async_flag` is set, - it returns :py:attr:`~requested_async_flag`. - - | If component **can** be asynchronous and :py:attr:`~requested_async_flag` isn't set, - it returns `True`. - - | If component **can't** be asynchronous and :py:attr:`~requested_async_flag` is `False` or not set, - it returns `False`. - - | If component **can't** be asynchronous and :py:attr:`~requested_async_flag` is `True`, - an Exception is thrown in constructor. - - """ - return self.calculated_async_flag if self.requested_async_flag is None else self.requested_async_flag - - async def _run_function( - self, func: ExtraHandlerFunction, ctx: Context, pipeline: Pipeline, component_info: ServiceRuntimeInfo - ): + async def _run_function(self, func: ExtraHandlerFunction, ctx: Context, component: PipelineComponent): handler_params = len(inspect.signature(func).parameters) if handler_params == 1: await wrap_sync_function_in_async(func, ctx) elif handler_params == 2: - await wrap_sync_function_in_async(func, ctx, pipeline) - elif handler_params == 3: - extra_handler_runtime_info = ExtraHandlerRuntimeInfo(func=func, stage=self.stage, component=component_info) - await wrap_sync_function_in_async(func, ctx, pipeline, extra_handler_runtime_info) + extra_handler_runtime_info = ExtraHandlerRuntimeInfo(stage=self.stage, component=component) + await wrap_sync_function_in_async(func, ctx, extra_handler_runtime_info) else: raise Exception( - f"Too many parameters required for component {component_info.name} {self.stage}" + f"Too many parameters required for component {component.name} {self.stage}" f" wrapper handler '{func.__name__}': {handler_params}!" ) - async def _run(self, ctx: Context, pipeline: Pipeline, component_info: ServiceRuntimeInfo): + async def _run(self, ctx: Context, component_info: PipelineComponent): """ Method for executing one of the extra handler functions (before or after). If the function is not set, nothing happens. :param ctx: current dialog context. - :param pipeline: the current pipeline. - :param component_info: associated component's info dictionary. + :param component_info: associated component's `self` object. :return: `None` """ - if self.asynchronous: - futures = [self._run_function(func, ctx, pipeline, component_info) for func in self.functions] - for func, future in zip(self.functions, asyncio.as_completed(futures)): - try: - await future - except asyncio.TimeoutError: - logger.warning(f"Component {component_info.name} {self.stage} wrapper '{func.__name__}' timed out!") - + if self.concurrent: + await asyncio.gather(*[self._run_function(func, ctx, component_info) for func in self.functions]) else: for func in self.functions: - await self._run_function(func, ctx, pipeline, component_info) + await self._run_function(func, ctx, component_info) - async def __call__(self, ctx: Context, pipeline: Pipeline, component_info: ServiceRuntimeInfo): + async def __call__(self, ctx: Context, component_info: PipelineComponent): """ - A method for calling pipeline components. - It sets up timeout if this component is asynchronous and executes it using `_run` method. + A method for calling an extra handler. + It sets up a timeout and executes it using `_run` method. :param ctx: (required) Current dialog `Context`. - :param pipeline: This `Pipeline`. - :return: `Context` if this is a synchronous service or - `Awaitable` if this is an asynchronous component or `None`. - """ - if self.asynchronous: - task = asyncio.create_task(self._run(ctx, pipeline, component_info)) - return await asyncio.wait_for(task, timeout=self.timeout) - else: - return await self._run(ctx, pipeline, component_info) - - @property - def info_dict(self) -> dict: - """ - Property for retrieving info dictionary about this extra handler. - - :return: Info dict, containing its fields as well as its type. - All not set fields there are replaced with `None`. + :param component_info: associated component's `self` object. """ - return { - "type": type(self).__name__, - "timeout": self.timeout, - "asynchronous": self.asynchronous, - "functions": [func.__name__ for func in self.functions], - } + task = asyncio.create_task(self._run(ctx, component_info)) + await asyncio.wait_for(task, timeout=self.timeout) class BeforeHandler(ComponentExtraHandler): @@ -179,9 +127,8 @@ class BeforeHandler(ComponentExtraHandler): :type functions: List[ExtraHandlerFunction] :param timeout: Optional timeout for the execution of the extra functions, in seconds. - :param requested_async_flag: Optional flag that indicates whether the extra functions - should be executed asynchronously. The default value of the flag is True - if all the functions in this handler are asynchronous. + :param concurrent: Optional flag that indicates whether the extra functions + should be executed concurrently. False by default. """ stage: ClassVar[ExtraHandlerType] = ExtraHandlerType.BEFORE @@ -196,9 +143,8 @@ class AfterHandler(ComponentExtraHandler): :type functions: List[ExtraHandlerFunction] :param timeout: Optional timeout for the execution of the extra functions, in seconds. - :param requested_async_flag: Optional flag that indicates whether the extra functions - should be executed asynchronously. The default value of the flag is True - if all the functions in this handler are asynchronous. + :param concurrent: Optional flag that indicates whether the extra functions + should be executed concurrently. False by default. """ stage: ClassVar[ExtraHandlerType] = ExtraHandlerType.AFTER diff --git a/chatsky/core/service/group.py b/chatsky/core/service/group.py index 85b9d3165..d330c7145 100644 --- a/chatsky/core/service/group.py +++ b/chatsky/core/service/group.py @@ -5,46 +5,35 @@ This class provides a way to organize and manage multiple services as a single unit, allowing for easier management and organization of the services within the pipeline. - -:py:class:`~.ServiceGroup` serves the important function of grouping services to work together in parallel. """ from __future__ import annotations import asyncio import logging -from typing import List, Union, Awaitable, TYPE_CHECKING, Any, Optional +from typing import List, Union, Any, Optional from typing_extensions import TypeAlias, Annotated from pydantic import model_validator, Field from chatsky.core.service.extra import BeforeHandler, AfterHandler -from chatsky.core.service.conditions import always_start_condition +from chatsky.core.script_function import AnyCondition from chatsky.core.context import Context from chatsky.core.service.actor import Actor from chatsky.core.service.component import PipelineComponent from chatsky.core.service.types import ( ComponentExecutionState, - GlobalExtraHandlerType, + ExtraHandlerType, ExtraHandlerConditionFunction, ExtraHandlerFunction, - StartConditionCheckerFunction, ) from .service import Service, ServiceInitTypes logger = logging.getLogger(__name__) -if TYPE_CHECKING: - from chatsky.core.pipeline import Pipeline - class ServiceGroup(PipelineComponent): """ A service group class. - - Service group can be synchronous or asynchronous. - Components in synchronous groups are executed consequently (no matter is they are synchronous or asynchronous). - Components in asynchronous groups are executed simultaneously. - Group can be asynchronous only if all components in it are asynchronous. """ components: List[ @@ -56,12 +45,19 @@ class ServiceGroup(PipelineComponent): """ A :py:class:`~.ServiceGroup` object, that will be added to the group. """ - # Inherited fields repeated. Don't delete these, they're needed for documentation! + fully_concurrent: bool = False + """ + Whether this should run all components inside it concurrently + (regardless of their `concurrent` attribute. + This is not recursive (applies only to first level components). + Default value is False. + """ + # Repeating inherited fields for better documentation. before_handler: BeforeHandler = Field(default_factory=BeforeHandler) after_handler: AfterHandler = Field(default_factory=AfterHandler) timeout: Optional[float] = None - requested_async_flag: Optional[bool] = None - start_condition: StartConditionCheckerFunction = Field(default=always_start_condition) + concurrent: bool = False + start_condition: AnyCondition = Field(default=True, validate_default=True) name: Optional[str] = None path: Optional[str] = None @@ -69,14 +65,10 @@ class ServiceGroup(PipelineComponent): @classmethod def components_validator(cls, data: Any): """ - Add support for initializing from a `Callable`, `List` - and :py:class:`~.PipelineComponent` (such as :py:class:`~.Service`) - Casts `components` to `list` if it's not already. + Add support for initializing from a list of :py:class:`~.PipelineComponent`. """ if isinstance(data, list): result = {"components": data} - elif callable(data) or isinstance(data, PipelineComponent): - result = {"components": [data]} else: result = data @@ -85,116 +77,70 @@ def components_validator(cls, data: Any): result["components"] = [result["components"]] return result - @model_validator(mode="after") - def __calculate_async_flag__(self): - self.calculated_async_flag = all([service.asynchronous for service in self.components]) - return self - - async def run_component(self, ctx: Context, pipeline: Pipeline) -> Optional[ComponentExecutionState]: + async def run_component(self, ctx: Context) -> Optional[ComponentExecutionState]: """ - Method for running this service group. Catches runtime exceptions and logs them. - It doesn't include extra handlers execution, start condition checking or error handling - pure execution only. - Executes components inside the group based on its :py:attr:`~.PipelineComponent.asynchronous` property. - Collects information about their execution state - group is finished successfully - only if all components in it finished successfully. + Run components of this service group. + + If :py:attr:`.fully_concurrent` flag is set to True, all :py:attr:`.components` will run concurrently + (via ``asyncio.gather``). + + Otherwise, all non-concurrent components execute one after another + while consecutive concurrent components are run concurrently (via ``asyncio.gather``). :param ctx: Current dialog context. - :param pipeline: The current pipeline. + :return: :py:attr:`.ComponentExecutionState.FAILED` if any component failed. """ - if self.asynchronous: - service_futures = [service(ctx, pipeline) for service in self.components] - for service, future in zip(self.components, await asyncio.gather(*service_futures, return_exceptions=True)): - service_result = future - if service.asynchronous and isinstance(service_result, Awaitable): - await service_result - elif isinstance(service_result, asyncio.TimeoutError): - logger.warning(f"{type(service).__name__} '{service.name}' timed out!") - + if self.fully_concurrent: + await asyncio.gather(*[service(ctx) for service in self.components]) else: - for service in self.components: - service_result = await service(ctx, pipeline) - if service.asynchronous and isinstance(service_result, Awaitable): - await service_result + current_subgroup = [] + for component in self.components: + if component.concurrent: + current_subgroup.append(component) + else: + await asyncio.gather(*[service(ctx) for service in current_subgroup]) + await component(ctx) + current_subgroup = [] + await asyncio.gather(*[service(ctx) for service in current_subgroup]) failed = any([service.get_state(ctx) == ComponentExecutionState.FAILED for service in self.components]) if failed: return ComponentExecutionState.FAILED - def log_optimization_warnings(self): - """ - Method for logging service group optimization warnings for all this groups inner components. - (NOT this group itself!). - Warnings are basically messages, - that indicate service group inefficiency or explicitly defined parameters mismatch. - These are cases for warnings issuing: - - - Service can be asynchronous, however is marked synchronous explicitly. - - Service is not asynchronous, however has a timeout defined. - - Group is not marked synchronous explicitly and contains both synchronous and asynchronous components. - - :return: `None` - """ - for service in self.components: - if not isinstance(service, ServiceGroup): - if ( - service.calculated_async_flag - and service.requested_async_flag is not None - and not service.requested_async_flag - ): - logger.warning(f"Service '{service.name}' could be asynchronous!") - if not service.asynchronous and service.timeout is not None: - logger.warning(f"Timeout can not be applied for Service '{service.name}': it's not asynchronous!") - else: - if not service.calculated_async_flag: - if service.requested_async_flag is None and any( - [sub_service.asynchronous for sub_service in service.components] - ): - logger.warning( - f"ServiceGroup '{service.name}' contains both sync and async services, " - "it should be split or marked as synchronous explicitly!", - ) - service.log_optimization_warnings() - def add_extra_handler( self, - global_extra_handler_type: GlobalExtraHandlerType, + extra_handler_type: ExtraHandlerType, extra_handler: ExtraHandlerFunction, - condition: ExtraHandlerConditionFunction = lambda _: False, + condition: ExtraHandlerConditionFunction = lambda path: False, ): """ - Method for adding a global extra handler to this group. - Adds extra handler to itself and propagates it to all inner components. - Uses a special condition function to determine whether to add extra handler to any particular inner component. - Condition checks components path to be in whitelist (if defined) and not to be in blacklist (if defined). - - :param global_extra_handler_type: A type of extra handler to add. - :param extra_handler: A `ExtraHandlerFunction` to add as an extra handler. - :type extra_handler: :py:data:`~.ExtraHandlerFunction` - :param condition: A condition function. - :return: `None` + Add extra handler to this group. + + For every component in the group, ``condition`` is called with the path of that component + to determine whether to add extra handler to that component. + + :param extra_handler_type: Extra handler type (before or after). + :param extra_handler: Function to add as an extra handler. + :type extra_handler: :py:data:`.ExtraHandlerFunction` + :param condition: Condition function to determine if extra handler should be added to specific subcomponents. + Defaults to a function returning False. + :type condition: :py:data:`.ExtraHandlerConditionFunction` """ - super().add_extra_handler(global_extra_handler_type, extra_handler) + super().add_extra_handler(extra_handler_type, extra_handler) for service in self.components: if not condition(service.path): continue if isinstance(service, ServiceGroup): - service.add_extra_handler(global_extra_handler_type, extra_handler, condition) + service.add_extra_handler(extra_handler_type, extra_handler, condition) else: - service.add_extra_handler(global_extra_handler_type, extra_handler) + service.add_extra_handler(extra_handler_type, extra_handler) @property def computed_name(self) -> str: - return "service_group" - - @property - def info_dict(self) -> dict: """ - See `Component.info_dict` property. - Adds `services` key to base info dictionary. + "service_group" """ - representation = super(ServiceGroup, self).info_dict - representation.update({"services": [service.info_dict for service in self.components]}) - return representation + return "service_group" ServiceGroupInitTypes: TypeAlias = Union[ diff --git a/chatsky/core/service/service.py b/chatsky/core/service/service.py index cba20e0bd..7af296b75 100644 --- a/chatsky/core/service/service.py +++ b/chatsky/core/service/service.py @@ -5,51 +5,39 @@ Pipeline consists of services and service groups. Service is an atomic part of a pipeline. - -Service can be asynchronous only if its handler is a coroutine. -Actor wrapping service is asynchronous. """ from __future__ import annotations import logging import inspect -from typing import TYPE_CHECKING, Any, Optional, Callable, Union +from typing import Any, Optional, Callable, Union from typing_extensions import TypeAlias, Annotated from pydantic import model_validator, Field from chatsky.core.context import Context -from chatsky.utils.devel.async_helpers import wrap_sync_function_in_async -from chatsky.core.service.conditions import always_start_condition -from chatsky.core.service.types import ( - ServiceFunction, - StartConditionCheckerFunction, -) +from chatsky.core.script_function import BaseProcessing, AnyCondition from chatsky.core.service.component import PipelineComponent from .extra import BeforeHandler, AfterHandler +from chatsky.utils.devel import wrap_sync_function_in_async logger = logging.getLogger(__name__) -if TYPE_CHECKING: - from chatsky.core.pipeline import Pipeline - class Service(PipelineComponent): """ This class represents a service. - - Service can be asynchronous only if its handler is a coroutine. """ - handler: ServiceFunction + handler: Union[BaseProcessing, Callable[[Context], None]] = None """ - A :py:data:`~.ServiceFunction`. + Function that represents this service. """ - # Inherited fields repeated. Don't delete these, they're needed for documentation! + # Repeating inherited fields for better documentation. before_handler: BeforeHandler = Field(default_factory=BeforeHandler) after_handler: AfterHandler = Field(default_factory=AfterHandler) timeout: Optional[float] = None - requested_async_flag: Optional[bool] = None - start_condition: StartConditionCheckerFunction = Field(default=always_start_condition) + concurrent: bool = False + start_condition: AnyCondition = Field(default=True, validate_default=True) name: Optional[str] = None path: Optional[str] = None @@ -57,87 +45,70 @@ class Service(PipelineComponent): @classmethod def handler_validator(cls, data: Any): """ - Add support for initializing from a `Callable`. + Add support for initializing from a `Callable` or `BaseProcessing`. """ - if isinstance(data, Callable): + if inspect.isfunction(data) or isinstance(data, BaseProcessing): return {"handler": data} return data - @model_validator(mode="after") - def __tick_async_flag__(self): - self.calculated_async_flag = True - return self - - async def run_component(self, ctx: Context, pipeline: Pipeline) -> None: + async def call(self, ctx: Context) -> None: """ - Method for running this service. Service 'handler' has three possible signatures, - so this method picks the right one to invoke. These possible signatures are: + A placeholder method which the user can redefine in their own derivative of :py:class:`.Service`. + This allows direct access to the ``self`` object and all its fields. - - (ctx: Context) - accepts current dialog context only. - - (ctx: Context, pipeline: Pipeline) - accepts context and current pipeline. - - | (ctx: Context, pipeline: Pipeline, info: ServiceRuntimeInfo) - accepts context, - pipeline and service runtime info dictionary. + :param ctx: Current dialog context. + """ + if self.handler is None: + raise NotImplementedError( + f"Received {self.__class__.__name__} object, which has it's 'handler' == 'None'," + f" while also not defining it's own 'call()' method." + ) + await wrap_sync_function_in_async(self.handler, ctx) + + async def run_component(self, ctx: Context) -> None: + """ + Method for running this service. :param ctx: Current dialog context. - :param pipeline: The current pipeline. :return: `None` """ - handler_params = len(inspect.signature(self.handler).parameters) - if handler_params == 1: - await wrap_sync_function_in_async(self.handler, ctx) - elif handler_params == 2: - await wrap_sync_function_in_async(self.handler, ctx, pipeline) - elif handler_params == 3: - await wrap_sync_function_in_async(self.handler, ctx, pipeline, self._get_runtime_info(ctx)) - else: - raise Exception(f"Too many parameters required for service '{self.name}' handler: {handler_params}!") + await wrap_sync_function_in_async(self.call, ctx) @property def computed_name(self) -> str: + """ + Return name of the handler or name of this class if handler is empty. + """ if inspect.isfunction(self.handler): return self.handler.__name__ + elif self.handler is None: + return self.__class__.__name__ else: return self.handler.__class__.__name__ - @property - def info_dict(self) -> dict: - """ - See `Component.info_dict` property. - Adds `handler` key to base info dictionary. - """ - representation = super(Service, self).info_dict - # Need to carefully remove this - if callable(self.handler): - service_representation = f"Callable '{self.handler.__name__}'" - else: - service_representation = "[Unknown]" - representation.update({"handler": service_representation}) - return representation - def to_service( before_handler: BeforeHandler = None, after_handler: AfterHandler = None, timeout: Optional[int] = None, - asynchronous: Optional[bool] = None, - start_condition: StartConditionCheckerFunction = always_start_condition, + concurrent: bool = False, + start_condition: AnyCondition = True, name: Optional[str] = None, ): """ - Function for decorating a function as a Service. - Returns a Service, constructed from this function (taken as a handler). - All arguments are passed directly to `Service` constructor. + Return a function decorator that returns a :py:class:`Service` with the + given parameters. """ before_handler = BeforeHandler() if before_handler is None else before_handler after_handler = AfterHandler() if after_handler is None else after_handler - def inner(handler: ServiceFunction) -> Service: + def inner(handler: Union[BaseProcessing, Callable]) -> Service: return Service( handler=handler, before_handler=before_handler, after_handler=after_handler, timeout=timeout, - requested_async_flag=asynchronous, + concurrent=concurrent, start_condition=start_condition, name=name, ) @@ -146,6 +117,9 @@ def inner(handler: ServiceFunction) -> Service: ServiceInitTypes: TypeAlias = Union[ - Service, Annotated[dict, "dict following the Service data model"], Annotated[Callable, "handler for the service"] + Service, + Annotated[dict, "dict following the Service data model"], + Annotated[Callable, "handler for the service"], + Annotated[BaseProcessing, "handler for the service"], ] """Types that :py:class:`~.Service` can be validated from.""" diff --git a/chatsky/core/service/types.py b/chatsky/core/service/types.py index d17d4dad1..763a2784e 100644 --- a/chatsky/core/service/types.py +++ b/chatsky/core/service/types.py @@ -9,13 +9,14 @@ from __future__ import annotations from enum import unique, Enum -from typing import Callable, Union, Awaitable, Dict, Optional, Iterable, Any, Protocol, Hashable, TYPE_CHECKING +from typing import Callable, Union, Awaitable, Optional, Any, Protocol, Hashable, TYPE_CHECKING from typing_extensions import TypeAlias from pydantic import BaseModel if TYPE_CHECKING: - from chatsky.core import Context, Message, Pipeline + from chatsky.core import Context, Message + from chatsky.core.service import PipelineComponent class PipelineRunnerFunction(Protocol): @@ -49,7 +50,7 @@ class ComponentExecutionState(str, Enum): """ Enum, representing pipeline component execution state. These states are stored in :py:attr:`~chatsky.core.context.FrameworkData.service_states`, - that should always be requested with `NOT_RUN` being default fallback. + that should always be requested with ``NOT_RUN`` being default fallback. Following states are supported: - NOT_RUN: component has not been executed yet (the default one), @@ -64,112 +65,50 @@ class ComponentExecutionState(str, Enum): FAILED = "FAILED" -@unique -class GlobalExtraHandlerType(str, Enum): - """ - Enum, representing types of global extra handlers, that can be set applied for a pipeline. - The following types are supported: - - - BEFORE_ALL: function called before each pipeline call, - - BEFORE: function called before each component, - - AFTER: function called after each component, - - AFTER_ALL: function called after each pipeline call. - """ - - BEFORE_ALL = "BEFORE_ALL" - BEFORE = "BEFORE" - AFTER = "AFTER" - AFTER_ALL = "AFTER_ALL" - - @unique class ExtraHandlerType(str, Enum): """ - Enum, representing wrapper execution stage: before or after the wrapped function. + Enum, representing extra handler execution stage: before or after the wrapped function. The following types are supported: - - UNDEFINED: extra handler function with undetermined execution stage, - BEFORE: extra handler function called before component, - AFTER: extra handler function called after component. """ - UNDEFINED = "UNDEFINED" BEFORE = "BEFORE" AFTER = "AFTER" -StartConditionCheckerFunction: TypeAlias = Callable[["Context", "Pipeline"], bool] -""" -A function type for components `start_conditions`. -Accepts context and pipeline, returns boolean (whether service can be launched). -""" - - -StartConditionCheckerAggregationFunction: TypeAlias = Callable[[Iterable[bool]], bool] -""" -A function type for creating aggregation `start_conditions` for components. -Accepts list of functions (other start_conditions to aggregate), returns boolean (whether service can be launched). -""" - - ExtraHandlerConditionFunction: TypeAlias = Callable[[str], bool] """ -A function type used during global extra handler initialization to determine -whether extra handler should be applied to component with given path or not. -Checks components path to be in whitelist (if defined) and not to be in blacklist (if defined). -Accepts str (component path), returns boolean (whether extra handler should be applied). -""" - +A function type used when adding an extra handler to a service group to determine +whether extra handler should be added to components of the service group. -class ServiceRuntimeInfo(BaseModel): - """ - Type of object, that is passed to components in runtime. - Contains current component info (`name`, `path`, `timeout`, `asynchronous`). - Also contains `execution_state` - a dictionary, - containing execution states of other components mapped to their paths. - """ - - name: str - path: str - timeout: Optional[float] - asynchronous: bool - execution_state: Dict[str, ComponentExecutionState] +Accepts a single argument - path of a subcomponent in a group. +Return bool - whether to add extra handler to the subcomponent. +""" ExtraHandlerFunction: TypeAlias = Union[ Callable[["Context"], Any], - Callable[["Context", "Pipeline"], Any], - Callable[["Context", "Pipeline", "ExtraHandlerRuntimeInfo"], Any], + Callable[["Context", "ExtraHandlerRuntimeInfo"], Any], ] """ A function type for creating extra handler (before and after functions). -Can accept current dialog context, pipeline, and current extra handler info. +Can accept current dialog context and current extra handler info. """ class ExtraHandlerRuntimeInfo(BaseModel): - func: ExtraHandlerFunction - stage: ExtraHandlerType - component: ServiceRuntimeInfo - - -""" -Type of object, that is passed to wrappers in runtime. -Contains current wrapper info (`name`, `stage`). -Also contains `component` - runtime info of the component this wrapper is attached to. -""" - + """ + Information passed to :py:data:`.ExtraHandlerFunction`. + """ -ServiceFunction: TypeAlias = Union[ - Callable[["Context"], None], - Callable[["Context"], Awaitable[None]], - Callable[["Context", "Pipeline"], None], - Callable[["Context", "Pipeline"], Awaitable[None]], - Callable[["Context", "Pipeline", ServiceRuntimeInfo], None], - Callable[["Context", "Pipeline", ServiceRuntimeInfo], Awaitable[None]], -] -""" -A function type for creating service handlers. -Can accept current dialog context, pipeline, and current service info. -Can be both synchronous and asynchronous. -""" + stage: ExtraHandlerType + """ + :py:class:`.ExtraHandlerType` -- either "BEFORE" or "AFTER". + """ + component: PipelineComponent + """ + Component object that called the extra handler. + """ diff --git a/chatsky/core/utils.py b/chatsky/core/utils.py index 87f2aba52..7b8273fc2 100644 --- a/chatsky/core/utils.py +++ b/chatsky/core/utils.py @@ -7,11 +7,13 @@ import collections from typing import List +from chatsky.core import Context +from chatsky.core.context import ServiceState from .service.component import PipelineComponent from .service.group import ServiceGroup -def rename_component_incrementing(component: PipelineComponent, collisions: List[PipelineComponent]) -> str: +def rename_component_incrementing(index: int, computed_names: List[str]) -> str: """ Function for generating new name for a pipeline component, that has similar name with other components in the same group. @@ -19,21 +21,21 @@ def rename_component_incrementing(component: PipelineComponent, collisions: List The name is generated according to these rules: 1. Base name is :py:attr:`.PipelineComponent.computed_name`; - 2. After that, ``_[NUMBER]`` is added to the resulting name, - where ``_[NUMBER]`` is number of components with the same name in current service group. + 2. If there are multiple components with the same name, ``#[NUMBER]`` is added to the resulting name, + where ``NUMBER`` is the number of components with the same name in current service group. - :param component: Component to be renamed. - :param collisions: Components in the same service group as component. - :return: Generated name + :param index: Index of the component to be renamed. + :param computed_names: A list of component names (or computed names). + :return: Name for the component. """ - base_name = component.computed_name - name_index = 0 - while f"{base_name}_{name_index}" in [component.name for component in collisions]: - name_index += 1 - return f"{base_name}_{name_index}" + base_name = computed_names[index] + if computed_names.count(base_name) == 1: + return base_name + else: + return f"{base_name}#{computed_names[:index].count(base_name)}" -def finalize_service_group(service_group: ServiceGroup, path: str = ".") -> None: +def finalize_service_group(service_group: ServiceGroup, path: str = "") -> None: """ Function that iterates through a service group (and all its subgroups), finalizing component's names and paths in it. @@ -42,15 +44,35 @@ def finalize_service_group(service_group: ServiceGroup, path: str = ".") -> None :param service_group: Service group to resolve name collisions in. :param path: A prefix for component paths -- path of `component` is equal to `{path}.{component.name}`. - Defaults to ".". + Defaults to "". + :raises ValueError: If multiple components have the same name assigned to them. """ - names_counter = collections.Counter([component.name for component in service_group.components]) - for component in service_group.components: + computed_names = [ + component.name if component.name is not None else component.computed_name + for component in service_group.components + ] + for idx, component in enumerate(service_group.components): if component.name is None: - component.name = rename_component_incrementing(component, service_group.components) - elif names_counter[component.name] > 1: - raise Exception(f"User defined service name collision ({path})!") + component.name = rename_component_incrementing(idx, computed_names) component.path = f"{path}.{component.name}" + new_names_counter = collections.Counter([component.name for component in service_group.components]) + for k, v in new_names_counter.items(): + if v != 1: + raise ValueError("Found multiple components with the same name: {path}.{k}") + + for component in service_group.components: if isinstance(component, ServiceGroup): finalize_service_group(component, f"{path}.{component.name}") + + +def initialize_service_states(ctx: Context, service: PipelineComponent) -> None: + """ + Reset :py:class:`.ServiceState` of `service`. + + Called at the beginning of every turn for the pipeline service group. + """ + ctx.framework_data.service_states[service.path] = ServiceState() + if isinstance(service, ServiceGroup): + for component in service.components: + initialize_service_states(ctx, component) diff --git a/chatsky/stats/default_extractors.py b/chatsky/stats/default_extractors.py index 0819dac4f..47f81c954 100644 --- a/chatsky/stats/default_extractors.py +++ b/chatsky/stats/default_extractors.py @@ -13,12 +13,12 @@ from datetime import datetime -from chatsky.core import Context, Pipeline +from chatsky.core import Context from chatsky.core.service.extra import ExtraHandlerRuntimeInfo from .utils import get_extra_handler_name -async def get_current_label(ctx: Context, pipeline: Pipeline, info: ExtraHandlerRuntimeInfo): +async def get_current_label(ctx: Context, info: ExtraHandlerRuntimeInfo): """ Extract the current label on each turn. This function is required for running the dashboard with the default configuration. @@ -36,7 +36,7 @@ async def get_current_label(ctx: Context, pipeline: Pipeline, info: ExtraHandler } -async def get_timing_before(ctx: Context, _, info: ExtraHandlerRuntimeInfo): +async def get_timing_before(ctx: Context, info: ExtraHandlerRuntimeInfo): """ Store the pipeline component's start time inside the context. This function is required for running the dashboard with the default configuration. @@ -45,7 +45,7 @@ async def get_timing_before(ctx: Context, _, info: ExtraHandlerRuntimeInfo): ctx.framework_data.stats[get_extra_handler_name(info, "time")] = start_time -async def get_timing_after(ctx: Context, _, info: ExtraHandlerRuntimeInfo): # noqa: F811 +async def get_timing_after(ctx: Context, info: ExtraHandlerRuntimeInfo): # noqa: F811 """ Extract the pipeline component's execution time. Requires :py:func:`~.get_timing_before` to be called previously in order to calculate the time. @@ -58,7 +58,7 @@ async def get_timing_after(ctx: Context, _, info: ExtraHandlerRuntimeInfo): # n return data -async def get_last_response(ctx: Context, _, info: ExtraHandlerRuntimeInfo): +async def get_last_response(ctx: Context, info: ExtraHandlerRuntimeInfo): """ Extract the text of the last response in the current context. This handler is best used together with the `Actor` component. @@ -69,7 +69,7 @@ async def get_last_response(ctx: Context, _, info: ExtraHandlerRuntimeInfo): return data -async def get_last_request(ctx: Context, _, info: ExtraHandlerRuntimeInfo): +async def get_last_request(ctx: Context, info: ExtraHandlerRuntimeInfo): """ Extract the text of the last request in the current context. This handler is best used together with the `Actor` component. diff --git a/chatsky/stats/instrumentor.py b/chatsky/stats/instrumentor.py index b9b68dee1..0005e8fcc 100644 --- a/chatsky/stats/instrumentor.py +++ b/chatsky/stats/instrumentor.py @@ -2,14 +2,13 @@ Instrumentor ------------- This modules contains the :py:class:`~OtelInstrumentor` class that implements -Opentelemetry's `BaseInstrumentor` interface and allows for automated +Opentelemetry's ``BaseInstrumentor`` interface and allows for automated instrumentation of Chatsky applications, e.g. for automated logging and log export. - -For detailed reference, see `~OtelInstrumentor` class. """ import asyncio +import logging from typing import Collection, Optional from wrapt import wrap_function_wrapper, decorator @@ -36,6 +35,7 @@ ) from chatsky.stats import default_extractors +logger = logging.getLogger(__name__) INSTRUMENTS = ["chatsky"] @@ -43,21 +43,21 @@ class OtelInstrumentor(BaseInstrumentor): """ Utility class for instrumenting Chatsky-related functions - that implements the :py:class:`~BaseInstrumentor` interface. - :py:meth:`~instrument` and :py:meth:`~uninstrument` methods + that implements the :py:class:`.BaseInstrumentor` interface. + :py:meth:`._instrument` and :py:meth:`._uninstrument` methods are available to apply and revert the instrumentation effects, e.g. enable and disable logging at runtime. .. code-block:: chatsky_instrumentor = OtelInstrumentor() - chatsky_instrumentor.instrument() - chatsky_instrumentor.uninstrument() + chatsky_instrumentor._instrument() + chatsky_instrumentor._uninstrument() Opentelemetry provider instances can be optionally passed to the class constructor. Otherwise, the global logger, tracer and meter providers are leveraged. - The class implements the :py:meth:`~__call__` method, so that + The class implements the :py:meth:`.__call__` method, so that regular functions can be decorated using the class instance. .. code-block:: @@ -145,7 +145,7 @@ def _configure_providers(self, logger_provider, tracer_provider, meter_provider) @decorator async def __call__(self, wrapped, _, args, kwargs): """ - Regular functions that match the :py:class:`~chatsky.pipeline.types.ExtraHandlerFunction` + Regular functions that match the :py:class:`~chatsky.core.service.types.ExtraHandlerFunction` signature can be decorated with the class instance to log the returned value. This method implements the logging procedure. The returned value is assumed to be `dict` or `NoneType`. @@ -157,7 +157,7 @@ async def __call__(self, wrapped, _, args, kwargs): :param args: Positional arguments of the decorated function. :param kwargs: Keyword arguments of the decorated function. """ - ctx, _, info = args + ctx, info = args pipeline_component = get_extra_handler_name(info) attributes = { "context_id": str(ctx.id), @@ -166,29 +166,33 @@ async def __call__(self, wrapped, _, args, kwargs): } result: Optional[dict] - if asyncio.iscoroutinefunction(wrapped): - result = await wrapped(ctx, _, info) - else: - result = wrapped(ctx, _, info) - - if result is None or not self.is_instrumented_by_opentelemetry: - # self.is_instrumented_by_opentelemetry allows to disable - # the decorator programmatically if - # instrumentation is disabled. + try: + if asyncio.iscoroutinefunction(wrapped): + result = await wrapped(ctx, info) + else: + result = wrapped(ctx, info) + + if result is None or not self.is_instrumented_by_opentelemetry: + # self.is_instrumented_by_opentelemetry allows to disable + # the decorator programmatically if + # instrumentation is disabled. + return result + + span: Span + with self._tracer.start_as_current_span(wrapped.__name__, kind=SpanKind.INTERNAL) as span: + span_ctx = span.get_span_context() + record = LogRecord( + span_id=span_ctx.span_id, + trace_id=span_ctx.trace_id, + body=result, + trace_flags=span_ctx.trace_flags, + severity_text=None, + severity_number=SeverityNumber(1), + resource=resource, + attributes=attributes, + ) + self._logger.emit(record=record) return result - span: Span - with self._tracer.start_as_current_span(wrapped.__name__, kind=SpanKind.INTERNAL) as span: - span_ctx = span.get_span_context() - record = LogRecord( - span_id=span_ctx.span_id, - trace_id=span_ctx.trace_id, - body=result, - trace_flags=span_ctx.trace_flags, - severity_text=None, - severity_number=SeverityNumber(1), - resource=resource, - attributes=attributes, - ) - self._logger.emit(record=record) - return result + except Exception as exc: + logger.error(f"Stats collector {wrapped.__name__} execution failed!", exc_info=exc) diff --git a/chatsky/utils/devel/async_helpers.py b/chatsky/utils/devel/async_helpers.py index 13cbc640b..37e2707ea 100644 --- a/chatsky/utils/devel/async_helpers.py +++ b/chatsky/utils/devel/async_helpers.py @@ -11,14 +11,15 @@ async def wrap_sync_function_in_async(func: Callable, *args, **kwargs) -> Any: """ Utility function, that wraps both functions and coroutines in coroutines. - Invokes `func` if it is just a callable and awaits, if this is a coroutine. + Invokes `func` if it is just a callable and awaits, if it is a coroutine. :param func: Callable to wrap. :param \\*args: Function args. :param \\**kwargs: Function kwargs. :return: What function returns. """ - if asyncio.iscoroutinefunction(func): - return await func(*args, **kwargs) + result = func(*args, **kwargs) + if asyncio.iscoroutine(result): + return await result else: - return func(*args, **kwargs) + return result diff --git a/docs/source/conf.py b/docs/source/conf.py index 0edee636a..871afed34 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -171,7 +171,7 @@ def setup(_): ("web_api_interface", "Web API"), ], ), - ("tutorials.pipeline", "Pipeline"), + ("tutorials.service", "Service"), ( "tutorials.script", "Script", diff --git a/docs/source/tutorials.rst b/docs/source/tutorials.rst index e4199a5d0..ad6783ed7 100644 --- a/docs/source/tutorials.rst +++ b/docs/source/tutorials.rst @@ -7,12 +7,14 @@ Each tutorial includes detailed explanations and code examples. Tutorials cover of the framework and are organized into sections. The Context Storages section describes how to use context storages in Chatsky. -The Messengers section covers how to use the Telegram messenger with Chatsky. -The Pipeline section teaches the basics of the pipeline concept, how to use pre- and postprocessors, -asynchronous groups and services, custom messenger interfaces, and extra handlers and extensions. + +The Messengers section covers how to use the Telegram messenger with Chatsky and how to create web interface. + +The Service section teaches how to use Services: objects that execute +before or after the main part. + The Script section covers the basics of the script concept, including conditions, responses, transitions, and serialization. It also includes tutorials on pre-response and pre-transition processing. -Finally, the Utils section covers the cache and LRU cache utilities in Chatsky. The main difference between Tutorials and Examples is that Tutorials typically show how to implement a specific feature or solve a particular problem, whereas Examples provide a more @@ -21,7 +23,6 @@ comprehensive overview of how to build a complete application. | To understand the basics of Chatsky, read the following tutorials: | 1) Script / Core / 1. Basics | 2) Script / Core / 2. Conditions -| 3) Pipeline / 1. Basics .. toctree:: :name: tutorials diff --git a/tests/core/test_actor.py b/tests/core/test_actor.py index d3c6d1318..c6050e4b0 100644 --- a/tests/core/test_actor.py +++ b/tests/core/test_actor.py @@ -9,6 +9,7 @@ from chatsky.core.context import Context from chatsky.core.script import Script from chatsky.core import RESPONSE, TRANSITIONS, PRE_TRANSITION, PRE_RESPONSE +from chatsky.core.utils import initialize_service_states class TestRequestProcessing: @@ -32,8 +33,9 @@ async def test_normal_execution(self): fallback_label=AbsoluteNodeLabel(flow_name="flow", node_name="fallback"), start_label=("flow", "node1"), ) + initialize_service_states(ctx, actor) - await actor(ctx, ctx.framework_data.pipeline) + await actor(ctx) assert ctx.labels == { 0: AbsoluteNodeLabel(flow_name="flow", node_name="node1"), @@ -52,8 +54,9 @@ async def test_fallback_node(self): fallback_label=AbsoluteNodeLabel(flow_name="flow", node_name="fallback"), start_label=("flow", "node"), ) + initialize_service_states(ctx, actor) - await actor(ctx, ctx.framework_data.pipeline) + await actor(ctx) assert ctx.labels == { 0: AbsoluteNodeLabel(flow_name="flow", node_name="node"), @@ -90,8 +93,9 @@ async def test_default_priority(self, default_priority, result): default_priority=default_priority, start_label=("flow", "node1"), ) + initialize_service_states(ctx, actor) - await actor(ctx, ctx.framework_data.pipeline) + await actor(ctx) assert ctx.last_label.node_name == result async def test_transition_exception_handling(self, log_event_catcher): @@ -111,8 +115,9 @@ async def call(self, ctx: Context) -> None: fallback_label=AbsoluteNodeLabel(flow_name="flow", node_name="fallback"), start_label=("flow", "node"), ) + initialize_service_states(ctx, actor) - await actor(ctx, ctx.framework_data.pipeline) + await actor(ctx) assert ctx.last_label.node_name == "fallback" assert log_list[0].msg == "Exception occurred during transition processing." @@ -131,8 +136,9 @@ async def test_empty_response(self, log_event_catcher): fallback_label=AbsoluteNodeLabel(flow_name="flow", node_name="node"), start_label=("flow", "node"), ) + initialize_service_states(ctx, actor) - await actor(ctx, ctx.framework_data.pipeline) + await actor(ctx) assert ctx.responses == {1: Message()} assert log_list[-1].msg == "Node has empty response." @@ -154,8 +160,9 @@ async def call(self, ctx: Context) -> MessageInitTypes: fallback_label=AbsoluteNodeLabel(flow_name="flow", node_name="node"), start_label=("flow", "node"), ) + initialize_service_states(ctx, actor) - await actor(ctx, ctx.framework_data.pipeline) + await actor(ctx) assert ctx.responses == {1: Message()} assert log_list[-1].msg == "Response was not produced." @@ -177,8 +184,9 @@ async def call(self, ctx: Context) -> None: fallback_label=AbsoluteNodeLabel(flow_name="flow", node_name="node"), start_label=("flow", "node"), ) + initialize_service_states(ctx, actor) - await actor(ctx, ctx.framework_data.pipeline) + await actor(ctx) assert ctx.responses == {1: Message()} assert log_list[0].msg == "Exception occurred during response processing." diff --git a/tests/core/test_message.py b/tests/core/test_message.py index 64b2b0a86..6b8b7d15f 100644 --- a/tests/core/test_message.py +++ b/tests/core/test_message.py @@ -100,7 +100,7 @@ def test_field_serializable(self, random_original_message: UnserializableObject) validated = Message.model_validate_json(serialized) assert message == validated - @pytest.mark.asyncio + @pytest.mark.slow async def test_getting_attachment_bytes(self, tmp_path): local_path = self.clear_and_create_dir(tmp_path / "local") diff --git a/tests/core/test_script_function.py b/tests/core/test_script_function.py index a5e51b643..0d23126a1 100644 --- a/tests/core/test_script_function.py +++ b/tests/core/test_script_function.py @@ -48,7 +48,7 @@ async def call(self, ctx): assert isinstance(await MyProc().wrapped_call(None), RuntimeError) assert len(log_list) == 1 - assert log_list[0].levelname == "WARNING" + assert log_list[0].levelname == "ERROR" async def test_base_exception_not_handled(self): class SpecialException(BaseException): diff --git a/tests/messengers/telegram/test_tutorials.py b/tests/messengers/telegram/test_tutorials.py index 49da8dac9..05a3748ba 100644 --- a/tests/messengers/telegram/test_tutorials.py +++ b/tests/messengers/telegram/test_tutorials.py @@ -18,7 +18,11 @@ @pytest.mark.skipif(not telegram_available, reason="Telegram dependencies missing") @pytest.mark.parametrize( "tutorial_module_name", - ["1_basic", "2_attachments", "3_advanced"], + [ + "1_basic", + pytest.param("2_attachments", marks=[pytest.mark.slow]), + pytest.param("3_advanced", marks=[pytest.mark.slow]), + ], ) def test_tutorials(tutorial_module_name: str, monkeypatch): def patched_data_attachment_eq(self: DataAttachment, other: DataAttachment): diff --git a/tests/pipeline/test_service.py b/tests/pipeline/test_service.py new file mode 100644 index 000000000..463c0f166 --- /dev/null +++ b/tests/pipeline/test_service.py @@ -0,0 +1,242 @@ +import asyncio +from typing import Any + +import pytest + +from chatsky import Context, BaseProcessing, Pipeline, Message +from chatsky.conditions import ServiceFinished +from chatsky.core.service import ( + Service, + ServiceGroup, + ComponentExecutionState, + ExtraHandlerType, + ExtraHandlerRuntimeInfo, +) +from chatsky.core.service.extra import BeforeHandler +from chatsky.core.utils import initialize_service_states, finalize_service_group +from chatsky.utils.testing import TOY_SCRIPT +from .utils import run_test_group, make_test_service_group, run_extra_handler + + +@pytest.fixture +def empty_context(): + return Context.init(("", "")) + + +async def test_pipeline_component_order(empty_context): + logs = [] + + class MyProcessing(BaseProcessing): + wait: float + text: str + + async def call(self, ctx: Context): + await asyncio.sleep(self.wait) + logs.append(self.text) + + script = {"": {"": {"pre_response": {"": MyProcessing(wait=0.01, text="B")}}}} + pipeline = Pipeline( + script, + ("", ""), + pre_services=[MyProcessing(wait=0.02, text="A")], + post_services=[MyProcessing(wait=0, text="C")], + ) + initialize_service_states(empty_context, pipeline.services_pipeline) + await pipeline._run_pipeline(Message(""), empty_context.id) + assert logs == ["A", "B", "C"] + + +async def test_async_services(): + running_order = [] + test_group = make_test_service_group(running_order) + test_group.components[0].concurrent = True + test_group.components[1].concurrent = True + + await run_test_group(test_group) + assert running_order == ["A1", "B1", "A2", "B2", "A3", "B3", "C1", "C2", "C3"] + + +async def test_all_async_flag(): + running_order = [] + test_group = make_test_service_group(running_order) + test_group.fully_concurrent = True + + await run_test_group(test_group) + assert running_order == ["A1", "B1", "C1", "A2", "B2", "C2", "A3", "B3", "C3"] + + +async def test_extra_handler_timeouts(): + def bad_function(timeout: float, bad_func_completed: list): + def inner(_: Context, __: ExtraHandlerRuntimeInfo) -> None: + asyncio.run(asyncio.sleep(timeout)) + bad_func_completed.append(True) + + return inner + + # Timeout expires before the exception is raised, which is then logged. + test_list = [] + extra_handler = BeforeHandler(functions=bad_function(1.0, test_list), timeout=0.0, concurrent=True) + await run_extra_handler(extra_handler) + assert test_list == [] + + # This is here just to demonstrate that the timeout is working. + extra_handler = BeforeHandler(functions=bad_function(0.0, test_list), timeout=1.0, concurrent=True) + await run_extra_handler(extra_handler) + assert test_list == [True] + + +async def test_extra_handler_function_signatures(): + def one_parameter_func(_: Context) -> None: + pass + + def two_parameter_func(_: Context, __: ExtraHandlerRuntimeInfo) -> None: + pass + + def three_parameter_func(_: Context, __: ExtraHandlerRuntimeInfo, ___: Any) -> None: + pass + + def no_parameters_func() -> None: + pass + + assert await run_extra_handler(one_parameter_func) == ComponentExecutionState.FINISHED + assert await run_extra_handler(two_parameter_func) == ComponentExecutionState.FINISHED + + assert await run_extra_handler(three_parameter_func) == ComponentExecutionState.FAILED + assert await run_extra_handler(no_parameters_func) == ComponentExecutionState.FAILED + + +# Checking that async functions can be run as extra_handlers. +async def test_async_extra_handler_func(): + def append_list(record: list): + async def async_func(_: Context, __: ExtraHandlerRuntimeInfo): + record.append("Value") + + return async_func + + test_list = [] + extra_handler = BeforeHandler(functions=append_list(test_list), concurrent=True) + await run_extra_handler(extra_handler) + assert test_list == ["Value"] + + +def test_service_computed_names(): + def normal_func(_: Context) -> None: + pass + + service = Service(handler=normal_func) + assert service.computed_name == "normal_func" + + class MyService(Service): + async def call(self, ctx: Context): + pass + + service = MyService() + assert service.computed_name == "MyService" + + class MyProcessing(BaseProcessing): + async def call(self, ctx: Context): + pass + + func_class = MyProcessing() + service = Service(handler=func_class) + assert service.computed_name == "MyProcessing" + + +def test_rename_components(): + def service(): + pass + + def service_0(): + pass + + def service_1(): + pass + + def service_2(): + pass + + group = ServiceGroup( + components=[ + service, + service, + service_0, + service_1, + service_1, + service_2, + Service(handler=service, name="service_2"), + ] + ) + + finalize_service_group(group) + + assert [component.name for component in group.components] == [ + "service#0", + "service#1", + "service_0", + "service_1#0", + "service_1#1", + "service_2#0", + "service_2", + ] + + +def test_raise_on_name_collision(): + with pytest.raises(ValueError): + finalize_service_group(ServiceGroup(components=[Service(name="service"), Service(name="service")])) + + +# 'fully_concurrent' flag will try to run all services simultaneously, but the 'wait' option +# makes it so that A waits for B, which waits for C. So "C" is first, "A" is last. +async def test_waiting_for_service_to_finish_condition(): + running_order = [] + test_group = make_test_service_group(running_order) + test_group.fully_concurrent = True + test_group.components[0].start_condition = ServiceFinished(".pre.InteractWithServiceB", wait=True) + test_group.components[1].start_condition = ServiceFinished(".pre.InteractWithServiceC", wait=True) + + await run_test_group(test_group) + assert running_order == ["C1", "C2", "C3", "B1", "B2", "B3", "A1", "A2", "A3"] + + +async def test_bad_service(): + def bad_service_func(_: Context) -> None: + raise Exception("Custom exception") + + test_group = ServiceGroup.model_validate([bad_service_func]) + assert await run_test_group(test_group) == ComponentExecutionState.FAILED + + +async def test_service_not_run(empty_context): + service = Service(handler=lambda ctx: None, start_condition=False) + initialize_service_states(empty_context, service) + await service(empty_context) + assert service.get_state(empty_context) == ComponentExecutionState.NOT_RUN + + +async def test_inherited_extra_handlers_for_service_groups_with_conditions(): + def extra_handler_func(counter: list): + def inner(_: Context) -> None: + counter.append("Value") + + return inner + + def condition_func(path: str): + if path == ".pre.InteractWithServiceA" or path == ".pre.service": + return True + return False + + counter_list = [] + test_group = make_test_service_group(list()) + + service = Service(handler=lambda _: None, name="service") + test_group.components.append(service) + + ctx = Context.init(("greeting_flow", "start_node")) + pipeline = Pipeline(pre_services=test_group, script=TOY_SCRIPT, start_label=("greeting_flow", "start_node")) + + test_group.add_extra_handler(ExtraHandlerType.BEFORE, extra_handler_func(counter_list), condition_func) + initialize_service_states(ctx, test_group) + + await pipeline.pre_services(ctx) + # One for original ServiceGroup, one for each of the defined paths in the condition function. + assert counter_list == ["Value"] * 3 diff --git a/tests/pipeline/test_validation.py b/tests/pipeline/test_validation.py index 903d24d3f..856bf2158 100644 --- a/tests/pipeline/test_validation.py +++ b/tests/pipeline/test_validation.py @@ -1,3 +1,4 @@ +import asyncio from typing import Callable from pydantic import ValidationError @@ -6,7 +7,6 @@ from chatsky.core.service import ( Service, ServiceGroup, - ServiceRuntimeInfo, BeforeHandler, PipelineComponent, ) @@ -24,35 +24,23 @@ class UserFunctionSamples: def correct_service_function_1(_: Context): pass - @staticmethod - def correct_service_function_2(_: Context, __: Pipeline): - pass - - @staticmethod - def correct_service_function_3(_: Context, __: Pipeline, ___: ServiceRuntimeInfo): - pass - # Could make a test for returning an awaitable from a ServiceFunction, ExtraHandlerFunction class TestServiceValidation: def test_model_validator(self): with pytest.raises(ValidationError): # Can't pass a list to handler, it has to be a single function - Service(handler=[UserFunctionSamples.correct_service_function_2]) - with pytest.raises(ValidationError): + Service(handler=[UserFunctionSamples.correct_service_function_1]) + with pytest.raises(NotImplementedError): # Can't pass 'None' to handler, it has to be a callable function # Though I wonder if empty Services should be allowed. # I see no reason to allow it. - Service() + service = Service() + asyncio.run(service.call(Context())) with pytest.raises(TypeError): # Python says that two positional arguments were given when only one was expected. # This happens before Pydantic's validation, so I think there's nothing we can do. Service(UserFunctionSamples.correct_service_function_1) - with pytest.raises(ValidationError): - # Can't pass 'None' to handler, it has to be a callable function - # Though I wonder if empty Services should be allowed. - # I see no reason to allow it. - Service(handler=Service()) # But it can work like this. # A single function gets cast to the right dictionary here. Service.model_validate(UserFunctionSamples.correct_service_function_1) @@ -60,7 +48,7 @@ def test_model_validator(self): class TestExtraHandlerValidation: def test_correct_functions(self): - funcs = [UserFunctionSamples.correct_service_function_1, UserFunctionSamples.correct_service_function_2] + funcs = [UserFunctionSamples.correct_service_function_1, UserFunctionSamples.correct_service_function_1] handler = BeforeHandler(functions=funcs) assert handler.functions == funcs @@ -85,22 +73,22 @@ def test_wrong_inputs(self): BeforeHandler.model_validate([1, 2, 3]) -# Note: I haven't tested components being asynchronous in any way, +# Note: I haven't tested components being concurrent in any way, # other than in the async pipeline components tutorial. # It's not a test though. class TestServiceGroupValidation: def test_single_service(self): - func = UserFunctionSamples.correct_service_function_2 - group = ServiceGroup(components=Service(handler=func, after_handler=func)) + func = UserFunctionSamples.correct_service_function_1 + group = ServiceGroup(components=[Service(handler=func, after_handler=func)]) assert group.components[0].handler == func assert group.components[0].after_handler.functions[0] == func # Same, but with model_validate - group = ServiceGroup.model_validate(Service(handler=func, after_handler=func)) + group = ServiceGroup.model_validate([Service(handler=func, after_handler=func)]) assert group.components[0].handler == func assert group.components[0].after_handler.functions[0] == func def test_several_correct_services(self): - func = UserFunctionSamples.correct_service_function_2 + func = UserFunctionSamples.correct_service_function_1 services = [Service.model_validate(func), Service(handler=func, timeout=10)] group = ServiceGroup(components=services, timeout=15) assert group.components == services @@ -113,10 +101,6 @@ def test_wrong_inputs(self): # 'components' must be a list of PipelineComponents, wrong type # Though 123 will be cast to a list ServiceGroup(components=123) - with pytest.raises(ValidationError): - # The dictionary inside 'components' will check if Service or ServiceGroup fit the signature, - # but it doesn't fit any of them (required fields are not defined), so it's just a normal dictionary. - ServiceGroup(components={"before_handler": []}) with pytest.raises(ValidationError): # The dictionary inside 'components' will try to get cast to Service and will fail. # 'components' must be a list of PipelineComponents, but it's just a normal dictionary (not a Service). diff --git a/tests/pipeline/utils.py b/tests/pipeline/utils.py new file mode 100644 index 000000000..70246d826 --- /dev/null +++ b/tests/pipeline/utils.py @@ -0,0 +1,64 @@ +import asyncio + +from chatsky.core import Context, Pipeline +from chatsky.core.service import ServiceGroup, Service, ComponentExecutionState +from chatsky.core.service.extra import ComponentExtraHandler +from chatsky.core.utils import initialize_service_states + +from chatsky.utils.testing import TOY_SCRIPT + + +def make_test_service_group(running_order: list) -> ServiceGroup: + + def interact(stage: str, run_order: list): + async def slow_service(_: Context): + run_order.append(stage) + await asyncio.sleep(0) + + return slow_service + + test_group = ServiceGroup( + components=[ + ServiceGroup( + name="InteractWithServiceA", + components=[ + interact("A1", running_order), + interact("A2", running_order), + interact("A3", running_order), + ], + ), + ServiceGroup( + name="InteractWithServiceB", + components=[ + interact("B1", running_order), + interact("B2", running_order), + interact("B3", running_order), + ], + ), + ServiceGroup( + name="InteractWithServiceC", + components=[ + interact("C1", running_order), + interact("C2", running_order), + interact("C3", running_order), + ], + ), + ], + ) + return test_group + + +async def run_test_group(test_group: ServiceGroup) -> ComponentExecutionState: + ctx = Context.init(("greeting_flow", "start_node")) + pipeline = Pipeline(pre_services=test_group, script=TOY_SCRIPT, start_label=("greeting_flow", "start_node")) + initialize_service_states(ctx, pipeline.pre_services) + await pipeline.pre_services(ctx) + return test_group.get_state(ctx) + + +async def run_extra_handler(extra_handler: ComponentExtraHandler) -> ComponentExecutionState: + ctx = Context.init(("greeting_flow", "start_node")) + service = Service(handler=lambda _: None, before_handler=extra_handler) + initialize_service_states(ctx, service) + await service(ctx) + return service.get_state(ctx) diff --git a/tests/stats/test_defaults.py b/tests/stats/test_defaults.py index 062481bc7..331a21e42 100644 --- a/tests/stats/test_defaults.py +++ b/tests/stats/test_defaults.py @@ -2,8 +2,9 @@ import pytest -from chatsky.core import Context, Pipeline -from chatsky.core.service.types import ExtraHandlerRuntimeInfo, ServiceRuntimeInfo +from chatsky.core import Context +from chatsky.core.service import Service +from chatsky.core.service.types import ExtraHandlerRuntimeInfo try: from chatsky.stats import default_extractors @@ -13,15 +14,11 @@ async def test_get_current_label(): context = Context.init(("a", "b")) - pipeline = Pipeline(script={"greeting_flow": {"start_node": {}}}, start_label=("greeting_flow", "start_node")) runtime_info = ExtraHandlerRuntimeInfo( - func=lambda x: x, stage="BEFORE", - component=ServiceRuntimeInfo( - path=".", name=".", timeout=None, asynchronous=False, execution_state={".": "FINISHED"} - ), + component=Service(handler=lambda ctx: None, path="-", name="-", timeout=None, concurrent=False), ) - result = await default_extractors.get_current_label(context, pipeline, runtime_info) + result = await default_extractors.get_current_label(context, runtime_info) assert result == {"flow": "a", "node": "b", "label": "a: b"} @@ -32,13 +29,10 @@ async def test_otlp_integration(tracer_exporter_and_provider, log_exporter_and_p tutorial_module.chatsky_instrumentor.uninstrument() tutorial_module.chatsky_instrumentor.instrument(logger_provider=logger_provider, tracer_provider=tracer_provider) runtime_info = ExtraHandlerRuntimeInfo( - func=lambda x: x, stage="BEFORE", - component=ServiceRuntimeInfo( - path=".", name=".", timeout=None, asynchronous=False, execution_state={".": "FINISHED"} - ), + component=Service(handler=lambda ctx: None, path="-", name="-", timeout=None, concurrent=False), ) - _ = await default_extractors.get_current_label(Context.init(("a", "b")), tutorial_module.pipeline, runtime_info) + _ = await default_extractors.get_current_label(Context.init(("a", "b")), runtime_info) tracer_provider.force_flush() logger_provider.force_flush() assert len(log_exporter.get_finished_logs()) > 0 diff --git a/tests/stats/test_instrumentation.py b/tests/stats/test_instrumentation.py index 856d153fb..1b2418179 100644 --- a/tests/stats/test_instrumentation.py +++ b/tests/stats/test_instrumentation.py @@ -1,7 +1,12 @@ import pytest +from chatsky import Context +from chatsky.core.service import Service, ExtraHandlerRuntimeInfo, ComponentExecutionState, ServiceGroup +from tests.pipeline.utils import run_test_group + try: from chatsky.stats import default_extractors + from chatsky.stats.instrumentor import logger as instrumentor_logger from chatsky.stats import OtelInstrumentor from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk._logs import LoggerProvider @@ -36,3 +41,20 @@ def test_keyword_arguments(): assert instrumentor._meter_provider is not get_meter_provider() assert instrumentor._logger_provider is not get_logger_provider() assert instrumentor._tracer_provider is not get_tracer_provider() + + +async def test_failed_stats_collection(log_event_catcher): + chatsky_instrumentor = OtelInstrumentor.from_url("grpc://localhost:4317") + chatsky_instrumentor.instrument() + + @chatsky_instrumentor + async def bad_stats_collector(_: Context, __: ExtraHandlerRuntimeInfo): + raise Exception + + service = Service(handler=lambda _: None, before_handler=bad_stats_collector) + + log_list = log_event_catcher(logger=instrumentor_logger, level="ERROR") + + assert await run_test_group(ServiceGroup(components=[service])) == ComponentExecutionState.FINISHED + + assert len(log_list) == 1 diff --git a/tests/stats/test_tutorials.py b/tests/stats/test_tutorials.py index e6e5d46cd..a747c7c80 100644 --- a/tests/stats/test_tutorials.py +++ b/tests/stats/test_tutorials.py @@ -70,6 +70,7 @@ async def test_tutorials_ch(tutorial_module_name: str, expected_logs, otlp_log_e ("2_pipeline_integration", 35), ], ) +@pytest.mark.slow async def test_tutorials_memory( tutorial_module_name: str, expected_logs, tracer_exporter_and_provider, log_exporter_and_provider ): diff --git a/tutorials/pipeline/1_basics.py b/tutorials/pipeline/1_basics.py deleted file mode 100644 index 2c355230f..000000000 --- a/tutorials/pipeline/1_basics.py +++ /dev/null @@ -1,82 +0,0 @@ -# %% [markdown] -""" -# 1. Basics - -The following tutorial shows basic usage of `pipeline` -module as an extension to `chatsky.script.core`. - -Here, `__call__` (same as -%mddoclink(api,core.pipeline,Pipeline.run)) -method is used to execute pipeline once. -""" - -# %pip install chatsky - -# %% -from chatsky import Pipeline - -from chatsky.utils.testing import ( - check_happy_path, - is_interactive_mode, - HAPPY_PATH, - TOY_SCRIPT, - TOY_SCRIPT_KWARGS, -) - - -# %% [markdown] -""" -`Pipeline` is an object, that automates script execution and context management. -It's constructor method can be used to create -a pipeline of the most basic structure: -"pre-services -> actor -> post-services" -as well as to define `context_storage` and `messenger_interface`. -Actor is a component of %mddoclink(api,core.pipeline,Pipeline), -that contains the %mddoclink(api,core.script,Script) and handles it. -It is responsible for processing user input and -determining the appropriate response based on the -current state of the conversation and the script. -These parameters usage will be shown in tutorials 2, 3 and 6. - -Here only required parameters are provided to pipeline. -`context_storage` will default to simple Python dict and -`messenger_interface` will never be used. -pre- and post-services lists are empty. -`Pipeline` object can be called with user input -as first argument and dialog id (any immutable object). -This call will return `Context`, -its `last_response` property will be actors response. -""" - -# %% -pipeline = Pipeline( - script=TOY_SCRIPT, - # Pipeline script object, defined in `chatsky.utils.testing.toy_script` - start_label=("greeting_flow", "start_node"), - fallback_label=("greeting_flow", "fallback_node"), -) - - -# %% [markdown] -""" -For the sake of brevity, other tutorials -might use `TOY_SCRIPT_KWARGS` (keyword arguments) to initialize pipeline: -""" - -# %% -assert TOY_SCRIPT_KWARGS == { - "script": TOY_SCRIPT, - "start_label": ("greeting_flow", "start_node"), - "fallback_label": ("greeting_flow", "fallback_node"), -} - - -# %% -if __name__ == "__main__": - check_happy_path(pipeline, HAPPY_PATH, printout=True) - # a function for automatic tutorial running (testing) with HAPPY_PATH - - # This runs tutorial in interactive mode if not in IPython env - # and if `DISABLE_INTERACTIVE_MODE` is not set - if is_interactive_mode(): - pipeline.run() diff --git a/tutorials/pipeline/2_pre_and_post_processors.py b/tutorials/pipeline/2_pre_and_post_processors.py deleted file mode 100644 index 7fda2ccaf..000000000 --- a/tutorials/pipeline/2_pre_and_post_processors.py +++ /dev/null @@ -1,93 +0,0 @@ -# %% [markdown] -""" -# 2. Pre- and postprocessors - -The following tutorial shows more advanced usage of `pipeline` -module as an extension to `chatsky.script.core`. - -Here, %mddoclink(api,core.context,Context.misc) -dictionary of context is used for storing additional data. -""" - -# %pip install chatsky - -# %% -import logging - -from chatsky.messengers.console import CLIMessengerInterface -from chatsky import Context, Message, Pipeline - -from chatsky.utils.testing import ( - check_happy_path, - is_interactive_mode, - HAPPY_PATH, - TOY_SCRIPT_KWARGS, -) - -logger = logging.getLogger(__name__) - - -# %% [markdown] -""" -When Pipeline is created, additional pre- -and post-services can be defined. -These can be any callables, certain objects or dicts. -They are being turned into special `Service` or `ServiceGroup` objects -(see tutorial 3), -that will be run before or after `Actor` respectively. -These services can be used to access external APIs, annotate user input, etc. - -Service callable signature can be one of the following: -`[ctx]`, `[ctx, pipeline]` or `[ctx, actor, info]` (see tutorial 3), -where: - -* `ctx` - Context of the current dialog. -* `pipeline` - The current pipeline. -* `info` - dictionary, containing information about - current service and pipeline execution state (see tutorial 4). - -Here a preprocessor ("ping") and a postprocessor ("pong") are added to pipeline. -They share data in `context.misc` - -a common place for sharing data between services and actor. -""" - - -# %% -def ping_processor(ctx: Context): - ctx.misc["ping"] = True - - -def pong_processor(ctx: Context): - ping = ctx.misc.get("ping", False) - ctx.misc["pong"] = ping - - -# %% -pipeline = Pipeline( - **TOY_SCRIPT_KWARGS, - context_storage={}, # `context_storage` - a dictionary or - # a `DBContextStorage` instance, - # a place to store dialog contexts - messenger_interface=CLIMessengerInterface(), - # `messenger_interface` - a message channel adapter, - # it's not used in this tutorial - pre_services=[ping_processor], - post_services=[pong_processor], -) - - -if __name__ == "__main__": - check_happy_path(pipeline, HAPPY_PATH, printout=True) - if is_interactive_mode(): - ctx_id = 0 # 0 will be current dialog (context) identification. - while True: - message = Message(input("Send request: ")) - ctx: Context = pipeline(message, ctx_id) - print(f"Response: {ctx.last_response}") - ping_pong = ctx.misc.get("ping", False) and ctx.misc.get( - "pong", False - ) - print( - f"Ping-pong exchange: {'completed' if ping_pong else 'failed'}." - ) - logger.info(f"Context misc: {ctx.misc}") diff --git a/tutorials/pipeline/3_pipeline_dict_with_services_basic.py b/tutorials/pipeline/3_pipeline_dict_with_services_basic.py deleted file mode 100644 index 9d54da0fc..000000000 --- a/tutorials/pipeline/3_pipeline_dict_with_services_basic.py +++ /dev/null @@ -1,117 +0,0 @@ -# %% [markdown] -""" -# 3. Pipeline dict with services (basic) - -The following tutorial shows `pipeline` creation from -dict and most important pipeline components. - -Here, %mddoclink(api,core.service.service,Service) -class, that can be used for pre- and postprocessing of messages is shown. - -%mddoclink(api,core.pipeline,Pipeline)'s -constructor method is used for pipeline creation (directly or from dictionary). -""" - -# %pip install chatsky - -# %% -import logging - -from chatsky import Pipeline -from chatsky.core.service import Service - -from chatsky.utils.testing.common import ( - check_happy_path, - is_interactive_mode, -) -from chatsky.utils.testing.toy_script import HAPPY_PATH, TOY_SCRIPT - -logger = logging.getLogger(__name__) - - -# %% [markdown] -""" -When Pipeline is created using it's constructor method or -Pydantic's `model_validate` method, -`Pipeline` should be defined as a dictionary of a particular structure, -which must contain `script`, `start_label` and `fallback_label`, -see `Script` tutorials. - -Optional Pipeline parameters: -* `messenger_interface` - `MessengerInterface` instance, - is used to connect to channel and transfer IO to user. -* `context_storage` - Place to store dialog contexts - (dictionary or a `DBContextStorage` instance). -* `pre-services` - A `ServiceGroup` object, - basically a list of `Service` objects or more `ServiceGroup` objects, - see tutorial 4. -* `post-services` - A `ServiceGroup` object, - basically a list of `Service` objects or more `ServiceGroup` objects, - see tutorial 4. -* `before_handler` - a list of `ExtraHandlerFunction` objects or - a `ComponentExtraHandler` object. - See tutorials 6 and 7. -* `after_handler` - a list of `ExtraHandlerFunction` objects or - a `ComponentExtraHandler` object. - See tutorials 6 and 7. -* `timeout` - Pipeline timeout, see tutorial 5. - -On pipeline execution services from -`components` = 'pre-services' + actor + 'post-services' -list are run without difference between pre- and postprocessors. -`Service` object can be defined either with callable -(see tutorial 2) or with `Service` constructor / dict. -It must contain `handler` - a callable (function). - -Not only Pipeline can be run using `__call__` method, -for most cases `run` method should be used. -It starts pipeline asynchronously and connects to provided messenger interface. - -Here, the pipeline contains 3 services, -defined in 3 different ways with different signatures. -""" - - -# %% -def prepreprocess(_): - logger.info( - "preprocession intent-detection Service running (defined as a dict)" - ) - - -def preprocess(_): - logger.info( - "another preprocession web-based annotator Service " - "(defined as a callable)" - ) - - -def postprocess(_): - logger.info("postprocession Service (defined as an object)") - - -# %% -pipeline_dict = { - "script": TOY_SCRIPT, - "start_label": ("greeting_flow", "start_node"), - "fallback_label": ("greeting_flow", "fallback_node"), - "pre_services": [ - { - "handler": prepreprocess, - "name": "prepreprocessor", - }, - preprocess, - ], - "post_services": Service(handler=postprocess, name="postprocessor"), -} - -# %% -pipeline = Pipeline(**pipeline_dict) -# or -# pipeline = Pipeline.model_validate(pipeline_dict) - - -if __name__ == "__main__": - check_happy_path(pipeline, HAPPY_PATH, printout=True) - if is_interactive_mode(): - pipeline.run() diff --git a/tutorials/pipeline/3_pipeline_dict_with_services_full.py b/tutorials/pipeline/3_pipeline_dict_with_services_full.py deleted file mode 100644 index 697b9f12f..000000000 --- a/tutorials/pipeline/3_pipeline_dict_with_services_full.py +++ /dev/null @@ -1,167 +0,0 @@ -# %% [markdown] -""" -# 3. Pipeline dict with services (full) - -The following tutorial shows `pipeline` creation from dict -and most important pipeline components. - -This tutorial is a more advanced version of the -[previous tutorial]( -%doclink(tutorial,pipeline.3_pipeline_dict_with_services_basic) -). -""" - -# %pip install chatsky - -# %% -import json -import logging -import urllib.request - -from chatsky import Context, Pipeline -from chatsky.messengers.console import CLIMessengerInterface -from chatsky.core.service import Service, ServiceRuntimeInfo -from chatsky.utils.testing.common import ( - check_happy_path, - is_interactive_mode, -) - -from chatsky.utils.testing.toy_script import TOY_SCRIPT, HAPPY_PATH - -logger = logging.getLogger(__name__) - - -# %% [markdown] -""" -When Pipeline is created using Pydantic's `model_validate` method -or `Pipeline`'s constructor method, pipeline should be -defined as a dictionary of a particular structure: - -* `messenger_interface` - `MessengerInterface` instance, - is used to connect to channel and transfer IO to user. -* `context_storage` - Place to store dialog contexts - (dictionary or a `DBContextStorage` instance). -* `pre-services` - A `ServiceGroup` object, - basically a list of `Service` objects or more `ServiceGroup` objects, - see tutorial 4. -* `post-services` - A `ServiceGroup` object, - basically a list of `Service` objects or more `ServiceGroup` objects, - see tutorial 4. -* `before_handler` - a list of `ExtraHandlerFunction` objects or - a `ComponentExtraHandler` object. - See tutorials 6 and 7. -* `after_handler` - a list of `ExtraHandlerFunction` objects or - a `ComponentExtraHandler` object. - See tutorials 6 and 7. -* `timeout` - Pipeline timeout, see tutorial 5. -* `optimization_warnings` - Whether pipeline asynchronous structure - should be checked during initialization, - see tutorial 5. - -On pipeline execution services from -`components` = 'pre-services' + actor + 'post-services' -list are run without difference between pre- and postprocessors. -`Service` object can be defined either with callable -(see tutorial 2) or with dict of structure / `Service` object - with following constructor arguments: - - -* `handler` (required) - ServiceFunction. -* `before_handler` - a list of `ExtraHandlerFunction` objects or - a `ComponentExtraHandler` object. - See tutorials 6 and 7. -* `after_handler` - a list of `ExtraHandlerFunction` objects or - a `ComponentExtraHandler` object. - See tutorials 6 and 7. -* `timeout` - service timeout, see tutorial 5. -* `asynchronous` - whether or not this service _should_ be asynchronous - (keep in mind that not all services _can_ be asynchronous), - see tutorial 5. -* `start_condition` - service start condition, see tutorial 4. -* `name` - custom defined name for the service - (keep in mind that names in one ServiceGroup should be unique), - see tutorial 4. - -Not only Pipeline can be run using `__call__` method, -for most cases `run` method should be used. -It starts pipeline asynchronously and connects to provided messenger interface. - -Here pipeline contains 3 services, -defined in 3 different ways with different signatures. -First two of them write sample feature detection data to `ctx.misc`. -The first uses a constant expression and the second fetches from `example.com`. -Final service logs `ctx.misc` dict. -""" - - -# %% -def prepreprocess(ctx: Context): - logger.info( - "preprocession intent-detection Service running (defined as a dict)" - ) - ctx.misc["preprocess_detection"] = { - ctx.last_request.text: "some_intent" - } # Similar syntax can be used to access - # service output dedicated to current pipeline run - - -def preprocess(ctx: Context, _, info: ServiceRuntimeInfo): - logger.info( - f"another preprocession web-based annotator Service" - f"(defined as a callable), named '{info.name}'" - ) - with urllib.request.urlopen("https://example.com/") as webpage: - web_content = webpage.read().decode( - webpage.headers.get_content_charset() - ) - ctx.misc["another_detection"] = { - ctx.last_request.text: ( - "online" if "Example Domain" in web_content else "offline" - ) - } - - -def postprocess(ctx: Context, pl: Pipeline): - logger.info("postprocession Service (defined as an object)") - logger.info( - f"resulting misc looks like:" - f"{json.dumps(ctx.misc, indent=4, default=str)}" - ) - received_response = pl.script.get_inherited_node(pl.fallback_label).response - responses_match = received_response == ctx.last_response - logger.info(f"actor is{'' if responses_match else ' not'} in fallback node") - - -# %% -pipeline_dict = { - "script": TOY_SCRIPT, - "start_label": ("greeting_flow", "start_node"), - "fallback_label": ("greeting_flow", "fallback_node"), - "messenger_interface": CLIMessengerInterface( - intro="Hi, this is a brand new Pipeline running!", - prompt_request="Request: ", - prompt_response="Response: ", - ), # `CLIMessengerInterface` has the following constructor parameters: - # `intro` - a string that will be displayed - # on connection to interface (on `pipeline.run`) - # `prompt_request` - a string that will be displayed before user input - # `prompt_response` - an output prefix string - "context_storage": {}, - "pre_services": [ - { - "handler": prepreprocess, - "name": "preprocessor", - }, - preprocess, - ], - "post_services": Service(handler=postprocess, name="postprocessor"), -} - - -# %% -pipeline = Pipeline.model_validate(pipeline_dict) - -if __name__ == "__main__": - check_happy_path(pipeline, HAPPY_PATH, printout=True) - if is_interactive_mode(): - pipeline.run() diff --git a/tutorials/pipeline/4_groups_and_conditions_basic.py b/tutorials/pipeline/4_groups_and_conditions_basic.py deleted file mode 100644 index a35562e22..000000000 --- a/tutorials/pipeline/4_groups_and_conditions_basic.py +++ /dev/null @@ -1,123 +0,0 @@ -# %% [markdown] -""" -# 4. Groups and conditions (basic) - -The following example shows `pipeline` service group usage and start conditions. - -Here, %mddoclink(api,core.service.service,Service)s -and %mddoclink(api,core.service.group,ServiceGroup)s -are shown for advanced data pre- and postprocessing based on conditions. -""" - -# %pip install chatsky - -# %% -import json -import logging - -from chatsky.core.service import ( - Service, - not_condition, - service_successful_condition, - ServiceRuntimeInfo, -) -from chatsky import Pipeline - -from chatsky.utils.testing.common import ( - check_happy_path, - is_interactive_mode, -) -from chatsky.utils.testing.toy_script import HAPPY_PATH, TOY_SCRIPT - -logger = logging.getLogger(__name__) - - -# %% [markdown] -""" -Pipeline can contain not only single services, but also service groups. -Service groups can be defined as `ServiceGroup` objects: - lists of `Service` or more `ServiceGroup` objects. -`ServiceGroup` objects should contain `components` - -a list of `Service` and `ServiceGroup` objects. - -To receive serialized information about service, - service group or pipeline a property `info_dict` can be used, - it returns important object properties as a dict. - -Services and service groups can be executed conditionally. -Conditions are functions passed to `start_condition` argument. -These functions should have following signature: - - (ctx: Context, pipeline: Pipeline) -> bool. - -Service is only executed if its start_condition returned `True`. -By default all the services start unconditionally. -There are number of built-in condition functions. -Built-in condition functions check other service states. -These are most important built-in condition functions: - -* `always_start_condition` - Default condition function, always starts service. -* `service_successful_condition(path)` - Function that checks, - whether service with given `path` executed successfully. -* `not_condition(function)` - Function that returns result - opposite from the one returned - by the `function` (condition function) argument. - -Here there is a conditionally executed service named -`never_running_service` is always executed. -It is executed only if `always_running_service` -is not finished, that should never happen. -The service named `context_printing_service` -prints pipeline runtime information, -that contains execution state of all previously run services. -""" - - -# %% -def always_running_service(_, __, info: ServiceRuntimeInfo): - logger.info(f"Service '{info.name}' is running...") - - -def never_running_service(_, __, info: ServiceRuntimeInfo): - raise Exception(f"Oh no! The '{info.name}' service is running!") - - -def runtime_info_printing_service(_, __, info: ServiceRuntimeInfo): - logger.info( - f"Service '{info.name}' runtime execution info:" - f"{json.dumps(info, indent=4, default=str)}" - ) - - -# %% -pipeline_dict = { - "script": TOY_SCRIPT, - "start_label": ("greeting_flow", "start_node"), - "fallback_label": ("greeting_flow", "fallback_node"), - "pre_services": Service( - handler=always_running_service, name="always_running_service" - ), - "post_services": [ - Service( - handler=never_running_service, - start_condition=not_condition( - service_successful_condition( - ".pipeline.pre.always_running_service" - ) # pre services belong to the "pre" group; post -- to "post" - ), - ), - Service( - handler=runtime_info_printing_service, - name="runtime_info_printing_service", - ), - ], -} - - -# %% -pipeline = Pipeline.model_validate(pipeline_dict) - -if __name__ == "__main__": - check_happy_path(pipeline, HAPPY_PATH, printout=True) - if is_interactive_mode(): - pipeline.run() diff --git a/tutorials/pipeline/4_groups_and_conditions_full.py b/tutorials/pipeline/4_groups_and_conditions_full.py deleted file mode 100644 index 890231717..000000000 --- a/tutorials/pipeline/4_groups_and_conditions_full.py +++ /dev/null @@ -1,223 +0,0 @@ -# %% [markdown] -""" -# 4. Groups and conditions (full) - -The following tutorial shows `pipeline` -service group usage and start conditions. - -This tutorial is a more advanced version of the -[previous tutorial](%doclink(tutorial,pipeline.4_groups_and_conditions_basic)). -""" - -# %pip install chatsky - -# %% -import logging - -from chatsky.core.service import ( - Service, - ServiceGroup, - not_condition, - service_successful_condition, - all_condition, - ServiceRuntimeInfo, -) -from chatsky import Pipeline - -from chatsky.utils.testing.common import ( - check_happy_path, - is_interactive_mode, -) -from chatsky.utils.testing.toy_script import HAPPY_PATH, TOY_SCRIPT - -logger = logging.getLogger(__name__) - -# %% [markdown] -""" -Pipeline can contain not only single services, but also service groups. -Service groups can be defined as `ServiceGroup` objects: - lists of `Service` or more `ServiceGroup` objects. -`ServiceGroup` objects should contain `components` - -a list of `Service` and `ServiceGroup` objects. - -Pipeline can contain not only single services, but also service groups. -Service groups can be defined as lists of `Service` - or more `ServiceGroup` objects. - (in fact, all of the pipeline services are combined - into root service group named "pipeline"). -Alternatively, the groups can be defined as objects - with following constructor arguments: - -* `components` (required) - A list of `Service` objects, - `ServiceGroup` objects. -* `before_handler` - a list of `ExtraHandlerFunction` objects or - a `ComponentExtraHandler` object. - See tutorials 6 and 7. -* `after_handler` - a list of `ExtraHandlerFunction` objects or - a `ComponentExtraHandler` object. - See tutorials 6 and 7. -* `timeout` - Pipeline timeout, see tutorial 5. -* `asynchronous` - Whether or not this service group _should_ be asynchronous - (keep in mind that not all service groups _can_ be asynchronous), - see tutorial 5. -* `start_condition` - Service group start condition. -* `name` - Custom defined name for the service group - (keep in mind that names in one ServiceGroup should be unique). - -Service (and service group) object fields -are mostly the same as constructor parameters, -however there are some differences: - -* `requested_async_flag` - Contains the value received - from `asynchronous` constructor parameter. -* `calculated_async_flag` - Contains automatically calculated - possibility of the service to be asynchronous. -* `asynchronous` - Combination af `..._async_flag` fields, - requested value overrides calculated (if not `None`), - see tutorial 5. -* `path` - Contains globally unique (for pipeline) - path to the service or service group. - -If no name is specified for a service or service group, - the name will be generated according to the following rules: - -1. If service's handler is callable, - service will be named callable. -2. Service group will be named 'service_group'. -3. Otherwise, it will be named 'noname_service'. -4. After that an index will be added to service name. - -To receive serialized information about service, service group -or pipeline a property `info_dict` can be used, -it returns important object properties as a dict. -In addition to that `pretty_format` method of Pipeline -can be used to get all pipeline properties as a formatted string -(e.g. for logging or debugging purposes). - -Services and service groups can be executed conditionally. -Conditions are functions passed to `start_condition` argument. -These functions should have following signature: - - (ctx: Context, pipeline: Pipeline) -> bool. - -Service is only executed if its start_condition returned `True`. -By default all the services start unconditionally. -There are number of built-in condition functions as well -as possibility to create custom ones. -Custom condition functions can rely on data in `ctx.misc` -as well as on any external data source. -Built-in condition functions check other service states. -All of the services store their execution status in context, - this status can be one of the following: - -* `NOT_RUN` - Service hasn't bee executed yet. -* `RUNNING` - Service is currently being executed - (important for asynchronous services). -* `FINISHED` - Service finished successfully. -* `FAILED` - Service execution failed (that also throws an exception). - -There are following built-in condition functions: - -* `always_start_condition` - Default condition function, - always starts service. -* `service_successful_condition(path)` - - Function that checks, whether service - with given `path` executed successfully (is `FINISHED`). -* `not_condition(function)` - - Function that returns result opposite - from the one returned by - the `function` (condition function) argument. -* `aggregate_condition(aggregator, *functions)` - - Function that aggregated results of - numerous `functions` (condition functions) - using special `aggregator` function. -* `all_condition(*functions)` - - Function that returns True only if all - of the given `functions` - (condition functions) return `True`. -* `any_condition(*functions)` - - Function that returns `True` - if any of the given `functions` - (condition functions) return `True`. - -Here there are two conditionally executed services: -a service named `running_service` is executed - only if both `simple_services` in `service_group_0` - are finished successfully. -`never_running_service` is executed only if `running_service` is not finished, -this should never happen. -`context_printing_service` prints pipeline runtime information, - that contains execution state of all previously run services. -""" - - -# %% -def simple_service(_, __, info: ServiceRuntimeInfo): - logger.info(f"Service '{info.name}' is running...") - - -def never_running_service(_, __, info: ServiceRuntimeInfo): - raise Exception(f"Oh no! The '{info.name}' service is running!") - - -def runtime_info_printing_service(_, __, info: ServiceRuntimeInfo): - logger.info( - f"Service '{info.name}' runtime execution info:" - f"{info.model_dump_json(indent=4)}" - ) - - -# %% -pipeline_dict = { - "script": TOY_SCRIPT, - "start_label": ("greeting_flow", "start_node"), - "fallback_label": ("greeting_flow", "fallback_node"), - "pre_services": [ - simple_service, # This simple service - # will be named `simple_service_0` - simple_service, # This simple service - # will be named `simple_service_1` - ], # Despite this is the unnamed service group in the root - # service group, it will be named `pre` as it holds pre services - "post_services": [ - ServiceGroup( - name="named_group", - components=[ - Service( - handler=simple_service, - start_condition=all_condition( - service_successful_condition( - ".pipeline.pre.simple_service_0" - ), - service_successful_condition( - ".pipeline.pre.simple_service_1" - ), - ), # Alternative: - # service_successful_condition(".pipeline.pre") - name="running_service", - ), # This simple service will be named `running_service`, - # because its name is manually overridden - Service( - handler=never_running_service, - start_condition=not_condition( - service_successful_condition( - ".pipeline.post.named_group.running_service" - ) - ), - ), - ], - requested_async_flag=False, # forbid services from running in async - ), - runtime_info_printing_service, - ], -} - -# %% -pipeline = Pipeline.model_validate(pipeline_dict) - -if __name__ == "__main__": - logging.basicConfig(level=logging.INFO) - - check_happy_path(pipeline, HAPPY_PATH, printout=True) - if is_interactive_mode(): - pipeline.run() diff --git a/tutorials/pipeline/5_asynchronous_groups_and_services_basic.py b/tutorials/pipeline/5_asynchronous_groups_and_services_basic.py deleted file mode 100644 index 1af92e6f6..000000000 --- a/tutorials/pipeline/5_asynchronous_groups_and_services_basic.py +++ /dev/null @@ -1,61 +0,0 @@ -# %% [markdown] -""" -# 5. Asynchronous groups and services (basic) - -The following tutorial shows `pipeline` asynchronous -service and service group usage. - -Here, %mddoclink(api,core.service.group,ServiceGroup)s -are shown for advanced and asynchronous data pre- and postprocessing. -""" - -# %pip install chatsky - -# %% -import asyncio - -from chatsky import Pipeline - -from chatsky.utils.testing.common import ( - is_interactive_mode, - check_happy_path, -) -from chatsky.utils.testing.toy_script import HAPPY_PATH, TOY_SCRIPT - -# %% [markdown] -""" -Services and service groups can be synchronous and asynchronous. -In synchronous service groups services are executed consequently. -In asynchronous service groups all services are executed simultaneously. - -Service can be asynchronous if its handler is an async function. -Service group can be asynchronous if all services -and service groups inside it are asynchronous. - -Here there is an asynchronous service group, that contains 10 services, -each of them should sleep for 0.01 of a second. -However, as the group is asynchronous, -it is being executed for 0.01 of a second in total. -Service group can be synchronous or asynchronous. -""" - - -# %% -async def time_consuming_service(_): - await asyncio.sleep(0.01) - - -pipeline_dict = { - "script": TOY_SCRIPT, - "start_label": ("greeting_flow", "start_node"), - "fallback_label": ("greeting_flow", "fallback_node"), - "pre_services": [time_consuming_service for _ in range(0, 10)], -} - -# %% -pipeline = Pipeline.model_validate(pipeline_dict) - -if __name__ == "__main__": - check_happy_path(pipeline, HAPPY_PATH, printout=True) - if is_interactive_mode(): - pipeline.run() diff --git a/tutorials/pipeline/5_asynchronous_groups_and_services_full.py b/tutorials/pipeline/5_asynchronous_groups_and_services_full.py deleted file mode 100644 index aebe371d4..000000000 --- a/tutorials/pipeline/5_asynchronous_groups_and_services_full.py +++ /dev/null @@ -1,151 +0,0 @@ -# %% [markdown] -""" -# 5. Asynchronous groups and services (full) - -The following tutorial shows `pipeline` -asynchronous service and service group usage. - -This tutorial is a more advanced version of the -[previous tutorial]( -%doclink(tutorial,pipeline.5_asynchronous_groups_and_services_basic) -). -""" - -# %pip install chatsky - -# %% -import asyncio -import json -import logging -import urllib.request - -from chatsky.core.service import ServiceGroup, ServiceRuntimeInfo -from chatsky import Context, Pipeline -from chatsky.utils.testing.common import ( - check_happy_path, - is_interactive_mode, -) -from chatsky.utils.testing.toy_script import HAPPY_PATH, TOY_SCRIPT - -logger = logging.getLogger(__name__) - -# %% [markdown] -""" -Services and service groups can be synchronous and asynchronous. -In synchronous service groups services are executed consequently, - some of them can even return `Context` object, - modifying it. -In asynchronous service groups all services - are executed simultaneously and should not return anything, - neither modify Context. - -To become asynchronous service or service group - should _be able_ to be asynchronous - and should not be marked synchronous. -Service can be asynchronous if its handler is an async function. -Service group can be asynchronous if all services -and service groups inside it are asynchronous. -If service or service group can be asynchronous -the `asynchronous` constructor parameter is checked. -If the parameter is not set, -the service becomes asynchronous, and if set, it is used instead. -If service can not be asynchronous, -but is marked asynchronous, an exception is thrown. - -The timeout field only works for asynchronous services and service groups. -If service execution takes more time than timeout, -it is aborted and marked as failed. - -Pipeline `optimization_warnings` argument can be used to - display optimization warnings during pipeline construction. -Generally for optimization purposes asynchronous - services should be combined into asynchronous - groups to run simultaneously. -Synchronous services should be expelled from (mostly) asynchronous groups. - -Here service group `balanced_group` can be asynchronous, - however it is requested to be synchronous, - so its services are executed consequently. -Service group `service_group_0` is asynchronous, - it doesn't run out of timeout of 0.02 seconds, - however contains 6 time consuming services, - each of them sleeps for 0.01 of a second. -Service group `service_group_1` is also asynchronous, -it logs HTTPS requests (from 1 to 15), - running simultaneously, in random order. -Service group `pipeline` can't be asynchronous because -`balanced_group` and `Actor` are synchronous. -(`Actor` is added into `Pipeline`'s 'components' during it's creation) -""" - - -# %% -async def simple_asynchronous_service(_, __, info: ServiceRuntimeInfo): - logger.info(f"Service '{info.name}' is running") - - -async def time_consuming_service(_): - await asyncio.sleep(0.01) - - -def meta_web_querying_service( - photo_number: int, -): # This function returns services, a service factory - async def web_querying_service(ctx: Context, _, info: ServiceRuntimeInfo): - if ctx.misc.get("web_query", None) is None: - ctx.misc["web_query"] = {} - with urllib.request.urlopen( - f"https://jsonplaceholder.typicode.com/photos/{photo_number}" - ) as webpage: - web_content = webpage.read().decode( - webpage.headers.get_content_charset() - ) - ctx.misc["web_query"].update( - { - f"{ctx.last_request}" - f":photo_number_{photo_number}": json.loads(web_content)[ - "title" - ] - } - ) - logger.info(f"Service '{info.name}' has completed HTTPS request") - - return web_querying_service - - -def context_printing_service(ctx: Context): - logger.info(f"Context misc: {json.dumps(ctx.misc, indent=4, default=str)}") - - -# %% -pipeline_dict = { - "script": TOY_SCRIPT, - "start_label": ("greeting_flow", "start_node"), - "fallback_label": ("greeting_flow", "fallback_node"), - "optimization_warnings": True, - # There are no warnings - pipeline is well-optimized - "pre_services": ServiceGroup( - name="balanced_group", - requested_async_flag=False, - components=[ - simple_asynchronous_service, - ServiceGroup( - timeout=0.02, - components=[time_consuming_service for _ in range(0, 6)], - ), - simple_asynchronous_service, - ], - ), - "post_services": [ - [meta_web_querying_service(photo) for photo in range(1, 16)], - context_printing_service, - ], -} - -# %% -pipeline = Pipeline.model_validate(pipeline_dict) - -if __name__ == "__main__": - check_happy_path(pipeline, HAPPY_PATH, printout=True) - if is_interactive_mode(): - pipeline.run() diff --git a/tutorials/pipeline/6_extra_handlers_basic.py b/tutorials/pipeline/6_extra_handlers_basic.py deleted file mode 100644 index c38e42391..000000000 --- a/tutorials/pipeline/6_extra_handlers_basic.py +++ /dev/null @@ -1,120 +0,0 @@ -# %% [markdown] -""" -# 6. Extra Handlers (basic) - -The following tutorial shows extra handlers possibilities and use cases. - -Here, extra handlers %mddoclink(api,core.service.extra,BeforeHandler) -and %mddoclink(api,core.service.extra,AfterHandler) -are shown as additional means of data processing, attached to services. -""" - -# %pip install chatsky - -# %% -import asyncio -import json -import logging -import random -from datetime import datetime - -from chatsky.core.service import ( - ServiceGroup, - ExtraHandlerRuntimeInfo, -) -from chatsky import Context, Pipeline -from chatsky.utils.testing.common import ( - check_happy_path, - is_interactive_mode, -) -from chatsky.utils.testing.toy_script import HAPPY_PATH, TOY_SCRIPT - -logger = logging.getLogger(__name__) - -# %% [markdown] -""" -Extra handlers are additional function - lists (before-functions and/or after-functions) - that can be added to any `pipeline` components (service and service groups). -Extra handlers main purpose should be service -and service groups statistics collection. -Extra handlers can be attached to pipeline component using -`before_handler` and `after_handler` constructor parameter. - -Here 5 `heavy_service`s are run in single asynchronous service group. -Each of them sleeps for random amount of seconds (between 0 and 0.05). -To each of them (as well as to group) - time measurement extra handler is attached, - that writes execution time to `ctx.misc`. -In the end `ctx.misc` is logged to info channel. -""" - - -# %% -def collect_timestamp_before(ctx: Context, _, info: ExtraHandlerRuntimeInfo): - ctx.misc.update({f"{info.component.name}": datetime.now()}) - - -def collect_timestamp_after(ctx: Context, _, info: ExtraHandlerRuntimeInfo): - ctx.misc.update( - { - f"{info.component.name}": datetime.now() - - ctx.misc[f"{info.component.name}"] - } - ) - - -async def heavy_service(_): - await asyncio.sleep(random.randint(0, 5) / 100) - - -def logging_service(ctx: Context): - logger.info(f"Context misc: {json.dumps(ctx.misc, indent=4, default=str)}") - - -# %% -pipeline_dict = { - "script": TOY_SCRIPT, - "start_label": ("greeting_flow", "start_node"), - "fallback_label": ("greeting_flow", "fallback_node"), - "pre_services": ServiceGroup( - before_handler=[collect_timestamp_before], - after_handler=[collect_timestamp_after], - components=[ - { - "handler": heavy_service, - "before_handler": [collect_timestamp_before], - "after_handler": [collect_timestamp_after], - }, - { - "handler": heavy_service, - "before_handler": [collect_timestamp_before], - "after_handler": [collect_timestamp_after], - }, - { - "handler": heavy_service, - "before_handler": [collect_timestamp_before], - "after_handler": [collect_timestamp_after], - }, - { - "handler": heavy_service, - "before_handler": [collect_timestamp_before], - "after_handler": [collect_timestamp_after], - }, - { - "handler": heavy_service, - "before_handler": [collect_timestamp_before], - "after_handler": [collect_timestamp_after], - }, - ], - ), - "post_services": logging_service, -} - -# %% -pipeline = Pipeline(**pipeline_dict) - -if __name__ == "__main__": - check_happy_path(pipeline, HAPPY_PATH, printout=True) - if is_interactive_mode(): - pipeline.run() diff --git a/tutorials/pipeline/6_extra_handlers_full.py b/tutorials/pipeline/6_extra_handlers_full.py deleted file mode 100644 index 6d6b4ecf5..000000000 --- a/tutorials/pipeline/6_extra_handlers_full.py +++ /dev/null @@ -1,187 +0,0 @@ -# %% [markdown] -""" -# 6. Extra Handlers (full) - -The following tutorial shows extra handlers possibilities and use cases. - -This tutorial is a more advanced version of the -[previous tutorial](%doclink(tutorial,pipeline.6_extra_handlers_basic)). -""" - -# %pip install chatsky psutil - -# %% -import json -import logging -import random -from datetime import datetime - -import psutil - -from chatsky.core.service import ( - ServiceGroup, - ExtraHandlerRuntimeInfo, - ServiceRuntimeInfo, - to_service, -) -from chatsky import Context, Pipeline -from chatsky.utils.testing.common import ( - check_happy_path, - is_interactive_mode, -) -from chatsky.utils.testing.toy_script import HAPPY_PATH, TOY_SCRIPT - -logger = logging.getLogger(__name__) - -# %% [markdown] -""" -Extra handlers are additional function lists - (before-functions and/or after-functions) - that can be added to any pipeline components (service and service groups). -Despite extra handlers can be used to prepare data for certain services, -that require some very special input type, - in most cases services should be preferred for that purpose. -Extra handlers can be asynchronous, -however there's no statistics that can be collected about them. -So their main purpose should be _really_ lightweight data conversion (etc.) - operations or service and service groups statistics collection. - -Extra handlers have the following constructor arguments / parameters: - -* `functions` - Functions that will be run. -* `timeout` - Timeout for that extra handler - (for asynchronous extra handlers only). -* `asynchronous` - Whether this extra handler should be asynchronous or not. -NB! Extra handlers don't have execution state, -so their names shouldn't appear in built-in condition functions. - -Extra handlers callable signature can be one of the following: -`[ctx]`, `[ctx, pipeline]` or `[ctx, pipeline, info]`, where: - -* `ctx` - `Context` of the current dialog. -* `pipeline` - The current pipeline. -* `info` - Dictionary, containing information about current extra handler - and pipeline execution state (see tutorial 4). - -Extra handlers can be attached to pipeline component in a few different ways: - -1. Directly in constructor - by adding extra handlers to - `before_handler` or `after_handler` constructor parameter. -2. (Services only) `to_service` decorator - - transforms function to service with extra handlers - from `before_handler` and `after_handler` arguments. -3. Using `add_extra_handler` function of `PipelineComponent` Example: -component.add_extra_handler(GlobalExtraHandlerType.AFTER, get_service_state) - -Here 5 `heavy_service`s fill big amounts of memory with random numbers. -Their runtime stats are captured and displayed by extra services, -`time_measure_handler` measures time and -`ram_measure_handler` - allocated memory. -Another `time_measure_handler` measures total -amount of time taken by all of them (combined in service group). -`logging_service` logs stats, however it can use string arguments only, - so `json_encoder_handler` is applied to encode stats to JSON. -""" - - -# %% -def get_extra_handler_misc_field( - info: ExtraHandlerRuntimeInfo, postfix: str -) -> str: # This method calculates `misc` field name dedicated to extra handler - # based on its and its service name - return f"{info.component.name}-{postfix}" - - -def time_measure_before_handler(ctx, _, info): - ctx.misc.update( - {get_extra_handler_misc_field(info, "time"): datetime.now()} - ) - - -def time_measure_after_handler(ctx, _, info): - ctx.misc.update( - { - get_extra_handler_misc_field(info, "time"): datetime.now() - - ctx.misc[get_extra_handler_misc_field(info, "time")] - } - ) - - -def ram_measure_before_handler(ctx, _, info): - ctx.misc.update( - { - get_extra_handler_misc_field( - info, "ram" - ): psutil.virtual_memory().available - } - ) - - -def ram_measure_after_handler(ctx, _, info): - ctx.misc.update( - { - get_extra_handler_misc_field(info, "ram"): ctx.misc[ - get_extra_handler_misc_field(info, "ram") - ] - - psutil.virtual_memory().available - } - ) - - -def json_converter_before_handler(ctx, _, info): - ctx.misc.update( - { - get_extra_handler_misc_field(info, "str"): json.dumps( - ctx.misc, indent=4, default=str - ) - } - ) - - -def json_converter_after_handler(ctx, _, info): - ctx.misc.pop(get_extra_handler_misc_field(info, "str")) - - -memory_heap = dict() # This object plays part of some memory heap - - -# %% -@to_service( - before_handler=[time_measure_before_handler, ram_measure_before_handler], - after_handler=[time_measure_after_handler, ram_measure_after_handler], -) -def heavy_service(ctx: Context): - memory_heap[ctx.last_request.text] = [ - random.randint(0, num) for num in range(0, 1000) - ] - - -@to_service( - before_handler=[json_converter_before_handler], - after_handler=[json_converter_after_handler], -) -def logging_service(ctx: Context, _, info: ServiceRuntimeInfo): - str_misc = ctx.misc[f"{info.name}-str"] - assert isinstance(str_misc, str) - print(f"Stringified misc: {str_misc}") - - -pipeline_dict = { - "script": TOY_SCRIPT, - "start_label": ("greeting_flow", "start_node"), - "fallback_label": ("greeting_flow", "fallback_node"), - "pre_services": ServiceGroup( - before_handler=[time_measure_before_handler], - after_handler=[time_measure_after_handler], - components=[heavy_service for _ in range(0, 5)], - ), - "post_services": logging_service, -} - -# %% -pipeline = Pipeline(**pipeline_dict) - -if __name__ == "__main__": - check_happy_path(pipeline, HAPPY_PATH, printout=True) - if is_interactive_mode(): - pipeline.run() diff --git a/tutorials/pipeline/7_extra_handlers_and_extensions.py b/tutorials/pipeline/7_extra_handlers_and_extensions.py deleted file mode 100644 index f9af88f0b..000000000 --- a/tutorials/pipeline/7_extra_handlers_and_extensions.py +++ /dev/null @@ -1,138 +0,0 @@ -# %% [markdown] -""" -# 7. Extra Handlers and Extensions - -The following tutorial shows how pipeline can be extended -by global extra handlers and custom functions. - -Here, %mddoclink(api,core.pipeline,Pipeline.add_global_handler) -function is shown, that can be used to add extra handlers before -and/or after all pipeline services. -""" - -# %pip install chatsky - -# %% -import asyncio -import json -import logging -import random -from datetime import datetime - -from chatsky.core.service import ( - ComponentExecutionState, - GlobalExtraHandlerType, - ExtraHandlerRuntimeInfo, - ServiceRuntimeInfo, -) -from chatsky import Pipeline -from chatsky.utils.testing.common import ( - check_happy_path, - is_interactive_mode, -) -from chatsky.utils.testing.toy_script import HAPPY_PATH, TOY_SCRIPT - -logger = logging.getLogger(__name__) - -# %% [markdown] -""" -Pipeline functionality can be extended by global extra handlers. -Global extra handlers are special extra handlers - that are called on some stages of pipeline execution. -There are 4 types of global extra handlers: - - * `BEFORE_ALL` is called before pipeline execution. - * `BEFORE` is called before each service and service group execution. - * `AFTER` is called after each service and service group execution. - * `AFTER_ALL` is called after pipeline execution. - -Global extra handlers have the same signature as regular extra handlers. -Actually `BEFORE_ALL` and `AFTER_ALL` - are attached to root service group named 'pipeline', - so they return its runtime info - -All extra handlers warnings (see tutorial 7) -are applicable to global extra handlers. -Pipeline `add_global_extra_handler` function is used to register - global extra handlers. It accepts following arguments: - -* `global_extra_handler_type` (required) - A `GlobalExtraHandlerType` instance, - indicates extra handler type to add. -* `extra_handler` (required) - The `ExtraHandlerFunction` itself. -* `whitelist` - An optional list of paths, if it's not `None` - the extra handlers will be applied to - specified pipeline components only. -* `blacklist` - An optional list of paths, if it's not `None` - the extra handlers will be applied to - all pipeline components except specified. - -Here basic functionality of `df-node-stats` library is emulated. -Information about pipeline component execution time and - result is collected and printed to info log after pipeline execution. -Pipeline consists of actor and 25 `long_service`s -that run random amount of time between 0 and 0.05 seconds. -""" - -# %% -start_times = dict() # Place to temporarily store service start times -pipeline_info = dict() # Pipeline information storage - - -def before_all(_, __, info: ExtraHandlerRuntimeInfo): - global start_times, pipeline_info - now = datetime.now() - pipeline_info = {"start_time": now} - start_times = {info.component.path: now} - - -def before(_, __, info: ExtraHandlerRuntimeInfo): - start_times.update({info.component.path: datetime.now()}) - - -def after(_, __, info: ExtraHandlerRuntimeInfo): - start_time = start_times[info.component.path] - pipeline_info.update( - { - f"{info.component.path}_duration": datetime.now() - start_time, - f"{info.component.path}_state": info.component.execution_state.get( - info.component.path, ComponentExecutionState.NOT_RUN - ), - } - ) - - -def after_all(_, __, info: ExtraHandlerRuntimeInfo): - pipeline_info.update( - {"total_time": datetime.now() - start_times[info.component.path]} - ) - logger.info( - f"Pipeline stats: {json.dumps(pipeline_info, indent=4, default=str)}" - ) - - -async def long_service(_, __, info: ServiceRuntimeInfo): - timeout = random.randint(0, 5) / 100 - logger.info(f"Service {info.name} is going to sleep for {timeout} seconds.") - await asyncio.sleep(timeout) - - -# %% -pipeline_dict = { - "script": TOY_SCRIPT, - "start_label": ("greeting_flow", "start_node"), - "fallback_label": ("greeting_flow", "fallback_node"), - "pre_services": [long_service for _ in range(0, 25)], -} - -# %% -pipeline = Pipeline(**pipeline_dict) - -pipeline.add_global_handler(GlobalExtraHandlerType.BEFORE_ALL, before_all) -pipeline.add_global_handler(GlobalExtraHandlerType.BEFORE, before) -pipeline.add_global_handler(GlobalExtraHandlerType.AFTER, after) -pipeline.add_global_handler(GlobalExtraHandlerType.AFTER_ALL, after_all) - -if __name__ == "__main__": - check_happy_path(pipeline, HAPPY_PATH, printout=True) - if is_interactive_mode(): - pipeline.run() diff --git a/tutorials/script/core/1_basics.py b/tutorials/script/core/1_basics.py index 46f5b5ded..74c440985 100644 --- a/tutorials/script/core/1_basics.py +++ b/tutorials/script/core/1_basics.py @@ -133,7 +133,7 @@ # %% [markdown] """ -A `Pipeline` is an object that processes user +`Pipeline` is an object that processes user inputs and produces responses. To create the pipeline you need to pass the script (`script`), diff --git a/tutorials/service/1_basics.py b/tutorials/service/1_basics.py new file mode 100644 index 000000000..68962f251 --- /dev/null +++ b/tutorials/service/1_basics.py @@ -0,0 +1,85 @@ +# %% [markdown] +""" +# 1. Basic services + +This tutorial shows basics of using services. + +Here, %mddoclink(api,core.context,Context.misc) +dictionary of context is used for storing additional data. +""" + +# %pip install chatsky + +# %% +import logging +import sys +from importlib import reload + +from chatsky import Context, Pipeline + +from chatsky.utils.testing import ( + check_happy_path, + is_interactive_mode, + HAPPY_PATH, + TOY_SCRIPT_KWARGS, +) + +reload(logging) +logging.basicConfig(stream=sys.stdout, level=logging.INFO, format="") +# fix jupyter logs display + +logger = logging.getLogger(__name__) + + +# %% [markdown] +""" +When Pipeline is created, additional pre- +and post-services can be defined. These run before and after +`Actor` respectively. + +
+ +Reminder + +`Actor` is a Pipeline component that processes user request, determines +the next node and generates a response from that node. + +
+ +Services can be used to access external APIs, annotate user input, etc. + +Service callables only take one parameter: `ctx` (Context) and have no return. + +Here a pre-service ("ping") and +a post-service ("pong") are added to the pipeline. +""" + + +# %% +def ping_processor(ctx: Context): + logger.info("ping - ...") + ctx.misc["ping"] = True + + +# services can be both sync and async +async def pong_processor(ctx: Context): + ping_pong = ctx.misc.get("ping", False) + logger.info("... - pong") + logger.info( + f"Ping-pong exchange: " f"{'completed' if ping_pong else 'failed'}." + ) + + +pipeline = Pipeline( + **TOY_SCRIPT_KWARGS, # contains script, start and fallback labels + pre_services=[ping_processor], + post_services=[pong_processor], + # To add a service simply add it to the corresponding service list +) + + +# %% +if __name__ == "__main__": + check_happy_path(pipeline, HAPPY_PATH[:1], printout=True) + if is_interactive_mode(): + pipeline.run() diff --git a/tutorials/service/2_advanced.py b/tutorials/service/2_advanced.py new file mode 100644 index 000000000..17dfcca24 --- /dev/null +++ b/tutorials/service/2_advanced.py @@ -0,0 +1,143 @@ +# %% [markdown] +""" +# 2. Advanced services + +This tutorial demonstrates various configuration options for services. + +For more information, see +[API ref](%doclink(api,core.service.service,Service)). +""" + +# %pip install chatsky + +# %% +import logging +import sys +from importlib import reload + +from chatsky import Context, Pipeline, BaseProcessing +from chatsky.core.service import Service +from chatsky.utils.testing.common import ( + check_happy_path, + is_interactive_mode, +) + +from chatsky.utils.testing.toy_script import TOY_SCRIPT_KWARGS, HAPPY_PATH + +reload(logging) +logging.basicConfig(stream=sys.stdout, level=logging.INFO, format="") +logger = logging.getLogger(__name__) + +# %% [markdown] +""" +## Intro + +In the previous tutorial we used a function as a Service. +Under the hood a function is converted to a `Service` object +with the function as its `handler` argument. + +The `Service` model has other arguments that modify its execution. + +## Service Arguments + +* `handler` - Function or `BaseProcessing`. +* `before_handler` - a list of functions that run before the service. + You can read more about the handlers in this [tutorial]( + %doclink(tutorial,service.5_extra_handlers) + ). +* `after_handler` - a list of functions that run after the service. + You can read more about the handlers in this [tutorial]( + %doclink(tutorial,service.5_extra_handlers) + ). +* `timeout` - service timeout. +* `concurrent` - whether this service can run concurrently, + see [tutorial 3]( + %doclink(tutorial,service.3_groups)). +* `start_condition` - service start condition, see [tutorial 4]( + %doclink(tutorial,service.4_conditions_and_paths)). +* `name` - name of the service, + see [tutorial 4]( + %doclink(tutorial,service.4_conditions_and_paths)). + +## Service subclassing + +Services can also be defined as subclasses of `Service`, +allowing access to all the fields described above via `self`. + +To do this, derive your class from `Service`, +then implement an async `call` method which will +now replace the `handler` (see the `PreProcess` example below). + +
+ +Tip + +When defining a service as a subclass of `Service`, you can also change +default parameters such as `timeout` or `start_condition`. + +
+ +## Code explanation + +In this example, pipeline contains three services, +defined in three different ways. + +The first is defined as a Service with a function handler. + +The second derives from the `Service` class. + +The third is defined as a Service with a processing handler. +""" + + +# %% +async def function_handler(ctx: Context): + logger.info( + "function_handler running:\n" + "timeout of this service cannot be determined" + ) + + +class ServiceSubclass(Service): + async def call(self, ctx: Context): + logger.info( + f"{self.name or self.computed_name} running:\n" + f"timeout: {self.timeout}" + ) + + timeout: float = 1.0 + # this overrides the default `None` timeout, + # but can still be overridden in class instances + + +class ProcessingService(BaseProcessing): + async def call(self, ctx: Context) -> None: + try: + logger.info(self.timeout) + except AttributeError: + # this is BaseProcessing not Service so there's no `timeout` field + logger.info( + "ProcessingService running:\n" + "timeout of this service cannot be determined" + ) + + +pipeline = Pipeline( + **TOY_SCRIPT_KWARGS, + pre_services=[ + Service( + handler=function_handler, + timeout=0.5, + ), + ServiceSubclass(name="ServiceSubclassWithCustomName", timeout=100), + ServiceSubclass(), + Service(handler=ProcessingService(), timeout=4), + ], +) + + +# %% +if __name__ == "__main__": + check_happy_path(pipeline, HAPPY_PATH[:1], printout=True) + if is_interactive_mode(): + pipeline.run() diff --git a/tutorials/service/3_groups.py b/tutorials/service/3_groups.py new file mode 100644 index 000000000..84866eca9 --- /dev/null +++ b/tutorials/service/3_groups.py @@ -0,0 +1,156 @@ +# %% [markdown] +""" +# 3. Service Groups + +The following tutorial shows how to group multiple services. + +For more information, see +[API ref](%doclink(api,core.service.group,ServiceGroup)). +""" + +# %pip install chatsky + +# %% +import asyncio +import logging +import sys +from importlib import reload + +from chatsky.core import Context, Pipeline +from chatsky.core.service import ServiceGroup + +from chatsky.utils.testing.common import ( + check_happy_path, + is_interactive_mode, +) +from chatsky.utils.testing.toy_script import HAPPY_PATH, TOY_SCRIPT_KWARGS + +reload(logging) +logging.basicConfig(stream=sys.stdout, level=logging.INFO, format="") +logger = logging.getLogger(__name__) + +# %% [markdown] +""" +## Intro + +Service groups are used to combine several services +(or service groups) into one. + +Both services and service groups inherit interface from `PipelineComponent` +class which defines all the fields described in the [previous tutorial]( +%doclink(tutorial,service.2_advanced)) +except `handler`. + +Instead of `handler` service group defines `components`: +a list of services or service groups. + +Pipeline pre-services and post-services are actually service groups +and you can pass a ServiceGroup instead of a list when initializing Pipeline. + +## Component execution + +Components inside a service group are executed sequentially, except for +components with the `concurrent` attribute set to `True`: +Continuous sequences of concurrent components are executed concurrently +(via `asyncio.gather`). + +For example, if components are `[1, 1, 0, 0, 1, 1, 1, 0]` where +"1" indicates a concurrent component, the components are executed as follows: + +1. Components 1 and 2 (concurrently); +2. Component 3; +3. Component 4; +4. Components 5, 6 and 7 (concurrently); +5. Component 8. + +
+ +Note + +Components processing different contexts are always executed independently +of each other. + +
+ +### Fully concurrent flag + +Service groups have a `fully_concurrent` flag which makes it treat +every component inside it as concurrent, +running all components simultaneously. + +This is convenient if you have a bunch of functions, +that you want to run simultaneously, +but don't want to make a service for each of them. + +## Code explanation + +In this example, we define `pre_services` as a `ServiceGroup` instead of a list. +This allows us to set the `fully_concurrent` flag to `True`. +The service group consists of 10 services that sleep 0.01 seconds each. +But since they are executed concurrently, the entire service group +takes much less time than 0.1 seconds. + +To further demonstrate ServiceGroup's execution logic, +`post_services` is a ServiceGroup with concurrent components 'A' and 'B', +which execute simultaneously, and also one regular component 'C' at the end. + +If 'A' and 'B' weren't concurrent, all steps for component 'A' would complete +before component 'B' begins its execution, but instead they start +at the same time. Only after both of them have finished, +does component 'C' start working. +""" + + +# %% +async def time_consuming_service(_): + await asyncio.sleep(0.01) + + +def interact(stage: str, service: str): + async def slow_service(_: Context): + logger.info(f"{stage} with service {service}") + await asyncio.sleep(0.1) + + return slow_service + + +pipeline = Pipeline( + **TOY_SCRIPT_KWARGS, + pre_services=ServiceGroup( + components=[time_consuming_service for _ in range(0, 10)], + fully_concurrent=True, + ), + post_services=[ + ServiceGroup( + name="InteractWithServiceA", + components=[ + interact("Starting interaction", "A"), + interact("Finishing interaction", "A"), + ], + concurrent=True, + ), + ServiceGroup( + name="InteractWithServiceB", + components=[ + interact("Starting interaction", "B"), + interact("Finishing interaction", "B"), + ], + concurrent=True, + ), + ServiceGroup( + name="InteractWithServiceC", + components=[ + interact("Starting interaction", "C"), + interact("Finishing interaction", "C"), + ], + concurrent=False, + ), + ], +) + + +# %% +if __name__ == "__main__": + check_happy_path(pipeline, HAPPY_PATH[:1], printout=True) + if is_interactive_mode(): + pipeline.run() diff --git a/tutorials/service/4_conditions_and_paths.py b/tutorials/service/4_conditions_and_paths.py new file mode 100644 index 000000000..e2a00060c --- /dev/null +++ b/tutorials/service/4_conditions_and_paths.py @@ -0,0 +1,209 @@ +# %% [markdown] +""" +# 4. Conditions and paths + +This tutorial explains how a unique path is generated for each component +and how to add a condition for component execution. + +[API ref for service conditions](%doclink(api,conditions.service)) +""" + +# %pip install chatsky + +# %% +import logging +import sys +from importlib import reload + +from chatsky.conditions import Not, All, ServiceFinished +from chatsky.core.service import Service, ServiceGroup +from chatsky import Pipeline, Context, AnyCondition + +from chatsky.utils.testing.common import ( + check_happy_path, + is_interactive_mode, +) +from chatsky.utils.testing.toy_script import HAPPY_PATH, TOY_SCRIPT_KWARGS + +reload(logging) +logging.basicConfig(stream=sys.stdout, level=logging.INFO, format="") +logger = logging.getLogger(__name__) + +# %% [markdown] +""" +## Component paths + +Each component has a unique path that can be used as an ID for that component. + +A path of a component is a "." concatenation of names of service groups this +component is in and the name of this component. + +For example, if component "c" is in group "b" which itself is in group "a" +then path of "c" is "a.b.c". + +
+ +Naming services + +When choosing a name for a component, keep in mind that +it should be unique among other components in the same service group. + +
+ +### Computed names + +If a component does not have a name, one is provided to it: + +1. Each component has `computed_name` property which returns a default name. + All service groups have "service_group" as their computed name. + For services the computed name is the name of the handler **or** of the + service class if handler is not present. + + E.g. A service with handler `my_func` has computed name "my_func"; + and if service `MyService` is a subclass of `Service` and does not + define `handler` its computed name is "MyService". +2. If there are two or more components in a service group with the same + computed name, they are assigned names with an incrementing postfix. + For example, if there are two service groups with no name in pre-services + they will be named "service_group#0" and "service_group#1". + +### Names of basic components + +* Main component (pipeline) has an empty name; +* Name of the pre services group is "pre"; +* Name of the post services group is "post"; +* Name of the actor service is "actor". + +For example, if you have `pre_services=[my_func]`, the full path of the +`my_func` component is ".pre.my_func". + +## Component start condition + +Any component (service or service group) can have a `start_condition`. + +Start condition is a `BaseCondition` that determines whether the component +should be executed. + +For more information about conditions, see the [condition tutorial]( +%doclink(tutorial,script.core.2_conditions)). + +### Component status + +At any time each component has a certain status: + +* `NOT_RUN` - Component hasn't bee executed yet or + start condition returned False. +* `RUNNING` - Component is currently being executed. +* `FINISHED` - Component finished successfully. +* `FAILED` - Component execution failed. + +For more information, see +%mddoclink(api,core.context,FrameworkData.service_states). + +### ServiceFinished condition + +`ServiceFinished` is a condition that returns `True` if another service +has the `FINISHED` status. + +`ServiceFinished` accepts the following constructor parameters: + +* `path` (required) - a path of another component. +* `wait` - whether it should wait for the component to complete. + This means that the component status cannot be + `NOT_RUN` or `RUNNING` at the time of the check. + Defaults to `False`. + +
+ +Warning! + +It is possible for the pipeline to get stuck in infinite waiting +with the `ServiceFinished` condition. + +Either disable `wait` or set a timeout for the service. + +
+ +For more information about `ServiceFinished`, see [API ref]( +%doclink(api,conditions.service,ServiceFinished)). + +## Code explanation + +In this example, two conditionally executed services are illustrated. + +The service named `running_service` is executed +only if both `SimpleServices` in pre service group +have finished successfully. + +`never_running_service` is executed only if `running_service` is not finished, +which should never happen. + +Lastly, `context_printing_service` prints pipeline runtime information, +that contains execution state of all previously run services. +""" + + +# %% +class SimpleService(Service): + async def call(self, _: Context): + logger.info(f"Service '{self.name}' is running...") + + +class NeverRunningService(Service): + async def call(self, _: Context): + raise Exception(f"Oh no! The '{self.name}' service is running!") + + start_condition: AnyCondition = Not( + ServiceFinished(".post.named_group.running_service", wait=True) + ) + + +class RuntimeInfoPrintingService(Service): + async def call(self, _: Context): + logger.info( + f"Service '{self.name}' runtime execution info:" + f"{self.model_dump_json(indent=4)}" + ) + + +# %% +pipeline = Pipeline( + **TOY_SCRIPT_KWARGS, + pre_services=[ + SimpleService(), + # This service will be named "SimpleService#0" + SimpleService(), + # This service will be named "SimpleService#1" + ], + # this group is named "pre" + post_services=[ + ServiceGroup( + name="named_group", + components=[ + SimpleService( + start_condition=All( + ServiceFinished(".pre.SimpleService#0"), + ServiceFinished(".pre.SimpleService#1"), + ), + # Alternative: + # ServiceFinished(".pre") + name="running_service", + ), + # This simple service is named "running_service" + NeverRunningService(), + # this service will be named "NeverRunningService" + ], + fully_concurrent=True, + # Makes components in the group run asynchronously, + # unless one is waiting for another to complete, + # which is what happens with NeverRunningService. + ), + RuntimeInfoPrintingService(), + ], +) + +# %% +if __name__ == "__main__": + check_happy_path(pipeline, HAPPY_PATH[:1], printout=True) + if is_interactive_mode(): + pipeline.run() diff --git a/tutorials/service/5_extra_handlers.py b/tutorials/service/5_extra_handlers.py new file mode 100644 index 000000000..46227d351 --- /dev/null +++ b/tutorials/service/5_extra_handlers.py @@ -0,0 +1,143 @@ +# %% [markdown] +""" +# 5. Extra handlers + +This tutorial shows usage of extra handlers: +functions that run before/after components. + +For API ref, see: + +* %mddoclink(api,core.service.extra,BeforeHandler) +* %mddoclink(api,core.service.extra,AfterHandler). +""" + +# %pip install chatsky + +# %% +import asyncio +import json +import random +import logging +import sys +from importlib import reload +from datetime import datetime + +from chatsky.core.service import ( + ServiceGroup, + ExtraHandlerRuntimeInfo, +) +from chatsky import Context, Pipeline +from chatsky.utils.testing.common import ( + check_happy_path, + is_interactive_mode, +) +from chatsky.utils.testing.toy_script import HAPPY_PATH, TOY_SCRIPT_KWARGS + +reload(logging) +logging.basicConfig(stream=sys.stdout, level=logging.INFO, format="") +logger = logging.getLogger(__name__) + +random.seed(0) + +# %% [markdown] +""" +## Intro + +Extra handlers are additional function +lists (before-functions and/or after-functions) +that can be added to any pipeline components (service and service groups). + +Extra handlers main purpose should be statistics collection. + +## Usage + +Extra handlers can be attached to pipeline component using +`before_handler` and `after_handler` constructor parameter. + +Extra handler callable signature can be one of the following: +`[ctx]` or `[ctx, info]`, where: + +* `ctx` - `Context` of the current dialog. +* `info` - Dictionary, containing information about current extra handler + and the pipeline component that called this. + + For example, `info.stage` will tell you if this Extra Handler is a + BeforeHandler or AfterHandler; `info.component.name` will give + you the component's name; `info.component.get_state(ctx)` will + return the component's execution state (which is `NOT_RUN` for + before handlers and `FINISHED` for after handlers). + +### Extra Handler configuration + +Instead of passing a list of functions as extra handler you can pass an instance +of either %mddoclink(api,core.service.extra,BeforeHandler) or +%mddoclink(api,core.service.extra,AfterHandler). + +This allows changing the `timeout` and `concurrent` options to change +the way extra handlers are executed. + +### Mass extra handler addition + +You can use %mddoclink(api,core.service.group,ServiceGroup.add_extra_handler) +to add a function as an extra handler to a service group and if you pass +a `condition` function it will also add the extra handler to all its +subcomponents that satisfy the condition function. + +## Code explanation + +Here 5 `heavy_service`s are run in a single concurrent service group. +Each of them sleeps for random a amount of seconds (between 0 and 0.05). + +To each of them (as well as the group) +time measurement extra handler is attached, +that writes execution time to `ctx.misc`. + +In the end `ctx.misc` is logged to info channel. +""" + + +# %% +def collect_timestamp_before(ctx: Context, info: ExtraHandlerRuntimeInfo): + ctx.misc.update({f"{info.component.path}": datetime.now()}) + + +def collect_timestamp_after(ctx: Context, info: ExtraHandlerRuntimeInfo): + ctx.misc.update( + { + f"{info.component.path}": datetime.now() + - ctx.misc[f"{info.component.path}"] + } + ) + + +async def heavy_service(_): + await asyncio.sleep(random.randint(0, 5) / 100) + + +def logging_service(ctx: Context): + logger.info(f"Context misc: {json.dumps(ctx.misc, indent=4, default=str)}") + + +# %% +pipeline = Pipeline( + **TOY_SCRIPT_KWARGS, + pre_services=ServiceGroup( + before_handler=[collect_timestamp_before], + after_handler=[collect_timestamp_after], + components=[ + { + "handler": heavy_service, + "before_handler": [collect_timestamp_before], + "after_handler": [collect_timestamp_after], + } + ] + * 5, + ), + post_services=[logging_service], +) + +# %% +if __name__ == "__main__": + check_happy_path(pipeline, HAPPY_PATH[:1], printout=True) + if is_interactive_mode(): + pipeline.run() diff --git a/tutorials/stats/1_extractor_functions.py b/tutorials/stats/1_extractor_functions.py index 5ad50ad34..8ce68358a 100644 --- a/tutorials/stats/1_extractor_functions.py +++ b/tutorials/stats/1_extractor_functions.py @@ -12,8 +12,7 @@ It is a preferred practice to define extractors as asynchronous functions. Extractors need to have the following uniform signature: -the expected arguments are always `Context`, -`Pipeline`, and `ExtraHandlerRuntimeInfo`, +the expected arguments are always `Context`, and `ExtraHandlerRuntimeInfo`, while the expected return value is an arbitrary `dict` or a `None`. The returned value gets persisted to Clickhouse as JSON which is why it can contain arbitrarily nested dictionaries, @@ -48,13 +47,13 @@ from chatsky.core.service import ( ExtraHandlerRuntimeInfo, - GlobalExtraHandlerType, + ExtraHandlerType, to_service, ) from chatsky import Context, Pipeline from chatsky.stats import OtelInstrumentor, default_extractors from chatsky.utils.testing import is_interactive_mode, check_happy_path -from chatsky.utils.testing.toy_script import TOY_SCRIPT, HAPPY_PATH +from chatsky.utils.testing.toy_script import TOY_SCRIPT_KWARGS, HAPPY_PATH # %% [markdown] """ @@ -97,10 +96,10 @@ # %% # decorated by an OTLP Instrumentor instance @chatsky_instrumentor -async def get_service_state(ctx: Context, _, info: ExtraHandlerRuntimeInfo): +async def get_service_state(ctx: Context, info: ExtraHandlerRuntimeInfo): # extract the execution state of a target service data = { - "execution_state": info.component.execution_state, + "execution_state": info.component.get_state(ctx), } # return the state as an arbitrary dict for further logging return data @@ -115,17 +114,10 @@ async def heavy_service(ctx: Context): # %% -pipeline = Pipeline.model_validate( - { - "script": TOY_SCRIPT, - "start_label": ("greeting_flow", "start_node"), - "fallback_label": ("greeting_flow", "fallback_node"), - "pre_services": heavy_service, - } -) +pipeline = Pipeline(**TOY_SCRIPT_KWARGS, pre_services=[heavy_service]) pipeline.actor.add_extra_handler( - GlobalExtraHandlerType.BEFORE, default_extractors.get_current_label + ExtraHandlerType.BEFORE, default_extractors.get_current_label ) if __name__ == "__main__": check_happy_path(pipeline, HAPPY_PATH, printout=True) diff --git a/tutorials/stats/2_pipeline_integration.py b/tutorials/stats/2_pipeline_integration.py index c72c98e1a..85c54ebf5 100644 --- a/tutorials/stats/2_pipeline_integration.py +++ b/tutorials/stats/2_pipeline_integration.py @@ -3,8 +3,8 @@ # 2. Pipeline Integration In the Chatsky ecosystem, extractor functions act as regular extra handlers ( -[see the pipeline module documentation]( -%doclink(tutorial,pipeline.6_extra_handlers_basic) +[see the extra handlers tutorial]( +%doclink(tutorial,service.5_extra_handlers) ) ). Hence, you can decorate any part of your pipeline, including services, @@ -32,7 +32,7 @@ from chatsky.core.service import ( ExtraHandlerRuntimeInfo, ServiceGroup, - GlobalExtraHandlerType, + ExtraHandlerType, ) from chatsky import Context, Pipeline from chatsky.stats import OTLPLogExporter, OTLPSpanExporter @@ -43,7 +43,7 @@ ) from chatsky.stats import default_extractors from chatsky.utils.testing import is_interactive_mode, check_happy_path -from chatsky.utils.testing.toy_script import TOY_SCRIPT, HAPPY_PATH +from chatsky.utils.testing.toy_script import TOY_SCRIPT_KWARGS, HAPPY_PATH # %% set_logger_destination(OTLPLogExporter("grpc://localhost:4317", insecure=True)) @@ -54,10 +54,10 @@ # example extractor function @chatsky_instrumentor -async def get_service_state(ctx: Context, _, info: ExtraHandlerRuntimeInfo): +async def get_service_state(ctx: Context, info: ExtraHandlerRuntimeInfo): # extract execution state of service from info data = { - "execution_state": info.component.execution_state, + "execution_state": info.component.get_state(ctx), } # return a record to save into connected database return data @@ -92,46 +92,42 @@ async def heavy_service(ctx: Context): """ # %% -pipeline = Pipeline.model_validate( - { - "script": TOY_SCRIPT, - "start_label": ("greeting_flow", "start_node"), - "fallback_label": ("greeting_flow", "fallback_node"), - "pre_services": ServiceGroup( - before_handler=[default_extractors.get_timing_before], - after_handler=[ - get_service_state, - default_extractors.get_timing_after, - ], - components=[ - {"handler": heavy_service}, - {"handler": heavy_service}, - ], - ), - } +pipeline = Pipeline( + **TOY_SCRIPT_KWARGS, + pre_services=ServiceGroup( + before_handler=[default_extractors.get_timing_before], + after_handler=[ + get_service_state, + default_extractors.get_timing_after, + ], + components=[ + heavy_service, + heavy_service, + ], + ), ) # These are Extra Handlers for Actor. pipeline.actor.add_extra_handler( - GlobalExtraHandlerType.BEFORE, default_extractors.get_timing_before -) -pipeline.actor.add_extra_handler( - GlobalExtraHandlerType.AFTER, get_service_state + ExtraHandlerType.BEFORE, default_extractors.get_timing_before ) +pipeline.actor.add_extra_handler(ExtraHandlerType.AFTER, get_service_state) pipeline.actor.add_extra_handler( - GlobalExtraHandlerType.AFTER, default_extractors.get_current_label + ExtraHandlerType.AFTER, default_extractors.get_current_label ) pipeline.actor.add_extra_handler( - GlobalExtraHandlerType.AFTER, default_extractors.get_timing_after + ExtraHandlerType.AFTER, default_extractors.get_timing_after ) -# These are global Extra Handlers for Pipeline. -pipeline.add_global_handler( - GlobalExtraHandlerType.BEFORE_ALL, default_extractors.get_timing_before +# These are global Extra Handlers for Pipeline service +pipeline.services_pipeline.add_extra_handler( + ExtraHandlerType.BEFORE, default_extractors.get_timing_before +) +pipeline.services_pipeline.add_extra_handler( + ExtraHandlerType.AFTER, default_extractors.get_timing_after ) -pipeline.add_global_handler( - GlobalExtraHandlerType.AFTER_ALL, default_extractors.get_timing_after +pipeline.services_pipeline.add_extra_handler( + ExtraHandlerType.AFTER, get_service_state ) -pipeline.add_global_handler(GlobalExtraHandlerType.AFTER_ALL, get_service_state) if __name__ == "__main__": check_happy_path(pipeline, HAPPY_PATH, printout=True) diff --git a/utils/stats/sample_data_provider.py b/utils/stats/sample_data_provider.py index ca380898f..f1d990589 100644 --- a/utils/stats/sample_data_provider.py +++ b/utils/stats/sample_data_provider.py @@ -12,7 +12,7 @@ import asyncio from tqdm import tqdm from chatsky.core import Context, Message, Pipeline -from chatsky.core.service import Service, ExtraHandlerRuntimeInfo, GlobalExtraHandlerType +from chatsky.core.service import Service, ExtraHandlerRuntimeInfo, ExtraHandlerType from chatsky.stats import ( default_extractors, OtelInstrumentor, @@ -37,7 +37,7 @@ def slot_processor_2(ctx: Context): @chatsky_instrumentor -async def get_slots(ctx: Context, _, info: ExtraHandlerRuntimeInfo): +async def get_slots(ctx: Context, info: ExtraHandlerRuntimeInfo): return ctx.misc["slots"] @@ -46,7 +46,7 @@ def confidence_processor(ctx: Context): @chatsky_instrumentor -async def get_confidence(ctx: Context, _, info: ExtraHandlerRuntimeInfo): +async def get_confidence(ctx: Context, info: ExtraHandlerRuntimeInfo): data = {"response_confidence": ctx.misc["response_confidence"]} return data @@ -61,14 +61,14 @@ async def get_confidence(ctx: Context, _, info: ExtraHandlerRuntimeInfo): Service(handler=slot_processor_1, after_handler=[get_slots]), Service(handler=slot_processor_2, after_handler=[get_slots]), ], - "post_services": Service(handler=confidence_processor, after_handler=[get_confidence]), + "post_services": [Service(handler=confidence_processor, after_handler=[get_confidence])], } ) -pipeline.actor.add_extra_handler(GlobalExtraHandlerType.BEFORE, default_extractors.get_timing_before) -pipeline.actor.add_extra_handler(GlobalExtraHandlerType.AFTER, default_extractors.get_timing_after) -pipeline.actor.add_extra_handler(GlobalExtraHandlerType.AFTER, default_extractors.get_current_label) -pipeline.actor.add_extra_handler(GlobalExtraHandlerType.AFTER, default_extractors.get_last_request) -pipeline.actor.add_extra_handler(GlobalExtraHandlerType.AFTER, default_extractors.get_last_response) +pipeline.actor.add_extra_handler(ExtraHandlerType.BEFORE, default_extractors.get_timing_before) +pipeline.actor.add_extra_handler(ExtraHandlerType.AFTER, default_extractors.get_timing_after) +pipeline.actor.add_extra_handler(ExtraHandlerType.AFTER, default_extractors.get_current_label) +pipeline.actor.add_extra_handler(ExtraHandlerType.AFTER, default_extractors.get_last_request) +pipeline.actor.add_extra_handler(ExtraHandlerType.AFTER, default_extractors.get_last_response) # %% From d504c3ffefff8bbb90365cfdef9ba94392d6b538 Mon Sep 17 00:00:00 2001 From: Roman Zlobin Date: Sat, 28 Sep 2024 00:53:22 +0300 Subject: [PATCH 5/6] update version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 146665fff..3c7dde664 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "chatsky" -version = "1.0.0rc1" +version = "0.9.0" description = "Chatsky is a free and open-source software stack for creating chatbots, released under the terms of Apache License 2.0." license = "Apache-2.0" authors = [ From 8aedf8c1532bbff11b3af7bf96854d7ae1cadf1f Mon Sep 17 00:00:00 2001 From: Roman Zlobin Date: Sat, 28 Sep 2024 00:56:20 +0300 Subject: [PATCH 6/6] update lock file --- poetry.lock | 1679 ++++++++++++++++++++++++++------------------------- 1 file changed, 860 insertions(+), 819 deletions(-) diff --git a/poetry.lock b/poetry.lock index 133a63c27..b3865bf61 100644 --- a/poetry.lock +++ b/poetry.lock @@ -46,113 +46,113 @@ files = [ [[package]] name = "aiohappyeyeballs" -version = "2.4.0" +version = "2.4.2" description = "Happy Eyeballs for asyncio" optional = true python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, - {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, + {file = "aiohappyeyeballs-2.4.2-py3-none-any.whl", hash = "sha256:8522691d9a154ba1145b157d6d5c15e5c692527ce6a53c5e5f9876977f6dab2f"}, + {file = "aiohappyeyeballs-2.4.2.tar.gz", hash = "sha256:4ca893e6c5c1f5bf3888b04cb5a3bee24995398efef6e0b9f747b5e89d84fd74"}, ] [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.10.6" description = "Async http client/server framework (asyncio)" optional = true python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, - {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, - {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, - {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, - {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, - {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, - {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, - {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, - {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, - {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, - {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, - {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, - {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, + {file = "aiohttp-3.10.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:682836fc672972cc3101cc9e30d49c5f7e8f1d010478d46119fe725a4545acfd"}, + {file = "aiohttp-3.10.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:289fa8a20018d0d5aa9e4b35d899bd51bcb80f0d5f365d9a23e30dac3b79159b"}, + {file = "aiohttp-3.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8617c96a20dd57e7e9d398ff9d04f3d11c4d28b1767273a5b1a018ada5a654d3"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdbeff1b062751c2a2a55b171f7050fb7073633c699299d042e962aacdbe1a07"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ea35d849cdd4a9268f910bff4497baebbc1aa3f2f625fd8ccd9ac99c860c621"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:473961b3252f3b949bb84873d6e268fb6d8aa0ccc6eb7404fa58c76a326bb8e1"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d2665c5df629eb2f981dab244c01bfa6cdc185f4ffa026639286c4d56fafb54"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25d92f794f1332f656e3765841fc2b7ad5c26c3f3d01e8949eeb3495691cf9f4"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9bd6b2033993d5ae80883bb29b83fb2b432270bbe067c2f53cc73bb57c46065f"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d7f408c43f5e75ea1edc152fb375e8f46ef916f545fb66d4aebcbcfad05e2796"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:cf8b8560aa965f87bf9c13bf9fed7025993a155ca0ce8422da74bf46d18c2f5f"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14477c4e52e2f17437b99893fd220ffe7d7ee41df5ebf931a92b8ca82e6fd094"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fb138fbf9f53928e779650f5ed26d0ea1ed8b2cab67f0ea5d63afa09fdc07593"}, + {file = "aiohttp-3.10.6-cp310-cp310-win32.whl", hash = "sha256:9843d683b8756971797be171ead21511d2215a2d6e3c899c6e3107fbbe826791"}, + {file = "aiohttp-3.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:f8b8e49fe02f744d38352daca1dbef462c3874900bd8166516f6ea8e82b5aacf"}, + {file = "aiohttp-3.10.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f52e54fd776ad0da1006708762213b079b154644db54bcfc62f06eaa5b896402"}, + {file = "aiohttp-3.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:995ab1a238fd0d19dc65f2d222e5eb064e409665c6426a3e51d5101c1979ee84"}, + {file = "aiohttp-3.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0749c4d5a08a802dd66ecdf59b2df4d76b900004017468a7bb736c3b5a3dd902"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e05b39158f2af0e2438cc2075cfc271f4ace0c3cc4a81ec95b27a0432e161951"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9f196c970db2dcde4f24317e06615363349dc357cf4d7a3b0716c20ac6d7bcd"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47647c8af04a70e07a2462931b0eba63146a13affa697afb4ecbab9d03a480ce"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669c0efe7e99f6d94d63274c06344bd0e9c8daf184ce5602a29bc39e00a18720"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9721cdd83a994225352ca84cd537760d41a9da3c0eacb3ff534747ab8fba6d0"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b82c8ebed66ce182893e7c0b6b60ba2ace45b1df104feb52380edae266a4850"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b169f8e755e541b72e714b89a831b315bbe70db44e33fead28516c9e13d5f931"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0be3115753baf8b4153e64f9aa7bf6c0c64af57979aa900c31f496301b374570"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e1f80cd17d81a404b6e70ef22bfe1870bafc511728397634ad5f5efc8698df56"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6419728b08fb6380c66a470d2319cafcec554c81780e2114b7e150329b9a9a7f"}, + {file = "aiohttp-3.10.6-cp311-cp311-win32.whl", hash = "sha256:bd294dcdc1afdc510bb51d35444003f14e327572877d016d576ac3b9a5888a27"}, + {file = "aiohttp-3.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:bf861da9a43d282d6dd9dcd64c23a0fccf2c5aa5cd7c32024513c8c79fb69de3"}, + {file = "aiohttp-3.10.6-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2708baccdc62f4b1251e59c2aac725936a900081f079b88843dabcab0feeeb27"}, + {file = "aiohttp-3.10.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7475da7a5e2ccf1a1c86c8fee241e277f4874c96564d06f726d8df8e77683ef7"}, + {file = "aiohttp-3.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02108326574ff60267b7b35b17ac5c0bbd0008ccb942ce4c48b657bb90f0b8aa"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:029a019627b37fa9eac5c75cc54a6bb722c4ebbf5a54d8c8c0fb4dd8facf2702"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a637d387db6fdad95e293fab5433b775fd104ae6348d2388beaaa60d08b38c4"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1a16f3fc1944c61290d33c88dc3f09ba62d159b284c38c5331868425aca426"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b292f37969f9cc54f4643f0be7dacabf3612b3b4a65413661cf6c350226787"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0754690a3a26e819173a34093798c155bafb21c3c640bff13be1afa1e9d421f9"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:164ecd32e65467d86843dbb121a6666c3deb23b460e3f8aefdcaacae79eb718a"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438c5863feb761f7ca3270d48c292c334814459f61cc12bab5ba5b702d7c9e56"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ba18573bb1de1063d222f41de64a0d3741223982dcea863b3f74646faf618ec7"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c82a94ddec996413a905f622f3da02c4359952aab8d817c01cf9915419525e95"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92351aa5363fc3c1f872ca763f86730ced32b01607f0c9662b1fa711087968d0"}, + {file = "aiohttp-3.10.6-cp312-cp312-win32.whl", hash = "sha256:3e15e33bfc73fa97c228f72e05e8795e163a693fd5323549f49367c76a6e5883"}, + {file = "aiohttp-3.10.6-cp312-cp312-win_amd64.whl", hash = "sha256:fe517113fe4d35d9072b826c3e147d63c5f808ca8167d450b4f96c520c8a1d8d"}, + {file = "aiohttp-3.10.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:482f74057ea13d387a7549d7a7ecb60e45146d15f3e58a2d93a0ad2d5a8457cd"}, + {file = "aiohttp-3.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:03fa40d1450ee5196e843315ddf74a51afc7e83d489dbfc380eecefea74158b1"}, + {file = "aiohttp-3.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e52e59ed5f4cc3a3acfe2a610f8891f216f486de54d95d6600a2c9ba1581f4d"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b3935a22c9e41a8000d90588bed96cf395ef572dbb409be44c6219c61d900d"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bef1480ee50f75abcfcb4b11c12de1005968ca9d0172aec4a5057ba9f2b644f"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:671745ea7db19693ce867359d503772177f0b20fa8f6ee1e74e00449f4c4151d"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b50b367308ca8c12e0b50cba5773bc9abe64c428d3fd2bbf5cd25aab37c77bf"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a504d7cdb431a777d05a124fd0b21efb94498efa743103ea01b1e3136d2e4fb"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66bc81361131763660b969132a22edce2c4d184978ba39614e8f8f95db5c95f8"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:27cf19a38506e2e9f12fc17e55f118f04897b0a78537055d93a9de4bf3022e3d"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3468b39f977a11271517c6925b226720e148311039a380cc9117b1e2258a721f"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9d26da22a793dfd424be1050712a70c0afd96345245c29aced1e35dbace03413"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:844d48ff9173d0b941abed8b2ea6a412f82b56d9ab1edb918c74000c15839362"}, + {file = "aiohttp-3.10.6-cp313-cp313-win32.whl", hash = "sha256:2dd56e3c43660ed3bea67fd4c5025f1ac1f9ecf6f0b991a6e5efe2e678c490c5"}, + {file = "aiohttp-3.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:c91781d969fbced1993537f45efe1213bd6fccb4b37bfae2a026e20d6fbed206"}, + {file = "aiohttp-3.10.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4407a80bca3e694f2d2a523058e20e1f9f98a416619e04f6dc09dc910352ac8b"}, + {file = "aiohttp-3.10.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1cb045ec5961f51af3e2c08cd6fe523f07cc6e345033adee711c49b7b91bb954"}, + {file = "aiohttp-3.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4fabdcdc781a36b8fd7b2ca9dea8172f29a99e11d00ca0f83ffeb50958da84a1"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a9f42efcc2681790595ab3d03c0e52d01edc23a0973ea09f0dc8d295e12b8e"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cca776a440795db437d82c07455761c85bbcf3956221c3c23b8c93176c278ce7"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5582de171f0898139cf51dd9fcdc79b848e28d9abd68e837f0803fc9f30807b1"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:370e2d47575c53c817ee42a18acc34aad8da4dbdaac0a6c836d58878955f1477"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:444d1704e2af6b30766debed9be8a795958029e552fe77551355badb1944012c"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40271a2a375812967401c9ca8077de9368e09a43a964f4dce0ff603301ec9358"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f3af26f86863fad12e25395805bb0babbd49d512806af91ec9708a272b696248"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4752df44df48fd42b80f51d6a97553b482cda1274d9dc5df214a3a1aa5d8f018"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2cd5290ab66cfca2f90045db2cc6434c1f4f9fbf97c9f1c316e785033782e7d2"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3427031064b0d5c95647e6369c4aa3c556402f324a3e18107cb09517abe5f962"}, + {file = "aiohttp-3.10.6-cp38-cp38-win32.whl", hash = "sha256:614fc21e86adc28e4165a6391f851a6da6e9cbd7bb232d0df7718b453a89ee98"}, + {file = "aiohttp-3.10.6-cp38-cp38-win_amd64.whl", hash = "sha256:58c5d7318a136a3874c78717dd6de57519bc64f6363c5827c2b1cb775bea71dd"}, + {file = "aiohttp-3.10.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5db26bbca8e7968c4c977a0c640e0b9ce7224e1f4dcafa57870dc6ee28e27de6"}, + {file = "aiohttp-3.10.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3fb4216e3ec0dbc01db5ba802f02ed78ad8f07121be54eb9e918448cc3f61b7c"}, + {file = "aiohttp-3.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a976ef488f26e224079deb3d424f29144c6d5ba4ded313198169a8af8f47fb82"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a86610174de8a85a920e956e2d4f9945e7da89f29a00e95ac62a4a414c4ef4e"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:217791c6a399cc4f2e6577bb44344cba1f5714a2aebf6a0bea04cfa956658284"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba3662d41abe2eab0eeec7ee56f33ef4e0b34858f38abf24377687f9e1fb00a5"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4dfa5ad4bce9ca30a76117fbaa1c1decf41ebb6c18a4e098df44298941566f9"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0009258e97502936d3bd5bf2ced15769629097d0abb81e6495fba1047824fe0"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0a75d5c9fb4f06c41d029ae70ad943c3a844c40c0a769d12be4b99b04f473d3d"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8198b7c002aae2b40b2d16bfe724b9a90bcbc9b78b2566fc96131ef4e382574d"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4611db8c907f90fe86be112efdc2398cd7b4c8eeded5a4f0314b70fdea8feab0"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ff99ae06eef85c7a565854826114ced72765832ee16c7e3e766c5e4c5b98d20e"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7641920bdcc7cd2d3ddfb8bb9133a6c9536b09dbd49490b79e125180b2d25b93"}, + {file = "aiohttp-3.10.6-cp39-cp39-win32.whl", hash = "sha256:e2e7d5591ea868d5ec82b90bbeb366a198715672841d46281b623e23079593db"}, + {file = "aiohttp-3.10.6-cp39-cp39-win_amd64.whl", hash = "sha256:b504c08c45623bf5c7ca41be380156d925f00199b3970efd758aef4a77645feb"}, + {file = "aiohttp-3.10.6.tar.gz", hash = "sha256:d2578ef941be0c2ba58f6f421a703527d08427237ed45ecb091fed6f83305336"}, ] [package.dependencies] @@ -162,7 +162,7 @@ async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -270,13 +270,13 @@ files = [ [[package]] name = "anyio" -version = "4.4.0" +version = "4.5.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.5.0-py3-none-any.whl", hash = "sha256:fdeb095b7cc5a5563175eedd926ec4ae55413bb4be5770c424af0ba46ccb4a78"}, + {file = "anyio-4.5.0.tar.gz", hash = "sha256:c5a275fe5ca0afd788001f58fca1e69e29ce706d746e317d660e21f70c530ef9"}, ] [package.dependencies] @@ -286,9 +286,9 @@ sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "appnope" @@ -1329,33 +1329,33 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "debugpy" -version = "1.8.5" +version = "1.8.6" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.5-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7e4d594367d6407a120b76bdaa03886e9eb652c05ba7f87e37418426ad2079f7"}, - {file = "debugpy-1.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4413b7a3ede757dc33a273a17d685ea2b0c09dbd312cc03f5534a0fd4d40750a"}, - {file = "debugpy-1.8.5-cp310-cp310-win32.whl", hash = "sha256:dd3811bd63632bb25eda6bd73bea8e0521794cda02be41fa3160eb26fc29e7ed"}, - {file = "debugpy-1.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:b78c1250441ce893cb5035dd6f5fc12db968cc07f91cc06996b2087f7cefdd8e"}, - {file = "debugpy-1.8.5-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:606bccba19f7188b6ea9579c8a4f5a5364ecd0bf5a0659c8a5d0e10dcee3032a"}, - {file = "debugpy-1.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db9fb642938a7a609a6c865c32ecd0d795d56c1aaa7a7a5722d77855d5e77f2b"}, - {file = "debugpy-1.8.5-cp311-cp311-win32.whl", hash = "sha256:4fbb3b39ae1aa3e5ad578f37a48a7a303dad9a3d018d369bc9ec629c1cfa7408"}, - {file = "debugpy-1.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:345d6a0206e81eb68b1493ce2fbffd57c3088e2ce4b46592077a943d2b968ca3"}, - {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"}, - {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"}, - {file = "debugpy-1.8.5-cp312-cp312-win32.whl", hash = "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7"}, - {file = "debugpy-1.8.5-cp312-cp312-win_amd64.whl", hash = "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c"}, - {file = "debugpy-1.8.5-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:3df6692351172a42af7558daa5019651f898fc67450bf091335aa8a18fbf6f3a"}, - {file = "debugpy-1.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd04a73eb2769eb0bfe43f5bfde1215c5923d6924b9b90f94d15f207a402226"}, - {file = "debugpy-1.8.5-cp38-cp38-win32.whl", hash = "sha256:8f913ee8e9fcf9d38a751f56e6de12a297ae7832749d35de26d960f14280750a"}, - {file = "debugpy-1.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:a697beca97dad3780b89a7fb525d5e79f33821a8bc0c06faf1f1289e549743cf"}, - {file = "debugpy-1.8.5-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c"}, - {file = "debugpy-1.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84c276489e141ed0b93b0af648eef891546143d6a48f610945416453a8ad406"}, - {file = "debugpy-1.8.5-cp39-cp39-win32.whl", hash = "sha256:ad84b7cde7fd96cf6eea34ff6c4a1b7887e0fe2ea46e099e53234856f9d99a34"}, - {file = "debugpy-1.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:7b0fe36ed9d26cb6836b0a51453653f8f2e347ba7348f2bbfe76bfeb670bfb1c"}, - {file = "debugpy-1.8.5-py2.py3-none-any.whl", hash = "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44"}, - {file = "debugpy-1.8.5.zip", hash = "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0"}, + {file = "debugpy-1.8.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:30f467c5345d9dfdcc0afdb10e018e47f092e383447500f125b4e013236bf14b"}, + {file = "debugpy-1.8.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d73d8c52614432f4215d0fe79a7e595d0dd162b5c15233762565be2f014803b"}, + {file = "debugpy-1.8.6-cp310-cp310-win32.whl", hash = "sha256:e3e182cd98eac20ee23a00653503315085b29ab44ed66269482349d307b08df9"}, + {file = "debugpy-1.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:e3a82da039cfe717b6fb1886cbbe5c4a3f15d7df4765af857f4307585121c2dd"}, + {file = "debugpy-1.8.6-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67479a94cf5fd2c2d88f9615e087fcb4fec169ec780464a3f2ba4a9a2bb79955"}, + {file = "debugpy-1.8.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb8653f6cbf1dd0a305ac1aa66ec246002145074ea57933978346ea5afdf70b"}, + {file = "debugpy-1.8.6-cp311-cp311-win32.whl", hash = "sha256:cdaf0b9691879da2d13fa39b61c01887c34558d1ff6e5c30e2eb698f5384cd43"}, + {file = "debugpy-1.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:43996632bee7435583952155c06881074b9a742a86cee74e701d87ca532fe833"}, + {file = "debugpy-1.8.6-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:db891b141fc6ee4b5fc6d1cc8035ec329cabc64bdd2ae672b4550c87d4ecb128"}, + {file = "debugpy-1.8.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:567419081ff67da766c898ccf21e79f1adad0e321381b0dfc7a9c8f7a9347972"}, + {file = "debugpy-1.8.6-cp312-cp312-win32.whl", hash = "sha256:c9834dfd701a1f6bf0f7f0b8b1573970ae99ebbeee68314116e0ccc5c78eea3c"}, + {file = "debugpy-1.8.6-cp312-cp312-win_amd64.whl", hash = "sha256:e4ce0570aa4aca87137890d23b86faeadf184924ad892d20c54237bcaab75d8f"}, + {file = "debugpy-1.8.6-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:df5dc9eb4ca050273b8e374a4cd967c43be1327eeb42bfe2f58b3cdfe7c68dcb"}, + {file = "debugpy-1.8.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a85707c6a84b0c5b3db92a2df685b5230dd8fb8c108298ba4f11dba157a615a"}, + {file = "debugpy-1.8.6-cp38-cp38-win32.whl", hash = "sha256:538c6cdcdcdad310bbefd96d7850be1cd46e703079cc9e67d42a9ca776cdc8a8"}, + {file = "debugpy-1.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:22140bc02c66cda6053b6eb56dfe01bbe22a4447846581ba1dd6df2c9f97982d"}, + {file = "debugpy-1.8.6-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:c1cef65cffbc96e7b392d9178dbfd524ab0750da6c0023c027ddcac968fd1caa"}, + {file = "debugpy-1.8.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e60bd06bb3cc5c0e957df748d1fab501e01416c43a7bdc756d2a992ea1b881"}, + {file = "debugpy-1.8.6-cp39-cp39-win32.whl", hash = "sha256:f7158252803d0752ed5398d291dee4c553bb12d14547c0e1843ab74ee9c31123"}, + {file = "debugpy-1.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3358aa619a073b620cd0d51d8a6176590af24abcc3fe2e479929a154bf591b51"}, + {file = "debugpy-1.8.6-py2.py3-none-any.whl", hash = "sha256:b48892df4d810eff21d3ef37274f4c60d32cdcafc462ad5647239036b0f0649f"}, + {file = "debugpy-1.8.6.zip", hash = "sha256:c931a9371a86784cee25dec8d65bc2dc7a21f3f1552e3833d9ef8f919d22280a"}, ] [[package]] @@ -1584,13 +1584,13 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastapi" -version = "0.114.0" +version = "0.115.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.114.0-py3-none-any.whl", hash = "sha256:fee75aa1b1d3d73f79851c432497e4394e413e1dece6234f68d3ce250d12760a"}, - {file = "fastapi-0.114.0.tar.gz", hash = "sha256:9908f2a5cc733004de6ca5e1412698f35085cefcbfd41d539245b9edf87b73c1"}, + {file = "fastapi-0.115.0-py3-none-any.whl", hash = "sha256:17ea427674467486e997206a5ab25760f6b09e069f099b96f5b55a32fb6f1631"}, + {file = "fastapi-0.115.0.tar.gz", hash = "sha256:f93b4ca3529a8ebc6fc3fcf710e5efa8de3df9b41570958abf1d97d843138004"}, ] [package.dependencies] @@ -1618,18 +1618,18 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.16.0" +version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.16.0-py3-none-any.whl", hash = "sha256:f6ed4c963184f4c84dd5557ce8fece759a3724b37b80c6c4f20a2f63a4dc6609"}, - {file = "filelock-3.16.0.tar.gz", hash = "sha256:81de9eb8453c769b63369f87f11131a7ab04e367f8d97ad39dc230daa07e3bec"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.1.1)", "pytest (>=8.3.2)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.3)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] typing = ["typing-extensions (>=4.12.2)"] [[package]] @@ -2038,69 +2038,84 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "greenlet" -version = "3.0.3" +version = "3.1.1" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ - {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, - {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, - {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, - {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, - {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, - {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, - {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, - {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, - {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, - {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, - {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, - {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, ] [package.extras] @@ -2277,15 +2292,18 @@ files = [ [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "imagesize" version = "1.4.1" @@ -2318,13 +2336,13 @@ test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "p [[package]] name = "importlib-resources" -version = "6.4.4" +version = "6.4.5" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.4.4-py3-none-any.whl", hash = "sha256:dda242603d1c9cd836c3368b1174ed74cb4049ecd209e7a1a0104620c18c5c11"}, - {file = "importlib_resources-6.4.4.tar.gz", hash = "sha256:20600c8b7361938dc0bb2d5ec0297802e575df486f5a544fa414da65e13721f7"}, + {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, + {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, ] [package.dependencies] @@ -2650,13 +2668,13 @@ notebook = "*" [[package]] name = "jupyter-client" -version = "8.6.2" +version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, - {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, ] [package.dependencies] @@ -3094,13 +3112,13 @@ files = [ [[package]] name = "mdit-py-plugins" -version = "0.4.1" +version = "0.4.2" description = "Collection of plugins for markdown-it-py" optional = false python-versions = ">=3.8" files = [ - {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, - {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, + {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, + {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, ] [package.dependencies] @@ -3162,191 +3180,204 @@ files = [ [[package]] name = "motor" -version = "3.5.1" +version = "3.6.0" description = "Non-blocking MongoDB driver for Tornado or asyncio" optional = true python-versions = ">=3.8" files = [ - {file = "motor-3.5.1-py3-none-any.whl", hash = "sha256:f95a9ea0f011464235e0bd72910baa291db3a6009e617ac27b82f57885abafb8"}, - {file = "motor-3.5.1.tar.gz", hash = "sha256:1622bd7b39c3e6375607c14736f6e1d498128eadf6f5f93f8786cf17d37062ac"}, + {file = "motor-3.6.0-py3-none-any.whl", hash = "sha256:9f07ed96f1754963d4386944e1b52d403a5350c687edc60da487d66f98dbf894"}, + {file = "motor-3.6.0.tar.gz", hash = "sha256:0ef7f520213e852bf0eac306adf631aabe849227d8aec900a2612512fb9c5b8d"}, ] [package.dependencies] -pymongo = ">=4.5,<5" +pymongo = ">=4.9,<4.10" [package.extras] aws = ["pymongo[aws] (>=4.5,<5)"] -docs = ["aiohttp", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<8)", "sphinx-rtd-theme (>=2,<3)", "tornado"] +docs = ["aiohttp", "furo (==2024.8.6)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<8)", "sphinx-rtd-theme (>=2,<3)", "tornado"] encryption = ["pymongo[encryption] (>=4.5,<5)"] gssapi = ["pymongo[gssapi] (>=4.5,<5)"] ocsp = ["pymongo[ocsp] (>=4.5,<5)"] snappy = ["pymongo[snappy] (>=4.5,<5)"] -test = ["aiohttp (!=3.8.6)", "mockupdb", "pymongo[encryption] (>=4.5,<5)", "pytest (>=7)", "tornado (>=5)"] +test = ["aiohttp (>=3.8.7)", "cffi (>=1.17.0rc1)", "mockupdb", "pymongo[encryption] (>=4.5,<5)", "pytest (>=7)", "pytest-asyncio", "tornado (>=5)"] zstd = ["pymongo[zstd] (>=4.5,<5)"] [[package]] name = "msgpack" -version = "1.0.8" +version = "1.1.0" description = "MessagePack serializer" optional = false python-versions = ">=3.8" files = [ - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"}, - {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"}, - {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, - {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, - {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"}, - {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"}, - {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a"}, - {file = "msgpack-1.0.8-cp38-cp38-win32.whl", hash = "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c"}, - {file = "msgpack-1.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, - {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, - {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, - {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b"}, + {file = "msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044"}, + {file = "msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5"}, + {file = "msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88"}, + {file = "msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b"}, + {file = "msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b"}, + {file = "msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c"}, + {file = "msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc"}, + {file = "msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f"}, + {file = "msgpack-1.1.0-cp38-cp38-win32.whl", hash = "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b"}, + {file = "msgpack-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8"}, + {file = "msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd"}, + {file = "msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325"}, + {file = "msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e"}, ] [[package]] name = "multidict" -version = "6.0.5" +version = "6.1.0" description = "multidict implementation" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, - {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, - {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, - {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, - {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, - {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, - {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, - {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, - {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, - {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, - {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, - {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, - {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, - {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, - {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, - {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, - {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, - {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, - {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, - {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, - {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, - {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, - {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, - {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, - {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, - {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, - {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, - {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, - {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, - {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, - {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, - {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, - {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, -] + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} [[package]] name = "mypy" @@ -3408,13 +3439,13 @@ files = [ [[package]] name = "narwhals" -version = "1.6.2" +version = "1.8.4" description = "Extremely lightweight compatibility layer between dataframe libraries" optional = false python-versions = ">=3.8" files = [ - {file = "narwhals-1.6.2-py3-none-any.whl", hash = "sha256:f236fe14300dd85d877a8c05eb861805e2e0076c14b1d24af66d02fa98c245b6"}, - {file = "narwhals-1.6.2.tar.gz", hash = "sha256:caee5b13a62740787fa69fc7f13fb119e0d36a7a1f8797a70c2ec19bcecc0b5a"}, + {file = "narwhals-1.8.4-py3-none-any.whl", hash = "sha256:ccd1df55542d4406db3190ec9e98b181b19cd85a8a7eaf98472fb7b9a9b3b260"}, + {file = "narwhals-1.8.4.tar.gz", hash = "sha256:d5f018895f4e8209d91726a4598c73d05fbfa4c7a4c4a6fc0fba9715dc88730e"}, ] [package.extras] @@ -4103,19 +4134,19 @@ files = [ [[package]] name = "platformdirs" -version = "4.3.1" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.3.1-py3-none-any.whl", hash = "sha256:facaa5a3c57aa1e053e3da7b49e0cc31fe0113ca42a4659d5c2e98e545624afe"}, - {file = "platformdirs-4.3.1.tar.gz", hash = "sha256:63b79589009fa8159973601dd4563143396b35c5f93a58b36f9049ff046949b1"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" @@ -4134,19 +4165,20 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "poethepoet" -version = "0.28.0" +version = "0.29.0" description = "A task runner that works well with poetry." optional = false python-versions = ">=3.8" files = [ - {file = "poethepoet-0.28.0-py3-none-any.whl", hash = "sha256:db6946ff39a1244235950cd720ee7182107f64126d3dcc64c9a996cc4d755404"}, - {file = "poethepoet-0.28.0.tar.gz", hash = "sha256:5dc3ee036ab0c93e918b5caed628274618b07d788e5cff6c4ae480913cbe009c"}, + {file = "poethepoet-0.29.0-py3-none-any.whl", hash = "sha256:f8dfe55006dcfb5cf31bcb1904e1262e1c642a4502fee3688cbf1bddfe5c7601"}, + {file = "poethepoet-0.29.0.tar.gz", hash = "sha256:676842302f2304a86b31ac56398dd672fae8471128d2086896393384dbafc095"}, ] [package.dependencies] pastel = ">=0.2.1,<0.3.0" poetry = {version = ">=1.0,<2.0", optional = true, markers = "extra == \"poetry-plugin\""} -tomli = ">=1.2.2" +pyyaml = ">=6.0.2,<7.0.0" +tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} [package.extras] poetry-plugin = ["poetry (>=1.0,<2.0)"] @@ -4216,13 +4248,13 @@ poetry-core = ">=1.7.0,<3.0.0" [[package]] name = "prometheus-client" -version = "0.20.0" +version = "0.21.0" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, - {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, + {file = "prometheus_client-0.21.0-py3-none-any.whl", hash = "sha256:4fa6b4dd0ac16d58bb587c04b1caae65b8c5043e85f778f42f5f632f6af2e166"}, + {file = "prometheus_client-0.21.0.tar.gz", hash = "sha256:96c83c606b71ff2b0a433c98889d275f51ffec6c5e267de37c7a2b5c9aa9233e"}, ] [package.extras] @@ -4230,13 +4262,13 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.47" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, - {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] @@ -4244,22 +4276,22 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "4.25.4" +version = "4.25.5" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.4-cp310-abi3-win32.whl", hash = "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4"}, - {file = "protobuf-4.25.4-cp310-abi3-win_amd64.whl", hash = "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d"}, - {file = "protobuf-4.25.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b"}, - {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835"}, - {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040"}, - {file = "protobuf-4.25.4-cp38-cp38-win32.whl", hash = "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1"}, - {file = "protobuf-4.25.4-cp38-cp38-win_amd64.whl", hash = "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1"}, - {file = "protobuf-4.25.4-cp39-cp39-win32.whl", hash = "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca"}, - {file = "protobuf-4.25.4-cp39-cp39-win_amd64.whl", hash = "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f"}, - {file = "protobuf-4.25.4-py3-none-any.whl", hash = "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978"}, - {file = "protobuf-4.25.4.tar.gz", hash = "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d"}, + {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, + {file = "protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea"}, + {file = "protobuf-4.25.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331"}, + {file = "protobuf-4.25.5-cp38-cp38-win32.whl", hash = "sha256:98d8d8aa50de6a2747efd9cceba361c9034050ecce3e09136f90de37ddba66e1"}, + {file = "protobuf-4.25.5-cp38-cp38-win_amd64.whl", hash = "sha256:b0234dd5a03049e4ddd94b93400b67803c823cfc405689688f59b34e0742381a"}, + {file = "protobuf-4.25.5-cp39-cp39-win32.whl", hash = "sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f"}, + {file = "protobuf-4.25.5-cp39-cp39-win_amd64.whl", hash = "sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45"}, + {file = "protobuf-4.25.5-py3-none-any.whl", hash = "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41"}, + {file = "protobuf-4.25.5.tar.gz", hash = "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584"}, ] [[package]] @@ -4379,13 +4411,13 @@ test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] [[package]] name = "pyasn1" -version = "0.6.0" +version = "0.6.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false python-versions = ">=3.8" files = [ - {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, - {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, ] [[package]] @@ -4412,123 +4444,123 @@ files = [ [[package]] name = "pydantic" -version = "2.9.0" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.0-py3-none-any.whl", hash = "sha256:f66a7073abd93214a20c5f7b32d56843137a7a2e70d02111f3be287035c45370"}, - {file = "pydantic-2.9.0.tar.gz", hash = "sha256:c7a8a9fdf7d100afa49647eae340e2d23efa382466a8d177efcd1381e9be5598"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.23.2" +annotated-types = ">=0.6.0" +pydantic-core = "2.23.4" typing-extensions = [ {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, ] -tzdata = {version = "*", markers = "python_version >= \"3.9\""} [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.2" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7d0324a35ab436c9d768753cbc3c47a865a2cbc0757066cb864747baa61f6ece"}, - {file = "pydantic_core-2.23.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:276ae78153a94b664e700ac362587c73b84399bd1145e135287513442e7dfbc7"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:964c7aa318da542cdcc60d4a648377ffe1a2ef0eb1e996026c7f74507b720a78"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1cf842265a3a820ebc6388b963ead065f5ce8f2068ac4e1c713ef77a67b71f7c"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae90b9e50fe1bd115b24785e962b51130340408156d34d67b5f8f3fa6540938e"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ae65fdfb8a841556b52935dfd4c3f79132dc5253b12c0061b96415208f4d622"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c8aa40f6ca803f95b1c1c5aeaee6237b9e879e4dfb46ad713229a63651a95fb"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c53100c8ee5a1e102766abde2158077d8c374bee0639201f11d3032e3555dfbc"}, - {file = "pydantic_core-2.23.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6b9dd6aa03c812017411734e496c44fef29b43dba1e3dd1fa7361bbacfc1354"}, - {file = "pydantic_core-2.23.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b18cf68255a476b927910c6873d9ed00da692bb293c5b10b282bd48a0afe3ae2"}, - {file = "pydantic_core-2.23.2-cp310-none-win32.whl", hash = "sha256:e460475719721d59cd54a350c1f71c797c763212c836bf48585478c5514d2854"}, - {file = "pydantic_core-2.23.2-cp310-none-win_amd64.whl", hash = "sha256:5f3cf3721eaf8741cffaf092487f1ca80831202ce91672776b02b875580e174a"}, - {file = "pydantic_core-2.23.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7ce8e26b86a91e305858e018afc7a6e932f17428b1eaa60154bd1f7ee888b5f8"}, - {file = "pydantic_core-2.23.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e9b24cca4037a561422bf5dc52b38d390fb61f7bfff64053ce1b72f6938e6b2"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753294d42fb072aa1775bfe1a2ba1012427376718fa4c72de52005a3d2a22178"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:257d6a410a0d8aeb50b4283dea39bb79b14303e0fab0f2b9d617701331ed1515"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8319e0bd6a7b45ad76166cc3d5d6a36c97d0c82a196f478c3ee5346566eebfd"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a05c0240f6c711eb381ac392de987ee974fa9336071fb697768dfdb151345ce"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d5b0ff3218858859910295df6953d7bafac3a48d5cd18f4e3ed9999efd2245f"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:96ef39add33ff58cd4c112cbac076726b96b98bb8f1e7f7595288dcfb2f10b57"}, - {file = "pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0102e49ac7d2df3379ef8d658d3bc59d3d769b0bdb17da189b75efa861fc07b4"}, - {file = "pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a6612c2a844043e4d10a8324c54cdff0042c558eef30bd705770793d70b224aa"}, - {file = "pydantic_core-2.23.2-cp311-none-win32.whl", hash = "sha256:caffda619099cfd4f63d48462f6aadbecee3ad9603b4b88b60cb821c1b258576"}, - {file = "pydantic_core-2.23.2-cp311-none-win_amd64.whl", hash = "sha256:6f80fba4af0cb1d2344869d56430e304a51396b70d46b91a55ed4959993c0589"}, - {file = "pydantic_core-2.23.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c83c64d05ffbbe12d4e8498ab72bdb05bcc1026340a4a597dc647a13c1605ec"}, - {file = "pydantic_core-2.23.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6294907eaaccf71c076abdd1c7954e272efa39bb043161b4b8aa1cd76a16ce43"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a801c5e1e13272e0909c520708122496647d1279d252c9e6e07dac216accc41"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cc0c316fba3ce72ac3ab7902a888b9dc4979162d320823679da270c2d9ad0cad"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b06c5d4e8701ac2ba99a2ef835e4e1b187d41095a9c619c5b185c9068ed2a49"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82764c0bd697159fe9947ad59b6db6d7329e88505c8f98990eb07e84cc0a5d81"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b1a195efd347ede8bcf723e932300292eb13a9d2a3c1f84eb8f37cbbc905b7f"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7efb12e5071ad8d5b547487bdad489fbd4a5a35a0fc36a1941517a6ad7f23e0"}, - {file = "pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5dd0ec5f514ed40e49bf961d49cf1bc2c72e9b50f29a163b2cc9030c6742aa73"}, - {file = "pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:820f6ee5c06bc868335e3b6e42d7ef41f50dfb3ea32fbd523ab679d10d8741c0"}, - {file = "pydantic_core-2.23.2-cp312-none-win32.whl", hash = "sha256:3713dc093d5048bfaedbba7a8dbc53e74c44a140d45ede020dc347dda18daf3f"}, - {file = "pydantic_core-2.23.2-cp312-none-win_amd64.whl", hash = "sha256:e1895e949f8849bc2757c0dbac28422a04be031204df46a56ab34bcf98507342"}, - {file = "pydantic_core-2.23.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:da43cbe593e3c87d07108d0ebd73771dc414488f1f91ed2e204b0370b94b37ac"}, - {file = "pydantic_core-2.23.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:64d094ea1aa97c6ded4748d40886076a931a8bf6f61b6e43e4a1041769c39dd2"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084414ffe9a85a52940b49631321d636dadf3576c30259607b75516d131fecd0"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:043ef8469f72609c4c3a5e06a07a1f713d53df4d53112c6d49207c0bd3c3bd9b"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3649bd3ae6a8ebea7dc381afb7f3c6db237fc7cebd05c8ac36ca8a4187b03b30"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6db09153d8438425e98cdc9a289c5fade04a5d2128faff8f227c459da21b9703"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5668b3173bb0b2e65020b60d83f5910a7224027232c9f5dc05a71a1deac9f960"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c7b81beaf7c7ebde978377dc53679c6cba0e946426fc7ade54251dfe24a7604"}, - {file = "pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:ae579143826c6f05a361d9546446c432a165ecf1c0b720bbfd81152645cb897d"}, - {file = "pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:19f1352fe4b248cae22a89268720fc74e83f008057a652894f08fa931e77dced"}, - {file = "pydantic_core-2.23.2-cp313-none-win32.whl", hash = "sha256:e1a79ad49f346aa1a2921f31e8dbbab4d64484823e813a002679eaa46cba39e1"}, - {file = "pydantic_core-2.23.2-cp313-none-win_amd64.whl", hash = "sha256:582871902e1902b3c8e9b2c347f32a792a07094110c1bca6c2ea89b90150caac"}, - {file = "pydantic_core-2.23.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:743e5811b0c377eb830150d675b0847a74a44d4ad5ab8845923d5b3a756d8100"}, - {file = "pydantic_core-2.23.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6650a7bbe17a2717167e3e23c186849bae5cef35d38949549f1c116031b2b3aa"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56e6a12ec8d7679f41b3750ffa426d22b44ef97be226a9bab00a03365f217b2b"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:810ca06cca91de9107718dc83d9ac4d2e86efd6c02cba49a190abcaf33fb0472"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:785e7f517ebb9890813d31cb5d328fa5eda825bb205065cde760b3150e4de1f7"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ef71ec876fcc4d3bbf2ae81961959e8d62f8d74a83d116668409c224012e3af"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d50ac34835c6a4a0d456b5db559b82047403c4317b3bc73b3455fefdbdc54b0a"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16b25a4a120a2bb7dab51b81e3d9f3cde4f9a4456566c403ed29ac81bf49744f"}, - {file = "pydantic_core-2.23.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:41ae8537ad371ec018e3c5da0eb3f3e40ee1011eb9be1da7f965357c4623c501"}, - {file = "pydantic_core-2.23.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07049ec9306ec64e955b2e7c40c8d77dd78ea89adb97a2013d0b6e055c5ee4c5"}, - {file = "pydantic_core-2.23.2-cp38-none-win32.whl", hash = "sha256:086c5db95157dc84c63ff9d96ebb8856f47ce113c86b61065a066f8efbe80acf"}, - {file = "pydantic_core-2.23.2-cp38-none-win_amd64.whl", hash = "sha256:67b6655311b00581914aba481729971b88bb8bc7996206590700a3ac85e457b8"}, - {file = "pydantic_core-2.23.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:358331e21a897151e54d58e08d0219acf98ebb14c567267a87e971f3d2a3be59"}, - {file = "pydantic_core-2.23.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c4d9f15ffe68bcd3898b0ad7233af01b15c57d91cd1667f8d868e0eacbfe3f87"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0123655fedacf035ab10c23450163c2f65a4174f2bb034b188240a6cf06bb123"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6e3ccebdbd6e53474b0bb7ab8b88e83c0cfe91484b25e058e581348ee5a01a5"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc535cb898ef88333cf317777ecdfe0faac1c2a3187ef7eb061b6f7ecf7e6bae"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aab9e522efff3993a9e98ab14263d4e20211e62da088298089a03056980a3e69"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05b366fb8fe3d8683b11ac35fa08947d7b92be78ec64e3277d03bd7f9b7cda79"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7568f682c06f10f30ef643a1e8eec4afeecdafde5c4af1b574c6df079e96f96c"}, - {file = "pydantic_core-2.23.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cdd02a08205dc90238669f082747612cb3c82bd2c717adc60f9b9ecadb540f80"}, - {file = "pydantic_core-2.23.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a2ab4f410f4b886de53b6bddf5dd6f337915a29dd9f22f20f3099659536b2f6"}, - {file = "pydantic_core-2.23.2-cp39-none-win32.whl", hash = "sha256:0448b81c3dfcde439551bb04a9f41d7627f676b12701865c8a2574bcea034437"}, - {file = "pydantic_core-2.23.2-cp39-none-win_amd64.whl", hash = "sha256:4cebb9794f67266d65e7e4cbe5dcf063e29fc7b81c79dc9475bd476d9534150e"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e758d271ed0286d146cf7c04c539a5169a888dd0b57026be621547e756af55bc"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f477d26183e94eaafc60b983ab25af2a809a1b48ce4debb57b343f671b7a90b6"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da3131ef2b940b99106f29dfbc30d9505643f766704e14c5d5e504e6a480c35e"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329a721253c7e4cbd7aad4a377745fbcc0607f9d72a3cc2102dd40519be75ed2"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7706e15cdbf42f8fab1e6425247dfa98f4a6f8c63746c995d6a2017f78e619ae"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e64ffaf8f6e17ca15eb48344d86a7a741454526f3a3fa56bc493ad9d7ec63936"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dd59638025160056687d598b054b64a79183f8065eae0d3f5ca523cde9943940"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:12625e69b1199e94b0ae1c9a95d000484ce9f0182f9965a26572f054b1537e44"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d813fd871b3d5c3005157622ee102e8908ad6011ec915a18bd8fde673c4360e"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1eb37f7d6a8001c0f86dc8ff2ee8d08291a536d76e49e78cda8587bb54d8b329"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ce7eaf9a98680b4312b7cebcdd9352531c43db00fca586115845df388f3c465"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f087879f1ffde024dd2788a30d55acd67959dcf6c431e9d3682d1c491a0eb474"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ce883906810b4c3bd90e0ada1f9e808d9ecf1c5f0b60c6b8831d6100bcc7dd6"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a8031074a397a5925d06b590121f8339d34a5a74cfe6970f8a1124eb8b83f4ac"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:23af245b8f2f4ee9e2c99cb3f93d0e22fb5c16df3f2f643f5a8da5caff12a653"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c57e493a0faea1e4c38f860d6862ba6832723396c884fbf938ff5e9b224200e2"}, - {file = "pydantic_core-2.23.2.tar.gz", hash = "sha256:95d6bf449a1ac81de562d65d180af5d8c19672793c81877a2eda8fde5d08f2fd"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -4607,61 +4639,70 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymongo" -version = "4.8.0" +version = "4.9.1" description = "Python driver for MongoDB " optional = true python-versions = ">=3.8" files = [ - {file = "pymongo-4.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2b7bec27e047e84947fbd41c782f07c54c30c76d14f3b8bf0c89f7413fac67a"}, - {file = "pymongo-4.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c68fe128a171493018ca5c8020fc08675be130d012b7ab3efe9e22698c612a1"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:920d4f8f157a71b3cb3f39bc09ce070693d6e9648fb0e30d00e2657d1dca4e49"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52b4108ac9469febba18cea50db972605cc43978bedaa9fea413378877560ef8"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:180d5eb1dc28b62853e2f88017775c4500b07548ed28c0bd9c005c3d7bc52526"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aec2b9088cdbceb87e6ca9c639d0ff9b9d083594dda5ca5d3c4f6774f4c81b33"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0cf61450feadca81deb1a1489cb1a3ae1e4266efd51adafecec0e503a8dcd84"}, - {file = "pymongo-4.8.0-cp310-cp310-win32.whl", hash = "sha256:8b18c8324809539c79bd6544d00e0607e98ff833ca21953df001510ca25915d1"}, - {file = "pymongo-4.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e5df28f74002e37bcbdfdc5109799f670e4dfef0fb527c391ff84f078050e7b5"}, - {file = "pymongo-4.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b50040d9767197b77ed420ada29b3bf18a638f9552d80f2da817b7c4a4c9c68"}, - {file = "pymongo-4.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:417369ce39af2b7c2a9c7152c1ed2393edfd1cbaf2a356ba31eb8bcbd5c98dd7"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf821bd3befb993a6db17229a2c60c1550e957de02a6ff4dd0af9476637b2e4d"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9365166aa801c63dff1a3cb96e650be270da06e3464ab106727223123405510f"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc8b8582f4209c2459b04b049ac03c72c618e011d3caa5391ff86d1bda0cc486"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e5019f75f6827bb5354b6fef8dfc9d6c7446894a27346e03134d290eb9e758"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b5802151fc2b51cd45492c80ed22b441d20090fb76d1fd53cd7760b340ff554"}, - {file = "pymongo-4.8.0-cp311-cp311-win32.whl", hash = "sha256:4bf58e6825b93da63e499d1a58de7de563c31e575908d4e24876234ccb910eba"}, - {file = "pymongo-4.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:b747c0e257b9d3e6495a018309b9e0c93b7f0d65271d1d62e572747f4ffafc88"}, - {file = "pymongo-4.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e6a720a3d22b54183352dc65f08cd1547204d263e0651b213a0a2e577e838526"}, - {file = "pymongo-4.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:31e4d21201bdf15064cf47ce7b74722d3e1aea2597c6785882244a3bb58c7eab"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b804bb4f2d9dc389cc9e827d579fa327272cdb0629a99bfe5b83cb3e269ebf"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fbdb87fe5075c8beb17a5c16348a1ea3c8b282a5cb72d173330be2fecf22f5"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd39455b7ee70aabee46f7399b32ab38b86b236c069ae559e22be6b46b2bbfc4"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940d456774b17814bac5ea7fc28188c7a1338d4a233efbb6ba01de957bded2e8"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:236bbd7d0aef62e64caf4b24ca200f8c8670d1a6f5ea828c39eccdae423bc2b2"}, - {file = "pymongo-4.8.0-cp312-cp312-win32.whl", hash = "sha256:47ec8c3f0a7b2212dbc9be08d3bf17bc89abd211901093e3ef3f2adea7de7a69"}, - {file = "pymongo-4.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e84bc7707492f06fbc37a9f215374d2977d21b72e10a67f1b31893ec5a140ad8"}, - {file = "pymongo-4.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:519d1bab2b5e5218c64340b57d555d89c3f6c9d717cecbf826fb9d42415e7750"}, - {file = "pymongo-4.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87075a1feb1e602e539bdb1ef8f4324a3427eb0d64208c3182e677d2c0718b6f"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f53429515d2b3e86dcc83dadecf7ff881e538c168d575f3688698a8707b80a"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdc20cd1e1141b04696ffcdb7c71e8a4a665db31fe72e51ec706b3bdd2d09f36"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:284d0717d1a7707744018b0b6ee7801b1b1ff044c42f7be7a01bb013de639470"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5bf0eb8b6ef40fa22479f09375468c33bebb7fe49d14d9c96c8fd50355188b0"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ecd71b9226bd1d49416dc9f999772038e56f415a713be51bf18d8676a0841c8"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0061af6e8c5e68b13f1ec9ad5251247726653c5af3c0bbdfbca6cf931e99216"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:658d0170f27984e0d89c09fe5c42296613b711a3ffd847eb373b0dbb5b648d5f"}, - {file = "pymongo-4.8.0-cp38-cp38-win32.whl", hash = "sha256:3ed1c316718a2836f7efc3d75b4b0ffdd47894090bc697de8385acd13c513a70"}, - {file = "pymongo-4.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:7148419eedfea9ecb940961cfe465efaba90595568a1fb97585fb535ea63fe2b"}, - {file = "pymongo-4.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8400587d594761e5136a3423111f499574be5fd53cf0aefa0d0f05b180710b0"}, - {file = "pymongo-4.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af3e98dd9702b73e4e6fd780f6925352237f5dce8d99405ff1543f3771201704"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de3a860f037bb51f968de320baef85090ff0bbb42ec4f28ec6a5ddf88be61871"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fc18b3a093f3db008c5fea0e980dbd3b743449eee29b5718bc2dc15ab5088bb"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18c9d8f975dd7194c37193583fd7d1eb9aea0c21ee58955ecf35362239ff31ac"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:408b2f8fdbeca3c19e4156f28fff1ab11c3efb0407b60687162d49f68075e63c"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6564780cafd6abeea49759fe661792bd5a67e4f51bca62b88faab497ab5fe89"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d18d86bc9e103f4d3d4f18b85a0471c0e13ce5b79194e4a0389a224bb70edd53"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9097c331577cecf8034422956daaba7ec74c26f7b255d718c584faddd7fa2e3c"}, - {file = "pymongo-4.8.0-cp39-cp39-win32.whl", hash = "sha256:d5428dbcd43d02f6306e1c3c95f692f68b284e6ee5390292242f509004c9e3a8"}, - {file = "pymongo-4.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:ef7225755ed27bfdb18730c68f6cb023d06c28f2b734597480fb4c0e500feb6f"}, - {file = "pymongo-4.8.0.tar.gz", hash = "sha256:454f2295875744dc70f1881e4b2eb99cdad008a33574bc8aaf120530f66c0cde"}, + {file = "pymongo-4.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dc3d070d746ab79e9b393a5c236df20e56607389af2b79bf1bfe9a841117558e"}, + {file = "pymongo-4.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fe709d05654c12fc513617c8d5c8d05b7e9cf1d5d94ada68add4e89530c867d2"}, + {file = "pymongo-4.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa4493f304b33c5d2ecee3055c98889ac6724d56f5f922d47420a45d0d4099c9"}, + {file = "pymongo-4.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8e8b8deba6a4bff3dd5421071083219521c74d2acae0322de5c06f1a66c56af"}, + {file = "pymongo-4.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3645aff8419ca60f9ccd08966b2f6b0d78053f9f98a814d025426f1d874c19a"}, + {file = "pymongo-4.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51dbc6251c6783dfcc7d657c346986d8bad7210989b2fe15de16db5204a8e7ae"}, + {file = "pymongo-4.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d7aa9cc2d92e73bdb036c578ba019da94ea165eb147e691cd910a6fab7ce3b7"}, + {file = "pymongo-4.9.1-cp310-cp310-win32.whl", hash = "sha256:8b632e01617f2608880f7b9926f54a5f5ebb51631996e0540fff7fc7980663c9"}, + {file = "pymongo-4.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:f05e34d401be871d7c87cb10727d49315444e4ded07ff876a595e4c23b7436da"}, + {file = "pymongo-4.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6bb3d5282278594753089dc7da48bfae4a7f337a2dd4d397eabb591c649e58d0"}, + {file = "pymongo-4.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f0d5258bc85a4e6b5bcae8160628168e71ec4625a58ceb53327c3280a0b6914"}, + {file = "pymongo-4.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96462fb2175f740701d229f52018ea6e4adc4148c4112e6628bb359dd534a3df"}, + {file = "pymongo-4.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:286fb275267f0293364ba579f6354452599161f1902ad411061c7f744ab88328"}, + {file = "pymongo-4.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cddb51cead9700c4dccc916952bc0321b8d766bf782d374bfa0e93ef47c1d20"}, + {file = "pymongo-4.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d79f20f9c7cbc1c708fb80b648b6fbd3220fd3437a9bd6017c1eb592e03b361"}, + {file = "pymongo-4.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd3352eaf578f8e9bdea7a5692910eedad1e8680f60726fc70e99c8af51a5449"}, + {file = "pymongo-4.9.1-cp311-cp311-win32.whl", hash = "sha256:ea3f0196e7c311b9944a609ac175bd91ab97952164a1246716fdd38d53ca3bcc"}, + {file = "pymongo-4.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:b4c793db8457c856f333f396798470b9bfe405e17c307d581532c74cec70150c"}, + {file = "pymongo-4.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:47b4896544095d172c366dd4d4ea1da6b0ab1a77d8416897cc1801e2421b1e67"}, + {file = "pymongo-4.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fbb1c7dfcf6c44e9e1928290631c7603817991cdf570691c9e15fca594918435"}, + {file = "pymongo-4.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7689da1d1b444284e4ea9ab2eb64a15307b6b795918c0f3cd7774dd1d8a7556"}, + {file = "pymongo-4.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f962d74201c772555f7a78792fed820a5ea76db5c7ee6cf43748e411b44e430"}, + {file = "pymongo-4.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08fbab69f3fb6f8088c81f4c4a8abd84a99c132034f5e27e47f894bbcb6bf439"}, + {file = "pymongo-4.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4327c0d9bd616b8289691360f2d4a09a72fe35479795832eae0d4ff78af53923"}, + {file = "pymongo-4.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34e4993ae78be56f9e27a141168a1ab78253576fa3e893fa335a719ce204c3ef"}, + {file = "pymongo-4.9.1-cp312-cp312-win32.whl", hash = "sha256:e1f346811d4a2369f88ab7a6f886fa9c3bbc9ed4e4f4a3becca8717a73d465cb"}, + {file = "pymongo-4.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:a2b12c74cfd90147babb77f9728646bcedfdbd2bd2a5b4130a00e3a0af1a3d34"}, + {file = "pymongo-4.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a40ea8bc9cffb61c5c9c426c430d22235e085e610ee81ae075ddf51f12f76236"}, + {file = "pymongo-4.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:75d5974f874acdb2f125bdbe785045b23a39ecce1d3143dd5712800c7b6d25eb"}, + {file = "pymongo-4.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f23a046531030318622414f21198e232cf93c5640da9a80b45596a059c8cc090"}, + {file = "pymongo-4.9.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91b1a92214c3912af5467f77c2f6435cd76f6de64c70cba7bb4ee43eba7f459e"}, + {file = "pymongo-4.9.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a846423c4535428f69a90a1451df3718bc59f0c4ab685b9e96d3071951e0be4"}, + {file = "pymongo-4.9.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d476d91a5c9e6c37bc8ec3fb294e1c01d95736ccf01a59bb1540fe2f710f826e"}, + {file = "pymongo-4.9.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:172d8ba0f567e351a18765db23dab7dbcfdffd91a8788d90d46b350f80a40781"}, + {file = "pymongo-4.9.1-cp313-cp313-win32.whl", hash = "sha256:95418e334629440f70fe5ceeefc6cbbd50defb566901c8d68179ffbaec8d5f01"}, + {file = "pymongo-4.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:1dfd2aa30174d36a3ef1dae4ee4c89710c2d65cac52ce6e13f17c710edbd61cf"}, + {file = "pymongo-4.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c4204fad54830a3173a5c939cd052d0561fba03dba7e0ff6852fd631f3314aa4"}, + {file = "pymongo-4.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:375765ec81b1f0a26d08928afea0c3dff897c36080a090be53fc7b70cc51d497"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d1b959a3dda0775d9111622ee47ad47772aed3a9da2e7d5f2f513fa68175dea"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42c19d2b094cdd0ead7dbb38860bbe8268c140334ce55d8b39204ddb4ebd4904"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1fac1def9e9073f1c80198c99f0ec39c2528236c8912d96d7fd3b0237f4c523a"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b347052d510989d1f52b8553b31297f21cf74bd9f6aed71ee84e563492f4ff17"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b4b961fce213f2bcdc92268f85111a3668c61b9b4d4e7ece27dce3a137cfcbd"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0b10cf51ec14a487c94709d294c00e1fb6a0a4c38cdc3acfb2ced5ef60972a0"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:679b8d55854da7c7fdb82aa5e092ab4de0144daf6758defed8ab00ff9ce05360"}, + {file = "pymongo-4.9.1-cp38-cp38-win32.whl", hash = "sha256:432ad395d2233056b042ccc73234e7136aa65d944d6bd8b5138394bd38aaff79"}, + {file = "pymongo-4.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:9fbe9fad27619ac4cfda5df0ade26a99906da7dfe7b01deddc25997eb1804e4c"}, + {file = "pymongo-4.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:99b611ff75b5d9e17183dcf9584a7b04f9db07e51a162f23ea05e485e0735c0a"}, + {file = "pymongo-4.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8089003a99127f917bdbeec177d41cef019cda8ec70534c1018cb60aacd23c2a"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d78adf25967c06298c7e488f4cfab79a390fc32c2b1d428613976f99031603d"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56877cfcdf7dfc5c6408e4551ec0d6d65ebbca4d744a0bc90400f09ef6bbcc8a"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d2efe559d0d96bc0b74b3ff76701ad6f6e1a65f6581b573dcacc29158131c8"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f838f613e74b4dad8ace0d90f42346005bece4eda5bf6d389cfadb8322d39316"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db5b299e11284f8d82ce2983d8e19fcc28f98f902a179709ef1982b4cca6f8b8"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b23211c031b45d0f32de83ab7d77f9c26f1025c2d2c91463a5d8594a16103655"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:687cf70e096381bc65b4273a6a9319617618f7ace65caffc356e1099c4a68511"}, + {file = "pymongo-4.9.1-cp39-cp39-win32.whl", hash = "sha256:e02b03e3815b80a63e773e4c32aed3cf5633d406f376477be74550295c211256"}, + {file = "pymongo-4.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:0492ef43f3342354cf581712e431621c221f60c877ebded84e3f3e53b71bbbe0"}, + {file = "pymongo-4.9.1.tar.gz", hash = "sha256:b7f2d34390acf60e229c30037d1473fcf69f4536cd7f48f6f78c0c931c61c505"}, ] [package.dependencies] @@ -4669,12 +4710,12 @@ dnspython = ">=1.16.0,<3.0.0" [package.extras] aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"] -docs = ["furo (==2023.9.10)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<8)", "sphinx-rtd-theme (>=2,<3)", "sphinxcontrib-shellcheck (>=1,<2)"] -encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.6.0,<2.0.0)"] +docs = ["furo (==2023.9.10)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<8)", "sphinx-autobuild (>=2020.9.1)", "sphinx-rtd-theme (>=2,<3)", "sphinxcontrib-shellcheck (>=1,<2)"] +encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.10.0,<2.0.0)"] gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] snappy = ["python-snappy"] -test = ["pytest (>=7)"] +test = ["pytest (>=8.2)", "pytest-asyncio (>=0.24.0)"] zstd = ["zstandard"] [[package]] @@ -4704,13 +4745,13 @@ files = [ [[package]] name = "pytest" -version = "8.3.2" +version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, - {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] @@ -4883,13 +4924,13 @@ test = ["pytest"] [[package]] name = "python-telegram-bot" -version = "21.5" +version = "21.6" description = "We have made you a wrapper you can't refuse" optional = true python-versions = ">=3.8" files = [ - {file = "python_telegram_bot-21.5-py3-none-any.whl", hash = "sha256:1bbba653477ba164411622b717a0cfe1eb7843da016348e41df97f96c93f578e"}, - {file = "python_telegram_bot-21.5.tar.gz", hash = "sha256:2d679173072cce8d6b49aac2e438d49dbfc01c1a4ef5658828c2a65951ee830b"}, + {file = "python_telegram_bot-21.6-py3-none-any.whl", hash = "sha256:f2d6431bf154a53f40cdfc6c1d492a66102c0e4938709f6d8202bcd951c840cb"}, + {file = "python_telegram_bot-21.6.tar.gz", hash = "sha256:8b2b37836c3ff9c2924e990474a1c4731df21b1668acebff5099f475666426c6"}, ] [package.dependencies] @@ -4919,13 +4960,13 @@ webhooks = ["tornado (>=6.4,<7.0)"] [[package]] name = "pytz" -version = "2024.1" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] @@ -5282,21 +5323,21 @@ full = ["numpy"] [[package]] name = "redis" -version = "5.0.8" +version = "5.1.0" description = "Python client for Redis database and key-value store" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, - {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, + {file = "redis-5.1.0-py3-none-any.whl", hash = "sha256:fd4fccba0d7f6aa48c58a78d76ddb4afc698f5da4a2c1d03d916e4fd7ab88cdd"}, + {file = "redis-5.1.0.tar.gz", hash = "sha256:b756df1e4a3858fcc0ef861f3fc53623a96c41e2b1f5304e09e0fe758d333d40"}, ] [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] -hiredis = ["hiredis (>1.0.0)"] -ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] +hiredis = ["hiredis (>=3.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"] [[package]] name = "referencing" @@ -5375,13 +5416,13 @@ files = [ [[package]] name = "rich" -version = "13.8.0" +version = "13.8.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.8.0-py3-none-any.whl", hash = "sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc"}, - {file = "rich-13.8.0.tar.gz", hash = "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4"}, + {file = "rich-13.8.1-py3-none-any.whl", hash = "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06"}, + {file = "rich-13.8.1.tar.gz", hash = "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a"}, ] [package.dependencies] @@ -5561,18 +5602,18 @@ win32 = ["pywin32"] [[package]] name = "setuptools" -version = "74.1.2" +version = "75.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-74.1.2-py3-none-any.whl", hash = "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308"}, - {file = "setuptools-74.1.2.tar.gz", hash = "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6"}, + {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, + {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, ] [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] @@ -5906,60 +5947,60 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "2.0.34" +version = "2.0.35" description = "Database Abstraction Library" optional = true python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d0b2cf8791ab5fb9e3aa3d9a79a0d5d51f55b6357eecf532a120ba3b5524db"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:243f92596f4fd4c8bd30ab8e8dd5965afe226363d75cab2468f2c707f64cd83b"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ea54f7300553af0a2a7235e9b85f4204e1fc21848f917a3213b0e0818de9a24"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173f5f122d2e1bff8fbd9f7811b7942bead1f5e9f371cdf9e670b327e6703ebd"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:196958cde924a00488e3e83ff917be3b73cd4ed8352bbc0f2989333176d1c54d"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd90c221ed4e60ac9d476db967f436cfcecbd4ef744537c0f2d5291439848768"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-win32.whl", hash = "sha256:3166dfff2d16fe9be3241ee60ece6fcb01cf8e74dd7c5e0b64f8e19fab44911b"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-win_amd64.whl", hash = "sha256:6831a78bbd3c40f909b3e5233f87341f12d0b34a58f14115c9e94b4cdaf726d3"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7db3db284a0edaebe87f8f6642c2b2c27ed85c3e70064b84d1c9e4ec06d5d84"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:430093fce0efc7941d911d34f75a70084f12f6ca5c15d19595c18753edb7c33b"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79cb400c360c7c210097b147c16a9e4c14688a6402445ac848f296ade6283bbc"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1b30f31a36c7f3fee848391ff77eebdd3af5750bf95fbf9b8b5323edfdb4ec"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fddde2368e777ea2a4891a3fb4341e910a056be0bb15303bf1b92f073b80c02"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80bd73ea335203b125cf1d8e50fef06be709619eb6ab9e7b891ea34b5baa2287"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-win32.whl", hash = "sha256:6daeb8382d0df526372abd9cb795c992e18eed25ef2c43afe518c73f8cccb721"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-win_amd64.whl", hash = "sha256:5bc08e75ed11693ecb648b7a0a4ed80da6d10845e44be0c98c03f2f880b68ff4"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:53e68b091492c8ed2bd0141e00ad3089bcc6bf0e6ec4142ad6505b4afe64163e"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcd18441a49499bf5528deaa9dee1f5c01ca491fc2791b13604e8f972877f812"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:165bbe0b376541092bf49542bd9827b048357f4623486096fc9aaa6d4e7c59a2"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3330415cd387d2b88600e8e26b510d0370db9b7eaf984354a43e19c40df2e2b"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97b850f73f8abbffb66ccbab6e55a195a0eb655e5dc74624d15cff4bfb35bd74"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee4c6917857fd6121ed84f56d1dc78eb1d0e87f845ab5a568aba73e78adf83"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-win32.whl", hash = "sha256:fbb034f565ecbe6c530dff948239377ba859420d146d5f62f0271407ffb8c580"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-win_amd64.whl", hash = "sha256:707c8f44931a4facd4149b52b75b80544a8d824162602b8cd2fe788207307f9a"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:24af3dc43568f3780b7e1e57c49b41d98b2d940c1fd2e62d65d3928b6f95f021"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60ed6ef0a35c6b76b7640fe452d0e47acc832ccbb8475de549a5cc5f90c2c06"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:413c85cd0177c23e32dee6898c67a5f49296640041d98fddb2c40888fe4daa2e"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:25691f4adfb9d5e796fd48bf1432272f95f4bbe5f89c475a788f31232ea6afba"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:526ce723265643dbc4c7efb54f56648cc30e7abe20f387d763364b3ce7506c82"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-win32.whl", hash = "sha256:13be2cc683b76977a700948411a94c67ad8faf542fa7da2a4b167f2244781cf3"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-win_amd64.whl", hash = "sha256:e54ef33ea80d464c3dcfe881eb00ad5921b60f8115ea1a30d781653edc2fd6a2"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43f28005141165edd11fbbf1541c920bd29e167b8bbc1fb410d4fe2269c1667a"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b68094b165a9e930aedef90725a8fcfafe9ef95370cbb54abc0464062dbf808f"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1e03db964e9d32f112bae36f0cc1dcd1988d096cfd75d6a588a3c3def9ab2b"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:203d46bddeaa7982f9c3cc693e5bc93db476ab5de9d4b4640d5c99ff219bee8c"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ae92bebca3b1e6bd203494e5ef919a60fb6dfe4d9a47ed2453211d3bd451b9f5"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9661268415f450c95f72f0ac1217cc6f10256f860eed85c2ae32e75b60278ad8"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-win32.whl", hash = "sha256:895184dfef8708e15f7516bd930bda7e50ead069280d2ce09ba11781b630a434"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-win_amd64.whl", hash = "sha256:6e7cde3a2221aa89247944cafb1b26616380e30c63e37ed19ff0bba5e968688d"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dbcdf987f3aceef9763b6d7b1fd3e4ee210ddd26cac421d78b3c206d07b2700b"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce119fc4ce0d64124d37f66a6f2a584fddc3c5001755f8a49f1ca0a177ef9796"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a17d8fac6df9835d8e2b4c5523666e7051d0897a93756518a1fe101c7f47f2f0"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ebc11c54c6ecdd07bb4efbfa1554538982f5432dfb8456958b6d46b9f834bb7"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e6965346fc1491a566e019a4a1d3dfc081ce7ac1a736536367ca305da6472a8"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:220574e78ad986aea8e81ac68821e47ea9202b7e44f251b7ed8c66d9ae3f4278"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-win32.whl", hash = "sha256:b75b00083e7fe6621ce13cfce9d4469c4774e55e8e9d38c305b37f13cf1e874c"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-win_amd64.whl", hash = "sha256:c29d03e0adf3cc1a8c3ec62d176824972ae29b67a66cbb18daff3062acc6faa8"}, - {file = "SQLAlchemy-2.0.34-py3-none-any.whl", hash = "sha256:7286c353ee6475613d8beff83167374006c6b3e3f0e6491bfe8ca610eb1dec0f"}, - {file = "sqlalchemy-2.0.34.tar.gz", hash = "sha256:10d8f36990dd929690666679b0f42235c159a7051534adb135728ee52828dd22"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67219632be22f14750f0d1c70e62f204ba69d28f62fd6432ba05ab295853de9b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4668bd8faf7e5b71c0319407b608f278f279668f358857dbfd10ef1954ac9f90"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8bea573863762bbf45d1e13f87c2d2fd32cee2dbd50d050f83f87429c9e1ea"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f552023710d4b93d8fb29a91fadf97de89c5926c6bd758897875435f2a939f33"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:016b2e665f778f13d3c438651dd4de244214b527a275e0acf1d44c05bc6026a9"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7befc148de64b6060937231cbff8d01ccf0bfd75aa26383ffdf8d82b12ec04ff"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win32.whl", hash = "sha256:22b83aed390e3099584b839b93f80a0f4a95ee7f48270c97c90acd40ee646f0b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win_amd64.whl", hash = "sha256:a29762cd3d116585278ffb2e5b8cc311fb095ea278b96feef28d0b423154858e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e21f66748ab725ade40fa7af8ec8b5019c68ab00b929f6643e1b1af461eddb60"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a6219108a15fc6d24de499d0d515c7235c617b2540d97116b663dade1a54d62"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042622a5306c23b972192283f4e22372da3b8ddf5f7aac1cc5d9c9b222ab3ff6"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:627dee0c280eea91aed87b20a1f849e9ae2fe719d52cbf847c0e0ea34464b3f7"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4fdcd72a789c1c31ed242fd8c1bcd9ea186a98ee8e5408a50e610edfef980d71"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89b64cd8898a3a6f642db4eb7b26d1b28a497d4022eccd7717ca066823e9fb01"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win32.whl", hash = "sha256:6a93c5a0dfe8d34951e8a6f499a9479ffb9258123551fa007fc708ae2ac2bc5e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win_amd64.whl", hash = "sha256:c68fe3fcde03920c46697585620135b4ecfdfc1ed23e75cc2c2ae9f8502c10b8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eb60b026d8ad0c97917cb81d3662d0b39b8ff1335e3fabb24984c6acd0c900a2"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6921ee01caf375363be5e9ae70d08ce7ca9d7e0e8983183080211a062d299468"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cdf1a0dbe5ced887a9b127da4ffd7354e9c1a3b9bb330dce84df6b70ccb3a8d"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a71c8601e823236ac0e5d087e4f397874a421017b3318fd92c0b14acf2b6db"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e04b622bb8a88f10e439084486f2f6349bf4d50605ac3e445869c7ea5cf0fa8c"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1b56961e2d31389aaadf4906d453859f35302b4eb818d34a26fab72596076bb8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win32.whl", hash = "sha256:0f9f3f9a3763b9c4deb8c5d09c4cc52ffe49f9876af41cc1b2ad0138878453cf"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win_amd64.whl", hash = "sha256:25b0f63e7fcc2a6290cb5f7f5b4fc4047843504983a28856ce9b35d8f7de03cc"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f021d334f2ca692523aaf7bbf7592ceff70c8594fad853416a81d66b35e3abf9"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05c3f58cf91683102f2f0265c0db3bd3892e9eedabe059720492dbaa4f922da1"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032d979ce77a6c2432653322ba4cbeabf5a6837f704d16fa38b5a05d8e21fa00"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:2e795c2f7d7249b75bb5f479b432a51b59041580d20599d4e112b5f2046437a3"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:cc32b2990fc34380ec2f6195f33a76b6cdaa9eecf09f0c9404b74fc120aef36f"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win32.whl", hash = "sha256:9509c4123491d0e63fb5e16199e09f8e262066e58903e84615c301dde8fa2e87"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win_amd64.whl", hash = "sha256:3655af10ebcc0f1e4e06c5900bb33e080d6a1fa4228f502121f28a3b1753cde5"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4c31943b61ed8fdd63dfd12ccc919f2bf95eefca133767db6fbbd15da62078ec"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a62dd5d7cc8626a3634208df458c5fe4f21200d96a74d122c83bc2015b333bc1"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0630774b0977804fba4b6bbea6852ab56c14965a2b0c7fc7282c5f7d90a1ae72"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d625eddf7efeba2abfd9c014a22c0f6b3796e0ffb48f5d5ab106568ef01ff5a"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ada603db10bb865bbe591939de854faf2c60f43c9b763e90f653224138f910d9"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c41411e192f8d3ea39ea70e0fae48762cd11a2244e03751a98bd3c0ca9a4e936"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win32.whl", hash = "sha256:d299797d75cd747e7797b1b41817111406b8b10a4f88b6e8fe5b5e59598b43b0"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win_amd64.whl", hash = "sha256:0375a141e1c0878103eb3d719eb6d5aa444b490c96f3fedab8471c7f6ffe70ee"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccae5de2a0140d8be6838c331604f91d6fafd0735dbdcee1ac78fc8fbaba76b4"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a275a806f73e849e1c309ac11108ea1a14cd7058577aba962cd7190e27c9e3c"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:732e026240cdd1c1b2e3ac515c7a23820430ed94292ce33806a95869c46bd139"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890da8cd1941fa3dab28c5bac3b9da8502e7e366f895b3b8e500896f12f94d11"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0d8326269dbf944b9201911b0d9f3dc524d64779a07518199a58384c3d37a44"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b76d63495b0508ab9fc23f8152bac63205d2a704cd009a2b0722f4c8e0cba8e0"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win32.whl", hash = "sha256:69683e02e8a9de37f17985905a5eca18ad651bf592314b4d3d799029797d0eb3"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win_amd64.whl", hash = "sha256:aee110e4ef3c528f3abbc3c2018c121e708938adeeff9006428dd7c8555e9b3f"}, + {file = "SQLAlchemy-2.0.35-py3-none-any.whl", hash = "sha256:2ab3f0336c0387662ce6221ad30ab3a5e6499aab01b9790879b6578fd9b8faa1"}, + {file = "sqlalchemy-2.0.35.tar.gz", hash = "sha256:e11d7ea4d24f0a262bccf9a7cd6284c976c5369dac21db237cff59586045ab9f"}, ] [package.dependencies] @@ -6027,13 +6068,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "starlette" -version = "0.38.4" +version = "0.38.6" description = "The little ASGI library that shines." optional = false python-versions = ">=3.8" files = [ - {file = "starlette-0.38.4-py3-none-any.whl", hash = "sha256:526f53a77f0e43b85f583438aee1a940fd84f8fd610353e8b0c1a77ad8a87e76"}, - {file = "starlette-0.38.4.tar.gz", hash = "sha256:53a7439060304a208fea17ed407e998f46da5e5d9b1addfea3040094512a6379"}, + {file = "starlette-0.38.6-py3-none-any.whl", hash = "sha256:4517a1409e2e73ee4951214ba012052b9e16f60e90d73cfb06192c19203bbb05"}, + {file = "starlette-0.38.6.tar.gz", hash = "sha256:863a1588f5574e70a821dadefb41e4881ea451a47a3cd1b4df359d4ffefe5ead"}, ] [package.dependencies] @@ -6094,12 +6135,12 @@ streamlit = ">=0.63" [[package]] name = "telethon" -version = "1.36.0" +version = "1.37.0" description = "Full-featured Telegram client library for Python 3" optional = false python-versions = ">=3.5" files = [ - {file = "Telethon-1.36.0.tar.gz", hash = "sha256:11db5c7ed7e37f1272d443fb7eea0f1db580d56c6949165233946fb323aaf3a7"}, + {file = "Telethon-1.37.0.tar.gz", hash = "sha256:e5e43cff1c1b34e2f9c2b395215beb6e9bda706b69def7efff4f55b23c9c4374"}, ] [package.dependencies] @@ -6267,13 +6308,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "trove-classifiers" -version = "2024.7.2" +version = "2024.9.12" description = "Canonical source for classifiers on PyPI (pypi.org)." optional = false python-versions = "*" files = [ - {file = "trove_classifiers-2024.7.2-py3-none-any.whl", hash = "sha256:ccc57a33717644df4daca018e7ec3ef57a835c48e96a1e71fc07eb7edac67af6"}, - {file = "trove_classifiers-2024.7.2.tar.gz", hash = "sha256:8328f2ac2ce3fd773cbb37c765a0ed7a83f89dc564c7d452f039b69249d0ac35"}, + {file = "trove_classifiers-2024.9.12-py3-none-any.whl", hash = "sha256:f88a27a892891c87c5f8bbdf110710ae9e0a4725ea8e0fb45f1bcadf088a491f"}, + {file = "trove_classifiers-2024.9.12.tar.gz", hash = "sha256:4b46b3e134a4d01999ac5bc6e528afcc10cc48f0f724f185f267e276005768f4"}, ] [[package]] @@ -6317,13 +6358,13 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] @@ -6376,13 +6417,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "uvicorn" -version = "0.30.6" +version = "0.31.0" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.30.6-py3-none-any.whl", hash = "sha256:65fd46fe3fda5bdc1b03b94eb634923ff18cd35b2f084813ea79d1f103f711b5"}, - {file = "uvicorn-0.30.6.tar.gz", hash = "sha256:4b15decdda1e72be08209e860a1e10e92439ad5b97cf44cc945fcbee66fc5788"}, + {file = "uvicorn-0.31.0-py3-none-any.whl", hash = "sha256:cac7be4dd4d891c363cd942160a7b02e69150dcbc7a36be04d5f4af4b17c8ced"}, + {file = "uvicorn-0.31.0.tar.gz", hash = "sha256:13bc21373d103859f68fe739608e2eb054a816dea79189bc3ca08ea89a275906"}, ] [package.dependencies] @@ -6395,13 +6436,13 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "virtualenv" -version = "20.26.4" +version = "20.26.6" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.26.4-py3-none-any.whl", hash = "sha256:48f2695d9809277003f30776d155615ffc11328e6a0a8c1f0ec80188d7874a55"}, - {file = "virtualenv-20.26.4.tar.gz", hash = "sha256:c17f4e0f3e6036e9f26700446f85c76ab11df65ff6d8a9cbfad9f71aabfcf23c"}, + {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, + {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, ] [package.dependencies] @@ -6515,97 +6556,97 @@ test = ["websockets"] [[package]] name = "websockets" -version = "13.0.1" +version = "13.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false python-versions = ">=3.8" files = [ - {file = "websockets-13.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1841c9082a3ba4a05ea824cf6d99570a6a2d8849ef0db16e9c826acb28089e8f"}, - {file = "websockets-13.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c5870b4a11b77e4caa3937142b650fbbc0914a3e07a0cf3131f35c0587489c1c"}, - {file = "websockets-13.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f1d3d1f2eb79fe7b0fb02e599b2bf76a7619c79300fc55f0b5e2d382881d4f7f"}, - {file = "websockets-13.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15c7d62ee071fa94a2fc52c2b472fed4af258d43f9030479d9c4a2de885fd543"}, - {file = "websockets-13.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6724b554b70d6195ba19650fef5759ef11346f946c07dbbe390e039bcaa7cc3d"}, - {file = "websockets-13.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a952fa2ae57a42ba7951e6b2605e08a24801a4931b5644dfc68939e041bc7f"}, - {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:17118647c0ea14796364299e942c330d72acc4b248e07e639d34b75067b3cdd8"}, - {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64a11aae1de4c178fa653b07d90f2fb1a2ed31919a5ea2361a38760192e1858b"}, - {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0617fd0b1d14309c7eab6ba5deae8a7179959861846cbc5cb528a7531c249448"}, - {file = "websockets-13.0.1-cp310-cp310-win32.whl", hash = "sha256:11f9976ecbc530248cf162e359a92f37b7b282de88d1d194f2167b5e7ad80ce3"}, - {file = "websockets-13.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c3c493d0e5141ec055a7d6809a28ac2b88d5b878bb22df8c621ebe79a61123d0"}, - {file = "websockets-13.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:699ba9dd6a926f82a277063603fc8d586b89f4cb128efc353b749b641fcddda7"}, - {file = "websockets-13.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf2fae6d85e5dc384bf846f8243ddaa9197f3a1a70044f59399af001fd1f51d4"}, - {file = "websockets-13.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:52aed6ef21a0f1a2a5e310fb5c42d7555e9c5855476bbd7173c3aa3d8a0302f2"}, - {file = "websockets-13.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eb2b9a318542153674c6e377eb8cb9ca0fc011c04475110d3477862f15d29f0"}, - {file = "websockets-13.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5df891c86fe68b2c38da55b7aea7095beca105933c697d719f3f45f4220a5e0e"}, - {file = "websockets-13.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac2d146ff30d9dd2fcf917e5d147db037a5c573f0446c564f16f1f94cf87462"}, - {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b8ac5b46fd798bbbf2ac6620e0437c36a202b08e1f827832c4bf050da081b501"}, - {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:46af561eba6f9b0848b2c9d2427086cabadf14e0abdd9fde9d72d447df268418"}, - {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b5a06d7f60bc2fc378a333978470dfc4e1415ee52f5f0fce4f7853eb10c1e9df"}, - {file = "websockets-13.0.1-cp311-cp311-win32.whl", hash = "sha256:556e70e4f69be1082e6ef26dcb70efcd08d1850f5d6c5f4f2bcb4e397e68f01f"}, - {file = "websockets-13.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:67494e95d6565bf395476e9d040037ff69c8b3fa356a886b21d8422ad86ae075"}, - {file = "websockets-13.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f9c9e258e3d5efe199ec23903f5da0eeaad58cf6fccb3547b74fd4750e5ac47a"}, - {file = "websockets-13.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6b41a1b3b561f1cba8321fb32987552a024a8f67f0d05f06fcf29f0090a1b956"}, - {file = "websockets-13.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f73e676a46b0fe9426612ce8caeca54c9073191a77c3e9d5c94697aef99296af"}, - {file = "websockets-13.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f613289f4a94142f914aafad6c6c87903de78eae1e140fa769a7385fb232fdf"}, - {file = "websockets-13.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f52504023b1480d458adf496dc1c9e9811df4ba4752f0bc1f89ae92f4f07d0c"}, - {file = "websockets-13.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:139add0f98206cb74109faf3611b7783ceafc928529c62b389917a037d4cfdf4"}, - {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:47236c13be337ef36546004ce8c5580f4b1150d9538b27bf8a5ad8edf23ccfab"}, - {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c44ca9ade59b2e376612df34e837013e2b273e6c92d7ed6636d0556b6f4db93d"}, - {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9bbc525f4be3e51b89b2a700f5746c2a6907d2e2ef4513a8daafc98198b92237"}, - {file = "websockets-13.0.1-cp312-cp312-win32.whl", hash = "sha256:3624fd8664f2577cf8de996db3250662e259bfbc870dd8ebdcf5d7c6ac0b5185"}, - {file = "websockets-13.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0513c727fb8adffa6d9bf4a4463b2bade0186cbd8c3604ae5540fae18a90cb99"}, - {file = "websockets-13.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1ee4cc030a4bdab482a37462dbf3ffb7e09334d01dd37d1063be1136a0d825fa"}, - {file = "websockets-13.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dbb0b697cc0655719522406c059eae233abaa3243821cfdfab1215d02ac10231"}, - {file = "websockets-13.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:acbebec8cb3d4df6e2488fbf34702cbc37fc39ac7abf9449392cefb3305562e9"}, - {file = "websockets-13.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63848cdb6fcc0bf09d4a155464c46c64ffdb5807ede4fb251da2c2692559ce75"}, - {file = "websockets-13.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:872afa52a9f4c414d6955c365b6588bc4401272c629ff8321a55f44e3f62b553"}, - {file = "websockets-13.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e70fec7c54aad4d71eae8e8cab50525e899791fc389ec6f77b95312e4e9920"}, - {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e82db3756ccb66266504f5a3de05ac6b32f287faacff72462612120074103329"}, - {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4e85f46ce287f5c52438bb3703d86162263afccf034a5ef13dbe4318e98d86e7"}, - {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3fea72e4e6edb983908f0db373ae0732b275628901d909c382aae3b592589f2"}, - {file = "websockets-13.0.1-cp313-cp313-win32.whl", hash = "sha256:254ecf35572fca01a9f789a1d0f543898e222f7b69ecd7d5381d8d8047627bdb"}, - {file = "websockets-13.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca48914cdd9f2ccd94deab5bcb5ac98025a5ddce98881e5cce762854a5de330b"}, - {file = "websockets-13.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b74593e9acf18ea5469c3edaa6b27fa7ecf97b30e9dabd5a94c4c940637ab96e"}, - {file = "websockets-13.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:132511bfd42e77d152c919147078460c88a795af16b50e42a0bd14f0ad71ddd2"}, - {file = "websockets-13.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:165bedf13556f985a2aa064309baa01462aa79bf6112fbd068ae38993a0e1f1b"}, - {file = "websockets-13.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e801ca2f448850685417d723ec70298feff3ce4ff687c6f20922c7474b4746ae"}, - {file = "websockets-13.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30d3a1f041360f029765d8704eae606781e673e8918e6b2c792e0775de51352f"}, - {file = "websockets-13.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67648f5e50231b5a7f6d83b32f9c525e319f0ddc841be0de64f24928cd75a603"}, - {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4f0426d51c8f0926a4879390f53c7f5a855e42d68df95fff6032c82c888b5f36"}, - {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ef48e4137e8799998a343706531e656fdec6797b80efd029117edacb74b0a10a"}, - {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:249aab278810bee585cd0d4de2f08cfd67eed4fc75bde623be163798ed4db2eb"}, - {file = "websockets-13.0.1-cp38-cp38-win32.whl", hash = "sha256:06c0a667e466fcb56a0886d924b5f29a7f0886199102f0a0e1c60a02a3751cb4"}, - {file = "websockets-13.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1f3cf6d6ec1142412d4535adabc6bd72a63f5f148c43fe559f06298bc21953c9"}, - {file = "websockets-13.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1fa082ea38d5de51dd409434edc27c0dcbd5fed2b09b9be982deb6f0508d25bc"}, - {file = "websockets-13.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4a365bcb7be554e6e1f9f3ed64016e67e2fa03d7b027a33e436aecf194febb63"}, - {file = "websockets-13.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:10a0dc7242215d794fb1918f69c6bb235f1f627aaf19e77f05336d147fce7c37"}, - {file = "websockets-13.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59197afd478545b1f73367620407b0083303569c5f2d043afe5363676f2697c9"}, - {file = "websockets-13.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d20516990d8ad557b5abeb48127b8b779b0b7e6771a265fa3e91767596d7d97"}, - {file = "websockets-13.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1a2e272d067030048e1fe41aa1ec8cfbbaabce733b3d634304fa2b19e5c897f"}, - {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ad327ac80ba7ee61da85383ca8822ff808ab5ada0e4a030d66703cc025b021c4"}, - {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:518f90e6dd089d34eaade01101fd8a990921c3ba18ebbe9b0165b46ebff947f0"}, - {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:68264802399aed6fe9652e89761031acc734fc4c653137a5911c2bfa995d6d6d"}, - {file = "websockets-13.0.1-cp39-cp39-win32.whl", hash = "sha256:a5dc0c42ded1557cc7c3f0240b24129aefbad88af4f09346164349391dea8e58"}, - {file = "websockets-13.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:b448a0690ef43db5ef31b3a0d9aea79043882b4632cfc3eaab20105edecf6097"}, - {file = "websockets-13.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:faef9ec6354fe4f9a2c0bbb52fb1ff852effc897e2a4501e25eb3a47cb0a4f89"}, - {file = "websockets-13.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:03d3f9ba172e0a53e37fa4e636b86cc60c3ab2cfee4935e66ed1d7acaa4625ad"}, - {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d450f5a7a35662a9b91a64aefa852f0c0308ee256122f5218a42f1d13577d71e"}, - {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f55b36d17ac50aa8a171b771e15fbe1561217510c8768af3d546f56c7576cdc"}, - {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14b9c006cac63772b31abbcd3e3abb6228233eec966bf062e89e7fa7ae0b7333"}, - {file = "websockets-13.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b79915a1179a91f6c5f04ece1e592e2e8a6bd245a0e45d12fd56b2b59e559a32"}, - {file = "websockets-13.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f40de079779acbcdbb6ed4c65af9f018f8b77c5ec4e17a4b737c05c2db554491"}, - {file = "websockets-13.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80e4ba642fc87fa532bac07e5ed7e19d56940b6af6a8c61d4429be48718a380f"}, - {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a02b0161c43cc9e0232711eff846569fad6ec836a7acab16b3cf97b2344c060"}, - {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6aa74a45d4cdc028561a7d6ab3272c8b3018e23723100b12e58be9dfa5a24491"}, - {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00fd961943b6c10ee6f0b1130753e50ac5dcd906130dcd77b0003c3ab797d026"}, - {file = "websockets-13.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d93572720d781331fb10d3da9ca1067817d84ad1e7c31466e9f5e59965618096"}, - {file = "websockets-13.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:71e6e5a3a3728886caee9ab8752e8113670936a193284be9d6ad2176a137f376"}, - {file = "websockets-13.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c4a6343e3b0714e80da0b0893543bf9a5b5fa71b846ae640e56e9abc6fbc4c83"}, - {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a678532018e435396e37422a95e3ab87f75028ac79570ad11f5bf23cd2a7d8c"}, - {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6716c087e4aa0b9260c4e579bb82e068f84faddb9bfba9906cb87726fa2e870"}, - {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e33505534f3f673270dd67f81e73550b11de5b538c56fe04435d63c02c3f26b5"}, - {file = "websockets-13.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acab3539a027a85d568c2573291e864333ec9d912675107d6efceb7e2be5d980"}, - {file = "websockets-13.0.1-py3-none-any.whl", hash = "sha256:b80f0c51681c517604152eb6a572f5a9378f877763231fddb883ba2f968e8817"}, - {file = "websockets-13.0.1.tar.gz", hash = "sha256:4d6ece65099411cfd9a48d13701d7438d9c34f479046b34c50ff60bb8834e43e"}, + {file = "websockets-13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f48c749857f8fb598fb890a75f540e3221d0976ed0bf879cf3c7eef34151acee"}, + {file = "websockets-13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7e72ce6bda6fb9409cc1e8164dd41d7c91466fb599eb047cfda72fe758a34a7"}, + {file = "websockets-13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f779498eeec470295a2b1a5d97aa1bc9814ecd25e1eb637bd9d1c73a327387f6"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676df3fe46956fbb0437d8800cd5f2b6d41143b6e7e842e60554398432cf29b"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7affedeb43a70351bb811dadf49493c9cfd1ed94c9c70095fd177e9cc1541fa"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1971e62d2caa443e57588e1d82d15f663b29ff9dfe7446d9964a4b6f12c1e700"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5f2e75431f8dc4a47f31565a6e1355fb4f2ecaa99d6b89737527ea917066e26c"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58cf7e75dbf7e566088b07e36ea2e3e2bd5676e22216e4cad108d4df4a7402a0"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90d6dec6be2c7d03378a574de87af9b1efea77d0c52a8301dd831ece938452f"}, + {file = "websockets-13.1-cp310-cp310-win32.whl", hash = "sha256:730f42125ccb14602f455155084f978bd9e8e57e89b569b4d7f0f0c17a448ffe"}, + {file = "websockets-13.1-cp310-cp310-win_amd64.whl", hash = "sha256:5993260f483d05a9737073be197371940c01b257cc45ae3f1d5d7adb371b266a"}, + {file = "websockets-13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61fc0dfcda609cda0fc9fe7977694c0c59cf9d749fbb17f4e9483929e3c48a19"}, + {file = "websockets-13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ceec59f59d092c5007e815def4ebb80c2de330e9588e101cf8bd94c143ec78a5"}, + {file = "websockets-13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1dca61c6db1166c48b95198c0b7d9c990b30c756fc2923cc66f68d17dc558fd"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308e20f22c2c77f3f39caca508e765f8725020b84aa963474e18c59accbf4c02"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d516c325e6540e8a57b94abefc3459d7dab8ce52ac75c96cad5549e187e3a7"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c6e35319b46b99e168eb98472d6c7d8634ee37750d7693656dc766395df096"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f9fee94ebafbc3117c30be1844ed01a3b177bb6e39088bc6b2fa1dc15572084"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7c1e90228c2f5cdde263253fa5db63e6653f1c00e7ec64108065a0b9713fa1b3"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6548f29b0e401eea2b967b2fdc1c7c7b5ebb3eeb470ed23a54cd45ef078a0db9"}, + {file = "websockets-13.1-cp311-cp311-win32.whl", hash = "sha256:c11d4d16e133f6df8916cc5b7e3e96ee4c44c936717d684a94f48f82edb7c92f"}, + {file = "websockets-13.1-cp311-cp311-win_amd64.whl", hash = "sha256:d04f13a1d75cb2b8382bdc16ae6fa58c97337253826dfe136195b7f89f661557"}, + {file = "websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc"}, + {file = "websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49"}, + {file = "websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf"}, + {file = "websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c"}, + {file = "websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3"}, + {file = "websockets-13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6"}, + {file = "websockets-13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708"}, + {file = "websockets-13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6"}, + {file = "websockets-13.1-cp313-cp313-win32.whl", hash = "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d"}, + {file = "websockets-13.1-cp313-cp313-win_amd64.whl", hash = "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2"}, + {file = "websockets-13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c7934fd0e920e70468e676fe7f1b7261c1efa0d6c037c6722278ca0228ad9d0d"}, + {file = "websockets-13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:149e622dc48c10ccc3d2760e5f36753db9cacf3ad7bc7bbbfd7d9c819e286f23"}, + {file = "websockets-13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a569eb1b05d72f9bce2ebd28a1ce2054311b66677fcd46cf36204ad23acead8c"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95df24ca1e1bd93bbca51d94dd049a984609687cb2fb08a7f2c56ac84e9816ea"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8dbb1bf0c0a4ae8b40bdc9be7f644e2f3fb4e8a9aca7145bfa510d4a374eeb7"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:035233b7531fb92a76beefcbf479504db8c72eb3bff41da55aecce3a0f729e54"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e4450fc83a3df53dec45922b576e91e94f5578d06436871dce3a6be38e40f5db"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:463e1c6ec853202dd3657f156123d6b4dad0c546ea2e2e38be2b3f7c5b8e7295"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6d6855bbe70119872c05107e38fbc7f96b1d8cb047d95c2c50869a46c65a8e96"}, + {file = "websockets-13.1-cp38-cp38-win32.whl", hash = "sha256:204e5107f43095012b00f1451374693267adbb832d29966a01ecc4ce1db26faf"}, + {file = "websockets-13.1-cp38-cp38-win_amd64.whl", hash = "sha256:485307243237328c022bc908b90e4457d0daa8b5cf4b3723fd3c4a8012fce4c6"}, + {file = "websockets-13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9b37c184f8b976f0c0a231a5f3d6efe10807d41ccbe4488df8c74174805eea7d"}, + {file = "websockets-13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:163e7277e1a0bd9fb3c8842a71661ad19c6aa7bb3d6678dc7f89b17fbcc4aeb7"}, + {file = "websockets-13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b889dbd1342820cc210ba44307cf75ae5f2f96226c0038094455a96e64fb07a"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:586a356928692c1fed0eca68b4d1c2cbbd1ca2acf2ac7e7ebd3b9052582deefa"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7bd6abf1e070a6b72bfeb71049d6ad286852e285f146682bf30d0296f5fbadfa"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2aad13a200e5934f5a6767492fb07151e1de1d6079c003ab31e1823733ae79"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:df01aea34b6e9e33572c35cd16bae5a47785e7d5c8cb2b54b2acdb9678315a17"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e54affdeb21026329fb0744ad187cf812f7d3c2aa702a5edb562b325191fcab6"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ef8aa8bdbac47f4968a5d66462a2a0935d044bf35c0e5a8af152d58516dbeb5"}, + {file = "websockets-13.1-cp39-cp39-win32.whl", hash = "sha256:deeb929efe52bed518f6eb2ddc00cc496366a14c726005726ad62c2dd9017a3c"}, + {file = "websockets-13.1-cp39-cp39-win_amd64.whl", hash = "sha256:7c65ffa900e7cc958cd088b9a9157a8141c991f8c53d11087e6fb7277a03f81d"}, + {file = "websockets-13.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5dd6da9bec02735931fccec99d97c29f47cc61f644264eb995ad6c0c27667238"}, + {file = "websockets-13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2510c09d8e8df777177ee3d40cd35450dc169a81e747455cc4197e63f7e7bfe5"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1c3cf67185543730888b20682fb186fc8d0fa6f07ccc3ef4390831ab4b388d9"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcc03c8b72267e97b49149e4863d57c2d77f13fae12066622dc78fe322490fe6"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004280a140f220c812e65f36944a9ca92d766b6cc4560be652a0a3883a79ed8a"}, + {file = "websockets-13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e2620453c075abeb0daa949a292e19f56de518988e079c36478bacf9546ced23"}, + {file = "websockets-13.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9156c45750b37337f7b0b00e6248991a047be4aa44554c9886fe6bdd605aab3b"}, + {file = "websockets-13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80c421e07973a89fbdd93e6f2003c17d20b69010458d3a8e37fb47874bd67d51"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d0ba76371769d6a4e56f7e83bb8e81846d17a6190971e38b5de108bde9b0d7"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9875a0143f07d74dc5e1ded1c4581f0d9f7ab86c78994e2ed9e95050073c94d"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11e38ad8922c7961447f35c7b17bffa15de4d17c70abd07bfbe12d6faa3e027"}, + {file = "websockets-13.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4059f790b6ae8768471cddb65d3c4fe4792b0ab48e154c9f0a04cefaabcd5978"}, + {file = "websockets-13.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25c35bf84bf7c7369d247f0b8cfa157f989862c49104c5cf85cb5436a641d93e"}, + {file = "websockets-13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:83f91d8a9bb404b8c2c41a707ac7f7f75b9442a0a876df295de27251a856ad09"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a43cfdcddd07f4ca2b1afb459824dd3c6d53a51410636a2c7fc97b9a8cf4842"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a2ef1381632a2f0cb4efeff34efa97901c9fbc118e01951ad7cfc10601a9bb"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459bf774c754c35dbb487360b12c5727adab887f1622b8aed5755880a21c4a20"}, + {file = "websockets-13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:95858ca14a9f6fa8413d29e0a585b31b278388aa775b8a81fa24830123874678"}, + {file = "websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f"}, + {file = "websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878"}, ] [[package]] @@ -6790,103 +6831,103 @@ test = ["pytest"] [[package]] name = "yarl" -version = "1.10.0" +version = "1.13.1" description = "Yet another URL library" optional = true python-versions = ">=3.8" files = [ - {file = "yarl-1.10.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1718c0bca5a61edac7a57dcc11856cb01bde13a9360a3cb6baf384b89cfc0b40"}, - {file = "yarl-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4657fd290d556a5f3018d07c7b7deadcb622760c0125277d10a11471c340054"}, - {file = "yarl-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:044b76d069e69c6b0246f071ebac0576f89c772f806d66ef51e662bd015d03c7"}, - {file = "yarl-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5527d32506c11150ca87f33820057dc284e2a01a87f0238555cada247a8b278"}, - {file = "yarl-1.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36d12d78b8b0d46099d413c8689b5510ad9ce5e443363d1c37b6ac5b3d7cbdfb"}, - {file = "yarl-1.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11f7f8a72b3e26c533fa7ffa7a8068f4e3aad7b67c5cf7b17ea8c79fc81d9830"}, - {file = "yarl-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88173836a25b7e5dce989eeee3b92d8ef5cdf512830d4155c6212de98e616f70"}, - {file = "yarl-1.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c382e189af10070bcb39caa9406b9cc47b26c1d2257979f11fe03a38be09fea9"}, - {file = "yarl-1.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:534b8bc181dca1691cf491c263e084af678a8fb6b6181687c788027d8c317026"}, - {file = "yarl-1.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5f3372f9ae1d1f001826b77d0b29d4220e84f6c5f53915e71a825cdd02600065"}, - {file = "yarl-1.10.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4cca9ba00be4bb8a051c4007b60fc91d6c9728c8b70c86cee4c24be9d641002f"}, - {file = "yarl-1.10.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a9d8c4be5658834dc688072239d220631ad4b71ff79a5f3d17fb653f16d10759"}, - {file = "yarl-1.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff45a655ca51e1cb778abbb586083fddb7d896332f47bb3b03bc75e30c25649f"}, - {file = "yarl-1.10.0-cp310-cp310-win32.whl", hash = "sha256:9ef7ce61958b3c7b2e2e0927c52d35cf367c5ee410e06e1337ecc83a90c23b95"}, - {file = "yarl-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:48a48261f8d610b0e15fed033e74798763bc2f8f2c0d769a2a0732511af71f1e"}, - {file = "yarl-1.10.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:308d1cce071b5b500e3d95636bbf15dfdb8e87ed081b893555658a7f9869a156"}, - {file = "yarl-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc66927f6362ed613a483c22618f88f014994ccbd0b7a25ec1ebc8c472d4b40a"}, - {file = "yarl-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c4d13071c5b99974cfe2f94c749ecc4baf882f7c4b6e4c40ca3d15d1b7e81f24"}, - {file = "yarl-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:348ad53acd41caa489df7db352d620c982ab069855d9635dda73d685bbbc3636"}, - {file = "yarl-1.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:293f7c2b30d015de3f1441c4ee764963b86636fde881b4d6093498d1e8711f69"}, - {file = "yarl-1.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:315e8853d0ea46aabdce01f1f248fff7b9743de89b555c5f0487f54ac84beae8"}, - {file = "yarl-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:012c506b2c23be4500fb97509aa7e6a575996fb317b80667fa26899d456e2aaf"}, - {file = "yarl-1.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f769c2708c31227c5349c3e4c668c8b4b2e25af3e7263723f2ef33e8e3906a0"}, - {file = "yarl-1.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4f6ac063a4e9bbd4f6cc88cc621516a44d6aec66862ea8399ba063374e4b12c7"}, - {file = "yarl-1.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:18b7ce6d8c35da8e16dcc8de124a80e250fc8c73f8c02663acf2485c874f1972"}, - {file = "yarl-1.10.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b80246bdee036381636e73ef0f19b032912064622b0e5ee44f6960fd11df12aa"}, - {file = "yarl-1.10.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:183dd37bb5471e8017ab8a998c1ea070b4a0b08a97a7c4e20e0c7ccbe8ebb999"}, - {file = "yarl-1.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9b6d0d7522b514f054b359409817af4c5ed76fa4fe42d8bd1ed12956804cf595"}, - {file = "yarl-1.10.0-cp311-cp311-win32.whl", hash = "sha256:6026a6ef14d038a38ca9d81422db4b6bb7d5da94f9d08f21e0ad9ebd9c4bc3bb"}, - {file = "yarl-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:190e70d2f9f16f1c9d666c103d635c9ed4bf8de7803e9fa0495eec405a3e96a8"}, - {file = "yarl-1.10.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6bc602c7413e1b5223bc988947125998cb54d6184de45a871985daacc23e6c8c"}, - {file = "yarl-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bf733c835ebbd52bd78a52b919205e0f06d8571f71976a0259e5bcc20d0a2f44"}, - {file = "yarl-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6e91ed5f6818e1e3806eaeb7b14d9e17b90340f23089451ea59a89a29499d760"}, - {file = "yarl-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23057a004bc9735008eb2a04b6ce94c6c06219cdf2b193997fd3ae6039eb3196"}, - {file = "yarl-1.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b922c32a1cff62bc43d408d1a8745abeed0a705793f2253c622bf3521922198"}, - {file = "yarl-1.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be199fed28861d72df917e355287ad6835555d8210e7f8203060561f24d7d842"}, - {file = "yarl-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cece693380c1c4a606cdcaa0c54eda8f72cfe1ba83f5149b9023bb955e8fa8e"}, - {file = "yarl-1.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff8e803d8ca170e632fb3b4df1bfd29ba29be8edc3e9306c5ffa5fadea234a4f"}, - {file = "yarl-1.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:30dde3a8b88c80a4f049eb4dd240d2a02e89174da6be2525541f949bf9fa38ab"}, - {file = "yarl-1.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:dff84623e7098cf9bfbb5187f9883051af652b0ce08b9f7084cc8630b87b6457"}, - {file = "yarl-1.10.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e69b55965a47dd6c79e578abd7d85637b1bb4a7565436630826bdb28aa9b7ad"}, - {file = "yarl-1.10.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5d0c9e1dcc92d46ca89608fe4763fc2362f1e81c19a922c67dbc0f20951466e4"}, - {file = "yarl-1.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:32e79d5ae975f7c2cc29f7104691fc9be5ee3724f24e1a7254d72f6219672108"}, - {file = "yarl-1.10.0-cp312-cp312-win32.whl", hash = "sha256:762a196612c2aba4197cd271da65fe08308f7ddf130dc63842c7a76d774b6a2c"}, - {file = "yarl-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:8c6214071f653d21bb7b43f7ee519afcbf7084263bb43408f4939d14558290db"}, - {file = "yarl-1.10.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0e0aea8319fdc1ac340236e58b0b7dc763621bce6ce98124a9d58104cafd0aaa"}, - {file = "yarl-1.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b3bf343b4ef9ec600d75363eb9b48ab3bd53b53d4e1c5a9fbf0cfe7ba73a47f"}, - {file = "yarl-1.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:05b07e6e0f715eaae9d927a302d9220724392f3c0b4e7f8dfa174bf2e1b8433e"}, - {file = "yarl-1.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7bd531d7eec4aa7ef8a99fef91962eeea5158a53af0ec507c476ddf8ebc29c"}, - {file = "yarl-1.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:183136dc5d5411872e7529c924189a2e26fac5a7f9769cf13ef854d1d653ad36"}, - {file = "yarl-1.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c77a3c10af4aaf8891578fe492ef0990c65cf7005dd371f5ea8007b420958bf6"}, - {file = "yarl-1.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:030d41d48217b180c5a176e59c49d212d54d89f6f53640fa4c1a1766492aec27"}, - {file = "yarl-1.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4f43ba30d604ba391bc7fe2dd104d6b87b62b0de4bbde79e362524b8a1eb75"}, - {file = "yarl-1.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:637dd0f55d1781d4634c23994101c509e455b5ab61af9086b5763b7eca9359aa"}, - {file = "yarl-1.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:99e7459ee86a3b81e57777afd3825b8b1acaac8a99f9c0bd02415d80eb3c371b"}, - {file = "yarl-1.10.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a80cdb3c15c15b33ecdb080546dcb022789b0084ca66ad41ffa0fe09857fca11"}, - {file = "yarl-1.10.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1824bfb932d8100e5c94f4f98c078f23ebc6f6fa93acc3d95408762089c54a06"}, - {file = "yarl-1.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:90fd64ce00f594db02f603efa502521c440fa1afcf6266be82eb31f19d2d9561"}, - {file = "yarl-1.10.0-cp313-cp313-win32.whl", hash = "sha256:687131ee4d045f3d58128ca28f5047ec902f7760545c39bbe003cc737c5a02b5"}, - {file = "yarl-1.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:493ad061ee025c5ed3a60893cd70204eead1b3f60ccc90682e752f95b845bd46"}, - {file = "yarl-1.10.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cd65588273d19f8483bc8f32a6fcf602e94a9a7ba287a1725977bd9527cd6c0c"}, - {file = "yarl-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6f64f8681671624f539eea5564518bc924524c25eb90ab24a7eddc2d872e668e"}, - {file = "yarl-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3576ed2c51f8525d4ff5c3279247aacff9540bb43b292c4a37a8e6c6e1691adb"}, - {file = "yarl-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca42a9281807fdf8fba86e671d8fdd76f92e9302a6d332957f2bae51c774f8a7"}, - {file = "yarl-1.10.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54a4b5e6a060d46cad6a3cf340f4cb268e6fbc89c589d82a2da58f7db47c47c8"}, - {file = "yarl-1.10.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eec21d8c3aa932c5a89480b58fa877e9c48092ab838ccc76788cbc917ceec0d"}, - {file = "yarl-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:273baee8a8af5989d5aab51c740e65bc2b1fc6619b9dd192cd16a3fae51100be"}, - {file = "yarl-1.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1bf63ba496cd4f12d30e916d9a52daa6c91433fedd9cd0d99fef3e13232836f"}, - {file = "yarl-1.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f8e24b9a4afdffab399191a9f0b0e80eabc7b7fdb9f2dbccdeb8e4d28e5c57bb"}, - {file = "yarl-1.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4c46454fafa31f7241083a0dd21814f63e0fcb4ae49662dc7e286fd6a5160ea1"}, - {file = "yarl-1.10.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:beda87b63c08fb4df8cc5353eeefe68efe12aa4f5284958bd1466b14c85e508e"}, - {file = "yarl-1.10.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:9a8d6a0e2b5617b5c15c59db25f20ba429f1fea810f2c09fbf93067cb21ab085"}, - {file = "yarl-1.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b453b3dbc1ed4c2907632d05b378123f3fb411cad05d8d96de7d95104ef11c70"}, - {file = "yarl-1.10.0-cp38-cp38-win32.whl", hash = "sha256:1ea30675fbf0ad6795c100da677ef6a8960a7db05ac5293f02a23c2230203c89"}, - {file = "yarl-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:347011ad09a8f9be3d41fe2d7d611c3a4de4d49aa77bcb9a8c03c7a82fc45248"}, - {file = "yarl-1.10.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:18bc4600eed1907762c1816bb16ac63bc52912e53b5e9a353eb0935a78e95496"}, - {file = "yarl-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eeb6a40c5ae2616fd38c1e039c6dd50031bbfbc2acacfd7b70a5d64fafc70901"}, - {file = "yarl-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bc544248b5263e1c0f61332ccf35e37404b54213f77ed17457f857f40af51452"}, - {file = "yarl-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3352c69dc235850d6bf8ddad915931f00dcab208ac4248b9af46175204c2f5f9"}, - {file = "yarl-1.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af5b52bfbbd5eb208cf1afe23c5ada443929e9b9d79e9fbc66cacc07e4e39748"}, - {file = "yarl-1.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eafa7317063de4bc310716cdd9026c13f00b1629e649079a6908c3aafdf5046"}, - {file = "yarl-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a162cf04fd1e8d81025ec651d14cac4f6e0ca73a3c0a9482de8691b944e3098a"}, - {file = "yarl-1.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:179b1df5e9cd99234ea65e63d5bfc6dd524b2c3b6cf68a14b94ccbe01ab37ddd"}, - {file = "yarl-1.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:32d2e46848dea122484317485129f080220aa84aeb6a9572ad9015107cebeb07"}, - {file = "yarl-1.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aa1aeb99408be0ca774c5126977eb085fedda6dd7d9198ce4ceb2d06a44325c7"}, - {file = "yarl-1.10.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d2366e2f987f69752f0588d2035321aaf24272693d75f7f6bb7e8a0f48f7ccdd"}, - {file = "yarl-1.10.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e8da33665ecc64cd3e593098adb449f9c65b4e3bc6338e75ad592da15453d898"}, - {file = "yarl-1.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b46c603bee1f2dd407b8358c2afc9b0472a22ccca528f114e1f4cd30dfecd22"}, - {file = "yarl-1.10.0-cp39-cp39-win32.whl", hash = "sha256:96422a3322b4d954f4c52403a2fc129ad118c151ee60a717847fb46a8480d1e1"}, - {file = "yarl-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:52d1ae09b0764017e330bb5bf9af760c0168c564225085bb806f687bccffda8a"}, - {file = "yarl-1.10.0-py3-none-any.whl", hash = "sha256:99eaa7d53f509ba1c2fea8fdfec15ba3cd36caca31d57ec6665073b148b5f260"}, - {file = "yarl-1.10.0.tar.gz", hash = "sha256:3bf10a395adac62177ba8ea738617e8de6cbb1cea6aa5d5dd2accde704fc8195"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, + {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, + {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, + {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, + {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, + {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, + {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, + {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, + {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, + {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, + {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, + {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, + {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, + {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, + {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, ] [package.dependencies] @@ -6895,13 +6936,13 @@ multidict = ">=4.0" [[package]] name = "ydb" -version = "3.16.1" +version = "3.17.2" description = "YDB Python SDK" optional = true python-versions = "*" files = [ - {file = "ydb-3.16.1-py2.py3-none-any.whl", hash = "sha256:b6278f6e4dac51519b0db705d667e9a279fab72b987b358e386014dbeff4ee26"}, - {file = "ydb-3.16.1.tar.gz", hash = "sha256:fd18976146ff4d65cff13a8265911bb40ff67312398b0ca80529d74564c4c6fa"}, + {file = "ydb-3.17.2-py2.py3-none-any.whl", hash = "sha256:1347688d3d91017401b9b01fd111822044d0478220503559e09a455011ea83c2"}, + {file = "ydb-3.17.2.tar.gz", hash = "sha256:a8dea851476b4ab1b38d79c998a60be00fb10e03b582ede43be452d21b978876"}, ] [package.dependencies] @@ -6915,13 +6956,13 @@ yc = ["yandexcloud"] [[package]] name = "zipp" -version = "3.20.1" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, - {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras]