From 39d04326fd67c232154939af797a90a7d74e0434 Mon Sep 17 00:00:00 2001 From: Nico Melone Date: Thu, 8 Sep 2022 17:49:19 -0500 Subject: [PATCH] added lambda layer for thingsboard rest api --- .DS_Store | Bin 8196 -> 8196 bytes AWS Lambda Layer/.DS_Store | Bin 0 -> 6148 bytes AWS Lambda Layer/python/.DS_Store | Bin 0 -> 6148 bytes AWS Lambda Layer/python/lib/.DS_Store | Bin 0 -> 6148 bytes .../python/lib/python3.9/.DS_Store | Bin 0 -> 6148 bytes .../site-packages/certifi/__init__.py | 4 + .../site-packages/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 296 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 432 bytes .../certifi/__pycache__/core.cpython-310.pyc | Bin 0 -> 1409 bytes .../site-packages/certifi/cacert.pem | 4530 +++++++++ .../python3.9/site-packages/certifi/core.py | 68 + .../python3.9/site-packages/certifi/py.typed | 0 .../charset_normalizer/__init__.py | 56 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1728 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 11220 bytes .../__pycache__/cd.cpython-310.pyc | Bin 0 -> 8857 bytes .../__pycache__/constant.cpython-310.pyc | Bin 0 -> 17195 bytes .../__pycache__/legacy.cpython-310.pyc | Bin 0 -> 2908 bytes .../__pycache__/md.cpython-310.pyc | Bin 0 -> 13988 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 13237 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 7767 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 277 bytes .../site-packages/charset_normalizer/api.py | 608 ++ .../charset_normalizer/assets/__init__.py | 1244 +++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 8187 bytes .../site-packages/charset_normalizer/cd.py | 340 + .../charset_normalizer/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 196 bytes .../__pycache__/normalizer.cpython-310.pyc | Bin 0 -> 6121 bytes .../charset_normalizer/cli/normalizer.py | 290 + .../charset_normalizer/constant.py | 503 + .../charset_normalizer/legacy.py | 95 + .../site-packages/charset_normalizer/md.py | 559 ++ .../charset_normalizer/models.py | 392 + .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 342 + .../charset_normalizer/version.py | 6 + .../site-packages/dateutil/__init__.py | 8 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 333 bytes .../__pycache__/_common.cpython-310.pyc | Bin 0 -> 1389 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 197 bytes .../__pycache__/easter.cpython-310.pyc | Bin 0 -> 2173 bytes .../__pycache__/relativedelta.cpython-310.pyc | Bin 0 -> 15716 bytes .../__pycache__/rrule.cpython-310.pyc | Bin 0 -> 43306 bytes .../__pycache__/tzwin.cpython-310.pyc | Bin 0 -> 162 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 2226 bytes .../site-packages/dateutil/_common.py | 43 + .../site-packages/dateutil/_version.py | 5 + .../site-packages/dateutil/easter.py | 89 + .../site-packages/dateutil/parser/__init__.py | 61 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2037 bytes .../__pycache__/_parser.cpython-310.pyc | Bin 0 -> 40508 bytes .../__pycache__/isoparser.cpython-310.pyc | Bin 0 -> 11283 bytes .../site-packages/dateutil/parser/_parser.py | 1613 ++++ .../dateutil/parser/isoparser.py | 416 + .../site-packages/dateutil/relativedelta.py | 599 ++ .../python3.9/site-packages/dateutil/rrule.py | 1737 ++++ .../site-packages/dateutil/tz/__init__.py | 12 + .../tz/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 635 bytes .../tz/__pycache__/_common.cpython-310.pyc | Bin 0 -> 10721 bytes .../tz/__pycache__/_factories.cpython-310.pyc | Bin 0 -> 2904 bytes .../tz/__pycache__/tz.cpython-310.pyc | Bin 0 -> 44895 bytes .../tz/__pycache__/win.cpython-310.pyc | Bin 0 -> 11399 bytes .../site-packages/dateutil/tz/_common.py | 419 + .../site-packages/dateutil/tz/_factories.py | 80 + .../python3.9/site-packages/dateutil/tz/tz.py | 1849 ++++ .../site-packages/dateutil/tz/win.py | 370 + .../python3.9/site-packages/dateutil/tzwin.py | 2 + .../python3.9/site-packages/dateutil/utils.py | 71 + .../dateutil/zoneinfo/__init__.py | 167 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 5728 bytes .../__pycache__/rebuild.cpython-310.pyc | Bin 0 -> 2657 bytes .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 0 -> 174394 bytes .../dateutil/zoneinfo/rebuild.py | 75 + .../python3.9/site-packages/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 837 bytes .../idna/__pycache__/codec.cpython-310.pyc | Bin 0 -> 2808 bytes .../idna/__pycache__/compat.cpython-310.pyc | Bin 0 -> 737 bytes .../idna/__pycache__/core.cpython-310.pyc | Bin 0 -> 9580 bytes .../idna/__pycache__/idnadata.cpython-310.pyc | Bin 0 -> 38215 bytes .../__pycache__/intranges.cpython-310.pyc | Bin 0 -> 1974 bytes .../__pycache__/package_data.cpython-310.pyc | Bin 0 -> 201 bytes .../__pycache__/uts46data.cpython-310.pyc | Bin 0 -> 150936 bytes .../lib/python3.9/site-packages/idna/codec.py | 112 + .../python3.9/site-packages/idna/compat.py | 13 + .../lib/python3.9/site-packages/idna/core.py | 397 + .../python3.9/site-packages/idna/idnadata.py | 2137 +++++ .../python3.9/site-packages/idna/intranges.py | 54 + .../site-packages/idna/package_data.py | 2 + .../lib/python3.9/site-packages/idna/py.typed | 0 .../python3.9/site-packages/idna/uts46data.py | 8512 +++++++++++++++++ .../site-packages/requests/__init__.py | 152 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3905 bytes .../__pycache__/__version__.cpython-310.pyc | Bin 0 -> 545 bytes .../_internal_utils.cpython-310.pyc | Bin 0 -> 1297 bytes .../__pycache__/adapters.cpython-310.pyc | Bin 0 -> 16961 bytes .../requests/__pycache__/api.cpython-310.pyc | Bin 0 -> 6644 bytes .../requests/__pycache__/auth.cpython-310.pyc | Bin 0 -> 8087 bytes .../__pycache__/certs.cpython-310.pyc | Bin 0 -> 617 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 1819 bytes .../__pycache__/cookies.cpython-310.pyc | Bin 0 -> 18689 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 5226 bytes .../requests/__pycache__/help.cpython-310.pyc | Bin 0 -> 2879 bytes .../__pycache__/hooks.cpython-310.pyc | Bin 0 -> 984 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 24231 bytes .../__pycache__/packages.cpython-310.pyc | Bin 0 -> 697 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 0 -> 19619 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 0 -> 4661 bytes .../__pycache__/structures.cpython-310.pyc | Bin 0 -> 4443 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 24374 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 42 + .../site-packages/requests/adapters.py | 538 ++ .../python3.9/site-packages/requests/api.py | 159 + .../python3.9/site-packages/requests/auth.py | 305 + .../python3.9/site-packages/requests/certs.py | 18 + .../site-packages/requests/compat.py | 81 + .../site-packages/requests/cookies.py | 549 ++ .../site-packages/requests/exceptions.py | 133 + .../python3.9/site-packages/requests/help.py | 135 + .../python3.9/site-packages/requests/hooks.py | 34 + .../site-packages/requests/models.py | 973 ++ .../site-packages/requests/packages.py | 26 + .../site-packages/requests/sessions.py | 771 ++ .../site-packages/requests/status_codes.py | 123 + .../site-packages/requests/structures.py | 105 + .../python3.9/site-packages/requests/utils.py | 1060 ++ .../python/lib/python3.9/site-packages/six.py | 998 ++ .../site-packages/tb_rest_client/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 188 bytes .../__pycache__/api_client.cpython-310.pyc | Bin 0 -> 19225 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 0 -> 5065 bytes .../__pycache__/rest.cpython-310.pyc | Bin 0 -> 6957 bytes .../rest_client_base.cpython-310.pyc | Bin 0 -> 55201 bytes .../rest_client_ce.cpython-310.pyc | Bin 0 -> 34359 bytes .../rest_client_pe.cpython-310.pyc | Bin 0 -> 67362 bytes .../tb_rest_client/api/__init__.py | 0 .../api/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 192 bytes .../tb_rest_client/api/api_ce/__init__.py | 46 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2658 bytes .../admin_controller_api.cpython-310.pyc | Bin 0 -> 14768 bytes .../alarm_controller_api.cpython-310.pyc | Bin 0 -> 23335 bytes .../asset_controller_api.cpython-310.pyc | Bin 0 -> 41801 bytes .../audit_log_controller_api.cpython-310.pyc | Bin 0 -> 15875 bytes .../auth_controller_api.cpython-310.pyc | Bin 0 -> 19546 bytes ..._descriptor_controller_api.cpython-310.pyc | Bin 0 -> 9354 bytes .../customer_controller_api.cpython-310.pyc | Bin 0 -> 16691 bytes .../dashboard_controller_api.cpython-310.pyc | Bin 0 -> 52878 bytes .../device_controller_api.cpython-310.pyc | Bin 0 -> 56398 bytes ...ice_profile_controller_api.cpython-310.pyc | Bin 0 -> 23913 bytes .../edge_controller_api.cpython-310.pyc | Bin 0 -> 47760 bytes .../edge_event_controller_api.cpython-310.pyc | Bin 0 -> 5127 bytes ...ntity_query_controller_api.cpython-310.pyc | Bin 0 -> 10779 bytes ...ty_relation_controller_api.cpython-310.pyc | Bin 0 -> 31797 bytes ...entity_view_controller_api.cpython-310.pyc | Bin 0 -> 41930 bytes .../event_controller_api.cpython-310.pyc | Bin 0 -> 14313 bytes .../lwm_2m_controller_api.cpython-310.pyc | Bin 0 -> 6347 bytes ...ig_template_controller_api.cpython-310.pyc | Bin 0 -> 8959 bytes .../o_auth_2_controller_api.cpython-310.pyc | Bin 0 -> 9375 bytes ...ota_package_controller_api.cpython-310.pyc | Bin 0 -> 21568 bytes .../queue_controller_api.cpython-310.pyc | Bin 0 -> 3947 bytes .../rpc_v_1_controller_api.cpython-310.pyc | Bin 0 -> 6434 bytes .../rpc_v_2_controller_api.cpython-310.pyc | Bin 0 -> 14374 bytes .../rule_chain_controller_api.cpython-310.pyc | Bin 0 -> 41618 bytes .../sign_up_controller_api.cpython-310.pyc | Bin 0 -> 16862 bytes ...tb_resource_controller_api.cpython-310.pyc | Bin 0 -> 19535 bytes .../telemetry_controller_api.cpython-310.pyc | Bin 0 -> 45686 bytes .../tenant_controller_api.cpython-310.pyc | Bin 0 -> 14676 bytes ...ant_profile_controller_api.cpython-310.pyc | Bin 0 -> 19499 bytes .../user_controller_api.cpython-310.pyc | Bin 0 -> 26361 bytes ...widget_type_controller_api.cpython-310.pyc | Bin 0 -> 17905 bytes ...gets_bundle_controller_api.cpython-310.pyc | Bin 0 -> 13421 bytes .../api/api_ce/admin_controller_api.py | 676 ++ .../api/api_ce/alarm_controller_api.py | 978 ++ .../api/api_ce/asset_controller_api.py | 1879 ++++ .../api/api_ce/audit_log_controller_api.py | 565 ++ .../api/api_ce/auth_controller_api.py | 858 ++ .../component_descriptor_controller_api.py | 320 + .../api/api_ce/customer_controller_api.py | 704 ++ .../api/api_ce/dashboard_controller_api.py | 2316 +++++ .../api/api_ce/device_controller_api.py | 2477 +++++ .../api_ce/device_profile_controller_api.py | 991 ++ .../api/api_ce/edge_controller_api.py | 2223 +++++ .../api/api_ce/edge_event_controller_api.py | 162 + .../api/api_ce/entity_query_controller_api.py | 437 + .../api_ce/entity_relation_controller_api.py | 1333 +++ .../api/api_ce/entity_view_controller_api.py | 1786 ++++ .../api/api_ce/event_controller_api.py | 488 + .../api/api_ce/lwm_2m_controller_api.py | 219 + ...o_auth_2_config_template_controller_api.py | 304 + .../api/api_ce/o_auth_2_controller_api.py | 393 + .../api/api_ce/ota_package_controller_api.py | 857 ++ .../api/api_ce/queue_controller_api.py | 126 + .../api/api_ce/rpc_v_1_controller_api.py | 243 + .../api/api_ce/rpc_v_2_controller_api.py | 554 ++ .../api/api_ce/rule_chain_controller_api.py | 1876 ++++ .../api/api_ce/sign_up_controller_api.py | 741 ++ .../api/api_ce/tb_resource_controller_api.py | 830 ++ .../api/api_ce/telemetry_controller_api.py | 1772 ++++ .../api/api_ce/tenant_controller_api.py | 631 ++ .../api_ce/tenant_profile_controller_api.py | 809 ++ .../api/api_ce/user_controller_api.py | 1124 +++ .../api/api_ce/widget_type_controller_api.py | 724 ++ .../api_ce/widgets_bundle_controller_api.py | 510 + .../tb_rest_client/api/api_pe/__init__.py | 52 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3285 bytes .../admin_controller_api.cpython-310.pyc | Bin 0 -> 14974 bytes .../asset_controller_api.cpython-310.pyc | Bin 0 -> 27860 bytes ...ng_endpoint_controller_api.cpython-310.pyc | Bin 0 -> 18153 bytes ...blob_entity_controller_api.cpython-310.pyc | Bin 0 -> 13559 bytes ...integration_controller_api.cpython-310.pyc | Bin 0 -> 17656 bytes ...ud_endpoint_controller_api.cpython-310.pyc | Bin 0 -> 7039 bytes .../converter_controller_api.cpython-310.pyc | Bin 0 -> 18501 bytes ...custom_menu_controller_api.cpython-310.pyc | Bin 0 -> 6951 bytes ...translation_controller_api.cpython-310.pyc | Bin 0 -> 7620 bytes .../customer_controller_api.cpython-310.pyc | Bin 0 -> 24382 bytes .../dashboard_controller_api.cpython-310.pyc | Bin 0 -> 46599 bytes .../device_controller_api.cpython-310.pyc | Bin 0 -> 44166 bytes ...ota_package_controller_api.cpython-310.pyc | Bin 0 -> 9018 bytes .../edge_controller_api.cpython-310.pyc | Bin 0 -> 41780 bytes .../edge_event_controller_api.cpython-310.pyc | Bin 0 -> 5127 bytes ...ntity_group_controller_api.cpython-310.pyc | Bin 0 -> 56173 bytes ...entity_view_controller_api.cpython-310.pyc | Bin 0 -> 28997 bytes ..._permission_controller_api.cpython-310.pyc | Bin 0 -> 17183 bytes ...integration_controller_api.cpython-310.pyc | Bin 0 -> 9072 bytes ...integration_controller_api.cpython-310.pyc | Bin 0 -> 17594 bytes ...integration_controller_api.cpython-310.pyc | Bin 0 -> 17653 bytes .../lwm_2m_controller_api.cpython-310.pyc | Bin 0 -> 6527 bytes ...integration_controller_api.cpython-310.pyc | Bin 0 -> 17772 bytes ...ota_package_controller_api.cpython-310.pyc | Bin 0 -> 24413 bytes .../owner_controller_api.cpython-310.pyc | Bin 0 -> 6600 bytes .../report_controller_api.cpython-310.pyc | Bin 0 -> 6839 bytes .../role_controller_api.cpython-310.pyc | Bin 0 -> 12832 bytes .../rpc_controller_api.cpython-310.pyc | Bin 0 -> 6418 bytes .../rpc_v_2_controller_api.cpython-310.pyc | Bin 0 -> 14400 bytes ...rule_engine_controller_api.cpython-310.pyc | Bin 0 -> 10294 bytes ...duler_event_controller_api.cpython-310.pyc | Bin 0 -> 25128 bytes ...egistration_controller_api.cpython-310.pyc | Bin 0 -> 10106 bytes ...integration_controller_api.cpython-310.pyc | Bin 0 -> 17664 bytes .../sign_up_controller_api.cpython-310.pyc | Bin 0 -> 22499 bytes .../solution_controller_api.cpython-310.pyc | Bin 0 -> 12313 bytes ...ubscription_controller_api.cpython-310.pyc | Bin 0 -> 7625 bytes ...integration_controller_api.cpython-310.pyc | Bin 0 -> 17794 bytes .../tenant_controller_api.cpython-310.pyc | Bin 0 -> 16840 bytes ...integration_controller_api.cpython-310.pyc | Bin 0 -> 37419 bytes .../trail_controller_api.cpython-310.pyc | Bin 0 -> 3359 bytes .../user_controller_api.cpython-310.pyc | Bin 0 -> 33683 bytes ...permissions_controller_api.cpython-310.pyc | Bin 0 -> 3595 bytes ...te_labeling_controller_api.cpython-310.pyc | Bin 0 -> 23107 bytes .../api/api_pe/admin_controller_api.py | 680 ++ .../api/api_pe/asset_controller_api.py | 1164 +++ .../api_pe/billing_endpoint_controller_api.py | 854 ++ .../api/api_pe/blob_entity_controller_api.py | 526 + .../chirp_stack_integration_controller_api.py | 824 ++ .../api_pe/cloud_endpoint_controller_api.py | 284 + .../api/api_pe/converter_controller_api.py | 805 ++ .../api/api_pe/custom_menu_controller_api.py | 296 + .../custom_translation_controller_api.py | 300 + .../api/api_pe/customer_controller_api.py | 1035 ++ .../api/api_pe/dashboard_controller_api.py | 2009 ++++ .../api/api_pe/device_controller_api.py | 1867 ++++ ...device_group_ota_package_controller_api.py | 320 + .../api/api_pe/edge_controller_api.py | 1843 ++++ .../api/api_pe/edge_event_controller_api.py | 162 + .../api/api_pe/entity_group_controller_api.py | 2303 +++++ .../api/api_pe/entity_view_controller_api.py | 1164 +++ .../api_pe/group_permission_controller_api.py | 696 ++ .../api_pe/http_integration_controller_api.py | 344 + .../api/api_pe/integration_controller_api.py | 704 ++ .../loriot_integration_controller_api.py | 824 ++ .../api/api_pe/lwm_2m_controller_api.py | 223 + ...cean_connect_integration_controller_api.py | 824 ++ .../api/api_pe/ota_package_controller_api.py | 986 ++ .../api/api_pe/owner_controller_api.py | 243 + .../api/api_pe/report_controller_api.py | 239 + .../api/api_pe/role_controller_api.py | 522 + .../api/api_pe/rpc_controller_api.py | 243 + .../api/api_pe/rpc_v_2_controller_api.py | 554 ++ .../api/api_pe/rule_engine_controller_api.py | 364 + .../api_pe/scheduler_event_controller_api.py | 1003 ++ .../self_registration_controller_api.py | 389 + .../sig_fox_integration_controller_api.py | 824 ++ .../api/api_pe/sign_up_controller_api.py | 1012 ++ .../api/api_pe/solution_controller_api.py | 486 + .../api/api_pe/subscription_controller_api.py | 296 + ...bile_iot_cdp_integration_controller_api.py | 824 ++ .../api/api_pe/tenant_controller_api.py | 724 ++ .../thing_park_integration_controller_api.py | 1727 ++++ .../api/api_pe/trail_controller_api.py | 114 + .../api/api_pe/user_controller_api.py | 1455 +++ .../api_pe/user_permissions_controller_api.py | 118 + .../api_pe/white_labeling_controller_api.py | 1048 ++ .../tb_rest_client/api_client.py | 722 ++ .../tb_rest_client/configuration.py | 249 + .../tb_rest_client/models/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 195 bytes .../models/models_ce/__init__.py | 175 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 10426 bytes .../admin_settings.cpython-310.pyc | Bin 0 -> 5074 bytes .../admin_settings_id.cpython-310.pyc | Bin 0 -> 3261 bytes .../__pycache__/alarm.cpython-310.pyc | Bin 0 -> 12068 bytes .../alarm_condition.cpython-310.pyc | Bin 0 -> 3995 bytes .../alarm_condition_filter.cpython-310.pyc | Bin 0 -> 5546 bytes ...alarm_condition_filter_key.cpython-310.pyc | Bin 0 -> 4206 bytes .../alarm_condition_spec.cpython-310.pyc | Bin 0 -> 2694 bytes .../__pycache__/alarm_data.cpython-310.pyc | Bin 0 -> 14317 bytes .../alarm_data_page_link.cpython-310.pyc | Bin 0 -> 11269 bytes .../alarm_data_query.cpython-310.pyc | Bin 0 -> 6704 bytes .../__pycache__/alarm_id.cpython-310.pyc | Bin 0 -> 3140 bytes .../__pycache__/alarm_info.cpython-310.pyc | Bin 0 -> 13075 bytes .../__pycache__/alarm_rule.cpython-310.pyc | Bin 0 -> 5133 bytes .../alarm_schedule.cpython-310.pyc | Bin 0 -> 3423 bytes .../__pycache__/asset.cpython-310.pyc | Bin 0 -> 7084 bytes .../__pycache__/asset_id.cpython-310.pyc | Bin 0 -> 3140 bytes .../__pycache__/asset_info.cpython-310.pyc | Bin 0 -> 8578 bytes .../asset_search_query.cpython-310.pyc | Bin 0 -> 4733 bytes .../attributes_entity_view.cpython-310.pyc | Bin 0 -> 4541 bytes .../__pycache__/audit_log.cpython-310.pyc | Bin 0 -> 10616 bytes .../__pycache__/audit_log_id.cpython-310.pyc | Bin 0 -> 3186 bytes .../__pycache__/byte_buffer.cpython-310.pyc | Bin 0 -> 7139 bytes .../__pycache__/claim_request.cpython-310.pyc | Bin 0 -> 3361 bytes .../component_descriptor.cpython-310.pyc | Bin 0 -> 8116 bytes .../component_descriptor_id.cpython-310.pyc | Bin 0 -> 3351 bytes .../__pycache__/customer.cpython-310.pyc | Bin 0 -> 10430 bytes .../__pycache__/customer_id.cpython-310.pyc | Bin 0 -> 3185 bytes .../__pycache__/dashboard.cpython-310.pyc | Bin 0 -> 8592 bytes .../__pycache__/dashboard_id.cpython-310.pyc | Bin 0 -> 3200 bytes .../dashboard_info.cpython-310.pyc | Bin 0 -> 8206 bytes ..._rule_chain_create_request.cpython-310.pyc | Bin 0 -> 3490 bytes ...red_result_response_entity.cpython-310.pyc | Bin 0 -> 4234 bytes .../__pycache__/device.cpython-310.pyc | Bin 0 -> 9639 bytes .../device_configuration.cpython-310.pyc | Bin 0 -> 2703 bytes .../device_credentials.cpython-310.pyc | Bin 0 -> 6913 bytes .../device_credentials_id.cpython-310.pyc | Bin 0 -> 3321 bytes .../__pycache__/device_data.cpython-310.pyc | Bin 0 -> 4127 bytes .../__pycache__/device_id.cpython-310.pyc | Bin 0 -> 3155 bytes .../__pycache__/device_info.cpython-310.pyc | Bin 0 -> 11897 bytes .../device_profile.cpython-310.pyc | Bin 0 -> 14135 bytes .../device_profile_alarm.cpython-310.pyc | Bin 0 -> 6730 bytes ...vice_profile_configuration.cpython-310.pyc | Bin 0 -> 2774 bytes .../device_profile_data.cpython-310.pyc | Bin 0 -> 5816 bytes .../device_profile_id.cpython-310.pyc | Bin 0 -> 3261 bytes .../device_profile_info.cpython-310.pyc | Bin 0 -> 6791 bytes ...le_provision_configuration.cpython-310.pyc | Bin 0 -> 3754 bytes ...le_transport_configuration.cpython-310.pyc | Bin 0 -> 2865 bytes .../device_search_query.cpython-310.pyc | Bin 0 -> 4767 bytes ...ce_transport_configuration.cpython-310.pyc | Bin 0 -> 2794 bytes .../__pycache__/edge.cpython-310.pyc | Bin 0 -> 10010 bytes .../__pycache__/edge_event.cpython-310.pyc | Bin 0 -> 8461 bytes .../__pycache__/edge_event_id.cpython-310.pyc | Bin 0 -> 3201 bytes .../__pycache__/edge_id.cpython-310.pyc | Bin 0 -> 3125 bytes .../__pycache__/edge_info.cpython-310.pyc | Bin 0 -> 11594 bytes .../edge_search_query.cpython-310.pyc | Bin 0 -> 4699 bytes .../entity_count_query.cpython-310.pyc | Bin 0 -> 4089 bytes .../__pycache__/entity_data.cpython-310.pyc | Bin 0 -> 4571 bytes .../entity_data_page_link.cpython-310.pyc | Bin 0 -> 6167 bytes .../entity_data_query.cpython-310.pyc | Bin 0 -> 6086 bytes .../entity_data_sort_order.cpython-310.pyc | Bin 0 -> 4155 bytes .../__pycache__/entity_filter.cpython-310.pyc | Bin 0 -> 2633 bytes .../__pycache__/entity_id.cpython-310.pyc | Bin 0 -> 4126 bytes .../__pycache__/entity_info.cpython-310.pyc | Bin 0 -> 3760 bytes .../__pycache__/entity_key.cpython-310.pyc | Bin 0 -> 4093 bytes .../entity_relation.cpython-310.pyc | Bin 0 -> 5945 bytes .../entity_relation_info.cpython-310.pyc | Bin 0 -> 7322 bytes .../entity_relations_query.cpython-310.pyc | Bin 0 -> 4181 bytes .../entity_subtype.cpython-310.pyc | Bin 0 -> 4862 bytes .../__pycache__/entity_view.cpython-310.pyc | Bin 0 -> 9222 bytes .../entity_view_id.cpython-310.pyc | Bin 0 -> 4207 bytes .../entity_view_info.cpython-310.pyc | Bin 0 -> 10826 bytes .../entity_view_search_query.cpython-310.pyc | Bin 0 -> 4912 bytes .../__pycache__/event.cpython-310.pyc | Bin 0 -> 6430 bytes .../__pycache__/event_filter.cpython-310.pyc | Bin 0 -> 2623 bytes .../__pycache__/event_id.cpython-310.pyc | Bin 0 -> 3141 bytes .../__pycache__/file.cpython-310.pyc | Bin 0 -> 10988 bytes .../home_dashboard.cpython-310.pyc | Bin 0 -> 9551 bytes .../home_dashboard_info.cpython-310.pyc | Bin 0 -> 4162 bytes .../__pycache__/input_stream.cpython-310.pyc | Bin 0 -> 2623 bytes .../__pycache__/key_filter.cpython-310.pyc | Bin 0 -> 4621 bytes .../key_filter_predicate.cpython-310.pyc | Bin 0 -> 2694 bytes .../lw_m2m_instance.cpython-310.pyc | Bin 0 -> 3915 bytes .../__pycache__/lw_m2m_object.cpython-310.pyc | Bin 0 -> 6139 bytes .../lw_m2m_resource_observe.cpython-310.pyc | Bin 0 -> 6459 bytes .../mapstring_ts_value.cpython-310.pyc | Bin 0 -> 2805 bytes .../node_connection_info.cpython-310.pyc | Bin 0 -> 4592 bytes ..._auth2_basic_mapper_config.cpython-310.pyc | Bin 0 -> 9040 bytes .../o_auth2_client_info.cpython-310.pyc | Bin 0 -> 4440 bytes ...ient_registration_template.cpython-310.pyc | Bin 0 -> 15679 bytes ...t_registration_template_id.cpython-310.pyc | Bin 0 -> 3550 bytes ...auth2_custom_mapper_config.cpython-310.pyc | Bin 0 -> 5377 bytes .../o_auth2_domain_info.cpython-310.pyc | Bin 0 -> 4064 bytes .../__pycache__/o_auth2_info.cpython-310.pyc | Bin 0 -> 3980 bytes .../o_auth2_mapper_config.cpython-310.pyc | Bin 0 -> 6218 bytes .../o_auth2_mobile_info.cpython-310.pyc | Bin 0 -> 3968 bytes .../o_auth2_params_info.cpython-310.pyc | Bin 0 -> 4935 bytes .../o_auth2_registration_info.cpython-310.pyc | Bin 0 -> 12902 bytes .../__pycache__/object_node.cpython-310.pyc | Bin 0 -> 2613 bytes .../__pycache__/ota_package.cpython-310.pyc | Bin 0 -> 13188 bytes .../ota_package_id.cpython-310.pyc | Bin 0 -> 3217 bytes .../ota_package_info.cpython-310.pyc | Bin 0 -> 12976 bytes ...sumchecksum_algorithm_body.cpython-310.pyc | Bin 0 -> 3940 bytes .../page_data_alarm_data.cpython-310.pyc | Bin 0 -> 5286 bytes .../page_data_alarm_info.cpython-310.pyc | Bin 0 -> 5286 bytes .../page_data_asset.cpython-310.pyc | Bin 0 -> 5153 bytes .../page_data_asset_info.cpython-310.pyc | Bin 0 -> 5286 bytes .../page_data_audit_log.cpython-310.pyc | Bin 0 -> 5253 bytes .../page_data_customer.cpython-310.pyc | Bin 0 -> 5252 bytes .../page_data_dashboard_info.cpython-310.pyc | Bin 0 -> 5418 bytes .../page_data_device.cpython-310.pyc | Bin 0 -> 5186 bytes .../page_data_device_info.cpython-310.pyc | Bin 0 -> 5319 bytes .../page_data_device_profile.cpython-310.pyc | Bin 0 -> 5418 bytes ...e_data_device_profile_info.cpython-310.pyc | Bin 0 -> 5551 bytes .../page_data_edge.cpython-310.pyc | Bin 0 -> 5120 bytes .../page_data_edge_event.cpython-310.pyc | Bin 0 -> 5286 bytes .../page_data_edge_info.cpython-310.pyc | Bin 0 -> 5253 bytes .../page_data_entity_data.cpython-310.pyc | Bin 0 -> 5319 bytes .../page_data_entity_info.cpython-310.pyc | Bin 0 -> 5319 bytes .../page_data_entity_view.cpython-310.pyc | Bin 0 -> 5319 bytes ...page_data_entity_view_info.cpython-310.pyc | Bin 0 -> 5452 bytes .../page_data_event.cpython-310.pyc | Bin 0 -> 5153 bytes ...page_data_ota_package_info.cpython-310.pyc | Bin 0 -> 5452 bytes .../__pycache__/page_data_rpc.cpython-310.pyc | Bin 0 -> 5087 bytes .../page_data_rule_chain.cpython-310.pyc | Bin 0 -> 5286 bytes ...page_data_tb_resource_info.cpython-310.pyc | Bin 0 -> 5452 bytes .../page_data_tenant.cpython-310.pyc | Bin 0 -> 5186 bytes .../page_data_tenant_info.cpython-310.pyc | Bin 0 -> 5319 bytes .../page_data_tenant_profile.cpython-310.pyc | Bin 0 -> 5418 bytes .../page_data_user.cpython-310.pyc | Bin 0 -> 5120 bytes .../page_data_widgets_bundle.cpython-310.pyc | Bin 0 -> 5418 bytes ...elation_entity_type_filter.cpython-310.pyc | Bin 0 -> 4801 bytes ...elations_search_parameters.cpython-310.pyc | Bin 0 -> 8636 bytes .../__pycache__/resource.cpython-310.pyc | Bin 0 -> 7122 bytes .../response_entity.cpython-310.pyc | Bin 0 -> 6235 bytes .../models_ce/__pycache__/rpc.cpython-310.pyc | Bin 0 -> 7820 bytes .../__pycache__/rpc_id.cpython-310.pyc | Bin 0 -> 3111 bytes .../__pycache__/rule_chain.cpython-310.pyc | Bin 0 -> 8714 bytes ...rule_chain_connection_info.cpython-310.pyc | Bin 0 -> 5557 bytes .../rule_chain_data.cpython-310.pyc | Bin 0 -> 4013 bytes .../__pycache__/rule_chain_id.cpython-310.pyc | Bin 0 -> 3202 bytes .../rule_chain_meta_data.cpython-310.pyc | Bin 0 -> 6253 bytes .../__pycache__/rule_node.cpython-310.pyc | Bin 0 -> 7325 bytes .../__pycache__/rule_node_id.cpython-310.pyc | Bin 0 -> 3187 bytes ...e_ota_package_info_request.cpython-310.pyc | Bin 0 -> 14633 bytes .../security_settings.cpython-310.pyc | Bin 0 -> 5028 bytes .../server_security_config.cpython-310.pyc | Bin 0 -> 8949 bytes .../short_customer_info.cpython-310.pyc | Bin 0 -> 5296 bytes .../sign_up_request.cpython-310.pyc | Bin 0 -> 5747 bytes ...sms_provider_configuration.cpython-310.pyc | Bin 0 -> 2754 bytes .../__pycache__/tb_resource.cpython-310.pyc | Bin 0 -> 7544 bytes .../tb_resource_id.cpython-310.pyc | Bin 0 -> 3217 bytes .../tb_resource_info.cpython-310.pyc | Bin 0 -> 6580 bytes .../telemetry_entity_view.cpython-310.pyc | Bin 0 -> 4107 bytes .../__pycache__/tenant.cpython-310.pyc | Bin 0 -> 10892 bytes .../__pycache__/tenant_id.cpython-310.pyc | Bin 0 -> 3155 bytes .../__pycache__/tenant_info.cpython-310.pyc | Bin 0 -> 12033 bytes .../tenant_profile.cpython-310.pyc | Bin 0 -> 7735 bytes ...nant_profile_configuration.cpython-310.pyc | Bin 0 -> 2774 bytes .../tenant_profile_data.cpython-310.pyc | Bin 0 -> 3449 bytes .../tenant_profile_id.cpython-310.pyc | Bin 0 -> 3261 bytes .../test_sms_request.cpython-310.pyc | Bin 0 -> 4696 bytes .../__pycache__/ts_value.cpython-310.pyc | Bin 0 -> 3691 bytes .../update_message.cpython-310.pyc | Bin 0 -> 3956 bytes .../models_ce/__pycache__/uri.cpython-310.pyc | Bin 0 -> 12182 bytes .../models_ce/__pycache__/url.cpython-310.pyc | Bin 0 -> 8389 bytes .../url_stream_handler.cpython-310.pyc | Bin 0 -> 2674 bytes .../__pycache__/user.cpython-310.pyc | Bin 0 -> 8398 bytes .../__pycache__/user_id.cpython-310.pyc | Bin 0 -> 3125 bytes .../user_password_policy.cpython-310.pyc | Bin 0 -> 8034 bytes .../__pycache__/widget_type.cpython-310.pyc | Bin 0 -> 6742 bytes .../widget_type_details.cpython-310.pyc | Bin 0 -> 8272 bytes .../widget_type_id.cpython-310.pyc | Bin 0 -> 3217 bytes .../widget_type_info.cpython-310.pyc | Bin 0 -> 8122 bytes .../widgets_bundle.cpython-310.pyc | Bin 0 -> 6838 bytes .../widgets_bundle_id.cpython-310.pyc | Bin 0 -> 3262 bytes .../models/models_ce/admin_settings.py | 188 + .../models/models_ce/admin_settings_id.py | 102 + .../tb_rest_client/models/models_ce/alarm.py | 512 + .../models/models_ce/alarm_condition.py | 136 + .../models_ce/alarm_condition_filter.py | 194 + .../models_ce/alarm_condition_filter_key.py | 142 + .../models/models_ce/alarm_condition_spec.py | 84 + .../models/models_ce/alarm_data.py | 590 ++ .../models/models_ce/alarm_data_page_link.py | 417 + .../models/models_ce/alarm_data_query.py | 240 + .../models/models_ce/alarm_id.py | 102 + .../models/models_ce/alarm_info.py | 538 ++ .../models/models_ce/alarm_rule.py | 188 + .../models/models_ce/alarm_schedule.py | 116 + .../tb_rest_client/models/models_ce/asset.py | 292 + .../models/models_ce/asset_id.py | 102 + .../models/models_ce/asset_info.py | 344 + .../models/models_ce/asset_search_query.py | 162 + .../models_ce/attributes_entity_view.py | 162 + .../models/models_ce/audit_log.py | 408 + .../models/models_ce/audit_log_id.py | 102 + .../models/models_ce/byte_buffer.py | 292 + .../models/models_ce/claim_request.py | 111 + .../models/models_ce/component_descriptor.py | 304 + .../models_ce/component_descriptor_id.py | 102 + .../models/models_ce/customer.py | 448 + .../models/models_ce/customer_id.py | 102 + .../models/models_ce/dashboard.py | 344 + .../models/models_ce/dashboard_id.py | 102 + .../models/models_ce/dashboard_info.py | 318 + .../default_rule_chain_create_request.py | 110 + .../deferred_result_response_entity.py | 136 + .../tb_rest_client/models/models_ce/device.py | 396 + .../models/models_ce/device_configuration.py | 84 + .../models/models_ce/device_credentials.py | 246 + .../models/models_ce/device_credentials_id.py | 102 + .../models/models_ce/device_data.py | 136 + .../models/models_ce/device_id.py | 103 + .../models/models_ce/device_info.py | 474 + .../models/models_ce/device_profile.py | 544 ++ .../models/models_ce/device_profile_alarm.py | 240 + .../models_ce/device_profile_configuration.py | 84 + .../models/models_ce/device_profile_data.py | 188 + .../models/models_ce/device_profile_id.py | 102 + .../models/models_ce/device_profile_info.py | 252 + .../device_profile_provision_configuration.py | 110 + .../device_profile_transport_configuration.py | 84 + .../models/models_ce/device_search_query.py | 162 + .../device_transport_configuration.py | 84 + .../tb_rest_client/models/models_ce/edge.py | 422 + .../models/models_ce/edge_event.py | 330 + .../models/models_ce/edge_event_id.py | 102 + .../models/models_ce/edge_id.py | 102 + .../models/models_ce/edge_info.py | 474 + .../models/models_ce/edge_search_query.py | 162 + .../models/models_ce/entity_count_query.py | 136 + .../models/models_ce/entity_data.py | 162 + .../models/models_ce/entity_data_page_link.py | 219 + .../models/models_ce/entity_data_query.py | 214 + .../models_ce/entity_data_sort_order.py | 142 + .../models/models_ce/entity_filter.py | 84 + .../models/models_ce/entity_id.py | 142 + .../models/models_ce/entity_info.py | 136 + .../models/models_ce/entity_key.py | 144 + .../models/models_ce/entity_relation.py | 220 + .../models/models_ce/entity_relation_info.py | 272 + .../models_ce/entity_relations_query.py | 136 + .../models/models_ce/entity_subtype.py | 168 + .../models/models_ce/entity_view.py | 370 + .../models/models_ce/entity_view_id.py | 142 + .../models/models_ce/entity_view_info.py | 422 + .../models_ce/entity_view_search_query.py | 162 + .../tb_rest_client/models/models_ce/event.py | 266 + .../models/models_ce/event_filter.py | 84 + .../models/models_ce/event_id.py | 110 + .../tb_rest_client/models/models_ce/file.py | 474 + .../models/models_ce/home_dashboard.py | 370 + .../models/models_ce/home_dashboard_info.py | 136 + .../models/models_ce/input_stream.py | 84 + .../models/models_ce/key_filter.py | 168 + .../models/models_ce/key_filter_predicate.py | 84 + .../models/models_ce/lw_m2m_instance.py | 136 + .../models/models_ce/lw_m2m_object.py | 240 + .../models_ce/lw_m2m_resource_observe.py | 240 + .../models/models_ce/mapstring_ts_value.py | 89 + .../models/models_ce/node_connection_info.py | 162 + .../models_ce/o_auth2_basic_mapper_config.py | 298 + .../models/models_ce/o_auth2_client_info.py | 162 + .../o_auth2_client_registration_template.py | 526 + ...o_auth2_client_registration_template_id.py | 110 + .../models_ce/o_auth2_custom_mapper_config.py | 188 + .../models/models_ce/o_auth2_domain_info.py | 142 + .../models/models_ce/o_auth2_info.py | 136 + .../models/models_ce/o_auth2_mapper_config.py | 220 + .../models/models_ce/o_auth2_mobile_info.py | 136 + .../models/models_ce/o_auth2_params_info.py | 162 + .../models_ce/o_auth2_registration_info.py | 455 + .../models/models_ce/object_node.py | 84 + .../models/models_ce/ota_package.py | 538 ++ .../models/models_ce/ota_package_id.py | 110 + .../models/models_ce/ota_package_info.py | 512 + ...ckage_idchecksumchecksum_algorithm_body.py | 113 + .../models/models_ce/page_data_alarm_data.py | 188 + .../models/models_ce/page_data_alarm_info.py | 188 + .../models/models_ce/page_data_asset.py | 188 + .../models/models_ce/page_data_asset_info.py | 188 + .../models/models_ce/page_data_audit_log.py | 188 + .../models/models_ce/page_data_customer.py | 188 + .../models_ce/page_data_dashboard_info.py | 188 + .../models/models_ce/page_data_device.py | 188 + .../models/models_ce/page_data_device_info.py | 188 + .../models_ce/page_data_device_profile.py | 188 + .../page_data_device_profile_info.py | 188 + .../models/models_ce/page_data_edge.py | 188 + .../models/models_ce/page_data_edge_event.py | 188 + .../models/models_ce/page_data_edge_info.py | 188 + .../models/models_ce/page_data_entity_data.py | 188 + .../models/models_ce/page_data_entity_info.py | 188 + .../models/models_ce/page_data_entity_view.py | 188 + .../models_ce/page_data_entity_view_info.py | 188 + .../models/models_ce/page_data_event.py | 188 + .../models_ce/page_data_ota_package_info.py | 188 + .../models/models_ce/page_data_rpc.py | 188 + .../models/models_ce/page_data_rule_chain.py | 188 + .../models_ce/page_data_tb_resource_info.py | 188 + .../models/models_ce/page_data_tenant.py | 188 + .../models/models_ce/page_data_tenant_info.py | 188 + .../models_ce/page_data_tenant_profile.py | 188 + .../models/models_ce/page_data_user.py | 188 + .../models_ce/page_data_widgets_bundle.py | 188 + .../models_ce/relation_entity_type_filter.py | 145 + .../models_ce/relations_search_parameters.py | 290 + .../models/models_ce/resource.py | 292 + .../models/models_ce/response_entity.py | 168 + .../tb_rest_client/models/models_ce/rpc.py | 324 + .../tb_rest_client/models/models_ce/rpc_id.py | 110 + .../models/models_ce/rule_chain.py | 350 + .../models_ce/rule_chain_connection_info.py | 188 + .../models/models_ce/rule_chain_data.py | 136 + .../models/models_ce/rule_chain_id.py | 110 + .../models/models_ce/rule_chain_meta_data.py | 214 + .../models/models_ce/rule_node.py | 292 + .../models/models_ce/rule_node_id.py | 110 + .../save_ota_package_info_request.py | 538 ++ .../models/models_ce/security_settings.py | 162 + .../models_ce/server_security_config.py | 318 + .../models/models_ce/short_customer_info.py | 189 + .../models/models_ce/sign_up_request.py | 214 + .../models_ce/sms_provider_configuration.py | 84 + .../models/models_ce/tb_resource.py | 298 + .../models/models_ce/tb_resource_id.py | 110 + .../models/models_ce/tb_resource_info.py | 246 + .../models/models_ce/telemetry_entity_view.py | 136 + .../tb_rest_client/models/models_ce/tenant.py | 474 + .../models/models_ce/tenant_id.py | 102 + .../models/models_ce/tenant_info.py | 500 + .../models/models_ce/tenant_profile.py | 292 + .../models_ce/tenant_profile_configuration.py | 84 + .../models/models_ce/tenant_profile_data.py | 110 + .../models/models_ce/tenant_profile_id.py | 102 + .../models/models_ce/test_sms_request.py | 162 + .../models/models_ce/ts_value.py | 136 + .../models/models_ce/update_message.py | 136 + .../tb_rest_client/models/models_ce/uri.py | 526 + .../tb_rest_client/models/models_ce/url.py | 370 + .../models/models_ce/url_stream_handler.py | 84 + .../tb_rest_client/models/models_ce/user.py | 350 + .../models/models_ce/user_id.py | 102 + .../models/models_ce/user_password_policy.py | 266 + .../models/models_ce/widget_type.py | 266 + .../models/models_ce/widget_type_details.py | 318 + .../models/models_ce/widget_type_id.py | 110 + .../models/models_ce/widget_type_info.py | 318 + .../models/models_ce/widgets_bundle.py | 266 + .../models/models_ce/widgets_bundle_id.py | 110 + .../models/models_pe/__init__.py | 70 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4231 bytes .../allowed_permissions_info.cpython-310.pyc | Bin 0 -> 10397 bytes .../__pycache__/asset.cpython-310.pyc | Bin 0 -> 7655 bytes .../__pycache__/asset_id.cpython-310.pyc | Bin 0 -> 3218 bytes .../__pycache__/audit_log.cpython-310.pyc | Bin 0 -> 10734 bytes .../blob_entity_id.cpython-310.pyc | Bin 0 -> 3216 bytes .../blob_entity_info.cpython-310.pyc | Bin 0 -> 8231 bytes ..._entity_with_customer_info.cpython-310.pyc | Bin 0 -> 10356 bytes .../client_registration_dto.cpython-310.pyc | Bin 0 -> 11909 bytes .../component_descriptor.cpython-310.pyc | Bin 0 -> 8127 bytes .../contact_basedobject.cpython-310.pyc | Bin 0 -> 9983 bytes .../__pycache__/converter.cpython-310.pyc | Bin 0 -> 7497 bytes .../__pycache__/converter_id.cpython-310.pyc | Bin 0 -> 3278 bytes .../__pycache__/custom_menu.cpython-310.pyc | Bin 0 -> 4018 bytes .../custom_menu_item.cpython-310.pyc | Bin 0 -> 7881 bytes .../custom_translation.cpython-310.pyc | Bin 0 -> 3444 bytes .../__pycache__/customer.cpython-310.pyc | Bin 0 -> 12435 bytes .../__pycache__/dashboard.cpython-310.pyc | Bin 0 -> 9807 bytes .../dashboard_info.cpython-310.pyc | Bin 0 -> 8893 bytes .../delete_tenant_request.cpython-310.pyc | Bin 0 -> 4061 bytes .../__pycache__/device.cpython-310.pyc | Bin 0 -> 9691 bytes .../device_group_ota_package.cpython-310.pyc | Bin 0 -> 6398 bytes .../__pycache__/domain_info.cpython-310.pyc | Bin 0 -> 3942 bytes .../__pycache__/edge.cpython-310.pyc | Bin 0 -> 10576 bytes .../__pycache__/edge_event.cpython-310.pyc | Bin 0 -> 9223 bytes .../__pycache__/entity_data.cpython-310.pyc | Bin 0 -> 5742 bytes .../__pycache__/entity_group.cpython-310.pyc | Bin 0 -> 8392 bytes .../entity_group_id.cpython-310.pyc | Bin 0 -> 3231 bytes .../entity_group_info.cpython-310.pyc | Bin 0 -> 9261 bytes .../__pycache__/entity_id.cpython-310.pyc | Bin 0 -> 4218 bytes .../entity_relation.cpython-310.pyc | Bin 0 -> 5981 bytes .../entity_relation_info.cpython-310.pyc | Bin 0 -> 7358 bytes .../entity_subtype.cpython-310.pyc | Bin 0 -> 4954 bytes .../__pycache__/entity_view.cpython-310.pyc | Bin 0 -> 9808 bytes .../entity_view_id.cpython-310.pyc | Bin 0 -> 4354 bytes .../__pycache__/favicon.cpython-310.pyc | Bin 0 -> 3687 bytes .../group_permission.cpython-310.pyc | Bin 0 -> 9545 bytes .../group_permission_id.cpython-310.pyc | Bin 0 -> 4399 bytes .../group_permission_info.cpython-310.pyc | Bin 0 -> 14841 bytes .../home_dashboard.cpython-310.pyc | Bin 0 -> 10238 bytes .../http_routing_key_body.cpython-310.pyc | Bin 0 -> 3574 bytes .../__pycache__/integration.cpython-310.pyc | Bin 0 -> 12347 bytes .../integration_id.cpython-310.pyc | Bin 0 -> 3308 bytes ...ogin_white_labeling_params.cpython-310.pyc | Bin 0 -> 18038 bytes ...rged_group_permission_info.cpython-310.pyc | Bin 0 -> 5116 bytes ...group_type_permission_info.cpython-310.pyc | Bin 0 -> 4409 bytes .../merged_user_permissions.cpython-310.pyc | Bin 0 -> 8273 bytes ..._auth2_basic_mapper_config.cpython-310.pyc | Bin 0 -> 10665 bytes ...uth2_clients_domain_params.cpython-310.pyc | Bin 0 -> 4391 bytes .../o_auth2_clients_params.cpython-310.pyc | Bin 0 -> 4144 bytes ..._entity_with_customer_info.cpython-310.pyc | Bin 0 -> 5850 bytes ...e_data_contact_basedobject.cpython-310.pyc | Bin 0 -> 5583 bytes .../page_data_converter.cpython-310.pyc | Bin 0 -> 5285 bytes ...age_data_entity_group_info.cpython-310.pyc | Bin 0 -> 5485 bytes .../page_data_integration.cpython-310.pyc | Bin 0 -> 5351 bytes .../page_data_role.cpython-310.pyc | Bin 0 -> 5120 bytes ..._data_scheduler_event_info.cpython-310.pyc | Bin 0 -> 5584 bytes ...age_data_short_entity_view.cpython-310.pyc | Bin 0 -> 5485 bytes .../__pycache__/palette.cpython-310.pyc | Bin 0 -> 4298 bytes .../palette_settings.cpython-310.pyc | Bin 0 -> 4065 bytes ...elation_entity_type_filter.cpython-310.pyc | Bin 0 -> 4893 bytes ...elations_search_parameters.cpython-310.pyc | Bin 0 -> 8764 bytes .../__pycache__/report_config.cpython-310.pyc | Bin 0 -> 8894 bytes .../__pycache__/role.cpython-310.pyc | Bin 0 -> 7807 bytes .../__pycache__/role_id.cpython-310.pyc | Bin 0 -> 4178 bytes .../scheduler_event.cpython-310.pyc | Bin 0 -> 8834 bytes .../scheduler_event_id.cpython-310.pyc | Bin 0 -> 3267 bytes .../scheduler_event_info.cpython-310.pyc | Bin 0 -> 8423 bytes ...r_event_with_customer_info.cpython-310.pyc | Bin 0 -> 10588 bytes .../self_registration_params.cpython-310.pyc | Bin 0 -> 12627 bytes .../share_group_request.cpython-310.pyc | Bin 0 -> 7034 bytes .../short_entity_view.cpython-310.pyc | Bin 0 -> 3861 bytes .../sign_up_request.cpython-310.pyc | Bin 0 -> 6947 bytes ...p_self_registration_params.cpython-310.pyc | Bin 0 -> 4368 bytes .../solution_install_response.cpython-310.pyc | Bin 0 -> 5544 bytes .../subscription_usage.cpython-310.pyc | Bin 0 -> 13052 bytes ..._solution_template_details.cpython-310.pyc | Bin 0 -> 10081 bytes ...ant_solution_template_info.cpython-310.pyc | Bin 0 -> 9344 bytes ...tion_template_instructions.cpython-310.pyc | Bin 0 -> 5183 bytes .../__pycache__/user.cpython-310.pyc | Bin 0 -> 8964 bytes .../__pycache__/user_id.cpython-310.pyc | Bin 0 -> 3203 bytes .../white_labeling_params.cpython-310.pyc | Bin 0 -> 12416 bytes .../models_pe/allowed_permissions_info.py | 301 + .../tb_rest_client/models/models_pe/asset.py | 318 + .../models/models_pe/asset_id.py | 105 + .../models/models_pe/audit_log.py | 408 + .../models/models_pe/blob_entity_id.py | 102 + .../models/models_pe/blob_entity_info.py | 318 + .../blob_entity_with_customer_info.py | 370 + .../models_pe/client_registration_dto.py | 422 + .../models/models_pe/component_descriptor.py | 304 + .../models/models_pe/contact_basedobject.py | 396 + .../models/models_pe/converter.py | 298 + .../models/models_pe/converter_id.py | 105 + .../models/models_pe/custom_menu.py | 136 + .../models/models_pe/custom_menu_item.py | 292 + .../models/models_pe/custom_translation.py | 110 + .../models/models_pe/customer.py | 526 + .../models/models_pe/dashboard.py | 396 + .../models/models_pe/dashboard_info.py | 344 + .../models/models_pe/delete_tenant_request.py | 136 + .../tb_rest_client/models/models_pe/device.py | 396 + .../models_pe/device_group_ota_package.py | 220 + .../models/models_pe/domain_info.py | 142 + .../tb_rest_client/models/models_pe/edge.py | 448 + .../models/models_pe/edge_event.py | 356 + .../models/models_pe/entity_data.py | 214 + .../models/models_pe/entity_group.py | 326 + .../models/models_pe/entity_group_id.py | 102 + .../models/models_pe/entity_group_info.py | 352 + .../models/models_pe/entity_id.py | 142 + .../models/models_pe/entity_relation.py | 220 + .../models/models_pe/entity_relation_info.py | 272 + .../models/models_pe/entity_subtype.py | 168 + .../models/models_pe/entity_view.py | 396 + .../models/models_pe/entity_view_id.py | 143 + .../models/models_pe/favicon.py | 136 + .../models/models_pe/group_permission.py | 351 + .../models/models_pe/group_permission_id.py | 143 + .../models/models_pe/group_permission_info.py | 532 ++ .../models/models_pe/home_dashboard.py | 396 + .../models/models_pe/http_routing_key_body.py | 113 + .../models/models_pe/integration.py | 480 + .../models/models_pe/integration_id.py | 105 + .../models_pe/login_white_labeling_params.py | 630 ++ .../models_pe/merged_group_permission_info.py | 149 + .../merged_group_type_permission_info.py | 136 + .../models_pe/merged_user_permissions.py | 247 + .../models_pe/o_auth2_basic_mapper_config.py | 350 + .../o_auth2_clients_domain_params.py | 136 + .../models_pe/o_auth2_clients_params.py | 136 + ...age_data_blob_entity_with_customer_info.py | 188 + .../page_data_contact_basedobject.py | 188 + .../models/models_pe/page_data_converter.py | 188 + .../models_pe/page_data_entity_group_info.py | 188 + .../models/models_pe/page_data_integration.py | 188 + .../models/models_pe/page_data_role.py | 188 + .../page_data_scheduler_event_info.py | 188 + .../models_pe/page_data_short_entity_view.py | 188 + .../models/models_pe/palette.py | 162 + .../models/models_pe/palette_settings.py | 136 + .../models_pe/relation_entity_type_filter.py | 145 + .../models_pe/relations_search_parameters.py | 290 + .../models/models_pe/report_config.py | 344 + .../tb_rest_client/models/models_pe/role.py | 324 + .../models/models_pe/role_id.py | 142 + .../models/models_pe/scheduler_event.py | 344 + .../models/models_pe/scheduler_event_id.py | 102 + .../models/models_pe/scheduler_event_info.py | 318 + .../scheduler_event_with_customer_info.py | 370 + .../models_pe/self_registration_params.py | 448 + .../models/models_pe/share_group_request.py | 245 + .../models/models_pe/short_entity_view.py | 136 + .../models/models_pe/sign_up_request.py | 266 + .../sign_up_self_registration_params.py | 136 + .../models_pe/solution_install_response.py | 188 + .../models/models_pe/subscription_usage.py | 500 + .../tenant_solution_template_details.py | 350 + .../tenant_solution_template_info.py | 324 + .../tenant_solution_template_instructions.py | 162 + .../tb_rest_client/models/models_pe/user.py | 376 + .../models/models_pe/user_id.py | 104 + .../models/models_pe/white_labeling_params.py | 448 + .../site-packages/tb_rest_client/rest.py | 326 + .../tb_rest_client/rest_client_base.py | 942 ++ .../tb_rest_client/rest_client_ce.py | 611 ++ .../tb_rest_client/rest_client_pe.py | 1082 +++ .../site-packages/urllib3/__init__.py | 85 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2179 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 0 -> 10853 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 203 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 13638 bytes .../connectionpool.cpython-310.pyc | Bin 0 -> 25364 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 10984 bytes .../__pycache__/fields.cpython-310.pyc | Bin 0 -> 8175 bytes .../__pycache__/filepost.cpython-310.pyc | Bin 0 -> 2740 bytes .../__pycache__/poolmanager.cpython-310.pyc | Bin 0 -> 15209 bytes .../__pycache__/request.cpython-310.pyc | Bin 0 -> 5616 bytes .../__pycache__/response.cpython-310.pyc | Bin 0 -> 20971 bytes .../site-packages/urllib3/_collections.py | 337 + .../site-packages/urllib3/_version.py | 2 + .../site-packages/urllib3/connection.py | 567 ++ .../site-packages/urllib3/connectionpool.py | 1108 +++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 189 bytes .../_appengine_environ.cpython-310.pyc | Bin 0 -> 1369 bytes .../__pycache__/appengine.cpython-310.pyc | Bin 0 -> 8161 bytes .../__pycache__/ntlmpool.cpython-310.pyc | Bin 0 -> 3624 bytes .../__pycache__/pyopenssl.cpython-310.pyc | Bin 0 -> 15495 bytes .../securetransport.cpython-310.pyc | Bin 0 -> 21892 bytes .../contrib/__pycache__/socks.cpython-310.pyc | Bin 0 -> 5591 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 206 bytes .../__pycache__/bindings.cpython-310.pyc | Bin 0 -> 10702 bytes .../__pycache__/low_level.cpython-310.pyc | Bin 0 -> 9089 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../urllib3/contrib/appengine.py | 314 + .../site-packages/urllib3/contrib/ntlmpool.py | 130 + .../urllib3/contrib/pyopenssl.py | 511 + .../urllib3/contrib/securetransport.py | 922 ++ .../site-packages/urllib3/contrib/socks.py | 216 + .../site-packages/urllib3/exceptions.py | 323 + .../python3.9/site-packages/urllib3/fields.py | 274 + .../site-packages/urllib3/filepost.py | 98 + .../urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 190 bytes .../packages/__pycache__/six.cpython-310.pyc | Bin 0 -> 27650 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 200 bytes .../__pycache__/makefile.cpython-310.pyc | Bin 0 -> 1300 bytes .../urllib3/packages/backports/makefile.py | 51 + .../site-packages/urllib3/packages/six.py | 1077 +++ .../site-packages/urllib3/poolmanager.py | 537 ++ .../site-packages/urllib3/request.py | 170 + .../site-packages/urllib3/response.py | 824 ++ .../site-packages/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1099 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 3427 bytes .../util/__pycache__/proxy.cpython-310.pyc | Bin 0 -> 1334 bytes .../util/__pycache__/queue.cpython-310.pyc | Bin 0 -> 1054 bytes .../util/__pycache__/request.cpython-310.pyc | Bin 0 -> 3516 bytes .../util/__pycache__/response.cpython-310.pyc | Bin 0 -> 2347 bytes .../util/__pycache__/retry.cpython-310.pyc | Bin 0 -> 16132 bytes .../util/__pycache__/ssl_.cpython-310.pyc | Bin 0 -> 11289 bytes .../ssl_match_hostname.cpython-310.pyc | Bin 0 -> 3251 bytes .../__pycache__/ssltransport.cpython-310.pyc | Bin 0 -> 7389 bytes .../util/__pycache__/timeout.cpython-310.pyc | Bin 0 -> 8931 bytes .../util/__pycache__/url.cpython-310.pyc | Bin 0 -> 10650 bytes .../util/__pycache__/wait.cpython-310.pyc | Bin 0 -> 3083 bytes .../site-packages/urllib3/util/connection.py | 149 + .../site-packages/urllib3/util/proxy.py | 57 + .../site-packages/urllib3/util/queue.py | 22 + .../site-packages/urllib3/util/request.py | 146 + .../site-packages/urllib3/util/response.py | 107 + .../site-packages/urllib3/util/retry.py | 620 ++ .../site-packages/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 159 + .../urllib3/util/ssltransport.py | 221 + .../site-packages/urllib3/util/timeout.py | 268 + .../site-packages/urllib3/util/url.py | 432 + .../site-packages/urllib3/util/wait.py | 153 + AWS Lambda Layer/tb-rest-client-3-9.zip | Bin 0 -> 2896070 bytes AWS Lambda Layer/tb-rest-client.zip | Bin 0 -> 2561659 bytes __pycache__/thingsboardAPI.cpython-39.pyc | Bin 3311 -> 3638 bytes 896 files changed, 171870 insertions(+) create mode 100644 AWS Lambda Layer/.DS_Store create mode 100644 AWS Lambda Layer/python/.DS_Store create mode 100644 AWS Lambda Layer/python/lib/.DS_Store create mode 100644 AWS Lambda Layer/python/lib/python3.9/.DS_Store create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__main__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__pycache__/__main__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__pycache__/core.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/cacert.pem create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/core.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/py.typed create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/cd.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/constant.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/legacy.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/md.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/models.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/utils.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/version.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/assets/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/assets/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cd.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cli/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cli/__pycache__/normalizer.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cli/normalizer.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/constant.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/legacy.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/md.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/models.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/py.typed create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/utils.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/version.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/_common.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/_version.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/easter.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/relativedelta.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/rrule.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/tzwin.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/utils.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/_common.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/_version.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/easter.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/__pycache__/_parser.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/__pycache__/isoparser.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/_parser.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/isoparser.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/relativedelta.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/rrule.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__pycache__/_common.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__pycache__/_factories.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__pycache__/tz.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__pycache__/win.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/_common.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/_factories.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/tz.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/win.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tzwin.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/utils.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/rebuild.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/codec.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/compat.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/core.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/idnadata.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/intranges.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/package_data.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/uts46data.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/codec.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/compat.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/core.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/idnadata.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/intranges.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/package_data.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/py.typed create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/idna/uts46data.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/__version__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/_internal_utils.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/adapters.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/auth.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/certs.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/compat.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/cookies.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/exceptions.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/help.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/hooks.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/models.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/packages.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/sessions.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/status_codes.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/structures.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/utils.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__version__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/_internal_utils.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/adapters.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/auth.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/certs.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/compat.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/cookies.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/exceptions.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/help.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/hooks.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/models.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/packages.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/sessions.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/status_codes.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/structures.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/requests/utils.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/six.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/api_client.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/configuration.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/rest.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/rest_client_base.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/rest_client_ce.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/rest_client_pe.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/admin_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/alarm_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/asset_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/audit_log_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/auth_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/component_descriptor_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/customer_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/dashboard_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/device_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/device_profile_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/edge_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/edge_event_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/entity_query_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/entity_relation_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/entity_view_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/event_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/lwm_2m_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/o_auth_2_config_template_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/o_auth_2_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/ota_package_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/queue_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/rpc_v_1_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/rpc_v_2_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/rule_chain_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/sign_up_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/tb_resource_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/telemetry_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/tenant_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/tenant_profile_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/user_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/widget_type_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/widgets_bundle_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/admin_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/alarm_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/asset_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/audit_log_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/auth_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/component_descriptor_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/customer_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/dashboard_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/device_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/device_profile_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/edge_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/edge_event_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/entity_query_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/entity_relation_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/entity_view_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/event_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/lwm_2m_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/o_auth_2_config_template_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/o_auth_2_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/ota_package_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/queue_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/rpc_v_1_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/rpc_v_2_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/rule_chain_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/sign_up_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/tb_resource_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/telemetry_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/tenant_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/tenant_profile_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/user_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/widget_type_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/widgets_bundle_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/admin_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/asset_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/billing_endpoint_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/blob_entity_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/chirp_stack_integration_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/cloud_endpoint_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/converter_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/custom_menu_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/custom_translation_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/customer_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/dashboard_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/device_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/device_group_ota_package_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/edge_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/edge_event_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/entity_group_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/entity_view_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/group_permission_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/http_integration_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/integration_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/loriot_integration_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/lwm_2m_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/ocean_connect_integration_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/ota_package_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/owner_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/report_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/role_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/rpc_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/rpc_v_2_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/rule_engine_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/scheduler_event_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/self_registration_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/sig_fox_integration_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/sign_up_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/solution_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/subscription_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/t_mobile_iot_cdp_integration_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/tenant_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/thing_park_integration_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/trail_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/user_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/user_permissions_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/white_labeling_controller_api.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/admin_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/asset_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/billing_endpoint_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/blob_entity_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/chirp_stack_integration_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/cloud_endpoint_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/converter_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/custom_menu_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/custom_translation_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/customer_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/dashboard_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/device_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/device_group_ota_package_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/edge_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/edge_event_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/entity_group_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/entity_view_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/group_permission_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/http_integration_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/integration_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/loriot_integration_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/lwm_2m_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/ocean_connect_integration_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/ota_package_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/owner_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/report_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/role_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/rpc_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/rpc_v_2_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/rule_engine_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/scheduler_event_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/self_registration_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/sig_fox_integration_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/sign_up_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/solution_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/subscription_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/t_mobile_iot_cdp_integration_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/tenant_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/thing_park_integration_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/trail_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/user_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/user_permissions_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/white_labeling_controller_api.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api_client.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/configuration.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/admin_settings.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/admin_settings_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_condition.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_condition_filter.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_condition_filter_key.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_condition_spec.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_data.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_data_page_link.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_data_query.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_rule.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_schedule.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/asset.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/asset_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/asset_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/asset_search_query.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/attributes_entity_view.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/audit_log.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/audit_log_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/byte_buffer.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/claim_request.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/component_descriptor.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/component_descriptor_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/customer.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/customer_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/dashboard.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/dashboard_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/dashboard_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/default_rule_chain_create_request.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/deferred_result_response_entity.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_configuration.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_credentials.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_credentials_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_data.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_alarm.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_configuration.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_data.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_provision_configuration.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_transport_configuration.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_search_query.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_transport_configuration.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_event.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_event_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_search_query.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_count_query.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_data.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_data_page_link.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_data_query.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_data_sort_order.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_filter.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_key.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_relation.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_relation_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_relations_query.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_subtype.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_view.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_view_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_view_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_view_search_query.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/event.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/event_filter.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/event_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/file.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/home_dashboard.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/home_dashboard_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/input_stream.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/key_filter.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/key_filter_predicate.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/lw_m2m_instance.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/lw_m2m_object.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/lw_m2m_resource_observe.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/mapstring_ts_value.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/node_connection_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_basic_mapper_config.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_client_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_client_registration_template.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_client_registration_template_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_custom_mapper_config.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_domain_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_mapper_config.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_mobile_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_params_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_registration_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/object_node.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/ota_package.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/ota_package_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/ota_package_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/ota_package_ota_package_idchecksumchecksum_algorithm_body.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_alarm_data.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_alarm_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_asset.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_asset_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_audit_log.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_customer.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_dashboard_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_device.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_device_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_device_profile.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_device_profile_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_edge.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_edge_event.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_edge_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_entity_data.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_entity_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_entity_view.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_entity_view_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_event.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_ota_package_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_rpc.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_rule_chain.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_tb_resource_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_tenant.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_tenant_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_tenant_profile.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_user.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_widgets_bundle.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/relation_entity_type_filter.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/relations_search_parameters.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/resource.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/response_entity.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rpc.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rpc_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain_connection_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain_data.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain_meta_data.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_node.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_node_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/save_ota_package_info_request.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/security_settings.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/server_security_config.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/short_customer_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/sign_up_request.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/sms_provider_configuration.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tb_resource.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tb_resource_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tb_resource_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/telemetry_entity_view.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_profile.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_profile_configuration.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_profile_data.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_profile_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/test_sms_request.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/ts_value.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/update_message.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/uri.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/url.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/url_stream_handler.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/user.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/user_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/user_password_policy.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/widget_type.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/widget_type_details.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/widget_type_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/widget_type_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/widgets_bundle.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/widgets_bundle_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/admin_settings.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/admin_settings_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition_filter.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition_filter_key.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition_spec.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_data.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_data_page_link.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_data_query.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_rule.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_schedule.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset_search_query.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/attributes_entity_view.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/audit_log.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/audit_log_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/byte_buffer.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/claim_request.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/component_descriptor.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/component_descriptor_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/customer.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/customer_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/dashboard.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/dashboard_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/dashboard_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/default_rule_chain_create_request.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/deferred_result_response_entity.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_configuration.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_credentials.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_credentials_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_data.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_alarm.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_configuration.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_data.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_provision_configuration.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_transport_configuration.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_search_query.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_transport_configuration.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_event.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_event_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_search_query.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_count_query.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data_page_link.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data_query.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data_sort_order.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_filter.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_key.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_relation.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_relation_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_relations_query.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_subtype.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view_search_query.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/event.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/event_filter.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/event_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/file.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/home_dashboard.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/home_dashboard_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/input_stream.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/key_filter.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/key_filter_predicate.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/lw_m2m_instance.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/lw_m2m_object.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/lw_m2m_resource_observe.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/mapstring_ts_value.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/node_connection_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_basic_mapper_config.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_client_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_client_registration_template.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_client_registration_template_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_custom_mapper_config.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_domain_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_mapper_config.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_mobile_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_params_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_registration_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/object_node.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package_ota_package_idchecksumchecksum_algorithm_body.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_alarm_data.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_alarm_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_asset.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_asset_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_audit_log.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_customer.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_dashboard_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device_profile.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device_profile_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_edge.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_edge_event.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_edge_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_data.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_view.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_view_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_event.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_ota_package_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_rpc.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_rule_chain.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tb_resource_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tenant.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tenant_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tenant_profile.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_user.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_widgets_bundle.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/relation_entity_type_filter.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/relations_search_parameters.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/resource.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/response_entity.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rpc.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rpc_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_connection_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_data.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_meta_data.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_node.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_node_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/save_ota_package_info_request.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/security_settings.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/server_security_config.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/short_customer_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/sign_up_request.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/sms_provider_configuration.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tb_resource.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tb_resource_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tb_resource_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/telemetry_entity_view.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile_configuration.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile_data.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/test_sms_request.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ts_value.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/update_message.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/uri.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/url.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/url_stream_handler.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/user.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/user_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/user_password_policy.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type_details.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widgets_bundle.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widgets_bundle_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/allowed_permissions_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/asset.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/asset_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/audit_log.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/blob_entity_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/blob_entity_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/blob_entity_with_customer_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/client_registration_dto.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/component_descriptor.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/contact_basedobject.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/converter.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/converter_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/custom_menu.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/custom_menu_item.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/custom_translation.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/customer.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/dashboard.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/dashboard_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/delete_tenant_request.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/device.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/device_group_ota_package.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/domain_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/edge.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/edge_event.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_data.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_group.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_group_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_group_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_relation.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_relation_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_subtype.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_view.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_view_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/favicon.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/group_permission.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/group_permission_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/group_permission_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/home_dashboard.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/http_routing_key_body.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/integration.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/integration_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/login_white_labeling_params.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/merged_group_permission_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/merged_group_type_permission_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/merged_user_permissions.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/o_auth2_basic_mapper_config.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/o_auth2_clients_domain_params.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/o_auth2_clients_params.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_blob_entity_with_customer_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_contact_basedobject.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_converter.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_entity_group_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_integration.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_role.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_scheduler_event_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_short_entity_view.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/palette.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/palette_settings.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/relation_entity_type_filter.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/relations_search_parameters.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/report_config.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/role.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/role_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/scheduler_event.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/scheduler_event_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/scheduler_event_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/scheduler_event_with_customer_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/self_registration_params.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/share_group_request.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/short_entity_view.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/sign_up_request.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/sign_up_self_registration_params.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/solution_install_response.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/subscription_usage.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/tenant_solution_template_details.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/tenant_solution_template_info.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/tenant_solution_template_instructions.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/user.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/user_id.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/white_labeling_params.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/allowed_permissions_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/asset.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/asset_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/audit_log.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/blob_entity_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/blob_entity_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/blob_entity_with_customer_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/client_registration_dto.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/component_descriptor.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/contact_basedobject.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/converter.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/converter_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/custom_menu.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/custom_menu_item.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/custom_translation.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/customer.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/dashboard.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/dashboard_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/delete_tenant_request.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/device.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/device_group_ota_package.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/domain_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/edge.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/edge_event.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_data.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_group.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_group_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_group_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_relation.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_relation_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_subtype.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_view.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_view_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/favicon.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/group_permission.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/group_permission_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/group_permission_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/home_dashboard.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/http_routing_key_body.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/integration.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/integration_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/login_white_labeling_params.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/merged_group_permission_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/merged_group_type_permission_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/merged_user_permissions.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/o_auth2_basic_mapper_config.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/o_auth2_clients_domain_params.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/o_auth2_clients_params.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_blob_entity_with_customer_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_contact_basedobject.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_converter.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_entity_group_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_integration.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_role.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_scheduler_event_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_short_entity_view.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/palette.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/palette_settings.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/relation_entity_type_filter.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/relations_search_parameters.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/report_config.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/role.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/role_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event_with_customer_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/self_registration_params.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/share_group_request.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/short_entity_view.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/sign_up_request.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/sign_up_self_registration_params.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/solution_install_response.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/subscription_usage.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/tenant_solution_template_details.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/tenant_solution_template_info.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/tenant_solution_template_instructions.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/user.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/user_id.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/white_labeling_params.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest_client_base.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest_client_ce.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest_client_pe.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/_collections.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/_version.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/connection.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/connectionpool.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/exceptions.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/fields.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/filepost.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/poolmanager.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/request.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/response.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/_collections.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/_version.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/connection.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/connectionpool.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/_appengine_environ.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/appengine.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/securetransport.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/socks.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/_appengine_environ.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/_securetransport/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/_securetransport/bindings.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/_securetransport/low_level.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/appengine.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/ntlmpool.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/securetransport.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/socks.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/exceptions.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/fields.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/filepost.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/__pycache__/six.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/makefile.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/six.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/poolmanager.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/request.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/response.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__init__.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/__init__.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/connection.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/proxy.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/queue.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/request.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/response.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/retry.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/ssl_.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/ssltransport.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/timeout.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/url.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/wait.cpython-310.pyc create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/connection.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/proxy.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/queue.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/request.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/response.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/retry.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/ssl_.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/ssl_match_hostname.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/ssltransport.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/timeout.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/url.py create mode 100644 AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/wait.py create mode 100644 AWS Lambda Layer/tb-rest-client-3-9.zip create mode 100644 AWS Lambda Layer/tb-rest-client.zip diff --git a/.DS_Store b/.DS_Store index d6920c5d7c59734fc18c43980eb2f5d452d9e337..34bf634d30420228840b74b43a3a544d2f74b096 100644 GIT binary patch delta 380 zcmZp1XmOa}&nUVvU^hRb=wu!NHAMjiM}}~QUJdjE8;ibrRLAD#rx2+TRbN2{>5eQ5F3QVc&(BK-x{PtNzCblIBg5p? Y!V@-D-e%m)F7b_JGLP^)n9vPI0PlxUIRF3v delta 47 zcmZp1XmOa}&&aS5ZT6 zoc*a7>(50*Wd>%y+1Z)h?3b{cA%xKS(6b0B6G9lM#9R@YcSMd$os*pL6acB3Ly*uN z#gQ8bcP<(ozmWm??v_YI?npvVmz-6-(mq*{HVxrO}VQh^m%iCsB8F>;btGK}l3 z!G-Ld3K6(7yXBtwol&#AawNi}<%gYtO7Oi7gj}Bcp(jRlF$}#}kPs`gk6|>wy9T-geEe8 z3?KvF%z!y*Sm~SR#p#d%WZ>^JAkPO5D$zEWYE(xDG^zvu%!6AA*s_+8IozOaFx3bn zAXKLU>Qrh<464(?&rO_dFx9Bj2{pwBH7iq7p-{Ct%+FOgp|(bBkpW~N%fN!}mgW6_ z{BixCO~M{BfDHUA257$FH0rP=bGOcIPTsW~^cqx(j7v4Xq=2EWVu+Pj@fxTS@N;PZ V+6GgN-~quO0Yw8g$iR;>@C=HVZ?ymb literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/.DS_Store b/AWS Lambda Layer/python/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9386a822c271f415bedecf1fb85a62273819ab42 GIT binary patch literal 6148 zcmeHK!EPEc5Ve68BUFh)Dz!IDy&{z@Qqn4y4WYN3vQ=|vBf@48S#?<>7P<$7wD7A&v$R^8F%CBa?T`ER8ao8@K^gQ?*{> z?R?&De`sp&@MzK0bI&{c)YM0qOag z62kH@lw8Ts3$D#*b#Kzh$aK53chyz<;jBHlJ9)|*ndq6(@y)hbe+H8@G3gLyS}qt& z7G{7MUEPEC=MxqVUAmA|d`Nn-qzXmar^Ec(h70LCXC W1JEZd9D)age*`QI+%N-eyk# literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/.DS_Store b/AWS Lambda Layer/python/lib/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..06ef86cea097d13aed932de7b81c4ae2ef753806 GIT binary patch literal 6148 zcmeHK&1%~~5T3Q2dPOMs&_Z%s$knt~4f&ym$c}RlRY?y`aIDD0BC=Lka!qjzx~DJH zd!8ZBli42!2RqS5T0$T-6BE{3VK`cTCuTU6)&;Y7cipW4>f5*4W`-9r1nq>x$9&265f3V zpU2ssilSD$2OmuZ zjkd;IA*HiLOwHd^)brWI7OAp=pf*MuE2q z6jiq>?*D_&>;JbT(=!Sf1^$!*q||oWE!>j6Tif@b~*NEu9H6!=jEo&j%#e%Am1 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__init__.py new file mode 100644 index 0000000..b700d3a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__init__.py @@ -0,0 +1,4 @@ +from .core import contents, where + +__all__ = ["contents", "where"] +__version__ = "2022.05.18.1" diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__main__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__main__.py new file mode 100644 index 0000000..8945b5d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__main__.py @@ -0,0 +1,12 @@ +import argparse + +from certifi import contents, where + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--contents", action="store_true") +args = parser.parse_args() + +if args.contents: + print(contents()) +else: + print(where()) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c44325bf8fa5bc1e8144d3b2108026e2c52bd3a7 GIT binary patch literal 296 zcmYk1K}y6h6o!+uohj;oM{wJPP1`|mA>s*iA%b-CY@19QOp}ttk?}NcJ%E?V)|FRq zWwM(e-uL);0u{`tcdt~rcX8;s1k#wvruBE&B(WutG%Ue5^A))?hK<+^mIA6NvmyHSJVo} pFPCn3?M80tz>O0-K>DWi5=N4s9l+Phcfa2yo^^S zW;Q0A2mvSgKmEV&K3h#D3G#LIwqJbu{@$Da6?${-k14!x#Bqa)zLN&Gq#$ij1Q-F@ zk6us_Lb#52z(+jf(Q}`N`?1esh}T3P!2ysb^n|ge+#v6QKbMU^JRedeeIB zbw8n9G)!uD$T%|!qd~(?3u#}GPJ2`@Uw8D@6AYE2QnVFPES0WdPC-5x zYF9$mW}%qov=Iy1ZS6|Q`RwGF8et*tSar{8F!bk(v@BaDWLeI-t&2}v#WxL{VgHVq RdWq4L#AJ$N9FY{Kh(BkuO5lw1~coI`0SYF4Th)_1B zOhlsgf=`-HNSSgXTPI^m{3p3&M{U1jmrOcnHAGzL-Fm&Ah+Co|JEAGOqJ=BCukx0N zj_AG!C-KJj*4p<|Qqp6xnd^ydjJGA&w`8z$Dw9HjRZ}%wo+Lm1+md8FQ>MSrVl|h2 zkah*7>D!s?tJ2tfKF_VvWq+=VwW6o}BKMw#OS$N4=qqdbg)Xfutr;f2BT!^Cpe}q| z;<*8He3{#stAor%X5|moMe87i-+8kIXzXD(@1w8?_liKrR#2a_oY}y#3w}w?X^yK{ zQZRD0O-WbD+nffWYi4^7_8vYOXZsJvU%2>C+N?^VaXr5`{>}x)f~#j4<}D%1UJ+{9rLz3qq;{stLvx^W5b0bUq{|aK)8)P4-49cvth}?# zi)Z0*#Zub_}FmSv#@CgLIqpurRzyg+2y><9aE}DqqL_g$_dK;Rvp_=-~)_Ayo=4%uS&b+{TFkt*W{atfH0o;Nt6dQaNQf)uzz*hZuBm z0MCs<&(*R_=pxI&Bj7@NvXsU}IN*JQKjya8VyVF*{f5_+SVI8#8(U)y{?`Vc1<>%q zm+Kl|R_7ji%DCj~>d}wUy{ql7S?l6Q8;Vtl{eKystp66D`P(x0QE(DRF>O-Dx=3hF kd#t(J_I907{+dzthB5Xx3)o+bv)3$4{_Hi_AHCgw06)4%VgLXD literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/cacert.pem b/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/cacert.pem new file mode 100644 index 0000000..f597fb3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/cacert.pem @@ -0,0 +1,4530 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Label: "EC-ACC" +# Serial: -23701579247955709139626555126524820479 +# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09 +# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8 +# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99 +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB +8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy +dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 +YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 +dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh +IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD +LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG +EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g +KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD +ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu +bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg +ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R +85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm +4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV +HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd +QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t +lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB +o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 +opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo +dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW +ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN +AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y +/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k +SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy +Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS +Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl +nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +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 +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G4" +# Serial: 289383649854506086828220374796556676440 +# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 +# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 +# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw +gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL +Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg +MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw +BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 +MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 +c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ +bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ +2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E +T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j +5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM +C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T +DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX +wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A +2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm +nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl +N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj +c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS +5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS +Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr +hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ +B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI +AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw +H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ +b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk +2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol +IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk +5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY +n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft ECC Root Certificate Authority 2017" +# Serial: 136839042543790627607696632466672567020 +# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 +# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 +# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD +VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw +MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy +b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR +ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb +hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 +FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV +L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB +iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft RSA Root Certificate Authority 2017" +# Serial: 40975477897264996090493496164228220339 +# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 +# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 +# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N +aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ +Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 +ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 +HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm +gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ +jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc +aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG +YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 +W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K +UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH ++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q +W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC +LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC +gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 +tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh +SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 +TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 +pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR +xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp +GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 +dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN +AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB +RA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Label: "e-Szigno Root CA 2017" +# Serial: 411379200276854331539784714 +# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 +# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 +# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV +BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk +LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv +b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ +BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg +THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v +IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv +xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H +Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB +eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo +jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ ++efcMQ== +-----END CERTIFICATE----- + +# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Label: "certSIGN Root CA G2" +# Serial: 313609486401300475190 +# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 +# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 +# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV +BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g +Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ +BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ +R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF +dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw +vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ +uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp +n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs +cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW +xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P +rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF +DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx +DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy +LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C +eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ +d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq +kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl +qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 +OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c +NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk +ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO +pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj +03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk +PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE +1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX +QRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global Certification Authority" +# Serial: 1846098327275375458322922162 +# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e +# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 +# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw +CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x +ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 +c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx +OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI +SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn +swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu +7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 +1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW +80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP +JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l +RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw +hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 +coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc +BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n +twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W +0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe +uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q +lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB +aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE +sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT +MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe +qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh +VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 +h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 +EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK +yeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P256 Certification Authority" +# Serial: 4151900041497450638097112925 +# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 +# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf +# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG +SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN +FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w +DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw +CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh +DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P384 Certification Authority" +# Serial: 2704997926503831671788816187 +# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 +# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 +# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB +BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ +j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF +1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G +A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 +AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC +MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu +Sw== +-----END CERTIFICATE----- + +# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Label: "NAVER Global Root Certification Authority" +# Serial: 9013692873798656336226253319739695165984492813 +# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b +# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 +# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM +BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG +T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx +CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD +b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA +iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH +38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE +HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz +kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP +szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq +vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf +nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG +YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo +0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a +CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K +AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I +36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN +qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj +cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm ++LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL +hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe +lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 +p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 +piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR +LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX +5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO +dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul +9XXeifdy +-----END CERTIFICATE----- + +# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" +# Serial: 131542671362353147877283741781055151509 +# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb +# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a +# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw +CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw +FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S +Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 +MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL +DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS +QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH +sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK +Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu +SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC +MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy +v+c= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Label: "GlobalSign Root R46" +# Serial: 1552617688466950547958867513931858518042577 +# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef +# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 +# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA +MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD +VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy +MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt +c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ +OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG +vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud +316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo +0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE +y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF +zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE ++cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN +I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs +x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa +ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC +4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 +7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti +2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk +pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF +FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt +rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk +ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 +u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP +4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 +N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 +vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Label: "GlobalSign Root E46" +# Serial: 1552617690338932563915843282459653771421763 +# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f +# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 +# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx +CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD +ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw +MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex +HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq +R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd +yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ +7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 ++RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Label: "GLOBALTRUST 2020" +# Serial: 109160994242082918454945253 +# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 +# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 +# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG +A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw +FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx +MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u +aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b +RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z +YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 +QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw +yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ +BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ +SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH +r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 +4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me +dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw +q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 +nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu +H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC +XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd +6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf ++I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi +kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 +wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB +TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C +MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn +4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I +aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy +qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Label: "ANF Secure Server Root CA" +# Serial: 996390341000653745 +# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 +# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 +# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum EC-384 CA" +# Serial: 160250656287871593594747141429395092468 +# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 +# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed +# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw +CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw +JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT +EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 +WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT +LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX +BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE +KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm +Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 +EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J +UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn +nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Root CA" +# Serial: 40870380103424195783807378461123655149 +# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 +# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 +# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd +-----BEGIN CERTIFICATE----- +MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6 +MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu +MScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNV +BAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwHhcNMTgwMzE2MTIxMDEzWhcNNDMw +MzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEg +U3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZ +n0EGze2jusDbCSzBfN8pfktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/q +p1x4EaTByIVcJdPTsuclzxFUl6s1wB52HO8AU5853BSlLCIls3Jy/I2z5T4IHhQq +NwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2fJmItdUDmj0VDT06qKhF +8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGtg/BKEiJ3 +HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGa +mqi4NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi +7VdNIuJGmj8PkTQkfVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSF +ytKAQd8FqKPVhJBPC/PgP5sZ0jeJP/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0P +qafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSYnjYJdmZm/Bo/6khUHL4wvYBQ +v3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHKHRzQ+8S1h9E6 +Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 +vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQAD +ggIBAEii1QALLtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4 +WxmB82M+w85bj/UvXgF2Ez8sALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvo +zMrnadyHncI013nR03e4qllY/p0m+jiGPp2Kh2RX5Rc64vmNueMzeMGQ2Ljdt4NR +5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8CYyqOhNf6DR5UMEQ +GfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA4kZf +5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq +0Uc9NneoWWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7D +P78v3DSk+yshzWePS/Tj6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTM +qJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmTOPQD8rv7gmsHINFSH5pkAnuYZttcTVoP +0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZckbxJF0WddCajJFdr60qZf +E2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb +-----END CERTIFICATE----- + +# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Label: "TunTrust Root CA" +# Serial: 108534058042236574382096126452369648152337120275 +# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 +# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb +# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg +Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv +b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG +EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u +IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ +n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd +2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF +VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ +GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF +li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU +r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 +eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb +MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg +jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB +7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW +5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE +ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z +xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu +QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 +FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH +22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP +xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn +dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 +Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b +nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ +CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH +u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj +d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS RSA Root CA 2021" +# Serial: 76817823531813593706434026085292783742 +# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 +# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d +# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs +MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg +Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL +MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l +mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE +4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv +a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M +pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw +Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b +LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY +AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB +AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq +E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr +W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ +CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU +X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 +f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja +H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP +JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P +zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt +jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 +/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT +BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 +aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW +xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU +63ZTGI0RmLo= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS ECC Root CA 2021" +# Serial: 137515985548005187474074462014555733966 +# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 +# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 +# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw +CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh +cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v +dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG +A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 +KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y +STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD +AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw +SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN +nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 1977337328857672817 +# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3 +# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe +# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 +MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc +tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd +IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC +AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw +ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m +iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF +Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ +hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P +Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE +EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV +1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t +CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR +5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw +f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 +ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK +GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus ECC Root CA" +# Serial: 630369271402956006249506845124680065938238527194 +# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85 +# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1 +# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3 +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw +RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY +BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz +MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u +LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 +v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd +e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw +V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA +AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG +GJTO +-----END CERTIFICATE----- + +# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus Root CA" +# Serial: 387574501246983434957692974888460947164905180485 +# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc +# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7 +# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87 +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL +BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x +FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx +MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s +THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc +IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU +AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ +GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 +8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH +flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt +J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim +0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN +pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ +UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW +OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB +AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet +8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j +bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM +Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv +TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS +S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr +I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 +b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB +UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P +Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven +sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X2 O=Internet Security Research Group +# Subject: CN=ISRG Root X2 O=Internet Security Research Group +# Label: "ISRG Root X2" +# Serial: 87493402998870891108772069816698636114 +# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5 +# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af +# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70 +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 +MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT +ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW ++1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 +ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI +zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW +tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 +/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Label: "HiPKI Root CA - G1" +# Serial: 60966262342023497858655262305426234976 +# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3 +# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60 +# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa +Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 +YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw +qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv +Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 +lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz +Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ +KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK +FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj +HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr +y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ +/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM +a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 +fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG +SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc +SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza +ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc +XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg +iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho +L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF +Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr +kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ +vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU +YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 159662223612894884239637590694 +# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc +# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28 +# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2 +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD +VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw +MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g +UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT +BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx +uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV +HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ ++wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 +bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 159662320309726417404178440727 +# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 +# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a +# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo +27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w +Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw +TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl +qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH +szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 +Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk +MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p +aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN +VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb +C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy +h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 +7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J +ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef +MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ +Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT +6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ +0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm +2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb +bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 159662449406622349769042896298 +# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc +# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94 +# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8 +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt +nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY +6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu +MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k +RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg +f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV ++3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo +dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW +Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa +G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq +gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H +vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC +B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u +NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg +yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev +HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 +xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR +TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg +JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV +7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl +6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 159662495401136852707857743206 +# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73 +# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46 +# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48 +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G +jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 +4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 +VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm +ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 159662532700760215368942768210 +# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 +# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 +# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi +QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR +HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D +9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 +p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj +# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj +# Label: "Telia Root CA v2" +# Serial: 7288924052977061235122729490515358 +# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48 +# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd +# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx +CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE +AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 +NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ +MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq +AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 +vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 +lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD +n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT +7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o +6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC +TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 +WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R +DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI +pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj +YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy +rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi +0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM +A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS +SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K +TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF +6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er +3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt +Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT +VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW +ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA +rBPuUBQemMc= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST BR Root CA 1 2020" +# Serial: 165870826978392376648679885835942448534 +# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed +# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67 +# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44 +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 +NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS +zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 +QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ +VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW +wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV +dWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST EV Root CA 1 2020" +# Serial: 126288379621884218666039612629459926992 +# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e +# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07 +# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 +NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC +/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD +wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 +OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA +y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb +gfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/core.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/core.py new file mode 100644 index 0000000..497d938 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/core.py @@ -0,0 +1,68 @@ +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem or its contents. +""" +import os +import types +from typing import Union + +try: + from importlib.resources import path as get_path, read_text + + _CACERT_CTX = None + _CACERT_PATH = None + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the file + # in cases where we're inside of a zipimport situation until someone + # actually calls where(), but we don't want to re-extract the file + # on every call of where(), so we'll do it once then store it in a + # global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you to + # manage the cleanup of this file, so it doesn't actually return a + # path, it returns a context manager that will give you the path + # when you enter it and will do any cleanup when you leave it. In + # the common case of not needing a temporary file, it will just + # return the file system location and the __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = get_path("certifi", "cacert.pem") + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + + return _CACERT_PATH + + +except ImportError: + Package = Union[types.ModuleType, str] + Resource = Union[str, "os.PathLike"] + + # This fallback will work for Python versions prior to 3.7 that lack the + # importlib.resources module but relies on the existing `where` function + # so won't address issues with environments like PyOxidizer that don't set + # __file__ on modules. + def read_text( + package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict' + ) -> str: + with open(where(), encoding=encoding) as data: + return data.read() + + # If we don't have importlib.resources, then we will just do the old logic + # of assuming we're on the filesystem and munge the path directly. + def where() -> str: + f = os.path.dirname(__file__) + + return os.path.join(f, "cacert.pem") + + +def contents() -> str: + return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/py.typed b/AWS Lambda Layer/python/lib/python3.9/site-packages/certifi/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__init__.py new file mode 100644 index 0000000..1aea851 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__init__.py @@ -0,0 +1,56 @@ +# -*- coding: utf_8 -*- +""" +Charset-Normalizer +~~~~~~~~~~~~~~ +The Real First Universal Charset Detector. +A library that helps you read text from an unknown charset encoding. +Motivated by chardet, This package is trying to resolve the issue by taking a new approach. +All IANA character set names for which the Python core library provides codecs are supported. + +Basic usage: + >>> from charset_normalizer import from_bytes + >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) + >>> best_guess = results.best() + >>> str(best_guess) + 'Bсеки човек има право на образование. Oбразованието!' + +Others methods and usages are available - see the full documentation +at . +:copyright: (c) 2021 by Ahmed TAHRI +:license: MIT, see LICENSE for more details. +""" +import logging + +from .api import from_bytes, from_fp, from_path, normalize +from .legacy import ( + CharsetDetector, + CharsetDoctor, + CharsetNormalizerMatch, + CharsetNormalizerMatches, + detect, +) +from .models import CharsetMatch, CharsetMatches +from .utils import set_logging_handler +from .version import VERSION, __version__ + +__all__ = ( + "from_fp", + "from_path", + "from_bytes", + "normalize", + "detect", + "CharsetMatch", + "CharsetMatches", + "CharsetNormalizerMatch", + "CharsetNormalizerMatches", + "CharsetDetector", + "CharsetDoctor", + "__version__", + "VERSION", + "set_logging_handler", +) + +# Attach a NullHandler to the top level logger by default +# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library + +logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55b7fe9d0b8ea744d6e8bf7b855c6813ac7111aa GIT binary patch literal 1728 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 F{{fHVfx!R( literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/legacy.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/legacy.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37a3104f2a62ac429646625be46f818fb9a5b46e GIT binary patch literal 2908 zcmbVOOOG4J5uTnI4u@QlTCdiM6a+}e57~?*QjQeF5DZ(v?!w6-lpsq9FozJs=_Wbe zdC)!0U30^|WOdFj$Uy>f(I3bm$SFUguQ~Y^K(_==@>P?&TG{dg9-xa=T|HIR_4tNm zyWMo~T>IP^gdAM};6d&Rlp5FPuXA)1f; zXzL?KY>3t)N3>-7#EULMZi^1&j_g3*hI~P6Lf(|ykY9!Tir9j@W#vnPee85EevbH^ zLDw_>ZklKl-ks^REaJ@69u{CeXHa*2(;TZZAC4AUR;F(G@ys+VGmG`qG>TH?ah4v* zE;E;Qe)Y@yyL%6YJ9qEj-~0I9-NEkOU}vxEn%2%VR+ZGhiFGnHo%0e5hh%?PX=MT> z^;{JRc|Uz>U})`NReuN3&eG9LyJPpntv0nM*kfPUmd*)#!cN#9*-C%nsw>*1-D5`w z^!vE}#5rb5CfqqwSC{OQumFGTu6J%>ry;z3PgxE+|JYmWJ`^=*o0lE?hQHpuw{%6Y z@2Y#yZGgI>{tE~8T-`cg>bFa`@N{d5;w`V#AEsHxb1Dj_nou<5VZjeos>$c!R2K3;Dn2W#%G%&> z4@#UVp2ubF%!_J1o0UpS1hL?$?pkLLrfJ2;^CF?%;^2jxDVfA{EH1>ku;&%FbjkB{ zqM+uBat^Pm{Dkr#<0{P-*LYIGO}5I5D3f_E3yr(M^te>k;dri)G{w^bJGd8gJx&qN zvbZSV0^3~4ygZ1rUemsEdlsuWw;81tyiJwi50Lp)j^(Fwlt5B!^0PQki*+84ZtZu48%&shQ*w?Ko0H0%+dVWZ~ik+v9`Z0d~9rqtrQdRvT zP0BtJlETMC-t5cbpz7->`lcF{=%s#^j{36&n!32zd-q1aO0~Q`Lto-PRiBz4fG|A6 z57l4IL2tG&0U8mxC9tiof^?cLb6J!5|83Sn)^fMpAF)g9k{`0b5B?Xpqz(R~euAS3 z)(a0o$sMd`EfDEMOgNEiG0+8It)dv5f|#-ZHF%0542RU&!=Y&ohj}UH8S$;*@Y8vm ztu!_r=Lm-b^*YE6tY#%gD5kqu&wdD^oySZ7MxVIM(caQYohADV`xCwnPu;=M zKH5vC$qJPC8u_oS7~5uRp1uNhmd^^wVb=*d)43hj&orR)eoN(+9ocLU#<5MWhM z>lmLnv$eZM3QX|tRw`9T&`(|C#|p;+g11Ta<@D2;pVJMgm3?Xq*Z-nZJF@VGe*03T zWz}0>?Q3(TehN$K9gwcCt`UEoNRJ2&l1Q;1NnLBPM23+sHXKEtINs5hWESL5gY z$X7(lw~3JSt=8M8*2_eHqiyQr-=Engsrv)lfhGW)V^|c;wDO41WE(G@rK=>-7^t&M zMIn7T@ww0z;Y|QMlUb!U=oG=Cx@=#ke_*w7R>s;wsYNcEF?%sZ5xgu3CVYPdkRMPY aEBdO0&NjR3w%8`S>TSNY>2F@$_Wut(p4J`! literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/md.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/md.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cdf50fc54c6c879dfd15030441e9c5eda81ba1c5 GIT binary patch literal 13988 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 D93DLK literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/utils.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eaedc7fe54cf81b460e64f7df3ccfef44a3aa9c7 GIT binary patch literal 7767 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/version.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/__pycache__/version.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0a8bf29b6eb91361522e84f9271cb759df7b106 GIT binary patch literal 277 zcmYk1y-ve06ou_3v?!>EiJ7$$*!@`%V(GwA5LFqnSWavbi^SKmO-1uG?Z^x8FkX2J zCLGj(Bi(a!q^tYs!g!pasOztN@f7pBFaMRqav#TCMiVGU0_Rxb{Xh&3I8Q{fMw7I= z$d(@loV?mf>lEm$8_vm;%;o`;)g%og#srj%g)_#EE3uq7( CharsetMatches: + """ + Given a raw bytes sequence, return the best possibles charset usable to render str objects. + If there is no results, it is a strong indicator that the source is binary/not text. + By default, the process will extract 5 blocs of 512o each to assess the mess and coherence of a given sequence. + And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. + + The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page + but never take it for granted. Can improve the performance. + + You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that + purpose. + + This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. + By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain' + toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging. + Custom logging format and handler can be set manually. + """ + + if not isinstance(sequences, (bytearray, bytes)): + raise TypeError( + "Expected object of type bytes or bytearray, got: {0}".format( + type(sequences) + ) + ) + + if explain: + previous_logger_level = logger.level # type: int + logger.addHandler(explain_handler) + logger.setLevel(TRACE) + + length = len(sequences) # type: int + + if length == 0: + logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level or logging.WARNING) + return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) + + if cp_isolation is not None: + logger.log( + TRACE, + "cp_isolation is set. use this flag for debugging purpose. " + "limited list of encoding allowed : %s.", + ", ".join(cp_isolation), + ) + cp_isolation = [iana_name(cp, False) for cp in cp_isolation] + else: + cp_isolation = [] + + if cp_exclusion is not None: + logger.log( + TRACE, + "cp_exclusion is set. use this flag for debugging purpose. " + "limited list of encoding excluded : %s.", + ", ".join(cp_exclusion), + ) + cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] + else: + cp_exclusion = [] + + if length <= (chunk_size * steps): + logger.log( + TRACE, + "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", + steps, + chunk_size, + length, + ) + steps = 1 + chunk_size = length + + if steps > 1 and length / steps < chunk_size: + chunk_size = int(length / steps) + + is_too_small_sequence = len(sequences) < TOO_SMALL_SEQUENCE # type: bool + is_too_large_sequence = len(sequences) >= TOO_BIG_SEQUENCE # type: bool + + if is_too_small_sequence: + logger.log( + TRACE, + "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( + length + ), + ) + elif is_too_large_sequence: + logger.log( + TRACE, + "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( + length + ), + ) + + prioritized_encodings = [] # type: List[str] + + specified_encoding = ( + any_specified_encoding(sequences) if preemptive_behaviour else None + ) # type: Optional[str] + + if specified_encoding is not None: + prioritized_encodings.append(specified_encoding) + logger.log( + TRACE, + "Detected declarative mark in sequence. Priority +1 given for %s.", + specified_encoding, + ) + + tested = set() # type: Set[str] + tested_but_hard_failure = [] # type: List[str] + tested_but_soft_failure = [] # type: List[str] + + fallback_ascii = None # type: Optional[CharsetMatch] + fallback_u8 = None # type: Optional[CharsetMatch] + fallback_specified = None # type: Optional[CharsetMatch] + + results = CharsetMatches() # type: CharsetMatches + + sig_encoding, sig_payload = identify_sig_or_bom(sequences) + + if sig_encoding is not None: + prioritized_encodings.append(sig_encoding) + logger.log( + TRACE, + "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", + len(sig_payload), + sig_encoding, + ) + + prioritized_encodings.append("ascii") + + if "utf_8" not in prioritized_encodings: + prioritized_encodings.append("utf_8") + + for encoding_iana in prioritized_encodings + IANA_SUPPORTED: + + if cp_isolation and encoding_iana not in cp_isolation: + continue + + if cp_exclusion and encoding_iana in cp_exclusion: + continue + + if encoding_iana in tested: + continue + + tested.add(encoding_iana) + + decoded_payload = None # type: Optional[str] + bom_or_sig_available = sig_encoding == encoding_iana # type: bool + strip_sig_or_bom = bom_or_sig_available and should_strip_sig_or_bom( + encoding_iana + ) # type: bool + + if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available: + logger.log( + TRACE, + "Encoding %s wont be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", + encoding_iana, + ) + continue + + try: + is_multi_byte_decoder = is_multi_byte_encoding(encoding_iana) # type: bool + except (ModuleNotFoundError, ImportError): + logger.log( + TRACE, + "Encoding %s does not provide an IncrementalDecoder", + encoding_iana, + ) + continue + + try: + if is_too_large_sequence and is_multi_byte_decoder is False: + str( + sequences[: int(50e4)] + if strip_sig_or_bom is False + else sequences[len(sig_payload) : int(50e4)], + encoding=encoding_iana, + ) + else: + decoded_payload = str( + sequences + if strip_sig_or_bom is False + else sequences[len(sig_payload) :], + encoding=encoding_iana, + ) + except (UnicodeDecodeError, LookupError) as e: + if not isinstance(e, LookupError): + logger.log( + TRACE, + "Code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + similar_soft_failure_test = False # type: bool + + for encoding_soft_failed in tested_but_soft_failure: + if is_cp_similar(encoding_iana, encoding_soft_failed): + similar_soft_failure_test = True + break + + if similar_soft_failure_test: + logger.log( + TRACE, + "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!", + encoding_iana, + encoding_soft_failed, + ) + continue + + r_ = range( + 0 if not bom_or_sig_available else len(sig_payload), + length, + int(length / steps), + ) + + multi_byte_bonus = ( + is_multi_byte_decoder + and decoded_payload is not None + and len(decoded_payload) < length + ) # type: bool + + if multi_byte_bonus: + logger.log( + TRACE, + "Code page %s is a multi byte encoding table and it appear that at least one character " + "was encoded using n-bytes.", + encoding_iana, + ) + + max_chunk_gave_up = int(len(r_) / 4) # type: int + + max_chunk_gave_up = max(max_chunk_gave_up, 2) + early_stop_count = 0 # type: int + lazy_str_hard_failure = False + + md_chunks = [] # type: List[str] + md_ratios = [] + + for i in r_: + if i + chunk_size > length + 8: + continue + + cut_sequence = sequences[i : i + chunk_size] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + try: + chunk = cut_sequence.decode( + encoding_iana, + errors="ignore" if is_multi_byte_decoder else "strict", + ) # type: str + except UnicodeDecodeError as e: # Lazy str loading may have missed something there + logger.log( + TRACE, + "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + early_stop_count = max_chunk_gave_up + lazy_str_hard_failure = True + break + + # multi-byte bad cutting detector and adjustment + # not the cleanest way to perform that fix but clever enough for now. + if is_multi_byte_decoder and i > 0 and sequences[i] >= 0x80: + + chunk_partial_size_chk = min(chunk_size, 16) # type: int + + if ( + decoded_payload + and chunk[:chunk_partial_size_chk] not in decoded_payload + ): + for j in range(i, i - 4, -1): + cut_sequence = sequences[j : i + chunk_size] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode(encoding_iana, errors="ignore") + + if chunk[:chunk_partial_size_chk] in decoded_payload: + break + + md_chunks.append(chunk) + + md_ratios.append(mess_ratio(chunk, threshold)) + + if md_ratios[-1] >= threshold: + early_stop_count += 1 + + if (early_stop_count >= max_chunk_gave_up) or ( + bom_or_sig_available and strip_sig_or_bom is False + ): + break + + # We might want to check the sequence again with the whole content + # Only if initial MD tests passes + if ( + not lazy_str_hard_failure + and is_too_large_sequence + and not is_multi_byte_decoder + ): + try: + sequences[int(50e3) :].decode(encoding_iana, errors="strict") + except UnicodeDecodeError as e: + logger.log( + TRACE, + "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + mean_mess_ratio = ( + sum(md_ratios) / len(md_ratios) if md_ratios else 0.0 + ) # type: float + if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: + tested_but_soft_failure.append(encoding_iana) + logger.log( + TRACE, + "%s was excluded because of initial chaos probing. Gave up %i time(s). " + "Computed mean chaos is %f %%.", + encoding_iana, + early_stop_count, + round(mean_mess_ratio * 100, ndigits=3), + ) + # Preparing those fallbacks in case we got nothing. + if ( + encoding_iana in ["ascii", "utf_8", specified_encoding] + and not lazy_str_hard_failure + ): + fallback_entry = CharsetMatch( + sequences, encoding_iana, threshold, False, [], decoded_payload + ) + if encoding_iana == specified_encoding: + fallback_specified = fallback_entry + elif encoding_iana == "ascii": + fallback_ascii = fallback_entry + else: + fallback_u8 = fallback_entry + continue + + logger.log( + TRACE, + "%s passed initial chaos probing. Mean measured chaos is %f %%", + encoding_iana, + round(mean_mess_ratio * 100, ndigits=3), + ) + + if not is_multi_byte_decoder: + target_languages = encoding_languages(encoding_iana) # type: List[str] + else: + target_languages = mb_encoding_languages(encoding_iana) + + if target_languages: + logger.log( + TRACE, + "{} should target any language(s) of {}".format( + encoding_iana, str(target_languages) + ), + ) + + cd_ratios = [] + + # We shall skip the CD when its about ASCII + # Most of the time its not relevant to run "language-detection" on it. + if encoding_iana != "ascii": + for chunk in md_chunks: + chunk_languages = coherence_ratio( + chunk, 0.1, ",".join(target_languages) if target_languages else None + ) + + cd_ratios.append(chunk_languages) + + cd_ratios_merged = merge_coherence_ratios(cd_ratios) + + if cd_ratios_merged: + logger.log( + TRACE, + "We detected language {} using {}".format( + cd_ratios_merged, encoding_iana + ), + ) + + results.append( + CharsetMatch( + sequences, + encoding_iana, + mean_mess_ratio, + bom_or_sig_available, + cd_ratios_merged, + decoded_payload, + ) + ) + + if ( + encoding_iana in [specified_encoding, "ascii", "utf_8"] + and mean_mess_ratio < 0.1 + ): + logger.debug( + "Encoding detection: %s is most likely the one.", encoding_iana + ) + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([results[encoding_iana]]) + + if encoding_iana == sig_encoding: + logger.debug( + "Encoding detection: %s is most likely the one as we detected a BOM or SIG within " + "the beginning of the sequence.", + encoding_iana, + ) + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([results[encoding_iana]]) + + if len(results) == 0: + if fallback_u8 or fallback_ascii or fallback_specified: + logger.log( + TRACE, + "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.", + ) + + if fallback_specified: + logger.debug( + "Encoding detection: %s will be used as a fallback match", + fallback_specified.encoding, + ) + results.append(fallback_specified) + elif ( + (fallback_u8 and fallback_ascii is None) + or ( + fallback_u8 + and fallback_ascii + and fallback_u8.fingerprint != fallback_ascii.fingerprint + ) + or (fallback_u8 is not None) + ): + logger.debug("Encoding detection: utf_8 will be used as a fallback match") + results.append(fallback_u8) + elif fallback_ascii: + logger.debug("Encoding detection: ascii will be used as a fallback match") + results.append(fallback_ascii) + + if results: + logger.debug( + "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.", + results.best().encoding, # type: ignore + len(results) - 1, + ) + else: + logger.debug("Encoding detection: Unable to determine any suitable charset.") + + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + + return results + + +def from_fp( + fp: BinaryIO, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: List[str] = None, + cp_exclusion: List[str] = None, + preemptive_behaviour: bool = True, + explain: bool = False, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but using a file pointer that is already ready. + Will not close the file pointer. + """ + return from_bytes( + fp.read(), + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + ) + + +def from_path( + path: PathLike, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: List[str] = None, + cp_exclusion: List[str] = None, + preemptive_behaviour: bool = True, + explain: bool = False, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. + Can raise IOError. + """ + with open(path, "rb") as fp: + return from_fp( + fp, + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + ) + + +def normalize( + path: PathLike, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: List[str] = None, + cp_exclusion: List[str] = None, + preemptive_behaviour: bool = True, +) -> CharsetMatch: + """ + Take a (text-based) file path and try to create another file next to it, this time using UTF-8. + """ + results = from_path( + path, + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + ) + + filename = basename(path) + target_extensions = list(splitext(filename)) + + if len(results) == 0: + raise IOError( + 'Unable to normalize "{}", no encoding charset seems to fit.'.format( + filename + ) + ) + + result = results.best() + + target_extensions[0] += "-" + result.encoding # type: ignore + + with open( + "{}".format(str(path).replace(filename, "".join(target_extensions))), "wb" + ) as fp: + fp.write(result.output()) # type: ignore + + return result # type: ignore diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/assets/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/assets/__init__.py new file mode 100644 index 0000000..b2e56ff --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/assets/__init__.py @@ -0,0 +1,1244 @@ +# -*- coding: utf_8 -*- +from collections import OrderedDict + +FREQUENCIES = OrderedDict( + [ + ( + "English", + [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "u", + "m", + "f", + "p", + "g", + "w", + "y", + "b", + "v", + "k", + "x", + "j", + "z", + "q", + ], + ), + ( + "German", + [ + "e", + "n", + "i", + "r", + "s", + "t", + "a", + "d", + "h", + "u", + "l", + "g", + "o", + "c", + "m", + "b", + "f", + "k", + "w", + "z", + "p", + "v", + "ü", + "ä", + "ö", + "j", + ], + ), + ( + "French", + [ + "e", + "a", + "s", + "n", + "i", + "t", + "r", + "l", + "u", + "o", + "d", + "c", + "p", + "m", + "é", + "v", + "g", + "f", + "b", + "h", + "q", + "à", + "x", + "è", + "y", + "j", + ], + ), + ( + "Dutch", + [ + "e", + "n", + "a", + "i", + "r", + "t", + "o", + "d", + "s", + "l", + "g", + "h", + "v", + "m", + "u", + "k", + "c", + "p", + "b", + "w", + "j", + "z", + "f", + "y", + "x", + "ë", + ], + ), + ( + "Italian", + [ + "e", + "i", + "a", + "o", + "n", + "l", + "t", + "r", + "s", + "c", + "d", + "u", + "p", + "m", + "g", + "v", + "f", + "b", + "z", + "h", + "q", + "è", + "à", + "k", + "y", + "ò", + ], + ), + ( + "Polish", + [ + "a", + "i", + "o", + "e", + "n", + "r", + "z", + "w", + "s", + "c", + "t", + "k", + "y", + "d", + "p", + "m", + "u", + "l", + "j", + "ł", + "g", + "b", + "h", + "ą", + "ę", + "ó", + ], + ), + ( + "Spanish", + [ + "e", + "a", + "o", + "n", + "s", + "r", + "i", + "l", + "d", + "t", + "c", + "u", + "m", + "p", + "b", + "g", + "v", + "f", + "y", + "ó", + "h", + "q", + "í", + "j", + "z", + "á", + ], + ), + ( + "Russian", + [ + "о", + "а", + "е", + "и", + "н", + "с", + "т", + "р", + "в", + "л", + "к", + "м", + "д", + "п", + "у", + "г", + "я", + "ы", + "з", + "б", + "й", + "ь", + "ч", + "х", + "ж", + "ц", + ], + ), + ( + "Japanese", + [ + "の", + "に", + "る", + "た", + "は", + "ー", + "と", + "し", + "を", + "で", + "て", + "が", + "い", + "ン", + "れ", + "な", + "年", + "ス", + "っ", + "ル", + "か", + "ら", + "あ", + "さ", + "も", + "り", + ], + ), + ( + "Portuguese", + [ + "a", + "e", + "o", + "s", + "i", + "r", + "d", + "n", + "t", + "m", + "u", + "c", + "l", + "p", + "g", + "v", + "b", + "f", + "h", + "ã", + "q", + "é", + "ç", + "á", + "z", + "í", + ], + ), + ( + "Swedish", + [ + "e", + "a", + "n", + "r", + "t", + "s", + "i", + "l", + "d", + "o", + "m", + "k", + "g", + "v", + "h", + "f", + "u", + "p", + "ä", + "c", + "b", + "ö", + "å", + "y", + "j", + "x", + ], + ), + ( + "Chinese", + [ + "的", + "一", + "是", + "不", + "了", + "在", + "人", + "有", + "我", + "他", + "这", + "个", + "们", + "中", + "来", + "上", + "大", + "为", + "和", + "国", + "地", + "到", + "以", + "说", + "时", + "要", + "就", + "出", + "会", + ], + ), + ( + "Ukrainian", + [ + "о", + "а", + "н", + "і", + "и", + "р", + "в", + "т", + "е", + "с", + "к", + "л", + "у", + "д", + "м", + "п", + "з", + "я", + "ь", + "б", + "г", + "й", + "ч", + "х", + "ц", + "ї", + ], + ), + ( + "Norwegian", + [ + "e", + "r", + "n", + "t", + "a", + "s", + "i", + "o", + "l", + "d", + "g", + "k", + "m", + "v", + "f", + "p", + "u", + "b", + "h", + "å", + "y", + "j", + "ø", + "c", + "æ", + "w", + ], + ), + ( + "Finnish", + [ + "a", + "i", + "n", + "t", + "e", + "s", + "l", + "o", + "u", + "k", + "ä", + "m", + "r", + "v", + "j", + "h", + "p", + "y", + "d", + "ö", + "g", + "c", + "b", + "f", + "w", + "z", + ], + ), + ( + "Vietnamese", + [ + "n", + "h", + "t", + "i", + "c", + "g", + "a", + "o", + "u", + "m", + "l", + "r", + "à", + "đ", + "s", + "e", + "v", + "p", + "b", + "y", + "ư", + "d", + "á", + "k", + "ộ", + "ế", + ], + ), + ( + "Czech", + [ + "o", + "e", + "a", + "n", + "t", + "s", + "i", + "l", + "v", + "r", + "k", + "d", + "u", + "m", + "p", + "í", + "c", + "h", + "z", + "á", + "y", + "j", + "b", + "ě", + "é", + "ř", + ], + ), + ( + "Hungarian", + [ + "e", + "a", + "t", + "l", + "s", + "n", + "k", + "r", + "i", + "o", + "z", + "á", + "é", + "g", + "m", + "b", + "y", + "v", + "d", + "h", + "u", + "p", + "j", + "ö", + "f", + "c", + ], + ), + ( + "Korean", + [ + "이", + "다", + "에", + "의", + "는", + "로", + "하", + "을", + "가", + "고", + "지", + "서", + "한", + "은", + "기", + "으", + "년", + "대", + "사", + "시", + "를", + "리", + "도", + "인", + "스", + "일", + ], + ), + ( + "Indonesian", + [ + "a", + "n", + "e", + "i", + "r", + "t", + "u", + "s", + "d", + "k", + "m", + "l", + "g", + "p", + "b", + "o", + "h", + "y", + "j", + "c", + "w", + "f", + "v", + "z", + "x", + "q", + ], + ), + ( + "Turkish", + [ + "a", + "e", + "i", + "n", + "r", + "l", + "ı", + "k", + "d", + "t", + "s", + "m", + "y", + "u", + "o", + "b", + "ü", + "ş", + "v", + "g", + "z", + "h", + "c", + "p", + "ç", + "ğ", + ], + ), + ( + "Romanian", + [ + "e", + "i", + "a", + "r", + "n", + "t", + "u", + "l", + "o", + "c", + "s", + "d", + "p", + "m", + "ă", + "f", + "v", + "î", + "g", + "b", + "ș", + "ț", + "z", + "h", + "â", + "j", + ], + ), + ( + "Farsi", + [ + "ا", + "ی", + "ر", + "د", + "ن", + "ه", + "و", + "م", + "ت", + "ب", + "س", + "ل", + "ک", + "ش", + "ز", + "ف", + "گ", + "ع", + "خ", + "ق", + "ج", + "آ", + "پ", + "ح", + "ط", + "ص", + ], + ), + ( + "Arabic", + [ + "ا", + "ل", + "ي", + "م", + "و", + "ن", + "ر", + "ت", + "ب", + "ة", + "ع", + "د", + "س", + "ف", + "ه", + "ك", + "ق", + "أ", + "ح", + "ج", + "ش", + "ط", + "ص", + "ى", + "خ", + "إ", + ], + ), + ( + "Danish", + [ + "e", + "r", + "n", + "t", + "a", + "i", + "s", + "d", + "l", + "o", + "g", + "m", + "k", + "f", + "v", + "u", + "b", + "h", + "p", + "å", + "y", + "ø", + "æ", + "c", + "j", + "w", + ], + ), + ( + "Serbian", + [ + "а", + "и", + "о", + "е", + "н", + "р", + "с", + "у", + "т", + "к", + "ј", + "в", + "д", + "м", + "п", + "л", + "г", + "з", + "б", + "a", + "i", + "e", + "o", + "n", + "ц", + "ш", + ], + ), + ( + "Lithuanian", + [ + "i", + "a", + "s", + "o", + "r", + "e", + "t", + "n", + "u", + "k", + "m", + "l", + "p", + "v", + "d", + "j", + "g", + "ė", + "b", + "y", + "ų", + "š", + "ž", + "c", + "ą", + "į", + ], + ), + ( + "Slovene", + [ + "e", + "a", + "i", + "o", + "n", + "r", + "s", + "l", + "t", + "j", + "v", + "k", + "d", + "p", + "m", + "u", + "z", + "b", + "g", + "h", + "č", + "c", + "š", + "ž", + "f", + "y", + ], + ), + ( + "Slovak", + [ + "o", + "a", + "e", + "n", + "i", + "r", + "v", + "t", + "s", + "l", + "k", + "d", + "m", + "p", + "u", + "c", + "h", + "j", + "b", + "z", + "á", + "y", + "ý", + "í", + "č", + "é", + ], + ), + ( + "Hebrew", + [ + "י", + "ו", + "ה", + "ל", + "ר", + "ב", + "ת", + "מ", + "א", + "ש", + "נ", + "ע", + "ם", + "ד", + "ק", + "ח", + "פ", + "ס", + "כ", + "ג", + "ט", + "צ", + "ן", + "ז", + "ך", + ], + ), + ( + "Bulgarian", + [ + "а", + "и", + "о", + "е", + "н", + "т", + "р", + "с", + "в", + "л", + "к", + "д", + "п", + "м", + "з", + "г", + "я", + "ъ", + "у", + "б", + "ч", + "ц", + "й", + "ж", + "щ", + "х", + ], + ), + ( + "Croatian", + [ + "a", + "i", + "o", + "e", + "n", + "r", + "j", + "s", + "t", + "u", + "k", + "l", + "v", + "d", + "m", + "p", + "g", + "z", + "b", + "c", + "č", + "h", + "š", + "ž", + "ć", + "f", + ], + ), + ( + "Hindi", + [ + "क", + "र", + "स", + "न", + "त", + "म", + "ह", + "प", + "य", + "ल", + "व", + "ज", + "द", + "ग", + "ब", + "श", + "ट", + "अ", + "ए", + "थ", + "भ", + "ड", + "च", + "ध", + "ष", + "इ", + ], + ), + ( + "Estonian", + [ + "a", + "i", + "e", + "s", + "t", + "l", + "u", + "n", + "o", + "k", + "r", + "d", + "m", + "v", + "g", + "p", + "j", + "h", + "ä", + "b", + "õ", + "ü", + "f", + "c", + "ö", + "y", + ], + ), + ( + "Simple English", + [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "m", + "u", + "f", + "p", + "g", + "w", + "b", + "y", + "v", + "k", + "j", + "x", + "z", + "q", + ], + ), + ( + "Thai", + [ + "า", + "น", + "ร", + "อ", + "ก", + "เ", + "ง", + "ม", + "ย", + "ล", + "ว", + "ด", + "ท", + "ส", + "ต", + "ะ", + "ป", + "บ", + "ค", + "ห", + "แ", + "จ", + "พ", + "ช", + "ข", + "ใ", + ], + ), + ( + "Greek", + [ + "α", + "τ", + "ο", + "ι", + "ε", + "ν", + "ρ", + "σ", + "κ", + "η", + "π", + "ς", + "υ", + "μ", + "λ", + "ί", + "ό", + "ά", + "γ", + "έ", + "δ", + "ή", + "ω", + "χ", + "θ", + "ύ", + ], + ), + ( + "Tamil", + [ + "க", + "த", + "ப", + "ட", + "ர", + "ம", + "ல", + "ன", + "வ", + "ற", + "ய", + "ள", + "ச", + "ந", + "இ", + "ண", + "அ", + "ஆ", + "ழ", + "ங", + "எ", + "உ", + "ஒ", + "ஸ", + ], + ), + ( + "Classical Chinese", + [ + "之", + "年", + "為", + "也", + "以", + "一", + "人", + "其", + "者", + "國", + "有", + "二", + "十", + "於", + "曰", + "三", + "不", + "大", + "而", + "子", + "中", + "五", + "四", + ], + ), + ( + "Kazakh", + [ + "а", + "ы", + "е", + "н", + "т", + "р", + "л", + "і", + "д", + "с", + "м", + "қ", + "к", + "о", + "б", + "и", + "у", + "ғ", + "ж", + "ң", + "з", + "ш", + "й", + "п", + "г", + "ө", + ], + ), + ] +) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/assets/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/assets/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c14737ac81cce40b9e31e4f2754a382fc14ada3 GIT binary patch literal 8187 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 gv!6m()LT!5@jt!vec*fg{KPa{e`Tzg` literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cd.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cd.py new file mode 100644 index 0000000..8429a0e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cd.py @@ -0,0 +1,340 @@ +import importlib +from codecs import IncrementalDecoder +from collections import Counter, OrderedDict +from functools import lru_cache +from typing import Dict, List, Optional, Tuple + +from .assets import FREQUENCIES +from .constant import KO_NAMES, LANGUAGE_SUPPORTED_COUNT, TOO_SMALL_SEQUENCE, ZH_NAMES +from .md import is_suspiciously_successive_range +from .models import CoherenceMatches +from .utils import ( + is_accentuated, + is_latin, + is_multi_byte_encoding, + is_unicode_range_secondary, + unicode_range, +) + + +def encoding_unicode_range(iana_name: str) -> List[str]: + """ + Return associated unicode ranges in a single byte code page. + """ + if is_multi_byte_encoding(iana_name): + raise IOError("Function not supported on multi-byte code page") + + decoder = importlib.import_module("encodings.{}".format(iana_name)).IncrementalDecoder # type: ignore + + p = decoder(errors="ignore") # type: IncrementalDecoder + seen_ranges = {} # type: Dict[str, int] + character_count = 0 # type: int + + for i in range(0x40, 0xFF): + chunk = p.decode(bytes([i])) # type: str + + if chunk: + character_range = unicode_range(chunk) # type: Optional[str] + + if character_range is None: + continue + + if is_unicode_range_secondary(character_range) is False: + if character_range not in seen_ranges: + seen_ranges[character_range] = 0 + seen_ranges[character_range] += 1 + character_count += 1 + + return sorted( + [ + character_range + for character_range in seen_ranges + if seen_ranges[character_range] / character_count >= 0.15 + ] + ) + + +def unicode_range_languages(primary_range: str) -> List[str]: + """ + Return inferred languages used with a unicode range. + """ + languages = [] # type: List[str] + + for language, characters in FREQUENCIES.items(): + for character in characters: + if unicode_range(character) == primary_range: + languages.append(language) + break + + return languages + + +@lru_cache() +def encoding_languages(iana_name: str) -> List[str]: + """ + Single-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + unicode_ranges = encoding_unicode_range(iana_name) # type: List[str] + primary_range = None # type: Optional[str] + + for specified_range in unicode_ranges: + if "Latin" not in specified_range: + primary_range = specified_range + break + + if primary_range is None: + return ["Latin Based"] + + return unicode_range_languages(primary_range) + + +@lru_cache() +def mb_encoding_languages(iana_name: str) -> List[str]: + """ + Multi-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + if ( + iana_name.startswith("shift_") + or iana_name.startswith("iso2022_jp") + or iana_name.startswith("euc_j") + or iana_name == "cp932" + ): + return ["Japanese"] + if iana_name.startswith("gb") or iana_name in ZH_NAMES: + return ["Chinese", "Classical Chinese"] + if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: + return ["Korean"] + + return [] + + +@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) +def get_target_features(language: str) -> Tuple[bool, bool]: + """ + Determine main aspects from a supported language if it contains accents and if is pure Latin. + """ + target_have_accents = False # type: bool + target_pure_latin = True # type: bool + + for character in FREQUENCIES[language]: + if not target_have_accents and is_accentuated(character): + target_have_accents = True + if target_pure_latin and is_latin(character) is False: + target_pure_latin = False + + return target_have_accents, target_pure_latin + + +def alphabet_languages( + characters: List[str], ignore_non_latin: bool = False +) -> List[str]: + """ + Return associated languages associated to given characters. + """ + languages = [] # type: List[Tuple[str, float]] + + source_have_accents = any(is_accentuated(character) for character in characters) + + for language, language_characters in FREQUENCIES.items(): + + target_have_accents, target_pure_latin = get_target_features(language) + + if ignore_non_latin and target_pure_latin is False: + continue + + if target_have_accents is False and source_have_accents: + continue + + character_count = len(language_characters) # type: int + + character_match_count = len( + [c for c in language_characters if c in characters] + ) # type: int + + ratio = character_match_count / character_count # type: float + + if ratio >= 0.2: + languages.append((language, ratio)) + + languages = sorted(languages, key=lambda x: x[1], reverse=True) + + return [compatible_language[0] for compatible_language in languages] + + +def characters_popularity_compare( + language: str, ordered_characters: List[str] +) -> float: + """ + Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. + The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). + Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) + """ + if language not in FREQUENCIES: + raise ValueError("{} not available".format(language)) + + character_approved_count = 0 # type: int + + for character in ordered_characters: + if character not in FREQUENCIES[language]: + continue + + characters_before_source = FREQUENCIES[language][ + 0 : FREQUENCIES[language].index(character) + ] # type: List[str] + characters_after_source = FREQUENCIES[language][ + FREQUENCIES[language].index(character) : + ] # type: List[str] + + characters_before = ordered_characters[ + 0 : ordered_characters.index(character) + ] # type: List[str] + characters_after = ordered_characters[ + ordered_characters.index(character) : + ] # type: List[str] + + before_match_count = [ + e in characters_before for e in characters_before_source + ].count( + True + ) # type: int + after_match_count = [ + e in characters_after for e in characters_after_source + ].count( + True + ) # type: int + + if len(characters_before_source) == 0 and before_match_count <= 4: + character_approved_count += 1 + continue + + if len(characters_after_source) == 0 and after_match_count <= 4: + character_approved_count += 1 + continue + + if ( + before_match_count / len(characters_before_source) >= 0.4 + or after_match_count / len(characters_after_source) >= 0.4 + ): + character_approved_count += 1 + continue + + return character_approved_count / len(ordered_characters) + + +def alpha_unicode_split(decoded_sequence: str) -> List[str]: + """ + Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. + Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; + One containing the latin letters and the other hebrew. + """ + layers = OrderedDict() # type: Dict[str, str] + + for character in decoded_sequence: + if character.isalpha() is False: + continue + + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + continue + + layer_target_range = None # type: Optional[str] + + for discovered_range in layers: + if ( + is_suspiciously_successive_range(discovered_range, character_range) + is False + ): + layer_target_range = discovered_range + break + + if layer_target_range is None: + layer_target_range = character_range + + if layer_target_range not in layers: + layers[layer_target_range] = character.lower() + continue + + layers[layer_target_range] += character.lower() + + return list(layers.values()) + + +def merge_coherence_ratios(results: List[CoherenceMatches]) -> CoherenceMatches: + """ + This function merge results previously given by the function coherence_ratio. + The return type is the same as coherence_ratio. + """ + per_language_ratios = OrderedDict() # type: Dict[str, List[float]] + for result in results: + for sub_result in result: + language, ratio = sub_result + if language not in per_language_ratios: + per_language_ratios[language] = [ratio] + continue + per_language_ratios[language].append(ratio) + + merge = [ + ( + language, + round( + sum(per_language_ratios[language]) / len(per_language_ratios[language]), + 4, + ), + ) + for language in per_language_ratios + ] + + return sorted(merge, key=lambda x: x[1], reverse=True) + + +@lru_cache(maxsize=2048) +def coherence_ratio( + decoded_sequence: str, threshold: float = 0.1, lg_inclusion: Optional[str] = None +) -> CoherenceMatches: + """ + Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. + A layer = Character extraction by alphabets/ranges. + """ + + results = [] # type: List[Tuple[str, float]] + ignore_non_latin = False # type: bool + + sufficient_match_count = 0 # type: int + + lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else [] + if "Latin Based" in lg_inclusion_list: + ignore_non_latin = True + lg_inclusion_list.remove("Latin Based") + + for layer in alpha_unicode_split(decoded_sequence): + sequence_frequencies = Counter(layer) # type: Counter + most_common = sequence_frequencies.most_common() + + character_count = sum(o for c, o in most_common) # type: int + + if character_count <= TOO_SMALL_SEQUENCE: + continue + + popular_character_ordered = [c for c, o in most_common] # type: List[str] + + for language in lg_inclusion_list or alphabet_languages( + popular_character_ordered, ignore_non_latin + ): + ratio = characters_popularity_compare( + language, popular_character_ordered + ) # type: float + + if ratio < threshold: + continue + elif ratio >= 0.8: + sufficient_match_count += 1 + + results.append((language, round(ratio, 4))) + + if sufficient_match_count >= 3: + break + + return sorted(results, key=lambda x: x[1], reverse=True) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cli/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cli/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de75dccedb553dbf42cb3cebbe6b489145d6f360 GIT binary patch literal 196 zcmYk0K?=e!5JgkzLWCYf(2mlrh$nC(u0xuR?O>XeOcd&A+EwKi6`;K`gpO>> zwNt(ULp2Oz=$x&}^$M5*E(fL0sznCfDbEuj!_D&Bfq0 KJ;0NwTzmnT_%qA^ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cli/__pycache__/normalizer.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/cli/__pycache__/normalizer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64b842efdfcfadef3218597d97090cb74580e033 GIT binary patch literal 6121 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 bool: + """Ask a yes/no question via input() and return their answer. + + "question" is a string that is presented to the user. + "default" is the presumed answer if the user just hits . + It must be "yes" (the default), "no" or None (meaning + an answer is required of the user). + + The "answer" return value is True for "yes" or False for "no". + + Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input + """ + valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} + if default is None: + prompt = " [y/n] " + elif default == "yes": + prompt = " [Y/n] " + elif default == "no": + prompt = " [y/N] " + else: + raise ValueError("invalid default answer: '%s'" % default) + + while True: + sys.stdout.write(question + prompt) + choice = input().lower() + if default is not None and choice == "": + return valid[default] + elif choice in valid: + return valid[choice] + else: + sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n") + + +def cli_detect(argv: List[str] = None) -> int: + """ + CLI assistant using ARGV and ArgumentParser + :param argv: + :return: 0 if everything is fine, anything else equal trouble + """ + parser = argparse.ArgumentParser( + description="The Real First Universal Charset Detector. " + "Discover originating encoding used on text file. " + "Normalize text to unicode." + ) + + parser.add_argument( + "files", type=argparse.FileType("rb"), nargs="+", help="File(s) to be analysed" + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + default=False, + dest="verbose", + help="Display complementary information about file if any. " + "Stdout will contain logs about the detection process.", + ) + parser.add_argument( + "-a", + "--with-alternative", + action="store_true", + default=False, + dest="alternatives", + help="Output complementary possibilities if any. Top-level JSON WILL be a list.", + ) + parser.add_argument( + "-n", + "--normalize", + action="store_true", + default=False, + dest="normalize", + help="Permit to normalize input file. If not set, program does not write anything.", + ) + parser.add_argument( + "-m", + "--minimal", + action="store_true", + default=False, + dest="minimal", + help="Only output the charset detected to STDOUT. Disabling JSON output.", + ) + parser.add_argument( + "-r", + "--replace", + action="store_true", + default=False, + dest="replace", + help="Replace file when trying to normalize it instead of creating a new one.", + ) + parser.add_argument( + "-f", + "--force", + action="store_true", + default=False, + dest="force", + help="Replace file without asking if you are sure, use this flag with caution.", + ) + parser.add_argument( + "-t", + "--threshold", + action="store", + default=0.1, + type=float, + dest="threshold", + help="Define a custom maximum amount of chaos allowed in decoded content. 0. <= chaos <= 1.", + ) + parser.add_argument( + "--version", + action="version", + version="Charset-Normalizer {} - Python {}".format( + __version__, python_version() + ), + help="Show version information and exit.", + ) + + args = parser.parse_args(argv) + + if args.replace is True and args.normalize is False: + print("Use --replace in addition of --normalize only.", file=sys.stderr) + return 1 + + if args.force is True and args.replace is False: + print("Use --force in addition of --replace only.", file=sys.stderr) + return 1 + + if args.threshold < 0.0 or args.threshold > 1.0: + print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) + return 1 + + x_ = [] + + for my_file in args.files: + + matches = from_fp(my_file, threshold=args.threshold, explain=args.verbose) + + best_guess = matches.best() + + if best_guess is None: + print( + 'Unable to identify originating encoding for "{}". {}'.format( + my_file.name, + "Maybe try increasing maximum amount of chaos." + if args.threshold < 1.0 + else "", + ), + file=sys.stderr, + ) + x_.append( + CliDetectionResult( + abspath(my_file.name), + None, + [], + [], + "Unknown", + [], + False, + 1.0, + 0.0, + None, + True, + ) + ) + else: + x_.append( + CliDetectionResult( + abspath(my_file.name), + best_guess.encoding, + best_guess.encoding_aliases, + [ + cp + for cp in best_guess.could_be_from_charset + if cp != best_guess.encoding + ], + best_guess.language, + best_guess.alphabets, + best_guess.bom, + best_guess.percent_chaos, + best_guess.percent_coherence, + None, + True, + ) + ) + + if len(matches) > 1 and args.alternatives: + for el in matches: + if el != best_guess: + x_.append( + CliDetectionResult( + abspath(my_file.name), + el.encoding, + el.encoding_aliases, + [ + cp + for cp in el.could_be_from_charset + if cp != el.encoding + ], + el.language, + el.alphabets, + el.bom, + el.percent_chaos, + el.percent_coherence, + None, + False, + ) + ) + + if args.normalize is True: + + if best_guess.encoding.startswith("utf") is True: + print( + '"{}" file does not need to be normalized, as it already came from unicode.'.format( + my_file.name + ), + file=sys.stderr, + ) + if my_file.closed is False: + my_file.close() + continue + + o_ = my_file.name.split(".") # type: List[str] + + if args.replace is False: + o_.insert(-1, best_guess.encoding) + if my_file.closed is False: + my_file.close() + elif ( + args.force is False + and query_yes_no( + 'Are you sure to normalize "{}" by replacing it ?'.format( + my_file.name + ), + "no", + ) + is False + ): + if my_file.closed is False: + my_file.close() + continue + + try: + x_[0].unicode_path = abspath("./{}".format(".".join(o_))) + + with open(x_[0].unicode_path, "w", encoding="utf-8") as fp: + fp.write(str(best_guess)) + except IOError as e: + print(str(e), file=sys.stderr) + if my_file.closed is False: + my_file.close() + return 2 + + if my_file.closed is False: + my_file.close() + + if args.minimal is False: + print( + dumps( + [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, + ensure_ascii=True, + indent=4, + ) + ) + else: + for my_file in args.files: + print( + ", ".join( + [ + el.encoding or "undefined" + for el in x_ + if el.path == abspath(my_file.name) + ] + ) + ) + + return 0 + + +if __name__ == "__main__": + cli_detect() diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/constant.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/constant.py new file mode 100644 index 0000000..c32f5cf --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/constant.py @@ -0,0 +1,503 @@ +from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE +from collections import OrderedDict +from encodings.aliases import aliases +from re import IGNORECASE, compile as re_compile +from typing import Dict, List, Set, Union + +from .assets import FREQUENCIES + +# Contain for each eligible encoding a list of/item bytes SIG/BOM +ENCODING_MARKS = OrderedDict( + [ + ("utf_8", BOM_UTF8), + ( + "utf_7", + [ + b"\x2b\x2f\x76\x38", + b"\x2b\x2f\x76\x39", + b"\x2b\x2f\x76\x2b", + b"\x2b\x2f\x76\x2f", + b"\x2b\x2f\x76\x38\x2d", + ], + ), + ("gb18030", b"\x84\x31\x95\x33"), + ("utf_32", [BOM_UTF32_BE, BOM_UTF32_LE]), + ("utf_16", [BOM_UTF16_BE, BOM_UTF16_LE]), + ] +) # type: Dict[str, Union[bytes, List[bytes]]] + +TOO_SMALL_SEQUENCE = 32 # type: int +TOO_BIG_SEQUENCE = int(10e6) # type: int + +UTF8_MAXIMAL_ALLOCATION = 1112064 # type: int + +UNICODE_RANGES_COMBINED = { + "Control character": range(31 + 1), + "Basic Latin": range(32, 127 + 1), + "Latin-1 Supplement": range(128, 255 + 1), + "Latin Extended-A": range(256, 383 + 1), + "Latin Extended-B": range(384, 591 + 1), + "IPA Extensions": range(592, 687 + 1), + "Spacing Modifier Letters": range(688, 767 + 1), + "Combining Diacritical Marks": range(768, 879 + 1), + "Greek and Coptic": range(880, 1023 + 1), + "Cyrillic": range(1024, 1279 + 1), + "Cyrillic Supplement": range(1280, 1327 + 1), + "Armenian": range(1328, 1423 + 1), + "Hebrew": range(1424, 1535 + 1), + "Arabic": range(1536, 1791 + 1), + "Syriac": range(1792, 1871 + 1), + "Arabic Supplement": range(1872, 1919 + 1), + "Thaana": range(1920, 1983 + 1), + "NKo": range(1984, 2047 + 1), + "Samaritan": range(2048, 2111 + 1), + "Mandaic": range(2112, 2143 + 1), + "Syriac Supplement": range(2144, 2159 + 1), + "Arabic Extended-A": range(2208, 2303 + 1), + "Devanagari": range(2304, 2431 + 1), + "Bengali": range(2432, 2559 + 1), + "Gurmukhi": range(2560, 2687 + 1), + "Gujarati": range(2688, 2815 + 1), + "Oriya": range(2816, 2943 + 1), + "Tamil": range(2944, 3071 + 1), + "Telugu": range(3072, 3199 + 1), + "Kannada": range(3200, 3327 + 1), + "Malayalam": range(3328, 3455 + 1), + "Sinhala": range(3456, 3583 + 1), + "Thai": range(3584, 3711 + 1), + "Lao": range(3712, 3839 + 1), + "Tibetan": range(3840, 4095 + 1), + "Myanmar": range(4096, 4255 + 1), + "Georgian": range(4256, 4351 + 1), + "Hangul Jamo": range(4352, 4607 + 1), + "Ethiopic": range(4608, 4991 + 1), + "Ethiopic Supplement": range(4992, 5023 + 1), + "Cherokee": range(5024, 5119 + 1), + "Unified Canadian Aboriginal Syllabics": range(5120, 5759 + 1), + "Ogham": range(5760, 5791 + 1), + "Runic": range(5792, 5887 + 1), + "Tagalog": range(5888, 5919 + 1), + "Hanunoo": range(5920, 5951 + 1), + "Buhid": range(5952, 5983 + 1), + "Tagbanwa": range(5984, 6015 + 1), + "Khmer": range(6016, 6143 + 1), + "Mongolian": range(6144, 6319 + 1), + "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6399 + 1), + "Limbu": range(6400, 6479 + 1), + "Tai Le": range(6480, 6527 + 1), + "New Tai Lue": range(6528, 6623 + 1), + "Khmer Symbols": range(6624, 6655 + 1), + "Buginese": range(6656, 6687 + 1), + "Tai Tham": range(6688, 6831 + 1), + "Combining Diacritical Marks Extended": range(6832, 6911 + 1), + "Balinese": range(6912, 7039 + 1), + "Sundanese": range(7040, 7103 + 1), + "Batak": range(7104, 7167 + 1), + "Lepcha": range(7168, 7247 + 1), + "Ol Chiki": range(7248, 7295 + 1), + "Cyrillic Extended C": range(7296, 7311 + 1), + "Sundanese Supplement": range(7360, 7375 + 1), + "Vedic Extensions": range(7376, 7423 + 1), + "Phonetic Extensions": range(7424, 7551 + 1), + "Phonetic Extensions Supplement": range(7552, 7615 + 1), + "Combining Diacritical Marks Supplement": range(7616, 7679 + 1), + "Latin Extended Additional": range(7680, 7935 + 1), + "Greek Extended": range(7936, 8191 + 1), + "General Punctuation": range(8192, 8303 + 1), + "Superscripts and Subscripts": range(8304, 8351 + 1), + "Currency Symbols": range(8352, 8399 + 1), + "Combining Diacritical Marks for Symbols": range(8400, 8447 + 1), + "Letterlike Symbols": range(8448, 8527 + 1), + "Number Forms": range(8528, 8591 + 1), + "Arrows": range(8592, 8703 + 1), + "Mathematical Operators": range(8704, 8959 + 1), + "Miscellaneous Technical": range(8960, 9215 + 1), + "Control Pictures": range(9216, 9279 + 1), + "Optical Character Recognition": range(9280, 9311 + 1), + "Enclosed Alphanumerics": range(9312, 9471 + 1), + "Box Drawing": range(9472, 9599 + 1), + "Block Elements": range(9600, 9631 + 1), + "Geometric Shapes": range(9632, 9727 + 1), + "Miscellaneous Symbols": range(9728, 9983 + 1), + "Dingbats": range(9984, 10175 + 1), + "Miscellaneous Mathematical Symbols-A": range(10176, 10223 + 1), + "Supplemental Arrows-A": range(10224, 10239 + 1), + "Braille Patterns": range(10240, 10495 + 1), + "Supplemental Arrows-B": range(10496, 10623 + 1), + "Miscellaneous Mathematical Symbols-B": range(10624, 10751 + 1), + "Supplemental Mathematical Operators": range(10752, 11007 + 1), + "Miscellaneous Symbols and Arrows": range(11008, 11263 + 1), + "Glagolitic": range(11264, 11359 + 1), + "Latin Extended-C": range(11360, 11391 + 1), + "Coptic": range(11392, 11519 + 1), + "Georgian Supplement": range(11520, 11567 + 1), + "Tifinagh": range(11568, 11647 + 1), + "Ethiopic Extended": range(11648, 11743 + 1), + "Cyrillic Extended-A": range(11744, 11775 + 1), + "Supplemental Punctuation": range(11776, 11903 + 1), + "CJK Radicals Supplement": range(11904, 12031 + 1), + "Kangxi Radicals": range(12032, 12255 + 1), + "Ideographic Description Characters": range(12272, 12287 + 1), + "CJK Symbols and Punctuation": range(12288, 12351 + 1), + "Hiragana": range(12352, 12447 + 1), + "Katakana": range(12448, 12543 + 1), + "Bopomofo": range(12544, 12591 + 1), + "Hangul Compatibility Jamo": range(12592, 12687 + 1), + "Kanbun": range(12688, 12703 + 1), + "Bopomofo Extended": range(12704, 12735 + 1), + "CJK Strokes": range(12736, 12783 + 1), + "Katakana Phonetic Extensions": range(12784, 12799 + 1), + "Enclosed CJK Letters and Months": range(12800, 13055 + 1), + "CJK Compatibility": range(13056, 13311 + 1), + "CJK Unified Ideographs Extension A": range(13312, 19903 + 1), + "Yijing Hexagram Symbols": range(19904, 19967 + 1), + "CJK Unified Ideographs": range(19968, 40959 + 1), + "Yi Syllables": range(40960, 42127 + 1), + "Yi Radicals": range(42128, 42191 + 1), + "Lisu": range(42192, 42239 + 1), + "Vai": range(42240, 42559 + 1), + "Cyrillic Extended-B": range(42560, 42655 + 1), + "Bamum": range(42656, 42751 + 1), + "Modifier Tone Letters": range(42752, 42783 + 1), + "Latin Extended-D": range(42784, 43007 + 1), + "Syloti Nagri": range(43008, 43055 + 1), + "Common Indic Number Forms": range(43056, 43071 + 1), + "Phags-pa": range(43072, 43135 + 1), + "Saurashtra": range(43136, 43231 + 1), + "Devanagari Extended": range(43232, 43263 + 1), + "Kayah Li": range(43264, 43311 + 1), + "Rejang": range(43312, 43359 + 1), + "Hangul Jamo Extended-A": range(43360, 43391 + 1), + "Javanese": range(43392, 43487 + 1), + "Myanmar Extended-B": range(43488, 43519 + 1), + "Cham": range(43520, 43615 + 1), + "Myanmar Extended-A": range(43616, 43647 + 1), + "Tai Viet": range(43648, 43743 + 1), + "Meetei Mayek Extensions": range(43744, 43775 + 1), + "Ethiopic Extended-A": range(43776, 43823 + 1), + "Latin Extended-E": range(43824, 43887 + 1), + "Cherokee Supplement": range(43888, 43967 + 1), + "Meetei Mayek": range(43968, 44031 + 1), + "Hangul Syllables": range(44032, 55215 + 1), + "Hangul Jamo Extended-B": range(55216, 55295 + 1), + "High Surrogates": range(55296, 56191 + 1), + "High Private Use Surrogates": range(56192, 56319 + 1), + "Low Surrogates": range(56320, 57343 + 1), + "Private Use Area": range(57344, 63743 + 1), + "CJK Compatibility Ideographs": range(63744, 64255 + 1), + "Alphabetic Presentation Forms": range(64256, 64335 + 1), + "Arabic Presentation Forms-A": range(64336, 65023 + 1), + "Variation Selectors": range(65024, 65039 + 1), + "Vertical Forms": range(65040, 65055 + 1), + "Combining Half Marks": range(65056, 65071 + 1), + "CJK Compatibility Forms": range(65072, 65103 + 1), + "Small Form Variants": range(65104, 65135 + 1), + "Arabic Presentation Forms-B": range(65136, 65279 + 1), + "Halfwidth and Fullwidth Forms": range(65280, 65519 + 1), + "Specials": range(65520, 65535 + 1), + "Linear B Syllabary": range(65536, 65663 + 1), + "Linear B Ideograms": range(65664, 65791 + 1), + "Aegean Numbers": range(65792, 65855 + 1), + "Ancient Greek Numbers": range(65856, 65935 + 1), + "Ancient Symbols": range(65936, 65999 + 1), + "Phaistos Disc": range(66000, 66047 + 1), + "Lycian": range(66176, 66207 + 1), + "Carian": range(66208, 66271 + 1), + "Coptic Epact Numbers": range(66272, 66303 + 1), + "Old Italic": range(66304, 66351 + 1), + "Gothic": range(66352, 66383 + 1), + "Old Permic": range(66384, 66431 + 1), + "Ugaritic": range(66432, 66463 + 1), + "Old Persian": range(66464, 66527 + 1), + "Deseret": range(66560, 66639 + 1), + "Shavian": range(66640, 66687 + 1), + "Osmanya": range(66688, 66735 + 1), + "Osage": range(66736, 66815 + 1), + "Elbasan": range(66816, 66863 + 1), + "Caucasian Albanian": range(66864, 66927 + 1), + "Linear A": range(67072, 67455 + 1), + "Cypriot Syllabary": range(67584, 67647 + 1), + "Imperial Aramaic": range(67648, 67679 + 1), + "Palmyrene": range(67680, 67711 + 1), + "Nabataean": range(67712, 67759 + 1), + "Hatran": range(67808, 67839 + 1), + "Phoenician": range(67840, 67871 + 1), + "Lydian": range(67872, 67903 + 1), + "Meroitic Hieroglyphs": range(67968, 67999 + 1), + "Meroitic Cursive": range(68000, 68095 + 1), + "Kharoshthi": range(68096, 68191 + 1), + "Old South Arabian": range(68192, 68223 + 1), + "Old North Arabian": range(68224, 68255 + 1), + "Manichaean": range(68288, 68351 + 1), + "Avestan": range(68352, 68415 + 1), + "Inscriptional Parthian": range(68416, 68447 + 1), + "Inscriptional Pahlavi": range(68448, 68479 + 1), + "Psalter Pahlavi": range(68480, 68527 + 1), + "Old Turkic": range(68608, 68687 + 1), + "Old Hungarian": range(68736, 68863 + 1), + "Rumi Numeral Symbols": range(69216, 69247 + 1), + "Brahmi": range(69632, 69759 + 1), + "Kaithi": range(69760, 69839 + 1), + "Sora Sompeng": range(69840, 69887 + 1), + "Chakma": range(69888, 69967 + 1), + "Mahajani": range(69968, 70015 + 1), + "Sharada": range(70016, 70111 + 1), + "Sinhala Archaic Numbers": range(70112, 70143 + 1), + "Khojki": range(70144, 70223 + 1), + "Multani": range(70272, 70319 + 1), + "Khudawadi": range(70320, 70399 + 1), + "Grantha": range(70400, 70527 + 1), + "Newa": range(70656, 70783 + 1), + "Tirhuta": range(70784, 70879 + 1), + "Siddham": range(71040, 71167 + 1), + "Modi": range(71168, 71263 + 1), + "Mongolian Supplement": range(71264, 71295 + 1), + "Takri": range(71296, 71375 + 1), + "Ahom": range(71424, 71487 + 1), + "Warang Citi": range(71840, 71935 + 1), + "Zanabazar Square": range(72192, 72271 + 1), + "Soyombo": range(72272, 72367 + 1), + "Pau Cin Hau": range(72384, 72447 + 1), + "Bhaiksuki": range(72704, 72815 + 1), + "Marchen": range(72816, 72895 + 1), + "Masaram Gondi": range(72960, 73055 + 1), + "Cuneiform": range(73728, 74751 + 1), + "Cuneiform Numbers and Punctuation": range(74752, 74879 + 1), + "Early Dynastic Cuneiform": range(74880, 75087 + 1), + "Egyptian Hieroglyphs": range(77824, 78895 + 1), + "Anatolian Hieroglyphs": range(82944, 83583 + 1), + "Bamum Supplement": range(92160, 92735 + 1), + "Mro": range(92736, 92783 + 1), + "Bassa Vah": range(92880, 92927 + 1), + "Pahawh Hmong": range(92928, 93071 + 1), + "Miao": range(93952, 94111 + 1), + "Ideographic Symbols and Punctuation": range(94176, 94207 + 1), + "Tangut": range(94208, 100351 + 1), + "Tangut Components": range(100352, 101119 + 1), + "Kana Supplement": range(110592, 110847 + 1), + "Kana Extended-A": range(110848, 110895 + 1), + "Nushu": range(110960, 111359 + 1), + "Duployan": range(113664, 113823 + 1), + "Shorthand Format Controls": range(113824, 113839 + 1), + "Byzantine Musical Symbols": range(118784, 119039 + 1), + "Musical Symbols": range(119040, 119295 + 1), + "Ancient Greek Musical Notation": range(119296, 119375 + 1), + "Tai Xuan Jing Symbols": range(119552, 119647 + 1), + "Counting Rod Numerals": range(119648, 119679 + 1), + "Mathematical Alphanumeric Symbols": range(119808, 120831 + 1), + "Sutton SignWriting": range(120832, 121519 + 1), + "Glagolitic Supplement": range(122880, 122927 + 1), + "Mende Kikakui": range(124928, 125151 + 1), + "Adlam": range(125184, 125279 + 1), + "Arabic Mathematical Alphabetic Symbols": range(126464, 126719 + 1), + "Mahjong Tiles": range(126976, 127023 + 1), + "Domino Tiles": range(127024, 127135 + 1), + "Playing Cards": range(127136, 127231 + 1), + "Enclosed Alphanumeric Supplement": range(127232, 127487 + 1), + "Enclosed Ideographic Supplement": range(127488, 127743 + 1), + "Miscellaneous Symbols and Pictographs": range(127744, 128511 + 1), + "Emoticons range(Emoji)": range(128512, 128591 + 1), + "Ornamental Dingbats": range(128592, 128639 + 1), + "Transport and Map Symbols": range(128640, 128767 + 1), + "Alchemical Symbols": range(128768, 128895 + 1), + "Geometric Shapes Extended": range(128896, 129023 + 1), + "Supplemental Arrows-C": range(129024, 129279 + 1), + "Supplemental Symbols and Pictographs": range(129280, 129535 + 1), + "CJK Unified Ideographs Extension B": range(131072, 173791 + 1), + "CJK Unified Ideographs Extension C": range(173824, 177983 + 1), + "CJK Unified Ideographs Extension D": range(177984, 178207 + 1), + "CJK Unified Ideographs Extension E": range(178208, 183983 + 1), + "CJK Unified Ideographs Extension F": range(183984, 191471 + 1), + "CJK Compatibility Ideographs Supplement": range(194560, 195103 + 1), + "Tags": range(917504, 917631 + 1), + "Variation Selectors Supplement": range(917760, 917999 + 1), +} # type: Dict[str, range] + + +UNICODE_SECONDARY_RANGE_KEYWORD = [ + "Supplement", + "Extended", + "Extensions", + "Modifier", + "Marks", + "Punctuation", + "Symbols", + "Forms", + "Operators", + "Miscellaneous", + "Drawing", + "Block", + "Shapes", + "Supplemental", + "Tags", +] # type: List[str] + +RE_POSSIBLE_ENCODING_INDICATION = re_compile( + r"(?:(?:encoding)|(?:charset)|(?:coding))(?:[\:= ]{1,10})(?:[\"\']?)([a-zA-Z0-9\-_]+)(?:[\"\']?)", + IGNORECASE, +) + +IANA_SUPPORTED = sorted( + filter( + lambda x: x.endswith("_codec") is False + and x not in {"rot_13", "tactis", "mbcs"}, + list(set(aliases.values())), + ) +) # type: List[str] + +IANA_SUPPORTED_COUNT = len(IANA_SUPPORTED) # type: int + +# pre-computed code page that are similar using the function cp_similarity. +IANA_SUPPORTED_SIMILAR = { + "cp037": ["cp1026", "cp1140", "cp273", "cp500"], + "cp1026": ["cp037", "cp1140", "cp273", "cp500"], + "cp1125": ["cp866"], + "cp1140": ["cp037", "cp1026", "cp273", "cp500"], + "cp1250": ["iso8859_2"], + "cp1251": ["kz1048", "ptcp154"], + "cp1252": ["iso8859_15", "iso8859_9", "latin_1"], + "cp1253": ["iso8859_7"], + "cp1254": ["iso8859_15", "iso8859_9", "latin_1"], + "cp1257": ["iso8859_13"], + "cp273": ["cp037", "cp1026", "cp1140", "cp500"], + "cp437": ["cp850", "cp858", "cp860", "cp861", "cp862", "cp863", "cp865"], + "cp500": ["cp037", "cp1026", "cp1140", "cp273"], + "cp850": ["cp437", "cp857", "cp858", "cp865"], + "cp857": ["cp850", "cp858", "cp865"], + "cp858": ["cp437", "cp850", "cp857", "cp865"], + "cp860": ["cp437", "cp861", "cp862", "cp863", "cp865"], + "cp861": ["cp437", "cp860", "cp862", "cp863", "cp865"], + "cp862": ["cp437", "cp860", "cp861", "cp863", "cp865"], + "cp863": ["cp437", "cp860", "cp861", "cp862", "cp865"], + "cp865": ["cp437", "cp850", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863"], + "cp866": ["cp1125"], + "iso8859_10": ["iso8859_14", "iso8859_15", "iso8859_4", "iso8859_9", "latin_1"], + "iso8859_11": ["tis_620"], + "iso8859_13": ["cp1257"], + "iso8859_14": [ + "iso8859_10", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_15": [ + "cp1252", + "cp1254", + "iso8859_10", + "iso8859_14", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_16": [ + "iso8859_14", + "iso8859_15", + "iso8859_2", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_2": ["cp1250", "iso8859_16", "iso8859_4"], + "iso8859_3": ["iso8859_14", "iso8859_15", "iso8859_16", "iso8859_9", "latin_1"], + "iso8859_4": ["iso8859_10", "iso8859_2", "iso8859_9", "latin_1"], + "iso8859_7": ["cp1253"], + "iso8859_9": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "latin_1", + ], + "kz1048": ["cp1251", "ptcp154"], + "latin_1": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "iso8859_9", + ], + "mac_iceland": ["mac_roman", "mac_turkish"], + "mac_roman": ["mac_iceland", "mac_turkish"], + "mac_turkish": ["mac_iceland", "mac_roman"], + "ptcp154": ["cp1251", "kz1048"], + "tis_620": ["iso8859_11"], +} # type: Dict[str, List[str]] + + +CHARDET_CORRESPONDENCE = { + "iso2022_kr": "ISO-2022-KR", + "iso2022_jp": "ISO-2022-JP", + "euc_kr": "EUC-KR", + "tis_620": "TIS-620", + "utf_32": "UTF-32", + "euc_jp": "EUC-JP", + "koi8_r": "KOI8-R", + "iso8859_1": "ISO-8859-1", + "iso8859_2": "ISO-8859-2", + "iso8859_5": "ISO-8859-5", + "iso8859_6": "ISO-8859-6", + "iso8859_7": "ISO-8859-7", + "iso8859_8": "ISO-8859-8", + "utf_16": "UTF-16", + "cp855": "IBM855", + "mac_cyrillic": "MacCyrillic", + "gb2312": "GB2312", + "gb18030": "GB18030", + "cp932": "CP932", + "cp866": "IBM866", + "utf_8": "utf-8", + "utf_8_sig": "UTF-8-SIG", + "shift_jis": "SHIFT_JIS", + "big5": "Big5", + "cp1250": "windows-1250", + "cp1251": "windows-1251", + "cp1252": "Windows-1252", + "cp1253": "windows-1253", + "cp1255": "windows-1255", + "cp1256": "windows-1256", + "cp1254": "Windows-1254", + "cp949": "CP949", +} # type: Dict[str, str] + + +COMMON_SAFE_ASCII_CHARACTERS = { + "<", + ">", + "=", + ":", + "/", + "&", + ";", + "{", + "}", + "[", + "]", + ",", + "|", + '"', + "-", +} # type: Set[str] + + +KO_NAMES = {"johab", "cp949", "euc_kr"} # type: Set[str] +ZH_NAMES = {"big5", "cp950", "big5hkscs", "hz"} # type: Set[str] + +NOT_PRINTABLE_PATTERN = re_compile(r"[0-9\W\n\r\t]+") + +LANGUAGE_SUPPORTED_COUNT = len(FREQUENCIES) # type: int + +# Logging LEVEL bellow DEBUG +TRACE = 5 # type: int diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/legacy.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/legacy.py new file mode 100644 index 0000000..cdebe2b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/legacy.py @@ -0,0 +1,95 @@ +import warnings +from typing import Dict, Optional, Union + +from .api import from_bytes, from_fp, from_path, normalize +from .constant import CHARDET_CORRESPONDENCE +from .models import CharsetMatch, CharsetMatches + + +def detect(byte_str: bytes) -> Dict[str, Optional[Union[str, float]]]: + """ + chardet legacy method + Detect the encoding of the given byte string. It should be mostly backward-compatible. + Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) + This function is deprecated and should be used to migrate your project easily, consult the documentation for + further information. Not planned for removal. + + :param byte_str: The byte sequence to examine. + """ + if not isinstance(byte_str, (bytearray, bytes)): + raise TypeError( # pragma: nocover + "Expected object of type bytes or bytearray, got: " + "{0}".format(type(byte_str)) + ) + + if isinstance(byte_str, bytearray): + byte_str = bytes(byte_str) + + r = from_bytes(byte_str).best() + + encoding = r.encoding if r is not None else None + language = r.language if r is not None and r.language != "Unknown" else "" + confidence = 1.0 - r.chaos if r is not None else None + + # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process + # but chardet does return 'utf-8-sig' and it is a valid codec name. + if r is not None and encoding == "utf_8" and r.bom: + encoding += "_sig" + + return { + "encoding": encoding + if encoding not in CHARDET_CORRESPONDENCE + else CHARDET_CORRESPONDENCE[encoding], + "language": language, + "confidence": confidence, + } + + +class CharsetNormalizerMatch(CharsetMatch): + pass + + +class CharsetNormalizerMatches(CharsetMatches): + @staticmethod + def from_fp(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return from_fp(*args, **kwargs) # pragma: nocover + + @staticmethod + def from_bytes(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return from_bytes(*args, **kwargs) # pragma: nocover + + @staticmethod + def from_path(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return from_path(*args, **kwargs) # pragma: nocover + + @staticmethod + def normalize(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return normalize(*args, **kwargs) # pragma: nocover + + +class CharsetDetector(CharsetNormalizerMatches): + pass + + +class CharsetDoctor(CharsetNormalizerMatches): + pass diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/md.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/md.py new file mode 100644 index 0000000..f3d6505 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/md.py @@ -0,0 +1,559 @@ +from functools import lru_cache +from typing import List, Optional + +from .constant import COMMON_SAFE_ASCII_CHARACTERS, UNICODE_SECONDARY_RANGE_KEYWORD +from .utils import ( + is_accentuated, + is_ascii, + is_case_variable, + is_cjk, + is_emoticon, + is_hangul, + is_hiragana, + is_katakana, + is_latin, + is_punctuation, + is_separator, + is_symbol, + is_thai, + remove_accent, + unicode_range, +) + + +class MessDetectorPlugin: + """ + Base abstract class used for mess detection plugins. + All detectors MUST extend and implement given methods. + """ + + def eligible(self, character: str) -> bool: + """ + Determine if given character should be fed in. + """ + raise NotImplementedError # pragma: nocover + + def feed(self, character: str) -> None: + """ + The main routine to be executed upon character. + Insert the logic in witch the text would be considered chaotic. + """ + raise NotImplementedError # pragma: nocover + + def reset(self) -> None: # pragma: no cover + """ + Permit to reset the plugin to the initial state. + """ + raise NotImplementedError + + @property + def ratio(self) -> float: + """ + Compute the chaos ratio based on what your feed() has seen. + Must NOT be lower than 0.; No restriction gt 0. + """ + raise NotImplementedError # pragma: nocover + + +class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._punctuation_count = 0 # type: int + self._symbol_count = 0 # type: int + self._character_count = 0 # type: int + + self._last_printable_char = None # type: Optional[str] + self._frenzy_symbol_in_word = False # type: bool + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character != self._last_printable_char + and character not in COMMON_SAFE_ASCII_CHARACTERS + ): + if is_punctuation(character): + self._punctuation_count += 1 + elif ( + character.isdigit() is False + and is_symbol(character) + and is_emoticon(character) is False + ): + self._symbol_count += 2 + + self._last_printable_char = character + + def reset(self) -> None: # pragma: no cover + self._punctuation_count = 0 + self._character_count = 0 + self._symbol_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + ratio_of_punctuation = ( + self._punctuation_count + self._symbol_count + ) / self._character_count # type: float + + return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 + + +class TooManyAccentuatedPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._character_count = 0 # type: int + self._accentuated_count = 0 # type: int + + def eligible(self, character: str) -> bool: + return character.isalpha() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_accentuated(character): + self._accentuated_count += 1 + + def reset(self) -> None: # pragma: no cover + self._character_count = 0 + self._accentuated_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + ratio_of_accentuation = ( + self._accentuated_count / self._character_count + ) # type: float + return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 + + +class UnprintablePlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._unprintable_count = 0 # type: int + self._character_count = 0 # type: int + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if ( + character.isspace() is False # includes \n \t \r \v + and character.isprintable() is False + and character != "\x1A" # Why? Its the ASCII substitute character. + ): + self._unprintable_count += 1 + self._character_count += 1 + + def reset(self) -> None: # pragma: no cover + self._unprintable_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._unprintable_count * 8) / self._character_count + + +class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._successive_count = 0 # type: int + self._character_count = 0 # type: int + + self._last_latin_character = None # type: Optional[str] + + def eligible(self, character: str) -> bool: + return character.isalpha() and is_latin(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + if ( + self._last_latin_character is not None + and is_accentuated(character) + and is_accentuated(self._last_latin_character) + ): + if character.isupper() and self._last_latin_character.isupper(): + self._successive_count += 1 + # Worse if its the same char duplicated with different accent. + if remove_accent(character) == remove_accent(self._last_latin_character): + self._successive_count += 1 + self._last_latin_character = character + + def reset(self) -> None: # pragma: no cover + self._successive_count = 0 + self._character_count = 0 + self._last_latin_character = None + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._successive_count * 2) / self._character_count + + +class SuspiciousRange(MessDetectorPlugin): + def __init__(self) -> None: + self._suspicious_successive_range_count = 0 # type: int + self._character_count = 0 # type: int + self._last_printable_seen = None # type: Optional[str] + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character.isspace() + or is_punctuation(character) + or character in COMMON_SAFE_ASCII_CHARACTERS + ): + self._last_printable_seen = None + return + + if self._last_printable_seen is None: + self._last_printable_seen = character + return + + unicode_range_a = unicode_range( + self._last_printable_seen + ) # type: Optional[str] + unicode_range_b = unicode_range(character) # type: Optional[str] + + if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): + self._suspicious_successive_range_count += 1 + + self._last_printable_seen = character + + def reset(self) -> None: # pragma: no cover + self._character_count = 0 + self._suspicious_successive_range_count = 0 + self._last_printable_seen = None + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + ratio_of_suspicious_range_usage = ( + self._suspicious_successive_range_count * 2 + ) / self._character_count # type: float + + if ratio_of_suspicious_range_usage < 0.1: + return 0.0 + + return ratio_of_suspicious_range_usage + + +class SuperWeirdWordPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._word_count = 0 # type: int + self._bad_word_count = 0 # type: int + self._foreign_long_count = 0 # type: int + + self._is_current_word_bad = False # type: bool + self._foreign_long_watch = False # type: bool + + self._character_count = 0 # type: int + self._bad_character_count = 0 # type: int + + self._buffer = "" # type: str + self._buffer_accent_count = 0 # type: int + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character.isalpha(): + self._buffer = "".join([self._buffer, character]) + if is_accentuated(character): + self._buffer_accent_count += 1 + if ( + self._foreign_long_watch is False + and (is_latin(character) is False or is_accentuated(character)) + and is_cjk(character) is False + and is_hangul(character) is False + and is_katakana(character) is False + and is_hiragana(character) is False + and is_thai(character) is False + ): + self._foreign_long_watch = True + return + if not self._buffer: + return + if ( + character.isspace() or is_punctuation(character) or is_separator(character) + ) and self._buffer: + self._word_count += 1 + buffer_length = len(self._buffer) # type: int + + self._character_count += buffer_length + + if buffer_length >= 4: + if self._buffer_accent_count / buffer_length > 0.34: + self._is_current_word_bad = True + # Word/Buffer ending with a upper case accentuated letter are so rare, + # that we will consider them all as suspicious. Same weight as foreign_long suspicious. + if is_accentuated(self._buffer[-1]) and self._buffer[-1].isupper(): + self._foreign_long_count += 1 + self._is_current_word_bad = True + if buffer_length >= 24 and self._foreign_long_watch: + self._foreign_long_count += 1 + self._is_current_word_bad = True + + if self._is_current_word_bad: + self._bad_word_count += 1 + self._bad_character_count += len(self._buffer) + self._is_current_word_bad = False + + self._foreign_long_watch = False + self._buffer = "" + self._buffer_accent_count = 0 + elif ( + character not in {"<", ">", "-", "=", "~", "|", "_"} + and character.isdigit() is False + and is_symbol(character) + ): + self._is_current_word_bad = True + self._buffer += character + + def reset(self) -> None: # pragma: no cover + self._buffer = "" + self._is_current_word_bad = False + self._foreign_long_watch = False + self._bad_word_count = 0 + self._word_count = 0 + self._character_count = 0 + self._bad_character_count = 0 + self._foreign_long_count = 0 + + @property + def ratio(self) -> float: + if self._word_count <= 10 and self._foreign_long_count == 0: + return 0.0 + + return self._bad_character_count / self._character_count + + +class CjkInvalidStopPlugin(MessDetectorPlugin): + """ + GB(Chinese) based encoding often render the stop incorrectly when the content does not fit and + can be easily detected. Searching for the overuse of '丅' and '丄'. + """ + + def __init__(self) -> None: + self._wrong_stop_count = 0 # type: int + self._cjk_character_count = 0 # type: int + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character in {"丅", "丄"}: + self._wrong_stop_count += 1 + return + if is_cjk(character): + self._cjk_character_count += 1 + + def reset(self) -> None: # pragma: no cover + self._wrong_stop_count = 0 + self._cjk_character_count = 0 + + @property + def ratio(self) -> float: + if self._cjk_character_count < 16: + return 0.0 + return self._wrong_stop_count / self._cjk_character_count + + +class ArchaicUpperLowerPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._buf = False # type: bool + + self._character_count_since_last_sep = 0 # type: int + + self._successive_upper_lower_count = 0 # type: int + self._successive_upper_lower_count_final = 0 # type: int + + self._character_count = 0 # type: int + + self._last_alpha_seen = None # type: Optional[str] + self._current_ascii_only = True # type: bool + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + is_concerned = character.isalpha() and is_case_variable(character) + chunk_sep = is_concerned is False + + if chunk_sep and self._character_count_since_last_sep > 0: + if ( + self._character_count_since_last_sep <= 64 + and character.isdigit() is False + and self._current_ascii_only is False + ): + self._successive_upper_lower_count_final += ( + self._successive_upper_lower_count + ) + + self._successive_upper_lower_count = 0 + self._character_count_since_last_sep = 0 + self._last_alpha_seen = None + self._buf = False + self._character_count += 1 + self._current_ascii_only = True + + return + + if self._current_ascii_only is True and is_ascii(character) is False: + self._current_ascii_only = False + + if self._last_alpha_seen is not None: + if (character.isupper() and self._last_alpha_seen.islower()) or ( + character.islower() and self._last_alpha_seen.isupper() + ): + if self._buf is True: + self._successive_upper_lower_count += 2 + self._buf = False + else: + self._buf = True + else: + self._buf = False + + self._character_count += 1 + self._character_count_since_last_sep += 1 + self._last_alpha_seen = character + + def reset(self) -> None: # pragma: no cover + self._character_count = 0 + self._character_count_since_last_sep = 0 + self._successive_upper_lower_count = 0 + self._successive_upper_lower_count_final = 0 + self._last_alpha_seen = None + self._buf = False + self._current_ascii_only = True + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return self._successive_upper_lower_count_final / self._character_count + + +def is_suspiciously_successive_range( + unicode_range_a: Optional[str], unicode_range_b: Optional[str] +) -> bool: + """ + Determine if two Unicode range seen next to each other can be considered as suspicious. + """ + if unicode_range_a is None or unicode_range_b is None: + return True + + if unicode_range_a == unicode_range_b: + return False + + if "Latin" in unicode_range_a and "Latin" in unicode_range_b: + return False + + if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: + return False + + # Latin characters can be accompanied with a combining diacritical mark + # eg. Vietnamese. + if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and ( + "Combining" in unicode_range_a or "Combining" in unicode_range_b + ): + return False + + keywords_range_a, keywords_range_b = unicode_range_a.split( + " " + ), unicode_range_b.split(" ") + + for el in keywords_range_a: + if el in UNICODE_SECONDARY_RANGE_KEYWORD: + continue + if el in keywords_range_b: + return False + + # Japanese Exception + range_a_jp_chars, range_b_jp_chars = ( + unicode_range_a + in ( + "Hiragana", + "Katakana", + ), + unicode_range_b in ("Hiragana", "Katakana"), + ) + if (range_a_jp_chars or range_b_jp_chars) and ( + "CJK" in unicode_range_a or "CJK" in unicode_range_b + ): + return False + if range_a_jp_chars and range_b_jp_chars: + return False + + if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: + if "CJK" in unicode_range_a or "CJK" in unicode_range_b: + return False + if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": + return False + + # Chinese/Japanese use dedicated range for punctuation and/or separators. + if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( + unicode_range_a in ["Katakana", "Hiragana"] + and unicode_range_b in ["Katakana", "Hiragana"] + ): + if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: + return False + if "Forms" in unicode_range_a or "Forms" in unicode_range_b: + return False + + return True + + +@lru_cache(maxsize=2048) +def mess_ratio( + decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False +) -> float: + """ + Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. + """ + + detectors = [ + md_class() for md_class in MessDetectorPlugin.__subclasses__() + ] # type: List[MessDetectorPlugin] + + length = len(decoded_sequence) + 1 # type: int + + mean_mess_ratio = 0.0 # type: float + + if length < 512: + intermediary_mean_mess_ratio_calc = 32 # type: int + elif length <= 1024: + intermediary_mean_mess_ratio_calc = 64 + else: + intermediary_mean_mess_ratio_calc = 128 + + for character, index in zip(decoded_sequence + "\n", range(length)): + for detector in detectors: + if detector.eligible(character): + detector.feed(character) + + if ( + index > 0 and index % intermediary_mean_mess_ratio_calc == 0 + ) or index == length - 1: + mean_mess_ratio = sum(dt.ratio for dt in detectors) + + if mean_mess_ratio >= maximum_threshold: + break + + if debug: + for dt in detectors: # pragma: nocover + print(dt.__class__, dt.ratio) + + return round(mean_mess_ratio, 3) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/models.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/models.py new file mode 100644 index 0000000..c38da31 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/models.py @@ -0,0 +1,392 @@ +import warnings +from collections import Counter +from encodings.aliases import aliases +from hashlib import sha256 +from json import dumps +from re import sub +from typing import Any, Dict, Iterator, List, Optional, Tuple, Union + +from .constant import NOT_PRINTABLE_PATTERN, TOO_BIG_SEQUENCE +from .md import mess_ratio +from .utils import iana_name, is_multi_byte_encoding, unicode_range + + +class CharsetMatch: + def __init__( + self, + payload: bytes, + guessed_encoding: str, + mean_mess_ratio: float, + has_sig_or_bom: bool, + languages: "CoherenceMatches", + decoded_payload: Optional[str] = None, + ): + self._payload = payload # type: bytes + + self._encoding = guessed_encoding # type: str + self._mean_mess_ratio = mean_mess_ratio # type: float + self._languages = languages # type: CoherenceMatches + self._has_sig_or_bom = has_sig_or_bom # type: bool + self._unicode_ranges = None # type: Optional[List[str]] + + self._leaves = [] # type: List[CharsetMatch] + self._mean_coherence_ratio = 0.0 # type: float + + self._output_payload = None # type: Optional[bytes] + self._output_encoding = None # type: Optional[str] + + self._string = decoded_payload # type: Optional[str] + + def __eq__(self, other: object) -> bool: + if not isinstance(other, CharsetMatch): + raise TypeError( + "__eq__ cannot be invoked on {} and {}.".format( + str(other.__class__), str(self.__class__) + ) + ) + return self.encoding == other.encoding and self.fingerprint == other.fingerprint + + def __lt__(self, other: object) -> bool: + """ + Implemented to make sorted available upon CharsetMatches items. + """ + if not isinstance(other, CharsetMatch): + raise ValueError + + chaos_difference = abs(self.chaos - other.chaos) # type: float + coherence_difference = abs(self.coherence - other.coherence) # type: float + + # Bellow 1% difference --> Use Coherence + if chaos_difference < 0.01 and coherence_difference > 0.02: + # When having a tough decision, use the result that decoded as many multi-byte as possible. + if chaos_difference == 0.0 and self.coherence == other.coherence: + return self.multi_byte_usage > other.multi_byte_usage + return self.coherence > other.coherence + + return self.chaos < other.chaos + + @property + def multi_byte_usage(self) -> float: + return 1.0 - len(str(self)) / len(self.raw) + + @property + def chaos_secondary_pass(self) -> float: + """ + Check once again chaos in decoded text, except this time, with full content. + Use with caution, this can be very slow. + Notice: Will be removed in 3.0 + """ + warnings.warn( + "chaos_secondary_pass is deprecated and will be removed in 3.0", + DeprecationWarning, + ) + return mess_ratio(str(self), 1.0) + + @property + def coherence_non_latin(self) -> float: + """ + Coherence ratio on the first non-latin language detected if ANY. + Notice: Will be removed in 3.0 + """ + warnings.warn( + "coherence_non_latin is deprecated and will be removed in 3.0", + DeprecationWarning, + ) + return 0.0 + + @property + def w_counter(self) -> Counter: + """ + Word counter instance on decoded text. + Notice: Will be removed in 3.0 + """ + warnings.warn( + "w_counter is deprecated and will be removed in 3.0", DeprecationWarning + ) + + string_printable_only = sub(NOT_PRINTABLE_PATTERN, " ", str(self).lower()) + + return Counter(string_printable_only.split()) + + def __str__(self) -> str: + # Lazy Str Loading + if self._string is None: + self._string = str(self._payload, self._encoding, "strict") + return self._string + + def __repr__(self) -> str: + return "".format(self.encoding, self.fingerprint) + + def add_submatch(self, other: "CharsetMatch") -> None: + if not isinstance(other, CharsetMatch) or other == self: + raise ValueError( + "Unable to add instance <{}> as a submatch of a CharsetMatch".format( + other.__class__ + ) + ) + + other._string = None # Unload RAM usage; dirty trick. + self._leaves.append(other) + + @property + def encoding(self) -> str: + return self._encoding + + @property + def encoding_aliases(self) -> List[str]: + """ + Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. + """ + also_known_as = [] # type: List[str] + for u, p in aliases.items(): + if self.encoding == u: + also_known_as.append(p) + elif self.encoding == p: + also_known_as.append(u) + return also_known_as + + @property + def bom(self) -> bool: + return self._has_sig_or_bom + + @property + def byte_order_mark(self) -> bool: + return self._has_sig_or_bom + + @property + def languages(self) -> List[str]: + """ + Return the complete list of possible languages found in decoded sequence. + Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. + """ + return [e[0] for e in self._languages] + + @property + def language(self) -> str: + """ + Most probable language found in decoded sequence. If none were detected or inferred, the property will return + "Unknown". + """ + if not self._languages: + # Trying to infer the language based on the given encoding + # Its either English or we should not pronounce ourselves in certain cases. + if "ascii" in self.could_be_from_charset: + return "English" + + # doing it there to avoid circular import + from charset_normalizer.cd import encoding_languages, mb_encoding_languages + + languages = ( + mb_encoding_languages(self.encoding) + if is_multi_byte_encoding(self.encoding) + else encoding_languages(self.encoding) + ) + + if len(languages) == 0 or "Latin Based" in languages: + return "Unknown" + + return languages[0] + + return self._languages[0][0] + + @property + def chaos(self) -> float: + return self._mean_mess_ratio + + @property + def coherence(self) -> float: + if not self._languages: + return 0.0 + return self._languages[0][1] + + @property + def percent_chaos(self) -> float: + return round(self.chaos * 100, ndigits=3) + + @property + def percent_coherence(self) -> float: + return round(self.coherence * 100, ndigits=3) + + @property + def raw(self) -> bytes: + """ + Original untouched bytes. + """ + return self._payload + + @property + def submatch(self) -> List["CharsetMatch"]: + return self._leaves + + @property + def has_submatch(self) -> bool: + return len(self._leaves) > 0 + + @property + def alphabets(self) -> List[str]: + if self._unicode_ranges is not None: + return self._unicode_ranges + # list detected ranges + detected_ranges = [ + unicode_range(char) for char in str(self) + ] # type: List[Optional[str]] + # filter and sort + self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) + return self._unicode_ranges + + @property + def could_be_from_charset(self) -> List[str]: + """ + The complete list of encoding that output the exact SAME str result and therefore could be the originating + encoding. + This list does include the encoding available in property 'encoding'. + """ + return [self._encoding] + [m.encoding for m in self._leaves] + + def first(self) -> "CharsetMatch": + """ + Kept for BC reasons. Will be removed in 3.0. + """ + return self + + def best(self) -> "CharsetMatch": + """ + Kept for BC reasons. Will be removed in 3.0. + """ + return self + + def output(self, encoding: str = "utf_8") -> bytes: + """ + Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. + Any errors will be simply ignored by the encoder NOT replaced. + """ + if self._output_encoding is None or self._output_encoding != encoding: + self._output_encoding = encoding + self._output_payload = str(self).encode(encoding, "replace") + + return self._output_payload # type: ignore + + @property + def fingerprint(self) -> str: + """ + Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one. + """ + return sha256(self.output()).hexdigest() + + +class CharsetMatches: + """ + Container with every CharsetMatch items ordered by default from most probable to the less one. + Act like a list(iterable) but does not implements all related methods. + """ + + def __init__(self, results: List[CharsetMatch] = None): + self._results = sorted(results) if results else [] # type: List[CharsetMatch] + + def __iter__(self) -> Iterator[CharsetMatch]: + yield from self._results + + def __getitem__(self, item: Union[int, str]) -> CharsetMatch: + """ + Retrieve a single item either by its position or encoding name (alias may be used here). + Raise KeyError upon invalid index or encoding not present in results. + """ + if isinstance(item, int): + return self._results[item] + if isinstance(item, str): + item = iana_name(item, False) + for result in self._results: + if item in result.could_be_from_charset: + return result + raise KeyError + + def __len__(self) -> int: + return len(self._results) + + def __bool__(self) -> bool: + return len(self._results) > 0 + + def append(self, item: CharsetMatch) -> None: + """ + Insert a single match. Will be inserted accordingly to preserve sort. + Can be inserted as a submatch. + """ + if not isinstance(item, CharsetMatch): + raise ValueError( + "Cannot append instance '{}' to CharsetMatches".format( + str(item.__class__) + ) + ) + # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) + if len(item.raw) <= TOO_BIG_SEQUENCE: + for match in self._results: + if match.fingerprint == item.fingerprint and match.chaos == item.chaos: + match.add_submatch(item) + return + self._results.append(item) + self._results = sorted(self._results) + + def best(self) -> Optional["CharsetMatch"]: + """ + Simply return the first match. Strict equivalent to matches[0]. + """ + if not self._results: + return None + return self._results[0] + + def first(self) -> Optional["CharsetMatch"]: + """ + Redundant method, call the method best(). Kept for BC reasons. + """ + return self.best() + + +CoherenceMatch = Tuple[str, float] +CoherenceMatches = List[CoherenceMatch] + + +class CliDetectionResult: + def __init__( + self, + path: str, + encoding: Optional[str], + encoding_aliases: List[str], + alternative_encodings: List[str], + language: str, + alphabets: List[str], + has_sig_or_bom: bool, + chaos: float, + coherence: float, + unicode_path: Optional[str], + is_preferred: bool, + ): + self.path = path # type: str + self.unicode_path = unicode_path # type: Optional[str] + self.encoding = encoding # type: Optional[str] + self.encoding_aliases = encoding_aliases # type: List[str] + self.alternative_encodings = alternative_encodings # type: List[str] + self.language = language # type: str + self.alphabets = alphabets # type: List[str] + self.has_sig_or_bom = has_sig_or_bom # type: bool + self.chaos = chaos # type: float + self.coherence = coherence # type: float + self.is_preferred = is_preferred # type: bool + + @property + def __dict__(self) -> Dict[str, Any]: # type: ignore + return { + "path": self.path, + "encoding": self.encoding, + "encoding_aliases": self.encoding_aliases, + "alternative_encodings": self.alternative_encodings, + "language": self.language, + "alphabets": self.alphabets, + "has_sig_or_bom": self.has_sig_or_bom, + "chaos": self.chaos, + "coherence": self.coherence, + "unicode_path": self.unicode_path, + "is_preferred": self.is_preferred, + } + + def to_json(self) -> str: + return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/py.typed b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/utils.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/utils.py new file mode 100644 index 0000000..dcb14df --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/utils.py @@ -0,0 +1,342 @@ +try: + import unicodedata2 as unicodedata +except ImportError: + import unicodedata # type: ignore[no-redef] + +import importlib +import logging +from codecs import IncrementalDecoder +from encodings.aliases import aliases +from functools import lru_cache +from re import findall +from typing import List, Optional, Set, Tuple, Union + +from _multibytecodec import MultibyteIncrementalDecoder # type: ignore + +from .constant import ( + ENCODING_MARKS, + IANA_SUPPORTED_SIMILAR, + RE_POSSIBLE_ENCODING_INDICATION, + UNICODE_RANGES_COMBINED, + UNICODE_SECONDARY_RANGE_KEYWORD, + UTF8_MAXIMAL_ALLOCATION, +) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_accentuated(character: str) -> bool: + try: + description = unicodedata.name(character) # type: str + except ValueError: + return False + return ( + "WITH GRAVE" in description + or "WITH ACUTE" in description + or "WITH CEDILLA" in description + or "WITH DIAERESIS" in description + or "WITH CIRCUMFLEX" in description + or "WITH TILDE" in description + ) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def remove_accent(character: str) -> str: + decomposed = unicodedata.decomposition(character) # type: str + if not decomposed: + return character + + codes = decomposed.split(" ") # type: List[str] + + return chr(int(codes[0], 16)) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def unicode_range(character: str) -> Optional[str]: + """ + Retrieve the Unicode range official name from a single character. + """ + character_ord = ord(character) # type: int + + for range_name, ord_range in UNICODE_RANGES_COMBINED.items(): + if character_ord in ord_range: + return range_name + + return None + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_latin(character: str) -> bool: + try: + description = unicodedata.name(character) # type: str + except ValueError: + return False + return "LATIN" in description + + +def is_ascii(character: str) -> bool: + try: + character.encode("ascii") + except UnicodeEncodeError: + return False + return True + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_punctuation(character: str) -> bool: + character_category = unicodedata.category(character) # type: str + + if "P" in character_category: + return True + + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + return False + + return "Punctuation" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_symbol(character: str) -> bool: + character_category = unicodedata.category(character) # type: str + + if "S" in character_category or "N" in character_category: + return True + + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + return False + + return "Forms" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_emoticon(character: str) -> bool: + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + return False + + return "Emoticons" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_separator(character: str) -> bool: + if character.isspace() or character in {"|", "+", ",", ";", "<", ">"}: + return True + + character_category = unicodedata.category(character) # type: str + + return "Z" in character_category + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_case_variable(character: str) -> bool: + return character.islower() != character.isupper() + + +def is_private_use_only(character: str) -> bool: + character_category = unicodedata.category(character) # type: str + + return character_category == "Co" + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_cjk(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "CJK" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hiragana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "HIRAGANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_katakana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "KATAKANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hangul(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "HANGUL" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_thai(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "THAI" in character_name + + +@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) +def is_unicode_range_secondary(range_name: str) -> bool: + return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD) + + +def any_specified_encoding(sequence: bytes, search_zone: int = 4096) -> Optional[str]: + """ + Extract using ASCII-only decoder any specified encoding in the first n-bytes. + """ + if not isinstance(sequence, bytes): + raise TypeError + + seq_len = len(sequence) # type: int + + results = findall( + RE_POSSIBLE_ENCODING_INDICATION, + sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"), + ) # type: List[str] + + if len(results) == 0: + return None + + for specified_encoding in results: + specified_encoding = specified_encoding.lower().replace("-", "_") + + for encoding_alias, encoding_iana in aliases.items(): + if encoding_alias == specified_encoding: + return encoding_iana + if encoding_iana == specified_encoding: + return encoding_iana + + return None + + +@lru_cache(maxsize=128) +def is_multi_byte_encoding(name: str) -> bool: + """ + Verify is a specific encoding is a multi byte one based on it IANA name + """ + return name in { + "utf_8", + "utf_8_sig", + "utf_16", + "utf_16_be", + "utf_16_le", + "utf_32", + "utf_32_le", + "utf_32_be", + "utf_7", + } or issubclass( + importlib.import_module("encodings.{}".format(name)).IncrementalDecoder, # type: ignore + MultibyteIncrementalDecoder, + ) + + +def identify_sig_or_bom(sequence: bytes) -> Tuple[Optional[str], bytes]: + """ + Identify and extract SIG/BOM in given sequence. + """ + + for iana_encoding in ENCODING_MARKS: + marks = ENCODING_MARKS[iana_encoding] # type: Union[bytes, List[bytes]] + + if isinstance(marks, bytes): + marks = [marks] + + for mark in marks: + if sequence.startswith(mark): + return iana_encoding, mark + + return None, b"" + + +def should_strip_sig_or_bom(iana_encoding: str) -> bool: + return iana_encoding not in {"utf_16", "utf_32"} + + +def iana_name(cp_name: str, strict: bool = True) -> str: + cp_name = cp_name.lower().replace("-", "_") + + for encoding_alias, encoding_iana in aliases.items(): + if cp_name in [encoding_alias, encoding_iana]: + return encoding_iana + + if strict: + raise ValueError("Unable to retrieve IANA for '{}'".format(cp_name)) + + return cp_name + + +def range_scan(decoded_sequence: str) -> List[str]: + ranges = set() # type: Set[str] + + for character in decoded_sequence: + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + continue + + ranges.add(character_range) + + return list(ranges) + + +def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: + + if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): + return 0.0 + + decoder_a = importlib.import_module("encodings.{}".format(iana_name_a)).IncrementalDecoder # type: ignore + decoder_b = importlib.import_module("encodings.{}".format(iana_name_b)).IncrementalDecoder # type: ignore + + id_a = decoder_a(errors="ignore") # type: IncrementalDecoder + id_b = decoder_b(errors="ignore") # type: IncrementalDecoder + + character_match_count = 0 # type: int + + for i in range(255): + to_be_decoded = bytes([i]) # type: bytes + if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded): + character_match_count += 1 + + return character_match_count / 254 + + +def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool: + """ + Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using + the function cp_similarity. + """ + return ( + iana_name_a in IANA_SUPPORTED_SIMILAR + and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a] + ) + + +def set_logging_handler( + name: str = "charset_normalizer", + level: int = logging.INFO, + format_string: str = "%(asctime)s | %(levelname)s | %(message)s", +) -> None: + + logger = logging.getLogger(name) + logger.setLevel(level) + + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter(format_string)) + logger.addHandler(handler) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/version.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/version.py new file mode 100644 index 0000000..77cfff2 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/charset_normalizer/version.py @@ -0,0 +1,6 @@ +""" +Expose version +""" + +__version__ = "2.0.12" +VERSION = __version__.split(".") diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__init__.py new file mode 100644 index 0000000..0defb82 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +try: + from ._version import version as __version__ +except ImportError: + __version__ = 'unknown' + +__all__ = ['easter', 'parser', 'relativedelta', 'rrule', 'tz', + 'utils', 'zoneinfo'] diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18c2d0a7000bfc130fc7ffe5c9086a468b3b20a4 GIT binary patch literal 333 zcmYjMu};G<5Vf78iD)Y!@f8_ps9;2hg@J{I0pZ0Md=#sW9i5$4&F8T3OCDI5nAlms zK_Kx?_fBuPd-vRYzDE*V{c-o2=G!R#qe|jDwLeKTREj8SNJ}}Rq?70Y`5eK>pf{kv z1j!4;-T-G|;6)#_@w^(G1#KVQRbB8({GLRXEaFuBX(8hDvh5s(3q*&p6hay!#0$YO z&<}ksjlOTXU3hZ#c(FWcybf^K$%nOEfp3%yFj_W3Xsd$|i*6UI)7Gi<(b*Wu&k`}Z MPiM5E>}!^N0}5YTH2?qr literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/_common.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/_common.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..775f1c869fc690c499558cafee763cdeafbde188 GIT binary patch literal 1389 zcmZWpO>fgc5Zzrnj%$)oK7>GU2nYlbqAlWv5TZg9E)BGxJjfQ9&oS*HmXeoDvQl70>J4_t*AIo^@ED5gd6jQpo@0F~-xjf!0cJk4qrH3oawqNK6<0Ks<+uAOxq|lS1pDoMO@v=1Dt3oOJqkbXf z0{(A_*?>oUx_E?j>DZl8;^RR!g*w1DU=ZM4HV~#+0&dB^(OH!IJ1RF+Ue9yLs|6|3 zEU{Kf2fimv177EI71T=;cZ4iWvP{Z0PL|4xxX(Lc9$OvoAGQ#|4%=fG(~E?yX)uJ%{%}JqO7?T?`h2U3> zyx7s^Yyp9k`m>am5aGHi_*EWo@z?iTe`ud}PDrM}l=2)8vWYlX25F)It$+?%x5PeR zAJJO*JBi&nf!O0Uqr}%~GAT~V>$tbXj{uoI5B|*4S%>^b=S-XQT9%-4AX;d%Lr~{v z&9b??u74#=g?dZB(LY1x?XuOI!f}^rzR1 z#p^e*c=tXQA6{U86^pgEvDjF}d_Qg8vG?xWS3N^&JrY~R?b%L2YDSNZl(!M)*on}o zvtp}5YThG~=O`JXiYk(_{*=ION%?t_WJeyT-DY_~YA4DK@n<@;P)E%LT1XyqcxL>$ zmeR>-CuAXyMCgY>7=}Ts*5o=q1WhSbo+5LQZ|>@}sFiTi{n_)X@JWsGDM`z{={~#M F_y@~k3&;Qf literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/_version.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/_version.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53e062ec5ccc7d46c1b4f351c01846125392a951 GIT binary patch literal 197 zcmd1j<>g`kf_%;Q34K8NF^Gc<7=auIATH(s5-AK(3@MCJj44dP44TYUtVVhkdPbVe zFPVUHFFAlj5lFe8CetnUvecsD%>2A4UMM5Jq_iL>btOX)3rHD=_+^-rnWSG(S(1^T zXRK#vpkJI>lB!#fn4F!Mo?5J*l30>jT9TQg9}hJ_ub}c4hfQvNN@-529mt+ykSQ$8 G9E<=o8!piR literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/easter.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/easter.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3068309f62e84c1a5b121345b224efc218fc8748 GIT binary patch literal 2173 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 b1pHXQ0&7|Z?4>*lhGi5I+8?XG-0A-VTC}*& literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/rrule.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/rrule.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf53a025c72988cea87895c0a232ca3bca126c70 GIT binary patch literal 43306 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 YfbcWvDV|mL|I!B$ayDJ&bMmSG3*hk$tpET3 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/tzwin.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/tzwin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..287ea8e3df802732c228ba8ce792585766b752fb GIT binary patch literal 162 zcmd1j<>g`kf_%;Q3D!XRF^Gc(44TX@8G%BYjJFuI z{4^P(*h;GO$}{s;G88cbg~7xxy`0P>{esGpjQl)fJwpTi;>?m%-GapA?8NlcV*QlF klGM_Y%pCoaDxgNag34PQHo5sJr8%i~Ad`zhR`W0d0CK-1Y5)KL literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/utils.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae73d98f87e080569aa9ae35b9078d1552b315a9 GIT binary patch literal 2226 zcmbVOJ#QN~7`_kLQqFc^WC{YLAkrbe)|Sssixxs_qzJlZsGUWNL>(!K$%&_uJUcR! zsaf+M5}-?l{voZMI(6^V=cT@^zzvEXd_0nR`F=j{LzjDdNr0zJ|LXo;4}w2var23> zc!JlSVGuz(5TS^Qa1^zpkmhj_kK%SbsPxAW)VX9_3syN*C^upKO6N|M+OmFWn2@|s zdcdxf8zzD~>C{NtW|B0U>=NoA$c2!i)ncd3Z<|^2CmavbaJFA*m6t+xpp@*{G@3P* z3T8D@^DGZZc=1H|A|=67y!Igm7rYCn!Ta!ah*>lZ-^K3(R}Kgb-u?IaDMJ z&(G3T22OL<8c$kz!L4m|m-f2M$gz=DYDdAip=5bw43+{;}&g1EJ znJ*S4ot2ttt}Z32xe!3m(Bf`e#@5mwOHP;(pC+`?q2IdM`KsOou=V@g}ciNuMItW^Vz*(wv=u5f4( z)dxv|+RpRL%GmHO6i3ETiqt$>y2aLMtyhq`n9n>jt(xv3N?E z4|EmIKHEgY1MFEMpyWX<+>H#eNRH-TJ;W%qeu~$AiNOWa=-2RdG!3TVz2J2`jdp@* zT!YZdu)I5sUV=fQAOxqR;kEXOdA?=<5Fqg9FNG^m_lh<)8Xn!M<)Bal)dN`wMHeaE zn_d~x-otf*3lpSaKpXOxiWl>A;2w;5&!)9@EZhkVr?{+T;rJ|BtNA!3yL8zq-SL7? zC{9X9W2+I~56wQNY4|K{%<7#ESfbNuC!J2e!tEzJ9YeJ03Eq>rr(K^zf9{4MB6i~o b(D;7-|G^pE6LuE^62HA4C2?ba_lti3k8xs0 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/_common.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/_common.py new file mode 100644 index 0000000..4eb2659 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/_common.py @@ -0,0 +1,43 @@ +""" +Common code used in multiple modules. +""" + + +class weekday(object): + __slots__ = ["weekday", "n"] + + def __init__(self, weekday, n=None): + self.weekday = weekday + self.n = n + + def __call__(self, n): + if n == self.n: + return self + else: + return self.__class__(self.weekday, n) + + def __eq__(self, other): + try: + if self.weekday != other.weekday or self.n != other.n: + return False + except AttributeError: + return False + return True + + def __hash__(self): + return hash(( + self.weekday, + self.n, + )) + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday] + if not self.n: + return s + else: + return "%s(%+d)" % (s, self.n) + +# vim:ts=4:sw=4:et diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/_version.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/_version.py new file mode 100644 index 0000000..b723056 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/_version.py @@ -0,0 +1,5 @@ +# coding: utf-8 +# file generated by setuptools_scm +# don't change, don't track in version control +version = '2.8.2' +version_tuple = (2, 8, 2) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/easter.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/easter.py new file mode 100644 index 0000000..f74d1f7 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/easter.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +""" +This module offers a generic Easter computing method for any given year, using +Western, Orthodox or Julian algorithms. +""" + +import datetime + +__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"] + +EASTER_JULIAN = 1 +EASTER_ORTHODOX = 2 +EASTER_WESTERN = 3 + + +def easter(year, method=EASTER_WESTERN): + """ + This method was ported from the work done by GM Arts, + on top of the algorithm by Claus Tondering, which was + based in part on the algorithm of Ouding (1940), as + quoted in "Explanatory Supplement to the Astronomical + Almanac", P. Kenneth Seidelmann, editor. + + This algorithm implements three different Easter + calculation methods: + + 1. Original calculation in Julian calendar, valid in + dates after 326 AD + 2. Original method, with date converted to Gregorian + calendar, valid in years 1583 to 4099 + 3. Revised method, in Gregorian calendar, valid in + years 1583 to 4099 as well + + These methods are represented by the constants: + + * ``EASTER_JULIAN = 1`` + * ``EASTER_ORTHODOX = 2`` + * ``EASTER_WESTERN = 3`` + + The default method is method 3. + + More about the algorithm may be found at: + + `GM Arts: Easter Algorithms `_ + + and + + `The Calendar FAQ: Easter `_ + + """ + + if not (1 <= method <= 3): + raise ValueError("invalid method") + + # g - Golden year - 1 + # c - Century + # h - (23 - Epact) mod 30 + # i - Number of days from March 21 to Paschal Full Moon + # j - Weekday for PFM (0=Sunday, etc) + # p - Number of days from March 21 to Sunday on or before PFM + # (-6 to 28 methods 1 & 3, to 56 for method 2) + # e - Extra days to add for method 2 (converting Julian + # date to Gregorian date) + + y = year + g = y % 19 + e = 0 + if method < 3: + # Old method + i = (19*g + 15) % 30 + j = (y + y//4 + i) % 7 + if method == 2: + # Extra dates to convert Julian to Gregorian date + e = 10 + if y > 1600: + e = e + y//100 - 16 - (y//100 - 16)//4 + else: + # New method + c = y//100 + h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30 + i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11)) + j = (y + y//4 + i + 2 - c + c//4) % 7 + + # p can be from -6 to 56 corresponding to dates 22 March to 23 May + # (later dates apply to method 2, although 23 May never actually occurs) + p = i - j + e + d = 1 + (p + 27 + (p + 6)//40) % 31 + m = 3 + (p + 26)//30 + return datetime.date(int(y), int(m), int(d)) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/__init__.py new file mode 100644 index 0000000..d174b0e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/__init__.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +from ._parser import parse, parser, parserinfo, ParserError +from ._parser import DEFAULTPARSER, DEFAULTTZPARSER +from ._parser import UnknownTimezoneWarning + +from ._parser import __doc__ + +from .isoparser import isoparser, isoparse + +__all__ = ['parse', 'parser', 'parserinfo', + 'isoparse', 'isoparser', + 'ParserError', + 'UnknownTimezoneWarning'] + + +### +# Deprecate portions of the private interface so that downstream code that +# is improperly relying on it is given *some* notice. + + +def __deprecated_private_func(f): + from functools import wraps + import warnings + + msg = ('{name} is a private function and may break without warning, ' + 'it will be moved and or renamed in future versions.') + msg = msg.format(name=f.__name__) + + @wraps(f) + def deprecated_func(*args, **kwargs): + warnings.warn(msg, DeprecationWarning) + return f(*args, **kwargs) + + return deprecated_func + +def __deprecate_private_class(c): + import warnings + + msg = ('{name} is a private class and may break without warning, ' + 'it will be moved and or renamed in future versions.') + msg = msg.format(name=c.__name__) + + class private_class(c): + __doc__ = c.__doc__ + + def __init__(self, *args, **kwargs): + warnings.warn(msg, DeprecationWarning) + super(private_class, self).__init__(*args, **kwargs) + + private_class.__name__ = c.__name__ + + return private_class + + +from ._parser import _timelex, _resultbase +from ._parser import _tzparser, _parsetz + +_timelex = __deprecate_private_class(_timelex) +_tzparser = __deprecate_private_class(_tzparser) +_resultbase = __deprecate_private_class(_resultbase) +_parsetz = __deprecated_private_func(_parsetz) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53a9a00698ee658e9ff7e378b4c4a6dea9a4304b GIT binary patch literal 2037 zcmb_dOK&4Z5bo|7+vB&Bg=IH9b`S_**mV}TfV5ieq77V7wAy5aG?!-LZktKwVY>S|44*+j>SJ<*sW=qflvS%2p{;D|D0&GE;wyTWU+GOm&%Q zKHB=^;nUA{A3uDuv-QNZ7t`IKSm;u7{b_oTW=H96l*mbz%FjcUM(GfCDx8a~&pCvt zMmk%3%v+k>ib5!rgTh5oM}gq05(*DQA2VJ)=!uS~^~WFtwJ6gQ3W!iaVs_4ib57@U z-|Fud8hP*O&MTP*?tCr2&7v&QsGEXvTxEbktcqn z{m>t&=rGKsKNzR|Jjzl(Oog9>$Nrv@;eme?pVadEScX)GTE1}nVarFqvvuma3h`c{9MTWTXesvq3`;X|?g(aS z2GrUI$|21@B?ZN1&H#ufN@t!Z0r8x3hCXw~VF2OE+o}O^Ch947;61C2uT9ypn!c3y%RW43Y$4I7fOL1JM#i}2JS%#3UDTOui(m;XKGWwJk*ut z6-W`v=iGh^CUfVK+c|(VC8uoPnNr|5LyqHZw?kA1T)VDX1EtnMn35ikq(VLvZ0tJ5 z)iNHaYv}TVbvIScZDyRSm++U9u37zKgp2AzELUu*3>Pp7P2!!Oo2 zPcku%fw88+`B&pGF8Hge%TJo-BFnyvW5^VFeBm0}w>hgf(GPo|OVt}_+gx$=T^JgE zQp6)=y1}d`v<3PqY($#@ywye9b_X8y-@9Y=6fv?!k`}$O!Muvg)H|>MH;u=0xanj0 zwW)I@^*GM=LM`!*=lNuL$8&4slkM($P$?$rueZIu<1u$tL4mh@fr$MB;J*O>AfW{W z`_d+$uwr!^#T^uQSVdvBIxB4Nd-n>^?_&q+S3umL9onD`)?ps=>R!8ZtwX_r3!p*& E1Ze2`Z~y=R literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/__pycache__/_parser.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/__pycache__/_parser.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c9576630ff40849ab608b648f135eafc26aeee1 GIT binary patch literal 40508 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 +- `W3C Date and Time Formats `_ +- `Time Formats (Planetary Rings Node) `_ +- `CPAN ParseDate module + `_ +- `Java SimpleDateFormat Class + `_ +""" +from __future__ import unicode_literals + +import datetime +import re +import string +import time +import warnings + +from calendar import monthrange +from io import StringIO + +import six +from six import integer_types, text_type + +from decimal import Decimal + +from warnings import warn + +from .. import relativedelta +from .. import tz + +__all__ = ["parse", "parserinfo", "ParserError"] + + +# TODO: pandas.core.tools.datetimes imports this explicitly. Might be worth +# making public and/or figuring out if there is something we can +# take off their plate. +class _timelex(object): + # Fractional seconds are sometimes split by a comma + _split_decimal = re.compile("([.,])") + + def __init__(self, instream): + if isinstance(instream, (bytes, bytearray)): + instream = instream.decode() + + if isinstance(instream, text_type): + instream = StringIO(instream) + elif getattr(instream, 'read', None) is None: + raise TypeError('Parser must be a string or character stream, not ' + '{itype}'.format(itype=instream.__class__.__name__)) + + self.instream = instream + self.charstack = [] + self.tokenstack = [] + self.eof = False + + def get_token(self): + """ + This function breaks the time string into lexical units (tokens), which + can be parsed by the parser. Lexical units are demarcated by changes in + the character set, so any continuous string of letters is considered + one unit, any continuous string of numbers is considered one unit. + + The main complication arises from the fact that dots ('.') can be used + both as separators (e.g. "Sep.20.2009") or decimal points (e.g. + "4:30:21.447"). As such, it is necessary to read the full context of + any dot-separated strings before breaking it into tokens; as such, this + function maintains a "token stack", for when the ambiguous context + demands that multiple tokens be parsed at once. + """ + if self.tokenstack: + return self.tokenstack.pop(0) + + seenletters = False + token = None + state = None + + while not self.eof: + # We only realize that we've reached the end of a token when we + # find a character that's not part of the current token - since + # that character may be part of the next token, it's stored in the + # charstack. + if self.charstack: + nextchar = self.charstack.pop(0) + else: + nextchar = self.instream.read(1) + while nextchar == '\x00': + nextchar = self.instream.read(1) + + if not nextchar: + self.eof = True + break + elif not state: + # First character of the token - determines if we're starting + # to parse a word, a number or something else. + token = nextchar + if self.isword(nextchar): + state = 'a' + elif self.isnum(nextchar): + state = '0' + elif self.isspace(nextchar): + token = ' ' + break # emit token + else: + break # emit token + elif state == 'a': + # If we've already started reading a word, we keep reading + # letters until we find something that's not part of a word. + seenletters = True + if self.isword(nextchar): + token += nextchar + elif nextchar == '.': + token += nextchar + state = 'a.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == '0': + # If we've already started reading a number, we keep reading + # numbers until we find something that doesn't fit. + if self.isnum(nextchar): + token += nextchar + elif nextchar == '.' or (nextchar == ',' and len(token) >= 2): + token += nextchar + state = '0.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == 'a.': + # If we've seen some letters and a dot separator, continue + # parsing, and the tokens will be broken up later. + seenletters = True + if nextchar == '.' or self.isword(nextchar): + token += nextchar + elif self.isnum(nextchar) and token[-1] == '.': + token += nextchar + state = '0.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == '0.': + # If we've seen at least one dot separator, keep going, we'll + # break up the tokens later. + if nextchar == '.' or self.isnum(nextchar): + token += nextchar + elif self.isword(nextchar) and token[-1] == '.': + token += nextchar + state = 'a.' + else: + self.charstack.append(nextchar) + break # emit token + + if (state in ('a.', '0.') and (seenletters or token.count('.') > 1 or + token[-1] in '.,')): + l = self._split_decimal.split(token) + token = l[0] + for tok in l[1:]: + if tok: + self.tokenstack.append(tok) + + if state == '0.' and token.count('.') == 0: + token = token.replace(',', '.') + + return token + + def __iter__(self): + return self + + def __next__(self): + token = self.get_token() + if token is None: + raise StopIteration + + return token + + def next(self): + return self.__next__() # Python 2.x support + + @classmethod + def split(cls, s): + return list(cls(s)) + + @classmethod + def isword(cls, nextchar): + """ Whether or not the next character is part of a word """ + return nextchar.isalpha() + + @classmethod + def isnum(cls, nextchar): + """ Whether the next character is part of a number """ + return nextchar.isdigit() + + @classmethod + def isspace(cls, nextchar): + """ Whether the next character is whitespace """ + return nextchar.isspace() + + +class _resultbase(object): + + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, None) + + def _repr(self, classname): + l = [] + for attr in self.__slots__: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, repr(value))) + return "%s(%s)" % (classname, ", ".join(l)) + + def __len__(self): + return (sum(getattr(self, attr) is not None + for attr in self.__slots__)) + + def __repr__(self): + return self._repr(self.__class__.__name__) + + +class parserinfo(object): + """ + Class which handles what inputs are accepted. Subclass this to customize + the language and acceptable values for each parameter. + + :param dayfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the day (``True``) or month (``False``). If + ``yearfirst`` is set to ``True``, this distinguishes between YDM + and YMD. Default is ``False``. + + :param yearfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the year. If ``True``, the first number is taken + to be the year, otherwise the last number is taken to be the year. + Default is ``False``. + """ + + # m from a.m/p.m, t from ISO T separator + JUMP = [" ", ".", ",", ";", "-", "/", "'", + "at", "on", "and", "ad", "m", "t", "of", + "st", "nd", "rd", "th"] + + WEEKDAYS = [("Mon", "Monday"), + ("Tue", "Tuesday"), # TODO: "Tues" + ("Wed", "Wednesday"), + ("Thu", "Thursday"), # TODO: "Thurs" + ("Fri", "Friday"), + ("Sat", "Saturday"), + ("Sun", "Sunday")] + MONTHS = [("Jan", "January"), + ("Feb", "February"), # TODO: "Febr" + ("Mar", "March"), + ("Apr", "April"), + ("May", "May"), + ("Jun", "June"), + ("Jul", "July"), + ("Aug", "August"), + ("Sep", "Sept", "September"), + ("Oct", "October"), + ("Nov", "November"), + ("Dec", "December")] + HMS = [("h", "hour", "hours"), + ("m", "minute", "minutes"), + ("s", "second", "seconds")] + AMPM = [("am", "a"), + ("pm", "p")] + UTCZONE = ["UTC", "GMT", "Z", "z"] + PERTAIN = ["of"] + TZOFFSET = {} + # TODO: ERA = ["AD", "BC", "CE", "BCE", "Stardate", + # "Anno Domini", "Year of Our Lord"] + + def __init__(self, dayfirst=False, yearfirst=False): + self._jump = self._convert(self.JUMP) + self._weekdays = self._convert(self.WEEKDAYS) + self._months = self._convert(self.MONTHS) + self._hms = self._convert(self.HMS) + self._ampm = self._convert(self.AMPM) + self._utczone = self._convert(self.UTCZONE) + self._pertain = self._convert(self.PERTAIN) + + self.dayfirst = dayfirst + self.yearfirst = yearfirst + + self._year = time.localtime().tm_year + self._century = self._year // 100 * 100 + + def _convert(self, lst): + dct = {} + for i, v in enumerate(lst): + if isinstance(v, tuple): + for v in v: + dct[v.lower()] = i + else: + dct[v.lower()] = i + return dct + + def jump(self, name): + return name.lower() in self._jump + + def weekday(self, name): + try: + return self._weekdays[name.lower()] + except KeyError: + pass + return None + + def month(self, name): + try: + return self._months[name.lower()] + 1 + except KeyError: + pass + return None + + def hms(self, name): + try: + return self._hms[name.lower()] + except KeyError: + return None + + def ampm(self, name): + try: + return self._ampm[name.lower()] + except KeyError: + return None + + def pertain(self, name): + return name.lower() in self._pertain + + def utczone(self, name): + return name.lower() in self._utczone + + def tzoffset(self, name): + if name in self._utczone: + return 0 + + return self.TZOFFSET.get(name) + + def convertyear(self, year, century_specified=False): + """ + Converts two-digit years to year within [-50, 49] + range of self._year (current local time) + """ + + # Function contract is that the year is always positive + assert year >= 0 + + if year < 100 and not century_specified: + # assume current century to start + year += self._century + + if year >= self._year + 50: # if too far in future + year -= 100 + elif year < self._year - 50: # if too far in past + year += 100 + + return year + + def validate(self, res): + # move to info + if res.year is not None: + res.year = self.convertyear(res.year, res.century_specified) + + if ((res.tzoffset == 0 and not res.tzname) or + (res.tzname == 'Z' or res.tzname == 'z')): + res.tzname = "UTC" + res.tzoffset = 0 + elif res.tzoffset != 0 and res.tzname and self.utczone(res.tzname): + res.tzoffset = 0 + return True + + +class _ymd(list): + def __init__(self, *args, **kwargs): + super(self.__class__, self).__init__(*args, **kwargs) + self.century_specified = False + self.dstridx = None + self.mstridx = None + self.ystridx = None + + @property + def has_year(self): + return self.ystridx is not None + + @property + def has_month(self): + return self.mstridx is not None + + @property + def has_day(self): + return self.dstridx is not None + + def could_be_day(self, value): + if self.has_day: + return False + elif not self.has_month: + return 1 <= value <= 31 + elif not self.has_year: + # Be permissive, assume leap year + month = self[self.mstridx] + return 1 <= value <= monthrange(2000, month)[1] + else: + month = self[self.mstridx] + year = self[self.ystridx] + return 1 <= value <= monthrange(year, month)[1] + + def append(self, val, label=None): + if hasattr(val, '__len__'): + if val.isdigit() and len(val) > 2: + self.century_specified = True + if label not in [None, 'Y']: # pragma: no cover + raise ValueError(label) + label = 'Y' + elif val > 100: + self.century_specified = True + if label not in [None, 'Y']: # pragma: no cover + raise ValueError(label) + label = 'Y' + + super(self.__class__, self).append(int(val)) + + if label == 'M': + if self.has_month: + raise ValueError('Month is already set') + self.mstridx = len(self) - 1 + elif label == 'D': + if self.has_day: + raise ValueError('Day is already set') + self.dstridx = len(self) - 1 + elif label == 'Y': + if self.has_year: + raise ValueError('Year is already set') + self.ystridx = len(self) - 1 + + def _resolve_from_stridxs(self, strids): + """ + Try to resolve the identities of year/month/day elements using + ystridx, mstridx, and dstridx, if enough of these are specified. + """ + if len(self) == 3 and len(strids) == 2: + # we can back out the remaining stridx value + missing = [x for x in range(3) if x not in strids.values()] + key = [x for x in ['y', 'm', 'd'] if x not in strids] + assert len(missing) == len(key) == 1 + key = key[0] + val = missing[0] + strids[key] = val + + assert len(self) == len(strids) # otherwise this should not be called + out = {key: self[strids[key]] for key in strids} + return (out.get('y'), out.get('m'), out.get('d')) + + def resolve_ymd(self, yearfirst, dayfirst): + len_ymd = len(self) + year, month, day = (None, None, None) + + strids = (('y', self.ystridx), + ('m', self.mstridx), + ('d', self.dstridx)) + + strids = {key: val for key, val in strids if val is not None} + if (len(self) == len(strids) > 0 or + (len(self) == 3 and len(strids) == 2)): + return self._resolve_from_stridxs(strids) + + mstridx = self.mstridx + + if len_ymd > 3: + raise ValueError("More than three YMD values") + elif len_ymd == 1 or (mstridx is not None and len_ymd == 2): + # One member, or two members with a month string + if mstridx is not None: + month = self[mstridx] + # since mstridx is 0 or 1, self[mstridx-1] always + # looks up the other element + other = self[mstridx - 1] + else: + other = self[0] + + if len_ymd > 1 or mstridx is None: + if other > 31: + year = other + else: + day = other + + elif len_ymd == 2: + # Two members with numbers + if self[0] > 31: + # 99-01 + year, month = self + elif self[1] > 31: + # 01-99 + month, year = self + elif dayfirst and self[1] <= 12: + # 13-01 + day, month = self + else: + # 01-13 + month, day = self + + elif len_ymd == 3: + # Three members + if mstridx == 0: + if self[1] > 31: + # Apr-2003-25 + month, year, day = self + else: + month, day, year = self + elif mstridx == 1: + if self[0] > 31 or (yearfirst and self[2] <= 31): + # 99-Jan-01 + year, month, day = self + else: + # 01-Jan-01 + # Give precedence to day-first, since + # two-digit years is usually hand-written. + day, month, year = self + + elif mstridx == 2: + # WTF!? + if self[1] > 31: + # 01-99-Jan + day, year, month = self + else: + # 99-01-Jan + year, day, month = self + + else: + if (self[0] > 31 or + self.ystridx == 0 or + (yearfirst and self[1] <= 12 and self[2] <= 31)): + # 99-01-01 + if dayfirst and self[2] <= 12: + year, day, month = self + else: + year, month, day = self + elif self[0] > 12 or (dayfirst and self[1] <= 12): + # 13-01-01 + day, month, year = self + else: + # 01-13-01 + month, day, year = self + + return year, month, day + + +class parser(object): + def __init__(self, info=None): + self.info = info or parserinfo() + + def parse(self, timestr, default=None, + ignoretz=False, tzinfos=None, **kwargs): + """ + Parse the date/time string into a :class:`datetime.datetime` object. + + :param timestr: + Any date/time string using the supported formats. + + :param default: + The default datetime object, if this is a datetime object and not + ``None``, elements specified in ``timestr`` replace elements in the + default object. + + :param ignoretz: + If set ``True``, time zones in parsed strings are ignored and a + naive :class:`datetime.datetime` object is returned. + + :param tzinfos: + Additional time zone names / aliases which may be present in the + string. This argument maps time zone names (and optionally offsets + from those time zones) to time zones. This parameter can be a + dictionary with timezone aliases mapping time zone names to time + zones or a function taking two parameters (``tzname`` and + ``tzoffset``) and returning a time zone. + + The timezones to which the names are mapped can be an integer + offset from UTC in seconds or a :class:`tzinfo` object. + + .. doctest:: + :options: +NORMALIZE_WHITESPACE + + >>> from dateutil.parser import parse + >>> from dateutil.tz import gettz + >>> tzinfos = {"BRST": -7200, "CST": gettz("America/Chicago")} + >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -7200)) + >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, + tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) + + This parameter is ignored if ``ignoretz`` is set. + + :param \\*\\*kwargs: + Keyword arguments as passed to ``_parse()``. + + :return: + Returns a :class:`datetime.datetime` object or, if the + ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the + first element being a :class:`datetime.datetime` object, the second + a tuple containing the fuzzy tokens. + + :raises ParserError: + Raised for invalid or unknown string format, if the provided + :class:`tzinfo` is not in a valid format, or if an invalid date + would be created. + + :raises TypeError: + Raised for non-string or character stream input. + + :raises OverflowError: + Raised if the parsed date exceeds the largest valid C integer on + your system. + """ + + if default is None: + default = datetime.datetime.now().replace(hour=0, minute=0, + second=0, microsecond=0) + + res, skipped_tokens = self._parse(timestr, **kwargs) + + if res is None: + raise ParserError("Unknown string format: %s", timestr) + + if len(res) == 0: + raise ParserError("String does not contain a date: %s", timestr) + + try: + ret = self._build_naive(res, default) + except ValueError as e: + six.raise_from(ParserError(str(e) + ": %s", timestr), e) + + if not ignoretz: + ret = self._build_tzaware(ret, res, tzinfos) + + if kwargs.get('fuzzy_with_tokens', False): + return ret, skipped_tokens + else: + return ret + + class _result(_resultbase): + __slots__ = ["year", "month", "day", "weekday", + "hour", "minute", "second", "microsecond", + "tzname", "tzoffset", "ampm","any_unused_tokens"] + + def _parse(self, timestr, dayfirst=None, yearfirst=None, fuzzy=False, + fuzzy_with_tokens=False): + """ + Private method which performs the heavy lifting of parsing, called from + ``parse()``, which passes on its ``kwargs`` to this function. + + :param timestr: + The string to parse. + + :param dayfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the day (``True``) or month (``False``). If + ``yearfirst`` is set to ``True``, this distinguishes between YDM + and YMD. If set to ``None``, this value is retrieved from the + current :class:`parserinfo` object (which itself defaults to + ``False``). + + :param yearfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the year. If ``True``, the first number is taken + to be the year, otherwise the last number is taken to be the year. + If this is set to ``None``, the value is retrieved from the current + :class:`parserinfo` object (which itself defaults to ``False``). + + :param fuzzy: + Whether to allow fuzzy parsing, allowing for string like "Today is + January 1, 2047 at 8:21:00AM". + + :param fuzzy_with_tokens: + If ``True``, ``fuzzy`` is automatically set to True, and the parser + will return a tuple where the first element is the parsed + :class:`datetime.datetime` datetimestamp and the second element is + a tuple containing the portions of the string which were ignored: + + .. doctest:: + + >>> from dateutil.parser import parse + >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) + (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) + + """ + if fuzzy_with_tokens: + fuzzy = True + + info = self.info + + if dayfirst is None: + dayfirst = info.dayfirst + + if yearfirst is None: + yearfirst = info.yearfirst + + res = self._result() + l = _timelex.split(timestr) # Splits the timestr into tokens + + skipped_idxs = [] + + # year/month/day list + ymd = _ymd() + + len_l = len(l) + i = 0 + try: + while i < len_l: + + # Check if it's a number + value_repr = l[i] + try: + value = float(value_repr) + except ValueError: + value = None + + if value is not None: + # Numeric token + i = self._parse_numeric_token(l, i, info, ymd, res, fuzzy) + + # Check weekday + elif info.weekday(l[i]) is not None: + value = info.weekday(l[i]) + res.weekday = value + + # Check month name + elif info.month(l[i]) is not None: + value = info.month(l[i]) + ymd.append(value, 'M') + + if i + 1 < len_l: + if l[i + 1] in ('-', '/'): + # Jan-01[-99] + sep = l[i + 1] + ymd.append(l[i + 2]) + + if i + 3 < len_l and l[i + 3] == sep: + # Jan-01-99 + ymd.append(l[i + 4]) + i += 2 + + i += 2 + + elif (i + 4 < len_l and l[i + 1] == l[i + 3] == ' ' and + info.pertain(l[i + 2])): + # Jan of 01 + # In this case, 01 is clearly year + if l[i + 4].isdigit(): + # Convert it here to become unambiguous + value = int(l[i + 4]) + year = str(info.convertyear(value)) + ymd.append(year, 'Y') + else: + # Wrong guess + pass + # TODO: not hit in tests + i += 4 + + # Check am/pm + elif info.ampm(l[i]) is not None: + value = info.ampm(l[i]) + val_is_ampm = self._ampm_valid(res.hour, res.ampm, fuzzy) + + if val_is_ampm: + res.hour = self._adjust_ampm(res.hour, value) + res.ampm = value + + elif fuzzy: + skipped_idxs.append(i) + + # Check for a timezone name + elif self._could_be_tzname(res.hour, res.tzname, res.tzoffset, l[i]): + res.tzname = l[i] + res.tzoffset = info.tzoffset(res.tzname) + + # Check for something like GMT+3, or BRST+3. Notice + # that it doesn't mean "I am 3 hours after GMT", but + # "my time +3 is GMT". If found, we reverse the + # logic so that timezone parsing code will get it + # right. + if i + 1 < len_l and l[i + 1] in ('+', '-'): + l[i + 1] = ('+', '-')[l[i + 1] == '+'] + res.tzoffset = None + if info.utczone(res.tzname): + # With something like GMT+3, the timezone + # is *not* GMT. + res.tzname = None + + # Check for a numbered timezone + elif res.hour is not None and l[i] in ('+', '-'): + signal = (-1, 1)[l[i] == '+'] + len_li = len(l[i + 1]) + + # TODO: check that l[i + 1] is integer? + if len_li == 4: + # -0300 + hour_offset = int(l[i + 1][:2]) + min_offset = int(l[i + 1][2:]) + elif i + 2 < len_l and l[i + 2] == ':': + # -03:00 + hour_offset = int(l[i + 1]) + min_offset = int(l[i + 3]) # TODO: Check that l[i+3] is minute-like? + i += 2 + elif len_li <= 2: + # -[0]3 + hour_offset = int(l[i + 1][:2]) + min_offset = 0 + else: + raise ValueError(timestr) + + res.tzoffset = signal * (hour_offset * 3600 + min_offset * 60) + + # Look for a timezone name between parenthesis + if (i + 5 < len_l and + info.jump(l[i + 2]) and l[i + 3] == '(' and + l[i + 5] == ')' and + 3 <= len(l[i + 4]) and + self._could_be_tzname(res.hour, res.tzname, + None, l[i + 4])): + # -0300 (BRST) + res.tzname = l[i + 4] + i += 4 + + i += 1 + + # Check jumps + elif not (info.jump(l[i]) or fuzzy): + raise ValueError(timestr) + + else: + skipped_idxs.append(i) + i += 1 + + # Process year/month/day + year, month, day = ymd.resolve_ymd(yearfirst, dayfirst) + + res.century_specified = ymd.century_specified + res.year = year + res.month = month + res.day = day + + except (IndexError, ValueError): + return None, None + + if not info.validate(res): + return None, None + + if fuzzy_with_tokens: + skipped_tokens = self._recombine_skipped(l, skipped_idxs) + return res, tuple(skipped_tokens) + else: + return res, None + + def _parse_numeric_token(self, tokens, idx, info, ymd, res, fuzzy): + # Token is a number + value_repr = tokens[idx] + try: + value = self._to_decimal(value_repr) + except Exception as e: + six.raise_from(ValueError('Unknown numeric token'), e) + + len_li = len(value_repr) + + len_l = len(tokens) + + if (len(ymd) == 3 and len_li in (2, 4) and + res.hour is None and + (idx + 1 >= len_l or + (tokens[idx + 1] != ':' and + info.hms(tokens[idx + 1]) is None))): + # 19990101T23[59] + s = tokens[idx] + res.hour = int(s[:2]) + + if len_li == 4: + res.minute = int(s[2:]) + + elif len_li == 6 or (len_li > 6 and tokens[idx].find('.') == 6): + # YYMMDD or HHMMSS[.ss] + s = tokens[idx] + + if not ymd and '.' not in tokens[idx]: + ymd.append(s[:2]) + ymd.append(s[2:4]) + ymd.append(s[4:]) + else: + # 19990101T235959[.59] + + # TODO: Check if res attributes already set. + res.hour = int(s[:2]) + res.minute = int(s[2:4]) + res.second, res.microsecond = self._parsems(s[4:]) + + elif len_li in (8, 12, 14): + # YYYYMMDD + s = tokens[idx] + ymd.append(s[:4], 'Y') + ymd.append(s[4:6]) + ymd.append(s[6:8]) + + if len_li > 8: + res.hour = int(s[8:10]) + res.minute = int(s[10:12]) + + if len_li > 12: + res.second = int(s[12:]) + + elif self._find_hms_idx(idx, tokens, info, allow_jump=True) is not None: + # HH[ ]h or MM[ ]m or SS[.ss][ ]s + hms_idx = self._find_hms_idx(idx, tokens, info, allow_jump=True) + (idx, hms) = self._parse_hms(idx, tokens, info, hms_idx) + if hms is not None: + # TODO: checking that hour/minute/second are not + # already set? + self._assign_hms(res, value_repr, hms) + + elif idx + 2 < len_l and tokens[idx + 1] == ':': + # HH:MM[:SS[.ss]] + res.hour = int(value) + value = self._to_decimal(tokens[idx + 2]) # TODO: try/except for this? + (res.minute, res.second) = self._parse_min_sec(value) + + if idx + 4 < len_l and tokens[idx + 3] == ':': + res.second, res.microsecond = self._parsems(tokens[idx + 4]) + + idx += 2 + + idx += 2 + + elif idx + 1 < len_l and tokens[idx + 1] in ('-', '/', '.'): + sep = tokens[idx + 1] + ymd.append(value_repr) + + if idx + 2 < len_l and not info.jump(tokens[idx + 2]): + if tokens[idx + 2].isdigit(): + # 01-01[-01] + ymd.append(tokens[idx + 2]) + else: + # 01-Jan[-01] + value = info.month(tokens[idx + 2]) + + if value is not None: + ymd.append(value, 'M') + else: + raise ValueError() + + if idx + 3 < len_l and tokens[idx + 3] == sep: + # We have three members + value = info.month(tokens[idx + 4]) + + if value is not None: + ymd.append(value, 'M') + else: + ymd.append(tokens[idx + 4]) + idx += 2 + + idx += 1 + idx += 1 + + elif idx + 1 >= len_l or info.jump(tokens[idx + 1]): + if idx + 2 < len_l and info.ampm(tokens[idx + 2]) is not None: + # 12 am + hour = int(value) + res.hour = self._adjust_ampm(hour, info.ampm(tokens[idx + 2])) + idx += 1 + else: + # Year, month or day + ymd.append(value) + idx += 1 + + elif info.ampm(tokens[idx + 1]) is not None and (0 <= value < 24): + # 12am + hour = int(value) + res.hour = self._adjust_ampm(hour, info.ampm(tokens[idx + 1])) + idx += 1 + + elif ymd.could_be_day(value): + ymd.append(value) + + elif not fuzzy: + raise ValueError() + + return idx + + def _find_hms_idx(self, idx, tokens, info, allow_jump): + len_l = len(tokens) + + if idx+1 < len_l and info.hms(tokens[idx+1]) is not None: + # There is an "h", "m", or "s" label following this token. We take + # assign the upcoming label to the current token. + # e.g. the "12" in 12h" + hms_idx = idx + 1 + + elif (allow_jump and idx+2 < len_l and tokens[idx+1] == ' ' and + info.hms(tokens[idx+2]) is not None): + # There is a space and then an "h", "m", or "s" label. + # e.g. the "12" in "12 h" + hms_idx = idx + 2 + + elif idx > 0 and info.hms(tokens[idx-1]) is not None: + # There is a "h", "m", or "s" preceding this token. Since neither + # of the previous cases was hit, there is no label following this + # token, so we use the previous label. + # e.g. the "04" in "12h04" + hms_idx = idx-1 + + elif (1 < idx == len_l-1 and tokens[idx-1] == ' ' and + info.hms(tokens[idx-2]) is not None): + # If we are looking at the final token, we allow for a + # backward-looking check to skip over a space. + # TODO: Are we sure this is the right condition here? + hms_idx = idx - 2 + + else: + hms_idx = None + + return hms_idx + + def _assign_hms(self, res, value_repr, hms): + # See GH issue #427, fixing float rounding + value = self._to_decimal(value_repr) + + if hms == 0: + # Hour + res.hour = int(value) + if value % 1: + res.minute = int(60*(value % 1)) + + elif hms == 1: + (res.minute, res.second) = self._parse_min_sec(value) + + elif hms == 2: + (res.second, res.microsecond) = self._parsems(value_repr) + + def _could_be_tzname(self, hour, tzname, tzoffset, token): + return (hour is not None and + tzname is None and + tzoffset is None and + len(token) <= 5 and + (all(x in string.ascii_uppercase for x in token) + or token in self.info.UTCZONE)) + + def _ampm_valid(self, hour, ampm, fuzzy): + """ + For fuzzy parsing, 'a' or 'am' (both valid English words) + may erroneously trigger the AM/PM flag. Deal with that + here. + """ + val_is_ampm = True + + # If there's already an AM/PM flag, this one isn't one. + if fuzzy and ampm is not None: + val_is_ampm = False + + # If AM/PM is found and hour is not, raise a ValueError + if hour is None: + if fuzzy: + val_is_ampm = False + else: + raise ValueError('No hour specified with AM or PM flag.') + elif not 0 <= hour <= 12: + # If AM/PM is found, it's a 12 hour clock, so raise + # an error for invalid range + if fuzzy: + val_is_ampm = False + else: + raise ValueError('Invalid hour specified for 12-hour clock.') + + return val_is_ampm + + def _adjust_ampm(self, hour, ampm): + if hour < 12 and ampm == 1: + hour += 12 + elif hour == 12 and ampm == 0: + hour = 0 + return hour + + def _parse_min_sec(self, value): + # TODO: Every usage of this function sets res.second to the return + # value. Are there any cases where second will be returned as None and + # we *don't* want to set res.second = None? + minute = int(value) + second = None + + sec_remainder = value % 1 + if sec_remainder: + second = int(60 * sec_remainder) + return (minute, second) + + def _parse_hms(self, idx, tokens, info, hms_idx): + # TODO: Is this going to admit a lot of false-positives for when we + # just happen to have digits and "h", "m" or "s" characters in non-date + # text? I guess hex hashes won't have that problem, but there's plenty + # of random junk out there. + if hms_idx is None: + hms = None + new_idx = idx + elif hms_idx > idx: + hms = info.hms(tokens[hms_idx]) + new_idx = hms_idx + else: + # Looking backwards, increment one. + hms = info.hms(tokens[hms_idx]) + 1 + new_idx = idx + + return (new_idx, hms) + + # ------------------------------------------------------------------ + # Handling for individual tokens. These are kept as methods instead + # of functions for the sake of customizability via subclassing. + + def _parsems(self, value): + """Parse a I[.F] seconds value into (seconds, microseconds).""" + if "." not in value: + return int(value), 0 + else: + i, f = value.split(".") + return int(i), int(f.ljust(6, "0")[:6]) + + def _to_decimal(self, val): + try: + decimal_value = Decimal(val) + # See GH 662, edge case, infinite value should not be converted + # via `_to_decimal` + if not decimal_value.is_finite(): + raise ValueError("Converted decimal value is infinite or NaN") + except Exception as e: + msg = "Could not convert %s to decimal" % val + six.raise_from(ValueError(msg), e) + else: + return decimal_value + + # ------------------------------------------------------------------ + # Post-Parsing construction of datetime output. These are kept as + # methods instead of functions for the sake of customizability via + # subclassing. + + def _build_tzinfo(self, tzinfos, tzname, tzoffset): + if callable(tzinfos): + tzdata = tzinfos(tzname, tzoffset) + else: + tzdata = tzinfos.get(tzname) + # handle case where tzinfo is paased an options that returns None + # eg tzinfos = {'BRST' : None} + if isinstance(tzdata, datetime.tzinfo) or tzdata is None: + tzinfo = tzdata + elif isinstance(tzdata, text_type): + tzinfo = tz.tzstr(tzdata) + elif isinstance(tzdata, integer_types): + tzinfo = tz.tzoffset(tzname, tzdata) + else: + raise TypeError("Offset must be tzinfo subclass, tz string, " + "or int offset.") + return tzinfo + + def _build_tzaware(self, naive, res, tzinfos): + if (callable(tzinfos) or (tzinfos and res.tzname in tzinfos)): + tzinfo = self._build_tzinfo(tzinfos, res.tzname, res.tzoffset) + aware = naive.replace(tzinfo=tzinfo) + aware = self._assign_tzname(aware, res.tzname) + + elif res.tzname and res.tzname in time.tzname: + aware = naive.replace(tzinfo=tz.tzlocal()) + + # Handle ambiguous local datetime + aware = self._assign_tzname(aware, res.tzname) + + # This is mostly relevant for winter GMT zones parsed in the UK + if (aware.tzname() != res.tzname and + res.tzname in self.info.UTCZONE): + aware = aware.replace(tzinfo=tz.UTC) + + elif res.tzoffset == 0: + aware = naive.replace(tzinfo=tz.UTC) + + elif res.tzoffset: + aware = naive.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset)) + + elif not res.tzname and not res.tzoffset: + # i.e. no timezone information was found. + aware = naive + + elif res.tzname: + # tz-like string was parsed but we don't know what to do + # with it + warnings.warn("tzname {tzname} identified but not understood. " + "Pass `tzinfos` argument in order to correctly " + "return a timezone-aware datetime. In a future " + "version, this will raise an " + "exception.".format(tzname=res.tzname), + category=UnknownTimezoneWarning) + aware = naive + + return aware + + def _build_naive(self, res, default): + repl = {} + for attr in ("year", "month", "day", "hour", + "minute", "second", "microsecond"): + value = getattr(res, attr) + if value is not None: + repl[attr] = value + + if 'day' not in repl: + # If the default day exceeds the last day of the month, fall back + # to the end of the month. + cyear = default.year if res.year is None else res.year + cmonth = default.month if res.month is None else res.month + cday = default.day if res.day is None else res.day + + if cday > monthrange(cyear, cmonth)[1]: + repl['day'] = monthrange(cyear, cmonth)[1] + + naive = default.replace(**repl) + + if res.weekday is not None and not res.day: + naive = naive + relativedelta.relativedelta(weekday=res.weekday) + + return naive + + def _assign_tzname(self, dt, tzname): + if dt.tzname() != tzname: + new_dt = tz.enfold(dt, fold=1) + if new_dt.tzname() == tzname: + return new_dt + + return dt + + def _recombine_skipped(self, tokens, skipped_idxs): + """ + >>> tokens = ["foo", " ", "bar", " ", "19June2000", "baz"] + >>> skipped_idxs = [0, 1, 2, 5] + >>> _recombine_skipped(tokens, skipped_idxs) + ["foo bar", "baz"] + """ + skipped_tokens = [] + for i, idx in enumerate(sorted(skipped_idxs)): + if i > 0 and idx - 1 == skipped_idxs[i - 1]: + skipped_tokens[-1] = skipped_tokens[-1] + tokens[idx] + else: + skipped_tokens.append(tokens[idx]) + + return skipped_tokens + + +DEFAULTPARSER = parser() + + +def parse(timestr, parserinfo=None, **kwargs): + """ + + Parse a string in one of the supported formats, using the + ``parserinfo`` parameters. + + :param timestr: + A string containing a date/time stamp. + + :param parserinfo: + A :class:`parserinfo` object containing parameters for the parser. + If ``None``, the default arguments to the :class:`parserinfo` + constructor are used. + + The ``**kwargs`` parameter takes the following keyword arguments: + + :param default: + The default datetime object, if this is a datetime object and not + ``None``, elements specified in ``timestr`` replace elements in the + default object. + + :param ignoretz: + If set ``True``, time zones in parsed strings are ignored and a naive + :class:`datetime` object is returned. + + :param tzinfos: + Additional time zone names / aliases which may be present in the + string. This argument maps time zone names (and optionally offsets + from those time zones) to time zones. This parameter can be a + dictionary with timezone aliases mapping time zone names to time + zones or a function taking two parameters (``tzname`` and + ``tzoffset``) and returning a time zone. + + The timezones to which the names are mapped can be an integer + offset from UTC in seconds or a :class:`tzinfo` object. + + .. doctest:: + :options: +NORMALIZE_WHITESPACE + + >>> from dateutil.parser import parse + >>> from dateutil.tz import gettz + >>> tzinfos = {"BRST": -7200, "CST": gettz("America/Chicago")} + >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -7200)) + >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, + tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) + + This parameter is ignored if ``ignoretz`` is set. + + :param dayfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the day (``True``) or month (``False``). If + ``yearfirst`` is set to ``True``, this distinguishes between YDM and + YMD. If set to ``None``, this value is retrieved from the current + :class:`parserinfo` object (which itself defaults to ``False``). + + :param yearfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the year. If ``True``, the first number is taken to + be the year, otherwise the last number is taken to be the year. If + this is set to ``None``, the value is retrieved from the current + :class:`parserinfo` object (which itself defaults to ``False``). + + :param fuzzy: + Whether to allow fuzzy parsing, allowing for string like "Today is + January 1, 2047 at 8:21:00AM". + + :param fuzzy_with_tokens: + If ``True``, ``fuzzy`` is automatically set to True, and the parser + will return a tuple where the first element is the parsed + :class:`datetime.datetime` datetimestamp and the second element is + a tuple containing the portions of the string which were ignored: + + .. doctest:: + + >>> from dateutil.parser import parse + >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) + (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) + + :return: + Returns a :class:`datetime.datetime` object or, if the + ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the + first element being a :class:`datetime.datetime` object, the second + a tuple containing the fuzzy tokens. + + :raises ParserError: + Raised for invalid or unknown string formats, if the provided + :class:`tzinfo` is not in a valid format, or if an invalid date would + be created. + + :raises OverflowError: + Raised if the parsed date exceeds the largest valid C integer on + your system. + """ + if parserinfo: + return parser(parserinfo).parse(timestr, **kwargs) + else: + return DEFAULTPARSER.parse(timestr, **kwargs) + + +class _tzparser(object): + + class _result(_resultbase): + + __slots__ = ["stdabbr", "stdoffset", "dstabbr", "dstoffset", + "start", "end"] + + class _attr(_resultbase): + __slots__ = ["month", "week", "weekday", + "yday", "jyday", "day", "time"] + + def __repr__(self): + return self._repr("") + + def __init__(self): + _resultbase.__init__(self) + self.start = self._attr() + self.end = self._attr() + + def parse(self, tzstr): + res = self._result() + l = [x for x in re.split(r'([,:.]|[a-zA-Z]+|[0-9]+)',tzstr) if x] + used_idxs = list() + try: + + len_l = len(l) + + i = 0 + while i < len_l: + # BRST+3[BRDT[+2]] + j = i + while j < len_l and not [x for x in l[j] + if x in "0123456789:,-+"]: + j += 1 + if j != i: + if not res.stdabbr: + offattr = "stdoffset" + res.stdabbr = "".join(l[i:j]) + else: + offattr = "dstoffset" + res.dstabbr = "".join(l[i:j]) + + for ii in range(j): + used_idxs.append(ii) + i = j + if (i < len_l and (l[i] in ('+', '-') or l[i][0] in + "0123456789")): + if l[i] in ('+', '-'): + # Yes, that's right. See the TZ variable + # documentation. + signal = (1, -1)[l[i] == '+'] + used_idxs.append(i) + i += 1 + else: + signal = -1 + len_li = len(l[i]) + if len_li == 4: + # -0300 + setattr(res, offattr, (int(l[i][:2]) * 3600 + + int(l[i][2:]) * 60) * signal) + elif i + 1 < len_l and l[i + 1] == ':': + # -03:00 + setattr(res, offattr, + (int(l[i]) * 3600 + + int(l[i + 2]) * 60) * signal) + used_idxs.append(i) + i += 2 + elif len_li <= 2: + # -[0]3 + setattr(res, offattr, + int(l[i][:2]) * 3600 * signal) + else: + return None + used_idxs.append(i) + i += 1 + if res.dstabbr: + break + else: + break + + + if i < len_l: + for j in range(i, len_l): + if l[j] == ';': + l[j] = ',' + + assert l[i] == ',' + + i += 1 + + if i >= len_l: + pass + elif (8 <= l.count(',') <= 9 and + not [y for x in l[i:] if x != ',' + for y in x if y not in "0123456789+-"]): + # GMT0BST,3,0,30,3600,10,0,26,7200[,3600] + for x in (res.start, res.end): + x.month = int(l[i]) + used_idxs.append(i) + i += 2 + if l[i] == '-': + value = int(l[i + 1]) * -1 + used_idxs.append(i) + i += 1 + else: + value = int(l[i]) + used_idxs.append(i) + i += 2 + if value: + x.week = value + x.weekday = (int(l[i]) - 1) % 7 + else: + x.day = int(l[i]) + used_idxs.append(i) + i += 2 + x.time = int(l[i]) + used_idxs.append(i) + i += 2 + if i < len_l: + if l[i] in ('-', '+'): + signal = (-1, 1)[l[i] == "+"] + used_idxs.append(i) + i += 1 + else: + signal = 1 + used_idxs.append(i) + res.dstoffset = (res.stdoffset + int(l[i]) * signal) + + # This was a made-up format that is not in normal use + warn(('Parsed time zone "%s"' % tzstr) + + 'is in a non-standard dateutil-specific format, which ' + + 'is now deprecated; support for parsing this format ' + + 'will be removed in future versions. It is recommended ' + + 'that you switch to a standard format like the GNU ' + + 'TZ variable format.', tz.DeprecatedTzFormatWarning) + elif (l.count(',') == 2 and l[i:].count('/') <= 2 and + not [y for x in l[i:] if x not in (',', '/', 'J', 'M', + '.', '-', ':') + for y in x if y not in "0123456789"]): + for x in (res.start, res.end): + if l[i] == 'J': + # non-leap year day (1 based) + used_idxs.append(i) + i += 1 + x.jyday = int(l[i]) + elif l[i] == 'M': + # month[-.]week[-.]weekday + used_idxs.append(i) + i += 1 + x.month = int(l[i]) + used_idxs.append(i) + i += 1 + assert l[i] in ('-', '.') + used_idxs.append(i) + i += 1 + x.week = int(l[i]) + if x.week == 5: + x.week = -1 + used_idxs.append(i) + i += 1 + assert l[i] in ('-', '.') + used_idxs.append(i) + i += 1 + x.weekday = (int(l[i]) - 1) % 7 + else: + # year day (zero based) + x.yday = int(l[i]) + 1 + + used_idxs.append(i) + i += 1 + + if i < len_l and l[i] == '/': + used_idxs.append(i) + i += 1 + # start time + len_li = len(l[i]) + if len_li == 4: + # -0300 + x.time = (int(l[i][:2]) * 3600 + + int(l[i][2:]) * 60) + elif i + 1 < len_l and l[i + 1] == ':': + # -03:00 + x.time = int(l[i]) * 3600 + int(l[i + 2]) * 60 + used_idxs.append(i) + i += 2 + if i + 1 < len_l and l[i + 1] == ':': + used_idxs.append(i) + i += 2 + x.time += int(l[i]) + elif len_li <= 2: + # -[0]3 + x.time = (int(l[i][:2]) * 3600) + else: + return None + used_idxs.append(i) + i += 1 + + assert i == len_l or l[i] == ',' + + i += 1 + + assert i >= len_l + + except (IndexError, ValueError, AssertionError): + return None + + unused_idxs = set(range(len_l)).difference(used_idxs) + res.any_unused_tokens = not {l[n] for n in unused_idxs}.issubset({",",":"}) + return res + + +DEFAULTTZPARSER = _tzparser() + + +def _parsetz(tzstr): + return DEFAULTTZPARSER.parse(tzstr) + + +class ParserError(ValueError): + """Exception subclass used for any failure to parse a datetime string. + + This is a subclass of :py:exc:`ValueError`, and should be raised any time + earlier versions of ``dateutil`` would have raised ``ValueError``. + + .. versionadded:: 2.8.1 + """ + def __str__(self): + try: + return self.args[0] % self.args[1:] + except (TypeError, IndexError): + return super(ParserError, self).__str__() + + def __repr__(self): + args = ", ".join("'%s'" % arg for arg in self.args) + return "%s(%s)" % (self.__class__.__name__, args) + + +class UnknownTimezoneWarning(RuntimeWarning): + """Raised when the parser finds a timezone it cannot parse into a tzinfo. + + .. versionadded:: 2.7.0 + """ +# vim:ts=4:sw=4:et diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/isoparser.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/isoparser.py new file mode 100644 index 0000000..5d7bee3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/parser/isoparser.py @@ -0,0 +1,416 @@ +# -*- coding: utf-8 -*- +""" +This module offers a parser for ISO-8601 strings + +It is intended to support all valid date, time and datetime formats per the +ISO-8601 specification. + +..versionadded:: 2.7.0 +""" +from datetime import datetime, timedelta, time, date +import calendar +from dateutil import tz + +from functools import wraps + +import re +import six + +__all__ = ["isoparse", "isoparser"] + + +def _takes_ascii(f): + @wraps(f) + def func(self, str_in, *args, **kwargs): + # If it's a stream, read the whole thing + str_in = getattr(str_in, 'read', lambda: str_in)() + + # If it's unicode, turn it into bytes, since ISO-8601 only covers ASCII + if isinstance(str_in, six.text_type): + # ASCII is the same in UTF-8 + try: + str_in = str_in.encode('ascii') + except UnicodeEncodeError as e: + msg = 'ISO-8601 strings should contain only ASCII characters' + six.raise_from(ValueError(msg), e) + + return f(self, str_in, *args, **kwargs) + + return func + + +class isoparser(object): + def __init__(self, sep=None): + """ + :param sep: + A single character that separates date and time portions. If + ``None``, the parser will accept any single character. + For strict ISO-8601 adherence, pass ``'T'``. + """ + if sep is not None: + if (len(sep) != 1 or ord(sep) >= 128 or sep in '0123456789'): + raise ValueError('Separator must be a single, non-numeric ' + + 'ASCII character') + + sep = sep.encode('ascii') + + self._sep = sep + + @_takes_ascii + def isoparse(self, dt_str): + """ + Parse an ISO-8601 datetime string into a :class:`datetime.datetime`. + + An ISO-8601 datetime string consists of a date portion, followed + optionally by a time portion - the date and time portions are separated + by a single character separator, which is ``T`` in the official + standard. Incomplete date formats (such as ``YYYY-MM``) may *not* be + combined with a time portion. + + Supported date formats are: + + Common: + + - ``YYYY`` + - ``YYYY-MM`` or ``YYYYMM`` + - ``YYYY-MM-DD`` or ``YYYYMMDD`` + + Uncommon: + + - ``YYYY-Www`` or ``YYYYWww`` - ISO week (day defaults to 0) + - ``YYYY-Www-D`` or ``YYYYWwwD`` - ISO week and day + + The ISO week and day numbering follows the same logic as + :func:`datetime.date.isocalendar`. + + Supported time formats are: + + - ``hh`` + - ``hh:mm`` or ``hhmm`` + - ``hh:mm:ss`` or ``hhmmss`` + - ``hh:mm:ss.ssssss`` (Up to 6 sub-second digits) + + Midnight is a special case for `hh`, as the standard supports both + 00:00 and 24:00 as a representation. The decimal separator can be + either a dot or a comma. + + + .. caution:: + + Support for fractional components other than seconds is part of the + ISO-8601 standard, but is not currently implemented in this parser. + + Supported time zone offset formats are: + + - `Z` (UTC) + - `±HH:MM` + - `±HHMM` + - `±HH` + + Offsets will be represented as :class:`dateutil.tz.tzoffset` objects, + with the exception of UTC, which will be represented as + :class:`dateutil.tz.tzutc`. Time zone offsets equivalent to UTC (such + as `+00:00`) will also be represented as :class:`dateutil.tz.tzutc`. + + :param dt_str: + A string or stream containing only an ISO-8601 datetime string + + :return: + Returns a :class:`datetime.datetime` representing the string. + Unspecified components default to their lowest value. + + .. warning:: + + As of version 2.7.0, the strictness of the parser should not be + considered a stable part of the contract. Any valid ISO-8601 string + that parses correctly with the default settings will continue to + parse correctly in future versions, but invalid strings that + currently fail (e.g. ``2017-01-01T00:00+00:00:00``) are not + guaranteed to continue failing in future versions if they encode + a valid date. + + .. versionadded:: 2.7.0 + """ + components, pos = self._parse_isodate(dt_str) + + if len(dt_str) > pos: + if self._sep is None or dt_str[pos:pos + 1] == self._sep: + components += self._parse_isotime(dt_str[pos + 1:]) + else: + raise ValueError('String contains unknown ISO components') + + if len(components) > 3 and components[3] == 24: + components[3] = 0 + return datetime(*components) + timedelta(days=1) + + return datetime(*components) + + @_takes_ascii + def parse_isodate(self, datestr): + """ + Parse the date portion of an ISO string. + + :param datestr: + The string portion of an ISO string, without a separator + + :return: + Returns a :class:`datetime.date` object + """ + components, pos = self._parse_isodate(datestr) + if pos < len(datestr): + raise ValueError('String contains unknown ISO ' + + 'components: {!r}'.format(datestr.decode('ascii'))) + return date(*components) + + @_takes_ascii + def parse_isotime(self, timestr): + """ + Parse the time portion of an ISO string. + + :param timestr: + The time portion of an ISO string, without a separator + + :return: + Returns a :class:`datetime.time` object + """ + components = self._parse_isotime(timestr) + if components[0] == 24: + components[0] = 0 + return time(*components) + + @_takes_ascii + def parse_tzstr(self, tzstr, zero_as_utc=True): + """ + Parse a valid ISO time zone string. + + See :func:`isoparser.isoparse` for details on supported formats. + + :param tzstr: + A string representing an ISO time zone offset + + :param zero_as_utc: + Whether to return :class:`dateutil.tz.tzutc` for zero-offset zones + + :return: + Returns :class:`dateutil.tz.tzoffset` for offsets and + :class:`dateutil.tz.tzutc` for ``Z`` and (if ``zero_as_utc`` is + specified) offsets equivalent to UTC. + """ + return self._parse_tzstr(tzstr, zero_as_utc=zero_as_utc) + + # Constants + _DATE_SEP = b'-' + _TIME_SEP = b':' + _FRACTION_REGEX = re.compile(b'[\\.,]([0-9]+)') + + def _parse_isodate(self, dt_str): + try: + return self._parse_isodate_common(dt_str) + except ValueError: + return self._parse_isodate_uncommon(dt_str) + + def _parse_isodate_common(self, dt_str): + len_str = len(dt_str) + components = [1, 1, 1] + + if len_str < 4: + raise ValueError('ISO string too short') + + # Year + components[0] = int(dt_str[0:4]) + pos = 4 + if pos >= len_str: + return components, pos + + has_sep = dt_str[pos:pos + 1] == self._DATE_SEP + if has_sep: + pos += 1 + + # Month + if len_str - pos < 2: + raise ValueError('Invalid common month') + + components[1] = int(dt_str[pos:pos + 2]) + pos += 2 + + if pos >= len_str: + if has_sep: + return components, pos + else: + raise ValueError('Invalid ISO format') + + if has_sep: + if dt_str[pos:pos + 1] != self._DATE_SEP: + raise ValueError('Invalid separator in ISO string') + pos += 1 + + # Day + if len_str - pos < 2: + raise ValueError('Invalid common day') + components[2] = int(dt_str[pos:pos + 2]) + return components, pos + 2 + + def _parse_isodate_uncommon(self, dt_str): + if len(dt_str) < 4: + raise ValueError('ISO string too short') + + # All ISO formats start with the year + year = int(dt_str[0:4]) + + has_sep = dt_str[4:5] == self._DATE_SEP + + pos = 4 + has_sep # Skip '-' if it's there + if dt_str[pos:pos + 1] == b'W': + # YYYY-?Www-?D? + pos += 1 + weekno = int(dt_str[pos:pos + 2]) + pos += 2 + + dayno = 1 + if len(dt_str) > pos: + if (dt_str[pos:pos + 1] == self._DATE_SEP) != has_sep: + raise ValueError('Inconsistent use of dash separator') + + pos += has_sep + + dayno = int(dt_str[pos:pos + 1]) + pos += 1 + + base_date = self._calculate_weekdate(year, weekno, dayno) + else: + # YYYYDDD or YYYY-DDD + if len(dt_str) - pos < 3: + raise ValueError('Invalid ordinal day') + + ordinal_day = int(dt_str[pos:pos + 3]) + pos += 3 + + if ordinal_day < 1 or ordinal_day > (365 + calendar.isleap(year)): + raise ValueError('Invalid ordinal day' + + ' {} for year {}'.format(ordinal_day, year)) + + base_date = date(year, 1, 1) + timedelta(days=ordinal_day - 1) + + components = [base_date.year, base_date.month, base_date.day] + return components, pos + + def _calculate_weekdate(self, year, week, day): + """ + Calculate the day of corresponding to the ISO year-week-day calendar. + + This function is effectively the inverse of + :func:`datetime.date.isocalendar`. + + :param year: + The year in the ISO calendar + + :param week: + The week in the ISO calendar - range is [1, 53] + + :param day: + The day in the ISO calendar - range is [1 (MON), 7 (SUN)] + + :return: + Returns a :class:`datetime.date` + """ + if not 0 < week < 54: + raise ValueError('Invalid week: {}'.format(week)) + + if not 0 < day < 8: # Range is 1-7 + raise ValueError('Invalid weekday: {}'.format(day)) + + # Get week 1 for the specific year: + jan_4 = date(year, 1, 4) # Week 1 always has January 4th in it + week_1 = jan_4 - timedelta(days=jan_4.isocalendar()[2] - 1) + + # Now add the specific number of weeks and days to get what we want + week_offset = (week - 1) * 7 + (day - 1) + return week_1 + timedelta(days=week_offset) + + def _parse_isotime(self, timestr): + len_str = len(timestr) + components = [0, 0, 0, 0, None] + pos = 0 + comp = -1 + + if len_str < 2: + raise ValueError('ISO time too short') + + has_sep = False + + while pos < len_str and comp < 5: + comp += 1 + + if timestr[pos:pos + 1] in b'-+Zz': + # Detect time zone boundary + components[-1] = self._parse_tzstr(timestr[pos:]) + pos = len_str + break + + if comp == 1 and timestr[pos:pos+1] == self._TIME_SEP: + has_sep = True + pos += 1 + elif comp == 2 and has_sep: + if timestr[pos:pos+1] != self._TIME_SEP: + raise ValueError('Inconsistent use of colon separator') + pos += 1 + + if comp < 3: + # Hour, minute, second + components[comp] = int(timestr[pos:pos + 2]) + pos += 2 + + if comp == 3: + # Fraction of a second + frac = self._FRACTION_REGEX.match(timestr[pos:]) + if not frac: + continue + + us_str = frac.group(1)[:6] # Truncate to microseconds + components[comp] = int(us_str) * 10**(6 - len(us_str)) + pos += len(frac.group()) + + if pos < len_str: + raise ValueError('Unused components in ISO string') + + if components[0] == 24: + # Standard supports 00:00 and 24:00 as representations of midnight + if any(component != 0 for component in components[1:4]): + raise ValueError('Hour may only be 24 at 24:00:00.000') + + return components + + def _parse_tzstr(self, tzstr, zero_as_utc=True): + if tzstr == b'Z' or tzstr == b'z': + return tz.UTC + + if len(tzstr) not in {3, 5, 6}: + raise ValueError('Time zone offset must be 1, 3, 5 or 6 characters') + + if tzstr[0:1] == b'-': + mult = -1 + elif tzstr[0:1] == b'+': + mult = 1 + else: + raise ValueError('Time zone offset requires sign') + + hours = int(tzstr[1:3]) + if len(tzstr) == 3: + minutes = 0 + else: + minutes = int(tzstr[(4 if tzstr[3:4] == self._TIME_SEP else 3):]) + + if zero_as_utc and hours == 0 and minutes == 0: + return tz.UTC + else: + if minutes > 59: + raise ValueError('Invalid minutes in time zone offset') + + if hours > 23: + raise ValueError('Invalid hours in time zone offset') + + return tz.tzoffset(None, mult * (hours * 60 + minutes) * 60) + + +DEFAULT_ISOPARSER = isoparser() +isoparse = DEFAULT_ISOPARSER.isoparse diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/relativedelta.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/relativedelta.py new file mode 100644 index 0000000..a9e85f7 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/relativedelta.py @@ -0,0 +1,599 @@ +# -*- coding: utf-8 -*- +import datetime +import calendar + +import operator +from math import copysign + +from six import integer_types +from warnings import warn + +from ._common import weekday + +MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) + +__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + + +class relativedelta(object): + """ + The relativedelta type is designed to be applied to an existing datetime and + can replace specific components of that datetime, or represents an interval + of time. + + It is based on the specification of the excellent work done by M.-A. Lemburg + in his + `mx.DateTime `_ extension. + However, notice that this type does *NOT* implement the same algorithm as + his work. Do *NOT* expect it to behave like mx.DateTime's counterpart. + + There are two different ways to build a relativedelta instance. The + first one is passing it two date/datetime classes:: + + relativedelta(datetime1, datetime2) + + The second one is passing it any number of the following keyword arguments:: + + relativedelta(arg1=x,arg2=y,arg3=z...) + + year, month, day, hour, minute, second, microsecond: + Absolute information (argument is singular); adding or subtracting a + relativedelta with absolute information does not perform an arithmetic + operation, but rather REPLACES the corresponding value in the + original datetime with the value(s) in relativedelta. + + years, months, weeks, days, hours, minutes, seconds, microseconds: + Relative information, may be negative (argument is plural); adding + or subtracting a relativedelta with relative information performs + the corresponding arithmetic operation on the original datetime value + with the information in the relativedelta. + + weekday: + One of the weekday instances (MO, TU, etc) available in the + relativedelta module. These instances may receive a parameter N, + specifying the Nth weekday, which could be positive or negative + (like MO(+1) or MO(-2)). Not specifying it is the same as specifying + +1. You can also use an integer, where 0=MO. This argument is always + relative e.g. if the calculated date is already Monday, using MO(1) + or MO(-1) won't change the day. To effectively make it absolute, use + it in combination with the day argument (e.g. day=1, MO(1) for first + Monday of the month). + + leapdays: + Will add given days to the date found, if year is a leap + year, and the date found is post 28 of february. + + yearday, nlyearday: + Set the yearday or the non-leap year day (jump leap days). + These are converted to day/month/leapdays information. + + There are relative and absolute forms of the keyword + arguments. The plural is relative, and the singular is + absolute. For each argument in the order below, the absolute form + is applied first (by setting each attribute to that value) and + then the relative form (by adding the value to the attribute). + + The order of attributes considered when this relativedelta is + added to a datetime is: + + 1. Year + 2. Month + 3. Day + 4. Hours + 5. Minutes + 6. Seconds + 7. Microseconds + + Finally, weekday is applied, using the rule described above. + + For example + + >>> from datetime import datetime + >>> from dateutil.relativedelta import relativedelta, MO + >>> dt = datetime(2018, 4, 9, 13, 37, 0) + >>> delta = relativedelta(hours=25, day=1, weekday=MO(1)) + >>> dt + delta + datetime.datetime(2018, 4, 2, 14, 37) + + First, the day is set to 1 (the first of the month), then 25 hours + are added, to get to the 2nd day and 14th hour, finally the + weekday is applied, but since the 2nd is already a Monday there is + no effect. + + """ + + def __init__(self, dt1=None, dt2=None, + years=0, months=0, days=0, leapdays=0, weeks=0, + hours=0, minutes=0, seconds=0, microseconds=0, + year=None, month=None, day=None, weekday=None, + yearday=None, nlyearday=None, + hour=None, minute=None, second=None, microsecond=None): + + if dt1 and dt2: + # datetime is a subclass of date. So both must be date + if not (isinstance(dt1, datetime.date) and + isinstance(dt2, datetime.date)): + raise TypeError("relativedelta only diffs datetime/date") + + # We allow two dates, or two datetimes, so we coerce them to be + # of the same type + if (isinstance(dt1, datetime.datetime) != + isinstance(dt2, datetime.datetime)): + if not isinstance(dt1, datetime.datetime): + dt1 = datetime.datetime.fromordinal(dt1.toordinal()) + elif not isinstance(dt2, datetime.datetime): + dt2 = datetime.datetime.fromordinal(dt2.toordinal()) + + self.years = 0 + self.months = 0 + self.days = 0 + self.leapdays = 0 + self.hours = 0 + self.minutes = 0 + self.seconds = 0 + self.microseconds = 0 + self.year = None + self.month = None + self.day = None + self.weekday = None + self.hour = None + self.minute = None + self.second = None + self.microsecond = None + self._has_time = 0 + + # Get year / month delta between the two + months = (dt1.year - dt2.year) * 12 + (dt1.month - dt2.month) + self._set_months(months) + + # Remove the year/month delta so the timedelta is just well-defined + # time units (seconds, days and microseconds) + dtm = self.__radd__(dt2) + + # If we've overshot our target, make an adjustment + if dt1 < dt2: + compare = operator.gt + increment = 1 + else: + compare = operator.lt + increment = -1 + + while compare(dt1, dtm): + months += increment + self._set_months(months) + dtm = self.__radd__(dt2) + + # Get the timedelta between the "months-adjusted" date and dt1 + delta = dt1 - dtm + self.seconds = delta.seconds + delta.days * 86400 + self.microseconds = delta.microseconds + else: + # Check for non-integer values in integer-only quantities + if any(x is not None and x != int(x) for x in (years, months)): + raise ValueError("Non-integer years and months are " + "ambiguous and not currently supported.") + + # Relative information + self.years = int(years) + self.months = int(months) + self.days = days + weeks * 7 + self.leapdays = leapdays + self.hours = hours + self.minutes = minutes + self.seconds = seconds + self.microseconds = microseconds + + # Absolute information + self.year = year + self.month = month + self.day = day + self.hour = hour + self.minute = minute + self.second = second + self.microsecond = microsecond + + if any(x is not None and int(x) != x + for x in (year, month, day, hour, + minute, second, microsecond)): + # For now we'll deprecate floats - later it'll be an error. + warn("Non-integer value passed as absolute information. " + + "This is not a well-defined condition and will raise " + + "errors in future versions.", DeprecationWarning) + + if isinstance(weekday, integer_types): + self.weekday = weekdays[weekday] + else: + self.weekday = weekday + + yday = 0 + if nlyearday: + yday = nlyearday + elif yearday: + yday = yearday + if yearday > 59: + self.leapdays = -1 + if yday: + ydayidx = [31, 59, 90, 120, 151, 181, 212, + 243, 273, 304, 334, 366] + for idx, ydays in enumerate(ydayidx): + if yday <= ydays: + self.month = idx+1 + if idx == 0: + self.day = yday + else: + self.day = yday-ydayidx[idx-1] + break + else: + raise ValueError("invalid year day (%d)" % yday) + + self._fix() + + def _fix(self): + if abs(self.microseconds) > 999999: + s = _sign(self.microseconds) + div, mod = divmod(self.microseconds * s, 1000000) + self.microseconds = mod * s + self.seconds += div * s + if abs(self.seconds) > 59: + s = _sign(self.seconds) + div, mod = divmod(self.seconds * s, 60) + self.seconds = mod * s + self.minutes += div * s + if abs(self.minutes) > 59: + s = _sign(self.minutes) + div, mod = divmod(self.minutes * s, 60) + self.minutes = mod * s + self.hours += div * s + if abs(self.hours) > 23: + s = _sign(self.hours) + div, mod = divmod(self.hours * s, 24) + self.hours = mod * s + self.days += div * s + if abs(self.months) > 11: + s = _sign(self.months) + div, mod = divmod(self.months * s, 12) + self.months = mod * s + self.years += div * s + if (self.hours or self.minutes or self.seconds or self.microseconds + or self.hour is not None or self.minute is not None or + self.second is not None or self.microsecond is not None): + self._has_time = 1 + else: + self._has_time = 0 + + @property + def weeks(self): + return int(self.days / 7.0) + + @weeks.setter + def weeks(self, value): + self.days = self.days - (self.weeks * 7) + value * 7 + + def _set_months(self, months): + self.months = months + if abs(self.months) > 11: + s = _sign(self.months) + div, mod = divmod(self.months * s, 12) + self.months = mod * s + self.years = div * s + else: + self.years = 0 + + def normalized(self): + """ + Return a version of this object represented entirely using integer + values for the relative attributes. + + >>> relativedelta(days=1.5, hours=2).normalized() + relativedelta(days=+1, hours=+14) + + :return: + Returns a :class:`dateutil.relativedelta.relativedelta` object. + """ + # Cascade remainders down (rounding each to roughly nearest microsecond) + days = int(self.days) + + hours_f = round(self.hours + 24 * (self.days - days), 11) + hours = int(hours_f) + + minutes_f = round(self.minutes + 60 * (hours_f - hours), 10) + minutes = int(minutes_f) + + seconds_f = round(self.seconds + 60 * (minutes_f - minutes), 8) + seconds = int(seconds_f) + + microseconds = round(self.microseconds + 1e6 * (seconds_f - seconds)) + + # Constructor carries overflow back up with call to _fix() + return self.__class__(years=self.years, months=self.months, + days=days, hours=hours, minutes=minutes, + seconds=seconds, microseconds=microseconds, + leapdays=self.leapdays, year=self.year, + month=self.month, day=self.day, + weekday=self.weekday, hour=self.hour, + minute=self.minute, second=self.second, + microsecond=self.microsecond) + + def __add__(self, other): + if isinstance(other, relativedelta): + return self.__class__(years=other.years + self.years, + months=other.months + self.months, + days=other.days + self.days, + hours=other.hours + self.hours, + minutes=other.minutes + self.minutes, + seconds=other.seconds + self.seconds, + microseconds=(other.microseconds + + self.microseconds), + leapdays=other.leapdays or self.leapdays, + year=(other.year if other.year is not None + else self.year), + month=(other.month if other.month is not None + else self.month), + day=(other.day if other.day is not None + else self.day), + weekday=(other.weekday if other.weekday is not None + else self.weekday), + hour=(other.hour if other.hour is not None + else self.hour), + minute=(other.minute if other.minute is not None + else self.minute), + second=(other.second if other.second is not None + else self.second), + microsecond=(other.microsecond if other.microsecond + is not None else + self.microsecond)) + if isinstance(other, datetime.timedelta): + return self.__class__(years=self.years, + months=self.months, + days=self.days + other.days, + hours=self.hours, + minutes=self.minutes, + seconds=self.seconds + other.seconds, + microseconds=self.microseconds + other.microseconds, + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + if not isinstance(other, datetime.date): + return NotImplemented + elif self._has_time and not isinstance(other, datetime.datetime): + other = datetime.datetime.fromordinal(other.toordinal()) + year = (self.year or other.year)+self.years + month = self.month or other.month + if self.months: + assert 1 <= abs(self.months) <= 12 + month += self.months + if month > 12: + year += 1 + month -= 12 + elif month < 1: + year -= 1 + month += 12 + day = min(calendar.monthrange(year, month)[1], + self.day or other.day) + repl = {"year": year, "month": month, "day": day} + for attr in ["hour", "minute", "second", "microsecond"]: + value = getattr(self, attr) + if value is not None: + repl[attr] = value + days = self.days + if self.leapdays and month > 2 and calendar.isleap(year): + days += self.leapdays + ret = (other.replace(**repl) + + datetime.timedelta(days=days, + hours=self.hours, + minutes=self.minutes, + seconds=self.seconds, + microseconds=self.microseconds)) + if self.weekday: + weekday, nth = self.weekday.weekday, self.weekday.n or 1 + jumpdays = (abs(nth) - 1) * 7 + if nth > 0: + jumpdays += (7 - ret.weekday() + weekday) % 7 + else: + jumpdays += (ret.weekday() - weekday) % 7 + jumpdays *= -1 + ret += datetime.timedelta(days=jumpdays) + return ret + + def __radd__(self, other): + return self.__add__(other) + + def __rsub__(self, other): + return self.__neg__().__radd__(other) + + def __sub__(self, other): + if not isinstance(other, relativedelta): + return NotImplemented # In case the other object defines __rsub__ + return self.__class__(years=self.years - other.years, + months=self.months - other.months, + days=self.days - other.days, + hours=self.hours - other.hours, + minutes=self.minutes - other.minutes, + seconds=self.seconds - other.seconds, + microseconds=self.microseconds - other.microseconds, + leapdays=self.leapdays or other.leapdays, + year=(self.year if self.year is not None + else other.year), + month=(self.month if self.month is not None else + other.month), + day=(self.day if self.day is not None else + other.day), + weekday=(self.weekday if self.weekday is not None else + other.weekday), + hour=(self.hour if self.hour is not None else + other.hour), + minute=(self.minute if self.minute is not None else + other.minute), + second=(self.second if self.second is not None else + other.second), + microsecond=(self.microsecond if self.microsecond + is not None else + other.microsecond)) + + def __abs__(self): + return self.__class__(years=abs(self.years), + months=abs(self.months), + days=abs(self.days), + hours=abs(self.hours), + minutes=abs(self.minutes), + seconds=abs(self.seconds), + microseconds=abs(self.microseconds), + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + def __neg__(self): + return self.__class__(years=-self.years, + months=-self.months, + days=-self.days, + hours=-self.hours, + minutes=-self.minutes, + seconds=-self.seconds, + microseconds=-self.microseconds, + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + def __bool__(self): + return not (not self.years and + not self.months and + not self.days and + not self.hours and + not self.minutes and + not self.seconds and + not self.microseconds and + not self.leapdays and + self.year is None and + self.month is None and + self.day is None and + self.weekday is None and + self.hour is None and + self.minute is None and + self.second is None and + self.microsecond is None) + # Compatibility with Python 2.x + __nonzero__ = __bool__ + + def __mul__(self, other): + try: + f = float(other) + except TypeError: + return NotImplemented + + return self.__class__(years=int(self.years * f), + months=int(self.months * f), + days=int(self.days * f), + hours=int(self.hours * f), + minutes=int(self.minutes * f), + seconds=int(self.seconds * f), + microseconds=int(self.microseconds * f), + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + __rmul__ = __mul__ + + def __eq__(self, other): + if not isinstance(other, relativedelta): + return NotImplemented + if self.weekday or other.weekday: + if not self.weekday or not other.weekday: + return False + if self.weekday.weekday != other.weekday.weekday: + return False + n1, n2 = self.weekday.n, other.weekday.n + if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)): + return False + return (self.years == other.years and + self.months == other.months and + self.days == other.days and + self.hours == other.hours and + self.minutes == other.minutes and + self.seconds == other.seconds and + self.microseconds == other.microseconds and + self.leapdays == other.leapdays and + self.year == other.year and + self.month == other.month and + self.day == other.day and + self.hour == other.hour and + self.minute == other.minute and + self.second == other.second and + self.microsecond == other.microsecond) + + def __hash__(self): + return hash(( + self.weekday, + self.years, + self.months, + self.days, + self.hours, + self.minutes, + self.seconds, + self.microseconds, + self.leapdays, + self.year, + self.month, + self.day, + self.hour, + self.minute, + self.second, + self.microsecond, + )) + + def __ne__(self, other): + return not self.__eq__(other) + + def __div__(self, other): + try: + reciprocal = 1 / float(other) + except TypeError: + return NotImplemented + + return self.__mul__(reciprocal) + + __truediv__ = __div__ + + def __repr__(self): + l = [] + for attr in ["years", "months", "days", "leapdays", + "hours", "minutes", "seconds", "microseconds"]: + value = getattr(self, attr) + if value: + l.append("{attr}={value:+g}".format(attr=attr, value=value)) + for attr in ["year", "month", "day", "weekday", + "hour", "minute", "second", "microsecond"]: + value = getattr(self, attr) + if value is not None: + l.append("{attr}={value}".format(attr=attr, value=repr(value))) + return "{classname}({attrs})".format(classname=self.__class__.__name__, + attrs=", ".join(l)) + + +def _sign(x): + return int(copysign(1, x)) + +# vim:ts=4:sw=4:et diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/rrule.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/rrule.py new file mode 100644 index 0000000..b320339 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/rrule.py @@ -0,0 +1,1737 @@ +# -*- coding: utf-8 -*- +""" +The rrule module offers a small, complete, and very fast, implementation of +the recurrence rules documented in the +`iCalendar RFC `_, +including support for caching of results. +""" +import calendar +import datetime +import heapq +import itertools +import re +import sys +from functools import wraps +# For warning about deprecation of until and count +from warnings import warn + +from six import advance_iterator, integer_types + +from six.moves import _thread, range + +from ._common import weekday as weekdaybase + +try: + from math import gcd +except ImportError: + from fractions import gcd + +__all__ = ["rrule", "rruleset", "rrulestr", + "YEARLY", "MONTHLY", "WEEKLY", "DAILY", + "HOURLY", "MINUTELY", "SECONDLY", + "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + +# Every mask is 7 days longer to handle cross-year weekly periods. +M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30 + + [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7) +M365MASK = list(M366MASK) +M29, M30, M31 = list(range(1, 30)), list(range(1, 31)), list(range(1, 32)) +MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) +MDAY365MASK = list(MDAY366MASK) +M29, M30, M31 = list(range(-29, 0)), list(range(-30, 0)), list(range(-31, 0)) +NMDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) +NMDAY365MASK = list(NMDAY366MASK) +M366RANGE = (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366) +M365RANGE = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365) +WDAYMASK = [0, 1, 2, 3, 4, 5, 6]*55 +del M29, M30, M31, M365MASK[59], MDAY365MASK[59], NMDAY365MASK[31] +MDAY365MASK = tuple(MDAY365MASK) +M365MASK = tuple(M365MASK) + +FREQNAMES = ['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY'] + +(YEARLY, + MONTHLY, + WEEKLY, + DAILY, + HOURLY, + MINUTELY, + SECONDLY) = list(range(7)) + +# Imported on demand. +easter = None +parser = None + + +class weekday(weekdaybase): + """ + This version of weekday does not allow n = 0. + """ + def __init__(self, wkday, n=None): + if n == 0: + raise ValueError("Can't create weekday with n==0") + + super(weekday, self).__init__(wkday, n) + + +MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) + + +def _invalidates_cache(f): + """ + Decorator for rruleset methods which may invalidate the + cached length. + """ + @wraps(f) + def inner_func(self, *args, **kwargs): + rv = f(self, *args, **kwargs) + self._invalidate_cache() + return rv + + return inner_func + + +class rrulebase(object): + def __init__(self, cache=False): + if cache: + self._cache = [] + self._cache_lock = _thread.allocate_lock() + self._invalidate_cache() + else: + self._cache = None + self._cache_complete = False + self._len = None + + def __iter__(self): + if self._cache_complete: + return iter(self._cache) + elif self._cache is None: + return self._iter() + else: + return self._iter_cached() + + def _invalidate_cache(self): + if self._cache is not None: + self._cache = [] + self._cache_complete = False + self._cache_gen = self._iter() + + if self._cache_lock.locked(): + self._cache_lock.release() + + self._len = None + + def _iter_cached(self): + i = 0 + gen = self._cache_gen + cache = self._cache + acquire = self._cache_lock.acquire + release = self._cache_lock.release + while gen: + if i == len(cache): + acquire() + if self._cache_complete: + break + try: + for j in range(10): + cache.append(advance_iterator(gen)) + except StopIteration: + self._cache_gen = gen = None + self._cache_complete = True + break + release() + yield cache[i] + i += 1 + while i < self._len: + yield cache[i] + i += 1 + + def __getitem__(self, item): + if self._cache_complete: + return self._cache[item] + elif isinstance(item, slice): + if item.step and item.step < 0: + return list(iter(self))[item] + else: + return list(itertools.islice(self, + item.start or 0, + item.stop or sys.maxsize, + item.step or 1)) + elif item >= 0: + gen = iter(self) + try: + for i in range(item+1): + res = advance_iterator(gen) + except StopIteration: + raise IndexError + return res + else: + return list(iter(self))[item] + + def __contains__(self, item): + if self._cache_complete: + return item in self._cache + else: + for i in self: + if i == item: + return True + elif i > item: + return False + return False + + # __len__() introduces a large performance penalty. + def count(self): + """ Returns the number of recurrences in this set. It will have go + trough the whole recurrence, if this hasn't been done before. """ + if self._len is None: + for x in self: + pass + return self._len + + def before(self, dt, inc=False): + """ Returns the last recurrence before the given datetime instance. The + inc keyword defines what happens if dt is an occurrence. With + inc=True, if dt itself is an occurrence, it will be returned. """ + if self._cache_complete: + gen = self._cache + else: + gen = self + last = None + if inc: + for i in gen: + if i > dt: + break + last = i + else: + for i in gen: + if i >= dt: + break + last = i + return last + + def after(self, dt, inc=False): + """ Returns the first recurrence after the given datetime instance. The + inc keyword defines what happens if dt is an occurrence. With + inc=True, if dt itself is an occurrence, it will be returned. """ + if self._cache_complete: + gen = self._cache + else: + gen = self + if inc: + for i in gen: + if i >= dt: + return i + else: + for i in gen: + if i > dt: + return i + return None + + def xafter(self, dt, count=None, inc=False): + """ + Generator which yields up to `count` recurrences after the given + datetime instance, equivalent to `after`. + + :param dt: + The datetime at which to start generating recurrences. + + :param count: + The maximum number of recurrences to generate. If `None` (default), + dates are generated until the recurrence rule is exhausted. + + :param inc: + If `dt` is an instance of the rule and `inc` is `True`, it is + included in the output. + + :yields: Yields a sequence of `datetime` objects. + """ + + if self._cache_complete: + gen = self._cache + else: + gen = self + + # Select the comparison function + if inc: + comp = lambda dc, dtc: dc >= dtc + else: + comp = lambda dc, dtc: dc > dtc + + # Generate dates + n = 0 + for d in gen: + if comp(d, dt): + if count is not None: + n += 1 + if n > count: + break + + yield d + + def between(self, after, before, inc=False, count=1): + """ Returns all the occurrences of the rrule between after and before. + The inc keyword defines what happens if after and/or before are + themselves occurrences. With inc=True, they will be included in the + list, if they are found in the recurrence set. """ + if self._cache_complete: + gen = self._cache + else: + gen = self + started = False + l = [] + if inc: + for i in gen: + if i > before: + break + elif not started: + if i >= after: + started = True + l.append(i) + else: + l.append(i) + else: + for i in gen: + if i >= before: + break + elif not started: + if i > after: + started = True + l.append(i) + else: + l.append(i) + return l + + +class rrule(rrulebase): + """ + That's the base of the rrule operation. It accepts all the keywords + defined in the RFC as its constructor parameters (except byday, + which was renamed to byweekday) and more. The constructor prototype is:: + + rrule(freq) + + Where freq must be one of YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, + or SECONDLY. + + .. note:: + Per RFC section 3.3.10, recurrence instances falling on invalid dates + and times are ignored rather than coerced: + + Recurrence rules may generate recurrence instances with an invalid + date (e.g., February 30) or nonexistent local time (e.g., 1:30 AM + on a day where the local time is moved forward by an hour at 1:00 + AM). Such recurrence instances MUST be ignored and MUST NOT be + counted as part of the recurrence set. + + This can lead to possibly surprising behavior when, for example, the + start date occurs at the end of the month: + + >>> from dateutil.rrule import rrule, MONTHLY + >>> from datetime import datetime + >>> start_date = datetime(2014, 12, 31) + >>> list(rrule(freq=MONTHLY, count=4, dtstart=start_date)) + ... # doctest: +NORMALIZE_WHITESPACE + [datetime.datetime(2014, 12, 31, 0, 0), + datetime.datetime(2015, 1, 31, 0, 0), + datetime.datetime(2015, 3, 31, 0, 0), + datetime.datetime(2015, 5, 31, 0, 0)] + + Additionally, it supports the following keyword arguments: + + :param dtstart: + The recurrence start. Besides being the base for the recurrence, + missing parameters in the final recurrence instances will also be + extracted from this date. If not given, datetime.now() will be used + instead. + :param interval: + The interval between each freq iteration. For example, when using + YEARLY, an interval of 2 means once every two years, but with HOURLY, + it means once every two hours. The default interval is 1. + :param wkst: + The week start day. Must be one of the MO, TU, WE constants, or an + integer, specifying the first day of the week. This will affect + recurrences based on weekly periods. The default week start is got + from calendar.firstweekday(), and may be modified by + calendar.setfirstweekday(). + :param count: + If given, this determines how many occurrences will be generated. + + .. note:: + As of version 2.5.0, the use of the keyword ``until`` in conjunction + with ``count`` is deprecated, to make sure ``dateutil`` is fully + compliant with `RFC-5545 Sec. 3.3.10 `_. Therefore, ``until`` and ``count`` + **must not** occur in the same call to ``rrule``. + :param until: + If given, this must be a datetime instance specifying the upper-bound + limit of the recurrence. The last recurrence in the rule is the greatest + datetime that is less than or equal to the value specified in the + ``until`` parameter. + + .. note:: + As of version 2.5.0, the use of the keyword ``until`` in conjunction + with ``count`` is deprecated, to make sure ``dateutil`` is fully + compliant with `RFC-5545 Sec. 3.3.10 `_. Therefore, ``until`` and ``count`` + **must not** occur in the same call to ``rrule``. + :param bysetpos: + If given, it must be either an integer, or a sequence of integers, + positive or negative. Each given integer will specify an occurrence + number, corresponding to the nth occurrence of the rule inside the + frequency period. For example, a bysetpos of -1 if combined with a + MONTHLY frequency, and a byweekday of (MO, TU, WE, TH, FR), will + result in the last work day of every month. + :param bymonth: + If given, it must be either an integer, or a sequence of integers, + meaning the months to apply the recurrence to. + :param bymonthday: + If given, it must be either an integer, or a sequence of integers, + meaning the month days to apply the recurrence to. + :param byyearday: + If given, it must be either an integer, or a sequence of integers, + meaning the year days to apply the recurrence to. + :param byeaster: + If given, it must be either an integer, or a sequence of integers, + positive or negative. Each integer will define an offset from the + Easter Sunday. Passing the offset 0 to byeaster will yield the Easter + Sunday itself. This is an extension to the RFC specification. + :param byweekno: + If given, it must be either an integer, or a sequence of integers, + meaning the week numbers to apply the recurrence to. Week numbers + have the meaning described in ISO8601, that is, the first week of + the year is that containing at least four days of the new year. + :param byweekday: + If given, it must be either an integer (0 == MO), a sequence of + integers, one of the weekday constants (MO, TU, etc), or a sequence + of these constants. When given, these variables will define the + weekdays where the recurrence will be applied. It's also possible to + use an argument n for the weekday instances, which will mean the nth + occurrence of this weekday in the period. For example, with MONTHLY, + or with YEARLY and BYMONTH, using FR(+1) in byweekday will specify the + first friday of the month where the recurrence happens. Notice that in + the RFC documentation, this is specified as BYDAY, but was renamed to + avoid the ambiguity of that keyword. + :param byhour: + If given, it must be either an integer, or a sequence of integers, + meaning the hours to apply the recurrence to. + :param byminute: + If given, it must be either an integer, or a sequence of integers, + meaning the minutes to apply the recurrence to. + :param bysecond: + If given, it must be either an integer, or a sequence of integers, + meaning the seconds to apply the recurrence to. + :param cache: + If given, it must be a boolean value specifying to enable or disable + caching of results. If you will use the same rrule instance multiple + times, enabling caching will improve the performance considerably. + """ + def __init__(self, freq, dtstart=None, + interval=1, wkst=None, count=None, until=None, bysetpos=None, + bymonth=None, bymonthday=None, byyearday=None, byeaster=None, + byweekno=None, byweekday=None, + byhour=None, byminute=None, bysecond=None, + cache=False): + super(rrule, self).__init__(cache) + global easter + if not dtstart: + if until and until.tzinfo: + dtstart = datetime.datetime.now(tz=until.tzinfo).replace(microsecond=0) + else: + dtstart = datetime.datetime.now().replace(microsecond=0) + elif not isinstance(dtstart, datetime.datetime): + dtstart = datetime.datetime.fromordinal(dtstart.toordinal()) + else: + dtstart = dtstart.replace(microsecond=0) + self._dtstart = dtstart + self._tzinfo = dtstart.tzinfo + self._freq = freq + self._interval = interval + self._count = count + + # Cache the original byxxx rules, if they are provided, as the _byxxx + # attributes do not necessarily map to the inputs, and this can be + # a problem in generating the strings. Only store things if they've + # been supplied (the string retrieval will just use .get()) + self._original_rule = {} + + if until and not isinstance(until, datetime.datetime): + until = datetime.datetime.fromordinal(until.toordinal()) + self._until = until + + if self._dtstart and self._until: + if (self._dtstart.tzinfo is not None) != (self._until.tzinfo is not None): + # According to RFC5545 Section 3.3.10: + # https://tools.ietf.org/html/rfc5545#section-3.3.10 + # + # > If the "DTSTART" property is specified as a date with UTC + # > time or a date with local time and time zone reference, + # > then the UNTIL rule part MUST be specified as a date with + # > UTC time. + raise ValueError( + 'RRULE UNTIL values must be specified in UTC when DTSTART ' + 'is timezone-aware' + ) + + if count is not None and until: + warn("Using both 'count' and 'until' is inconsistent with RFC 5545" + " and has been deprecated in dateutil. Future versions will " + "raise an error.", DeprecationWarning) + + if wkst is None: + self._wkst = calendar.firstweekday() + elif isinstance(wkst, integer_types): + self._wkst = wkst + else: + self._wkst = wkst.weekday + + if bysetpos is None: + self._bysetpos = None + elif isinstance(bysetpos, integer_types): + if bysetpos == 0 or not (-366 <= bysetpos <= 366): + raise ValueError("bysetpos must be between 1 and 366, " + "or between -366 and -1") + self._bysetpos = (bysetpos,) + else: + self._bysetpos = tuple(bysetpos) + for pos in self._bysetpos: + if pos == 0 or not (-366 <= pos <= 366): + raise ValueError("bysetpos must be between 1 and 366, " + "or between -366 and -1") + + if self._bysetpos: + self._original_rule['bysetpos'] = self._bysetpos + + if (byweekno is None and byyearday is None and bymonthday is None and + byweekday is None and byeaster is None): + if freq == YEARLY: + if bymonth is None: + bymonth = dtstart.month + self._original_rule['bymonth'] = None + bymonthday = dtstart.day + self._original_rule['bymonthday'] = None + elif freq == MONTHLY: + bymonthday = dtstart.day + self._original_rule['bymonthday'] = None + elif freq == WEEKLY: + byweekday = dtstart.weekday() + self._original_rule['byweekday'] = None + + # bymonth + if bymonth is None: + self._bymonth = None + else: + if isinstance(bymonth, integer_types): + bymonth = (bymonth,) + + self._bymonth = tuple(sorted(set(bymonth))) + + if 'bymonth' not in self._original_rule: + self._original_rule['bymonth'] = self._bymonth + + # byyearday + if byyearday is None: + self._byyearday = None + else: + if isinstance(byyearday, integer_types): + byyearday = (byyearday,) + + self._byyearday = tuple(sorted(set(byyearday))) + self._original_rule['byyearday'] = self._byyearday + + # byeaster + if byeaster is not None: + if not easter: + from dateutil import easter + if isinstance(byeaster, integer_types): + self._byeaster = (byeaster,) + else: + self._byeaster = tuple(sorted(byeaster)) + + self._original_rule['byeaster'] = self._byeaster + else: + self._byeaster = None + + # bymonthday + if bymonthday is None: + self._bymonthday = () + self._bynmonthday = () + else: + if isinstance(bymonthday, integer_types): + bymonthday = (bymonthday,) + + bymonthday = set(bymonthday) # Ensure it's unique + + self._bymonthday = tuple(sorted(x for x in bymonthday if x > 0)) + self._bynmonthday = tuple(sorted(x for x in bymonthday if x < 0)) + + # Storing positive numbers first, then negative numbers + if 'bymonthday' not in self._original_rule: + self._original_rule['bymonthday'] = tuple( + itertools.chain(self._bymonthday, self._bynmonthday)) + + # byweekno + if byweekno is None: + self._byweekno = None + else: + if isinstance(byweekno, integer_types): + byweekno = (byweekno,) + + self._byweekno = tuple(sorted(set(byweekno))) + + self._original_rule['byweekno'] = self._byweekno + + # byweekday / bynweekday + if byweekday is None: + self._byweekday = None + self._bynweekday = None + else: + # If it's one of the valid non-sequence types, convert to a + # single-element sequence before the iterator that builds the + # byweekday set. + if isinstance(byweekday, integer_types) or hasattr(byweekday, "n"): + byweekday = (byweekday,) + + self._byweekday = set() + self._bynweekday = set() + for wday in byweekday: + if isinstance(wday, integer_types): + self._byweekday.add(wday) + elif not wday.n or freq > MONTHLY: + self._byweekday.add(wday.weekday) + else: + self._bynweekday.add((wday.weekday, wday.n)) + + if not self._byweekday: + self._byweekday = None + elif not self._bynweekday: + self._bynweekday = None + + if self._byweekday is not None: + self._byweekday = tuple(sorted(self._byweekday)) + orig_byweekday = [weekday(x) for x in self._byweekday] + else: + orig_byweekday = () + + if self._bynweekday is not None: + self._bynweekday = tuple(sorted(self._bynweekday)) + orig_bynweekday = [weekday(*x) for x in self._bynweekday] + else: + orig_bynweekday = () + + if 'byweekday' not in self._original_rule: + self._original_rule['byweekday'] = tuple(itertools.chain( + orig_byweekday, orig_bynweekday)) + + # byhour + if byhour is None: + if freq < HOURLY: + self._byhour = {dtstart.hour} + else: + self._byhour = None + else: + if isinstance(byhour, integer_types): + byhour = (byhour,) + + if freq == HOURLY: + self._byhour = self.__construct_byset(start=dtstart.hour, + byxxx=byhour, + base=24) + else: + self._byhour = set(byhour) + + self._byhour = tuple(sorted(self._byhour)) + self._original_rule['byhour'] = self._byhour + + # byminute + if byminute is None: + if freq < MINUTELY: + self._byminute = {dtstart.minute} + else: + self._byminute = None + else: + if isinstance(byminute, integer_types): + byminute = (byminute,) + + if freq == MINUTELY: + self._byminute = self.__construct_byset(start=dtstart.minute, + byxxx=byminute, + base=60) + else: + self._byminute = set(byminute) + + self._byminute = tuple(sorted(self._byminute)) + self._original_rule['byminute'] = self._byminute + + # bysecond + if bysecond is None: + if freq < SECONDLY: + self._bysecond = ((dtstart.second,)) + else: + self._bysecond = None + else: + if isinstance(bysecond, integer_types): + bysecond = (bysecond,) + + self._bysecond = set(bysecond) + + if freq == SECONDLY: + self._bysecond = self.__construct_byset(start=dtstart.second, + byxxx=bysecond, + base=60) + else: + self._bysecond = set(bysecond) + + self._bysecond = tuple(sorted(self._bysecond)) + self._original_rule['bysecond'] = self._bysecond + + if self._freq >= HOURLY: + self._timeset = None + else: + self._timeset = [] + for hour in self._byhour: + for minute in self._byminute: + for second in self._bysecond: + self._timeset.append( + datetime.time(hour, minute, second, + tzinfo=self._tzinfo)) + self._timeset.sort() + self._timeset = tuple(self._timeset) + + def __str__(self): + """ + Output a string that would generate this RRULE if passed to rrulestr. + This is mostly compatible with RFC5545, except for the + dateutil-specific extension BYEASTER. + """ + + output = [] + h, m, s = [None] * 3 + if self._dtstart: + output.append(self._dtstart.strftime('DTSTART:%Y%m%dT%H%M%S')) + h, m, s = self._dtstart.timetuple()[3:6] + + parts = ['FREQ=' + FREQNAMES[self._freq]] + if self._interval != 1: + parts.append('INTERVAL=' + str(self._interval)) + + if self._wkst: + parts.append('WKST=' + repr(weekday(self._wkst))[0:2]) + + if self._count is not None: + parts.append('COUNT=' + str(self._count)) + + if self._until: + parts.append(self._until.strftime('UNTIL=%Y%m%dT%H%M%S')) + + if self._original_rule.get('byweekday') is not None: + # The str() method on weekday objects doesn't generate + # RFC5545-compliant strings, so we should modify that. + original_rule = dict(self._original_rule) + wday_strings = [] + for wday in original_rule['byweekday']: + if wday.n: + wday_strings.append('{n:+d}{wday}'.format( + n=wday.n, + wday=repr(wday)[0:2])) + else: + wday_strings.append(repr(wday)) + + original_rule['byweekday'] = wday_strings + else: + original_rule = self._original_rule + + partfmt = '{name}={vals}' + for name, key in [('BYSETPOS', 'bysetpos'), + ('BYMONTH', 'bymonth'), + ('BYMONTHDAY', 'bymonthday'), + ('BYYEARDAY', 'byyearday'), + ('BYWEEKNO', 'byweekno'), + ('BYDAY', 'byweekday'), + ('BYHOUR', 'byhour'), + ('BYMINUTE', 'byminute'), + ('BYSECOND', 'bysecond'), + ('BYEASTER', 'byeaster')]: + value = original_rule.get(key) + if value: + parts.append(partfmt.format(name=name, vals=(','.join(str(v) + for v in value)))) + + output.append('RRULE:' + ';'.join(parts)) + return '\n'.join(output) + + def replace(self, **kwargs): + """Return new rrule with same attributes except for those attributes given new + values by whichever keyword arguments are specified.""" + new_kwargs = {"interval": self._interval, + "count": self._count, + "dtstart": self._dtstart, + "freq": self._freq, + "until": self._until, + "wkst": self._wkst, + "cache": False if self._cache is None else True } + new_kwargs.update(self._original_rule) + new_kwargs.update(kwargs) + return rrule(**new_kwargs) + + def _iter(self): + year, month, day, hour, minute, second, weekday, yearday, _ = \ + self._dtstart.timetuple() + + # Some local variables to speed things up a bit + freq = self._freq + interval = self._interval + wkst = self._wkst + until = self._until + bymonth = self._bymonth + byweekno = self._byweekno + byyearday = self._byyearday + byweekday = self._byweekday + byeaster = self._byeaster + bymonthday = self._bymonthday + bynmonthday = self._bynmonthday + bysetpos = self._bysetpos + byhour = self._byhour + byminute = self._byminute + bysecond = self._bysecond + + ii = _iterinfo(self) + ii.rebuild(year, month) + + getdayset = {YEARLY: ii.ydayset, + MONTHLY: ii.mdayset, + WEEKLY: ii.wdayset, + DAILY: ii.ddayset, + HOURLY: ii.ddayset, + MINUTELY: ii.ddayset, + SECONDLY: ii.ddayset}[freq] + + if freq < HOURLY: + timeset = self._timeset + else: + gettimeset = {HOURLY: ii.htimeset, + MINUTELY: ii.mtimeset, + SECONDLY: ii.stimeset}[freq] + if ((freq >= HOURLY and + self._byhour and hour not in self._byhour) or + (freq >= MINUTELY and + self._byminute and minute not in self._byminute) or + (freq >= SECONDLY and + self._bysecond and second not in self._bysecond)): + timeset = () + else: + timeset = gettimeset(hour, minute, second) + + total = 0 + count = self._count + while True: + # Get dayset with the right frequency + dayset, start, end = getdayset(year, month, day) + + # Do the "hard" work ;-) + filtered = False + for i in dayset[start:end]: + if ((bymonth and ii.mmask[i] not in bymonth) or + (byweekno and not ii.wnomask[i]) or + (byweekday and ii.wdaymask[i] not in byweekday) or + (ii.nwdaymask and not ii.nwdaymask[i]) or + (byeaster and not ii.eastermask[i]) or + ((bymonthday or bynmonthday) and + ii.mdaymask[i] not in bymonthday and + ii.nmdaymask[i] not in bynmonthday) or + (byyearday and + ((i < ii.yearlen and i+1 not in byyearday and + -ii.yearlen+i not in byyearday) or + (i >= ii.yearlen and i+1-ii.yearlen not in byyearday and + -ii.nextyearlen+i-ii.yearlen not in byyearday)))): + dayset[i] = None + filtered = True + + # Output results + if bysetpos and timeset: + poslist = [] + for pos in bysetpos: + if pos < 0: + daypos, timepos = divmod(pos, len(timeset)) + else: + daypos, timepos = divmod(pos-1, len(timeset)) + try: + i = [x for x in dayset[start:end] + if x is not None][daypos] + time = timeset[timepos] + except IndexError: + pass + else: + date = datetime.date.fromordinal(ii.yearordinal+i) + res = datetime.datetime.combine(date, time) + if res not in poslist: + poslist.append(res) + poslist.sort() + for res in poslist: + if until and res > until: + self._len = total + return + elif res >= self._dtstart: + if count is not None: + count -= 1 + if count < 0: + self._len = total + return + total += 1 + yield res + else: + for i in dayset[start:end]: + if i is not None: + date = datetime.date.fromordinal(ii.yearordinal + i) + for time in timeset: + res = datetime.datetime.combine(date, time) + if until and res > until: + self._len = total + return + elif res >= self._dtstart: + if count is not None: + count -= 1 + if count < 0: + self._len = total + return + + total += 1 + yield res + + # Handle frequency and interval + fixday = False + if freq == YEARLY: + year += interval + if year > datetime.MAXYEAR: + self._len = total + return + ii.rebuild(year, month) + elif freq == MONTHLY: + month += interval + if month > 12: + div, mod = divmod(month, 12) + month = mod + year += div + if month == 0: + month = 12 + year -= 1 + if year > datetime.MAXYEAR: + self._len = total + return + ii.rebuild(year, month) + elif freq == WEEKLY: + if wkst > weekday: + day += -(weekday+1+(6-wkst))+self._interval*7 + else: + day += -(weekday-wkst)+self._interval*7 + weekday = wkst + fixday = True + elif freq == DAILY: + day += interval + fixday = True + elif freq == HOURLY: + if filtered: + # Jump to one iteration before next day + hour += ((23-hour)//interval)*interval + + if byhour: + ndays, hour = self.__mod_distance(value=hour, + byxxx=self._byhour, + base=24) + else: + ndays, hour = divmod(hour+interval, 24) + + if ndays: + day += ndays + fixday = True + + timeset = gettimeset(hour, minute, second) + elif freq == MINUTELY: + if filtered: + # Jump to one iteration before next day + minute += ((1439-(hour*60+minute))//interval)*interval + + valid = False + rep_rate = (24*60) + for j in range(rep_rate // gcd(interval, rep_rate)): + if byminute: + nhours, minute = \ + self.__mod_distance(value=minute, + byxxx=self._byminute, + base=60) + else: + nhours, minute = divmod(minute+interval, 60) + + div, hour = divmod(hour+nhours, 24) + if div: + day += div + fixday = True + filtered = False + + if not byhour or hour in byhour: + valid = True + break + + if not valid: + raise ValueError('Invalid combination of interval and ' + + 'byhour resulting in empty rule.') + + timeset = gettimeset(hour, minute, second) + elif freq == SECONDLY: + if filtered: + # Jump to one iteration before next day + second += (((86399 - (hour * 3600 + minute * 60 + second)) + // interval) * interval) + + rep_rate = (24 * 3600) + valid = False + for j in range(0, rep_rate // gcd(interval, rep_rate)): + if bysecond: + nminutes, second = \ + self.__mod_distance(value=second, + byxxx=self._bysecond, + base=60) + else: + nminutes, second = divmod(second+interval, 60) + + div, minute = divmod(minute+nminutes, 60) + if div: + hour += div + div, hour = divmod(hour, 24) + if div: + day += div + fixday = True + + if ((not byhour or hour in byhour) and + (not byminute or minute in byminute) and + (not bysecond or second in bysecond)): + valid = True + break + + if not valid: + raise ValueError('Invalid combination of interval, ' + + 'byhour and byminute resulting in empty' + + ' rule.') + + timeset = gettimeset(hour, minute, second) + + if fixday and day > 28: + daysinmonth = calendar.monthrange(year, month)[1] + if day > daysinmonth: + while day > daysinmonth: + day -= daysinmonth + month += 1 + if month == 13: + month = 1 + year += 1 + if year > datetime.MAXYEAR: + self._len = total + return + daysinmonth = calendar.monthrange(year, month)[1] + ii.rebuild(year, month) + + def __construct_byset(self, start, byxxx, base): + """ + If a `BYXXX` sequence is passed to the constructor at the same level as + `FREQ` (e.g. `FREQ=HOURLY,BYHOUR={2,4,7},INTERVAL=3`), there are some + specifications which cannot be reached given some starting conditions. + + This occurs whenever the interval is not coprime with the base of a + given unit and the difference between the starting position and the + ending position is not coprime with the greatest common denominator + between the interval and the base. For example, with a FREQ of hourly + starting at 17:00 and an interval of 4, the only valid values for + BYHOUR would be {21, 1, 5, 9, 13, 17}, because 4 and 24 are not + coprime. + + :param start: + Specifies the starting position. + :param byxxx: + An iterable containing the list of allowed values. + :param base: + The largest allowable value for the specified frequency (e.g. + 24 hours, 60 minutes). + + This does not preserve the type of the iterable, returning a set, since + the values should be unique and the order is irrelevant, this will + speed up later lookups. + + In the event of an empty set, raises a :exception:`ValueError`, as this + results in an empty rrule. + """ + + cset = set() + + # Support a single byxxx value. + if isinstance(byxxx, integer_types): + byxxx = (byxxx, ) + + for num in byxxx: + i_gcd = gcd(self._interval, base) + # Use divmod rather than % because we need to wrap negative nums. + if i_gcd == 1 or divmod(num - start, i_gcd)[1] == 0: + cset.add(num) + + if len(cset) == 0: + raise ValueError("Invalid rrule byxxx generates an empty set.") + + return cset + + def __mod_distance(self, value, byxxx, base): + """ + Calculates the next value in a sequence where the `FREQ` parameter is + specified along with a `BYXXX` parameter at the same "level" + (e.g. `HOURLY` specified with `BYHOUR`). + + :param value: + The old value of the component. + :param byxxx: + The `BYXXX` set, which should have been generated by + `rrule._construct_byset`, or something else which checks that a + valid rule is present. + :param base: + The largest allowable value for the specified frequency (e.g. + 24 hours, 60 minutes). + + If a valid value is not found after `base` iterations (the maximum + number before the sequence would start to repeat), this raises a + :exception:`ValueError`, as no valid values were found. + + This returns a tuple of `divmod(n*interval, base)`, where `n` is the + smallest number of `interval` repetitions until the next specified + value in `byxxx` is found. + """ + accumulator = 0 + for ii in range(1, base + 1): + # Using divmod() over % to account for negative intervals + div, value = divmod(value + self._interval, base) + accumulator += div + if value in byxxx: + return (accumulator, value) + + +class _iterinfo(object): + __slots__ = ["rrule", "lastyear", "lastmonth", + "yearlen", "nextyearlen", "yearordinal", "yearweekday", + "mmask", "mrange", "mdaymask", "nmdaymask", + "wdaymask", "wnomask", "nwdaymask", "eastermask"] + + def __init__(self, rrule): + for attr in self.__slots__: + setattr(self, attr, None) + self.rrule = rrule + + def rebuild(self, year, month): + # Every mask is 7 days longer to handle cross-year weekly periods. + rr = self.rrule + if year != self.lastyear: + self.yearlen = 365 + calendar.isleap(year) + self.nextyearlen = 365 + calendar.isleap(year + 1) + firstyday = datetime.date(year, 1, 1) + self.yearordinal = firstyday.toordinal() + self.yearweekday = firstyday.weekday() + + wday = datetime.date(year, 1, 1).weekday() + if self.yearlen == 365: + self.mmask = M365MASK + self.mdaymask = MDAY365MASK + self.nmdaymask = NMDAY365MASK + self.wdaymask = WDAYMASK[wday:] + self.mrange = M365RANGE + else: + self.mmask = M366MASK + self.mdaymask = MDAY366MASK + self.nmdaymask = NMDAY366MASK + self.wdaymask = WDAYMASK[wday:] + self.mrange = M366RANGE + + if not rr._byweekno: + self.wnomask = None + else: + self.wnomask = [0]*(self.yearlen+7) + # no1wkst = firstwkst = self.wdaymask.index(rr._wkst) + no1wkst = firstwkst = (7-self.yearweekday+rr._wkst) % 7 + if no1wkst >= 4: + no1wkst = 0 + # Number of days in the year, plus the days we got + # from last year. + wyearlen = self.yearlen+(self.yearweekday-rr._wkst) % 7 + else: + # Number of days in the year, minus the days we + # left in last year. + wyearlen = self.yearlen-no1wkst + div, mod = divmod(wyearlen, 7) + numweeks = div+mod//4 + for n in rr._byweekno: + if n < 0: + n += numweeks+1 + if not (0 < n <= numweeks): + continue + if n > 1: + i = no1wkst+(n-1)*7 + if no1wkst != firstwkst: + i -= 7-firstwkst + else: + i = no1wkst + for j in range(7): + self.wnomask[i] = 1 + i += 1 + if self.wdaymask[i] == rr._wkst: + break + if 1 in rr._byweekno: + # Check week number 1 of next year as well + # TODO: Check -numweeks for next year. + i = no1wkst+numweeks*7 + if no1wkst != firstwkst: + i -= 7-firstwkst + if i < self.yearlen: + # If week starts in next year, we + # don't care about it. + for j in range(7): + self.wnomask[i] = 1 + i += 1 + if self.wdaymask[i] == rr._wkst: + break + if no1wkst: + # Check last week number of last year as + # well. If no1wkst is 0, either the year + # started on week start, or week number 1 + # got days from last year, so there are no + # days from last year's last week number in + # this year. + if -1 not in rr._byweekno: + lyearweekday = datetime.date(year-1, 1, 1).weekday() + lno1wkst = (7-lyearweekday+rr._wkst) % 7 + lyearlen = 365+calendar.isleap(year-1) + if lno1wkst >= 4: + lno1wkst = 0 + lnumweeks = 52+(lyearlen + + (lyearweekday-rr._wkst) % 7) % 7//4 + else: + lnumweeks = 52+(self.yearlen-no1wkst) % 7//4 + else: + lnumweeks = -1 + if lnumweeks in rr._byweekno: + for i in range(no1wkst): + self.wnomask[i] = 1 + + if (rr._bynweekday and (month != self.lastmonth or + year != self.lastyear)): + ranges = [] + if rr._freq == YEARLY: + if rr._bymonth: + for month in rr._bymonth: + ranges.append(self.mrange[month-1:month+1]) + else: + ranges = [(0, self.yearlen)] + elif rr._freq == MONTHLY: + ranges = [self.mrange[month-1:month+1]] + if ranges: + # Weekly frequency won't get here, so we may not + # care about cross-year weekly periods. + self.nwdaymask = [0]*self.yearlen + for first, last in ranges: + last -= 1 + for wday, n in rr._bynweekday: + if n < 0: + i = last+(n+1)*7 + i -= (self.wdaymask[i]-wday) % 7 + else: + i = first+(n-1)*7 + i += (7-self.wdaymask[i]+wday) % 7 + if first <= i <= last: + self.nwdaymask[i] = 1 + + if rr._byeaster: + self.eastermask = [0]*(self.yearlen+7) + eyday = easter.easter(year).toordinal()-self.yearordinal + for offset in rr._byeaster: + self.eastermask[eyday+offset] = 1 + + self.lastyear = year + self.lastmonth = month + + def ydayset(self, year, month, day): + return list(range(self.yearlen)), 0, self.yearlen + + def mdayset(self, year, month, day): + dset = [None]*self.yearlen + start, end = self.mrange[month-1:month+1] + for i in range(start, end): + dset[i] = i + return dset, start, end + + def wdayset(self, year, month, day): + # We need to handle cross-year weeks here. + dset = [None]*(self.yearlen+7) + i = datetime.date(year, month, day).toordinal()-self.yearordinal + start = i + for j in range(7): + dset[i] = i + i += 1 + # if (not (0 <= i < self.yearlen) or + # self.wdaymask[i] == self.rrule._wkst): + # This will cross the year boundary, if necessary. + if self.wdaymask[i] == self.rrule._wkst: + break + return dset, start, i + + def ddayset(self, year, month, day): + dset = [None] * self.yearlen + i = datetime.date(year, month, day).toordinal() - self.yearordinal + dset[i] = i + return dset, i, i + 1 + + def htimeset(self, hour, minute, second): + tset = [] + rr = self.rrule + for minute in rr._byminute: + for second in rr._bysecond: + tset.append(datetime.time(hour, minute, second, + tzinfo=rr._tzinfo)) + tset.sort() + return tset + + def mtimeset(self, hour, minute, second): + tset = [] + rr = self.rrule + for second in rr._bysecond: + tset.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) + tset.sort() + return tset + + def stimeset(self, hour, minute, second): + return (datetime.time(hour, minute, second, + tzinfo=self.rrule._tzinfo),) + + +class rruleset(rrulebase): + """ The rruleset type allows more complex recurrence setups, mixing + multiple rules, dates, exclusion rules, and exclusion dates. The type + constructor takes the following keyword arguments: + + :param cache: If True, caching of results will be enabled, improving + performance of multiple queries considerably. """ + + class _genitem(object): + def __init__(self, genlist, gen): + try: + self.dt = advance_iterator(gen) + genlist.append(self) + except StopIteration: + pass + self.genlist = genlist + self.gen = gen + + def __next__(self): + try: + self.dt = advance_iterator(self.gen) + except StopIteration: + if self.genlist[0] is self: + heapq.heappop(self.genlist) + else: + self.genlist.remove(self) + heapq.heapify(self.genlist) + + next = __next__ + + def __lt__(self, other): + return self.dt < other.dt + + def __gt__(self, other): + return self.dt > other.dt + + def __eq__(self, other): + return self.dt == other.dt + + def __ne__(self, other): + return self.dt != other.dt + + def __init__(self, cache=False): + super(rruleset, self).__init__(cache) + self._rrule = [] + self._rdate = [] + self._exrule = [] + self._exdate = [] + + @_invalidates_cache + def rrule(self, rrule): + """ Include the given :py:class:`rrule` instance in the recurrence set + generation. """ + self._rrule.append(rrule) + + @_invalidates_cache + def rdate(self, rdate): + """ Include the given :py:class:`datetime` instance in the recurrence + set generation. """ + self._rdate.append(rdate) + + @_invalidates_cache + def exrule(self, exrule): + """ Include the given rrule instance in the recurrence set exclusion + list. Dates which are part of the given recurrence rules will not + be generated, even if some inclusive rrule or rdate matches them. + """ + self._exrule.append(exrule) + + @_invalidates_cache + def exdate(self, exdate): + """ Include the given datetime instance in the recurrence set + exclusion list. Dates included that way will not be generated, + even if some inclusive rrule or rdate matches them. """ + self._exdate.append(exdate) + + def _iter(self): + rlist = [] + self._rdate.sort() + self._genitem(rlist, iter(self._rdate)) + for gen in [iter(x) for x in self._rrule]: + self._genitem(rlist, gen) + exlist = [] + self._exdate.sort() + self._genitem(exlist, iter(self._exdate)) + for gen in [iter(x) for x in self._exrule]: + self._genitem(exlist, gen) + lastdt = None + total = 0 + heapq.heapify(rlist) + heapq.heapify(exlist) + while rlist: + ritem = rlist[0] + if not lastdt or lastdt != ritem.dt: + while exlist and exlist[0] < ritem: + exitem = exlist[0] + advance_iterator(exitem) + if exlist and exlist[0] is exitem: + heapq.heapreplace(exlist, exitem) + if not exlist or ritem != exlist[0]: + total += 1 + yield ritem.dt + lastdt = ritem.dt + advance_iterator(ritem) + if rlist and rlist[0] is ritem: + heapq.heapreplace(rlist, ritem) + self._len = total + + + + +class _rrulestr(object): + """ Parses a string representation of a recurrence rule or set of + recurrence rules. + + :param s: + Required, a string defining one or more recurrence rules. + + :param dtstart: + If given, used as the default recurrence start if not specified in the + rule string. + + :param cache: + If set ``True`` caching of results will be enabled, improving + performance of multiple queries considerably. + + :param unfold: + If set ``True`` indicates that a rule string is split over more + than one line and should be joined before processing. + + :param forceset: + If set ``True`` forces a :class:`dateutil.rrule.rruleset` to + be returned. + + :param compatible: + If set ``True`` forces ``unfold`` and ``forceset`` to be ``True``. + + :param ignoretz: + If set ``True``, time zones in parsed strings are ignored and a naive + :class:`datetime.datetime` object is returned. + + :param tzids: + If given, a callable or mapping used to retrieve a + :class:`datetime.tzinfo` from a string representation. + Defaults to :func:`dateutil.tz.gettz`. + + :param tzinfos: + Additional time zone names / aliases which may be present in a string + representation. See :func:`dateutil.parser.parse` for more + information. + + :return: + Returns a :class:`dateutil.rrule.rruleset` or + :class:`dateutil.rrule.rrule` + """ + + _freq_map = {"YEARLY": YEARLY, + "MONTHLY": MONTHLY, + "WEEKLY": WEEKLY, + "DAILY": DAILY, + "HOURLY": HOURLY, + "MINUTELY": MINUTELY, + "SECONDLY": SECONDLY} + + _weekday_map = {"MO": 0, "TU": 1, "WE": 2, "TH": 3, + "FR": 4, "SA": 5, "SU": 6} + + def _handle_int(self, rrkwargs, name, value, **kwargs): + rrkwargs[name.lower()] = int(value) + + def _handle_int_list(self, rrkwargs, name, value, **kwargs): + rrkwargs[name.lower()] = [int(x) for x in value.split(',')] + + _handle_INTERVAL = _handle_int + _handle_COUNT = _handle_int + _handle_BYSETPOS = _handle_int_list + _handle_BYMONTH = _handle_int_list + _handle_BYMONTHDAY = _handle_int_list + _handle_BYYEARDAY = _handle_int_list + _handle_BYEASTER = _handle_int_list + _handle_BYWEEKNO = _handle_int_list + _handle_BYHOUR = _handle_int_list + _handle_BYMINUTE = _handle_int_list + _handle_BYSECOND = _handle_int_list + + def _handle_FREQ(self, rrkwargs, name, value, **kwargs): + rrkwargs["freq"] = self._freq_map[value] + + def _handle_UNTIL(self, rrkwargs, name, value, **kwargs): + global parser + if not parser: + from dateutil import parser + try: + rrkwargs["until"] = parser.parse(value, + ignoretz=kwargs.get("ignoretz"), + tzinfos=kwargs.get("tzinfos")) + except ValueError: + raise ValueError("invalid until date") + + def _handle_WKST(self, rrkwargs, name, value, **kwargs): + rrkwargs["wkst"] = self._weekday_map[value] + + def _handle_BYWEEKDAY(self, rrkwargs, name, value, **kwargs): + """ + Two ways to specify this: +1MO or MO(+1) + """ + l = [] + for wday in value.split(','): + if '(' in wday: + # If it's of the form TH(+1), etc. + splt = wday.split('(') + w = splt[0] + n = int(splt[1][:-1]) + elif len(wday): + # If it's of the form +1MO + for i in range(len(wday)): + if wday[i] not in '+-0123456789': + break + n = wday[:i] or None + w = wday[i:] + if n: + n = int(n) + else: + raise ValueError("Invalid (empty) BYDAY specification.") + + l.append(weekdays[self._weekday_map[w]](n)) + rrkwargs["byweekday"] = l + + _handle_BYDAY = _handle_BYWEEKDAY + + def _parse_rfc_rrule(self, line, + dtstart=None, + cache=False, + ignoretz=False, + tzinfos=None): + if line.find(':') != -1: + name, value = line.split(':') + if name != "RRULE": + raise ValueError("unknown parameter name") + else: + value = line + rrkwargs = {} + for pair in value.split(';'): + name, value = pair.split('=') + name = name.upper() + value = value.upper() + try: + getattr(self, "_handle_"+name)(rrkwargs, name, value, + ignoretz=ignoretz, + tzinfos=tzinfos) + except AttributeError: + raise ValueError("unknown parameter '%s'" % name) + except (KeyError, ValueError): + raise ValueError("invalid '%s': %s" % (name, value)) + return rrule(dtstart=dtstart, cache=cache, **rrkwargs) + + def _parse_date_value(self, date_value, parms, rule_tzids, + ignoretz, tzids, tzinfos): + global parser + if not parser: + from dateutil import parser + + datevals = [] + value_found = False + TZID = None + + for parm in parms: + if parm.startswith("TZID="): + try: + tzkey = rule_tzids[parm.split('TZID=')[-1]] + except KeyError: + continue + if tzids is None: + from . import tz + tzlookup = tz.gettz + elif callable(tzids): + tzlookup = tzids + else: + tzlookup = getattr(tzids, 'get', None) + if tzlookup is None: + msg = ('tzids must be a callable, mapping, or None, ' + 'not %s' % tzids) + raise ValueError(msg) + + TZID = tzlookup(tzkey) + continue + + # RFC 5445 3.8.2.4: The VALUE parameter is optional, but may be found + # only once. + if parm not in {"VALUE=DATE-TIME", "VALUE=DATE"}: + raise ValueError("unsupported parm: " + parm) + else: + if value_found: + msg = ("Duplicate value parameter found in: " + parm) + raise ValueError(msg) + value_found = True + + for datestr in date_value.split(','): + date = parser.parse(datestr, ignoretz=ignoretz, tzinfos=tzinfos) + if TZID is not None: + if date.tzinfo is None: + date = date.replace(tzinfo=TZID) + else: + raise ValueError('DTSTART/EXDATE specifies multiple timezone') + datevals.append(date) + + return datevals + + def _parse_rfc(self, s, + dtstart=None, + cache=False, + unfold=False, + forceset=False, + compatible=False, + ignoretz=False, + tzids=None, + tzinfos=None): + global parser + if compatible: + forceset = True + unfold = True + + TZID_NAMES = dict(map( + lambda x: (x.upper(), x), + re.findall('TZID=(?P[^:]+):', s) + )) + s = s.upper() + if not s.strip(): + raise ValueError("empty string") + if unfold: + lines = s.splitlines() + i = 0 + while i < len(lines): + line = lines[i].rstrip() + if not line: + del lines[i] + elif i > 0 and line[0] == " ": + lines[i-1] += line[1:] + del lines[i] + else: + i += 1 + else: + lines = s.split() + if (not forceset and len(lines) == 1 and (s.find(':') == -1 or + s.startswith('RRULE:'))): + return self._parse_rfc_rrule(lines[0], cache=cache, + dtstart=dtstart, ignoretz=ignoretz, + tzinfos=tzinfos) + else: + rrulevals = [] + rdatevals = [] + exrulevals = [] + exdatevals = [] + for line in lines: + if not line: + continue + if line.find(':') == -1: + name = "RRULE" + value = line + else: + name, value = line.split(':', 1) + parms = name.split(';') + if not parms: + raise ValueError("empty property name") + name = parms[0] + parms = parms[1:] + if name == "RRULE": + for parm in parms: + raise ValueError("unsupported RRULE parm: "+parm) + rrulevals.append(value) + elif name == "RDATE": + for parm in parms: + if parm != "VALUE=DATE-TIME": + raise ValueError("unsupported RDATE parm: "+parm) + rdatevals.append(value) + elif name == "EXRULE": + for parm in parms: + raise ValueError("unsupported EXRULE parm: "+parm) + exrulevals.append(value) + elif name == "EXDATE": + exdatevals.extend( + self._parse_date_value(value, parms, + TZID_NAMES, ignoretz, + tzids, tzinfos) + ) + elif name == "DTSTART": + dtvals = self._parse_date_value(value, parms, TZID_NAMES, + ignoretz, tzids, tzinfos) + if len(dtvals) != 1: + raise ValueError("Multiple DTSTART values specified:" + + value) + dtstart = dtvals[0] + else: + raise ValueError("unsupported property: "+name) + if (forceset or len(rrulevals) > 1 or rdatevals + or exrulevals or exdatevals): + if not parser and (rdatevals or exdatevals): + from dateutil import parser + rset = rruleset(cache=cache) + for value in rrulevals: + rset.rrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in rdatevals: + for datestr in value.split(','): + rset.rdate(parser.parse(datestr, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exrulevals: + rset.exrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exdatevals: + rset.exdate(value) + if compatible and dtstart: + rset.rdate(dtstart) + return rset + else: + return self._parse_rfc_rrule(rrulevals[0], + dtstart=dtstart, + cache=cache, + ignoretz=ignoretz, + tzinfos=tzinfos) + + def __call__(self, s, **kwargs): + return self._parse_rfc(s, **kwargs) + + +rrulestr = _rrulestr() + +# vim:ts=4:sw=4:et diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__init__.py new file mode 100644 index 0000000..af1352c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__init__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +from .tz import * +from .tz import __doc__ + +__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange", + "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz", + "enfold", "datetime_ambiguous", "datetime_exists", + "resolve_imaginary", "UTC", "DeprecatedTzFormatWarning"] + + +class DeprecatedTzFormatWarning(Warning): + """Warning raised when time zones are parsed from deprecated formats.""" diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..314c02559873b2fb89a20de0b5e4e9ae8126b54c GIT binary patch literal 635 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__pycache__/tz.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/__pycache__/tz.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fd30743053a043e59336ae1585a5869b3b2f94d GIT binary patch literal 44895 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 jv{I-e3Gv}Ah*Oi<W;#)%xdJD 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/_common.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/_common.py new file mode 100644 index 0000000..e6ac118 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/_common.py @@ -0,0 +1,419 @@ +from six import PY2 + +from functools import wraps + +from datetime import datetime, timedelta, tzinfo + + +ZERO = timedelta(0) + +__all__ = ['tzname_in_python2', 'enfold'] + + +def tzname_in_python2(namefunc): + """Change unicode output into bytestrings in Python 2 + + tzname() API changed in Python 3. It used to return bytes, but was changed + to unicode strings + """ + if PY2: + @wraps(namefunc) + def adjust_encoding(*args, **kwargs): + name = namefunc(*args, **kwargs) + if name is not None: + name = name.encode() + + return name + + return adjust_encoding + else: + return namefunc + + +# The following is adapted from Alexander Belopolsky's tz library +# https://github.com/abalkin/tz +if hasattr(datetime, 'fold'): + # This is the pre-python 3.6 fold situation + def enfold(dt, fold=1): + """ + Provides a unified interface for assigning the ``fold`` attribute to + datetimes both before and after the implementation of PEP-495. + + :param fold: + The value for the ``fold`` attribute in the returned datetime. This + should be either 0 or 1. + + :return: + Returns an object for which ``getattr(dt, 'fold', 0)`` returns + ``fold`` for all versions of Python. In versions prior to + Python 3.6, this is a ``_DatetimeWithFold`` object, which is a + subclass of :py:class:`datetime.datetime` with the ``fold`` + attribute added, if ``fold`` is 1. + + .. versionadded:: 2.6.0 + """ + return dt.replace(fold=fold) + +else: + class _DatetimeWithFold(datetime): + """ + This is a class designed to provide a PEP 495-compliant interface for + Python versions before 3.6. It is used only for dates in a fold, so + the ``fold`` attribute is fixed at ``1``. + + .. versionadded:: 2.6.0 + """ + __slots__ = () + + def replace(self, *args, **kwargs): + """ + Return a datetime with the same attributes, except for those + attributes given new values by whichever keyword arguments are + specified. Note that tzinfo=None can be specified to create a naive + datetime from an aware datetime with no conversion of date and time + data. + + This is reimplemented in ``_DatetimeWithFold`` because pypy3 will + return a ``datetime.datetime`` even if ``fold`` is unchanged. + """ + argnames = ( + 'year', 'month', 'day', 'hour', 'minute', 'second', + 'microsecond', 'tzinfo' + ) + + for arg, argname in zip(args, argnames): + if argname in kwargs: + raise TypeError('Duplicate argument: {}'.format(argname)) + + kwargs[argname] = arg + + for argname in argnames: + if argname not in kwargs: + kwargs[argname] = getattr(self, argname) + + dt_class = self.__class__ if kwargs.get('fold', 1) else datetime + + return dt_class(**kwargs) + + @property + def fold(self): + return 1 + + def enfold(dt, fold=1): + """ + Provides a unified interface for assigning the ``fold`` attribute to + datetimes both before and after the implementation of PEP-495. + + :param fold: + The value for the ``fold`` attribute in the returned datetime. This + should be either 0 or 1. + + :return: + Returns an object for which ``getattr(dt, 'fold', 0)`` returns + ``fold`` for all versions of Python. In versions prior to + Python 3.6, this is a ``_DatetimeWithFold`` object, which is a + subclass of :py:class:`datetime.datetime` with the ``fold`` + attribute added, if ``fold`` is 1. + + .. versionadded:: 2.6.0 + """ + if getattr(dt, 'fold', 0) == fold: + return dt + + args = dt.timetuple()[:6] + args += (dt.microsecond, dt.tzinfo) + + if fold: + return _DatetimeWithFold(*args) + else: + return datetime(*args) + + +def _validate_fromutc_inputs(f): + """ + The CPython version of ``fromutc`` checks that the input is a ``datetime`` + object and that ``self`` is attached as its ``tzinfo``. + """ + @wraps(f) + def fromutc(self, dt): + if not isinstance(dt, datetime): + raise TypeError("fromutc() requires a datetime argument") + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + return f(self, dt) + + return fromutc + + +class _tzinfo(tzinfo): + """ + Base class for all ``dateutil`` ``tzinfo`` objects. + """ + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + + dt = dt.replace(tzinfo=self) + + wall_0 = enfold(dt, fold=0) + wall_1 = enfold(dt, fold=1) + + same_offset = wall_0.utcoffset() == wall_1.utcoffset() + same_dt = wall_0.replace(tzinfo=None) == wall_1.replace(tzinfo=None) + + return same_dt and not same_offset + + def _fold_status(self, dt_utc, dt_wall): + """ + Determine the fold status of a "wall" datetime, given a representation + of the same datetime as a (naive) UTC datetime. This is calculated based + on the assumption that ``dt.utcoffset() - dt.dst()`` is constant for all + datetimes, and that this offset is the actual number of hours separating + ``dt_utc`` and ``dt_wall``. + + :param dt_utc: + Representation of the datetime as UTC + + :param dt_wall: + Representation of the datetime as "wall time". This parameter must + either have a `fold` attribute or have a fold-naive + :class:`datetime.tzinfo` attached, otherwise the calculation may + fail. + """ + if self.is_ambiguous(dt_wall): + delta_wall = dt_wall - dt_utc + _fold = int(delta_wall == (dt_utc.utcoffset() - dt_utc.dst())) + else: + _fold = 0 + + return _fold + + def _fold(self, dt): + return getattr(dt, 'fold', 0) + + def _fromutc(self, dt): + """ + Given a timezone-aware datetime in a given timezone, calculates a + timezone-aware datetime in a new timezone. + + Since this is the one time that we *know* we have an unambiguous + datetime object, we take this opportunity to determine whether the + datetime is ambiguous and in a "fold" state (e.g. if it's the first + occurrence, chronologically, of the ambiguous datetime). + + :param dt: + A timezone-aware :class:`datetime.datetime` object. + """ + + # Re-implement the algorithm from Python's datetime.py + dtoff = dt.utcoffset() + if dtoff is None: + raise ValueError("fromutc() requires a non-None utcoffset() " + "result") + + # The original datetime.py code assumes that `dst()` defaults to + # zero during ambiguous times. PEP 495 inverts this presumption, so + # for pre-PEP 495 versions of python, we need to tweak the algorithm. + dtdst = dt.dst() + if dtdst is None: + raise ValueError("fromutc() requires a non-None dst() result") + delta = dtoff - dtdst + + dt += delta + # Set fold=1 so we can default to being in the fold for + # ambiguous dates. + dtdst = enfold(dt, fold=1).dst() + if dtdst is None: + raise ValueError("fromutc(): dt.dst gave inconsistent " + "results; cannot convert") + return dt + dtdst + + @_validate_fromutc_inputs + def fromutc(self, dt): + """ + Given a timezone-aware datetime in a given timezone, calculates a + timezone-aware datetime in a new timezone. + + Since this is the one time that we *know* we have an unambiguous + datetime object, we take this opportunity to determine whether the + datetime is ambiguous and in a "fold" state (e.g. if it's the first + occurrence, chronologically, of the ambiguous datetime). + + :param dt: + A timezone-aware :class:`datetime.datetime` object. + """ + dt_wall = self._fromutc(dt) + + # Calculate the fold status given the two datetimes. + _fold = self._fold_status(dt, dt_wall) + + # Set the default fold value for ambiguous dates + return enfold(dt_wall, fold=_fold) + + +class tzrangebase(_tzinfo): + """ + This is an abstract base class for time zones represented by an annual + transition into and out of DST. Child classes should implement the following + methods: + + * ``__init__(self, *args, **kwargs)`` + * ``transitions(self, year)`` - this is expected to return a tuple of + datetimes representing the DST on and off transitions in standard + time. + + A fully initialized ``tzrangebase`` subclass should also provide the + following attributes: + * ``hasdst``: Boolean whether or not the zone uses DST. + * ``_dst_offset`` / ``_std_offset``: :class:`datetime.timedelta` objects + representing the respective UTC offsets. + * ``_dst_abbr`` / ``_std_abbr``: Strings representing the timezone short + abbreviations in DST and STD, respectively. + * ``_hasdst``: Whether or not the zone has DST. + + .. versionadded:: 2.6.0 + """ + def __init__(self): + raise NotImplementedError('tzrangebase is an abstract base class') + + def utcoffset(self, dt): + isdst = self._isdst(dt) + + if isdst is None: + return None + elif isdst: + return self._dst_offset + else: + return self._std_offset + + def dst(self, dt): + isdst = self._isdst(dt) + + if isdst is None: + return None + elif isdst: + return self._dst_base_offset + else: + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + if self._isdst(dt): + return self._dst_abbr + else: + return self._std_abbr + + def fromutc(self, dt): + """ Given a datetime in UTC, return local time """ + if not isinstance(dt, datetime): + raise TypeError("fromutc() requires a datetime argument") + + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + # Get transitions - if there are none, fixed offset + transitions = self.transitions(dt.year) + if transitions is None: + return dt + self.utcoffset(dt) + + # Get the transition times in UTC + dston, dstoff = transitions + + dston -= self._std_offset + dstoff -= self._std_offset + + utc_transitions = (dston, dstoff) + dt_utc = dt.replace(tzinfo=None) + + isdst = self._naive_isdst(dt_utc, utc_transitions) + + if isdst: + dt_wall = dt + self._dst_offset + else: + dt_wall = dt + self._std_offset + + _fold = int(not isdst and self.is_ambiguous(dt_wall)) + + return enfold(dt_wall, fold=_fold) + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + if not self.hasdst: + return False + + start, end = self.transitions(dt.year) + + dt = dt.replace(tzinfo=None) + return (end <= dt < end + self._dst_base_offset) + + def _isdst(self, dt): + if not self.hasdst: + return False + elif dt is None: + return None + + transitions = self.transitions(dt.year) + + if transitions is None: + return False + + dt = dt.replace(tzinfo=None) + + isdst = self._naive_isdst(dt, transitions) + + # Handle ambiguous dates + if not isdst and self.is_ambiguous(dt): + return not self._fold(dt) + else: + return isdst + + def _naive_isdst(self, dt, transitions): + dston, dstoff = transitions + + dt = dt.replace(tzinfo=None) + + if dston < dstoff: + isdst = dston <= dt < dstoff + else: + isdst = not dstoff <= dt < dston + + return isdst + + @property + def _dst_base_offset(self): + return self._dst_offset - self._std_offset + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s(...)" % self.__class__.__name__ + + __reduce__ = object.__reduce__ diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/_factories.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/_factories.py new file mode 100644 index 0000000..f8a6589 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/_factories.py @@ -0,0 +1,80 @@ +from datetime import timedelta +import weakref +from collections import OrderedDict + +from six.moves import _thread + + +class _TzSingleton(type): + def __init__(cls, *args, **kwargs): + cls.__instance = None + super(_TzSingleton, cls).__init__(*args, **kwargs) + + def __call__(cls): + if cls.__instance is None: + cls.__instance = super(_TzSingleton, cls).__call__() + return cls.__instance + + +class _TzFactory(type): + def instance(cls, *args, **kwargs): + """Alternate constructor that returns a fresh instance""" + return type.__call__(cls, *args, **kwargs) + + +class _TzOffsetFactory(_TzFactory): + def __init__(cls, *args, **kwargs): + cls.__instances = weakref.WeakValueDictionary() + cls.__strong_cache = OrderedDict() + cls.__strong_cache_size = 8 + + cls._cache_lock = _thread.allocate_lock() + + def __call__(cls, name, offset): + if isinstance(offset, timedelta): + key = (name, offset.total_seconds()) + else: + key = (name, offset) + + instance = cls.__instances.get(key, None) + if instance is None: + instance = cls.__instances.setdefault(key, + cls.instance(name, offset)) + + # This lock may not be necessary in Python 3. See GH issue #901 + with cls._cache_lock: + cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) + + # Remove an item if the strong cache is overpopulated + if len(cls.__strong_cache) > cls.__strong_cache_size: + cls.__strong_cache.popitem(last=False) + + return instance + + +class _TzStrFactory(_TzFactory): + def __init__(cls, *args, **kwargs): + cls.__instances = weakref.WeakValueDictionary() + cls.__strong_cache = OrderedDict() + cls.__strong_cache_size = 8 + + cls.__cache_lock = _thread.allocate_lock() + + def __call__(cls, s, posix_offset=False): + key = (s, posix_offset) + instance = cls.__instances.get(key, None) + + if instance is None: + instance = cls.__instances.setdefault(key, + cls.instance(s, posix_offset)) + + # This lock may not be necessary in Python 3. See GH issue #901 + with cls.__cache_lock: + cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) + + # Remove an item if the strong cache is overpopulated + if len(cls.__strong_cache) > cls.__strong_cache_size: + cls.__strong_cache.popitem(last=False) + + return instance + diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/tz.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/tz.py new file mode 100644 index 0000000..c67f56d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/tz.py @@ -0,0 +1,1849 @@ +# -*- coding: utf-8 -*- +""" +This module offers timezone implementations subclassing the abstract +:py:class:`datetime.tzinfo` type. There are classes to handle tzfile format +files (usually are in :file:`/etc/localtime`, :file:`/usr/share/zoneinfo`, +etc), TZ environment string (in all known formats), given ranges (with help +from relative deltas), local machine timezone, fixed offset timezone, and UTC +timezone. +""" +import datetime +import struct +import time +import sys +import os +import bisect +import weakref +from collections import OrderedDict + +import six +from six import string_types +from six.moves import _thread +from ._common import tzname_in_python2, _tzinfo +from ._common import tzrangebase, enfold +from ._common import _validate_fromutc_inputs + +from ._factories import _TzSingleton, _TzOffsetFactory +from ._factories import _TzStrFactory +try: + from .win import tzwin, tzwinlocal +except ImportError: + tzwin = tzwinlocal = None + +# For warning about rounding tzinfo +from warnings import warn + +ZERO = datetime.timedelta(0) +EPOCH = datetime.datetime.utcfromtimestamp(0) +EPOCHORDINAL = EPOCH.toordinal() + + +@six.add_metaclass(_TzSingleton) +class tzutc(datetime.tzinfo): + """ + This is a tzinfo object that represents the UTC time zone. + + **Examples:** + + .. doctest:: + + >>> from datetime import * + >>> from dateutil.tz import * + + >>> datetime.now() + datetime.datetime(2003, 9, 27, 9, 40, 1, 521290) + + >>> datetime.now(tzutc()) + datetime.datetime(2003, 9, 27, 12, 40, 12, 156379, tzinfo=tzutc()) + + >>> datetime.now(tzutc()).tzname() + 'UTC' + + .. versionchanged:: 2.7.0 + ``tzutc()`` is now a singleton, so the result of ``tzutc()`` will + always return the same object. + + .. doctest:: + + >>> from dateutil.tz import tzutc, UTC + >>> tzutc() is tzutc() + True + >>> tzutc() is UTC + True + """ + def utcoffset(self, dt): + return ZERO + + def dst(self, dt): + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return "UTC" + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + return False + + @_validate_fromutc_inputs + def fromutc(self, dt): + """ + Fast track version of fromutc() returns the original ``dt`` object for + any valid :py:class:`datetime.datetime` object. + """ + return dt + + def __eq__(self, other): + if not isinstance(other, (tzutc, tzoffset)): + return NotImplemented + + return (isinstance(other, tzutc) or + (isinstance(other, tzoffset) and other._offset == ZERO)) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s()" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + + +#: Convenience constant providing a :class:`tzutc()` instance +#: +#: .. versionadded:: 2.7.0 +UTC = tzutc() + + +@six.add_metaclass(_TzOffsetFactory) +class tzoffset(datetime.tzinfo): + """ + A simple class for representing a fixed offset from UTC. + + :param name: + The timezone name, to be returned when ``tzname()`` is called. + :param offset: + The time zone offset in seconds, or (since version 2.6.0, represented + as a :py:class:`datetime.timedelta` object). + """ + def __init__(self, name, offset): + self._name = name + + try: + # Allow a timedelta + offset = offset.total_seconds() + except (TypeError, AttributeError): + pass + + self._offset = datetime.timedelta(seconds=_get_supported_offset(offset)) + + def utcoffset(self, dt): + return self._offset + + def dst(self, dt): + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return self._name + + @_validate_fromutc_inputs + def fromutc(self, dt): + return dt + self._offset + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + return False + + def __eq__(self, other): + if not isinstance(other, tzoffset): + return NotImplemented + + return self._offset == other._offset + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s(%s, %s)" % (self.__class__.__name__, + repr(self._name), + int(self._offset.total_seconds())) + + __reduce__ = object.__reduce__ + + +class tzlocal(_tzinfo): + """ + A :class:`tzinfo` subclass built around the ``time`` timezone functions. + """ + def __init__(self): + super(tzlocal, self).__init__() + + self._std_offset = datetime.timedelta(seconds=-time.timezone) + if time.daylight: + self._dst_offset = datetime.timedelta(seconds=-time.altzone) + else: + self._dst_offset = self._std_offset + + self._dst_saved = self._dst_offset - self._std_offset + self._hasdst = bool(self._dst_saved) + self._tznames = tuple(time.tzname) + + def utcoffset(self, dt): + if dt is None and self._hasdst: + return None + + if self._isdst(dt): + return self._dst_offset + else: + return self._std_offset + + def dst(self, dt): + if dt is None and self._hasdst: + return None + + if self._isdst(dt): + return self._dst_offset - self._std_offset + else: + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return self._tznames[self._isdst(dt)] + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + naive_dst = self._naive_is_dst(dt) + return (not naive_dst and + (naive_dst != self._naive_is_dst(dt - self._dst_saved))) + + def _naive_is_dst(self, dt): + timestamp = _datetime_to_timestamp(dt) + return time.localtime(timestamp + time.timezone).tm_isdst + + def _isdst(self, dt, fold_naive=True): + # We can't use mktime here. It is unstable when deciding if + # the hour near to a change is DST or not. + # + # timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour, + # dt.minute, dt.second, dt.weekday(), 0, -1)) + # return time.localtime(timestamp).tm_isdst + # + # The code above yields the following result: + # + # >>> import tz, datetime + # >>> t = tz.tzlocal() + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRDT' + # >>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname() + # 'BRST' + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRST' + # >>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname() + # 'BRDT' + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRDT' + # + # Here is a more stable implementation: + # + if not self._hasdst: + return False + + # Check for ambiguous times: + dstval = self._naive_is_dst(dt) + fold = getattr(dt, 'fold', None) + + if self.is_ambiguous(dt): + if fold is not None: + return not self._fold(dt) + else: + return True + + return dstval + + def __eq__(self, other): + if isinstance(other, tzlocal): + return (self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset) + elif isinstance(other, tzutc): + return (not self._hasdst and + self._tznames[0] in {'UTC', 'GMT'} and + self._std_offset == ZERO) + elif isinstance(other, tzoffset): + return (not self._hasdst and + self._tznames[0] == other._name and + self._std_offset == other._offset) + else: + return NotImplemented + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s()" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + + +class _ttinfo(object): + __slots__ = ["offset", "delta", "isdst", "abbr", + "isstd", "isgmt", "dstoffset"] + + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, None) + + def __repr__(self): + l = [] + for attr in self.__slots__: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, repr(value))) + return "%s(%s)" % (self.__class__.__name__, ", ".join(l)) + + def __eq__(self, other): + if not isinstance(other, _ttinfo): + return NotImplemented + + return (self.offset == other.offset and + self.delta == other.delta and + self.isdst == other.isdst and + self.abbr == other.abbr and + self.isstd == other.isstd and + self.isgmt == other.isgmt and + self.dstoffset == other.dstoffset) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __getstate__(self): + state = {} + for name in self.__slots__: + state[name] = getattr(self, name, None) + return state + + def __setstate__(self, state): + for name in self.__slots__: + if name in state: + setattr(self, name, state[name]) + + +class _tzfile(object): + """ + Lightweight class for holding the relevant transition and time zone + information read from binary tzfiles. + """ + attrs = ['trans_list', 'trans_list_utc', 'trans_idx', 'ttinfo_list', + 'ttinfo_std', 'ttinfo_dst', 'ttinfo_before', 'ttinfo_first'] + + def __init__(self, **kwargs): + for attr in self.attrs: + setattr(self, attr, kwargs.get(attr, None)) + + +class tzfile(_tzinfo): + """ + This is a ``tzinfo`` subclass that allows one to use the ``tzfile(5)`` + format timezone files to extract current and historical zone information. + + :param fileobj: + This can be an opened file stream or a file name that the time zone + information can be read from. + + :param filename: + This is an optional parameter specifying the source of the time zone + information in the event that ``fileobj`` is a file object. If omitted + and ``fileobj`` is a file stream, this parameter will be set either to + ``fileobj``'s ``name`` attribute or to ``repr(fileobj)``. + + See `Sources for Time Zone and Daylight Saving Time Data + `_ for more information. + Time zone files can be compiled from the `IANA Time Zone database files + `_ with the `zic time zone compiler + `_ + + .. note:: + + Only construct a ``tzfile`` directly if you have a specific timezone + file on disk that you want to read into a Python ``tzinfo`` object. + If you want to get a ``tzfile`` representing a specific IANA zone, + (e.g. ``'America/New_York'``), you should call + :func:`dateutil.tz.gettz` with the zone identifier. + + + **Examples:** + + Using the US Eastern time zone as an example, we can see that a ``tzfile`` + provides time zone information for the standard Daylight Saving offsets: + + .. testsetup:: tzfile + + from dateutil.tz import gettz + from datetime import datetime + + .. doctest:: tzfile + + >>> NYC = gettz('America/New_York') + >>> NYC + tzfile('/usr/share/zoneinfo/America/New_York') + + >>> print(datetime(2016, 1, 3, tzinfo=NYC)) # EST + 2016-01-03 00:00:00-05:00 + + >>> print(datetime(2016, 7, 7, tzinfo=NYC)) # EDT + 2016-07-07 00:00:00-04:00 + + + The ``tzfile`` structure contains a fully history of the time zone, + so historical dates will also have the right offsets. For example, before + the adoption of the UTC standards, New York used local solar mean time: + + .. doctest:: tzfile + + >>> print(datetime(1901, 4, 12, tzinfo=NYC)) # LMT + 1901-04-12 00:00:00-04:56 + + And during World War II, New York was on "Eastern War Time", which was a + state of permanent daylight saving time: + + .. doctest:: tzfile + + >>> print(datetime(1944, 2, 7, tzinfo=NYC)) # EWT + 1944-02-07 00:00:00-04:00 + + """ + + def __init__(self, fileobj, filename=None): + super(tzfile, self).__init__() + + file_opened_here = False + if isinstance(fileobj, string_types): + self._filename = fileobj + fileobj = open(fileobj, 'rb') + file_opened_here = True + elif filename is not None: + self._filename = filename + elif hasattr(fileobj, "name"): + self._filename = fileobj.name + else: + self._filename = repr(fileobj) + + if fileobj is not None: + if not file_opened_here: + fileobj = _nullcontext(fileobj) + + with fileobj as file_stream: + tzobj = self._read_tzfile(file_stream) + + self._set_tzdata(tzobj) + + def _set_tzdata(self, tzobj): + """ Set the time zone data of this object from a _tzfile object """ + # Copy the relevant attributes over as private attributes + for attr in _tzfile.attrs: + setattr(self, '_' + attr, getattr(tzobj, attr)) + + def _read_tzfile(self, fileobj): + out = _tzfile() + + # From tzfile(5): + # + # The time zone information files used by tzset(3) + # begin with the magic characters "TZif" to identify + # them as time zone information files, followed by + # sixteen bytes reserved for future use, followed by + # six four-byte values of type long, written in a + # ``standard'' byte order (the high-order byte + # of the value is written first). + if fileobj.read(4).decode() != "TZif": + raise ValueError("magic not found") + + fileobj.read(16) + + ( + # The number of UTC/local indicators stored in the file. + ttisgmtcnt, + + # The number of standard/wall indicators stored in the file. + ttisstdcnt, + + # The number of leap seconds for which data is + # stored in the file. + leapcnt, + + # The number of "transition times" for which data + # is stored in the file. + timecnt, + + # The number of "local time types" for which data + # is stored in the file (must not be zero). + typecnt, + + # The number of characters of "time zone + # abbreviation strings" stored in the file. + charcnt, + + ) = struct.unpack(">6l", fileobj.read(24)) + + # The above header is followed by tzh_timecnt four-byte + # values of type long, sorted in ascending order. + # These values are written in ``standard'' byte order. + # Each is used as a transition time (as returned by + # time(2)) at which the rules for computing local time + # change. + + if timecnt: + out.trans_list_utc = list(struct.unpack(">%dl" % timecnt, + fileobj.read(timecnt*4))) + else: + out.trans_list_utc = [] + + # Next come tzh_timecnt one-byte values of type unsigned + # char; each one tells which of the different types of + # ``local time'' types described in the file is associated + # with the same-indexed transition time. These values + # serve as indices into an array of ttinfo structures that + # appears next in the file. + + if timecnt: + out.trans_idx = struct.unpack(">%dB" % timecnt, + fileobj.read(timecnt)) + else: + out.trans_idx = [] + + # Each ttinfo structure is written as a four-byte value + # for tt_gmtoff of type long, in a standard byte + # order, followed by a one-byte value for tt_isdst + # and a one-byte value for tt_abbrind. In each + # structure, tt_gmtoff gives the number of + # seconds to be added to UTC, tt_isdst tells whether + # tm_isdst should be set by localtime(3), and + # tt_abbrind serves as an index into the array of + # time zone abbreviation characters that follow the + # ttinfo structure(s) in the file. + + ttinfo = [] + + for i in range(typecnt): + ttinfo.append(struct.unpack(">lbb", fileobj.read(6))) + + abbr = fileobj.read(charcnt).decode() + + # Then there are tzh_leapcnt pairs of four-byte + # values, written in standard byte order; the + # first value of each pair gives the time (as + # returned by time(2)) at which a leap second + # occurs; the second gives the total number of + # leap seconds to be applied after the given time. + # The pairs of values are sorted in ascending order + # by time. + + # Not used, for now (but seek for correct file position) + if leapcnt: + fileobj.seek(leapcnt * 8, os.SEEK_CUR) + + # Then there are tzh_ttisstdcnt standard/wall + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as standard + # time or wall clock time, and are used when + # a time zone file is used in handling POSIX-style + # time zone environment variables. + + if ttisstdcnt: + isstd = struct.unpack(">%db" % ttisstdcnt, + fileobj.read(ttisstdcnt)) + + # Finally, there are tzh_ttisgmtcnt UTC/local + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as UTC or + # local time, and are used when a time zone file + # is used in handling POSIX-style time zone envi- + # ronment variables. + + if ttisgmtcnt: + isgmt = struct.unpack(">%db" % ttisgmtcnt, + fileobj.read(ttisgmtcnt)) + + # Build ttinfo list + out.ttinfo_list = [] + for i in range(typecnt): + gmtoff, isdst, abbrind = ttinfo[i] + gmtoff = _get_supported_offset(gmtoff) + tti = _ttinfo() + tti.offset = gmtoff + tti.dstoffset = datetime.timedelta(0) + tti.delta = datetime.timedelta(seconds=gmtoff) + tti.isdst = isdst + tti.abbr = abbr[abbrind:abbr.find('\x00', abbrind)] + tti.isstd = (ttisstdcnt > i and isstd[i] != 0) + tti.isgmt = (ttisgmtcnt > i and isgmt[i] != 0) + out.ttinfo_list.append(tti) + + # Replace ttinfo indexes for ttinfo objects. + out.trans_idx = [out.ttinfo_list[idx] for idx in out.trans_idx] + + # Set standard, dst, and before ttinfos. before will be + # used when a given time is before any transitions, + # and will be set to the first non-dst ttinfo, or to + # the first dst, if all of them are dst. + out.ttinfo_std = None + out.ttinfo_dst = None + out.ttinfo_before = None + if out.ttinfo_list: + if not out.trans_list_utc: + out.ttinfo_std = out.ttinfo_first = out.ttinfo_list[0] + else: + for i in range(timecnt-1, -1, -1): + tti = out.trans_idx[i] + if not out.ttinfo_std and not tti.isdst: + out.ttinfo_std = tti + elif not out.ttinfo_dst and tti.isdst: + out.ttinfo_dst = tti + + if out.ttinfo_std and out.ttinfo_dst: + break + else: + if out.ttinfo_dst and not out.ttinfo_std: + out.ttinfo_std = out.ttinfo_dst + + for tti in out.ttinfo_list: + if not tti.isdst: + out.ttinfo_before = tti + break + else: + out.ttinfo_before = out.ttinfo_list[0] + + # Now fix transition times to become relative to wall time. + # + # I'm not sure about this. In my tests, the tz source file + # is setup to wall time, and in the binary file isstd and + # isgmt are off, so it should be in wall time. OTOH, it's + # always in gmt time. Let me know if you have comments + # about this. + lastdst = None + lastoffset = None + lastdstoffset = None + lastbaseoffset = None + out.trans_list = [] + + for i, tti in enumerate(out.trans_idx): + offset = tti.offset + dstoffset = 0 + + if lastdst is not None: + if tti.isdst: + if not lastdst: + dstoffset = offset - lastoffset + + if not dstoffset and lastdstoffset: + dstoffset = lastdstoffset + + tti.dstoffset = datetime.timedelta(seconds=dstoffset) + lastdstoffset = dstoffset + + # If a time zone changes its base offset during a DST transition, + # then you need to adjust by the previous base offset to get the + # transition time in local time. Otherwise you use the current + # base offset. Ideally, I would have some mathematical proof of + # why this is true, but I haven't really thought about it enough. + baseoffset = offset - dstoffset + adjustment = baseoffset + if (lastbaseoffset is not None and baseoffset != lastbaseoffset + and tti.isdst != lastdst): + # The base DST has changed + adjustment = lastbaseoffset + + lastdst = tti.isdst + lastoffset = offset + lastbaseoffset = baseoffset + + out.trans_list.append(out.trans_list_utc[i] + adjustment) + + out.trans_idx = tuple(out.trans_idx) + out.trans_list = tuple(out.trans_list) + out.trans_list_utc = tuple(out.trans_list_utc) + + return out + + def _find_last_transition(self, dt, in_utc=False): + # If there's no list, there are no transitions to find + if not self._trans_list: + return None + + timestamp = _datetime_to_timestamp(dt) + + # Find where the timestamp fits in the transition list - if the + # timestamp is a transition time, it's part of the "after" period. + trans_list = self._trans_list_utc if in_utc else self._trans_list + idx = bisect.bisect_right(trans_list, timestamp) + + # We want to know when the previous transition was, so subtract off 1 + return idx - 1 + + def _get_ttinfo(self, idx): + # For no list or after the last transition, default to _ttinfo_std + if idx is None or (idx + 1) >= len(self._trans_list): + return self._ttinfo_std + + # If there is a list and the time is before it, return _ttinfo_before + if idx < 0: + return self._ttinfo_before + + return self._trans_idx[idx] + + def _find_ttinfo(self, dt): + idx = self._resolve_ambiguous_time(dt) + + return self._get_ttinfo(idx) + + def fromutc(self, dt): + """ + The ``tzfile`` implementation of :py:func:`datetime.tzinfo.fromutc`. + + :param dt: + A :py:class:`datetime.datetime` object. + + :raises TypeError: + Raised if ``dt`` is not a :py:class:`datetime.datetime` object. + + :raises ValueError: + Raised if this is called with a ``dt`` which does not have this + ``tzinfo`` attached. + + :return: + Returns a :py:class:`datetime.datetime` object representing the + wall time in ``self``'s time zone. + """ + # These isinstance checks are in datetime.tzinfo, so we'll preserve + # them, even if we don't care about duck typing. + if not isinstance(dt, datetime.datetime): + raise TypeError("fromutc() requires a datetime argument") + + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + # First treat UTC as wall time and get the transition we're in. + idx = self._find_last_transition(dt, in_utc=True) + tti = self._get_ttinfo(idx) + + dt_out = dt + datetime.timedelta(seconds=tti.offset) + + fold = self.is_ambiguous(dt_out, idx=idx) + + return enfold(dt_out, fold=int(fold)) + + def is_ambiguous(self, dt, idx=None): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + if idx is None: + idx = self._find_last_transition(dt) + + # Calculate the difference in offsets from current to previous + timestamp = _datetime_to_timestamp(dt) + tti = self._get_ttinfo(idx) + + if idx is None or idx <= 0: + return False + + od = self._get_ttinfo(idx - 1).offset - tti.offset + tt = self._trans_list[idx] # Transition time + + return timestamp < tt + od + + def _resolve_ambiguous_time(self, dt): + idx = self._find_last_transition(dt) + + # If we have no transitions, return the index + _fold = self._fold(dt) + if idx is None or idx == 0: + return idx + + # If it's ambiguous and we're in a fold, shift to a different index. + idx_offset = int(not _fold and self.is_ambiguous(dt, idx)) + + return idx - idx_offset + + def utcoffset(self, dt): + if dt is None: + return None + + if not self._ttinfo_std: + return ZERO + + return self._find_ttinfo(dt).delta + + def dst(self, dt): + if dt is None: + return None + + if not self._ttinfo_dst: + return ZERO + + tti = self._find_ttinfo(dt) + + if not tti.isdst: + return ZERO + + # The documentation says that utcoffset()-dst() must + # be constant for every dt. + return tti.dstoffset + + @tzname_in_python2 + def tzname(self, dt): + if not self._ttinfo_std or dt is None: + return None + return self._find_ttinfo(dt).abbr + + def __eq__(self, other): + if not isinstance(other, tzfile): + return NotImplemented + return (self._trans_list == other._trans_list and + self._trans_idx == other._trans_idx and + self._ttinfo_list == other._ttinfo_list) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self._filename)) + + def __reduce__(self): + return self.__reduce_ex__(None) + + def __reduce_ex__(self, protocol): + return (self.__class__, (None, self._filename), self.__dict__) + + +class tzrange(tzrangebase): + """ + The ``tzrange`` object is a time zone specified by a set of offsets and + abbreviations, equivalent to the way the ``TZ`` variable can be specified + in POSIX-like systems, but using Python delta objects to specify DST + start, end and offsets. + + :param stdabbr: + The abbreviation for standard time (e.g. ``'EST'``). + + :param stdoffset: + An integer or :class:`datetime.timedelta` object or equivalent + specifying the base offset from UTC. + + If unspecified, +00:00 is used. + + :param dstabbr: + The abbreviation for DST / "Summer" time (e.g. ``'EDT'``). + + If specified, with no other DST information, DST is assumed to occur + and the default behavior or ``dstoffset``, ``start`` and ``end`` is + used. If unspecified and no other DST information is specified, it + is assumed that this zone has no DST. + + If this is unspecified and other DST information is *is* specified, + DST occurs in the zone but the time zone abbreviation is left + unchanged. + + :param dstoffset: + A an integer or :class:`datetime.timedelta` object or equivalent + specifying the UTC offset during DST. If unspecified and any other DST + information is specified, it is assumed to be the STD offset +1 hour. + + :param start: + A :class:`relativedelta.relativedelta` object or equivalent specifying + the time and time of year that daylight savings time starts. To + specify, for example, that DST starts at 2AM on the 2nd Sunday in + March, pass: + + ``relativedelta(hours=2, month=3, day=1, weekday=SU(+2))`` + + If unspecified and any other DST information is specified, the default + value is 2 AM on the first Sunday in April. + + :param end: + A :class:`relativedelta.relativedelta` object or equivalent + representing the time and time of year that daylight savings time + ends, with the same specification method as in ``start``. One note is + that this should point to the first time in the *standard* zone, so if + a transition occurs at 2AM in the DST zone and the clocks are set back + 1 hour to 1AM, set the ``hours`` parameter to +1. + + + **Examples:** + + .. testsetup:: tzrange + + from dateutil.tz import tzrange, tzstr + + .. doctest:: tzrange + + >>> tzstr('EST5EDT') == tzrange("EST", -18000, "EDT") + True + + >>> from dateutil.relativedelta import * + >>> range1 = tzrange("EST", -18000, "EDT") + >>> range2 = tzrange("EST", -18000, "EDT", -14400, + ... relativedelta(hours=+2, month=4, day=1, + ... weekday=SU(+1)), + ... relativedelta(hours=+1, month=10, day=31, + ... weekday=SU(-1))) + >>> tzstr('EST5EDT') == range1 == range2 + True + + """ + def __init__(self, stdabbr, stdoffset=None, + dstabbr=None, dstoffset=None, + start=None, end=None): + + global relativedelta + from dateutil import relativedelta + + self._std_abbr = stdabbr + self._dst_abbr = dstabbr + + try: + stdoffset = stdoffset.total_seconds() + except (TypeError, AttributeError): + pass + + try: + dstoffset = dstoffset.total_seconds() + except (TypeError, AttributeError): + pass + + if stdoffset is not None: + self._std_offset = datetime.timedelta(seconds=stdoffset) + else: + self._std_offset = ZERO + + if dstoffset is not None: + self._dst_offset = datetime.timedelta(seconds=dstoffset) + elif dstabbr and stdoffset is not None: + self._dst_offset = self._std_offset + datetime.timedelta(hours=+1) + else: + self._dst_offset = ZERO + + if dstabbr and start is None: + self._start_delta = relativedelta.relativedelta( + hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) + else: + self._start_delta = start + + if dstabbr and end is None: + self._end_delta = relativedelta.relativedelta( + hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) + else: + self._end_delta = end + + self._dst_base_offset_ = self._dst_offset - self._std_offset + self.hasdst = bool(self._start_delta) + + def transitions(self, year): + """ + For a given year, get the DST on and off transition times, expressed + always on the standard time side. For zones with no transitions, this + function returns ``None``. + + :param year: + The year whose transitions you would like to query. + + :return: + Returns a :class:`tuple` of :class:`datetime.datetime` objects, + ``(dston, dstoff)`` for zones with an annual DST transition, or + ``None`` for fixed offset zones. + """ + if not self.hasdst: + return None + + base_year = datetime.datetime(year, 1, 1) + + start = base_year + self._start_delta + end = base_year + self._end_delta + + return (start, end) + + def __eq__(self, other): + if not isinstance(other, tzrange): + return NotImplemented + + return (self._std_abbr == other._std_abbr and + self._dst_abbr == other._dst_abbr and + self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset and + self._start_delta == other._start_delta and + self._end_delta == other._end_delta) + + @property + def _dst_base_offset(self): + return self._dst_base_offset_ + + +@six.add_metaclass(_TzStrFactory) +class tzstr(tzrange): + """ + ``tzstr`` objects are time zone objects specified by a time-zone string as + it would be passed to a ``TZ`` variable on POSIX-style systems (see + the `GNU C Library: TZ Variable`_ for more details). + + There is one notable exception, which is that POSIX-style time zones use an + inverted offset format, so normally ``GMT+3`` would be parsed as an offset + 3 hours *behind* GMT. The ``tzstr`` time zone object will parse this as an + offset 3 hours *ahead* of GMT. If you would like to maintain the POSIX + behavior, pass a ``True`` value to ``posix_offset``. + + The :class:`tzrange` object provides the same functionality, but is + specified using :class:`relativedelta.relativedelta` objects. rather than + strings. + + :param s: + A time zone string in ``TZ`` variable format. This can be a + :class:`bytes` (2.x: :class:`str`), :class:`str` (2.x: + :class:`unicode`) or a stream emitting unicode characters + (e.g. :class:`StringIO`). + + :param posix_offset: + Optional. If set to ``True``, interpret strings such as ``GMT+3`` or + ``UTC+3`` as being 3 hours *behind* UTC rather than ahead, per the + POSIX standard. + + .. caution:: + + Prior to version 2.7.0, this function also supported time zones + in the format: + + * ``EST5EDT,4,0,6,7200,10,0,26,7200,3600`` + * ``EST5EDT,4,1,0,7200,10,-1,0,7200,3600`` + + This format is non-standard and has been deprecated; this function + will raise a :class:`DeprecatedTZFormatWarning` until + support is removed in a future version. + + .. _`GNU C Library: TZ Variable`: + https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html + """ + def __init__(self, s, posix_offset=False): + global parser + from dateutil.parser import _parser as parser + + self._s = s + + res = parser._parsetz(s) + if res is None or res.any_unused_tokens: + raise ValueError("unknown string format") + + # Here we break the compatibility with the TZ variable handling. + # GMT-3 actually *means* the timezone -3. + if res.stdabbr in ("GMT", "UTC") and not posix_offset: + res.stdoffset *= -1 + + # We must initialize it first, since _delta() needs + # _std_offset and _dst_offset set. Use False in start/end + # to avoid building it two times. + tzrange.__init__(self, res.stdabbr, res.stdoffset, + res.dstabbr, res.dstoffset, + start=False, end=False) + + if not res.dstabbr: + self._start_delta = None + self._end_delta = None + else: + self._start_delta = self._delta(res.start) + if self._start_delta: + self._end_delta = self._delta(res.end, isend=1) + + self.hasdst = bool(self._start_delta) + + def _delta(self, x, isend=0): + from dateutil import relativedelta + kwargs = {} + if x.month is not None: + kwargs["month"] = x.month + if x.weekday is not None: + kwargs["weekday"] = relativedelta.weekday(x.weekday, x.week) + if x.week > 0: + kwargs["day"] = 1 + else: + kwargs["day"] = 31 + elif x.day: + kwargs["day"] = x.day + elif x.yday is not None: + kwargs["yearday"] = x.yday + elif x.jyday is not None: + kwargs["nlyearday"] = x.jyday + if not kwargs: + # Default is to start on first sunday of april, and end + # on last sunday of october. + if not isend: + kwargs["month"] = 4 + kwargs["day"] = 1 + kwargs["weekday"] = relativedelta.SU(+1) + else: + kwargs["month"] = 10 + kwargs["day"] = 31 + kwargs["weekday"] = relativedelta.SU(-1) + if x.time is not None: + kwargs["seconds"] = x.time + else: + # Default is 2AM. + kwargs["seconds"] = 7200 + if isend: + # Convert to standard time, to follow the documented way + # of working with the extra hour. See the documentation + # of the tzinfo class. + delta = self._dst_offset - self._std_offset + kwargs["seconds"] -= delta.seconds + delta.days * 86400 + return relativedelta.relativedelta(**kwargs) + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self._s)) + + +class _tzicalvtzcomp(object): + def __init__(self, tzoffsetfrom, tzoffsetto, isdst, + tzname=None, rrule=None): + self.tzoffsetfrom = datetime.timedelta(seconds=tzoffsetfrom) + self.tzoffsetto = datetime.timedelta(seconds=tzoffsetto) + self.tzoffsetdiff = self.tzoffsetto - self.tzoffsetfrom + self.isdst = isdst + self.tzname = tzname + self.rrule = rrule + + +class _tzicalvtz(_tzinfo): + def __init__(self, tzid, comps=[]): + super(_tzicalvtz, self).__init__() + + self._tzid = tzid + self._comps = comps + self._cachedate = [] + self._cachecomp = [] + self._cache_lock = _thread.allocate_lock() + + def _find_comp(self, dt): + if len(self._comps) == 1: + return self._comps[0] + + dt = dt.replace(tzinfo=None) + + try: + with self._cache_lock: + return self._cachecomp[self._cachedate.index( + (dt, self._fold(dt)))] + except ValueError: + pass + + lastcompdt = None + lastcomp = None + + for comp in self._comps: + compdt = self._find_compdt(comp, dt) + + if compdt and (not lastcompdt or lastcompdt < compdt): + lastcompdt = compdt + lastcomp = comp + + if not lastcomp: + # RFC says nothing about what to do when a given + # time is before the first onset date. We'll look for the + # first standard component, or the first component, if + # none is found. + for comp in self._comps: + if not comp.isdst: + lastcomp = comp + break + else: + lastcomp = comp[0] + + with self._cache_lock: + self._cachedate.insert(0, (dt, self._fold(dt))) + self._cachecomp.insert(0, lastcomp) + + if len(self._cachedate) > 10: + self._cachedate.pop() + self._cachecomp.pop() + + return lastcomp + + def _find_compdt(self, comp, dt): + if comp.tzoffsetdiff < ZERO and self._fold(dt): + dt -= comp.tzoffsetdiff + + compdt = comp.rrule.before(dt, inc=True) + + return compdt + + def utcoffset(self, dt): + if dt is None: + return None + + return self._find_comp(dt).tzoffsetto + + def dst(self, dt): + comp = self._find_comp(dt) + if comp.isdst: + return comp.tzoffsetdiff + else: + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return self._find_comp(dt).tzname + + def __repr__(self): + return "" % repr(self._tzid) + + __reduce__ = object.__reduce__ + + +class tzical(object): + """ + This object is designed to parse an iCalendar-style ``VTIMEZONE`` structure + as set out in `RFC 5545`_ Section 4.6.5 into one or more `tzinfo` objects. + + :param `fileobj`: + A file or stream in iCalendar format, which should be UTF-8 encoded + with CRLF endings. + + .. _`RFC 5545`: https://tools.ietf.org/html/rfc5545 + """ + def __init__(self, fileobj): + global rrule + from dateutil import rrule + + if isinstance(fileobj, string_types): + self._s = fileobj + # ical should be encoded in UTF-8 with CRLF + fileobj = open(fileobj, 'r') + else: + self._s = getattr(fileobj, 'name', repr(fileobj)) + fileobj = _nullcontext(fileobj) + + self._vtz = {} + + with fileobj as fobj: + self._parse_rfc(fobj.read()) + + def keys(self): + """ + Retrieves the available time zones as a list. + """ + return list(self._vtz.keys()) + + def get(self, tzid=None): + """ + Retrieve a :py:class:`datetime.tzinfo` object by its ``tzid``. + + :param tzid: + If there is exactly one time zone available, omitting ``tzid`` + or passing :py:const:`None` value returns it. Otherwise a valid + key (which can be retrieved from :func:`keys`) is required. + + :raises ValueError: + Raised if ``tzid`` is not specified but there are either more + or fewer than 1 zone defined. + + :returns: + Returns either a :py:class:`datetime.tzinfo` object representing + the relevant time zone or :py:const:`None` if the ``tzid`` was + not found. + """ + if tzid is None: + if len(self._vtz) == 0: + raise ValueError("no timezones defined") + elif len(self._vtz) > 1: + raise ValueError("more than one timezone available") + tzid = next(iter(self._vtz)) + + return self._vtz.get(tzid) + + def _parse_offset(self, s): + s = s.strip() + if not s: + raise ValueError("empty offset") + if s[0] in ('+', '-'): + signal = (-1, +1)[s[0] == '+'] + s = s[1:] + else: + signal = +1 + if len(s) == 4: + return (int(s[:2]) * 3600 + int(s[2:]) * 60) * signal + elif len(s) == 6: + return (int(s[:2]) * 3600 + int(s[2:4]) * 60 + int(s[4:])) * signal + else: + raise ValueError("invalid offset: " + s) + + def _parse_rfc(self, s): + lines = s.splitlines() + if not lines: + raise ValueError("empty string") + + # Unfold + i = 0 + while i < len(lines): + line = lines[i].rstrip() + if not line: + del lines[i] + elif i > 0 and line[0] == " ": + lines[i-1] += line[1:] + del lines[i] + else: + i += 1 + + tzid = None + comps = [] + invtz = False + comptype = None + for line in lines: + if not line: + continue + name, value = line.split(':', 1) + parms = name.split(';') + if not parms: + raise ValueError("empty property name") + name = parms[0].upper() + parms = parms[1:] + if invtz: + if name == "BEGIN": + if value in ("STANDARD", "DAYLIGHT"): + # Process component + pass + else: + raise ValueError("unknown component: "+value) + comptype = value + founddtstart = False + tzoffsetfrom = None + tzoffsetto = None + rrulelines = [] + tzname = None + elif name == "END": + if value == "VTIMEZONE": + if comptype: + raise ValueError("component not closed: "+comptype) + if not tzid: + raise ValueError("mandatory TZID not found") + if not comps: + raise ValueError( + "at least one component is needed") + # Process vtimezone + self._vtz[tzid] = _tzicalvtz(tzid, comps) + invtz = False + elif value == comptype: + if not founddtstart: + raise ValueError("mandatory DTSTART not found") + if tzoffsetfrom is None: + raise ValueError( + "mandatory TZOFFSETFROM not found") + if tzoffsetto is None: + raise ValueError( + "mandatory TZOFFSETFROM not found") + # Process component + rr = None + if rrulelines: + rr = rrule.rrulestr("\n".join(rrulelines), + compatible=True, + ignoretz=True, + cache=True) + comp = _tzicalvtzcomp(tzoffsetfrom, tzoffsetto, + (comptype == "DAYLIGHT"), + tzname, rr) + comps.append(comp) + comptype = None + else: + raise ValueError("invalid component end: "+value) + elif comptype: + if name == "DTSTART": + # DTSTART in VTIMEZONE takes a subset of valid RRULE + # values under RFC 5545. + for parm in parms: + if parm != 'VALUE=DATE-TIME': + msg = ('Unsupported DTSTART param in ' + + 'VTIMEZONE: ' + parm) + raise ValueError(msg) + rrulelines.append(line) + founddtstart = True + elif name in ("RRULE", "RDATE", "EXRULE", "EXDATE"): + rrulelines.append(line) + elif name == "TZOFFSETFROM": + if parms: + raise ValueError( + "unsupported %s parm: %s " % (name, parms[0])) + tzoffsetfrom = self._parse_offset(value) + elif name == "TZOFFSETTO": + if parms: + raise ValueError( + "unsupported TZOFFSETTO parm: "+parms[0]) + tzoffsetto = self._parse_offset(value) + elif name == "TZNAME": + if parms: + raise ValueError( + "unsupported TZNAME parm: "+parms[0]) + tzname = value + elif name == "COMMENT": + pass + else: + raise ValueError("unsupported property: "+name) + else: + if name == "TZID": + if parms: + raise ValueError( + "unsupported TZID parm: "+parms[0]) + tzid = value + elif name in ("TZURL", "LAST-MODIFIED", "COMMENT"): + pass + else: + raise ValueError("unsupported property: "+name) + elif name == "BEGIN" and value == "VTIMEZONE": + tzid = None + comps = [] + invtz = True + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self._s)) + + +if sys.platform != "win32": + TZFILES = ["/etc/localtime", "localtime"] + TZPATHS = ["/usr/share/zoneinfo", + "/usr/lib/zoneinfo", + "/usr/share/lib/zoneinfo", + "/etc/zoneinfo"] +else: + TZFILES = [] + TZPATHS = [] + + +def __get_gettz(): + tzlocal_classes = (tzlocal,) + if tzwinlocal is not None: + tzlocal_classes += (tzwinlocal,) + + class GettzFunc(object): + """ + Retrieve a time zone object from a string representation + + This function is intended to retrieve the :py:class:`tzinfo` subclass + that best represents the time zone that would be used if a POSIX + `TZ variable`_ were set to the same value. + + If no argument or an empty string is passed to ``gettz``, local time + is returned: + + .. code-block:: python3 + + >>> gettz() + tzfile('/etc/localtime') + + This function is also the preferred way to map IANA tz database keys + to :class:`tzfile` objects: + + .. code-block:: python3 + + >>> gettz('Pacific/Kiritimati') + tzfile('/usr/share/zoneinfo/Pacific/Kiritimati') + + On Windows, the standard is extended to include the Windows-specific + zone names provided by the operating system: + + .. code-block:: python3 + + >>> gettz('Egypt Standard Time') + tzwin('Egypt Standard Time') + + Passing a GNU ``TZ`` style string time zone specification returns a + :class:`tzstr` object: + + .. code-block:: python3 + + >>> gettz('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') + tzstr('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') + + :param name: + A time zone name (IANA, or, on Windows, Windows keys), location of + a ``tzfile(5)`` zoneinfo file or ``TZ`` variable style time zone + specifier. An empty string, no argument or ``None`` is interpreted + as local time. + + :return: + Returns an instance of one of ``dateutil``'s :py:class:`tzinfo` + subclasses. + + .. versionchanged:: 2.7.0 + + After version 2.7.0, any two calls to ``gettz`` using the same + input strings will return the same object: + + .. code-block:: python3 + + >>> tz.gettz('America/Chicago') is tz.gettz('America/Chicago') + True + + In addition to improving performance, this ensures that + `"same zone" semantics`_ are used for datetimes in the same zone. + + + .. _`TZ variable`: + https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html + + .. _`"same zone" semantics`: + https://blog.ganssle.io/articles/2018/02/aware-datetime-arithmetic.html + """ + def __init__(self): + + self.__instances = weakref.WeakValueDictionary() + self.__strong_cache_size = 8 + self.__strong_cache = OrderedDict() + self._cache_lock = _thread.allocate_lock() + + def __call__(self, name=None): + with self._cache_lock: + rv = self.__instances.get(name, None) + + if rv is None: + rv = self.nocache(name=name) + if not (name is None + or isinstance(rv, tzlocal_classes) + or rv is None): + # tzlocal is slightly more complicated than the other + # time zone providers because it depends on environment + # at construction time, so don't cache that. + # + # We also cannot store weak references to None, so we + # will also not store that. + self.__instances[name] = rv + else: + # No need for strong caching, return immediately + return rv + + self.__strong_cache[name] = self.__strong_cache.pop(name, rv) + + if len(self.__strong_cache) > self.__strong_cache_size: + self.__strong_cache.popitem(last=False) + + return rv + + def set_cache_size(self, size): + with self._cache_lock: + self.__strong_cache_size = size + while len(self.__strong_cache) > size: + self.__strong_cache.popitem(last=False) + + def cache_clear(self): + with self._cache_lock: + self.__instances = weakref.WeakValueDictionary() + self.__strong_cache.clear() + + @staticmethod + def nocache(name=None): + """A non-cached version of gettz""" + tz = None + if not name: + try: + name = os.environ["TZ"] + except KeyError: + pass + if name is None or name in ("", ":"): + for filepath in TZFILES: + if not os.path.isabs(filepath): + filename = filepath + for path in TZPATHS: + filepath = os.path.join(path, filename) + if os.path.isfile(filepath): + break + else: + continue + if os.path.isfile(filepath): + try: + tz = tzfile(filepath) + break + except (IOError, OSError, ValueError): + pass + else: + tz = tzlocal() + else: + try: + if name.startswith(":"): + name = name[1:] + except TypeError as e: + if isinstance(name, bytes): + new_msg = "gettz argument should be str, not bytes" + six.raise_from(TypeError(new_msg), e) + else: + raise + if os.path.isabs(name): + if os.path.isfile(name): + tz = tzfile(name) + else: + tz = None + else: + for path in TZPATHS: + filepath = os.path.join(path, name) + if not os.path.isfile(filepath): + filepath = filepath.replace(' ', '_') + if not os.path.isfile(filepath): + continue + try: + tz = tzfile(filepath) + break + except (IOError, OSError, ValueError): + pass + else: + tz = None + if tzwin is not None: + try: + tz = tzwin(name) + except (WindowsError, UnicodeEncodeError): + # UnicodeEncodeError is for Python 2.7 compat + tz = None + + if not tz: + from dateutil.zoneinfo import get_zonefile_instance + tz = get_zonefile_instance().get(name) + + if not tz: + for c in name: + # name is not a tzstr unless it has at least + # one offset. For short values of "name", an + # explicit for loop seems to be the fastest way + # To determine if a string contains a digit + if c in "0123456789": + try: + tz = tzstr(name) + except ValueError: + pass + break + else: + if name in ("GMT", "UTC"): + tz = UTC + elif name in time.tzname: + tz = tzlocal() + return tz + + return GettzFunc() + + +gettz = __get_gettz() +del __get_gettz + + +def datetime_exists(dt, tz=None): + """ + Given a datetime and a time zone, determine whether or not a given datetime + would fall in a gap. + + :param dt: + A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` + is provided.) + + :param tz: + A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If + ``None`` or not provided, the datetime's own time zone will be used. + + :return: + Returns a boolean value whether or not the "wall time" exists in + ``tz``. + + .. versionadded:: 2.7.0 + """ + if tz is None: + if dt.tzinfo is None: + raise ValueError('Datetime is naive and no time zone provided.') + tz = dt.tzinfo + + dt = dt.replace(tzinfo=None) + + # This is essentially a test of whether or not the datetime can survive + # a round trip to UTC. + dt_rt = dt.replace(tzinfo=tz).astimezone(UTC).astimezone(tz) + dt_rt = dt_rt.replace(tzinfo=None) + + return dt == dt_rt + + +def datetime_ambiguous(dt, tz=None): + """ + Given a datetime and a time zone, determine whether or not a given datetime + is ambiguous (i.e if there are two times differentiated only by their DST + status). + + :param dt: + A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` + is provided.) + + :param tz: + A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If + ``None`` or not provided, the datetime's own time zone will be used. + + :return: + Returns a boolean value whether or not the "wall time" is ambiguous in + ``tz``. + + .. versionadded:: 2.6.0 + """ + if tz is None: + if dt.tzinfo is None: + raise ValueError('Datetime is naive and no time zone provided.') + + tz = dt.tzinfo + + # If a time zone defines its own "is_ambiguous" function, we'll use that. + is_ambiguous_fn = getattr(tz, 'is_ambiguous', None) + if is_ambiguous_fn is not None: + try: + return tz.is_ambiguous(dt) + except Exception: + pass + + # If it doesn't come out and tell us it's ambiguous, we'll just check if + # the fold attribute has any effect on this particular date and time. + dt = dt.replace(tzinfo=tz) + wall_0 = enfold(dt, fold=0) + wall_1 = enfold(dt, fold=1) + + same_offset = wall_0.utcoffset() == wall_1.utcoffset() + same_dst = wall_0.dst() == wall_1.dst() + + return not (same_offset and same_dst) + + +def resolve_imaginary(dt): + """ + Given a datetime that may be imaginary, return an existing datetime. + + This function assumes that an imaginary datetime represents what the + wall time would be in a zone had the offset transition not occurred, so + it will always fall forward by the transition's change in offset. + + .. doctest:: + + >>> from dateutil import tz + >>> from datetime import datetime + >>> NYC = tz.gettz('America/New_York') + >>> print(tz.resolve_imaginary(datetime(2017, 3, 12, 2, 30, tzinfo=NYC))) + 2017-03-12 03:30:00-04:00 + + >>> KIR = tz.gettz('Pacific/Kiritimati') + >>> print(tz.resolve_imaginary(datetime(1995, 1, 1, 12, 30, tzinfo=KIR))) + 1995-01-02 12:30:00+14:00 + + As a note, :func:`datetime.astimezone` is guaranteed to produce a valid, + existing datetime, so a round-trip to and from UTC is sufficient to get + an extant datetime, however, this generally "falls back" to an earlier time + rather than falling forward to the STD side (though no guarantees are made + about this behavior). + + :param dt: + A :class:`datetime.datetime` which may or may not exist. + + :return: + Returns an existing :class:`datetime.datetime`. If ``dt`` was not + imaginary, the datetime returned is guaranteed to be the same object + passed to the function. + + .. versionadded:: 2.7.0 + """ + if dt.tzinfo is not None and not datetime_exists(dt): + + curr_offset = (dt + datetime.timedelta(hours=24)).utcoffset() + old_offset = (dt - datetime.timedelta(hours=24)).utcoffset() + + dt += curr_offset - old_offset + + return dt + + +def _datetime_to_timestamp(dt): + """ + Convert a :class:`datetime.datetime` object to an epoch timestamp in + seconds since January 1, 1970, ignoring the time zone. + """ + return (dt.replace(tzinfo=None) - EPOCH).total_seconds() + + +if sys.version_info >= (3, 6): + def _get_supported_offset(second_offset): + return second_offset +else: + def _get_supported_offset(second_offset): + # For python pre-3.6, round to full-minutes if that's not the case. + # Python's datetime doesn't accept sub-minute timezones. Check + # http://python.org/sf/1447945 or https://bugs.python.org/issue5288 + # for some information. + old_offset = second_offset + calculated_offset = 60 * ((second_offset + 30) // 60) + return calculated_offset + + +try: + # Python 3.7 feature + from contextlib import nullcontext as _nullcontext +except ImportError: + class _nullcontext(object): + """ + Class for wrapping contexts so that they are passed through in a + with statement. + """ + def __init__(self, context): + self.context = context + + def __enter__(self): + return self.context + + def __exit__(*args, **kwargs): + pass + +# vim:ts=4:sw=4:et diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/win.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/win.py new file mode 100644 index 0000000..cde07ba --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tz/win.py @@ -0,0 +1,370 @@ +# -*- coding: utf-8 -*- +""" +This module provides an interface to the native time zone data on Windows, +including :py:class:`datetime.tzinfo` implementations. + +Attempting to import this module on a non-Windows platform will raise an +:py:obj:`ImportError`. +""" +# This code was originally contributed by Jeffrey Harris. +import datetime +import struct + +from six.moves import winreg +from six import text_type + +try: + import ctypes + from ctypes import wintypes +except ValueError: + # ValueError is raised on non-Windows systems for some horrible reason. + raise ImportError("Running tzwin on non-Windows system") + +from ._common import tzrangebase + +__all__ = ["tzwin", "tzwinlocal", "tzres"] + +ONEWEEK = datetime.timedelta(7) + +TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" +TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones" +TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" + + +def _settzkeyname(): + handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) + try: + winreg.OpenKey(handle, TZKEYNAMENT).Close() + TZKEYNAME = TZKEYNAMENT + except WindowsError: + TZKEYNAME = TZKEYNAME9X + handle.Close() + return TZKEYNAME + + +TZKEYNAME = _settzkeyname() + + +class tzres(object): + """ + Class for accessing ``tzres.dll``, which contains timezone name related + resources. + + .. versionadded:: 2.5.0 + """ + p_wchar = ctypes.POINTER(wintypes.WCHAR) # Pointer to a wide char + + def __init__(self, tzres_loc='tzres.dll'): + # Load the user32 DLL so we can load strings from tzres + user32 = ctypes.WinDLL('user32') + + # Specify the LoadStringW function + user32.LoadStringW.argtypes = (wintypes.HINSTANCE, + wintypes.UINT, + wintypes.LPWSTR, + ctypes.c_int) + + self.LoadStringW = user32.LoadStringW + self._tzres = ctypes.WinDLL(tzres_loc) + self.tzres_loc = tzres_loc + + def load_name(self, offset): + """ + Load a timezone name from a DLL offset (integer). + + >>> from dateutil.tzwin import tzres + >>> tzr = tzres() + >>> print(tzr.load_name(112)) + 'Eastern Standard Time' + + :param offset: + A positive integer value referring to a string from the tzres dll. + + .. note:: + + Offsets found in the registry are generally of the form + ``@tzres.dll,-114``. The offset in this case is 114, not -114. + + """ + resource = self.p_wchar() + lpBuffer = ctypes.cast(ctypes.byref(resource), wintypes.LPWSTR) + nchar = self.LoadStringW(self._tzres._handle, offset, lpBuffer, 0) + return resource[:nchar] + + def name_from_string(self, tzname_str): + """ + Parse strings as returned from the Windows registry into the time zone + name as defined in the registry. + + >>> from dateutil.tzwin import tzres + >>> tzr = tzres() + >>> print(tzr.name_from_string('@tzres.dll,-251')) + 'Dateline Daylight Time' + >>> print(tzr.name_from_string('Eastern Standard Time')) + 'Eastern Standard Time' + + :param tzname_str: + A timezone name string as returned from a Windows registry key. + + :return: + Returns the localized timezone string from tzres.dll if the string + is of the form `@tzres.dll,-offset`, else returns the input string. + """ + if not tzname_str.startswith('@'): + return tzname_str + + name_splt = tzname_str.split(',-') + try: + offset = int(name_splt[1]) + except: + raise ValueError("Malformed timezone string.") + + return self.load_name(offset) + + +class tzwinbase(tzrangebase): + """tzinfo class based on win32's timezones available in the registry.""" + def __init__(self): + raise NotImplementedError('tzwinbase is an abstract base class') + + def __eq__(self, other): + # Compare on all relevant dimensions, including name. + if not isinstance(other, tzwinbase): + return NotImplemented + + return (self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset and + self._stddayofweek == other._stddayofweek and + self._dstdayofweek == other._dstdayofweek and + self._stdweeknumber == other._stdweeknumber and + self._dstweeknumber == other._dstweeknumber and + self._stdhour == other._stdhour and + self._dsthour == other._dsthour and + self._stdminute == other._stdminute and + self._dstminute == other._dstminute and + self._std_abbr == other._std_abbr and + self._dst_abbr == other._dst_abbr) + + @staticmethod + def list(): + """Return a list of all time zones known to the system.""" + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + with winreg.OpenKey(handle, TZKEYNAME) as tzkey: + result = [winreg.EnumKey(tzkey, i) + for i in range(winreg.QueryInfoKey(tzkey)[0])] + return result + + def display(self): + """ + Return the display name of the time zone. + """ + return self._display + + def transitions(self, year): + """ + For a given year, get the DST on and off transition times, expressed + always on the standard time side. For zones with no transitions, this + function returns ``None``. + + :param year: + The year whose transitions you would like to query. + + :return: + Returns a :class:`tuple` of :class:`datetime.datetime` objects, + ``(dston, dstoff)`` for zones with an annual DST transition, or + ``None`` for fixed offset zones. + """ + + if not self.hasdst: + return None + + dston = picknthweekday(year, self._dstmonth, self._dstdayofweek, + self._dsthour, self._dstminute, + self._dstweeknumber) + + dstoff = picknthweekday(year, self._stdmonth, self._stddayofweek, + self._stdhour, self._stdminute, + self._stdweeknumber) + + # Ambiguous dates default to the STD side + dstoff -= self._dst_base_offset + + return dston, dstoff + + def _get_hasdst(self): + return self._dstmonth != 0 + + @property + def _dst_base_offset(self): + return self._dst_base_offset_ + + +class tzwin(tzwinbase): + """ + Time zone object created from the zone info in the Windows registry + + These are similar to :py:class:`dateutil.tz.tzrange` objects in that + the time zone data is provided in the format of a single offset rule + for either 0 or 2 time zone transitions per year. + + :param: name + The name of a Windows time zone key, e.g. "Eastern Standard Time". + The full list of keys can be retrieved with :func:`tzwin.list`. + """ + + def __init__(self, name): + self._name = name + + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + tzkeyname = text_type("{kn}\\{name}").format(kn=TZKEYNAME, name=name) + with winreg.OpenKey(handle, tzkeyname) as tzkey: + keydict = valuestodict(tzkey) + + self._std_abbr = keydict["Std"] + self._dst_abbr = keydict["Dlt"] + + self._display = keydict["Display"] + + # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm + tup = struct.unpack("=3l16h", keydict["TZI"]) + stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 + dstoffset = stdoffset-tup[2] # + DaylightBias * -1 + self._std_offset = datetime.timedelta(minutes=stdoffset) + self._dst_offset = datetime.timedelta(minutes=dstoffset) + + # for the meaning see the win32 TIME_ZONE_INFORMATION structure docs + # http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx + (self._stdmonth, + self._stddayofweek, # Sunday = 0 + self._stdweeknumber, # Last = 5 + self._stdhour, + self._stdminute) = tup[4:9] + + (self._dstmonth, + self._dstdayofweek, # Sunday = 0 + self._dstweeknumber, # Last = 5 + self._dsthour, + self._dstminute) = tup[12:17] + + self._dst_base_offset_ = self._dst_offset - self._std_offset + self.hasdst = self._get_hasdst() + + def __repr__(self): + return "tzwin(%s)" % repr(self._name) + + def __reduce__(self): + return (self.__class__, (self._name,)) + + +class tzwinlocal(tzwinbase): + """ + Class representing the local time zone information in the Windows registry + + While :class:`dateutil.tz.tzlocal` makes system calls (via the :mod:`time` + module) to retrieve time zone information, ``tzwinlocal`` retrieves the + rules directly from the Windows registry and creates an object like + :class:`dateutil.tz.tzwin`. + + Because Windows does not have an equivalent of :func:`time.tzset`, on + Windows, :class:`dateutil.tz.tzlocal` instances will always reflect the + time zone settings *at the time that the process was started*, meaning + changes to the machine's time zone settings during the run of a program + on Windows will **not** be reflected by :class:`dateutil.tz.tzlocal`. + Because ``tzwinlocal`` reads the registry directly, it is unaffected by + this issue. + """ + def __init__(self): + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + with winreg.OpenKey(handle, TZLOCALKEYNAME) as tzlocalkey: + keydict = valuestodict(tzlocalkey) + + self._std_abbr = keydict["StandardName"] + self._dst_abbr = keydict["DaylightName"] + + try: + tzkeyname = text_type('{kn}\\{sn}').format(kn=TZKEYNAME, + sn=self._std_abbr) + with winreg.OpenKey(handle, tzkeyname) as tzkey: + _keydict = valuestodict(tzkey) + self._display = _keydict["Display"] + except OSError: + self._display = None + + stdoffset = -keydict["Bias"]-keydict["StandardBias"] + dstoffset = stdoffset-keydict["DaylightBias"] + + self._std_offset = datetime.timedelta(minutes=stdoffset) + self._dst_offset = datetime.timedelta(minutes=dstoffset) + + # For reasons unclear, in this particular key, the day of week has been + # moved to the END of the SYSTEMTIME structure. + tup = struct.unpack("=8h", keydict["StandardStart"]) + + (self._stdmonth, + self._stdweeknumber, # Last = 5 + self._stdhour, + self._stdminute) = tup[1:5] + + self._stddayofweek = tup[7] + + tup = struct.unpack("=8h", keydict["DaylightStart"]) + + (self._dstmonth, + self._dstweeknumber, # Last = 5 + self._dsthour, + self._dstminute) = tup[1:5] + + self._dstdayofweek = tup[7] + + self._dst_base_offset_ = self._dst_offset - self._std_offset + self.hasdst = self._get_hasdst() + + def __repr__(self): + return "tzwinlocal()" + + def __str__(self): + # str will return the standard name, not the daylight name. + return "tzwinlocal(%s)" % repr(self._std_abbr) + + def __reduce__(self): + return (self.__class__, ()) + + +def picknthweekday(year, month, dayofweek, hour, minute, whichweek): + """ dayofweek == 0 means Sunday, whichweek 5 means last instance """ + first = datetime.datetime(year, month, 1, hour, minute) + + # This will work if dayofweek is ISO weekday (1-7) or Microsoft-style (0-6), + # Because 7 % 7 = 0 + weekdayone = first.replace(day=((dayofweek - first.isoweekday()) % 7) + 1) + wd = weekdayone + ((whichweek - 1) * ONEWEEK) + if (wd.month != month): + wd -= ONEWEEK + + return wd + + +def valuestodict(key): + """Convert a registry key's values to a dictionary.""" + dout = {} + size = winreg.QueryInfoKey(key)[1] + tz_res = None + + for i in range(size): + key_name, value, dtype = winreg.EnumValue(key, i) + if dtype == winreg.REG_DWORD or dtype == winreg.REG_DWORD_LITTLE_ENDIAN: + # If it's a DWORD (32-bit integer), it's stored as unsigned - convert + # that to a proper signed integer + if value & (1 << 31): + value = value - (1 << 32) + elif dtype == winreg.REG_SZ: + # If it's a reference to the tzres DLL, load the actual string + if value.startswith('@tzres'): + tz_res = tz_res or tzres() + value = tz_res.name_from_string(value) + + value = value.rstrip('\x00') # Remove trailing nulls + + dout[key_name] = value + + return dout diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tzwin.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tzwin.py new file mode 100644 index 0000000..cebc673 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/tzwin.py @@ -0,0 +1,2 @@ +# tzwin has moved to dateutil.tz.win +from .tz.win import * diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/utils.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/utils.py new file mode 100644 index 0000000..dd2d245 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/utils.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +""" +This module offers general convenience and utility functions for dealing with +datetimes. + +.. versionadded:: 2.7.0 +""" +from __future__ import unicode_literals + +from datetime import datetime, time + + +def today(tzinfo=None): + """ + Returns a :py:class:`datetime` representing the current day at midnight + + :param tzinfo: + The time zone to attach (also used to determine the current day). + + :return: + A :py:class:`datetime.datetime` object representing the current day + at midnight. + """ + + dt = datetime.now(tzinfo) + return datetime.combine(dt.date(), time(0, tzinfo=tzinfo)) + + +def default_tzinfo(dt, tzinfo): + """ + Sets the ``tzinfo`` parameter on naive datetimes only + + This is useful for example when you are provided a datetime that may have + either an implicit or explicit time zone, such as when parsing a time zone + string. + + .. doctest:: + + >>> from dateutil.tz import tzoffset + >>> from dateutil.parser import parse + >>> from dateutil.utils import default_tzinfo + >>> dflt_tz = tzoffset("EST", -18000) + >>> print(default_tzinfo(parse('2014-01-01 12:30 UTC'), dflt_tz)) + 2014-01-01 12:30:00+00:00 + >>> print(default_tzinfo(parse('2014-01-01 12:30'), dflt_tz)) + 2014-01-01 12:30:00-05:00 + + :param dt: + The datetime on which to replace the time zone + + :param tzinfo: + The :py:class:`datetime.tzinfo` subclass instance to assign to + ``dt`` if (and only if) it is naive. + + :return: + Returns an aware :py:class:`datetime.datetime`. + """ + if dt.tzinfo is not None: + return dt + else: + return dt.replace(tzinfo=tzinfo) + + +def within_delta(dt1, dt2, delta): + """ + Useful for comparing two datetimes that may have a negligible difference + to be considered equal. + """ + delta = abs(delta) + difference = dt1 - dt2 + return -delta <= difference <= delta diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/__init__.py new file mode 100644 index 0000000..34f11ad --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/__init__.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +import warnings +import json + +from tarfile import TarFile +from pkgutil import get_data +from io import BytesIO + +from dateutil.tz import tzfile as _tzfile + +__all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata"] + +ZONEFILENAME = "dateutil-zoneinfo.tar.gz" +METADATA_FN = 'METADATA' + + +class tzfile(_tzfile): + def __reduce__(self): + return (gettz, (self._filename,)) + + +def getzoneinfofile_stream(): + try: + return BytesIO(get_data(__name__, ZONEFILENAME)) + except IOError as e: # TODO switch to FileNotFoundError? + warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror)) + return None + + +class ZoneInfoFile(object): + def __init__(self, zonefile_stream=None): + if zonefile_stream is not None: + with TarFile.open(fileobj=zonefile_stream) as tf: + self.zones = {zf.name: tzfile(tf.extractfile(zf), filename=zf.name) + for zf in tf.getmembers() + if zf.isfile() and zf.name != METADATA_FN} + # deal with links: They'll point to their parent object. Less + # waste of memory + links = {zl.name: self.zones[zl.linkname] + for zl in tf.getmembers() if + zl.islnk() or zl.issym()} + self.zones.update(links) + try: + metadata_json = tf.extractfile(tf.getmember(METADATA_FN)) + metadata_str = metadata_json.read().decode('UTF-8') + self.metadata = json.loads(metadata_str) + except KeyError: + # no metadata in tar file + self.metadata = None + else: + self.zones = {} + self.metadata = None + + def get(self, name, default=None): + """ + Wrapper for :func:`ZoneInfoFile.zones.get`. This is a convenience method + for retrieving zones from the zone dictionary. + + :param name: + The name of the zone to retrieve. (Generally IANA zone names) + + :param default: + The value to return in the event of a missing key. + + .. versionadded:: 2.6.0 + + """ + return self.zones.get(name, default) + + +# The current API has gettz as a module function, although in fact it taps into +# a stateful class. So as a workaround for now, without changing the API, we +# will create a new "global" class instance the first time a user requests a +# timezone. Ugly, but adheres to the api. +# +# TODO: Remove after deprecation period. +_CLASS_ZONE_INSTANCE = [] + + +def get_zonefile_instance(new_instance=False): + """ + This is a convenience function which provides a :class:`ZoneInfoFile` + instance using the data provided by the ``dateutil`` package. By default, it + caches a single instance of the ZoneInfoFile object and returns that. + + :param new_instance: + If ``True``, a new instance of :class:`ZoneInfoFile` is instantiated and + used as the cached instance for the next call. Otherwise, new instances + are created only as necessary. + + :return: + Returns a :class:`ZoneInfoFile` object. + + .. versionadded:: 2.6 + """ + if new_instance: + zif = None + else: + zif = getattr(get_zonefile_instance, '_cached_instance', None) + + if zif is None: + zif = ZoneInfoFile(getzoneinfofile_stream()) + + get_zonefile_instance._cached_instance = zif + + return zif + + +def gettz(name): + """ + This retrieves a time zone from the local zoneinfo tarball that is packaged + with dateutil. + + :param name: + An IANA-style time zone name, as found in the zoneinfo file. + + :return: + Returns a :class:`dateutil.tz.tzfile` time zone object. + + .. warning:: + It is generally inadvisable to use this function, and it is only + provided for API compatibility with earlier versions. This is *not* + equivalent to ``dateutil.tz.gettz()``, which selects an appropriate + time zone based on the inputs, favoring system zoneinfo. This is ONLY + for accessing the dateutil-specific zoneinfo (which may be out of + date compared to the system zoneinfo). + + .. deprecated:: 2.6 + If you need to use a specific zoneinfofile over the system zoneinfo, + instantiate a :class:`dateutil.zoneinfo.ZoneInfoFile` object and call + :func:`dateutil.zoneinfo.ZoneInfoFile.get(name)` instead. + + Use :func:`get_zonefile_instance` to retrieve an instance of the + dateutil-provided zoneinfo. + """ + warnings.warn("zoneinfo.gettz() will be removed in future versions, " + "to use the dateutil-provided zoneinfo files, instantiate a " + "ZoneInfoFile object and use ZoneInfoFile.zones.get() " + "instead. See the documentation for details.", + DeprecationWarning) + + if len(_CLASS_ZONE_INSTANCE) == 0: + _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) + return _CLASS_ZONE_INSTANCE[0].zones.get(name) + + +def gettz_db_metadata(): + """ Get the zonefile metadata + + See `zonefile_metadata`_ + + :returns: + A dictionary with the database metadata + + .. deprecated:: 2.6 + See deprecation warning in :func:`zoneinfo.gettz`. To get metadata, + query the attribute ``zoneinfo.ZoneInfoFile.metadata``. + """ + warnings.warn("zoneinfo.gettz_db_metadata() will be removed in future " + "versions, to use the dateutil-provided zoneinfo files, " + "ZoneInfoFile object and query the 'metadata' attribute " + "instead. See the documentation for details.", + DeprecationWarning) + + if len(_CLASS_ZONE_INSTANCE) == 0: + _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) + return _CLASS_ZONE_INSTANCE[0].metadata diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ed891dd9cb4165064659014798bef80e2a8d1bf GIT binary patch literal 5728 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..524c48e12db7dfe159f282e4664f71ce249e1970 GIT binary patch literal 174394 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/billing_endpoint_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/billing_endpoint_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d0a9a3fd188f80dee67800b7d70ed0b2e53d385 GIT binary patch literal 18153 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/chirp_stack_integration_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/chirp_stack_integration_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68889911b964667f2dd97204e3bb71289e8ca707 GIT binary patch literal 17656 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/cloud_endpoint_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/cloud_endpoint_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8cce9107085ac64496e71136b79d1960ecfaaa8d GIT binary patch literal 7039 zcmd@Z-)|d9d4GAmcI+lCq0r-p21+mI)79JFT@MkZQFCqR9iX(dMm;RhYV4WV+pc#v zGwY;|HbSC(1pbCp;w9qw{se@C#0xr|#J(YT;gx&qOZmQ8+lj4|BovNQyViU&yEF66 zH{X0e$5FLf*5JAI@ovk0L(~3-F9#nBUamor2$=mO;goY(}LOx z3O&1N>)K6?6`1{4V>T~7GMf%F?`pLoy`gJbnZVQN`e8@DA5p=`oz=SyvU2;wvg-MM zB#0l%MD*K1qb-s|g!YqeB>Zho1mEa$nMe``oJvkMed#A;iIT41>sJ@LNfIx* zZlYFb;Ra#_@tF7$K3!#0POOfJ&ccNdmN%M%#V@9{99xGsrlhcCHwxlYJ=5=I+z zk*r?1bU7#TR?I`7n8=v7$tD*PW-OAo>zC9Pu1A2Roh-sW)}w2ags1^GdB_D#I3umW zB0+*BP~7p8ZogG;M?F_=(N2d8Md7I3ju`Lounxn@|A6DrYI-(HTQUmz3HSV79EoHN zzLi#D|9arVM%p;);A6teH7N220JzrF;Ybap!x5flCbJ&vaER*Ingv#5&SR}=e``Hp}LqE;9oT_DuHL^&slA)sV%JA125E5d{GkK+E>;)^0Uc7xBm? zX$MqF0u4CMh`@Hnd>~1eli^+o?se1)@(_!tBWSOlGyg^e=aCT3;M8$aj*XnE6B(r&H~|&I&$! z`K|sN{jN6ozGI{)J~sV5piOv4!{h@h?{#6TKcX!j+~JfRrhY>UB1w+}e;Db}2OLC- z$U)fdiYScwl6=r;+#Z<6PLY8dc+<7z|n z`FQs7@-oPwKw7U7WOBX}uS=!3g?sS=+zd>l%LjQQn4*JB2nKJB(T(N- zGZC#+vxhc#MBjLDBRdQG#Bm;)HILDRdQlh*veJ0JYf2G7IZW7A_U^H`*tqP66`M zP?Vbd9U2`C1s_yIf1>M}Y8m4esLk-3g{?#fOJgR+u9=#wa87%o-_U-3=4Zx^wNpr~ z)Y#NTJ+YXbT4%LK`Y-jgkeaErq-_u!e^v9f9UDp!)^wmQL0yJ=h81@zpp1oGn>ihz zBQ3GglE%s%eW!}w?<oJrIoat&ai4)P0d{gsa7@6tZI{;dSa*+P@LLq_SdtZ z)N}NcS5K*@#PsFVaZv>s78L;5oEHloL}1s@&p^llUxuc^OZ*;>`iVf%-@bPfJT?tU zKjaS~X2Q_t0UvBd5dMJztFVhKT#ySG=?yK@u@r6Xsrjb+W@fLn+dNL5&VF=pWf&)_ zC~o^*8mKhQ-}4kyX$>Flsn~*{%cNoO4`;0Cd=X+g4a-hubk8kD}>@}h~Vo08sZz+{5FCb z0!*d%Lw(`G>#y)r9l-YO7gm=k!I;pV!yLdL$J(=>yh04H5(Lo}ggS@ZAYoReZbZJ& zDeQst71LITB5*&Ss}ER$juUeaOQVw!_HCoTYq!%V2~wiB~3;Q7JoyV^)lL^I!d-6O#Y{ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/converter_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/converter_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dca19c178c744974a38c393fa6c313b74f156e4 GIT binary patch literal 18501 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 ORnXLwnl7Yf(*F;mcNQoB literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/custom_menu_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/custom_menu_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37811746bea8e8f9a6a81521cc6149ae860878d5 GIT binary patch literal 6951 zcmeHM&2JmW72hwemJ}(;j^or$Ta25gwv3px<9;B5EZDJKCk-qc5epPV+r?^UMA2UE z(lblh6jqno$F_fi4fG=Pod2NLo^sn`(@ReUlAAB?@6D2wDARHrpgsBtyVGc-1_YC`oGT@#uxNs|Ks4tWxR?AH(CZaxfPjRt7Vx~w(XgCD4nR( zbz81!+%R~FyN?X+ikXLY%j5Q%u{aZ4GYzA{@H96&aa(DK) zsnJOF3hT5&y^}O}5~>E;g%oipP*dr-px0@fUKuUV(52rMaT?INtQWM!awAx&GxiRP zlY7AuyZ*ED7YZhC^+XJgnd*s&w89HKt9R*BDW?~&1R zd6`#G&hS}YMd|SxpF>&Z^Lznig7jUuYL}~Aq;LULqLxWZa*>Qk<7Sb@=^z1 z{$l>wTr(zr?^qdWjT`(8)3!x=wJ%|nC`KwY&E$q&L$R)aSUBqjcLg+wsX-iW$|O$u ziha~<-X6IJm=@z=Bj`tIoi!8Pp9Qf#Xqqc{(ZKgcex*m+s=Gnl_bxSMUyMhutgJx& zqzE{>#7Ml@h94IDKuH@ZPNA>h=zO%EnVe~HVk#Ub_{3DjoHW~+#X{kU*QH(n3)tg@ zttUw|o?uCev@hX*_5?U?qtW{Lcte}ZP{bGm)?>#@Tm|W@6L(eBx=l+HwY}mb-WF2ePel zht|+j7Nks#r(QbiJEXG|^SoNcTrd|b$K3v4Pi_;w>*Z%UVHR_k^$1>V7XL)0ZIGhF zB+MtKY3Q0YuE9)(-yEu?CVYyWT956_=A{$H6Z4w!yQ9CgcATA3=495EDeI}j-OM>| zJT(7cW~I!|oMq!4qyCqSjeVZ;l;=dY0wA5hBg zvQ5hxR9IF)@&&&qMU(_w#}s&Kd>Og|Kkaly(oZF6{`T4pgytY-{a8FeW<&|jT`{g0-@epj8Qd~WE8UTU$cPZxq-FY1IkEoelU3 zIv5uImvRvV!~>xvw{Ki;=9N8@Z|+udXFcJA)@(09P}Qzh<)w{IBvh*g&)h>6D*SZN z6M2oYP+y5OrSx@AMDjQZ>n#%2(U5Wry6C=L`8Uqz;(G-$aBF(hu~0bB~-hMRQ5cW_M1zL@jz`9%vcz?hZ>E z!q4rkAd;uh9s3Kwe9_jbB8QfP(XZNYonhlFF+OUW*DU*6f%FTR%#yT*t&(Bp18!K( zbIQsSYPdg-$gY%AotfJs_uo1B6fcAO=IU2 zby}5#SLF#JCqbT`d_FFY6iL2Ky}l39ls};AkBFQlLXdSYyO!ti^N;kY0kVDhm6iO! zF;D3HG}rqDT(1hY#NI;RLR?52m;wkX)%Y*!xsK!e@E`yq$4yf>M%ZKM_CEj~U*xFI z9wNH~x-`{QzkSH~ze9zU#(_vrhB)xzo}x`A6^G0-p~U+gxALI9+yu@lFyIT3pT>oy z=P;l<6$3Va0cW1WfTw@~-9s>-w^PLxjlE^ao9JntFvgg$Jj8?*T;32$1R5NEsRAX| z#wgL_b9{aRB`#=`Smp&fEYr0Quwj`y{D?-0WsW@oB_7o%@r~fi@3=7^P{{w=w!U?e zbkjHuCKWO7=BvlNLu_$%+dkVkTSPsIf7?|uW5CsO1g>--l<(tv?%ck$*4!8J7AunO zh2)Qkyi4RKL{1Z-TT+RCjTo(ylaMSd=GM4SE>bTt|EYoVA{zdISN$Huo&WlHh%nCx z6Mao&^x-#fVh40rmcZuXEL|7JL09;GUh(~I!ut``tG<5^ckRQL8Q;ghO?+RHFO_c) zA@nCN5TS%Y{*(wwU|%|+6AQYrlXQa8w*oI^D7y4;tZK!x KJiBTgv;PBNL)SR~ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/custom_translation_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/custom_translation_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f9adde407c8ec3e8ef3085f1410982f382dc5ac GIT binary patch literal 7620 zcmeHM&2t+`6`vW6Mx!s=@n*ARfvwq3TOpB>4a&Yey=^oMo${F=)5xgQY?w&RAltSY zmag5@Se99zXw2fdN12ArGIzB~&by&&TEW3n-}J+l{9fb<=G>2w0_N$za>(vO{G&)F1wfsK%nEtf8I@9yU30GQQw-{My3R;q(rgblW_PJ(}0)crCtM^R8AM=WQp9 z9(YU6>IWAu^_jfY;UPG7WQRAMZ7w8wEIIF2FRCS6k1$9xUcx#yqHB|ks0KHA$b}bk z=B)27ImEC8$1OkJ?5oN+uF?aoT zClc`*%JM56|9aqKAx&yE{$%jy8eaKB5Uw?JY^lL?Y~d-EVdf_~Hc@R`Bg=Bk{zPk7 zEYAu^bF9cpNNrYTGf4Anmdzn8FasMqpT2RuE90nL7hWg>B|s8_h=PC%@YDOl+O7KP z5^cM5nt>;!gABGba` zVb=?S-KvuE9lr5dg{%6lH4TVo_)wnS>v-i?KoUr;tBG8!J<|5{L{BsqC3m$0eXU{$ z5^-99X1PtZ2NfeVB@Z@)g^B}B*hro{s{KSlX=$pr^9voXc^|rohU+e=@nE7FX*12+;kBmP3^zX94YxVk4i}B8o!!)S zUCbQ2?i*l95_`68=>@&F@cg~34*NA>%%g|aP2S>1ct8CX2!m*tu?%tTYb^6v7pD?! zOJ`XhCBN5yr{C2k|L++IsgmXW1;e&@e7!4Rsz|2v>RIME@F>!0bI6K0ZSOvZdO318 zY;KAujJneKLA`!^=sI9_4&xhMH;AiFJyPu*FI2lvV|mAQJU{d~9a3S{414h4N?mmM zsQ1;YSD}-Fd(64wkg%~Dx7l9~Qd-Z%)^sI&p^HX~lLJ;JM#NTwU5wZtng(60^o@a7 zUg~(TjzgB5^(YEP11t$1cLiM35pj;1&>-shXhT`lK$K*!Fe$jIaiIje=Z|*m&mmRs zfsY4RzK(c za2a(6r0R?}Ll7a7VW53O#ZY;L}c z${_GmwY{1;XZv1!EZV`5`|RT?&D>nAr>Bm%iuyqzHP<7y+bDJ-9OBA-%QU;;2V6GF z@b(=9zub*?J3K8@@asw*#}qXmicg#&LB2+UoNrRBr9x&G(L~#ezap8JO2&qjc0EG>Lywkyqa;$1w z5b2<1z`Hd_GuW6kv+V`qP2#NB@xc6`u7uEC><<5x2lEUni^TY_ZdS4EZhOL2GD(Xh ztwF7DF!Gc$7qck)5bvjT5Ob!0ScZO@)o?g{nRok9kd&z zHu@G+f9qepkB@BQ=kxeeCO>fij0aMph?O8D`qR)k{;$MBFLw;2T%WSyVW^`FE3NfC z*73rb(i<@c^_a4P6p)Fc&Ep4oNS#iD^uBu{bv}Ni3B4T;T*RxSw{wS~JdH8tEx)ue z{PD7w+M1W@6hAzM`e*f>&wExMFWxml&|91(@;bu;#&1CZX@7c`D3g_yWgAfP-1%W?^S0G15}mMPFDusl!TIMFwBz-8kQ zE{~V&A;?GQYxw4U^>7mxdA zbdw51BRHGa=Ltlw9MRgzkm|*wPFNPjfJ68!-$B^KbbwS?3hb&6n<>|a&6HEHS=DAo z0NPXl8ZdbbKxg+X0?Poa#ySK}

WdTl?1|?;{?-{IY zhRV0pZL9*{1;FlNQevl)nZ(@3?JW9JiWRHWWb=UERD$&;IrfTz->1FzUMe3lrQrW} zDeB_S!SyKJ%su}GPbfDqLh#dPfBmzc{Vz80wcbyE>`S^P9bGPx!^Jlm+<9`KS?3;k z=X=i1CJ)tpB{jYG;(_n=GUsaN`e6kH7`+mCA6!FRAYiN_4e@Q1r{?Wjck5$OM5QR` zN>IE*JaRAEIQqYSSPrJjBW; zM9jCpuzR1fRgnerl_Gt;2(kCBn-*NR9kFge`I75Cz!#uFP0n@kP0w`&ojKwaB6L0o zx+GB1o}k!E$z@DdN@{dFEGR^y%N0rIovoRA!LqaVX?um<(yOYzk{8!dOI&PpVLjkN zz?W*NA-GbE#@Wg5G*$XW)BiTq|5#*2>sz>UQKLPJjnrQ5ukR|3GfmR9nQ4>?wqa*V I#_7zz0kj*$djJ3c literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/customer_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/customer_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47847d3192c359c7dd6291d00caae1635c5ebf57 GIT binary patch literal 24382 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 G^#23ItuTZD literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/device_group_ota_package_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/device_group_ota_package_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee4a2868053f66d21c867026dee7a98bdf45c0bc GIT binary patch literal 9018 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 J<%RLo{{XcL9A*Fj literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/http_integration_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/http_integration_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ee6e4b2d64c9a5a39c63c8f63614cbf653e74fe GIT binary patch literal 9072 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 F{{q9GmqP#m literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/integration_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/integration_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2f389d4f0f6b6879b482884cc5788a4361e519c GIT binary patch literal 17594 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 S!SDa#QZ@tM0mZV?XzYIxDq~Rq literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/lwm_2m_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/lwm_2m_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..895013360cc9bf0510b89ebe9528afe43875f9bc GIT binary patch literal 6527 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 BedquH literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/ocean_connect_integration_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/ocean_connect_integration_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f08e5b6404142dd3beffcb7c08f31651da05b8f GIT binary patch literal 17772 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 B(18E| literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/owner_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/owner_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e9e68e9ca3b3e2410c76d04170ce2c60f0094b0 GIT binary patch literal 6600 zcmeHL&2!tv6$d~N1R>Ir9apZKer)Qdwq|V7v6D_mBWrBSimT~F@>q1I!zP76?vjKJ zV&Pp-3Tfz4dwS@!{Tu8y7fsLoXK?MQ*XEXs``!YiD9RbB?xC5+u zqeW^x*Qmux&k9YO7Phsel6ObfG>5>i(euNuyv;p9$^G^12Dx=_!%;mSb3y!2#$wQp zeI82E(I{x3)>7zGQQ$Pe*NO=m_30ZgFXvm5BZYF>#~))w^}3Q0txvOZ<(xrboGNw z$gPNlATf~Ad7HNsv&$XsS%hZ9qMCWJ)a+@09 z$W!T=tzA$76%{-Pm;j!mzinlC%R)N&*FN8z&(4L|+p37|C@asMEL?{2mG3 z6<)uV8Tk$eyT^o4@GefuX!gBu;03|3rYw1%b^cQWs(G7j157afVHv+Q_~dsXNx(7# zO_XBonYO1VdZM||vaRjwn@fg3Go}u#9=EORykw-NWI;z*(6O%x8?vu<>JKC=jC$y| zdA;w4eus-LyIyDEj+|bc^}uh{qaiHr@Otfot94k*>`LUdAH({Cfh`x8YR;&RD;D`i ztj^H^ZhPVZ7usvlFtuG5n8mL9Ly$tEM7D0}jy`(#sLN{Ov2EPw;~&n!`Y+-8@-`$? zPfTj8Xo>kkqlK5cIGbpX&?-h!=oEZt|3d$>zOB8kb+4EdVa1rdiP!C~JVZ#+XJ8mg`rcy(Yl+BV*zO4)@_{73Xf*DPV*%_VLRrTf1aXZtxEfEq zP`Mgud0#j2@;Hb@xL(yTF!+-j4KZMo*{iFoumA<~D7it<%$Xi;=7N~J?OYXiAR(-| z5ts3$tkb8L3G75a9=h=`Vv`ECALh1nh#fc`bOCl5-&&W&mzJ_^f%+^*9_*6?3Z%t( zFd>llLJTEiDVDR+1|^p;eENdX1BO%Mr(|8u1#f`dC!6Kd@tm*WBUn5T5GXf!cwk-B zNBuTBYMbXS#~=dx9Af0O^Mc{!iJIeiun3T>RI~HLVQja_;6}O#j>T~<##@(qvFGwI z7^dZkA7CFBz|iTn6ZqHNg=n3T!YIFQi4yFT)E*l=otrXcTFxszO|8efp6JTdLUXFfIdN_%!vN{TzWxEhKwu04^P12q0)Qg9>-!Ty1x+@ zH08e5oeY*B)#)wmw^rI1;&j-YL-^w=Z^*RR@dGBCRlqY5T;`ZUL1`5) zbFO4@jJLpp^(DTCEA3reX=mDauTWP&7m#z`i{*YfwY&&!UT}y89KeB03)25QEdyc} z@bzU{MitkE;39Q?zVljXhQCqQ`y5r}zc z!`s@I0uuYQ14thKma(YYx{>`~nXeqv(rv@hjaRlYo12Dd*m?!VXCKz#ubYMie{)P_ zlG`xSQPiz}jn=o`2wBX;_(MQr`hFqiKrOf(?9Lv64HkM~{C{vah?OF5ZwC2o;v0A~ zP)C~zLU6ao*pObGJt&Siab|ss1(-Iob<_8brSeCdbqpp?^ z;=HHiy70>Hx&q%%#3CjLu*8R$plDO#D#7tpM&M&8MrnzMgRPmmW7$RfoPED?PW3I7 z#m}J!`E~~I!~}c=L|!d51QSb8Xr4d(j$6Yw-0bZ*drY=?>k)umMeTJWr1nat(JH*l TXcF&YrcrSK>lG@-*}}g8=_lbI literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/report_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/report_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef4a0dffbeb80df0c094735696d79eaeb4f38b04 GIT binary patch literal 6839 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/rpc_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/rpc_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63eab4e3d36e3ea803a4b92a6a79dc7298954245 GIT binary patch literal 6418 zcmeHL&2!vH6_+#`StE}>HpzO)vOtq%NxYTJWH(R+#&PA#8&ZIsvWJD5T2Ok_Ju^x) zlG5E{?-=<)as>W{gxZUXGsXX+D<`h(Etl|KOEdmR0(J#ztJutxx?9~({l5CW{&goa zGoAsz^}jyp{O$XO@ppVV__N{V8axsUX0#1vGAl9%R@*YMU5P5~imvUp4YeIr2Tt2D zjoSvRGUu_u96t4^(so&8(^#CMw@kzE2>e?8Fz(442^EZNtZuf*^}BaGJ@QE+NEk~c zhJgx`SdxCSO;keYQ1ufL?r?ldd!fd7s3|L%Kv(e|Y($ zLdf-$#~?A0DG$gN7ZSc$A|E#{YZY!LFiD`6K#y*6?XV!4;5LuBpo%ln87&bMSc1g8 zQ1yqMMvx4ea+~&gTxbc$?I2;i$KwW&dH(=+7>i~;M>{f!hKl>)AWei?gTC7JG`tyw zph$pJ2Y(fKxdxA1f`S`u6I^OB6I?jMD$IUtf)lmd+Eq5i+{Z@SVKwGKJ;kP39cq_Z z;K#0b3 zf({ymiEkxfbwxM>-{MEboC6vUX%vkb+KwB%ds6f1@74kf3^4v-8=sr-$ZtTAfnA1% zm{P_gW7o{g%x;O<2kNQc8mdu=;?o6o6mbM~ma8e_@;)fxY)(7=%Y89ZOEK*7wc z!mMQ@t2{AS<*6x7XU2WBh}E@1=>5X{leuZU*tctEHmnnyeg=l^)0jnkJ?6inqg#9{ z4EV;~n;S(Czbv@Q{22uhHY`!eS8(sK-)DAw2eH zAe|(MCKHsSkT{{AL0T!LxdAWa0=|TTvwemK=qKVWm6G0JFa1JrH58ENZebdQ$u_jS zP^OTl`D&~}HJZqS66@ccu8!Z*nV20QfFboAbW1e4_~M5JJE^}el^I)RLfpz1!0afN zk7?9rR8eqEG|Foee?ov(z?At+DWtPG)bJ;h={ zBlGuWHkDN~XW4jo4(YFAE~##r@&>$_XAM?^4Eu?yG7o8)rN{2Vm{pFoU~C%4LSxs3 zr>1EP(J5%M8mliGJ!98{v1zF5P|vX1?yTlx2vzXeorUb=JeguMJ@cuVO|x0ZX4vDh zxw2<|*>AK3^ehPBK2-qic z*}@;^Am_b9AAG%Y-jT?8lL86(pQb>8Q7ukkF@r@NihSNr1&6b2*Jw~ev%ZlwnKjrO56`8 zX&kp9K-aL9am59>hZ*%A+3xdL?+i$K?<6el?R5VWi%GhEEk3zh%yWl5t9;n}Fn6v8 z0Z-Mld77qC80cd|^S(^tXLW?eVDw9^QOcjq{rb}N^6;W*cFt)emqx=L9CQ%MH33Wj zmT3NN%wRXS@2+pQ^7sDTR@>V1wC~%~2sM0dQkhq~VZ>#72Ec^gmVE^>jx_q6GGBnO9`^d0qpQD&QH&yoM^S z3XzE1`;H_(*YI%QpfMVnW)Xe2%W60isbb&Iif9gd4)G=7^Yr6~ueQPuI-oL17`qQWn% zIE{<592MV#nUC!7Vh;L#49}MW3U}TEu#JDmS}*NC|-@kk2TMs z$U2C`#XB(hA$jC|-j1VA{iYPY|U3E)*?s4x4ZrZ-`4+;C)p5s>C1$VQ)pvM+#;zuxoe7i%q)d9W&PSZwi2`(0)(LQ_l vPPBpdp~XFHaWU&8o%?_}^=vN_A$OMxjaJ|a#E^JcvaPxYu&h$I&Q$&dmu9Vs literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/rpc_v_2_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/rpc_v_2_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..168ad4830e0c2c669b195875e5c8e7bed4c125c9 GIT binary patch literal 14400 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 KMz)lh%l;Q?Qp!01 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/scheduler_event_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/scheduler_event_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89fdc69506dc292619e4040cad1ec62bbead8779 GIT binary patch literal 25128 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 N7FR+hbBVF!{{uXl-c0}i literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/self_registration_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/self_registration_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0f0c1f448e393d302f4244c2b39fc5776f28359 GIT binary patch literal 10106 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 aH5angUch!L5hYZ0t!kN?S*U793jYHdNO*q$ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/sig_fox_integration_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/sig_fox_integration_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b19d3eb48aab0e6ebac986c5c974e510d66ffd3a GIT binary patch literal 17664 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 T4!#K(m$DgnBPf=YMq~d2zTsmv literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/sign_up_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/sign_up_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..daa29e870644d95df755d86b1074540c97c97438 GIT binary patch literal 22499 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 Hdy@YTj|J_C literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/solution_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/solution_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41edc7e0e719e18cfde989cccd616ae27ee3e77b GIT binary patch literal 12313 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/t_mobile_iot_cdp_integration_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/t_mobile_iot_cdp_integration_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9ca1bf968dd7e44924ffcfa8d437a199887b882 GIT binary patch literal 17794 zcmeI4%X8bt8NdOM1RtUvenhtX3gV1w%e6^6>1$M3BUzFk6I)UwCUw~)FvML^ut5M` zfKsGFInB4x=3Go*&Q0Cw^1 z*n zFUBE`8;OcslttmDKoUfLA`qD-AIFL*5?c_4liHLh2pI)Fg=O6=JJ&6Z5oLaQp`c96 z-Olio8x~V^({Wj~JWxS zzh7H)ETigDRj=3+jMCeItY3d z`;u9PK^Zh_{p*?8!t@A^9!Dt|n&T*N03*Xvpl9k`s<_Kk3A;_fZmXrj(6X5Yk}J7D zk5d+?)>SBh0faXNGAo){)eK`T$CWitm-eb7e&0+R098v|mBW%Bcc`(%WJuT)SPG)8r}>W@7<+kBFIoAD zZt6=GE7SM$)Le0Pj{m%&FXrtvupjgN+|?_2Fc*5+)=Cdyh(pFj6|EsGD33;g<=Qmw zsuivjRkt9S*s8v*7qwJZj0)Lv_L`qkA%pI!>KUk8A?h2f?+Yi4PgS*BHWlv{COwRb9;XkV0x>Ny80A!I*${Kv6-NxiWPx3HlvGigWngp|)z>TF+eY2SJlqEfpsOm1wS}TBfn)r|W70FAxJg_?N=5 z8?AbE6(*8E2u?toGE0Kp_;J*P-(MRo;fU~icJ!MsKU~#V+4198I(ITbkVXNgcP;f@ zG*G08)IdfY6bGfaxIWpQ;qNN9!5bU``S|7D;FkasW$*`o7SXQ38%WPZQQ$}57s8`> z{V0J)t_a>%cBN-APbTt^@LZe{K0W-2w2|CMc}Xv^BC;!PoFu*Epzv7yh3KU`*-MTJ zkIrKLYXX7u716m4XQ?59q``yVa1$hhc}WjXn}f8TFs%S-S)SI*(>{Z=-Y{(u()ut> z7dF!H%@E8ZFgwWOWk~-hv~Qya(z0B(z`h7%ds#BT(|RGTkEA#HdA$VoC8R^WHu}N) z$90{)+9Tmu1WpQHwuRlnWL2}H?cs*X$>-T!SK62a}@Z@J1 z>{A{?kMcN9hMr6O2>R1YlM_$-!K0qk{@C#zwaKiy4i@K;H^{+m#u&N|b{K;r81!P0 zg}@(BZAJ}CBOGf0o#9H&QM!7C!fe8hLdNykn}Ca&sZ>q+Ij}z>Jj|r47A#}Haq{JZ za{ioi9#<^kJh7{H<5ikjpTDa+ID6M;2%IKi2?A3rOy*3vkG}i9vbs!7KIvfA`@0Ih z&)d2FX)D3CR)*8T9?QUPT>ojyGPapxZ}R=j_B`(Qg;fn{U@LYpf6vCY$rS zCd*+Q1N-n}E1JQEAq#Yi25k<~idg_xwpKgq4aQ*Yvjpym=dMn??wDYCN7I9DI-cRQc`mqm*P@N%!)f= zI8MR+GSE%xg&Yq;JPRe(W6YJ|CCUF;pFaQ&YMOo;uxRHZiS1fP8<~*@o7ni7xiOVc5%t&=%^byUi8>(B3&Hpha5=X?C_15VlXVC^bacVk@by zgt9>aoMS(3S-@U7HV}Ra6>u5@d@#!1#z4W~9SqK5fDcdn*v;tzI|oMv_8q)<5reB3 z;M3mi2Qlo2aQZb~`T+#%v-|aMO%~qZ@S@1#Y3DjTB+xEebO2ghjAjF_-=^^%$rdMf zxjzBV9Rs+S*pKP)x-=MD6kYtj!;P&;8C|^SEWEgTPXzDl3$5DwhQ6#(fawxUg2ZAfOh#KIXhRlJv+0|7J^&@ z1bJFVkcETreodC&;0&WEKyJt#pR|(uO59N^f>X!6 zmPPE9I%?wEWsbz$L}Bt)Tf{LA#PQ!caeTOcf7fK~4esyT#v8C5>gs!4fA@y@yNGQY zFXIia;HDA3C*I%!?g0S=|6SQ1Z*XA^2KQ~_jVOI|?e7hx4>x!vo1AZh_lv@f4&EbbSG#*e1G4VO zJ))@IrqLdW8ZX%+inss04jTK~BZ{IL3@r*XI(Uz0geJO>(OHmjV0%Pytb~YhfO|wy zY6uvu|Hl!&D~?Q`-upJv>`PNu`J(=OJ1mKo`=PU#%AueX*R3ddO zRgC&(kMaD&X?6#4W9^r!@a{F#oi)h32!b$aNsixRaufLkW{+B_^{}O6F9Gn%M*+va+;?zp^JajSOS(UBuTC5guW-Uf zClz-R@3CMX?H-6|aLTG%+;lCb&#zAEG++lKUaY!H&H0Inykzh zt@;F-Y5%}-NJZHnHs>9?)^shSy4`4HRAb|4>S&#;}yN7%FMN65FZ=a`Osl%+rzyZo`TRX6J{%^bID zHH+gVTECw@Tb`OET5?txkxg`OsR}?23r{rYkATY5PZII!@qlo<`zfs+$rYbfvGP zHQAFr$-tEv>6$!UOmSKlUjsQB6|r!|l&?5eZGmS{aZTbXvKyC5A3313QoUNSOUu=I zb;0I~*1?ihUvc8pUaD2+ON~`!gGL@YqhZCE8& ztbkF8mcT&8L}S%g4FgYe4dX``hC@SA<&3P!t(`pyt>B?4?-h zkmRMVNGyF-=A)i;9`mvwS8?sP^0)Ggl)SQ*_DG5-=071tm{qe}D;Pj84h@Bjqc2;S z38pWb7c3Bu?yS};OWdy8O-DanE}v^l6L6x=tOc`Kb0_q&E!yj5U92tjW%j#qUt0_{ zh(JX%%<#p-W!|)+yN?_>0*d37$@IfIO=~cGBb@W518Hak*YL9Fzl+~lhO@_rYOy5Hyw#qHmdE_Lw+$M*R zo3`tn_o63>-40zk;P8-{R9&Tiq88pnV^vpSpF#-JxJ_zfshSv?*2Fs)|1%9#r%o>*>R_Hyj@}{1lN>1z_Qe~DySw&jf8em1&2hMQJUI zIt_Uad7i0j1(w6ehrr62^MfqU3ZCj^J77K5HxjwRhOVYW3Gd?# zvf*D1gYieq|2)o&pCHdCa^My@z=# zG;F&?1#8HkO5*9B|!k`3?)eixum-~E!an{Z|*!um7&bgTS+)gg%;2`v(p z0E`g0&`DgMizLdNerd_73t>p@=lb_L=c~b8XV{J5Pxl`S(XPOvH^zmY4(dx^w%e`w znUhoRO_it0*EC<5x7q4!u3I(C{~NNPjfWp_Q|jqt+8TqLrjOCqlpS@`E%$wA?G;>-#2hLvq&<-8jueC zGpTV|l~ck0rgBqLGP0V|5DkL;yDZ(An9L_l~9PmLyoUPtM}N)kQx^7`r$-L7=Ifg&953&W&}WqpiaO9xb|?O zq+r@31Vi&Ie)kq939%?x8k-8@G{4w?3KImyN6o^0&@EII>*TtawEOBwAarZ zt5mFp%eRvp*@47QpPDNBnLu)u`A%HArt#;gdKV?M$>J|k@)9LKri6?U{#KYufL4qU z1(-pc|}%lW|TWq_5G(Q!3Z(KB- z!PfTCSNF6*Hy%lyPxJra^*)({+R&-jTqa1Yr}BSpoj(2w)(H^6!GLMItheippo^;G zFo3^?ev4yf4hB?=An5w>rRu~=JQ|ws0TB5*+V6wSZ}Hb5@9Eah?|7fTPS=4Rdy{g4n#G5YM{Zn6Zl z-4EBlBX9}+{!S)djT{hE3LFqr3LFqr>Np?dv7q7uJFf5!SDml!BYa|E5K;A2` z?Hv9>uH)r zt)rRw8M=^3LtgPjMo8+t=<)6xIR+ zJ9_RGwH-sU*G2-zP(%iSIxJ$Cd@m(0Q?ic|os#{OOi)syFko7 z`-7z2AULYZoKBdG(-R`M@oBB@eDN?8`x3^)eClNZIkg}%CW3-pQ8D+} zSJY)Xdn^S&f@Gh_1Bz$u7eB{8By||Y%_JR1(?7&?b}Q#jw?0`9%X9=we?)U@$8)n` zs2=oL5}-UC11JKVkmN$U0Cu$UacLX_9K|paMNAMyqVT(jH9kOpe}=Gf=1|zUk14WzI-l>2O_!OGAitDjl^t3MKiksK?+r(Tu%|AYt%$1nrCpMdVYXrZ~yv9!v z&-8^Ar+yf$hO%_pBv| zC$uo|XNf)q?C$098t>g#lZaOYp6=~MyuEMgBG)c+!ix{BIRSp7E~7zcUid69EUXnm zBZ3wNoaXQ~9fhE(EFWGez{4~Yg`kR0HoHPlw}=o_Eet``!Vpvq9;Q(df~tifsAIyz zwAK9n@nq=)aX#VjSjeg1(7r1E^yXE3Z}yySy}O!{h*2tHb=RV(5% zn$mg4uD9}JgT%K&`{{F)An+y^Q^US;?(9sNzX{0{XwqVC12L%lXJ|jWqdO3lzNE#2 z#Ai1=3P)|596GY^E}9%Z#xTBtd~_C2*o?`cZEm11R4AO4!df@z%y@I-QaHhBoXiZx zG5Wx`j!&ly!`BRB*=EfemGg#i5g%rUHG_tM@AD0V(`S}^DBW39tK^gi8%GrfPl@wXar~~RY^(2nd;@GZ! z+RpRaMEhcve~#8P`h_MwQ^n{x7D4h;+!A5Sv)j8ryPlv=u7gj#gKxhx_WXH-FpJ)L d4a-*#1@m$QB3N?h>o+Bp*VL4n&ZoAf{}1Y8>C^xK literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/thing_park_integration_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/thing_park_integration_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55736d5599bd2ad7221fcd4de99fe48d141713ff GIT binary patch literal 37419 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/trail_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/trail_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..989a759b0376ba1e7073159644e442c67da4a40f GIT binary patch literal 3359 zcmds3&5zu+6&EFqMx&kaI&R=JHBb-;0%wAFWH(3xEY=IV-mM$7T?g?LCwsj ztr4{(wVPRJFSW1j-(Um11ikdqb8r0vdepV2UVH2%eUJ0uUB_LZ*GQm9isa+_em~jk zMGicV{`zA4_bZO`Pn?{8e3;yWrt!m_k;4ghb24{FF2S*vdn3>G{>X>k&s+0g6cFd3 z!&^Lf?(jggpLwH@dyk!do9z?Fi6}h7SyoK-&m~iwetGbCNbi5~d1P09Ar;LEZB&(- zOct8X_JQRgc%m_}$iyev#Yv6dAnOQX+ zq;ekX6E>X+WjS1rQ_00t6a&~6{R_Lr80-`uXDf59^@GalH#uO zj|Y=`(DaA!5zdH!NnK9BgdOg2|2Y98TCyv@Vs&M4q67%pnA4He6B6imrH7Ygn; z{qy0Y;lU1?QqweNT2mN+nIr`^H}X+46Lcj5MH$wsVCPcFsbcfNQmOkA^lYf$U`;%< zq&a6r#qxYHu$uc)O#WYm*>i`f3nH%{9AkR`P5&4^HE5!8RNFYuoHJ6B+DYKgW9M6P z*mo7Gt%<-}lGN(8?>4>``9uY<@U5dl=>BsY|5k$|#6_0Mc%Bv6M5?LyI2OgRKJSci zo{i&j0nS`}Jh*c^2HzF8N|rtae}j$V1YL7=QH&mn_m(0yXn-W$SRjG_gL2V?NdlLd zB>5?Dp^>AI1SBG-H@t8z1-LuvO@R#>YdE%v_-ezeXHCAy~F2D&}EJ5-g}oZj2p17A~u zae9}cMwjd--147P8qyR@P^3E_T%^&zKm@D?90HLgwZT-F5Bf{LMlN?s29ExU3p$oE z-w@bQ!c+<}$e}D=@rLK@^ZCTa!%AToZ4eNUJkE=rFFx9kTb~0JB3W%uud?Qvzs=@h za~;%z`w~n<31@~Svd9-rXCv>Sb#ZWe55#IdyhKOI2_&&4AxwUKPqo3Jn&9aPQ&Zje zNZk@!emb~#;}UxBp-*Cs3VRW`O0K#-IUT&gu`eNU!PlY4Id4I;zWxswOda%I@N@E# z5XX+(%?Nyd_0PwVA&?zBuX=RXZ~5M_G|Z;sDbf$Q2W=NXXN*! zZq;7x?>a{m_uq9g=PZEMhC4&(JJ3haZ}Ik7mxohw)`PfeJqaKiM|Han>rUORqZ-!h zUhTbTBagNR4sGx8t(UGH0e^MCyMNe*IP9^%{h;IUH6Qz7hNbF)bE+-)G*^>SiCi*n zvp>{z__K=U#AI_JE2Fky*;qv)G2-d|%&0IJHV9 zm&DEC>Gtn#-CvixlFHWTQHU86E2ioJ(f$>im8{aBuEWZT z%V5=epti;X`4oZ!kc0u7%e7G#z^7WQXT2Ge4x!f5Eo5;$*|y9j$4n(l>9lqiJ*+*8@Sg=NZjT7o&R0r2gG+bFN_0t{q>GbAHu1~o(%qd z3U%*w1b11ndo9RR3pnbx5p5J~E|R2)l4LGP>L@3NT5(nqZHlC4 zmv%%`C{B~d_5khML0_DMg91i@z8v%)Xdn9ChXN%~py(;k_Mx`~?L&G=f8XqdyGv4} z6!{`q5;!xvvpX|8GvD|9=9`&s%IS1M!r$dTyT91~Pm=T-y72x*aB&ttgB&K!OH5{= zqP!ZK56Kh`7sK;m;Ya2p@FT_OYHU6xOBW>;WwEa$7SsE_49_bpd`+6@(=N!8lu+@P zT`827jdNvo%n^tE}o_NhFI^leo>C1X)3XdiJ8O$=#AGz#X%=RYuVgf$Xtwz%>to7S(tM1?Spt3^OR^Mvg{4_P z{5Tt6gYXkev0j9qwv%006Pf3pN+9Y@CVpob_D()dxkv=e~3NDRQSW} zdG-SQee6Z{68sVNGJ6I7es+|N!yjc6>=^t5>{T`i{~$Zgrr?jU3_Ah;5POZi4*xKF zgZ&8p5q6Tj3I7@PWA+yOXW83q8vb+a9d-)7%0lRfXBtD-4V_av@p7@Kb5vRFPv$OX zXQ!!W8fw0%8HS1gdR4ocR(N@tYpYXMAGuIQw=q?np>xtp zR+_6?sj3x=Yg3{lT-BF0+y3IcxqJvM==@Qbe&_Ks4#KIUVXG4FGo>%3b-6Crr5x^D zlOD)(6CqB$ppii5&*eoonFuu^hF)CaF+@C&xB~CHYKCga$dn5Ca%QzqDlC=xvi?R! zFWoV`w3R6q7BiJK&}Qk4snqYM!oVvCt{09=b2F z@YgaQu1hyjCrfex_kJb+T)rj+@2rRG#IGXS--BN)M5|I-TBjE$9d=itt|=Zv z-QGT(R+o7CD%1U!; zSvSWgtlmv!ovvu;?#&d`#d5jmCSb>cldE=S(;{$*spG`L3tVT-?54SHRymmHT)EWz z9?C`hU0M<}WLGj#D2NFB(_3A|wMjQ~=RH(AC2NScZNcGujr(x6F^a0B=W@i0b4)X} zT)9+SYsB4p29bpE`HiEUYBYBj?Av;u*#3hE??dlv^x5Cuh~2uY@nxeCq0|M9Sx%gu zI@l@I7pWVQj8^&+@~}J{ipaHN*Mq#PV>A0mV*tqv;YXxlM5t%W%QAI!5Ju>0S(Zcy zBw~jmZYWA2QwB4Mn4$aOdW6Nsq_5=*(&xiJ39U!hWA$h~d`IRPGs61n(NXD3`FG`d ztRAUHPf53*r{_--Ax7@V#tg3HF^MT)P_t%~#p&6CwBCoGBA$`>HS3wW!V;&XWobQ* zxCHzp{1j8x(=3US_k(O>H~UzMrRz#PUQg81^<*9K_5OO~zCzz5e0-7cBdq`HkO<*> z>V0hB_Xj}agW7-WRw55{$vv89meeKYz=;xgnw%7z#$c|(^53;GrSQa$>zag;Et&8|8T_gwADM+Jkp zvdf-`DFS+etwQE-b;0Hy3+mk!y(E|(J-yH=#f3(U-nhiR8@O?N#zxEn&we*7q%Xy0 z?pe>QH)0oNKb+0ZW*;OPk;O7wn@?8Ckk%r9qY+&y6m?@h4Jl9o5Z80&T19W935e$m z-82coH*1iOQe7UPx*X0Es1oo!2iUNxnZ|>7Bc@e=npq=OEQ5I)jj&Ppq7esN;P|Z? zjd&Kx&vIVojl?Hfv1)|{C}}9f?g=CCeq``qK=4+p38_(lW)N)`J7)V~G)p6VM=Nrb z9!XX-l-rI=VFba~oU8N-1Sa5!9hsyuI~N0@w7EMP&xz`2B&nk8SpFPR4)AhLZ1yeu zjCnY*fdtSC{l`M1vLc79|L-H;Cn7Of2_@vv_ev;&e??BoIa65nll) zL@0=m3{gSuNrXUvOfEJdUM2n>E&>uvP!KZ)2t;Fz$qg$n(4+VuUI`FF0Nlh`gbfLp6K59885S^SpY}gb15pS1 zhRH5)QgGA~rv8PQsT8$BsS%sW=k6DFi)A z*sDkJ-dm58+3pGVLgai znxMGbM2!dq1>5EOKwJU7(SS-B@MnV@{su2uTA|^DJR*;fR_OH(y8xYh2qc;C7=n4 z-jVonJ%Lj7qPt24O0d6@!u_QIZt=G>cn0DuB8X0qT-$KS13mK;3}QT`4q6A~aV?fVosX&Bp2| zCqNwOuE-})M}CAI0;r=9fjWg97NG8k_UBIxTMbavxJylYTz1EES+K~n#0O{KG?E^9 z(@6UyN+TgIg~Vv5d9sk~)h!~~4LGGJ-dt_I8=`ePWl&+)jiWD!Z|@G7DTB?Y{T|h; zfXtTY<`?Nk$}67v`*bT#w}cdKD3le!i0{J3GROFj5p5ytS%I(}^dlznjC=1kalxcF zS#co}oOIF?fptzQvPSBPN3>gToYSP;gF#Efcb0OcUSSE#V-$LooJn$ylcSO|MNWpC z6Xd)`&g75YVf#5;(0q!3?IfiMwvRZly&hf)1Gq>0z}Bh(jM)vi-RZS0nB9#a zeIWJJM-JdUC74#7iw<+8eh@E;x(EBWbw;>VANne>aHm~@{U<<_6EO?&C*9`@tSR9- z1OFo%SGoJ_FcgLS4i9j{2+TU3u{7{LKfhs zkOlZD)CBx70r+D+z~8s7)B)~Yz~5&Beg(sTJ^}dgya4<$0r+EW0YAlEsmEFYKR`ak z{Si7bCfIvPC5Xg_PXD~pZ5DgIG z>{&5DcuxDj-Os!O#5eBt{ykn!%X3KA%8{|j(mQH;6Tjc$Vo_x%EE2ld_PK=KRX3u~WrOWs8{n@gN(uJ&;+iEk?1`GoU5 zmlzifbIEO;4=688&_=n_tL{4)sa@9W=xz|i={RfRq_#E=_3`i!1tN}@&C(+^q zzKx@jt4NQLoc{^|Wn?p>67T55T1yZdozV5BM<}N^hcE)X*atYgqZ9ryJ`gJn{?QUo zS-qr{%o&D-raN^?z!aa5)5JG4A=kKl|FOv;H-BRMRLgr~iYI0&;TYll4jm^zNzRZW z?zX2#pb0j#k9d)P2C{K@gAD!xe1>1gOSR+eX}m+hd^GJHMDS0Drk~UPYq!&MplS9< z+*t{}2Q~SpM1^O`*%Z|LXlqcj1Br@K^soTKX>;^NN+>mLTSwfS6VSnR`w`4+mZbde3&l%NyvIe@krtw-KnF+7#OlFg@QQJkmKk zdS_=1>2Ht^qz~nBZVi~D%`Q5c!WY}Ep3J>7Bs;4per|CM%S1hpPTYJF7miY8KmG+0 zM>|zqpbNEKGNR3lWM9?eDDm5HC>@sEk1P9e~4Cqbv& z1HH;eUtOd?wtNd)Saz@&FzEw!f*1e{f0Cp?pxy#qsEZT`y!?xvq(I;$UoY(<1+u%W zmj-J4$rS^SzSBNLDG=y@+aLu3DYlgYwS#RIzl#@zXy9*y*>{r+KgBbD+LL4mlqk^A zd}~X+%gOm^1byU5Gc%8u4F z8l-B3?FoELZkfKuuXhZ@Jf?-Jfl^GX)(xljyKg$P*Q;KE5?`fla$UBck+OeU6;E%R z_S3w`DcibW^`wItHttmc%5&zK2LjFPnbYbx+x$vzIW7}}5EIXDT?gN6-T80vhK)$U z#~<3wK_7k!`9q*3#{(_6$1X74Eua@v^b*^}4{-7+KDvmxl~mJQWy?XzC8+2V&Z(mwIKg(Z|X1U~en zlDX%(xWpdLOn0FBZTC#~BI^BTBxl4-_r*EIuWq+65GjIEzz|L z%%k3Ll*h)SF=;?N0|3}?%tjh*fudt1pja@>�Y0fBbVF6Fwm1tHVH#ny}48D$d7t z-W+tObE1DoJzdyRn(WfkeP!`=XYag-aRmMN$+HfLZ8LG(LgbBl925b?%$Br8vVpwwmQ)l7R6w{}Q;1|s%P^q#5}$(@$3UZNd|4Q| zZrX|_E7w2FG_?a7da3LME!oq6vxYDBhv7ApDv-O5{XQ!SEK}EM@uqAHE?)NxZwto0SdqOcdDT2X1Ac26kgL=!r z3H4vqfX#5PE#OtHP=vKW+-;ht{s{NnQNKsU8_*R7rmC86IBxJ$2K*Ux&CV)=k#;Hlp)2VJ-6JJlp)dDO#I$?WM-@JW!90zIA< z%1;q#+_CZ!7=e@v1GcT^L7Xo`>IQ`k*>{G4Cic13o8xSR?e|%49u?M`69Pp|G==8ap~tTji}QNQut=Jgxx zn2IRCT2xAb<5S6Uz>#YRZ|0wE1(|NGQXd7!6`iypT}^!zr-(vEOt3ub}4QRiHD zYg?jiT3|~6Yz0}yf`vL>a#4q1UjFg!y?4c1>%5GwwkKkqN6?vw5tXss6EPKJFo@ke zn>^bpI1$tJEQ>aFal5refGB*7vmGdyr2&<-|L8mpT_XsGQ^|JjoC?0hQt0HHUlW*9 z5eT7*kv>*cJQ{XkXXdQn=%(utkGCnm^?qwJxw@LidU|Lp)_AkW#t8J;wp(G3_Lx?d z$Wlz;;K(`qq|i1;#Pyh(k9>T%LlwA#g_c9MrpKDG2|F`3;t)|`A6A57G{@sRI<(I- zi_<(hlr%j!ZXs}VC~127+@nKD(?dsx`i_QhG(GmhkgW9#jz~yaM~AYI(A?x*?N6vJ z8X+A|^R%tLmeaQ4_MxI=ZE zg#pmk=dJZDt@m4yR9nj#1`yCqVzsnUT7d?=^Awg>J<_zu>8M9~IN|gC>#bV(-kKyp zh8zW!CZ4C$)k`>8HkWH8a=Fzqs}?Do%H?k3OnN(}FPCHGd@jdHmhcgBi2w7G%|2&yhpb#5Hmj$YJCxlCwe%E$rbp$)Tx1zDf=$ zpg1Ro&?Yy@p<4IsH50qe;&hLY-2wazDvu&X2Rf+Ix?} zBg%|&K)FiKr$$9um?)(KA*glyE9E68?V`-yDVj literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/user_permissions_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/user_permissions_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb3b2b4bf8a819771834147c84d8358e83a54ec7 GIT binary patch literal 3595 zcmd^C&5zs073Yu?MQJ6k;~H)a1i=(W;>d_ar$Jj_v0iv%Z(SqE+Q_OvAhaMxoRLJE z;&5lk-ALdbTKn4k4Qn8mpy&P}J@mp;f%cMXj=4DRjVNW;abgrXhQe@$^YOmlo1bL2 z+qU3&_|MbPzc(%GzxZ+XapB_*G>tEA4J}T%osgM5vMovR|s zW0`6?mB%!flok0@s(2x&5{HG*xu#hnm=^RX)^Sd^8J#LIzI}a~=h;>epLs<6t)yIk>(8f(u_^ScEEP}lwPB$JY-vR@3*(!Ukdp! z6DdecbtWQuB$S2|Tl6>mTSkSu5{N|k7U(gScg_o9HryAfP%Iamj^EEWVq>ph$$f z&OQ!&+<~TVz)M&|0xq>V0T;Ho!`){DoM_xOZ15)cpIJkX+u*o%_2!?nP>+O~#Ts?h zsG^cdA{202{A2&&U~dbZs%exkttkw^VUmKtYfWiB6|~ldqBg5l@OY-=M6p?aY2JGh zES^)r!LN8|Npr^1f+fkkZ*2I982`VfGw1dr8`sb+3HwN6M$ zN-Kn!1M5q&-?J4Ouxdlxgpsju&#qi8lCkn&;Y&;T(0%jQ0F9-CG>&92i_>^4)kJ&{ zi1bLG4a*>jM?p4+uuebdzke%$C>A#}7CnK;gN>sQgS2K8V5}nFOaui`hkosgFj_k! zgf0DSUio1NeDg4T3k1?AoKHN`CX2U!%#Z!msR+_^{h-cR2R?$Pe+MrPX5scWnCjHx z&U2#PD6PkYH)5Fif_zR6tn=R|c8Njcv3~*CiO6@8L>>!%CYoNAVs(|!bSA(;oX*%2 z0YOFeJdLJGrn1oVkAuOZRXKoEqFjtwk>q_kkY+z+sqs0|Vn1~7y;U8_FmTN_u>9fe zfhxrM^v=!>M4}Rm)7un{40?nRjHt*tUlbY&TL`P~o~P71M+!U(assI(O{Dg2ZyEb2 z>sH1f8NQQ+j-*W11h$mO3kCJ&`-Xe~1!uhvDVgWN*kn;{NX$`?9E#6blO*%^zJGAZ zNSo7j)m=%v-aM$TfVohh5DQtzSN()^_1Bl)@!BETKI| zH6iXQ@5wP!6J5E;!;oCQTDbV@*HXQP0gU&Z-))nN9zo*Nb1sf@0`-x2;2p`)^yZb>cy50#6_M7W8fCH+b`;1L@c}^|(I)Im#Aq zZCkuOAtzm&f8697yi+zyzigGAvR!WQZrLrJQy--^J;-c&hhKPZn-NG{dVKTmn~>HQ z*?)dcY5h`Y{#>$Lbs(PA2E3|^VWvbP88`P1zzmqFi$j>lGa-vy0hY8D2lwF)XDKaG z@fqMGggZ~f{8$3ygETf!i(Y?QUq^IT*QVDd-2TG35!|S}-6#@SzS#Wq=5CD(4Qg9l zGZ*EV%Q2{n^qJeHa_;X9hF4x)JqG}G+>zw-;YKFm`ZbkUSB-I;2tDjV;m!d5h%ldL zqUs_j4YkN~M6=)7NL@l}{Q|9ZDMFNFplk>@V8(LYYgHc0073G~OC;1{T{$}btZKpi zub|Cz)fxc#J*A{F$YOXIKn4&Ar*Hwm<|WhF zVExKDVu`v6+d)4D!Y|i`9e~tozWVCceCovw6nwR|X+#c>mcp$#|$f1Z7X_{3iRUbrvXu18#Z{e!Uw721E{x!BkH*1ZpB+vdFY_2T27 zR>fb+Y1IHZdrbsUDVvEftlD8Xle|c9+zG=&fT8tDGYsKxLl`Q&R}@x%qwX0KAS6_H zLn#DNzl65DgDjV{J-^YpZ036{^$si{r*Q$7DR5GVODkIm^(G94SI+~&K7zp|2wkF5 iPmUf#h!|?GVqf{&OC5F)+-b~b*Y31^+jlzlW#?N?nkT^k literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/white_labeling_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/white_labeling_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a1fbe2749a21ecec6ea11ffff6e105d9bef58a4 GIT binary patch literal 23107 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/admin_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/admin_controller_api.py new file mode 100644 index 0000000..4911da2 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/admin_controller_api.py @@ -0,0 +1,680 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class AdminControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def check_updates_using_get(self, **kwargs): # noqa: E501 + """checkUpdates # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_updates_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: UpdateMessage + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.check_updates_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.check_updates_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def check_updates_using_get_with_http_info(self, **kwargs): # noqa: E501 + """checkUpdates # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_updates_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: UpdateMessage + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method check_updates_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/updates', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='UpdateMessage', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_admin_settings_using_get(self, key, **kwargs): # noqa: E501 + """getAdminSettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_admin_settings_using_get(key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str key: key (required) + :param bool system_by_default: systemByDefault + :return: AdminSettings + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_admin_settings_using_get_with_http_info(key, **kwargs) # noqa: E501 + else: + (data) = self.get_admin_settings_using_get_with_http_info(key, **kwargs) # noqa: E501 + return data + + def get_admin_settings_using_get_with_http_info(self, key, **kwargs): # noqa: E501 + """getAdminSettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_admin_settings_using_get_with_http_info(key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str key: key (required) + :param bool system_by_default: systemByDefault + :return: AdminSettings + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['key', 'system_by_default'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_admin_settings_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'key' is set + if ('key' not in params or + params['key'] is None): + raise ValueError("Missing the required parameter `key` when calling `get_admin_settings_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'key' in params: + path_params['key'] = params['key'] # noqa: E501 + + query_params = [] + if 'system_by_default' in params: + query_params.append(('systemByDefault', params['system_by_default'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/settings/{key}{?systemByDefault}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='AdminSettings', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_security_settings_using_get(self, **kwargs): # noqa: E501 + """getSecuritySettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_security_settings_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: SecuritySettings + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_security_settings_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_security_settings_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_security_settings_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getSecuritySettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_security_settings_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: SecuritySettings + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_security_settings_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/securitySettings', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SecuritySettings', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_admin_settings_using_post(self, body, **kwargs): # noqa: E501 + """saveAdminSettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_admin_settings_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AdminSettings body: adminSettings (required) + :return: AdminSettings + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_admin_settings_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_admin_settings_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_admin_settings_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveAdminSettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_admin_settings_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AdminSettings body: adminSettings (required) + :return: AdminSettings + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_admin_settings_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_admin_settings_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/settings', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='AdminSettings', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_security_settings_using_post(self, body, **kwargs): # noqa: E501 + """saveSecuritySettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_security_settings_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SecuritySettings body: securitySettings (required) + :return: SecuritySettings + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_security_settings_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_security_settings_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_security_settings_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveSecuritySettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_security_settings_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SecuritySettings body: securitySettings (required) + :return: SecuritySettings + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_security_settings_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_security_settings_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/securitySettings', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SecuritySettings', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def send_test_mail_using_post(self, body, **kwargs): # noqa: E501 + """sendTestMail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_test_mail_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AdminSettings body: adminSettings (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.send_test_mail_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.send_test_mail_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def send_test_mail_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """sendTestMail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_test_mail_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AdminSettings body: adminSettings (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method send_test_mail_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `send_test_mail_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/settings/testMail', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def send_test_sms_using_post(self, body, **kwargs): # noqa: E501 + """sendTestSms # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_test_sms_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param TestSmsRequest body: testSmsRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.send_test_sms_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.send_test_sms_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def send_test_sms_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """sendTestSms # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_test_sms_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param TestSmsRequest body: testSmsRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method send_test_sms_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `send_test_sms_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/settings/testSms', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/asset_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/asset_controller_api.py new file mode 100644 index 0000000..ed58d03 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/asset_controller_api.py @@ -0,0 +1,1164 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class AssetControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_asset_using_delete(self, asset_id, **kwargs): # noqa: E501 + """deleteAsset # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_asset_using_delete(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_asset_using_delete_with_http_info(asset_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_asset_using_delete_with_http_info(asset_id, **kwargs) # noqa: E501 + return data + + def delete_asset_using_delete_with_http_info(self, asset_id, **kwargs): # noqa: E501 + """deleteAsset # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_asset_using_delete_with_http_info(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['asset_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_asset_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'asset_id' is set + if ('asset_id' not in params or + params['asset_id'] is None): + raise ValueError("Missing the required parameter `asset_id` when calling `delete_asset_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'asset_id' in params: + path_params['assetId'] = params['asset_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/asset/{assetId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_query_using_post(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AssetSearchQuery body: query (required) + :return: list[Asset] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_query_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.find_by_query_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def find_by_query_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AssetSearchQuery body: query (required) + :return: list[Asset] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_query_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_by_query_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/assets', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Asset]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_asset_by_id_using_get(self, asset_id, **kwargs): # noqa: E501 + """getAssetById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_asset_by_id_using_get(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_asset_by_id_using_get_with_http_info(asset_id, **kwargs) # noqa: E501 + else: + (data) = self.get_asset_by_id_using_get_with_http_info(asset_id, **kwargs) # noqa: E501 + return data + + def get_asset_by_id_using_get_with_http_info(self, asset_id, **kwargs): # noqa: E501 + """getAssetById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_asset_by_id_using_get_with_http_info(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['asset_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_asset_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'asset_id' is set + if ('asset_id' not in params or + params['asset_id'] is None): + raise ValueError("Missing the required parameter `asset_id` when calling `get_asset_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'asset_id' in params: + path_params['assetId'] = params['asset_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/asset/{assetId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Asset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_asset_types_using_get(self, **kwargs): # noqa: E501 + """getAssetTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_asset_types_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_asset_types_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_asset_types_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_asset_types_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getAssetTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_asset_types_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_asset_types_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/asset/types', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntitySubtype]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_assets_by_entity_group_id_using_get(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getAssetsByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_assets_by_entity_group_id_using_get(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_assets_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_assets_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_assets_by_entity_group_id_using_get_with_http_info(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getAssetsByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_assets_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_assets_by_entity_group_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `get_assets_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_assets_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_assets_by_entity_group_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/assets{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAsset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_assets_by_ids_using_get(self, asset_ids, **kwargs): # noqa: E501 + """getAssetsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_assets_by_ids_using_get(asset_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_ids: assetIds (required) + :return: list[Asset] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_assets_by_ids_using_get_with_http_info(asset_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_assets_by_ids_using_get_with_http_info(asset_ids, **kwargs) # noqa: E501 + return data + + def get_assets_by_ids_using_get_with_http_info(self, asset_ids, **kwargs): # noqa: E501 + """getAssetsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_assets_by_ids_using_get_with_http_info(asset_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_ids: assetIds (required) + :return: list[Asset] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['asset_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_assets_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'asset_ids' is set + if ('asset_ids' not in params or + params['asset_ids'] is None): + raise ValueError("Missing the required parameter `asset_ids` when calling `get_assets_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'asset_ids' in params: + query_params.append(('assetIds', params['asset_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/assets{?assetIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Asset]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_assets_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerAssets # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_assets_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_assets_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_assets_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_assets_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerAssets # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_assets_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_assets_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_assets_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_assets_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_assets_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/assets{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAsset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_asset_using_get(self, asset_name, **kwargs): # noqa: E501 + """getTenantAsset # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_asset_using_get(asset_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_name: assetName (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_asset_using_get_with_http_info(asset_name, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_asset_using_get_with_http_info(asset_name, **kwargs) # noqa: E501 + return data + + def get_tenant_asset_using_get_with_http_info(self, asset_name, **kwargs): # noqa: E501 + """getTenantAsset # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_asset_using_get_with_http_info(asset_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_name: assetName (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['asset_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_asset_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'asset_name' is set + if ('asset_name' not in params or + params['asset_name'] is None): + raise ValueError("Missing the required parameter `asset_name` when calling `get_tenant_asset_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'asset_name' in params: + query_params.append(('assetName', params['asset_name'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/assets{?assetName}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Asset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_assets_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantAssets # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_assets_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_assets_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_assets_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_assets_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantAssets # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_assets_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_assets_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_assets_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_assets_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/assets{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAsset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_assets_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getUserAssets # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_assets_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_assets_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_user_assets_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_user_assets_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getUserAssets # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_assets_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_assets_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_user_assets_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_user_assets_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/assets{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAsset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_asset_using_post(self, body, **kwargs): # noqa: E501 + """saveAsset # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_asset_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Asset body: asset (required) + :param str entity_group_id: entityGroupId + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_asset_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_asset_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_asset_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveAsset # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_asset_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Asset body: asset (required) + :param str entity_group_id: entityGroupId + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_asset_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_asset_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'entity_group_id' in params: + query_params.append(('entityGroupId', params['entity_group_id'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/asset{?entityGroupId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Asset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/billing_endpoint_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/billing_endpoint_controller_api.py new file mode 100644 index 0000000..59f407f --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/billing_endpoint_controller_api.py @@ -0,0 +1,854 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class BillingEndpointControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def check_tenant_can_update_plan_using_post(self, body, **kwargs): # noqa: E501 + """checkTenantCanUpdatePlan # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_tenant_can_update_plan_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: canUpdatePlanRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.check_tenant_can_update_plan_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.check_tenant_can_update_plan_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def check_tenant_can_update_plan_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """checkTenantCanUpdatePlan # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_tenant_can_update_plan_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: canUpdatePlanRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method check_tenant_can_update_plan_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `check_tenant_can_update_plan_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/billingEndpoint/tenantCanUpdatePlan', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def notify_tenant_plan_changed_using_post(self, body, **kwargs): # noqa: E501 + """notifyTenantPlanChanged # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.notify_tenant_plan_changed_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: tenantPlanChangedRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.notify_tenant_plan_changed_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.notify_tenant_plan_changed_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def notify_tenant_plan_changed_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """notifyTenantPlanChanged # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.notify_tenant_plan_changed_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: tenantPlanChangedRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method notify_tenant_plan_changed_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `notify_tenant_plan_changed_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/billingEndpoint/tenantPlanChanged', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def notify_tenant_state_changed_using_post(self, body, **kwargs): # noqa: E501 + """notifyTenantStateChanged # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.notify_tenant_state_changed_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: tenantStateChangedRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.notify_tenant_state_changed_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.notify_tenant_state_changed_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def notify_tenant_state_changed_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """notifyTenantStateChanged # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.notify_tenant_state_changed_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: tenantStateChangedRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method notify_tenant_state_changed_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `notify_tenant_state_changed_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/billingEndpoint/tenantStateChanged', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def send_account_activated_email_using_post(self, body, **kwargs): # noqa: E501 + """sendAccountActivatedEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_account_activated_email_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: sendAccountActivatedEmailRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.send_account_activated_email_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.send_account_activated_email_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def send_account_activated_email_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """sendAccountActivatedEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_account_activated_email_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: sendAccountActivatedEmailRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method send_account_activated_email_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `send_account_activated_email_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/billingEndpoint/sendAccountActivated', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def send_activation_email_using_post(self, body, **kwargs): # noqa: E501 + """sendActivationEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_activation_email_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: sendActivationEmailRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.send_activation_email_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.send_activation_email_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def send_activation_email_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """sendActivationEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_activation_email_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: sendActivationEmailRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method send_activation_email_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `send_activation_email_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/billingEndpoint/sendActivation', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def send_password_was_reset_email_using_post(self, body, **kwargs): # noqa: E501 + """sendPasswordWasResetEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_password_was_reset_email_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: sendPassowordWasResetEmailRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.send_password_was_reset_email_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.send_password_was_reset_email_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def send_password_was_reset_email_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """sendPasswordWasResetEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_password_was_reset_email_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: sendPassowordWasResetEmailRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method send_password_was_reset_email_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `send_password_was_reset_email_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/billingEndpoint/sendPasswordWasReset', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def send_reset_password_email_using_post(self, body, **kwargs): # noqa: E501 + """sendResetPasswordEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_reset_password_email_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: sendResetPasswordEmailRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.send_reset_password_email_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.send_reset_password_email_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def send_reset_password_email_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """sendResetPasswordEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_reset_password_email_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: sendResetPasswordEmailRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method send_reset_password_email_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `send_reset_password_email_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/billingEndpoint/sendResetPassword', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def tenant_has_billing_read_using_get(self, **kwargs): # noqa: E501 + """tenantHasBillingRead # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.tenant_has_billing_read_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.tenant_has_billing_read_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.tenant_has_billing_read_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def tenant_has_billing_read_using_get_with_http_info(self, **kwargs): # noqa: E501 + """tenantHasBillingRead # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.tenant_has_billing_read_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method tenant_has_billing_read_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/billingEndpoint/tenant/permission/billing/read', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def tenant_has_billing_write_using_get(self, **kwargs): # noqa: E501 + """tenantHasBillingWrite # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.tenant_has_billing_write_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.tenant_has_billing_write_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.tenant_has_billing_write_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def tenant_has_billing_write_using_get_with_http_info(self, **kwargs): # noqa: E501 + """tenantHasBillingWrite # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.tenant_has_billing_write_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method tenant_has_billing_write_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/billingEndpoint/tenant/permission/billing/write', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/blob_entity_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/blob_entity_controller_api.py new file mode 100644 index 0000000..41e1a7b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/blob_entity_controller_api.py @@ -0,0 +1,526 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class BlobEntityControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_blob_entity_using_delete(self, blob_entity_id, **kwargs): # noqa: E501 + """deleteBlobEntity # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_blob_entity_using_delete(blob_entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str blob_entity_id: blobEntityId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_blob_entity_using_delete_with_http_info(blob_entity_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_blob_entity_using_delete_with_http_info(blob_entity_id, **kwargs) # noqa: E501 + return data + + def delete_blob_entity_using_delete_with_http_info(self, blob_entity_id, **kwargs): # noqa: E501 + """deleteBlobEntity # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_blob_entity_using_delete_with_http_info(blob_entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str blob_entity_id: blobEntityId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['blob_entity_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_blob_entity_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'blob_entity_id' is set + if ('blob_entity_id' not in params or + params['blob_entity_id'] is None): + raise ValueError("Missing the required parameter `blob_entity_id` when calling `delete_blob_entity_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'blob_entity_id' in params: + path_params['blobEntityId'] = params['blob_entity_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/blobEntity/{blobEntityId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def download_blob_entity_using_get(self, blob_entity_id, **kwargs): # noqa: E501 + """downloadBlobEntity # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.download_blob_entity_using_get(blob_entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str blob_entity_id: blobEntityId (required) + :return: Resource + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.download_blob_entity_using_get_with_http_info(blob_entity_id, **kwargs) # noqa: E501 + else: + (data) = self.download_blob_entity_using_get_with_http_info(blob_entity_id, **kwargs) # noqa: E501 + return data + + def download_blob_entity_using_get_with_http_info(self, blob_entity_id, **kwargs): # noqa: E501 + """downloadBlobEntity # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.download_blob_entity_using_get_with_http_info(blob_entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str blob_entity_id: blobEntityId (required) + :return: Resource + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['blob_entity_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method download_blob_entity_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'blob_entity_id' is set + if ('blob_entity_id' not in params or + params['blob_entity_id'] is None): + raise ValueError("Missing the required parameter `blob_entity_id` when calling `download_blob_entity_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'blob_entity_id' in params: + path_params['blobEntityId'] = params['blob_entity_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/blobEntity/{blobEntityId}/download', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Resource', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_blob_entities_by_ids_using_get(self, blob_entity_ids, **kwargs): # noqa: E501 + """getBlobEntitiesByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_blob_entities_by_ids_using_get(blob_entity_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str blob_entity_ids: blobEntityIds (required) + :return: list[BlobEntityInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_blob_entities_by_ids_using_get_with_http_info(blob_entity_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_blob_entities_by_ids_using_get_with_http_info(blob_entity_ids, **kwargs) # noqa: E501 + return data + + def get_blob_entities_by_ids_using_get_with_http_info(self, blob_entity_ids, **kwargs): # noqa: E501 + """getBlobEntitiesByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_blob_entities_by_ids_using_get_with_http_info(blob_entity_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str blob_entity_ids: blobEntityIds (required) + :return: list[BlobEntityInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['blob_entity_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_blob_entities_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'blob_entity_ids' is set + if ('blob_entity_ids' not in params or + params['blob_entity_ids'] is None): + raise ValueError("Missing the required parameter `blob_entity_ids` when calling `get_blob_entities_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'blob_entity_ids' in params: + query_params.append(('blobEntityIds', params['blob_entity_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/blobEntities{?blobEntityIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[BlobEntityInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_blob_entities_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getBlobEntities # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_blob_entities_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int page_size: pageSize (required) + :param int page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataBlobEntityWithCustomerInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_blob_entities_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_blob_entities_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_blob_entities_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getBlobEntities # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_blob_entities_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int page_size: pageSize (required) + :param int page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataBlobEntityWithCustomerInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_blob_entities_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_blob_entities_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_blob_entities_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/blobEntities{?pageSize,page,type,textSearch,sortProperty,sortOrder,startTime,endTime}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataBlobEntityWithCustomerInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_blob_entity_info_by_id_using_get(self, blob_entity_id, **kwargs): # noqa: E501 + """getBlobEntityInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_blob_entity_info_by_id_using_get(blob_entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str blob_entity_id: blobEntityId (required) + :return: BlobEntityWithCustomerInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_blob_entity_info_by_id_using_get_with_http_info(blob_entity_id, **kwargs) # noqa: E501 + else: + (data) = self.get_blob_entity_info_by_id_using_get_with_http_info(blob_entity_id, **kwargs) # noqa: E501 + return data + + def get_blob_entity_info_by_id_using_get_with_http_info(self, blob_entity_id, **kwargs): # noqa: E501 + """getBlobEntityInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_blob_entity_info_by_id_using_get_with_http_info(blob_entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str blob_entity_id: blobEntityId (required) + :return: BlobEntityWithCustomerInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['blob_entity_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_blob_entity_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'blob_entity_id' is set + if ('blob_entity_id' not in params or + params['blob_entity_id'] is None): + raise ValueError("Missing the required parameter `blob_entity_id` when calling `get_blob_entity_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'blob_entity_id' in params: + path_params['blobEntityId'] = params['blob_entity_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/blobEntity/info/{blobEntityId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='BlobEntityWithCustomerInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/chirp_stack_integration_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/chirp_stack_integration_controller_api.py new file mode 100644 index 0000000..9be8639 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/chirp_stack_integration_controller_api.py @@ -0,0 +1,824 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class ChirpStackIntegrationControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def process_request_using_delete(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_delete(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_delete_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_delete_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_delete_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_delete_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_delete`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_delete`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/chirpstack/{routingKey}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_get(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_get(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_get_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_get_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_get_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_get_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_get`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_get`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/chirpstack/{routingKey}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_head(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_head(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_head_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_head_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_head_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_head_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_head" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_head`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_head`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_head`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/chirpstack/{routingKey}', 'HEAD', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_options(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_options(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_options_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_options_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_options_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_options_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_options" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_options`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_options`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_options`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/chirpstack/{routingKey}', 'OPTIONS', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_patch(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_patch(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_patch_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_patch_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_patch_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_patch_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_patch" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_patch`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_patch`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_patch`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/chirpstack/{routingKey}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_post(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_post_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_post_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_post_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_post`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_post`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/chirpstack/{routingKey}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_put(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_put(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_put_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_put_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_put_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_put_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_put" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_put`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_put`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_put`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/chirpstack/{routingKey}', 'PUT', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/cloud_endpoint_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/cloud_endpoint_controller_api.py new file mode 100644 index 0000000..e9b1218 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/cloud_endpoint_controller_api.py @@ -0,0 +1,284 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class CloudEndpointControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def tenant_has_white_label_read_using_get(self, **kwargs): # noqa: E501 + """tenantHasWhiteLabelRead # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.tenant_has_white_label_read_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.tenant_has_white_label_read_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.tenant_has_white_label_read_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def tenant_has_white_label_read_using_get_with_http_info(self, **kwargs): # noqa: E501 + """tenantHasWhiteLabelRead # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.tenant_has_white_label_read_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method tenant_has_white_label_read_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/cloudEndpoint/tenant/permission/whiteLabel/read', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def tenant_has_white_label_write_using_get(self, **kwargs): # noqa: E501 + """tenantHasWhiteLabelWrite # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.tenant_has_white_label_write_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.tenant_has_white_label_write_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.tenant_has_white_label_write_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def tenant_has_white_label_write_using_get_with_http_info(self, **kwargs): # noqa: E501 + """tenantHasWhiteLabelWrite # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.tenant_has_white_label_write_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method tenant_has_white_label_write_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/cloudEndpoint/tenant/permission/whiteLabel/write', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def tenant_white_labeling_allowed_using_get(self, **kwargs): # noqa: E501 + """tenantWhiteLabelingAllowed # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.tenant_white_labeling_allowed_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.tenant_white_labeling_allowed_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.tenant_white_labeling_allowed_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def tenant_white_labeling_allowed_using_get_with_http_info(self, **kwargs): # noqa: E501 + """tenantWhiteLabelingAllowed # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.tenant_white_labeling_allowed_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method tenant_white_labeling_allowed_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/cloudEndpoint/tenant/permission/whiteLabelingAllowed', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/converter_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/converter_controller_api.py new file mode 100644 index 0000000..c28cb95 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/converter_controller_api.py @@ -0,0 +1,805 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class ConverterControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_converter_using_delete(self, converter_id, **kwargs): # noqa: E501 + """deleteConverter # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_converter_using_delete(converter_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str converter_id: converterId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_converter_using_delete_with_http_info(converter_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_converter_using_delete_with_http_info(converter_id, **kwargs) # noqa: E501 + return data + + def delete_converter_using_delete_with_http_info(self, converter_id, **kwargs): # noqa: E501 + """deleteConverter # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_converter_using_delete_with_http_info(converter_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str converter_id: converterId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['converter_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_converter_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'converter_id' is set + if ('converter_id' not in params or + params['converter_id'] is None): + raise ValueError("Missing the required parameter `converter_id` when calling `delete_converter_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'converter_id' in params: + path_params['converterId'] = params['converter_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/converter/{converterId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_converter_by_id_using_get(self, converter_id, **kwargs): # noqa: E501 + """getConverterById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_converter_by_id_using_get(converter_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str converter_id: converterId (required) + :return: Converter + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_converter_by_id_using_get_with_http_info(converter_id, **kwargs) # noqa: E501 + else: + (data) = self.get_converter_by_id_using_get_with_http_info(converter_id, **kwargs) # noqa: E501 + return data + + def get_converter_by_id_using_get_with_http_info(self, converter_id, **kwargs): # noqa: E501 + """getConverterById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_converter_by_id_using_get_with_http_info(converter_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str converter_id: converterId (required) + :return: Converter + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['converter_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_converter_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'converter_id' is set + if ('converter_id' not in params or + params['converter_id'] is None): + raise ValueError("Missing the required parameter `converter_id` when calling `get_converter_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'converter_id' in params: + path_params['converterId'] = params['converter_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/converter/{converterId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Converter', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_converters_by_ids_using_get(self, converter_ids, **kwargs): # noqa: E501 + """getConvertersByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_converters_by_ids_using_get(converter_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str converter_ids: converterIds (required) + :return: list[Converter] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_converters_by_ids_using_get_with_http_info(converter_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_converters_by_ids_using_get_with_http_info(converter_ids, **kwargs) # noqa: E501 + return data + + def get_converters_by_ids_using_get_with_http_info(self, converter_ids, **kwargs): # noqa: E501 + """getConvertersByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_converters_by_ids_using_get_with_http_info(converter_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str converter_ids: converterIds (required) + :return: list[Converter] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['converter_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_converters_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'converter_ids' is set + if ('converter_ids' not in params or + params['converter_ids'] is None): + raise ValueError("Missing the required parameter `converter_ids` when calling `get_converters_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'converter_ids' in params: + query_params.append(('converterIds', params['converter_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/converters{?converterIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Converter]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_converters_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getConverters # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_converters_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataConverter + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_converters_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_converters_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_converters_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getConverters # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_converters_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataConverter + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_converters_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_converters_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_converters_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/converters{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataConverter', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_latest_converter_debug_input_using_get(self, converter_id, **kwargs): # noqa: E501 + """getLatestConverterDebugInput # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_latest_converter_debug_input_using_get(converter_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str converter_id: converterId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_latest_converter_debug_input_using_get_with_http_info(converter_id, **kwargs) # noqa: E501 + else: + (data) = self.get_latest_converter_debug_input_using_get_with_http_info(converter_id, **kwargs) # noqa: E501 + return data + + def get_latest_converter_debug_input_using_get_with_http_info(self, converter_id, **kwargs): # noqa: E501 + """getLatestConverterDebugInput # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_latest_converter_debug_input_using_get_with_http_info(converter_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str converter_id: converterId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['converter_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_latest_converter_debug_input_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'converter_id' is set + if ('converter_id' not in params or + params['converter_id'] is None): + raise ValueError("Missing the required parameter `converter_id` when calling `get_latest_converter_debug_input_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'converter_id' in params: + path_params['converterId'] = params['converter_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/converter/{converterId}/debugIn', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_converter_using_post(self, body, **kwargs): # noqa: E501 + """saveConverter # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_converter_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Converter body: converter (required) + :return: Converter + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_converter_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_converter_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_converter_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveConverter # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_converter_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Converter body: converter (required) + :return: Converter + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_converter_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_converter_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/converter', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Converter', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def test_down_link_converter_using_post(self, body, **kwargs): # noqa: E501 + """testDownLinkConverter # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.test_down_link_converter_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: inputParams (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.test_down_link_converter_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.test_down_link_converter_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def test_down_link_converter_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """testDownLinkConverter # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.test_down_link_converter_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: inputParams (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method test_down_link_converter_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `test_down_link_converter_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/converter/testDownLink', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def test_up_link_converter_using_post(self, body, **kwargs): # noqa: E501 + """testUpLinkConverter # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.test_up_link_converter_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: inputParams (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.test_up_link_converter_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.test_up_link_converter_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def test_up_link_converter_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """testUpLinkConverter # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.test_up_link_converter_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: inputParams (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method test_up_link_converter_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `test_up_link_converter_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/converter/testUpLink', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/custom_menu_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/custom_menu_controller_api.py new file mode 100644 index 0000000..dd9bfa1 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/custom_menu_controller_api.py @@ -0,0 +1,296 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class CustomMenuControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_current_custom_menu_using_get(self, **kwargs): # noqa: E501 + """getCurrentCustomMenu # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_current_custom_menu_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: CustomMenu + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_current_custom_menu_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_current_custom_menu_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_current_custom_menu_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getCurrentCustomMenu # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_current_custom_menu_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: CustomMenu + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_current_custom_menu_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customMenu/currentCustomMenu', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='CustomMenu', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_custom_menu_using_get(self, **kwargs): # noqa: E501 + """getCustomMenu # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_custom_menu_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: CustomMenu + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_custom_menu_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_custom_menu_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_custom_menu_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getCustomMenu # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_custom_menu_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: CustomMenu + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_custom_menu_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customMenu/customMenu', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='CustomMenu', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_custom_menu_using_post(self, **kwargs): # noqa: E501 + """saveCustomMenu # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_custom_menu_using_post(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param CustomMenu body: customMenu + :return: CustomMenu + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_custom_menu_using_post_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.save_custom_menu_using_post_with_http_info(**kwargs) # noqa: E501 + return data + + def save_custom_menu_using_post_with_http_info(self, **kwargs): # noqa: E501 + """saveCustomMenu # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_custom_menu_using_post_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param CustomMenu body: customMenu + :return: CustomMenu + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_custom_menu_using_post" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customMenu/customMenu', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='CustomMenu', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/custom_translation_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/custom_translation_controller_api.py new file mode 100644 index 0000000..c722e97 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/custom_translation_controller_api.py @@ -0,0 +1,300 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class CustomTranslationControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_current_custom_translation_using_get(self, **kwargs): # noqa: E501 + """getCurrentCustomTranslation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_current_custom_translation_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: CustomTranslation + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_current_custom_translation_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_current_custom_translation_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_current_custom_translation_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getCurrentCustomTranslation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_current_custom_translation_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: CustomTranslation + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_current_custom_translation_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customTranslation/currentCustomTranslation', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='CustomTranslation', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_custom_translation_using_get(self, **kwargs): # noqa: E501 + """getCustomTranslation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_custom_translation_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: CustomTranslation + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_custom_translation_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_custom_translation_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_custom_translation_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getCustomTranslation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_custom_translation_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: CustomTranslation + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_custom_translation_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customTranslation/customTranslation', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='CustomTranslation', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_custom_translation_using_post(self, body, **kwargs): # noqa: E501 + """saveCustomTranslation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_custom_translation_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param CustomTranslation body: customTranslation (required) + :return: CustomTranslation + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_custom_translation_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_custom_translation_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_custom_translation_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveCustomTranslation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_custom_translation_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param CustomTranslation body: customTranslation (required) + :return: CustomTranslation + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_custom_translation_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_custom_translation_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customTranslation/customTranslation', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='CustomTranslation', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/customer_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/customer_controller_api.py new file mode 100644 index 0000000..fb92ad5 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/customer_controller_api.py @@ -0,0 +1,1035 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class CustomerControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_customer_using_delete(self, customer_id, **kwargs): # noqa: E501 + """deleteCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_customer_using_delete(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_customer_using_delete_with_http_info(customer_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_customer_using_delete_with_http_info(customer_id, **kwargs) # noqa: E501 + return data + + def delete_customer_using_delete_with_http_info(self, customer_id, **kwargs): # noqa: E501 + """deleteCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_customer_using_delete_with_http_info(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_customer_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `delete_customer_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_by_id_using_get(self, customer_id, **kwargs): # noqa: E501 + """getCustomerById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_by_id_using_get(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: Customer + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_by_id_using_get_with_http_info(customer_id, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_by_id_using_get_with_http_info(customer_id, **kwargs) # noqa: E501 + return data + + def get_customer_by_id_using_get_with_http_info(self, customer_id, **kwargs): # noqa: E501 + """getCustomerById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_by_id_using_get_with_http_info(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: Customer + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Customer', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_title_by_id_using_get(self, customer_id, **kwargs): # noqa: E501 + """getCustomerTitleById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_title_by_id_using_get(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_title_by_id_using_get_with_http_info(customer_id, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_title_by_id_using_get_with_http_info(customer_id, **kwargs) # noqa: E501 + return data + + def get_customer_title_by_id_using_get_with_http_info(self, customer_id, **kwargs): # noqa: E501 + """getCustomerTitleById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_title_by_id_using_get_with_http_info(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_title_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_title_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/text']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/title', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customers_by_entity_group_id_using_get(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getCustomersByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customers_by_entity_group_id_using_get(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataCustomer + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customers_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customers_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customers_by_entity_group_id_using_get_with_http_info(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getCustomersByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customers_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataCustomer + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customers_by_entity_group_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `get_customers_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customers_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customers_by_entity_group_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/customers{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataCustomer', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customers_by_ids_using_get(self, customer_ids, **kwargs): # noqa: E501 + """getCustomersByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customers_by_ids_using_get(customer_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_ids: customerIds (required) + :return: list[Customer] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customers_by_ids_using_get_with_http_info(customer_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_customers_by_ids_using_get_with_http_info(customer_ids, **kwargs) # noqa: E501 + return data + + def get_customers_by_ids_using_get_with_http_info(self, customer_ids, **kwargs): # noqa: E501 + """getCustomersByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customers_by_ids_using_get_with_http_info(customer_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_ids: customerIds (required) + :return: list[Customer] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customers_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_ids' is set + if ('customer_ids' not in params or + params['customer_ids'] is None): + raise ValueError("Missing the required parameter `customer_ids` when calling `get_customers_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'customer_ids' in params: + query_params.append(('customerIds', params['customer_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customers{?customerIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Customer]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customers_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getCustomers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customers_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataCustomer + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customers_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customers_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_customers_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getCustomers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customers_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataCustomer + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customers_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customers_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customers_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customers{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataCustomer', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_short_customer_info_by_id_using_get(self, customer_id, **kwargs): # noqa: E501 + """getShortCustomerInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_short_customer_info_by_id_using_get(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_short_customer_info_by_id_using_get_with_http_info(customer_id, **kwargs) # noqa: E501 + else: + (data) = self.get_short_customer_info_by_id_using_get_with_http_info(customer_id, **kwargs) # noqa: E501 + return data + + def get_short_customer_info_by_id_using_get_with_http_info(self, customer_id, **kwargs): # noqa: E501 + """getShortCustomerInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_short_customer_info_by_id_using_get_with_http_info(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_short_customer_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_short_customer_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/shortInfo', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_customer_using_get(self, customer_title, **kwargs): # noqa: E501 + """getTenantCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_customer_using_get(customer_title, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_title: customerTitle (required) + :return: Customer + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_customer_using_get_with_http_info(customer_title, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_customer_using_get_with_http_info(customer_title, **kwargs) # noqa: E501 + return data + + def get_tenant_customer_using_get_with_http_info(self, customer_title, **kwargs): # noqa: E501 + """getTenantCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_customer_using_get_with_http_info(customer_title, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_title: customerTitle (required) + :return: Customer + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_title'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_customer_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_title' is set + if ('customer_title' not in params or + params['customer_title'] is None): + raise ValueError("Missing the required parameter `customer_title` when calling `get_tenant_customer_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'customer_title' in params: + query_params.append(('customerTitle', params['customer_title'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/customers{?customerTitle}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Customer', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_customers_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getUserCustomers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_customers_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataCustomer + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_customers_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_user_customers_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_user_customers_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getUserCustomers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_customers_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataCustomer + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_customers_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_user_customers_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_user_customers_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/customers{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataCustomer', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_customer_using_post(self, body, **kwargs): # noqa: E501 + """saveCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_customer_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Customer body: customer (required) + :param str entity_group_id: entityGroupId + :return: Customer + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_customer_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_customer_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_customer_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_customer_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Customer body: customer (required) + :param str entity_group_id: entityGroupId + :return: Customer + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'entity_group_id' in params: + query_params.append(('entityGroupId', params['entity_group_id'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer{?entityGroupId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Customer', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/dashboard_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/dashboard_controller_api.py new file mode 100644 index 0000000..7cf4a80 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/dashboard_controller_api.py @@ -0,0 +1,2009 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class DashboardControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_dashboard_using_delete(self, dashboard_id, **kwargs): # noqa: E501 + """deleteDashboard # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_dashboard_using_delete(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_dashboard_using_delete_with_http_info(dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_dashboard_using_delete_with_http_info(dashboard_id, **kwargs) # noqa: E501 + return data + + def delete_dashboard_using_delete_with_http_info(self, dashboard_id, **kwargs): # noqa: E501 + """deleteDashboard # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_dashboard_using_delete_with_http_info(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_dashboard_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `delete_dashboard_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/{dashboardId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def export_group_dashboards_using_get(self, entity_group_id, limit, **kwargs): # noqa: E501 + """exportGroupDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.export_group_dashboards_using_get(entity_group_id, limit, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str limit: limit (required) + :return: list[Dashboard] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.export_group_dashboards_using_get_with_http_info(entity_group_id, limit, **kwargs) # noqa: E501 + else: + (data) = self.export_group_dashboards_using_get_with_http_info(entity_group_id, limit, **kwargs) # noqa: E501 + return data + + def export_group_dashboards_using_get_with_http_info(self, entity_group_id, limit, **kwargs): # noqa: E501 + """exportGroupDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.export_group_dashboards_using_get_with_http_info(entity_group_id, limit, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str limit: limit (required) + :return: list[Dashboard] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id', 'limit'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method export_group_dashboards_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `export_group_dashboards_using_get`") # noqa: E501 + # verify the required parameter 'limit' is set + if ('limit' not in params or + params['limit'] is None): + raise ValueError("Missing the required parameter `limit` when calling `export_group_dashboards_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + if 'limit' in params: + query_params.append(('limit', params['limit'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/dashboards/export{?limit}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Dashboard]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_home_dashboard_info_using_get(self, **kwargs): # noqa: E501 + """getCustomerHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_home_dashboard_info_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_home_dashboard_info_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_customer_home_dashboard_info_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_customer_home_dashboard_info_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getCustomerHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_home_dashboard_info_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_home_dashboard_info_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/dashboard/home/info', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='HomeDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_dashboard_by_id_using_get(self, dashboard_id, **kwargs): # noqa: E501 + """getDashboardById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_dashboard_by_id_using_get(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_dashboard_by_id_using_get_with_http_info(dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.get_dashboard_by_id_using_get_with_http_info(dashboard_id, **kwargs) # noqa: E501 + return data + + def get_dashboard_by_id_using_get_with_http_info(self, dashboard_id, **kwargs): # noqa: E501 + """getDashboardById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_dashboard_by_id_using_get_with_http_info(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_dashboard_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `get_dashboard_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/{dashboardId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_dashboard_info_by_id_using_get(self, dashboard_id, **kwargs): # noqa: E501 + """getDashboardInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_dashboard_info_by_id_using_get(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: DashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_dashboard_info_by_id_using_get_with_http_info(dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.get_dashboard_info_by_id_using_get_with_http_info(dashboard_id, **kwargs) # noqa: E501 + return data + + def get_dashboard_info_by_id_using_get_with_http_info(self, dashboard_id, **kwargs): # noqa: E501 + """getDashboardInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_dashboard_info_by_id_using_get_with_http_info(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: DashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_dashboard_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `get_dashboard_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/info/{dashboardId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_dashboards_by_entity_group_id_using_get(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getDashboardsByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_dashboards_by_entity_group_id_using_get(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param int page_size: Page size (required) + :param int page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_dashboards_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_dashboards_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_dashboards_by_entity_group_id_using_get_with_http_info(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getDashboardsByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_dashboards_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param int page_size: Page size (required) + :param int page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_dashboards_by_entity_group_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `get_dashboards_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_dashboards_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_dashboards_by_entity_group_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/dashboards{?pageSize,page,textSearch,sortProperty,sortOrder}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_dashboards_by_ids_using_get(self, dashboard_ids, **kwargs): # noqa: E501 + """getDashboardsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_dashboards_by_ids_using_get(dashboard_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_ids: dashboardIds (required) + :return: list[DashboardInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_dashboards_by_ids_using_get_with_http_info(dashboard_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_dashboards_by_ids_using_get_with_http_info(dashboard_ids, **kwargs) # noqa: E501 + return data + + def get_dashboards_by_ids_using_get_with_http_info(self, dashboard_ids, **kwargs): # noqa: E501 + """getDashboardsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_dashboards_by_ids_using_get_with_http_info(dashboard_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_ids: dashboardIds (required) + :return: list[DashboardInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['dashboard_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_dashboards_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'dashboard_ids' is set + if ('dashboard_ids' not in params or + params['dashboard_ids'] is None): + raise ValueError("Missing the required parameter `dashboard_ids` when calling `get_dashboards_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'dashboard_ids' in params: + query_params.append(('dashboardIds', params['dashboard_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboards{?dashboardIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[DashboardInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_group_dashboards_using_get(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getGroupDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_group_dashboards_using_get(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_group_dashboards_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_group_dashboards_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_group_dashboards_using_get_with_http_info(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getGroupDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_group_dashboards_using_get_with_http_info(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_group_dashboards_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `get_group_dashboards_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_group_dashboards_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_group_dashboards_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/dashboards{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_home_dashboard_info_using_get(self, **kwargs): # noqa: E501 + """getHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_home_dashboard_info_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_home_dashboard_info_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_home_dashboard_info_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_home_dashboard_info_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_home_dashboard_info_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_home_dashboard_info_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/home/info', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='HomeDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_home_dashboard_using_get(self, **kwargs): # noqa: E501 + """getHomeDashboard # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_home_dashboard_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_home_dashboard_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_home_dashboard_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_home_dashboard_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getHomeDashboard # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_home_dashboard_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_home_dashboard_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/home', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='HomeDashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_max_datapoints_limit_using_get(self, **kwargs): # noqa: E501 + """getMaxDatapointsLimit # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_max_datapoints_limit_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: int + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_max_datapoints_limit_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_max_datapoints_limit_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_max_datapoints_limit_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getMaxDatapointsLimit # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_max_datapoints_limit_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: int + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_max_datapoints_limit_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/maxDatapointsLimit', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='int', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_server_time_using_get(self, **kwargs): # noqa: E501 + """getServerTime # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_server_time_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: int + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_server_time_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_server_time_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_server_time_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getServerTime # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_server_time_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: int + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_server_time_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/serverTime', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='int', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_dashboards_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_dashboards_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param bool mobile: mobile + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_dashboards_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_dashboards_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_dashboards_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_dashboards_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param bool mobile: mobile + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'mobile', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_dashboards_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_dashboards_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_dashboards_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'mobile' in params: + query_params.append(('mobile', params['mobile'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/dashboards{?mobile,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_dashboards_using_get1(self, tenant_id, page_size, page, **kwargs): # noqa: E501 + """getTenantDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_dashboards_using_get1(tenant_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_dashboards_using_get1_with_http_info(tenant_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_dashboards_using_get1_with_http_info(tenant_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_dashboards_using_get1_with_http_info(self, tenant_id, page_size, page, **kwargs): # noqa: E501 + """getTenantDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_dashboards_using_get1_with_http_info(tenant_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_dashboards_using_get1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `get_tenant_dashboards_using_get1`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_dashboards_using_get1`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_dashboards_using_get1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_id' in params: + path_params['tenantId'] = params['tenant_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/{tenantId}/dashboards{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_home_dashboard_info_using_get(self, **kwargs): # noqa: E501 + """getTenantHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_home_dashboard_info_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_home_dashboard_info_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_tenant_home_dashboard_info_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_tenant_home_dashboard_info_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getTenantHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_home_dashboard_info_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_home_dashboard_info_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/dashboard/home/info', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='HomeDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_dashboards_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getUserDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_dashboards_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param bool mobile: mobile + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param str operation: operation + :param str user_id: userId + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_dashboards_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_user_dashboards_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_user_dashboards_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getUserDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_dashboards_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param bool mobile: mobile + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param str operation: operation + :param str user_id: userId + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'mobile', 'text_search', 'sort_property', 'sort_order', 'operation', 'user_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_dashboards_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_user_dashboards_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_user_dashboards_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'mobile' in params: + query_params.append(('mobile', params['mobile'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'operation' in params: + query_params.append(('operation', params['operation'])) # noqa: E501 + if 'user_id' in params: + query_params.append(('userId', params['user_id'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/dashboards{?mobile,textSearch,sortProperty,sortOrder,operation,userId,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def import_group_dashboards_using_post(self, body, entity_group_id, **kwargs): # noqa: E501 + """importGroupDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.import_group_dashboards_using_post(body, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param list[Dashboard] body: dashboardList (required) + :param str entity_group_id: entityGroupId (required) + :param bool overwrite: overwrite + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.import_group_dashboards_using_post_with_http_info(body, entity_group_id, **kwargs) # noqa: E501 + else: + (data) = self.import_group_dashboards_using_post_with_http_info(body, entity_group_id, **kwargs) # noqa: E501 + return data + + def import_group_dashboards_using_post_with_http_info(self, body, entity_group_id, **kwargs): # noqa: E501 + """importGroupDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.import_group_dashboards_using_post_with_http_info(body, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param list[Dashboard] body: dashboardList (required) + :param str entity_group_id: entityGroupId (required) + :param bool overwrite: overwrite + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_group_id', 'overwrite'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method import_group_dashboards_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `import_group_dashboards_using_post`") # noqa: E501 + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `import_group_dashboards_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + if 'overwrite' in params: + query_params.append(('overwrite', params['overwrite'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/dashboards/import{?overwrite}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_dashboard_using_post(self, body, **kwargs): # noqa: E501 + """saveDashboard # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_dashboard_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Dashboard body: dashboard (required) + :param str entity_group_id: entityGroupId + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_dashboard_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_dashboard_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_dashboard_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveDashboard # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_dashboard_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Dashboard body: dashboard (required) + :param str entity_group_id: entityGroupId + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_dashboard_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_dashboard_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'entity_group_id' in params: + query_params.append(('entityGroupId', params['entity_group_id'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard{?entityGroupId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_customer_home_dashboard_info_using_post(self, body, **kwargs): # noqa: E501 + """setCustomerHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_customer_home_dashboard_info_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param HomeDashboardInfo body: homeDashboardInfo (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_customer_home_dashboard_info_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.set_customer_home_dashboard_info_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def set_customer_home_dashboard_info_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """setCustomerHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_customer_home_dashboard_info_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param HomeDashboardInfo body: homeDashboardInfo (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_customer_home_dashboard_info_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `set_customer_home_dashboard_info_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/dashboard/home/info', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_tenant_home_dashboard_info_using_post(self, body, **kwargs): # noqa: E501 + """setTenantHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_tenant_home_dashboard_info_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param HomeDashboardInfo body: homeDashboardInfo (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_tenant_home_dashboard_info_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.set_tenant_home_dashboard_info_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def set_tenant_home_dashboard_info_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """setTenantHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_tenant_home_dashboard_info_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param HomeDashboardInfo body: homeDashboardInfo (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_tenant_home_dashboard_info_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `set_tenant_home_dashboard_info_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/dashboard/home/info', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/device_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/device_controller_api.py new file mode 100644 index 0000000..7074613 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/device_controller_api.py @@ -0,0 +1,1867 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class DeviceControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def assign_device_to_tenant_using_post(self, tenant_id, device_id, **kwargs): # noqa: E501 + """assignDeviceToTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_device_to_tenant_using_post(tenant_id, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_device_to_tenant_using_post_with_http_info(tenant_id, device_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_device_to_tenant_using_post_with_http_info(tenant_id, device_id, **kwargs) # noqa: E501 + return data + + def assign_device_to_tenant_using_post_with_http_info(self, tenant_id, device_id, **kwargs): # noqa: E501 + """assignDeviceToTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_device_to_tenant_using_post_with_http_info(tenant_id, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_id', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_device_to_tenant_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `assign_device_to_tenant_using_post`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `assign_device_to_tenant_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_id' in params: + path_params['tenantId'] = params['tenant_id'] # noqa: E501 + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/{tenantId}/device/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def claim_device_using_post(self, device_name, **kwargs): # noqa: E501 + """claimDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.claim_device_using_post(device_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_name: deviceName (required) + :param ClaimRequest body: claimRequest + :param str sub_customer_id: subCustomerId + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.claim_device_using_post_with_http_info(device_name, **kwargs) # noqa: E501 + else: + (data) = self.claim_device_using_post_with_http_info(device_name, **kwargs) # noqa: E501 + return data + + def claim_device_using_post_with_http_info(self, device_name, **kwargs): # noqa: E501 + """claimDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.claim_device_using_post_with_http_info(device_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_name: deviceName (required) + :param ClaimRequest body: claimRequest + :param str sub_customer_id: subCustomerId + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_name', 'body', 'sub_customer_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method claim_device_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_name' is set + if ('device_name' not in params or + params['device_name'] is None): + raise ValueError("Missing the required parameter `device_name` when calling `claim_device_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_name' in params: + path_params['deviceName'] = params['device_name'] # noqa: E501 + + query_params = [] + if 'sub_customer_id' in params: + query_params.append(('subCustomerId', params['sub_customer_id'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/device/{deviceName}/claim{?subCustomerId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def count_by_device_group_and_empty_ota_package_using_get(self, ota_package_type, ota_package_id, entity_group_id, **kwargs): # noqa: E501 + """countByDeviceGroupAndEmptyOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.count_by_device_group_and_empty_ota_package_using_get(ota_package_type, ota_package_id, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_type: otaPackageType (required) + :param str ota_package_id: otaPackageId (required) + :param str entity_group_id: entityGroupId (required) + :return: int + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.count_by_device_group_and_empty_ota_package_using_get_with_http_info(ota_package_type, ota_package_id, entity_group_id, **kwargs) # noqa: E501 + else: + (data) = self.count_by_device_group_and_empty_ota_package_using_get_with_http_info(ota_package_type, ota_package_id, entity_group_id, **kwargs) # noqa: E501 + return data + + def count_by_device_group_and_empty_ota_package_using_get_with_http_info(self, ota_package_type, ota_package_id, entity_group_id, **kwargs): # noqa: E501 + """countByDeviceGroupAndEmptyOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.count_by_device_group_and_empty_ota_package_using_get_with_http_info(ota_package_type, ota_package_id, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_type: otaPackageType (required) + :param str ota_package_id: otaPackageId (required) + :param str entity_group_id: entityGroupId (required) + :return: int + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['ota_package_type', 'ota_package_id', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method count_by_device_group_and_empty_ota_package_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'ota_package_type' is set + if ('ota_package_type' not in params or + params['ota_package_type'] is None): + raise ValueError("Missing the required parameter `ota_package_type` when calling `count_by_device_group_and_empty_ota_package_using_get`") # noqa: E501 + # verify the required parameter 'ota_package_id' is set + if ('ota_package_id' not in params or + params['ota_package_id'] is None): + raise ValueError("Missing the required parameter `ota_package_id` when calling `count_by_device_group_and_empty_ota_package_using_get`") # noqa: E501 + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `count_by_device_group_and_empty_ota_package_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_type' in params: + path_params['otaPackageType'] = params['ota_package_type'] # noqa: E501 + if 'ota_package_id' in params: + path_params['otaPackageId'] = params['ota_package_id'] # noqa: E501 + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/devices/count/{otaPackageType}/{otaPackageId}/{entityGroupId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='int', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def count_by_device_profile_and_empty_ota_package_using_get(self, ota_package_type, device_profile_id, **kwargs): # noqa: E501 + """countByDeviceProfileAndEmptyOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.count_by_device_profile_and_empty_ota_package_using_get(ota_package_type, device_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_type: otaPackageType (required) + :param str device_profile_id: deviceProfileId (required) + :return: int + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.count_by_device_profile_and_empty_ota_package_using_get_with_http_info(ota_package_type, device_profile_id, **kwargs) # noqa: E501 + else: + (data) = self.count_by_device_profile_and_empty_ota_package_using_get_with_http_info(ota_package_type, device_profile_id, **kwargs) # noqa: E501 + return data + + def count_by_device_profile_and_empty_ota_package_using_get_with_http_info(self, ota_package_type, device_profile_id, **kwargs): # noqa: E501 + """countByDeviceProfileAndEmptyOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.count_by_device_profile_and_empty_ota_package_using_get_with_http_info(ota_package_type, device_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_type: otaPackageType (required) + :param str device_profile_id: deviceProfileId (required) + :return: int + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['ota_package_type', 'device_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method count_by_device_profile_and_empty_ota_package_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'ota_package_type' is set + if ('ota_package_type' not in params or + params['ota_package_type'] is None): + raise ValueError("Missing the required parameter `ota_package_type` when calling `count_by_device_profile_and_empty_ota_package_using_get`") # noqa: E501 + # verify the required parameter 'device_profile_id' is set + if ('device_profile_id' not in params or + params['device_profile_id'] is None): + raise ValueError("Missing the required parameter `device_profile_id` when calling `count_by_device_profile_and_empty_ota_package_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_type' in params: + path_params['otaPackageType'] = params['ota_package_type'] # noqa: E501 + if 'device_profile_id' in params: + path_params['deviceProfileId'] = params['device_profile_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/devices/count/{otaPackageType}/{deviceProfileId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='int', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_device_using_delete(self, device_id, **kwargs): # noqa: E501 + """deleteDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_device_using_delete(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_device_using_delete_with_http_info(device_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_device_using_delete_with_http_info(device_id, **kwargs) # noqa: E501 + return data + + def delete_device_using_delete_with_http_info(self, device_id, **kwargs): # noqa: E501 + """deleteDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_device_using_delete_with_http_info(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_device_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `delete_device_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device/{deviceId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_query_using_post1(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post1(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DeviceSearchQuery body: query (required) + :return: list[Device] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_query_using_post1_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.find_by_query_using_post1_with_http_info(body, **kwargs) # noqa: E501 + return data + + def find_by_query_using_post1_with_http_info(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post1_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DeviceSearchQuery body: query (required) + :return: list[Device] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_query_using_post1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_by_query_using_post1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/devices', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Device]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_devices_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerDevices # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_devices_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_devices_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_devices_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_devices_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerDevices # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_devices_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_devices_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_devices_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_devices_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_devices_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/devices{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDevice', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_device_by_id_using_get(self, device_id, **kwargs): # noqa: E501 + """getDeviceById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_by_id_using_get(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_device_by_id_using_get_with_http_info(device_id, **kwargs) # noqa: E501 + else: + (data) = self.get_device_by_id_using_get_with_http_info(device_id, **kwargs) # noqa: E501 + return data + + def get_device_by_id_using_get_with_http_info(self, device_id, **kwargs): # noqa: E501 + """getDeviceById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_by_id_using_get_with_http_info(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_device_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `get_device_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device/{deviceId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_device_credentials_by_device_id_using_get(self, device_id, **kwargs): # noqa: E501 + """getDeviceCredentialsByDeviceId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_credentials_by_device_id_using_get(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: DeviceCredentials + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_device_credentials_by_device_id_using_get_with_http_info(device_id, **kwargs) # noqa: E501 + else: + (data) = self.get_device_credentials_by_device_id_using_get_with_http_info(device_id, **kwargs) # noqa: E501 + return data + + def get_device_credentials_by_device_id_using_get_with_http_info(self, device_id, **kwargs): # noqa: E501 + """getDeviceCredentialsByDeviceId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_credentials_by_device_id_using_get_with_http_info(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: DeviceCredentials + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_device_credentials_by_device_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `get_device_credentials_by_device_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device/{deviceId}/credentials', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeviceCredentials', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_device_types_using_get(self, **kwargs): # noqa: E501 + """getDeviceTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_types_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_device_types_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_device_types_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_device_types_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getDeviceTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_types_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_device_types_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device/types', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntitySubtype]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_devices_by_entity_group_id_using_get(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getDevicesByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_devices_by_entity_group_id_using_get(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_devices_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_devices_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_devices_by_entity_group_id_using_get_with_http_info(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getDevicesByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_devices_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_devices_by_entity_group_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `get_devices_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_devices_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_devices_by_entity_group_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/devices{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDevice', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_devices_by_ids_using_get(self, device_ids, **kwargs): # noqa: E501 + """getDevicesByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_devices_by_ids_using_get(device_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_ids: deviceIds (required) + :return: list[Device] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_devices_by_ids_using_get_with_http_info(device_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_devices_by_ids_using_get_with_http_info(device_ids, **kwargs) # noqa: E501 + return data + + def get_devices_by_ids_using_get_with_http_info(self, device_ids, **kwargs): # noqa: E501 + """getDevicesByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_devices_by_ids_using_get_with_http_info(device_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_ids: deviceIds (required) + :return: list[Device] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_devices_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_ids' is set + if ('device_ids' not in params or + params['device_ids'] is None): + raise ValueError("Missing the required parameter `device_ids` when calling `get_devices_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'device_ids' in params: + query_params.append(('deviceIds', params['device_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/devices{?deviceIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Device]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_device_using_get(self, device_name, **kwargs): # noqa: E501 + """getTenantDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_device_using_get(device_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_name: deviceName (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_device_using_get_with_http_info(device_name, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_device_using_get_with_http_info(device_name, **kwargs) # noqa: E501 + return data + + def get_tenant_device_using_get_with_http_info(self, device_name, **kwargs): # noqa: E501 + """getTenantDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_device_using_get_with_http_info(device_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_name: deviceName (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_device_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_name' is set + if ('device_name' not in params or + params['device_name'] is None): + raise ValueError("Missing the required parameter `device_name` when calling `get_tenant_device_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'device_name' in params: + query_params.append(('deviceName', params['device_name'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/devices{?deviceName}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_devices_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantDevices # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_devices_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_devices_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_devices_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_devices_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantDevices # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_devices_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_devices_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_devices_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_devices_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/devices{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDevice', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_devices_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getUserDevices # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_devices_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_devices_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_user_devices_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_user_devices_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getUserDevices # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_devices_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_devices_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_user_devices_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_user_devices_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/devices{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDevice', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def re_claim_device_using_delete(self, device_name, **kwargs): # noqa: E501 + """reClaimDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.re_claim_device_using_delete(device_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_name: deviceName (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.re_claim_device_using_delete_with_http_info(device_name, **kwargs) # noqa: E501 + else: + (data) = self.re_claim_device_using_delete_with_http_info(device_name, **kwargs) # noqa: E501 + return data + + def re_claim_device_using_delete_with_http_info(self, device_name, **kwargs): # noqa: E501 + """reClaimDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.re_claim_device_using_delete_with_http_info(device_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_name: deviceName (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method re_claim_device_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_name' is set + if ('device_name' not in params or + params['device_name'] is None): + raise ValueError("Missing the required parameter `device_name` when calling `re_claim_device_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_name' in params: + path_params['deviceName'] = params['device_name'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/device/{deviceName}/claim', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_device_credentials_using_post(self, body, **kwargs): # noqa: E501 + """saveDeviceCredentials # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_credentials_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DeviceCredentials body: deviceCredentials (required) + :return: DeviceCredentials + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_device_credentials_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_device_credentials_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_device_credentials_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveDeviceCredentials # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_credentials_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DeviceCredentials body: deviceCredentials (required) + :return: DeviceCredentials + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_device_credentials_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_device_credentials_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device/credentials', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeviceCredentials', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_device_using_post(self, body, **kwargs): # noqa: E501 + """saveDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Device body: device (required) + :param str access_token: accessToken + :param str entity_group_id: entityGroupId + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_device_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_device_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_device_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Device body: device (required) + :param str access_token: accessToken + :param str entity_group_id: entityGroupId + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'access_token', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_device_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_device_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'access_token' in params: + query_params.append(('accessToken', params['access_token'])) # noqa: E501 + if 'entity_group_id' in params: + query_params.append(('entityGroupId', params['entity_group_id'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device{?accessToken,entityGroupId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/device_group_ota_package_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/device_group_ota_package_controller_api.py new file mode 100644 index 0000000..fbb7799 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/device_group_ota_package_controller_api.py @@ -0,0 +1,320 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class DeviceGroupOtaPackageControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_device_group_ota_package_using_delete(self, id, **kwargs): # noqa: E501 + """deleteDeviceGroupOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_device_group_ota_package_using_delete(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str id: id (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_device_group_ota_package_using_delete_with_http_info(id, **kwargs) # noqa: E501 + else: + (data) = self.delete_device_group_ota_package_using_delete_with_http_info(id, **kwargs) # noqa: E501 + return data + + def delete_device_group_ota_package_using_delete_with_http_info(self, id, **kwargs): # noqa: E501 + """deleteDeviceGroupOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_device_group_ota_package_using_delete_with_http_info(id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str id: id (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_device_group_ota_package_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_device_group_ota_package_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'id' in params: + path_params['id'] = params['id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceGroupOtaPackage/{id}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_firmware_by_id_using_get(self, group_id, firmware_type, **kwargs): # noqa: E501 + """getFirmwareById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_firmware_by_id_using_get(group_id, firmware_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str group_id: groupId (required) + :param str firmware_type: firmwareType (required) + :return: DeviceGroupOtaPackage + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_firmware_by_id_using_get_with_http_info(group_id, firmware_type, **kwargs) # noqa: E501 + else: + (data) = self.get_firmware_by_id_using_get_with_http_info(group_id, firmware_type, **kwargs) # noqa: E501 + return data + + def get_firmware_by_id_using_get_with_http_info(self, group_id, firmware_type, **kwargs): # noqa: E501 + """getFirmwareById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_firmware_by_id_using_get_with_http_info(group_id, firmware_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str group_id: groupId (required) + :param str firmware_type: firmwareType (required) + :return: DeviceGroupOtaPackage + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['group_id', 'firmware_type'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_firmware_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'group_id' is set + if ('group_id' not in params or + params['group_id'] is None): + raise ValueError("Missing the required parameter `group_id` when calling `get_firmware_by_id_using_get`") # noqa: E501 + # verify the required parameter 'firmware_type' is set + if ('firmware_type' not in params or + params['firmware_type'] is None): + raise ValueError("Missing the required parameter `firmware_type` when calling `get_firmware_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'group_id' in params: + path_params['groupId'] = params['group_id'] # noqa: E501 + if 'firmware_type' in params: + path_params['firmwareType'] = params['firmware_type'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceGroupOtaPackage/{groupId}/{firmwareType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeviceGroupOtaPackage', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_device_group_ota_package_using_post(self, body, **kwargs): # noqa: E501 + """saveDeviceGroupOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_group_ota_package_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DeviceGroupOtaPackage body: deviceGroupOtaPackage (required) + :return: DeviceGroupOtaPackage + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_device_group_ota_package_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_device_group_ota_package_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_device_group_ota_package_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveDeviceGroupOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_group_ota_package_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DeviceGroupOtaPackage body: deviceGroupOtaPackage (required) + :return: DeviceGroupOtaPackage + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_device_group_ota_package_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_device_group_ota_package_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceGroupOtaPackage', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeviceGroupOtaPackage', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/edge_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/edge_controller_api.py new file mode 100644 index 0000000..a099cea --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/edge_controller_api.py @@ -0,0 +1,1843 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class EdgeControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def activate_instance_using_post(self, license_secret, release_date, **kwargs): # noqa: E501 + """activateInstance # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_instance_using_post(license_secret, release_date, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str license_secret: licenseSecret (required) + :param str release_date: releaseDate (required) + :return: object + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.activate_instance_using_post_with_http_info(license_secret, release_date, **kwargs) # noqa: E501 + else: + (data) = self.activate_instance_using_post_with_http_info(license_secret, release_date, **kwargs) # noqa: E501 + return data + + def activate_instance_using_post_with_http_info(self, license_secret, release_date, **kwargs): # noqa: E501 + """activateInstance # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_instance_using_post_with_http_info(license_secret, release_date, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str license_secret: licenseSecret (required) + :param str release_date: releaseDate (required) + :return: object + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['license_secret', 'release_date'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method activate_instance_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'license_secret' is set + if ('license_secret' not in params or + params['license_secret'] is None): + raise ValueError("Missing the required parameter `license_secret` when calling `activate_instance_using_post`") # noqa: E501 + # verify the required parameter 'release_date' is set + if ('release_date' not in params or + params['release_date'] is None): + raise ValueError("Missing the required parameter `release_date` when calling `activate_instance_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'license_secret' in params: + query_params.append(('licenseSecret', params['license_secret'])) # noqa: E501 + if 'release_date' in params: + query_params.append(('releaseDate', params['release_date'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/license/activateInstance{?licenseSecret,releaseDate}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='object', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def check_instance_using_post(self, body, **kwargs): # noqa: E501 + """checkInstance # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_instance_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param object body: request (required) + :return: object + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.check_instance_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.check_instance_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def check_instance_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """checkInstance # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_instance_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param object body: request (required) + :return: object + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method check_instance_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `check_instance_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/license/checkInstance', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='object', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_edge_using_delete(self, edge_id, **kwargs): # noqa: E501 + """deleteEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_edge_using_delete(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_edge_using_delete_with_http_info(edge_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_edge_using_delete_with_http_info(edge_id, **kwargs) # noqa: E501 + return data + + def delete_edge_using_delete_with_http_info(self, edge_id, **kwargs): # noqa: E501 + """deleteEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_edge_using_delete_with_http_info(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_edge_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `delete_edge_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_query_using_post2(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post2(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EdgeSearchQuery body: query (required) + :return: list[Edge] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_query_using_post2_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.find_by_query_using_post2_with_http_info(body, **kwargs) # noqa: E501 + return data + + def find_by_query_using_post2_with_http_info(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post2_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EdgeSearchQuery body: query (required) + :return: list[Edge] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_query_using_post2" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_by_query_using_post2`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edges', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Edge]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_missing_to_related_rule_chains_using_get(self, edge_id, **kwargs): # noqa: E501 + """findMissingToRelatedRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_missing_to_related_rule_chains_using_get(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_missing_to_related_rule_chains_using_get_with_http_info(edge_id, **kwargs) # noqa: E501 + else: + (data) = self.find_missing_to_related_rule_chains_using_get_with_http_info(edge_id, **kwargs) # noqa: E501 + return data + + def find_missing_to_related_rule_chains_using_get_with_http_info(self, edge_id, **kwargs): # noqa: E501 + """findMissingToRelatedRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_missing_to_related_rule_chains_using_get_with_http_info(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_missing_to_related_rule_chains_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `find_missing_to_related_rule_chains_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/missingToRelatedRuleChains/{edgeId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_edges_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_edges_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_edges_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_edges_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_edges_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_edges_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_edges_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_edges_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_edges_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_edges_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/edges{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEdge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edge_by_id_using_get(self, edge_id, **kwargs): # noqa: E501 + """getEdgeById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_by_id_using_get(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_by_id_using_get_with_http_info(edge_id, **kwargs) # noqa: E501 + else: + (data) = self.get_edge_by_id_using_get_with_http_info(edge_id, **kwargs) # noqa: E501 + return data + + def get_edge_by_id_using_get_with_http_info(self, edge_id, **kwargs): # noqa: E501 + """getEdgeById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_by_id_using_get_with_http_info(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_edge_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Edge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edge_types_using_get(self, **kwargs): # noqa: E501 + """getEdgeTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_types_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_types_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_edge_types_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_edge_types_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getEdgeTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_types_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_types_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/types', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntitySubtype]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edges_by_entity_group_id_using_get(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getEdgesByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edges_by_entity_group_id_using_get(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edges_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_edges_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_edges_by_entity_group_id_using_get_with_http_info(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getEdgesByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edges_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edges_by_entity_group_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `get_edges_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_edges_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_edges_by_entity_group_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/edges{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEdge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edges_by_ids_using_get(self, edge_ids, **kwargs): # noqa: E501 + """getEdgesByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edges_by_ids_using_get(edge_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_ids: edgeIds (required) + :return: list[Edge] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edges_by_ids_using_get_with_http_info(edge_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_edges_by_ids_using_get_with_http_info(edge_ids, **kwargs) # noqa: E501 + return data + + def get_edges_by_ids_using_get_with_http_info(self, edge_ids, **kwargs): # noqa: E501 + """getEdgesByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edges_by_ids_using_get_with_http_info(edge_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_ids: edgeIds (required) + :return: list[Edge] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edges_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_ids' is set + if ('edge_ids' not in params or + params['edge_ids'] is None): + raise ValueError("Missing the required parameter `edge_ids` when calling `get_edges_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'edge_ids' in params: + query_params.append(('edgeIds', params['edge_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edges{?edgeIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Edge]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edges_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edges_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edges_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_edges_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_edges_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edges_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edges_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_edges_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_edges_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edges{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEdge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_edge_using_get(self, edge_name, **kwargs): # noqa: E501 + """getTenantEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_edge_using_get(edge_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_name: edgeName (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_edge_using_get_with_http_info(edge_name, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_edge_using_get_with_http_info(edge_name, **kwargs) # noqa: E501 + return data + + def get_tenant_edge_using_get_with_http_info(self, edge_name, **kwargs): # noqa: E501 + """getTenantEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_edge_using_get_with_http_info(edge_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_name: edgeName (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_edge_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_name' is set + if ('edge_name' not in params or + params['edge_name'] is None): + raise ValueError("Missing the required parameter `edge_name` when calling `get_tenant_edge_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'edge_name' in params: + query_params.append(('edgeName', params['edge_name'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/edges{?edgeName}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Edge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_edges_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_edges_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_edges_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_edges_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_edges_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_edges_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_edges_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_edges_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_edges_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/edges{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEdge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_edges_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getUserEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_edges_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_edges_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_user_edges_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_user_edges_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getUserEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_edges_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_edges_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_user_edges_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_user_edges_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/edges{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEdge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def is_edges_support_enabled_using_get(self, **kwargs): # noqa: E501 + """isEdgesSupportEnabled # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_edges_support_enabled_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.is_edges_support_enabled_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.is_edges_support_enabled_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def is_edges_support_enabled_using_get_with_http_info(self, **kwargs): # noqa: E501 + """isEdgesSupportEnabled # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_edges_support_enabled_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method is_edges_support_enabled_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edges/enabled', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_edge_using_post(self, body, **kwargs): # noqa: E501 + """saveEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_edge_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Edge body: edge (required) + :param str entity_group_id: entityGroupId + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_edge_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_edge_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_edge_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_edge_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Edge body: edge (required) + :param str entity_group_id: entityGroupId + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_edge_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_edge_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'entity_group_id' in params: + query_params.append(('entityGroupId', params['entity_group_id'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge{?entityGroupId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Edge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_root_rule_chain_using_post(self, edge_id, rule_chain_id, **kwargs): # noqa: E501 + """setRootRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_root_rule_chain_using_post(edge_id, rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str rule_chain_id: ruleChainId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_root_rule_chain_using_post_with_http_info(edge_id, rule_chain_id, **kwargs) # noqa: E501 + else: + (data) = self.set_root_rule_chain_using_post_with_http_info(edge_id, rule_chain_id, **kwargs) # noqa: E501 + return data + + def set_root_rule_chain_using_post_with_http_info(self, edge_id, rule_chain_id, **kwargs): # noqa: E501 + """setRootRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_root_rule_chain_using_post_with_http_info(edge_id, rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str rule_chain_id: ruleChainId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'rule_chain_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_root_rule_chain_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `set_root_rule_chain_using_post`") # noqa: E501 + # verify the required parameter 'rule_chain_id' is set + if ('rule_chain_id' not in params or + params['rule_chain_id'] is None): + raise ValueError("Missing the required parameter `rule_chain_id` when calling `set_root_rule_chain_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'rule_chain_id' in params: + path_params['ruleChainId'] = params['rule_chain_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/{ruleChainId}/root', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Edge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def sync_edge_using_post(self, edge_id, **kwargs): # noqa: E501 + """syncEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.sync_edge_using_post(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.sync_edge_using_post_with_http_info(edge_id, **kwargs) # noqa: E501 + else: + (data) = self.sync_edge_using_post_with_http_info(edge_id, **kwargs) # noqa: E501 + return data + + def sync_edge_using_post_with_http_info(self, edge_id, **kwargs): # noqa: E501 + """syncEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.sync_edge_using_post_with_http_info(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method sync_edge_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `sync_edge_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/sync/{edgeId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/edge_event_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/edge_event_controller_api.py new file mode 100644 index 0000000..0b926d3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/edge_event_controller_api.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class EdgeEventControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_edge_events_using_get(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_events_using_get(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataEdgeEvent + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_events_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_edge_events_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_edge_events_using_get_with_http_info(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_events_using_get_with_http_info(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataEdgeEvent + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_events_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_edge_events_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_edge_events_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_edge_events_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/events{?textSearch,sortProperty,sortOrder,startTime,endTime,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEdgeEvent', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/entity_group_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/entity_group_controller_api.py new file mode 100644 index 0000000..7a7b597 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/entity_group_controller_api.py @@ -0,0 +1,2303 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class EntityGroupControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def add_entities_to_entity_group_using_post(self, body, entity_group_id, **kwargs): # noqa: E501 + """addEntitiesToEntityGroup # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.add_entities_to_entity_group_using_post(body, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param list[str] body: strEntityIds (required) + :param str entity_group_id: entityGroupId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.add_entities_to_entity_group_using_post_with_http_info(body, entity_group_id, **kwargs) # noqa: E501 + else: + (data) = self.add_entities_to_entity_group_using_post_with_http_info(body, entity_group_id, **kwargs) # noqa: E501 + return data + + def add_entities_to_entity_group_using_post_with_http_info(self, body, entity_group_id, **kwargs): # noqa: E501 + """addEntitiesToEntityGroup # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.add_entities_to_entity_group_using_post_with_http_info(body, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param list[str] body: strEntityIds (required) + :param str entity_group_id: entityGroupId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method add_entities_to_entity_group_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `add_entities_to_entity_group_using_post`") # noqa: E501 + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `add_entities_to_entity_group_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/addEntities', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_entity_group_to_edge_using_post(self, edge_id, group_type, entity_group_id, **kwargs): # noqa: E501 + """assignEntityGroupToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_entity_group_to_edge_using_post(edge_id, group_type, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str group_type: EntityGroup type (required) + :param str entity_group_id: entityGroupId (required) + :return: EntityGroup + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_entity_group_to_edge_using_post_with_http_info(edge_id, group_type, entity_group_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_entity_group_to_edge_using_post_with_http_info(edge_id, group_type, entity_group_id, **kwargs) # noqa: E501 + return data + + def assign_entity_group_to_edge_using_post_with_http_info(self, edge_id, group_type, entity_group_id, **kwargs): # noqa: E501 + """assignEntityGroupToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_entity_group_to_edge_using_post_with_http_info(edge_id, group_type, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str group_type: EntityGroup type (required) + :param str entity_group_id: entityGroupId (required) + :return: EntityGroup + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'group_type', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_entity_group_to_edge_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `assign_entity_group_to_edge_using_post`") # noqa: E501 + # verify the required parameter 'group_type' is set + if ('group_type' not in params or + params['group_type'] is None): + raise ValueError("Missing the required parameter `group_type` when calling `assign_entity_group_to_edge_using_post`") # noqa: E501 + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `assign_entity_group_to_edge_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'group_type' in params: + path_params['groupType'] = params['group_type'] # noqa: E501 + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/entityGroup/{entityGroupId}/{groupType}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityGroup', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_entity_group_using_delete(self, entity_group_id, **kwargs): # noqa: E501 + """deleteEntityGroup # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_group_using_delete(entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_entity_group_using_delete_with_http_info(entity_group_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_entity_group_using_delete_with_http_info(entity_group_id, **kwargs) # noqa: E501 + return data + + def delete_entity_group_using_delete_with_http_info(self, entity_group_id, **kwargs): # noqa: E501 + """deleteEntityGroup # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_group_using_delete_with_http_info(entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_entity_group_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `delete_entity_group_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_all_edge_entity_groups_using_get(self, edge_id, group_type, **kwargs): # noqa: E501 + """getAllEdgeEntityGroups # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_all_edge_entity_groups_using_get(edge_id, group_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str group_type: EntityGroup type (required) + :return: list[EntityGroupInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_all_edge_entity_groups_using_get_with_http_info(edge_id, group_type, **kwargs) # noqa: E501 + else: + (data) = self.get_all_edge_entity_groups_using_get_with_http_info(edge_id, group_type, **kwargs) # noqa: E501 + return data + + def get_all_edge_entity_groups_using_get_with_http_info(self, edge_id, group_type, **kwargs): # noqa: E501 + """getAllEdgeEntityGroups # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_all_edge_entity_groups_using_get_with_http_info(edge_id, group_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str group_type: EntityGroup type (required) + :return: list[EntityGroupInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'group_type'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_all_edge_entity_groups_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_all_edge_entity_groups_using_get`") # noqa: E501 + # verify the required parameter 'group_type' is set + if ('group_type' not in params or + params['group_type'] is None): + raise ValueError("Missing the required parameter `group_type` when calling `get_all_edge_entity_groups_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'group_type' in params: + path_params['groupType'] = params['group_type'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/allEntityGroups/edge/{edgeId}/{groupType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityGroupInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edge_entity_groups_using_get(self, edge_id, group_type, page_size, page, **kwargs): # noqa: E501 + """getEdgeEntityGroups # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_entity_groups_using_get(edge_id, group_type, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str group_type: EntityGroup type (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityGroupInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_entity_groups_using_get_with_http_info(edge_id, group_type, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_edge_entity_groups_using_get_with_http_info(edge_id, group_type, page_size, page, **kwargs) # noqa: E501 + return data + + def get_edge_entity_groups_using_get_with_http_info(self, edge_id, group_type, page_size, page, **kwargs): # noqa: E501 + """getEdgeEntityGroups # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_entity_groups_using_get_with_http_info(edge_id, group_type, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str group_type: EntityGroup type (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityGroupInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'group_type', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_entity_groups_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_edge_entity_groups_using_get`") # noqa: E501 + # verify the required parameter 'group_type' is set + if ('group_type' not in params or + params['group_type'] is None): + raise ValueError("Missing the required parameter `group_type` when calling `get_edge_entity_groups_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_edge_entity_groups_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_edge_entity_groups_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'group_type' in params: + path_params['groupType'] = params['group_type'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroups/edge/{edgeId}/{groupType}{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEntityGroupInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entities_using_get(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getEntities # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entities_using_get(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataShortEntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entities_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_entities_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_entities_using_get_with_http_info(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getEntities # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entities_using_get_with_http_info(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataShortEntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entities_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `get_entities_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_entities_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_entities_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/entities{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataShortEntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_group_all_by_owner_and_type_using_get(self, owner_type, owner_id, group_type, **kwargs): # noqa: E501 + """getEntityGroupAllByOwnerAndType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_group_all_by_owner_and_type_using_get(owner_type, owner_id, group_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str owner_type: ownerType (required) + :param str owner_id: ownerId (required) + :param str group_type: EntityGroup type (required) + :return: EntityGroupInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_group_all_by_owner_and_type_using_get_with_http_info(owner_type, owner_id, group_type, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_group_all_by_owner_and_type_using_get_with_http_info(owner_type, owner_id, group_type, **kwargs) # noqa: E501 + return data + + def get_entity_group_all_by_owner_and_type_using_get_with_http_info(self, owner_type, owner_id, group_type, **kwargs): # noqa: E501 + """getEntityGroupAllByOwnerAndType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_group_all_by_owner_and_type_using_get_with_http_info(owner_type, owner_id, group_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str owner_type: ownerType (required) + :param str owner_id: ownerId (required) + :param str group_type: EntityGroup type (required) + :return: EntityGroupInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['owner_type', 'owner_id', 'group_type'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_group_all_by_owner_and_type_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'owner_type' is set + if ('owner_type' not in params or + params['owner_type'] is None): + raise ValueError("Missing the required parameter `owner_type` when calling `get_entity_group_all_by_owner_and_type_using_get`") # noqa: E501 + # verify the required parameter 'owner_id' is set + if ('owner_id' not in params or + params['owner_id'] is None): + raise ValueError("Missing the required parameter `owner_id` when calling `get_entity_group_all_by_owner_and_type_using_get`") # noqa: E501 + # verify the required parameter 'group_type' is set + if ('group_type' not in params or + params['group_type'] is None): + raise ValueError("Missing the required parameter `group_type` when calling `get_entity_group_all_by_owner_and_type_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'owner_type' in params: + path_params['ownerType'] = params['owner_type'] # noqa: E501 + if 'owner_id' in params: + path_params['ownerId'] = params['owner_id'] # noqa: E501 + if 'group_type' in params: + path_params['groupType'] = params['group_type'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/all/{ownerType}/{ownerId}/{groupType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityGroupInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_group_by_id_using_get(self, entity_group_id, **kwargs): # noqa: E501 + """getEntityGroupById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_group_by_id_using_get(entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :return: EntityGroupInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_group_by_id_using_get_with_http_info(entity_group_id, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_group_by_id_using_get_with_http_info(entity_group_id, **kwargs) # noqa: E501 + return data + + def get_entity_group_by_id_using_get_with_http_info(self, entity_group_id, **kwargs): # noqa: E501 + """getEntityGroupById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_group_by_id_using_get_with_http_info(entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :return: EntityGroupInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_group_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `get_entity_group_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityGroupInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_group_by_owner_and_name_and_type_using_get(self, owner_type, owner_id, group_type, group_name, **kwargs): # noqa: E501 + """getEntityGroupByOwnerAndNameAndType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_group_by_owner_and_name_and_type_using_get(owner_type, owner_id, group_type, group_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str owner_type: ownerType (required) + :param str owner_id: ownerId (required) + :param str group_type: EntityGroup type (required) + :param str group_name: groupName (required) + :return: EntityGroupInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_group_by_owner_and_name_and_type_using_get_with_http_info(owner_type, owner_id, group_type, group_name, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_group_by_owner_and_name_and_type_using_get_with_http_info(owner_type, owner_id, group_type, group_name, **kwargs) # noqa: E501 + return data + + def get_entity_group_by_owner_and_name_and_type_using_get_with_http_info(self, owner_type, owner_id, group_type, group_name, **kwargs): # noqa: E501 + """getEntityGroupByOwnerAndNameAndType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_group_by_owner_and_name_and_type_using_get_with_http_info(owner_type, owner_id, group_type, group_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str owner_type: ownerType (required) + :param str owner_id: ownerId (required) + :param str group_type: EntityGroup type (required) + :param str group_name: groupName (required) + :return: EntityGroupInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['owner_type', 'owner_id', 'group_type', 'group_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_group_by_owner_and_name_and_type_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'owner_type' is set + if ('owner_type' not in params or + params['owner_type'] is None): + raise ValueError("Missing the required parameter `owner_type` when calling `get_entity_group_by_owner_and_name_and_type_using_get`") # noqa: E501 + # verify the required parameter 'owner_id' is set + if ('owner_id' not in params or + params['owner_id'] is None): + raise ValueError("Missing the required parameter `owner_id` when calling `get_entity_group_by_owner_and_name_and_type_using_get`") # noqa: E501 + # verify the required parameter 'group_type' is set + if ('group_type' not in params or + params['group_type'] is None): + raise ValueError("Missing the required parameter `group_type` when calling `get_entity_group_by_owner_and_name_and_type_using_get`") # noqa: E501 + # verify the required parameter 'group_name' is set + if ('group_name' not in params or + params['group_name'] is None): + raise ValueError("Missing the required parameter `group_name` when calling `get_entity_group_by_owner_and_name_and_type_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'owner_type' in params: + path_params['ownerType'] = params['owner_type'] # noqa: E501 + if 'owner_id' in params: + path_params['ownerId'] = params['owner_id'] # noqa: E501 + if 'group_type' in params: + path_params['groupType'] = params['group_type'] # noqa: E501 + if 'group_name' in params: + path_params['groupName'] = params['group_name'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{ownerType}/{ownerId}/{groupType}/{groupName}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityGroupInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_groups_by_ids_using_get(self, entity_group_ids, **kwargs): # noqa: E501 + """getEntityGroupsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_groups_by_ids_using_get(entity_group_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_ids: entityGroupIds (required) + :return: list[EntityGroup] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_groups_by_ids_using_get_with_http_info(entity_group_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_groups_by_ids_using_get_with_http_info(entity_group_ids, **kwargs) # noqa: E501 + return data + + def get_entity_groups_by_ids_using_get_with_http_info(self, entity_group_ids, **kwargs): # noqa: E501 + """getEntityGroupsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_groups_by_ids_using_get_with_http_info(entity_group_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_ids: entityGroupIds (required) + :return: list[EntityGroup] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_groups_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_ids' is set + if ('entity_group_ids' not in params or + params['entity_group_ids'] is None): + raise ValueError("Missing the required parameter `entity_group_ids` when calling `get_entity_groups_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'entity_group_ids' in params: + query_params.append(('entityGroupIds', params['entity_group_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroups{?entityGroupIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityGroup]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_groups_by_owner_and_type_using_get(self, owner_type, owner_id, group_type, **kwargs): # noqa: E501 + """getEntityGroupsByOwnerAndType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_groups_by_owner_and_type_using_get(owner_type, owner_id, group_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str owner_type: ownerType (required) + :param str owner_id: ownerId (required) + :param str group_type: EntityGroup type (required) + :return: list[EntityGroupInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_groups_by_owner_and_type_using_get_with_http_info(owner_type, owner_id, group_type, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_groups_by_owner_and_type_using_get_with_http_info(owner_type, owner_id, group_type, **kwargs) # noqa: E501 + return data + + def get_entity_groups_by_owner_and_type_using_get_with_http_info(self, owner_type, owner_id, group_type, **kwargs): # noqa: E501 + """getEntityGroupsByOwnerAndType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_groups_by_owner_and_type_using_get_with_http_info(owner_type, owner_id, group_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str owner_type: ownerType (required) + :param str owner_id: ownerId (required) + :param str group_type: EntityGroup type (required) + :return: list[EntityGroupInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['owner_type', 'owner_id', 'group_type'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_groups_by_owner_and_type_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'owner_type' is set + if ('owner_type' not in params or + params['owner_type'] is None): + raise ValueError("Missing the required parameter `owner_type` when calling `get_entity_groups_by_owner_and_type_using_get`") # noqa: E501 + # verify the required parameter 'owner_id' is set + if ('owner_id' not in params or + params['owner_id'] is None): + raise ValueError("Missing the required parameter `owner_id` when calling `get_entity_groups_by_owner_and_type_using_get`") # noqa: E501 + # verify the required parameter 'group_type' is set + if ('group_type' not in params or + params['group_type'] is None): + raise ValueError("Missing the required parameter `group_type` when calling `get_entity_groups_by_owner_and_type_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'owner_type' in params: + path_params['ownerType'] = params['owner_type'] # noqa: E501 + if 'owner_id' in params: + path_params['ownerId'] = params['owner_id'] # noqa: E501 + if 'group_type' in params: + path_params['groupType'] = params['group_type'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroups/{ownerType}/{ownerId}/{groupType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityGroupInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_groups_by_type_using_get(self, group_type, **kwargs): # noqa: E501 + """getEntityGroupsByType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_groups_by_type_using_get(group_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str group_type: EntityGroup type (required) + :return: list[EntityGroupInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_groups_by_type_using_get_with_http_info(group_type, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_groups_by_type_using_get_with_http_info(group_type, **kwargs) # noqa: E501 + return data + + def get_entity_groups_by_type_using_get_with_http_info(self, group_type, **kwargs): # noqa: E501 + """getEntityGroupsByType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_groups_by_type_using_get_with_http_info(group_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str group_type: EntityGroup type (required) + :return: list[EntityGroupInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['group_type'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_groups_by_type_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'group_type' is set + if ('group_type' not in params or + params['group_type'] is None): + raise ValueError("Missing the required parameter `group_type` when calling `get_entity_groups_by_type_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'group_type' in params: + path_params['groupType'] = params['group_type'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroups/{groupType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityGroupInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_groups_for_entity_using_get(self, entity_type, entity_id, **kwargs): # noqa: E501 + """getEntityGroupsForEntity # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_groups_for_entity_using_get(entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param str entity_id: entityId (required) + :return: list[EntityGroupId] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_groups_for_entity_using_get_with_http_info(entity_type, entity_id, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_groups_for_entity_using_get_with_http_info(entity_type, entity_id, **kwargs) # noqa: E501 + return data + + def get_entity_groups_for_entity_using_get_with_http_info(self, entity_type, entity_id, **kwargs): # noqa: E501 + """getEntityGroupsForEntity # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_groups_for_entity_using_get_with_http_info(entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: Entity type (required) + :param str entity_id: entityId (required) + :return: list[EntityGroupId] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_groups_for_entity_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_entity_groups_for_entity_using_get`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_entity_groups_for_entity_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroups/{entityType}/{entityId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityGroupId]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_group_entity_using_get(self, entity_group_id, entity_id, **kwargs): # noqa: E501 + """getGroupEntity # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_group_entity_using_get(entity_group_id, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str entity_id: entityId (required) + :return: ShortEntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_group_entity_using_get_with_http_info(entity_group_id, entity_id, **kwargs) # noqa: E501 + else: + (data) = self.get_group_entity_using_get_with_http_info(entity_group_id, entity_id, **kwargs) # noqa: E501 + return data + + def get_group_entity_using_get_with_http_info(self, entity_group_id, entity_id, **kwargs): # noqa: E501 + """getGroupEntity # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_group_entity_using_get_with_http_info(entity_group_id, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str entity_id: entityId (required) + :return: ShortEntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id', 'entity_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_group_entity_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `get_group_entity_using_get`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_group_entity_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/{entityId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='ShortEntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_owners_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getOwners # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_owners_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataContactBasedobject + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_owners_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_owners_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_owners_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getOwners # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_owners_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataContactBasedobject + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_owners_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_owners_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_owners_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/owners{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataContactBasedobject', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def make_entity_group_private_using_post(self, entity_group_id, **kwargs): # noqa: E501 + """makeEntityGroupPrivate # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.make_entity_group_private_using_post(entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.make_entity_group_private_using_post_with_http_info(entity_group_id, **kwargs) # noqa: E501 + else: + (data) = self.make_entity_group_private_using_post_with_http_info(entity_group_id, **kwargs) # noqa: E501 + return data + + def make_entity_group_private_using_post_with_http_info(self, entity_group_id, **kwargs): # noqa: E501 + """makeEntityGroupPrivate # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.make_entity_group_private_using_post_with_http_info(entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method make_entity_group_private_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `make_entity_group_private_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/makePrivate', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def make_entity_group_public_using_post(self, entity_group_id, **kwargs): # noqa: E501 + """makeEntityGroupPublic # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.make_entity_group_public_using_post(entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.make_entity_group_public_using_post_with_http_info(entity_group_id, **kwargs) # noqa: E501 + else: + (data) = self.make_entity_group_public_using_post_with_http_info(entity_group_id, **kwargs) # noqa: E501 + return data + + def make_entity_group_public_using_post_with_http_info(self, entity_group_id, **kwargs): # noqa: E501 + """makeEntityGroupPublic # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.make_entity_group_public_using_post_with_http_info(entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method make_entity_group_public_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `make_entity_group_public_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/makePublic', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def remove_entities_from_entity_group_using_post(self, body, entity_group_id, **kwargs): # noqa: E501 + """removeEntitiesFromEntityGroup # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.remove_entities_from_entity_group_using_post(body, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param list[str] body: strEntityIds (required) + :param str entity_group_id: entityGroupId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.remove_entities_from_entity_group_using_post_with_http_info(body, entity_group_id, **kwargs) # noqa: E501 + else: + (data) = self.remove_entities_from_entity_group_using_post_with_http_info(body, entity_group_id, **kwargs) # noqa: E501 + return data + + def remove_entities_from_entity_group_using_post_with_http_info(self, body, entity_group_id, **kwargs): # noqa: E501 + """removeEntitiesFromEntityGroup # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.remove_entities_from_entity_group_using_post_with_http_info(body, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param list[str] body: strEntityIds (required) + :param str entity_group_id: entityGroupId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method remove_entities_from_entity_group_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `remove_entities_from_entity_group_using_post`") # noqa: E501 + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `remove_entities_from_entity_group_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/deleteEntities', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_entity_group_using_post(self, body, **kwargs): # noqa: E501 + """saveEntityGroup # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_group_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityGroup body: entityGroup (required) + :return: EntityGroupInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_entity_group_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_entity_group_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_entity_group_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveEntityGroup # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_group_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityGroup body: entityGroup (required) + :return: EntityGroupInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_entity_group_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_entity_group_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityGroupInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def share_entity_group_to_child_owner_user_group_using_post(self, entity_group_id, user_group_id, role_id, **kwargs): # noqa: E501 + """shareEntityGroupToChildOwnerUserGroup # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.share_entity_group_to_child_owner_user_group_using_post(entity_group_id, user_group_id, role_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str user_group_id: userGroupId (required) + :param str role_id: roleId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.share_entity_group_to_child_owner_user_group_using_post_with_http_info(entity_group_id, user_group_id, role_id, **kwargs) # noqa: E501 + else: + (data) = self.share_entity_group_to_child_owner_user_group_using_post_with_http_info(entity_group_id, user_group_id, role_id, **kwargs) # noqa: E501 + return data + + def share_entity_group_to_child_owner_user_group_using_post_with_http_info(self, entity_group_id, user_group_id, role_id, **kwargs): # noqa: E501 + """shareEntityGroupToChildOwnerUserGroup # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.share_entity_group_to_child_owner_user_group_using_post_with_http_info(entity_group_id, user_group_id, role_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str user_group_id: userGroupId (required) + :param str role_id: roleId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id', 'user_group_id', 'role_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method share_entity_group_to_child_owner_user_group_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `share_entity_group_to_child_owner_user_group_using_post`") # noqa: E501 + # verify the required parameter 'user_group_id' is set + if ('user_group_id' not in params or + params['user_group_id'] is None): + raise ValueError("Missing the required parameter `user_group_id` when calling `share_entity_group_to_child_owner_user_group_using_post`") # noqa: E501 + # verify the required parameter 'role_id' is set + if ('role_id' not in params or + params['role_id'] is None): + raise ValueError("Missing the required parameter `role_id` when calling `share_entity_group_to_child_owner_user_group_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + if 'user_group_id' in params: + path_params['userGroupId'] = params['user_group_id'] # noqa: E501 + if 'role_id' in params: + path_params['roleId'] = params['role_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/{userGroupId}/{roleId}/share', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def share_entity_group_using_post(self, body, entity_group_id, **kwargs): # noqa: E501 + """shareEntityGroup # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.share_entity_group_using_post(body, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param ShareGroupRequest body: shareGroupRequest (required) + :param str entity_group_id: entityGroupId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.share_entity_group_using_post_with_http_info(body, entity_group_id, **kwargs) # noqa: E501 + else: + (data) = self.share_entity_group_using_post_with_http_info(body, entity_group_id, **kwargs) # noqa: E501 + return data + + def share_entity_group_using_post_with_http_info(self, body, entity_group_id, **kwargs): # noqa: E501 + """shareEntityGroup # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.share_entity_group_using_post_with_http_info(body, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param ShareGroupRequest body: shareGroupRequest (required) + :param str entity_group_id: entityGroupId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method share_entity_group_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `share_entity_group_using_post`") # noqa: E501 + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `share_entity_group_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/share', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_entity_group_from_edge_using_delete(self, edge_id, group_type, entity_group_id, **kwargs): # noqa: E501 + """unassignEntityGroupFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_entity_group_from_edge_using_delete(edge_id, group_type, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str group_type: EntityGroup type (required) + :param str entity_group_id: entityGroupId (required) + :return: EntityGroup + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_entity_group_from_edge_using_delete_with_http_info(edge_id, group_type, entity_group_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_entity_group_from_edge_using_delete_with_http_info(edge_id, group_type, entity_group_id, **kwargs) # noqa: E501 + return data + + def unassign_entity_group_from_edge_using_delete_with_http_info(self, edge_id, group_type, entity_group_id, **kwargs): # noqa: E501 + """unassignEntityGroupFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_entity_group_from_edge_using_delete_with_http_info(edge_id, group_type, entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str group_type: EntityGroup type (required) + :param str entity_group_id: entityGroupId (required) + :return: EntityGroup + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'group_type', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_entity_group_from_edge_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `unassign_entity_group_from_edge_using_delete`") # noqa: E501 + # verify the required parameter 'group_type' is set + if ('group_type' not in params or + params['group_type'] is None): + raise ValueError("Missing the required parameter `group_type` when calling `unassign_entity_group_from_edge_using_delete`") # noqa: E501 + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `unassign_entity_group_from_edge_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'group_type' in params: + path_params['groupType'] = params['group_type'] # noqa: E501 + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/entityGroup/{entityGroupId}/{groupType}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityGroup', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/entity_view_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/entity_view_controller_api.py new file mode 100644 index 0000000..4e3001f --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/entity_view_controller_api.py @@ -0,0 +1,1164 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class EntityViewControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_entity_view_using_delete(self, entity_view_id, **kwargs): # noqa: E501 + """deleteEntityView # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_view_using_delete(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_entity_view_using_delete_with_http_info(entity_view_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_entity_view_using_delete_with_http_info(entity_view_id, **kwargs) # noqa: E501 + return data + + def delete_entity_view_using_delete_with_http_info(self, entity_view_id, **kwargs): # noqa: E501 + """deleteEntityView # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_view_using_delete_with_http_info(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_view_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_entity_view_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_view_id' is set + if ('entity_view_id' not in params or + params['entity_view_id'] is None): + raise ValueError("Missing the required parameter `entity_view_id` when calling `delete_entity_view_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_view_id' in params: + path_params['entityViewId'] = params['entity_view_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityView/{entityViewId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_query_using_post4(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post4(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityViewSearchQuery body: query (required) + :return: list[EntityView] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_query_using_post4_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.find_by_query_using_post4_with_http_info(body, **kwargs) # noqa: E501 + return data + + def find_by_query_using_post4_with_http_info(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post4_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityViewSearchQuery body: query (required) + :return: list[EntityView] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_query_using_post4" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_by_query_using_post4`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityViews', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityView]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_entity_views_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerEntityViews # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_entity_views_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_entity_views_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_entity_views_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_entity_views_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerEntityViews # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_entity_views_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_entity_views_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_entity_views_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_entity_views_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_entity_views_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/entityViews{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_view_by_id_using_get(self, entity_view_id, **kwargs): # noqa: E501 + """getEntityViewById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_view_by_id_using_get(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_view_by_id_using_get_with_http_info(entity_view_id, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_view_by_id_using_get_with_http_info(entity_view_id, **kwargs) # noqa: E501 + return data + + def get_entity_view_by_id_using_get_with_http_info(self, entity_view_id, **kwargs): # noqa: E501 + """getEntityViewById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_view_by_id_using_get_with_http_info(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_view_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_view_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_view_id' is set + if ('entity_view_id' not in params or + params['entity_view_id'] is None): + raise ValueError("Missing the required parameter `entity_view_id` when calling `get_entity_view_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_view_id' in params: + path_params['entityViewId'] = params['entity_view_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityView/{entityViewId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_view_types_using_get(self, **kwargs): # noqa: E501 + """getEntityViewTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_view_types_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_view_types_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_entity_view_types_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_entity_view_types_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getEntityViewTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_view_types_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_view_types_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityView/types', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntitySubtype]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_views_by_entity_group_id_using_get(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getEntityViewsByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_views_by_entity_group_id_using_get(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_views_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_views_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_entity_views_by_entity_group_id_using_get_with_http_info(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getEntityViewsByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_views_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_views_by_entity_group_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `get_entity_views_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_entity_views_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_entity_views_by_entity_group_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/entityViews{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_views_by_ids_using_get(self, entity_view_ids, **kwargs): # noqa: E501 + """getEntityViewsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_views_by_ids_using_get(entity_view_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_ids: entityViewIds (required) + :return: list[EntityView] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_views_by_ids_using_get_with_http_info(entity_view_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_views_by_ids_using_get_with_http_info(entity_view_ids, **kwargs) # noqa: E501 + return data + + def get_entity_views_by_ids_using_get_with_http_info(self, entity_view_ids, **kwargs): # noqa: E501 + """getEntityViewsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_views_by_ids_using_get_with_http_info(entity_view_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_ids: entityViewIds (required) + :return: list[EntityView] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_view_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_views_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_view_ids' is set + if ('entity_view_ids' not in params or + params['entity_view_ids'] is None): + raise ValueError("Missing the required parameter `entity_view_ids` when calling `get_entity_views_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'entity_view_ids' in params: + query_params.append(('entityViewIds', params['entity_view_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityViews{?entityViewIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityView]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_entity_view_using_get(self, entity_view_name, **kwargs): # noqa: E501 + """getTenantEntityView # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_entity_view_using_get(entity_view_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_name: entityViewName (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_entity_view_using_get_with_http_info(entity_view_name, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_entity_view_using_get_with_http_info(entity_view_name, **kwargs) # noqa: E501 + return data + + def get_tenant_entity_view_using_get_with_http_info(self, entity_view_name, **kwargs): # noqa: E501 + """getTenantEntityView # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_entity_view_using_get_with_http_info(entity_view_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_name: entityViewName (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_view_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_entity_view_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_view_name' is set + if ('entity_view_name' not in params or + params['entity_view_name'] is None): + raise ValueError("Missing the required parameter `entity_view_name` when calling `get_tenant_entity_view_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'entity_view_name' in params: + query_params.append(('entityViewName', params['entity_view_name'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/entityViews{?entityViewName}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_entity_views_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantEntityViews # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_entity_views_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_entity_views_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_entity_views_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_entity_views_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantEntityViews # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_entity_views_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_entity_views_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_entity_views_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_entity_views_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/entityViews{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_entity_views_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getUserEntityViews # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_entity_views_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_entity_views_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_user_entity_views_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_user_entity_views_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getUserEntityViews # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_entity_views_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_entity_views_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_user_entity_views_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_user_entity_views_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/entityViews{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_entity_view_using_post(self, body, **kwargs): # noqa: E501 + """saveEntityView # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_view_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityView body: entityView (required) + :param str entity_group_id: entityGroupId + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_entity_view_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_entity_view_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_entity_view_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveEntityView # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_view_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityView body: entityView (required) + :param str entity_group_id: entityGroupId + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_entity_view_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_entity_view_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'entity_group_id' in params: + query_params.append(('entityGroupId', params['entity_group_id'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityView{?entityGroupId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/group_permission_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/group_permission_controller_api.py new file mode 100644 index 0000000..3dbd0a1 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/group_permission_controller_api.py @@ -0,0 +1,696 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class GroupPermissionControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_group_permission_using_delete(self, group_permission_id, **kwargs): # noqa: E501 + """deleteGroupPermission # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_group_permission_using_delete(group_permission_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str group_permission_id: groupPermissionId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_group_permission_using_delete_with_http_info(group_permission_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_group_permission_using_delete_with_http_info(group_permission_id, **kwargs) # noqa: E501 + return data + + def delete_group_permission_using_delete_with_http_info(self, group_permission_id, **kwargs): # noqa: E501 + """deleteGroupPermission # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_group_permission_using_delete_with_http_info(group_permission_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str group_permission_id: groupPermissionId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['group_permission_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_group_permission_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'group_permission_id' is set + if ('group_permission_id' not in params or + params['group_permission_id'] is None): + raise ValueError("Missing the required parameter `group_permission_id` when calling `delete_group_permission_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'group_permission_id' in params: + path_params['groupPermissionId'] = params['group_permission_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/groupPermission/{groupPermissionId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_group_permissions_using_get(self, entity_group_id, **kwargs): # noqa: E501 + """getEntityGroupPermissions # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_group_permissions_using_get(entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :return: list[GroupPermissionInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_group_permissions_using_get_with_http_info(entity_group_id, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_group_permissions_using_get_with_http_info(entity_group_id, **kwargs) # noqa: E501 + return data + + def get_entity_group_permissions_using_get_with_http_info(self, entity_group_id, **kwargs): # noqa: E501 + """getEntityGroupPermissions # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_group_permissions_using_get_with_http_info(entity_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :return: list[GroupPermissionInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_group_permissions_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `get_entity_group_permissions_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/groupPermissions', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[GroupPermissionInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_group_permission_by_id_using_get(self, group_permission_id, **kwargs): # noqa: E501 + """getGroupPermissionById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_group_permission_by_id_using_get(group_permission_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str group_permission_id: groupPermissionId (required) + :return: GroupPermission + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_group_permission_by_id_using_get_with_http_info(group_permission_id, **kwargs) # noqa: E501 + else: + (data) = self.get_group_permission_by_id_using_get_with_http_info(group_permission_id, **kwargs) # noqa: E501 + return data + + def get_group_permission_by_id_using_get_with_http_info(self, group_permission_id, **kwargs): # noqa: E501 + """getGroupPermissionById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_group_permission_by_id_using_get_with_http_info(group_permission_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str group_permission_id: groupPermissionId (required) + :return: GroupPermission + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['group_permission_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_group_permission_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'group_permission_id' is set + if ('group_permission_id' not in params or + params['group_permission_id'] is None): + raise ValueError("Missing the required parameter `group_permission_id` when calling `get_group_permission_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'group_permission_id' in params: + path_params['groupPermissionId'] = params['group_permission_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/groupPermission/{groupPermissionId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='GroupPermission', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_group_permission_info_by_id_using_get(self, group_permission_id, is_user_group, **kwargs): # noqa: E501 + """getGroupPermissionInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_group_permission_info_by_id_using_get(group_permission_id, is_user_group, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str group_permission_id: groupPermissionId (required) + :param bool is_user_group: isUserGroup (required) + :return: GroupPermissionInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_group_permission_info_by_id_using_get_with_http_info(group_permission_id, is_user_group, **kwargs) # noqa: E501 + else: + (data) = self.get_group_permission_info_by_id_using_get_with_http_info(group_permission_id, is_user_group, **kwargs) # noqa: E501 + return data + + def get_group_permission_info_by_id_using_get_with_http_info(self, group_permission_id, is_user_group, **kwargs): # noqa: E501 + """getGroupPermissionInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_group_permission_info_by_id_using_get_with_http_info(group_permission_id, is_user_group, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str group_permission_id: groupPermissionId (required) + :param bool is_user_group: isUserGroup (required) + :return: GroupPermissionInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['group_permission_id', 'is_user_group'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_group_permission_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'group_permission_id' is set + if ('group_permission_id' not in params or + params['group_permission_id'] is None): + raise ValueError("Missing the required parameter `group_permission_id` when calling `get_group_permission_info_by_id_using_get`") # noqa: E501 + # verify the required parameter 'is_user_group' is set + if ('is_user_group' not in params or + params['is_user_group'] is None): + raise ValueError("Missing the required parameter `is_user_group` when calling `get_group_permission_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'group_permission_id' in params: + path_params['groupPermissionId'] = params['group_permission_id'] # noqa: E501 + + query_params = [] + if 'is_user_group' in params: + query_params.append(('isUserGroup', params['is_user_group'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/groupPermission/info/{groupPermissionId}{?isUserGroup}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='GroupPermissionInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_group_permissions_using_get(self, user_group_id, **kwargs): # noqa: E501 + """getUserGroupPermissions # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_group_permissions_using_get(user_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_group_id: userGroupId (required) + :return: list[GroupPermissionInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_group_permissions_using_get_with_http_info(user_group_id, **kwargs) # noqa: E501 + else: + (data) = self.get_user_group_permissions_using_get_with_http_info(user_group_id, **kwargs) # noqa: E501 + return data + + def get_user_group_permissions_using_get_with_http_info(self, user_group_id, **kwargs): # noqa: E501 + """getUserGroupPermissions # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_group_permissions_using_get_with_http_info(user_group_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_group_id: userGroupId (required) + :return: list[GroupPermissionInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_group_permissions_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_group_id' is set + if ('user_group_id' not in params or + params['user_group_id'] is None): + raise ValueError("Missing the required parameter `user_group_id` when calling `get_user_group_permissions_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'user_group_id' in params: + path_params['userGroupId'] = params['user_group_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/userGroup/{userGroupId}/groupPermissions', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[GroupPermissionInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def load_user_group_permission_infos_using_post(self, body, **kwargs): # noqa: E501 + """loadUserGroupPermissionInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.load_user_group_permission_infos_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param list[GroupPermission] body: permissions (required) + :return: list[GroupPermissionInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.load_user_group_permission_infos_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.load_user_group_permission_infos_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def load_user_group_permission_infos_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """loadUserGroupPermissionInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.load_user_group_permission_infos_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param list[GroupPermission] body: permissions (required) + :return: list[GroupPermissionInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method load_user_group_permission_infos_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `load_user_group_permission_infos_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/userGroup/groupPermissions/info', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[GroupPermissionInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_group_permission_using_post(self, body, **kwargs): # noqa: E501 + """saveGroupPermission # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_group_permission_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param GroupPermission body: groupPermission (required) + :return: GroupPermission + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_group_permission_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_group_permission_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_group_permission_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveGroupPermission # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_group_permission_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param GroupPermission body: groupPermission (required) + :return: GroupPermission + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_group_permission_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_group_permission_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/groupPermission', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='GroupPermission', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/http_integration_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/http_integration_controller_api.py new file mode 100644 index 0000000..7aed8ad --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/http_integration_controller_api.py @@ -0,0 +1,344 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class HttpIntegrationControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def check_status_using_get(self, routing_key, request_params, request_headers, **kwargs): # noqa: E501 + """checkStatus # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_status_using_get(routing_key, request_params, request_headers, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str routing_key: routingKey (required) + :param Object request_params: requestParams (required) + :param Object request_headers: requestHeaders (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.check_status_using_get_with_http_info(routing_key, request_params, request_headers, **kwargs) # noqa: E501 + else: + (data) = self.check_status_using_get_with_http_info(routing_key, request_params, request_headers, **kwargs) # noqa: E501 + return data + + def check_status_using_get_with_http_info(self, routing_key, request_params, request_headers, **kwargs): # noqa: E501 + """checkStatus # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_status_using_get_with_http_info(routing_key, request_params, request_headers, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str routing_key: routingKey (required) + :param Object request_params: requestParams (required) + :param Object request_headers: requestHeaders (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['routing_key', 'request_params', 'request_headers'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method check_status_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `check_status_using_get`") # noqa: E501 + # verify the required parameter 'request_params' is set + if ('request_params' not in params or + params['request_params'] is None): + raise ValueError("Missing the required parameter `request_params` when calling `check_status_using_get`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `check_status_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'request_params' in params: + query_params.append(('requestParams', params['request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/http/{routingKey}{?requestParams}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_post1(self, routing_key, suffix, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post1(routing_key, suffix, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str routing_key: routingKey (required) + :param str suffix: suffix (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_post1_with_http_info(routing_key, suffix, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_post1_with_http_info(routing_key, suffix, **kwargs) # noqa: E501 + return data + + def process_request_using_post1_with_http_info(self, routing_key, suffix, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post1_with_http_info(routing_key, suffix, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str routing_key: routingKey (required) + :param str suffix: suffix (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['routing_key', 'suffix'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_post1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_post1`") # noqa: E501 + # verify the required parameter 'suffix' is set + if ('suffix' not in params or + params['suffix'] is None): + raise ValueError("Missing the required parameter `suffix` when calling `process_request_using_post1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + if 'suffix' in params: + path_params['suffix'] = params['suffix'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/http/{routingKey}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_post2(self, routing_key, suffix, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post2(routing_key, suffix, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str routing_key: routingKey (required) + :param str suffix: suffix (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_post2_with_http_info(routing_key, suffix, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_post2_with_http_info(routing_key, suffix, **kwargs) # noqa: E501 + return data + + def process_request_using_post2_with_http_info(self, routing_key, suffix, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post2_with_http_info(routing_key, suffix, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str routing_key: routingKey (required) + :param str suffix: suffix (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['routing_key', 'suffix'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_post2" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_post2`") # noqa: E501 + # verify the required parameter 'suffix' is set + if ('suffix' not in params or + params['suffix'] is None): + raise ValueError("Missing the required parameter `suffix` when calling `process_request_using_post2`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + if 'suffix' in params: + path_params['suffix'] = params['suffix'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/http/{routingKey}/{suffix}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/integration_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/integration_controller_api.py new file mode 100644 index 0000000..ef494ce --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/integration_controller_api.py @@ -0,0 +1,704 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class IntegrationControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def check_integration_connection_using_post(self, body, **kwargs): # noqa: E501 + """checkIntegrationConnection # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_integration_connection_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Integration body: integration (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.check_integration_connection_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.check_integration_connection_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def check_integration_connection_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """checkIntegrationConnection # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_integration_connection_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Integration body: integration (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method check_integration_connection_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `check_integration_connection_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/integration/check', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_integration_using_delete(self, integration_id, **kwargs): # noqa: E501 + """deleteIntegration # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_integration_using_delete(integration_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str integration_id: integrationId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_integration_using_delete_with_http_info(integration_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_integration_using_delete_with_http_info(integration_id, **kwargs) # noqa: E501 + return data + + def delete_integration_using_delete_with_http_info(self, integration_id, **kwargs): # noqa: E501 + """deleteIntegration # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_integration_using_delete_with_http_info(integration_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str integration_id: integrationId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['integration_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_integration_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'integration_id' is set + if ('integration_id' not in params or + params['integration_id'] is None): + raise ValueError("Missing the required parameter `integration_id` when calling `delete_integration_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'integration_id' in params: + path_params['integrationId'] = params['integration_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/integration/{integrationId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_integration_by_id_using_get(self, integration_id, **kwargs): # noqa: E501 + """getIntegrationById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_integration_by_id_using_get(integration_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str integration_id: integrationId (required) + :return: Integration + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_integration_by_id_using_get_with_http_info(integration_id, **kwargs) # noqa: E501 + else: + (data) = self.get_integration_by_id_using_get_with_http_info(integration_id, **kwargs) # noqa: E501 + return data + + def get_integration_by_id_using_get_with_http_info(self, integration_id, **kwargs): # noqa: E501 + """getIntegrationById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_integration_by_id_using_get_with_http_info(integration_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str integration_id: integrationId (required) + :return: Integration + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['integration_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_integration_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'integration_id' is set + if ('integration_id' not in params or + params['integration_id'] is None): + raise ValueError("Missing the required parameter `integration_id` when calling `get_integration_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'integration_id' in params: + path_params['integrationId'] = params['integration_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/integration/{integrationId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Integration', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_integration_by_routing_key_using_get(self, routing_key, **kwargs): # noqa: E501 + """getIntegrationByRoutingKey # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_integration_by_routing_key_using_get(routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str routing_key: routingKey (required) + :return: Integration + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_integration_by_routing_key_using_get_with_http_info(routing_key, **kwargs) # noqa: E501 + else: + (data) = self.get_integration_by_routing_key_using_get_with_http_info(routing_key, **kwargs) # noqa: E501 + return data + + def get_integration_by_routing_key_using_get_with_http_info(self, routing_key, **kwargs): # noqa: E501 + """getIntegrationByRoutingKey # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_integration_by_routing_key_using_get_with_http_info(routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str routing_key: routingKey (required) + :return: Integration + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_integration_by_routing_key_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `get_integration_by_routing_key_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/integration/routingKey/{routingKey}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Integration', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_integrations_by_ids_using_get(self, integration_ids, **kwargs): # noqa: E501 + """getIntegrationsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_integrations_by_ids_using_get(integration_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str integration_ids: integrationIds (required) + :return: list[Integration] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_integrations_by_ids_using_get_with_http_info(integration_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_integrations_by_ids_using_get_with_http_info(integration_ids, **kwargs) # noqa: E501 + return data + + def get_integrations_by_ids_using_get_with_http_info(self, integration_ids, **kwargs): # noqa: E501 + """getIntegrationsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_integrations_by_ids_using_get_with_http_info(integration_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str integration_ids: integrationIds (required) + :return: list[Integration] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['integration_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_integrations_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'integration_ids' is set + if ('integration_ids' not in params or + params['integration_ids'] is None): + raise ValueError("Missing the required parameter `integration_ids` when calling `get_integrations_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'integration_ids' in params: + query_params.append(('integrationIds', params['integration_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/integrations{?integrationIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Integration]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_integrations_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getIntegrations # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_integrations_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataIntegration + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_integrations_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_integrations_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_integrations_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getIntegrations # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_integrations_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataIntegration + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_integrations_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_integrations_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_integrations_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/integrations{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataIntegration', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_integration_using_post(self, body, **kwargs): # noqa: E501 + """saveIntegration # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_integration_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Integration body: integration (required) + :return: Integration + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_integration_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_integration_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_integration_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveIntegration # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_integration_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Integration body: integration (required) + :return: Integration + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_integration_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_integration_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/integration', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Integration', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/loriot_integration_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/loriot_integration_controller_api.py new file mode 100644 index 0000000..3e60f54 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/loriot_integration_controller_api.py @@ -0,0 +1,824 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class LoriotIntegrationControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def process_request_using_delete1(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_delete1(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_delete1_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_delete1_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_delete1_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_delete1_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_delete1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_delete1`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_delete1`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_delete1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/loriot/{routingKey}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_get1(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_get1(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_get1_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_get1_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_get1_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_get1_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_get1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_get1`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_get1`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_get1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/loriot/{routingKey}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_head1(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_head1(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_head1_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_head1_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_head1_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_head1_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_head1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_head1`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_head1`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_head1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/loriot/{routingKey}', 'HEAD', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_options1(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_options1(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_options1_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_options1_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_options1_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_options1_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_options1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_options1`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_options1`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_options1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/loriot/{routingKey}', 'OPTIONS', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_patch1(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_patch1(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_patch1_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_patch1_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_patch1_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_patch1_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_patch1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_patch1`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_patch1`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_patch1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/loriot/{routingKey}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_post9(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post9(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_post9_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_post9_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_post9_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post9_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_post9" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_post9`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_post9`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_post9`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/loriot/{routingKey}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_put1(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_put1(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_put1_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_put1_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_put1_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_put1_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_put1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_put1`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_put1`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_put1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/loriot/{routingKey}', 'PUT', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/lwm_2m_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/lwm_2m_controller_api.py new file mode 100644 index 0000000..995bf9b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/lwm_2m_controller_api.py @@ -0,0 +1,223 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class Lwm2mControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_lwm2m_bootstrap_security_info_using_get(self, is_bootstrap_server, **kwargs): # noqa: E501 + """getLwm2mBootstrapSecurityInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_lwm2m_bootstrap_security_info_using_get(is_bootstrap_server, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param bool is_bootstrap_server: isBootstrapServer (required) + :return: ServerSecurityConfig + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_lwm2m_bootstrap_security_info_using_get_with_http_info(is_bootstrap_server, **kwargs) # noqa: E501 + else: + (data) = self.get_lwm2m_bootstrap_security_info_using_get_with_http_info(is_bootstrap_server, **kwargs) # noqa: E501 + return data + + def get_lwm2m_bootstrap_security_info_using_get_with_http_info(self, is_bootstrap_server, **kwargs): # noqa: E501 + """getLwm2mBootstrapSecurityInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_lwm2m_bootstrap_security_info_using_get_with_http_info(is_bootstrap_server, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param bool is_bootstrap_server: isBootstrapServer (required) + :return: ServerSecurityConfig + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['is_bootstrap_server'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_lwm2m_bootstrap_security_info_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'is_bootstrap_server' is set + if ('is_bootstrap_server' not in params or + params['is_bootstrap_server'] is None): + raise ValueError("Missing the required parameter `is_bootstrap_server` when calling `get_lwm2m_bootstrap_security_info_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'is_bootstrap_server' in params: + path_params['isBootstrapServer'] = params['is_bootstrap_server'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/lwm2m/deviceProfile/bootstrap/{isBootstrapServer}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='ServerSecurityConfig', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_device_with_credentials_using_post(self, **kwargs): # noqa: E501 + """saveDeviceWithCredentials # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_with_credentials_using_post(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param dict(str, object) body: deviceWithDeviceCredentials + :param str entity_group_id: entityGroupId + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_device_with_credentials_using_post_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.save_device_with_credentials_using_post_with_http_info(**kwargs) # noqa: E501 + return data + + def save_device_with_credentials_using_post_with_http_info(self, **kwargs): # noqa: E501 + """saveDeviceWithCredentials # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_with_credentials_using_post_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param dict(str, object) body: deviceWithDeviceCredentials + :param str entity_group_id: entityGroupId + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_device_with_credentials_using_post" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'entity_group_id' in params: + query_params.append(('entityGroupId', params['entity_group_id'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/lwm2m/device-credentials{?entityGroupId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/ocean_connect_integration_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/ocean_connect_integration_controller_api.py new file mode 100644 index 0000000..2b3d570 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/ocean_connect_integration_controller_api.py @@ -0,0 +1,824 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class OceanConnectIntegrationControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def process_request_using_delete2(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_delete2(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_delete2_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_delete2_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_delete2_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_delete2_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_delete2" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_delete2`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_delete2`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_delete2`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/oceanconnect/{routingKey}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_get2(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_get2(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_get2_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_get2_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_get2_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_get2_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_get2" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_get2`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_get2`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_get2`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/oceanconnect/{routingKey}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_head2(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_head2(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_head2_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_head2_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_head2_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_head2_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_head2" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_head2`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_head2`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_head2`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/oceanconnect/{routingKey}', 'HEAD', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_options2(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_options2(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_options2_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_options2_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_options2_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_options2_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_options2" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_options2`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_options2`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_options2`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/oceanconnect/{routingKey}', 'OPTIONS', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_patch2(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_patch2(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_patch2_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_patch2_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_patch2_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_patch2_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_patch2" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_patch2`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_patch2`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_patch2`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/oceanconnect/{routingKey}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_post10(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post10(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_post10_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_post10_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_post10_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post10_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_post10" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_post10`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_post10`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_post10`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/oceanconnect/{routingKey}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_put2(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_put2(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_put2_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_put2_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_put2_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_put2_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_put2" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_put2`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_put2`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_put2`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/oceanconnect/{routingKey}', 'PUT', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/ota_package_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/ota_package_controller_api.py new file mode 100644 index 0000000..5015141 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/ota_package_controller_api.py @@ -0,0 +1,986 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class OtaPackageControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_ota_package_using_delete(self, ota_package_id, **kwargs): # noqa: E501 + """deleteOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_ota_package_using_delete(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_ota_package_using_delete_with_http_info(ota_package_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_ota_package_using_delete_with_http_info(ota_package_id, **kwargs) # noqa: E501 + return data + + def delete_ota_package_using_delete_with_http_info(self, ota_package_id, **kwargs): # noqa: E501 + """deleteOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_ota_package_using_delete_with_http_info(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['ota_package_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_ota_package_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'ota_package_id' is set + if ('ota_package_id' not in params or + params['ota_package_id'] is None): + raise ValueError("Missing the required parameter `ota_package_id` when calling `delete_ota_package_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_id' in params: + path_params['otaPackageId'] = params['ota_package_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackage/{otaPackageId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def download_ota_package_using_get(self, ota_package_id, **kwargs): # noqa: E501 + """downloadOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.download_ota_package_using_get(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: Resource + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.download_ota_package_using_get_with_http_info(ota_package_id, **kwargs) # noqa: E501 + else: + (data) = self.download_ota_package_using_get_with_http_info(ota_package_id, **kwargs) # noqa: E501 + return data + + def download_ota_package_using_get_with_http_info(self, ota_package_id, **kwargs): # noqa: E501 + """downloadOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.download_ota_package_using_get_with_http_info(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: Resource + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['ota_package_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method download_ota_package_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'ota_package_id' is set + if ('ota_package_id' not in params or + params['ota_package_id'] is None): + raise ValueError("Missing the required parameter `ota_package_id` when calling `download_ota_package_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_id' in params: + path_params['otaPackageId'] = params['ota_package_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackage/{otaPackageId}/download', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Resource', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_group_ota_packages_using_get(self, group_id, type, page_size, page, **kwargs): # noqa: E501 + """getGroupOtaPackages # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_group_ota_packages_using_get(group_id, type, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str group_id: groupId (required) + :param str type: type (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataOtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_group_ota_packages_using_get_with_http_info(group_id, type, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_group_ota_packages_using_get_with_http_info(group_id, type, page_size, page, **kwargs) # noqa: E501 + return data + + def get_group_ota_packages_using_get_with_http_info(self, group_id, type, page_size, page, **kwargs): # noqa: E501 + """getGroupOtaPackages # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_group_ota_packages_using_get_with_http_info(group_id, type, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str group_id: groupId (required) + :param str type: type (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataOtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['group_id', 'type', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_group_ota_packages_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'group_id' is set + if ('group_id' not in params or + params['group_id'] is None): + raise ValueError("Missing the required parameter `group_id` when calling `get_group_ota_packages_using_get`") # noqa: E501 + # verify the required parameter 'type' is set + if ('type' not in params or + params['type'] is None): + raise ValueError("Missing the required parameter `type` when calling `get_group_ota_packages_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_group_ota_packages_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_group_ota_packages_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'group_id' in params: + path_params['groupId'] = params['group_id'] # noqa: E501 + if 'type' in params: + path_params['type'] = params['type'] # noqa: E501 + + query_params = [] + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackages/group/{groupId}/{type}{?pageSize,page,textSearch,sortProperty,sortOrder}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataOtaPackageInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_ota_package_by_id_using_get(self, ota_package_id, **kwargs): # noqa: E501 + """getOtaPackageById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_package_by_id_using_get(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: OtaPackage + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_ota_package_by_id_using_get_with_http_info(ota_package_id, **kwargs) # noqa: E501 + else: + (data) = self.get_ota_package_by_id_using_get_with_http_info(ota_package_id, **kwargs) # noqa: E501 + return data + + def get_ota_package_by_id_using_get_with_http_info(self, ota_package_id, **kwargs): # noqa: E501 + """getOtaPackageById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_package_by_id_using_get_with_http_info(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: OtaPackage + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['ota_package_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_ota_package_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'ota_package_id' is set + if ('ota_package_id' not in params or + params['ota_package_id'] is None): + raise ValueError("Missing the required parameter `ota_package_id` when calling `get_ota_package_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_id' in params: + path_params['otaPackageId'] = params['ota_package_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackage/{otaPackageId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='OtaPackage', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_ota_package_info_by_id_using_get(self, ota_package_id, **kwargs): # noqa: E501 + """getOtaPackageInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_package_info_by_id_using_get(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: OtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_ota_package_info_by_id_using_get_with_http_info(ota_package_id, **kwargs) # noqa: E501 + else: + (data) = self.get_ota_package_info_by_id_using_get_with_http_info(ota_package_id, **kwargs) # noqa: E501 + return data + + def get_ota_package_info_by_id_using_get_with_http_info(self, ota_package_id, **kwargs): # noqa: E501 + """getOtaPackageInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_package_info_by_id_using_get_with_http_info(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: OtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['ota_package_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_ota_package_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'ota_package_id' is set + if ('ota_package_id' not in params or + params['ota_package_id'] is None): + raise ValueError("Missing the required parameter `ota_package_id` when calling `get_ota_package_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_id' in params: + path_params['otaPackageId'] = params['ota_package_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackage/info/{otaPackageId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='OtaPackageInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_ota_packages_using_get(self, device_profile_id, type, page_size, page, **kwargs): # noqa: E501 + """getOtaPackages # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_packages_using_get(device_profile_id, type, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId (required) + :param str type: type (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataOtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_ota_packages_using_get_with_http_info(device_profile_id, type, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_ota_packages_using_get_with_http_info(device_profile_id, type, page_size, page, **kwargs) # noqa: E501 + return data + + def get_ota_packages_using_get_with_http_info(self, device_profile_id, type, page_size, page, **kwargs): # noqa: E501 + """getOtaPackages # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_packages_using_get_with_http_info(device_profile_id, type, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId (required) + :param str type: type (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataOtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_profile_id', 'type', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_ota_packages_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_profile_id' is set + if ('device_profile_id' not in params or + params['device_profile_id'] is None): + raise ValueError("Missing the required parameter `device_profile_id` when calling `get_ota_packages_using_get`") # noqa: E501 + # verify the required parameter 'type' is set + if ('type' not in params or + params['type'] is None): + raise ValueError("Missing the required parameter `type` when calling `get_ota_packages_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_ota_packages_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_ota_packages_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_profile_id' in params: + path_params['deviceProfileId'] = params['device_profile_id'] # noqa: E501 + if 'type' in params: + path_params['type'] = params['type'] # noqa: E501 + + query_params = [] + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackages/{deviceProfileId}/{type}{?pageSize,page,textSearch,sortProperty,sortOrder}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataOtaPackageInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_ota_packages_using_get1(self, page_size, page, **kwargs): # noqa: E501 + """getOtaPackages # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_packages_using_get1(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataOtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_ota_packages_using_get1_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_ota_packages_using_get1_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_ota_packages_using_get1_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getOtaPackages # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_packages_using_get1_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataOtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_ota_packages_using_get1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_ota_packages_using_get1`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_ota_packages_using_get1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackages{?pageSize,page,textSearch,sortProperty,sortOrder}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataOtaPackageInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_ota_package_data_using_post(self, file, checksum_algorithm, ota_package_id, **kwargs): # noqa: E501 + """saveOtaPackageData # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_ota_package_data_using_post(file, checksum_algorithm, ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str file: (required) + :param str checksum_algorithm: checksumAlgorithm (required) + :param str ota_package_id: otaPackageId (required) + :param str checksum: checksum + :return: OtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_ota_package_data_using_post_with_http_info(file, checksum_algorithm, ota_package_id, **kwargs) # noqa: E501 + else: + (data) = self.save_ota_package_data_using_post_with_http_info(file, checksum_algorithm, ota_package_id, **kwargs) # noqa: E501 + return data + + def save_ota_package_data_using_post_with_http_info(self, file, checksum_algorithm, ota_package_id, **kwargs): # noqa: E501 + """saveOtaPackageData # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_ota_package_data_using_post_with_http_info(file, checksum_algorithm, ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str file: (required) + :param str checksum_algorithm: checksumAlgorithm (required) + :param str ota_package_id: otaPackageId (required) + :param str checksum: checksum + :return: OtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['file', 'checksum_algorithm', 'ota_package_id', 'checksum'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_ota_package_data_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'file' is set + if ('file' not in params or + params['file'] is None): + raise ValueError("Missing the required parameter `file` when calling `save_ota_package_data_using_post`") # noqa: E501 + # verify the required parameter 'checksum_algorithm' is set + if ('checksum_algorithm' not in params or + params['checksum_algorithm'] is None): + raise ValueError("Missing the required parameter `checksum_algorithm` when calling `save_ota_package_data_using_post`") # noqa: E501 + # verify the required parameter 'ota_package_id' is set + if ('ota_package_id' not in params or + params['ota_package_id'] is None): + raise ValueError("Missing the required parameter `ota_package_id` when calling `save_ota_package_data_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_id' in params: + path_params['otaPackageId'] = params['ota_package_id'] # noqa: E501 + + query_params = [] + if 'checksum' in params: + query_params.append(('checksum', params['checksum'])) # noqa: E501 + if 'checksum_algorithm' in params: + query_params.append(('checksumAlgorithm', params['checksum_algorithm'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + if 'file' in params: + local_var_files['file'] = params['file'] # noqa: E501 + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['multipart/form-data']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackage/{otaPackageId}{?checksum,checksumAlgorithm}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='OtaPackageInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_ota_package_info_using_post(self, body, **kwargs): # noqa: E501 + """saveOtaPackageInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_ota_package_info_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SaveOtaPackageInfoRequest body: otaPackageInfo (required) + :return: OtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_ota_package_info_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_ota_package_info_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_ota_package_info_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveOtaPackageInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_ota_package_info_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SaveOtaPackageInfoRequest body: otaPackageInfo (required) + :return: OtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_ota_package_info_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_ota_package_info_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackage', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='OtaPackageInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/owner_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/owner_controller_api.py new file mode 100644 index 0000000..6b6d3de --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/owner_controller_api.py @@ -0,0 +1,243 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class OwnerControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def change_owner_to_customer_using_post(self, owner_id, entity_type, entity_id, **kwargs): # noqa: E501 + """changeOwnerToCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.change_owner_to_customer_using_post(owner_id, entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str owner_id: ownerId (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.change_owner_to_customer_using_post_with_http_info(owner_id, entity_type, entity_id, **kwargs) # noqa: E501 + else: + (data) = self.change_owner_to_customer_using_post_with_http_info(owner_id, entity_type, entity_id, **kwargs) # noqa: E501 + return data + + def change_owner_to_customer_using_post_with_http_info(self, owner_id, entity_type, entity_id, **kwargs): # noqa: E501 + """changeOwnerToCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.change_owner_to_customer_using_post_with_http_info(owner_id, entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str owner_id: ownerId (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['owner_id', 'entity_type', 'entity_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method change_owner_to_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'owner_id' is set + if ('owner_id' not in params or + params['owner_id'] is None): + raise ValueError("Missing the required parameter `owner_id` when calling `change_owner_to_customer_using_post`") # noqa: E501 + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `change_owner_to_customer_using_post`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `change_owner_to_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'owner_id' in params: + path_params['ownerId'] = params['owner_id'] # noqa: E501 + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/owner/CUSTOMER/{ownerId}/{entityType}/{entityId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def change_owner_to_tenant_using_post(self, owner_id, entity_type, entity_id, **kwargs): # noqa: E501 + """changeOwnerToTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.change_owner_to_tenant_using_post(owner_id, entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str owner_id: ownerId (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.change_owner_to_tenant_using_post_with_http_info(owner_id, entity_type, entity_id, **kwargs) # noqa: E501 + else: + (data) = self.change_owner_to_tenant_using_post_with_http_info(owner_id, entity_type, entity_id, **kwargs) # noqa: E501 + return data + + def change_owner_to_tenant_using_post_with_http_info(self, owner_id, entity_type, entity_id, **kwargs): # noqa: E501 + """changeOwnerToTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.change_owner_to_tenant_using_post_with_http_info(owner_id, entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str owner_id: ownerId (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['owner_id', 'entity_type', 'entity_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method change_owner_to_tenant_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'owner_id' is set + if ('owner_id' not in params or + params['owner_id'] is None): + raise ValueError("Missing the required parameter `owner_id` when calling `change_owner_to_tenant_using_post`") # noqa: E501 + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `change_owner_to_tenant_using_post`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `change_owner_to_tenant_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'owner_id' in params: + path_params['ownerId'] = params['owner_id'] # noqa: E501 + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/owner/TENANT/{ownerId}/{entityType}/{entityId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/report_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/report_controller_api.py new file mode 100644 index 0000000..e7252ec --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/report_controller_api.py @@ -0,0 +1,239 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class ReportControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def download_dashboard_report_using_post(self, body, dashboard_id, **kwargs): # noqa: E501 + """downloadDashboardReport # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.download_dashboard_report_using_post(body, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: reportParams (required) + :param str dashboard_id: dashboardId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.download_dashboard_report_using_post_with_http_info(body, dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.download_dashboard_report_using_post_with_http_info(body, dashboard_id, **kwargs) # noqa: E501 + return data + + def download_dashboard_report_using_post_with_http_info(self, body, dashboard_id, **kwargs): # noqa: E501 + """downloadDashboardReport # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.download_dashboard_report_using_post_with_http_info(body, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: reportParams (required) + :param str dashboard_id: dashboardId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method download_dashboard_report_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `download_dashboard_report_using_post`") # noqa: E501 + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `download_dashboard_report_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/report/{dashboardId}/download', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def download_test_report_using_post(self, body, **kwargs): # noqa: E501 + """downloadTestReport # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.download_test_report_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param ReportConfig body: reportConfig (required) + :param str reports_server_endpoint_url: reportsServerEndpointUrl + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.download_test_report_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.download_test_report_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def download_test_report_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """downloadTestReport # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.download_test_report_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param ReportConfig body: reportConfig (required) + :param str reports_server_endpoint_url: reportsServerEndpointUrl + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'reports_server_endpoint_url'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method download_test_report_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `download_test_report_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'reports_server_endpoint_url' in params: + query_params.append(('reportsServerEndpointUrl', params['reports_server_endpoint_url'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/report/test{?reportsServerEndpointUrl}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/role_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/role_controller_api.py new file mode 100644 index 0000000..7680a9e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/role_controller_api.py @@ -0,0 +1,522 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class RoleControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_role_using_delete(self, role_id, **kwargs): # noqa: E501 + """deleteRole # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_role_using_delete(role_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str role_id: roleId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_role_using_delete_with_http_info(role_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_role_using_delete_with_http_info(role_id, **kwargs) # noqa: E501 + return data + + def delete_role_using_delete_with_http_info(self, role_id, **kwargs): # noqa: E501 + """deleteRole # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_role_using_delete_with_http_info(role_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str role_id: roleId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['role_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_role_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'role_id' is set + if ('role_id' not in params or + params['role_id'] is None): + raise ValueError("Missing the required parameter `role_id` when calling `delete_role_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'role_id' in params: + path_params['roleId'] = params['role_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/role/{roleId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_role_by_id_using_get(self, role_id, **kwargs): # noqa: E501 + """getRoleById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_role_by_id_using_get(role_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str role_id: roleId (required) + :return: Role + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_role_by_id_using_get_with_http_info(role_id, **kwargs) # noqa: E501 + else: + (data) = self.get_role_by_id_using_get_with_http_info(role_id, **kwargs) # noqa: E501 + return data + + def get_role_by_id_using_get_with_http_info(self, role_id, **kwargs): # noqa: E501 + """getRoleById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_role_by_id_using_get_with_http_info(role_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str role_id: roleId (required) + :return: Role + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['role_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_role_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'role_id' is set + if ('role_id' not in params or + params['role_id'] is None): + raise ValueError("Missing the required parameter `role_id` when calling `get_role_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'role_id' in params: + path_params['roleId'] = params['role_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/role/{roleId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Role', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_roles_by_ids_using_get(self, role_ids, **kwargs): # noqa: E501 + """getRolesByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_roles_by_ids_using_get(role_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str role_ids: roleIds (required) + :return: list[Role] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_roles_by_ids_using_get_with_http_info(role_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_roles_by_ids_using_get_with_http_info(role_ids, **kwargs) # noqa: E501 + return data + + def get_roles_by_ids_using_get_with_http_info(self, role_ids, **kwargs): # noqa: E501 + """getRolesByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_roles_by_ids_using_get_with_http_info(role_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str role_ids: roleIds (required) + :return: list[Role] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['role_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_roles_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'role_ids' is set + if ('role_ids' not in params or + params['role_ids'] is None): + raise ValueError("Missing the required parameter `role_ids` when calling `get_roles_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'role_ids' in params: + query_params.append(('roleIds', params['role_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/roles{?roleIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Role]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_roles_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getRoles # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_roles_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataRole + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_roles_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_roles_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_roles_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getRoles # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_roles_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataRole + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_roles_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_roles_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_roles_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/roles{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataRole', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_role_using_post(self, body, **kwargs): # noqa: E501 + """saveRole # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_role_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Role body: role (required) + :return: Role + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_role_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_role_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_role_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveRole # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_role_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Role body: role (required) + :return: Role + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_role_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_role_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/role', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Role', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/rpc_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/rpc_controller_api.py new file mode 100644 index 0000000..e23efdc --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/rpc_controller_api.py @@ -0,0 +1,243 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class RpcControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def handle_one_way_device_rpc_request_using_post(self, body, device_id, **kwargs): # noqa: E501 + """handleOneWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_one_way_device_rpc_request_using_post(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.handle_one_way_device_rpc_request_using_post_with_http_info(body, device_id, **kwargs) # noqa: E501 + else: + (data) = self.handle_one_way_device_rpc_request_using_post_with_http_info(body, device_id, **kwargs) # noqa: E501 + return data + + def handle_one_way_device_rpc_request_using_post_with_http_info(self, body, device_id, **kwargs): # noqa: E501 + """handleOneWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_one_way_device_rpc_request_using_post_with_http_info(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method handle_one_way_device_rpc_request_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `handle_one_way_device_rpc_request_using_post`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `handle_one_way_device_rpc_request_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/rpc/oneway/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def handle_two_way_device_rpc_request_using_post(self, body, device_id, **kwargs): # noqa: E501 + """handleTwoWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_two_way_device_rpc_request_using_post(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.handle_two_way_device_rpc_request_using_post_with_http_info(body, device_id, **kwargs) # noqa: E501 + else: + (data) = self.handle_two_way_device_rpc_request_using_post_with_http_info(body, device_id, **kwargs) # noqa: E501 + return data + + def handle_two_way_device_rpc_request_using_post_with_http_info(self, body, device_id, **kwargs): # noqa: E501 + """handleTwoWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_two_way_device_rpc_request_using_post_with_http_info(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method handle_two_way_device_rpc_request_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `handle_two_way_device_rpc_request_using_post`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `handle_two_way_device_rpc_request_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/rpc/twoway/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/rpc_v_2_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/rpc_v_2_controller_api.py new file mode 100644 index 0000000..53f65b5 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/rpc_v_2_controller_api.py @@ -0,0 +1,554 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class RpcV2ControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_resource_using_delete(self, rpc_id, **kwargs): # noqa: E501 + """deleteResource # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_resource_using_delete(rpc_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rpc_id: rpcId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_resource_using_delete_with_http_info(rpc_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_resource_using_delete_with_http_info(rpc_id, **kwargs) # noqa: E501 + return data + + def delete_resource_using_delete_with_http_info(self, rpc_id, **kwargs): # noqa: E501 + """deleteResource # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_resource_using_delete_with_http_info(rpc_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rpc_id: rpcId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['rpc_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_resource_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'rpc_id' is set + if ('rpc_id' not in params or + params['rpc_id'] is None): + raise ValueError("Missing the required parameter `rpc_id` when calling `delete_resource_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'rpc_id' in params: + path_params['rpcId'] = params['rpc_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rpc/persistent/{rpcId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_persisted_rpc_by_device_using_get(self, device_id, page_size, page, rpc_status, **kwargs): # noqa: E501 + """getPersistedRpcByDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_persisted_rpc_by_device_using_get(device_id, page_size, page, rpc_status, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str rpc_status: rpcStatus (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_persisted_rpc_by_device_using_get_with_http_info(device_id, page_size, page, rpc_status, **kwargs) # noqa: E501 + else: + (data) = self.get_persisted_rpc_by_device_using_get_with_http_info(device_id, page_size, page, rpc_status, **kwargs) # noqa: E501 + return data + + def get_persisted_rpc_by_device_using_get_with_http_info(self, device_id, page_size, page, rpc_status, **kwargs): # noqa: E501 + """getPersistedRpcByDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_persisted_rpc_by_device_using_get_with_http_info(device_id, page_size, page, rpc_status, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str rpc_status: rpcStatus (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_id', 'page_size', 'page', 'rpc_status', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_persisted_rpc_by_device_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `get_persisted_rpc_by_device_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_persisted_rpc_by_device_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_persisted_rpc_by_device_using_get`") # noqa: E501 + # verify the required parameter 'rpc_status' is set + if ('rpc_status' not in params or + params['rpc_status'] is None): + raise ValueError("Missing the required parameter `rpc_status` when calling `get_persisted_rpc_by_device_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'rpc_status' in params: + query_params.append(('rpcStatus', params['rpc_status'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rpc/persistent/device/{deviceId}{?pageSize,page,rpcStatus,textSearch,sortProperty,sortOrder}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_persisted_rpc_using_get(self, rpc_id, **kwargs): # noqa: E501 + """getPersistedRpc # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_persisted_rpc_using_get(rpc_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rpc_id: rpcId (required) + :return: Rpc + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_persisted_rpc_using_get_with_http_info(rpc_id, **kwargs) # noqa: E501 + else: + (data) = self.get_persisted_rpc_using_get_with_http_info(rpc_id, **kwargs) # noqa: E501 + return data + + def get_persisted_rpc_using_get_with_http_info(self, rpc_id, **kwargs): # noqa: E501 + """getPersistedRpc # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_persisted_rpc_using_get_with_http_info(rpc_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rpc_id: rpcId (required) + :return: Rpc + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['rpc_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_persisted_rpc_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'rpc_id' is set + if ('rpc_id' not in params or + params['rpc_id'] is None): + raise ValueError("Missing the required parameter `rpc_id` when calling `get_persisted_rpc_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'rpc_id' in params: + path_params['rpcId'] = params['rpc_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rpc/persistent/{rpcId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Rpc', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def handle_one_way_device_rpc_request_using_post1(self, body, device_id, **kwargs): # noqa: E501 + """handleOneWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_one_way_device_rpc_request_using_post1(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.handle_one_way_device_rpc_request_using_post1_with_http_info(body, device_id, **kwargs) # noqa: E501 + else: + (data) = self.handle_one_way_device_rpc_request_using_post1_with_http_info(body, device_id, **kwargs) # noqa: E501 + return data + + def handle_one_way_device_rpc_request_using_post1_with_http_info(self, body, device_id, **kwargs): # noqa: E501 + """handleOneWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_one_way_device_rpc_request_using_post1_with_http_info(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method handle_one_way_device_rpc_request_using_post1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `handle_one_way_device_rpc_request_using_post1`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `handle_one_way_device_rpc_request_using_post1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rpc/oneway/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def handle_two_way_device_rpc_request_using_post1(self, body, device_id, **kwargs): # noqa: E501 + """handleTwoWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_two_way_device_rpc_request_using_post1(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.handle_two_way_device_rpc_request_using_post1_with_http_info(body, device_id, **kwargs) # noqa: E501 + else: + (data) = self.handle_two_way_device_rpc_request_using_post1_with_http_info(body, device_id, **kwargs) # noqa: E501 + return data + + def handle_two_way_device_rpc_request_using_post1_with_http_info(self, body, device_id, **kwargs): # noqa: E501 + """handleTwoWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_two_way_device_rpc_request_using_post1_with_http_info(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method handle_two_way_device_rpc_request_using_post1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `handle_two_way_device_rpc_request_using_post1`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `handle_two_way_device_rpc_request_using_post1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rpc/twoway/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/rule_engine_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/rule_engine_controller_api.py new file mode 100644 index 0000000..bfe9bdc --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/rule_engine_controller_api.py @@ -0,0 +1,364 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class RuleEngineControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def handle_rule_engine_request_using_post(self, body, **kwargs): # noqa: E501 + """handleRuleEngineRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_rule_engine_request_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.handle_rule_engine_request_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.handle_rule_engine_request_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def handle_rule_engine_request_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """handleRuleEngineRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_rule_engine_request_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method handle_rule_engine_request_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `handle_rule_engine_request_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rule-engine/', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def handle_rule_engine_request_using_post1(self, body, entity_type, entity_id, timeout, **kwargs): # noqa: E501 + """handleRuleEngineRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_rule_engine_request_using_post1(body, entity_type, entity_id, timeout, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param int timeout: timeout (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.handle_rule_engine_request_using_post1_with_http_info(body, entity_type, entity_id, timeout, **kwargs) # noqa: E501 + else: + (data) = self.handle_rule_engine_request_using_post1_with_http_info(body, entity_type, entity_id, timeout, **kwargs) # noqa: E501 + return data + + def handle_rule_engine_request_using_post1_with_http_info(self, body, entity_type, entity_id, timeout, **kwargs): # noqa: E501 + """handleRuleEngineRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_rule_engine_request_using_post1_with_http_info(body, entity_type, entity_id, timeout, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param int timeout: timeout (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_type', 'entity_id', 'timeout'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method handle_rule_engine_request_using_post1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `handle_rule_engine_request_using_post1`") # noqa: E501 + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `handle_rule_engine_request_using_post1`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `handle_rule_engine_request_using_post1`") # noqa: E501 + # verify the required parameter 'timeout' is set + if ('timeout' not in params or + params['timeout'] is None): + raise ValueError("Missing the required parameter `timeout` when calling `handle_rule_engine_request_using_post1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + if 'timeout' in params: + path_params['timeout'] = params['timeout'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rule-engine/{entityType}/{entityId}/{timeout}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def handle_rule_engine_request_using_post2(self, body, entity_type, entity_id, **kwargs): # noqa: E501 + """handleRuleEngineRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_rule_engine_request_using_post2(body, entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.handle_rule_engine_request_using_post2_with_http_info(body, entity_type, entity_id, **kwargs) # noqa: E501 + else: + (data) = self.handle_rule_engine_request_using_post2_with_http_info(body, entity_type, entity_id, **kwargs) # noqa: E501 + return data + + def handle_rule_engine_request_using_post2_with_http_info(self, body, entity_type, entity_id, **kwargs): # noqa: E501 + """handleRuleEngineRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_rule_engine_request_using_post2_with_http_info(body, entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_type', 'entity_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method handle_rule_engine_request_using_post2" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `handle_rule_engine_request_using_post2`") # noqa: E501 + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `handle_rule_engine_request_using_post2`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `handle_rule_engine_request_using_post2`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rule-engine/{entityType}/{entityId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/scheduler_event_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/scheduler_event_controller_api.py new file mode 100644 index 0000000..6914244 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/scheduler_event_controller_api.py @@ -0,0 +1,1003 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class SchedulerEventControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def assign_scheduler_event_to_edge_using_post(self, edge_id, scheduler_event_id, **kwargs): # noqa: E501 + """assignSchedulerEventToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_scheduler_event_to_edge_using_post(edge_id, scheduler_event_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str scheduler_event_id: schedulerEventId (required) + :return: SchedulerEventInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_scheduler_event_to_edge_using_post_with_http_info(edge_id, scheduler_event_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_scheduler_event_to_edge_using_post_with_http_info(edge_id, scheduler_event_id, **kwargs) # noqa: E501 + return data + + def assign_scheduler_event_to_edge_using_post_with_http_info(self, edge_id, scheduler_event_id, **kwargs): # noqa: E501 + """assignSchedulerEventToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_scheduler_event_to_edge_using_post_with_http_info(edge_id, scheduler_event_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str scheduler_event_id: schedulerEventId (required) + :return: SchedulerEventInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'scheduler_event_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_scheduler_event_to_edge_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `assign_scheduler_event_to_edge_using_post`") # noqa: E501 + # verify the required parameter 'scheduler_event_id' is set + if ('scheduler_event_id' not in params or + params['scheduler_event_id'] is None): + raise ValueError("Missing the required parameter `scheduler_event_id` when calling `assign_scheduler_event_to_edge_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'scheduler_event_id' in params: + path_params['schedulerEventId'] = params['scheduler_event_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/schedulerEvent/{schedulerEventId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SchedulerEventInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_scheduler_event_using_delete(self, scheduler_event_id, **kwargs): # noqa: E501 + """deleteSchedulerEvent # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_scheduler_event_using_delete(scheduler_event_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str scheduler_event_id: schedulerEventId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_scheduler_event_using_delete_with_http_info(scheduler_event_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_scheduler_event_using_delete_with_http_info(scheduler_event_id, **kwargs) # noqa: E501 + return data + + def delete_scheduler_event_using_delete_with_http_info(self, scheduler_event_id, **kwargs): # noqa: E501 + """deleteSchedulerEvent # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_scheduler_event_using_delete_with_http_info(scheduler_event_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str scheduler_event_id: schedulerEventId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['scheduler_event_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_scheduler_event_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'scheduler_event_id' is set + if ('scheduler_event_id' not in params or + params['scheduler_event_id'] is None): + raise ValueError("Missing the required parameter `scheduler_event_id` when calling `delete_scheduler_event_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'scheduler_event_id' in params: + path_params['schedulerEventId'] = params['scheduler_event_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/schedulerEvent/{schedulerEventId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_all_scheduler_events_using_get(self, edge_id, **kwargs): # noqa: E501 + """getAllSchedulerEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_all_scheduler_events_using_get(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: list[SchedulerEventInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_all_scheduler_events_using_get_with_http_info(edge_id, **kwargs) # noqa: E501 + else: + (data) = self.get_all_scheduler_events_using_get_with_http_info(edge_id, **kwargs) # noqa: E501 + return data + + def get_all_scheduler_events_using_get_with_http_info(self, edge_id, **kwargs): # noqa: E501 + """getAllSchedulerEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_all_scheduler_events_using_get_with_http_info(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: list[SchedulerEventInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_all_scheduler_events_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_all_scheduler_events_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/allSchedulerEvents', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[SchedulerEventInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edge_scheduler_events_using_get(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeSchedulerEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_scheduler_events_using_get(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataSchedulerEventInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_scheduler_events_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_edge_scheduler_events_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_edge_scheduler_events_using_get_with_http_info(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeSchedulerEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_scheduler_events_using_get_with_http_info(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataSchedulerEventInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_scheduler_events_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_edge_scheduler_events_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_edge_scheduler_events_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_edge_scheduler_events_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/schedulerEvents{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataSchedulerEventInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_scheduler_event_by_id_using_get(self, scheduler_event_id, **kwargs): # noqa: E501 + """getSchedulerEventById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_scheduler_event_by_id_using_get(scheduler_event_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str scheduler_event_id: schedulerEventId (required) + :return: SchedulerEvent + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_scheduler_event_by_id_using_get_with_http_info(scheduler_event_id, **kwargs) # noqa: E501 + else: + (data) = self.get_scheduler_event_by_id_using_get_with_http_info(scheduler_event_id, **kwargs) # noqa: E501 + return data + + def get_scheduler_event_by_id_using_get_with_http_info(self, scheduler_event_id, **kwargs): # noqa: E501 + """getSchedulerEventById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_scheduler_event_by_id_using_get_with_http_info(scheduler_event_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str scheduler_event_id: schedulerEventId (required) + :return: SchedulerEvent + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['scheduler_event_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_scheduler_event_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'scheduler_event_id' is set + if ('scheduler_event_id' not in params or + params['scheduler_event_id'] is None): + raise ValueError("Missing the required parameter `scheduler_event_id` when calling `get_scheduler_event_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'scheduler_event_id' in params: + path_params['schedulerEventId'] = params['scheduler_event_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/schedulerEvent/{schedulerEventId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SchedulerEvent', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_scheduler_event_info_by_id_using_get(self, scheduler_event_id, **kwargs): # noqa: E501 + """getSchedulerEventInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_scheduler_event_info_by_id_using_get(scheduler_event_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str scheduler_event_id: schedulerEventId (required) + :return: SchedulerEventWithCustomerInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_scheduler_event_info_by_id_using_get_with_http_info(scheduler_event_id, **kwargs) # noqa: E501 + else: + (data) = self.get_scheduler_event_info_by_id_using_get_with_http_info(scheduler_event_id, **kwargs) # noqa: E501 + return data + + def get_scheduler_event_info_by_id_using_get_with_http_info(self, scheduler_event_id, **kwargs): # noqa: E501 + """getSchedulerEventInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_scheduler_event_info_by_id_using_get_with_http_info(scheduler_event_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str scheduler_event_id: schedulerEventId (required) + :return: SchedulerEventWithCustomerInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['scheduler_event_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_scheduler_event_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'scheduler_event_id' is set + if ('scheduler_event_id' not in params or + params['scheduler_event_id'] is None): + raise ValueError("Missing the required parameter `scheduler_event_id` when calling `get_scheduler_event_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'scheduler_event_id' in params: + path_params['schedulerEventId'] = params['scheduler_event_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/schedulerEvent/info/{schedulerEventId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SchedulerEventWithCustomerInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_scheduler_events_by_ids_using_get(self, scheduler_event_ids, **kwargs): # noqa: E501 + """getSchedulerEventsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_scheduler_events_by_ids_using_get(scheduler_event_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str scheduler_event_ids: schedulerEventIds (required) + :return: list[SchedulerEventInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_scheduler_events_by_ids_using_get_with_http_info(scheduler_event_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_scheduler_events_by_ids_using_get_with_http_info(scheduler_event_ids, **kwargs) # noqa: E501 + return data + + def get_scheduler_events_by_ids_using_get_with_http_info(self, scheduler_event_ids, **kwargs): # noqa: E501 + """getSchedulerEventsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_scheduler_events_by_ids_using_get_with_http_info(scheduler_event_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str scheduler_event_ids: schedulerEventIds (required) + :return: list[SchedulerEventInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['scheduler_event_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_scheduler_events_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'scheduler_event_ids' is set + if ('scheduler_event_ids' not in params or + params['scheduler_event_ids'] is None): + raise ValueError("Missing the required parameter `scheduler_event_ids` when calling `get_scheduler_events_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'scheduler_event_ids' in params: + query_params.append(('schedulerEventIds', params['scheduler_event_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/schedulerEvents{?schedulerEventIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[SchedulerEventInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_scheduler_events_using_get(self, **kwargs): # noqa: E501 + """getSchedulerEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_scheduler_events_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str type: type + :return: list[SchedulerEventWithCustomerInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_scheduler_events_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_scheduler_events_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_scheduler_events_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getSchedulerEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_scheduler_events_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str type: type + :return: list[SchedulerEventWithCustomerInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['type'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_scheduler_events_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/schedulerEvents{?type}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[SchedulerEventWithCustomerInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_scheduler_event_using_post(self, body, **kwargs): # noqa: E501 + """saveSchedulerEvent # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_scheduler_event_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SchedulerEvent body: schedulerEvent (required) + :return: SchedulerEvent + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_scheduler_event_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_scheduler_event_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_scheduler_event_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveSchedulerEvent # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_scheduler_event_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SchedulerEvent body: schedulerEvent (required) + :return: SchedulerEvent + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_scheduler_event_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_scheduler_event_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/schedulerEvent', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SchedulerEvent', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_scheduler_event_from_edge_using_delete(self, edge_id, scheduler_event_id, **kwargs): # noqa: E501 + """unassignSchedulerEventFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_scheduler_event_from_edge_using_delete(edge_id, scheduler_event_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str scheduler_event_id: schedulerEventId (required) + :return: SchedulerEventInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_scheduler_event_from_edge_using_delete_with_http_info(edge_id, scheduler_event_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_scheduler_event_from_edge_using_delete_with_http_info(edge_id, scheduler_event_id, **kwargs) # noqa: E501 + return data + + def unassign_scheduler_event_from_edge_using_delete_with_http_info(self, edge_id, scheduler_event_id, **kwargs): # noqa: E501 + """unassignSchedulerEventFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_scheduler_event_from_edge_using_delete_with_http_info(edge_id, scheduler_event_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str scheduler_event_id: schedulerEventId (required) + :return: SchedulerEventInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'scheduler_event_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_scheduler_event_from_edge_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `unassign_scheduler_event_from_edge_using_delete`") # noqa: E501 + # verify the required parameter 'scheduler_event_id' is set + if ('scheduler_event_id' not in params or + params['scheduler_event_id'] is None): + raise ValueError("Missing the required parameter `scheduler_event_id` when calling `unassign_scheduler_event_from_edge_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'scheduler_event_id' in params: + path_params['schedulerEventId'] = params['scheduler_event_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/schedulerEvent/{schedulerEventId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SchedulerEventInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/self_registration_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/self_registration_controller_api.py new file mode 100644 index 0000000..54727b8 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/self_registration_controller_api.py @@ -0,0 +1,389 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class SelfRegistrationControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_privacy_policy_using_get(self, **kwargs): # noqa: E501 + """getPrivacyPolicy # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_privacy_policy_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_privacy_policy_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_privacy_policy_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_privacy_policy_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getPrivacyPolicy # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_privacy_policy_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_privacy_policy_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/selfRegistration/privacyPolicy', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_self_registration_params_using_get(self, **kwargs): # noqa: E501 + """getSelfRegistrationParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_self_registration_params_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: SelfRegistrationParams + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_self_registration_params_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_self_registration_params_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_self_registration_params_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getSelfRegistrationParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_self_registration_params_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: SelfRegistrationParams + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_self_registration_params_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/selfRegistration/selfRegistrationParams', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SelfRegistrationParams', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_sign_up_self_registration_params_using_get(self, **kwargs): # noqa: E501 + """getSignUpSelfRegistrationParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_sign_up_self_registration_params_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str pkg_name: pkgName + :return: SignUpSelfRegistrationParams + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_sign_up_self_registration_params_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_sign_up_self_registration_params_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_sign_up_self_registration_params_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getSignUpSelfRegistrationParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_sign_up_self_registration_params_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str pkg_name: pkgName + :return: SignUpSelfRegistrationParams + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['pkg_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_sign_up_self_registration_params_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'pkg_name' in params: + query_params.append(('pkgName', params['pkg_name'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/selfRegistration/signUpSelfRegistrationParams{?pkgName}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SignUpSelfRegistrationParams', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_self_registration_params_using_post(self, body, **kwargs): # noqa: E501 + """saveSelfRegistrationParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_self_registration_params_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SelfRegistrationParams body: selfRegistrationParams (required) + :return: SelfRegistrationParams + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_self_registration_params_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_self_registration_params_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_self_registration_params_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveSelfRegistrationParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_self_registration_params_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SelfRegistrationParams body: selfRegistrationParams (required) + :return: SelfRegistrationParams + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_self_registration_params_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_self_registration_params_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/selfRegistration/selfRegistrationParams', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SelfRegistrationParams', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/sig_fox_integration_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/sig_fox_integration_controller_api.py new file mode 100644 index 0000000..b17e249 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/sig_fox_integration_controller_api.py @@ -0,0 +1,824 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class SigFoxIntegrationControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def process_request_using_delete3(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_delete3(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_delete3_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_delete3_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_delete3_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_delete3_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_delete3" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_delete3`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_delete3`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_delete3`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/sigfox/{routingKey}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_get3(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_get3(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_get3_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_get3_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_get3_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_get3_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_get3" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_get3`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_get3`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_get3`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/sigfox/{routingKey}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_head3(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_head3(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_head3_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_head3_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_head3_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_head3_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_head3" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_head3`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_head3`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_head3`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/sigfox/{routingKey}', 'HEAD', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_options3(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_options3(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_options3_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_options3_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_options3_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_options3_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_options3" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_options3`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_options3`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_options3`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/sigfox/{routingKey}', 'OPTIONS', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_patch3(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_patch3(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_patch3_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_patch3_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_patch3_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_patch3_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_patch3" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_patch3`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_patch3`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_patch3`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/sigfox/{routingKey}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_post11(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post11(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_post11_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_post11_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_post11_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post11_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_post11" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_post11`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_post11`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_post11`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/sigfox/{routingKey}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_put3(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_put3(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_put3_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_put3_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_put3_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_put3_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_put3" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_put3`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_put3`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_put3`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/sigfox/{routingKey}', 'PUT', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/sign_up_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/sign_up_controller_api.py new file mode 100644 index 0000000..ff52179 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/sign_up_controller_api.py @@ -0,0 +1,1012 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class SignUpControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def accept_privacy_policy_using_post(self, **kwargs): # noqa: E501 + """acceptPrivacyPolicy # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.accept_privacy_policy_using_post(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.accept_privacy_policy_using_post_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.accept_privacy_policy_using_post_with_http_info(**kwargs) # noqa: E501 + return data + + def accept_privacy_policy_using_post_with_http_info(self, **kwargs): # noqa: E501 + """acceptPrivacyPolicy # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.accept_privacy_policy_using_post_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method accept_privacy_policy_using_post" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/signup/acceptPrivacyPolicy', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def activate_email_using_get(self, email_code, **kwargs): # noqa: E501 + """activateEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_email_using_get(email_code, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email_code: emailCode (required) + :param str pkg_name: pkgName + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.activate_email_using_get_with_http_info(email_code, **kwargs) # noqa: E501 + else: + (data) = self.activate_email_using_get_with_http_info(email_code, **kwargs) # noqa: E501 + return data + + def activate_email_using_get_with_http_info(self, email_code, **kwargs): # noqa: E501 + """activateEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_email_using_get_with_http_info(email_code, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email_code: emailCode (required) + :param str pkg_name: pkgName + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['email_code', 'pkg_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method activate_email_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'email_code' is set + if ('email_code' not in params or + params['email_code'] is None): + raise ValueError("Missing the required parameter `email_code` when calling `activate_email_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'pkg_name' in params: + query_params.append(('pkgName', params['pkg_name'])) # noqa: E501 + if 'email_code' in params: + query_params.append(('emailCode', params['email_code'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/activateEmail{?pkgName,emailCode}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def activate_user_by_email_code_using_post(self, email_code, **kwargs): # noqa: E501 + """activateUserByEmailCode # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_user_by_email_code_using_post(email_code, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email_code: emailCode (required) + :param str pkg_name: pkgName + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.activate_user_by_email_code_using_post_with_http_info(email_code, **kwargs) # noqa: E501 + else: + (data) = self.activate_user_by_email_code_using_post_with_http_info(email_code, **kwargs) # noqa: E501 + return data + + def activate_user_by_email_code_using_post_with_http_info(self, email_code, **kwargs): # noqa: E501 + """activateUserByEmailCode # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_user_by_email_code_using_post_with_http_info(email_code, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email_code: emailCode (required) + :param str pkg_name: pkgName + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['email_code', 'pkg_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method activate_user_by_email_code_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'email_code' is set + if ('email_code' not in params or + params['email_code'] is None): + raise ValueError("Missing the required parameter `email_code` when calling `activate_user_by_email_code_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'email_code' in params: + query_params.append(('emailCode', params['email_code'])) # noqa: E501 + if 'pkg_name' in params: + query_params.append(('pkgName', params['pkg_name'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/activateByEmailCode{?emailCode,pkgName}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_tenant_account_using_delete(self, **kwargs): # noqa: E501 + """deleteTenantAccount # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_tenant_account_using_delete(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_tenant_account_using_delete_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.delete_tenant_account_using_delete_with_http_info(**kwargs) # noqa: E501 + return data + + def delete_tenant_account_using_delete_with_http_info(self, **kwargs): # noqa: E501 + """deleteTenantAccount # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_tenant_account_using_delete_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_tenant_account_using_delete" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/signup/tenantAccount', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_recaptcha_public_key_using_get(self, **kwargs): # noqa: E501 + """getRecaptchaPublicKey # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_recaptcha_public_key_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_recaptcha_public_key_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_recaptcha_public_key_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_recaptcha_public_key_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getRecaptchaPublicKey # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_recaptcha_public_key_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_recaptcha_public_key_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/signup/recaptchaPublicKey', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def is_display_welcome_using_get(self, **kwargs): # noqa: E501 + """isDisplayWelcome # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_display_welcome_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.is_display_welcome_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.is_display_welcome_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def is_display_welcome_using_get_with_http_info(self, **kwargs): # noqa: E501 + """isDisplayWelcome # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_display_welcome_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method is_display_welcome_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/signup/displayWelcome', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def mobile_login_using_get(self, pkg_name, **kwargs): # noqa: E501 + """mobileLogin # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.mobile_login_using_get(pkg_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str pkg_name: pkgName (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.mobile_login_using_get_with_http_info(pkg_name, **kwargs) # noqa: E501 + else: + (data) = self.mobile_login_using_get_with_http_info(pkg_name, **kwargs) # noqa: E501 + return data + + def mobile_login_using_get_with_http_info(self, pkg_name, **kwargs): # noqa: E501 + """mobileLogin # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.mobile_login_using_get_with_http_info(pkg_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str pkg_name: pkgName (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['pkg_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method mobile_login_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'pkg_name' is set + if ('pkg_name' not in params or + params['pkg_name'] is None): + raise ValueError("Missing the required parameter `pkg_name` when calling `mobile_login_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'pkg_name' in params: + query_params.append(('pkgName', params['pkg_name'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/login{?pkgName}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def privacy_policy_accepted_using_get(self, **kwargs): # noqa: E501 + """privacyPolicyAccepted # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.privacy_policy_accepted_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.privacy_policy_accepted_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.privacy_policy_accepted_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def privacy_policy_accepted_using_get_with_http_info(self, **kwargs): # noqa: E501 + """privacyPolicyAccepted # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.privacy_policy_accepted_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method privacy_policy_accepted_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/signup/privacyPolicyAccepted', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def resend_email_activation_using_post(self, email, **kwargs): # noqa: E501 + """resendEmailActivation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.resend_email_activation_using_post(email, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email: email (required) + :param str pkg_name: pkgName + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.resend_email_activation_using_post_with_http_info(email, **kwargs) # noqa: E501 + else: + (data) = self.resend_email_activation_using_post_with_http_info(email, **kwargs) # noqa: E501 + return data + + def resend_email_activation_using_post_with_http_info(self, email, **kwargs): # noqa: E501 + """resendEmailActivation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.resend_email_activation_using_post_with_http_info(email, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email: email (required) + :param str pkg_name: pkgName + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['email', 'pkg_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method resend_email_activation_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'email' is set + if ('email' not in params or + params['email'] is None): + raise ValueError("Missing the required parameter `email` when calling `resend_email_activation_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'email' in params: + query_params.append(('email', params['email'])) # noqa: E501 + if 'pkg_name' in params: + query_params.append(('pkgName', params['pkg_name'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/resendEmailActivation{?email,pkgName}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_not_display_welcome_using_post(self, **kwargs): # noqa: E501 + """setNotDisplayWelcome # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_not_display_welcome_using_post(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_not_display_welcome_using_post_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.set_not_display_welcome_using_post_with_http_info(**kwargs) # noqa: E501 + return data + + def set_not_display_welcome_using_post_with_http_info(self, **kwargs): # noqa: E501 + """setNotDisplayWelcome # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_not_display_welcome_using_post_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_not_display_welcome_using_post" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/signup/notDisplayWelcome', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def sign_up_using_post(self, body, **kwargs): # noqa: E501 + """signUp # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.sign_up_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SignUpRequest body: signUpRequest (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.sign_up_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.sign_up_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def sign_up_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """signUp # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.sign_up_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SignUpRequest body: signUpRequest (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method sign_up_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `sign_up_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/signup', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/solution_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/solution_controller_api.py new file mode 100644 index 0000000..ef8e607 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/solution_controller_api.py @@ -0,0 +1,486 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class SolutionControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_solution_template_using_delete(self, solution_template_id, **kwargs): # noqa: E501 + """deleteSolutionTemplate # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_solution_template_using_delete(solution_template_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str solution_template_id: solutionTemplateId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_solution_template_using_delete_with_http_info(solution_template_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_solution_template_using_delete_with_http_info(solution_template_id, **kwargs) # noqa: E501 + return data + + def delete_solution_template_using_delete_with_http_info(self, solution_template_id, **kwargs): # noqa: E501 + """deleteSolutionTemplate # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_solution_template_using_delete_with_http_info(solution_template_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str solution_template_id: solutionTemplateId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['solution_template_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_solution_template_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'solution_template_id' is set + if ('solution_template_id' not in params or + params['solution_template_id'] is None): + raise ValueError("Missing the required parameter `solution_template_id` when calling `delete_solution_template_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'solution_template_id' in params: + path_params['solutionTemplateId'] = params['solution_template_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/solutions/templates/{solutionTemplateId}/delete', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_solution_template_details_using_get(self, solution_template_id, **kwargs): # noqa: E501 + """getSolutionTemplateDetails # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_solution_template_details_using_get(solution_template_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str solution_template_id: solutionTemplateId (required) + :return: TenantSolutionTemplateDetails + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_solution_template_details_using_get_with_http_info(solution_template_id, **kwargs) # noqa: E501 + else: + (data) = self.get_solution_template_details_using_get_with_http_info(solution_template_id, **kwargs) # noqa: E501 + return data + + def get_solution_template_details_using_get_with_http_info(self, solution_template_id, **kwargs): # noqa: E501 + """getSolutionTemplateDetails # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_solution_template_details_using_get_with_http_info(solution_template_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str solution_template_id: solutionTemplateId (required) + :return: TenantSolutionTemplateDetails + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['solution_template_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_solution_template_details_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'solution_template_id' is set + if ('solution_template_id' not in params or + params['solution_template_id'] is None): + raise ValueError("Missing the required parameter `solution_template_id` when calling `get_solution_template_details_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'solution_template_id' in params: + path_params['solutionTemplateId'] = params['solution_template_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/solutions/templates/details/{solutionTemplateId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='TenantSolutionTemplateDetails', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_solution_template_infos_using_get(self, **kwargs): # noqa: E501 + """getSolutionTemplateInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_solution_template_infos_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[TenantSolutionTemplateInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_solution_template_infos_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_solution_template_infos_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_solution_template_infos_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getSolutionTemplateInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_solution_template_infos_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[TenantSolutionTemplateInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_solution_template_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/solutions/templates/infos', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[TenantSolutionTemplateInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_solution_template_instructions_using_get(self, solution_template_id, **kwargs): # noqa: E501 + """getSolutionTemplateInstructions # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_solution_template_instructions_using_get(solution_template_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str solution_template_id: solutionTemplateId (required) + :return: TenantSolutionTemplateInstructions + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_solution_template_instructions_using_get_with_http_info(solution_template_id, **kwargs) # noqa: E501 + else: + (data) = self.get_solution_template_instructions_using_get_with_http_info(solution_template_id, **kwargs) # noqa: E501 + return data + + def get_solution_template_instructions_using_get_with_http_info(self, solution_template_id, **kwargs): # noqa: E501 + """getSolutionTemplateInstructions # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_solution_template_instructions_using_get_with_http_info(solution_template_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str solution_template_id: solutionTemplateId (required) + :return: TenantSolutionTemplateInstructions + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['solution_template_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_solution_template_instructions_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'solution_template_id' is set + if ('solution_template_id' not in params or + params['solution_template_id'] is None): + raise ValueError("Missing the required parameter `solution_template_id` when calling `get_solution_template_instructions_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'solution_template_id' in params: + path_params['solutionTemplateId'] = params['solution_template_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/solutions/templates/instructions/{solutionTemplateId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='TenantSolutionTemplateInstructions', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def install_solution_template_using_post(self, solution_template_id, **kwargs): # noqa: E501 + """installSolutionTemplate # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.install_solution_template_using_post(solution_template_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str solution_template_id: solutionTemplateId (required) + :return: SolutionInstallResponse + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.install_solution_template_using_post_with_http_info(solution_template_id, **kwargs) # noqa: E501 + else: + (data) = self.install_solution_template_using_post_with_http_info(solution_template_id, **kwargs) # noqa: E501 + return data + + def install_solution_template_using_post_with_http_info(self, solution_template_id, **kwargs): # noqa: E501 + """installSolutionTemplate # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.install_solution_template_using_post_with_http_info(solution_template_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str solution_template_id: solutionTemplateId (required) + :return: SolutionInstallResponse + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['solution_template_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method install_solution_template_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'solution_template_id' is set + if ('solution_template_id' not in params or + params['solution_template_id'] is None): + raise ValueError("Missing the required parameter `solution_template_id` when calling `install_solution_template_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'solution_template_id' in params: + path_params['solutionTemplateId'] = params['solution_template_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/solutions/templates/{solutionTemplateId}/install', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SolutionInstallResponse', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/subscription_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/subscription_controller_api.py new file mode 100644 index 0000000..22cec45 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/subscription_controller_api.py @@ -0,0 +1,296 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class SubscriptionControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_tenant_profile_data_by_id_using_get(self, tenant_profile_id, **kwargs): # noqa: E501 + """getTenantProfileDataById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_profile_data_by_id_using_get(tenant_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_profile_id: tenantProfileId (required) + :return: TenantProfileData + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_profile_data_by_id_using_get_with_http_info(tenant_profile_id, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_profile_data_by_id_using_get_with_http_info(tenant_profile_id, **kwargs) # noqa: E501 + return data + + def get_tenant_profile_data_by_id_using_get_with_http_info(self, tenant_profile_id, **kwargs): # noqa: E501 + """getTenantProfileDataById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_profile_data_by_id_using_get_with_http_info(tenant_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_profile_id: tenantProfileId (required) + :return: TenantProfileData + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_profile_data_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_profile_id' is set + if ('tenant_profile_id' not in params or + params['tenant_profile_id'] is None): + raise ValueError("Missing the required parameter `tenant_profile_id` when calling `get_tenant_profile_data_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_profile_id' in params: + path_params['tenantProfileId'] = params['tenant_profile_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenantProfile/{tenantProfileId}/data', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='TenantProfileData', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_profile_data_using_get(self, **kwargs): # noqa: E501 + """getTenantProfileData # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_profile_data_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: TenantProfileData + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_profile_data_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_tenant_profile_data_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_tenant_profile_data_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getTenantProfileData # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_profile_data_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: TenantProfileData + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_profile_data_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/subscription/data', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='TenantProfileData', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_subscription_usage_using_get(self, **kwargs): # noqa: E501 + """getTenantSubscriptionUsage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_subscription_usage_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: SubscriptionUsage + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_subscription_usage_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_tenant_subscription_usage_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_tenant_subscription_usage_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getTenantSubscriptionUsage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_subscription_usage_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: SubscriptionUsage + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_subscription_usage_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/subscription/usage', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SubscriptionUsage', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/t_mobile_iot_cdp_integration_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/t_mobile_iot_cdp_integration_controller_api.py new file mode 100644 index 0000000..2055f76 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/t_mobile_iot_cdp_integration_controller_api.py @@ -0,0 +1,824 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class TMobileIotCdpIntegrationControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def process_request_using_delete4(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_delete4(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_delete4_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_delete4_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_delete4_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_delete4_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_delete4" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_delete4`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_delete4`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_delete4`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tmobile_iot_cdp/{routingKey}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_get4(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_get4(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_get4_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_get4_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_get4_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_get4_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_get4" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_get4`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_get4`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_get4`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tmobile_iot_cdp/{routingKey}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_head4(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_head4(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_head4_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_head4_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_head4_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_head4_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_head4" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_head4`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_head4`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_head4`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tmobile_iot_cdp/{routingKey}', 'HEAD', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_options4(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_options4(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_options4_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_options4_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_options4_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_options4_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_options4" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_options4`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_options4`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_options4`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tmobile_iot_cdp/{routingKey}', 'OPTIONS', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_patch4(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_patch4(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_patch4_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_patch4_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_patch4_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_patch4_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_patch4" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_patch4`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_patch4`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_patch4`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tmobile_iot_cdp/{routingKey}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_post12(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post12(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_post12_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_post12_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_post12_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post12_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_post12" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_post12`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_post12`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_post12`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tmobile_iot_cdp/{routingKey}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_put4(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_put4(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_put4_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_put4_with_http_info(body, request_headers, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_put4_with_http_info(self, body, request_headers, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_put4_with_http_info(body, request_headers, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_put4" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_put4`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_put4`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_put4`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tmobile_iot_cdp/{routingKey}', 'PUT', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/tenant_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/tenant_controller_api.py new file mode 100644 index 0000000..7a5510f --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/tenant_controller_api.py @@ -0,0 +1,724 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class TenantControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_tenant_using_delete(self, tenant_id, **kwargs): # noqa: E501 + """deleteTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_tenant_using_delete(tenant_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_tenant_using_delete_with_http_info(tenant_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_tenant_using_delete_with_http_info(tenant_id, **kwargs) # noqa: E501 + return data + + def delete_tenant_using_delete_with_http_info(self, tenant_id, **kwargs): # noqa: E501 + """deleteTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_tenant_using_delete_with_http_info(tenant_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_tenant_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `delete_tenant_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_id' in params: + path_params['tenantId'] = params['tenant_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/{tenantId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_by_id_using_get(self, tenant_id, **kwargs): # noqa: E501 + """getTenantById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_by_id_using_get(tenant_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :return: Tenant + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_by_id_using_get_with_http_info(tenant_id, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_by_id_using_get_with_http_info(tenant_id, **kwargs) # noqa: E501 + return data + + def get_tenant_by_id_using_get_with_http_info(self, tenant_id, **kwargs): # noqa: E501 + """getTenantById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_by_id_using_get_with_http_info(tenant_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :return: Tenant + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `get_tenant_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_id' in params: + path_params['tenantId'] = params['tenant_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/{tenantId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Tenant', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_info_by_id_using_get(self, tenant_id, **kwargs): # noqa: E501 + """getTenantInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_info_by_id_using_get(tenant_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :return: TenantInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_info_by_id_using_get_with_http_info(tenant_id, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_info_by_id_using_get_with_http_info(tenant_id, **kwargs) # noqa: E501 + return data + + def get_tenant_info_by_id_using_get_with_http_info(self, tenant_id, **kwargs): # noqa: E501 + """getTenantInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_info_by_id_using_get_with_http_info(tenant_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :return: TenantInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `get_tenant_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_id' in params: + path_params['tenantId'] = params['tenant_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/info/{tenantId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='TenantInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_infos_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_infos_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataTenantInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_infos_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_infos_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataTenantInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_infos_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenantInfos{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataTenantInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenants_by_ids_using_get(self, tenant_ids, **kwargs): # noqa: E501 + """getTenantsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenants_by_ids_using_get(tenant_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_ids: tenantIds (required) + :return: list[Tenant] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenants_by_ids_using_get_with_http_info(tenant_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_tenants_by_ids_using_get_with_http_info(tenant_ids, **kwargs) # noqa: E501 + return data + + def get_tenants_by_ids_using_get_with_http_info(self, tenant_ids, **kwargs): # noqa: E501 + """getTenantsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenants_by_ids_using_get_with_http_info(tenant_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_ids: tenantIds (required) + :return: list[Tenant] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenants_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_ids' is set + if ('tenant_ids' not in params or + params['tenant_ids'] is None): + raise ValueError("Missing the required parameter `tenant_ids` when calling `get_tenants_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'tenant_ids' in params: + query_params.append(('tenantIds', params['tenant_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenants{?tenantIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Tenant]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenants_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenants # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenants_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataTenant + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenants_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenants_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenants_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenants # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenants_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataTenant + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenants_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenants_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenants_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenants{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataTenant', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_tenant_using_post(self, body, **kwargs): # noqa: E501 + """saveTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_tenant_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Tenant body: tenant (required) + :return: Tenant + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_tenant_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_tenant_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_tenant_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_tenant_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Tenant body: tenant (required) + :return: Tenant + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_tenant_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_tenant_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Tenant', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/thing_park_integration_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/thing_park_integration_controller_api.py new file mode 100644 index 0000000..fd8572c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/thing_park_integration_controller_api.py @@ -0,0 +1,1727 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class ThingParkIntegrationControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def process_request_tpe_using_delete(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_delete(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_tpe_using_delete_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_tpe_using_delete_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_tpe_using_delete_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_delete_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_tpe_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_tpe_using_delete`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_tpe_using_delete`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_tpe_using_delete`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_tpe_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tpe/{routingKey}{?allRequestParams}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_tpe_using_get(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_get(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_tpe_using_get_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_tpe_using_get_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_tpe_using_get_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_get_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_tpe_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_tpe_using_get`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_tpe_using_get`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_tpe_using_get`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_tpe_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tpe/{routingKey}{?allRequestParams}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_tpe_using_head(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_head(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_tpe_using_head_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_tpe_using_head_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_tpe_using_head_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_head_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_tpe_using_head" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_tpe_using_head`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_tpe_using_head`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_tpe_using_head`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_tpe_using_head`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tpe/{routingKey}{?allRequestParams}', 'HEAD', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_tpe_using_options(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_options(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_tpe_using_options_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_tpe_using_options_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_tpe_using_options_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_options_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_tpe_using_options" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_tpe_using_options`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_tpe_using_options`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_tpe_using_options`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_tpe_using_options`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tpe/{routingKey}{?allRequestParams}', 'OPTIONS', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_tpe_using_patch(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_patch(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_tpe_using_patch_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_tpe_using_patch_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_tpe_using_patch_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_patch_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_tpe_using_patch" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_tpe_using_patch`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_tpe_using_patch`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_tpe_using_patch`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_tpe_using_patch`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tpe/{routingKey}{?allRequestParams}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_tpe_using_post(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_post(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_tpe_using_post_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_tpe_using_post_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_tpe_using_post_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_post_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_tpe_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_tpe_using_post`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_tpe_using_post`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_tpe_using_post`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_tpe_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tpe/{routingKey}{?allRequestParams}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_tpe_using_put(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_put(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_tpe_using_put_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_tpe_using_put_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_tpe_using_put_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequestTPE # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_tpe_using_put_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_tpe_using_put" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_tpe_using_put`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_tpe_using_put`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_tpe_using_put`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_tpe_using_put`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/tpe/{routingKey}{?allRequestParams}', 'PUT', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_delete5(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_delete5(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_delete5_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_delete5_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_delete5_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_delete5_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_delete5" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_delete5`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_delete5`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_using_delete5`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_delete5`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/thingpark/{routingKey}{?allRequestParams}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_get5(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_get5(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_get5_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_get5_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_get5_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_get5_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_get5" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_get5`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_get5`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_using_get5`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_get5`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/thingpark/{routingKey}{?allRequestParams}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_head5(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_head5(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_head5_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_head5_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_head5_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_head5_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_head5" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_head5`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_head5`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_using_head5`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_head5`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/thingpark/{routingKey}{?allRequestParams}', 'HEAD', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_options5(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_options5(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_options5_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_options5_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_options5_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_options5_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_options5" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_options5`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_options5`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_using_options5`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_options5`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/thingpark/{routingKey}{?allRequestParams}', 'OPTIONS', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_patch5(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_patch5(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_patch5_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_patch5_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_patch5_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_patch5_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_patch5" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_patch5`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_patch5`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_using_patch5`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_patch5`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/thingpark/{routingKey}{?allRequestParams}', 'PATCH', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_post13(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post13(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_post13_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_post13_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_post13_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_post13_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_post13" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_post13`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_post13`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_using_post13`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_post13`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/thingpark/{routingKey}{?allRequestParams}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def process_request_using_put5(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_put5(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.process_request_using_put5_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + else: + (data) = self.process_request_using_put5_with_http_info(body, request_headers, all_request_params, routing_key, **kwargs) # noqa: E501 + return data + + def process_request_using_put5_with_http_info(self, body, request_headers, all_request_params, routing_key, **kwargs): # noqa: E501 + """processRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.process_request_using_put5_with_http_info(body, request_headers, all_request_params, routing_key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: msg (required) + :param Object request_headers: requestHeaders (required) + :param Object all_request_params: allRequestParams (required) + :param str routing_key: routingKey (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'request_headers', 'all_request_params', 'routing_key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method process_request_using_put5" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `process_request_using_put5`") # noqa: E501 + # verify the required parameter 'request_headers' is set + if ('request_headers' not in params or + params['request_headers'] is None): + raise ValueError("Missing the required parameter `request_headers` when calling `process_request_using_put5`") # noqa: E501 + # verify the required parameter 'all_request_params' is set + if ('all_request_params' not in params or + params['all_request_params'] is None): + raise ValueError("Missing the required parameter `all_request_params` when calling `process_request_using_put5`") # noqa: E501 + # verify the required parameter 'routing_key' is set + if ('routing_key' not in params or + params['routing_key'] is None): + raise ValueError("Missing the required parameter `routing_key` when calling `process_request_using_put5`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'routing_key' in params: + path_params['routingKey'] = params['routing_key'] # noqa: E501 + + query_params = [] + if 'all_request_params' in params: + query_params.append(('allRequestParams', params['all_request_params'])) # noqa: E501 + + header_params = {} + if 'request_headers' in params: + header_params['requestHeaders'] = params['request_headers'] # noqa: E501 + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/v1/integrations/thingpark/{routingKey}{?allRequestParams}', 'PUT', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/trail_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/trail_controller_api.py new file mode 100644 index 0000000..76150df --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/trail_controller_api.py @@ -0,0 +1,114 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class TrailControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_device_using_delete1(self, **kwargs): # noqa: E501 + """deleteDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_device_using_delete1(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_device_using_delete1_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.delete_device_using_delete1_with_http_info(**kwargs) # noqa: E501 + return data + + def delete_device_using_delete1_with_http_info(self, **kwargs): # noqa: E501 + """deleteDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_device_using_delete1_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_device_using_delete1" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/trail/invalidateCache', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/user_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/user_controller_api.py new file mode 100644 index 0000000..b899d1c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/user_controller_api.py @@ -0,0 +1,1455 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class UserControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_user_using_delete(self, user_id, **kwargs): # noqa: E501 + """deleteUser # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_user_using_delete(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_user_using_delete_with_http_info(user_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_user_using_delete_with_http_info(user_id, **kwargs) # noqa: E501 + return data + + def delete_user_using_delete_with_http_info(self, user_id, **kwargs): # noqa: E501 + """deleteUser # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_user_using_delete_with_http_info(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_user_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_id' is set + if ('user_id' not in params or + params['user_id'] is None): + raise ValueError("Missing the required parameter `user_id` when calling `delete_user_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'user_id' in params: + path_params['userId'] = params['user_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/{userId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_activation_link_using_get(self, user_id, **kwargs): # noqa: E501 + """getActivationLink # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_activation_link_using_get(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_activation_link_using_get_with_http_info(user_id, **kwargs) # noqa: E501 + else: + (data) = self.get_activation_link_using_get_with_http_info(user_id, **kwargs) # noqa: E501 + return data + + def get_activation_link_using_get_with_http_info(self, user_id, **kwargs): # noqa: E501 + """getActivationLink # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_activation_link_using_get_with_http_info(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_activation_link_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_id' is set + if ('user_id' not in params or + params['user_id'] is None): + raise ValueError("Missing the required parameter `user_id` when calling `get_activation_link_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'user_id' in params: + path_params['userId'] = params['user_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['text/plain']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/{userId}/activationLink', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_all_customer_users_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getAllCustomerUsers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_all_customer_users_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_all_customer_users_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_all_customer_users_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_all_customer_users_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getAllCustomerUsers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_all_customer_users_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_all_customer_users_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_all_customer_users_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_all_customer_users_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/users{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataUser', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_users_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerUsers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_users_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_users_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_users_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_users_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerUsers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_users_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_users_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_users_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_users_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_users_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/users{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataUser', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_admins_using_get(self, tenant_id, page_size, page, **kwargs): # noqa: E501 + """getTenantAdmins # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_admins_using_get(tenant_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_admins_using_get_with_http_info(tenant_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_admins_using_get_with_http_info(tenant_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_admins_using_get_with_http_info(self, tenant_id, page_size, page, **kwargs): # noqa: E501 + """getTenantAdmins # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_admins_using_get_with_http_info(tenant_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_admins_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `get_tenant_admins_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_admins_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_admins_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_id' in params: + path_params['tenantId'] = params['tenant_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/{tenantId}/users{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataUser', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_by_id_using_get(self, user_id, **kwargs): # noqa: E501 + """getUserById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_by_id_using_get(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: User + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_by_id_using_get_with_http_info(user_id, **kwargs) # noqa: E501 + else: + (data) = self.get_user_by_id_using_get_with_http_info(user_id, **kwargs) # noqa: E501 + return data + + def get_user_by_id_using_get_with_http_info(self, user_id, **kwargs): # noqa: E501 + """getUserById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_by_id_using_get_with_http_info(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: User + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_id' is set + if ('user_id' not in params or + params['user_id'] is None): + raise ValueError("Missing the required parameter `user_id` when calling `get_user_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'user_id' in params: + path_params['userId'] = params['user_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/{userId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='User', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_token_using_get(self, user_id, **kwargs): # noqa: E501 + """getUserToken # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_token_using_get(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_token_using_get_with_http_info(user_id, **kwargs) # noqa: E501 + else: + (data) = self.get_user_token_using_get_with_http_info(user_id, **kwargs) # noqa: E501 + return data + + def get_user_token_using_get_with_http_info(self, user_id, **kwargs): # noqa: E501 + """getUserToken # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_token_using_get_with_http_info(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_token_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_id' is set + if ('user_id' not in params or + params['user_id'] is None): + raise ValueError("Missing the required parameter `user_id` when calling `get_user_token_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'user_id' in params: + path_params['userId'] = params['user_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/{userId}/token', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_users_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getUserUsers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_users_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_users_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_user_users_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_user_users_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getUserUsers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_users_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_users_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_user_users_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_user_users_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/users{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataUser', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_users_by_entity_group_id_using_get(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getUsersByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_users_by_entity_group_id_using_get(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_users_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_users_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_users_by_entity_group_id_using_get_with_http_info(self, entity_group_id, page_size, page, **kwargs): # noqa: E501 + """getUsersByEntityGroupId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_users_by_entity_group_id_using_get_with_http_info(entity_group_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_group_id: entityGroupId (required) + :param str page_size: Page size (required) + :param str page: Page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_group_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_users_by_entity_group_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_group_id' is set + if ('entity_group_id' not in params or + params['entity_group_id'] is None): + raise ValueError("Missing the required parameter `entity_group_id` when calling `get_users_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_users_by_entity_group_id_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_users_by_entity_group_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_group_id' in params: + path_params['entityGroupId'] = params['entity_group_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityGroup/{entityGroupId}/users{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataUser', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_users_by_ids_using_get(self, user_ids, **kwargs): # noqa: E501 + """getUsersByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_users_by_ids_using_get(user_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_ids: userIds (required) + :return: list[User] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_users_by_ids_using_get_with_http_info(user_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_users_by_ids_using_get_with_http_info(user_ids, **kwargs) # noqa: E501 + return data + + def get_users_by_ids_using_get_with_http_info(self, user_ids, **kwargs): # noqa: E501 + """getUsersByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_users_by_ids_using_get_with_http_info(user_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_ids: userIds (required) + :return: list[User] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_users_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_ids' is set + if ('user_ids' not in params or + params['user_ids'] is None): + raise ValueError("Missing the required parameter `user_ids` when calling `get_users_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'user_ids' in params: + query_params.append(('userIds', params['user_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/users{?userIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[User]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def is_user_token_access_enabled_using_get(self, **kwargs): # noqa: E501 + """isUserTokenAccessEnabled # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_user_token_access_enabled_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.is_user_token_access_enabled_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.is_user_token_access_enabled_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def is_user_token_access_enabled_using_get_with_http_info(self, **kwargs): # noqa: E501 + """isUserTokenAccessEnabled # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_user_token_access_enabled_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method is_user_token_access_enabled_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/tokenAccessEnabled', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_user_using_post(self, body, **kwargs): # noqa: E501 + """saveUser # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_user_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param User body: user (required) + :param bool send_activation_mail: sendActivationMail + :param str entity_group_id: entityGroupId + :return: User + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_user_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_user_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_user_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveUser # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_user_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param User body: user (required) + :param bool send_activation_mail: sendActivationMail + :param str entity_group_id: entityGroupId + :return: User + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'send_activation_mail', 'entity_group_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_user_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_user_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'send_activation_mail' in params: + query_params.append(('sendActivationMail', params['send_activation_mail'])) # noqa: E501 + if 'entity_group_id' in params: + query_params.append(('entityGroupId', params['entity_group_id'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user{?sendActivationMail,entityGroupId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='User', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def send_activation_email_using_post(self, email, **kwargs): # noqa: E501 + """sendActivationEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_activation_email_using_post(email, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email: email (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.send_activation_email_using_post_with_http_info(email, **kwargs) # noqa: E501 + else: + (data) = self.send_activation_email_using_post_with_http_info(email, **kwargs) # noqa: E501 + return data + + def send_activation_email_using_post_with_http_info(self, email, **kwargs): # noqa: E501 + """sendActivationEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_activation_email_using_post_with_http_info(email, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email: email (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['email'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method send_activation_email_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'email' is set + if ('email' not in params or + params['email'] is None): + raise ValueError("Missing the required parameter `email` when calling `send_activation_email_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'email' in params: + query_params.append(('email', params['email'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/sendActivationMail{?email}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_user_credentials_enabled_using_post(self, user_id, **kwargs): # noqa: E501 + """setUserCredentialsEnabled # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_user_credentials_enabled_using_post(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :param bool user_credentials_enabled: userCredentialsEnabled + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_user_credentials_enabled_using_post_with_http_info(user_id, **kwargs) # noqa: E501 + else: + (data) = self.set_user_credentials_enabled_using_post_with_http_info(user_id, **kwargs) # noqa: E501 + return data + + def set_user_credentials_enabled_using_post_with_http_info(self, user_id, **kwargs): # noqa: E501 + """setUserCredentialsEnabled # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_user_credentials_enabled_using_post_with_http_info(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :param bool user_credentials_enabled: userCredentialsEnabled + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_id', 'user_credentials_enabled'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_user_credentials_enabled_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_id' is set + if ('user_id' not in params or + params['user_id'] is None): + raise ValueError("Missing the required parameter `user_id` when calling `set_user_credentials_enabled_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'user_id' in params: + path_params['userId'] = params['user_id'] # noqa: E501 + + query_params = [] + if 'user_credentials_enabled' in params: + query_params.append(('userCredentialsEnabled', params['user_credentials_enabled'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/{userId}/userCredentialsEnabled{?userCredentialsEnabled}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/user_permissions_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/user_permissions_controller_api.py new file mode 100644 index 0000000..6344c52 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/user_permissions_controller_api.py @@ -0,0 +1,118 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class UserPermissionsControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_allowed_permissions_using_get(self, **kwargs): # noqa: E501 + """getAllowedPermissions # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_allowed_permissions_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: AllowedPermissionsInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_allowed_permissions_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_allowed_permissions_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_allowed_permissions_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getAllowedPermissions # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_allowed_permissions_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: AllowedPermissionsInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_allowed_permissions_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/permissions/allowedPermissions', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='AllowedPermissionsInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/white_labeling_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/white_labeling_controller_api.py new file mode 100644 index 0000000..ef3cfd1 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/white_labeling_controller_api.py @@ -0,0 +1,1048 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class WhiteLabelingControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_app_theme_css_using_post(self, body, **kwargs): # noqa: E501 + """getAppThemeCss # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_app_theme_css_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param PaletteSettings body: paletteSettings (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_app_theme_css_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.get_app_theme_css_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def get_app_theme_css_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """getAppThemeCss # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_app_theme_css_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param PaletteSettings body: paletteSettings (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_app_theme_css_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `get_app_theme_css_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['plain/text']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/whiteLabel/appThemeCss', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_current_login_white_label_params_using_get(self, **kwargs): # noqa: E501 + """getCurrentLoginWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_current_login_white_label_params_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: LoginWhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_current_login_white_label_params_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_current_login_white_label_params_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_current_login_white_label_params_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getCurrentLoginWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_current_login_white_label_params_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: LoginWhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_current_login_white_label_params_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/whiteLabel/currentLoginWhiteLabelParams', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='LoginWhiteLabelingParams', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_current_white_label_params_using_get(self, **kwargs): # noqa: E501 + """getCurrentWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_current_white_label_params_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: WhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_current_white_label_params_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_current_white_label_params_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_current_white_label_params_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getCurrentWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_current_white_label_params_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: WhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_current_white_label_params_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/whiteLabel/currentWhiteLabelParams', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='WhiteLabelingParams', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_login_theme_css_using_post(self, body, **kwargs): # noqa: E501 + """getLoginThemeCss # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_login_theme_css_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param PaletteSettings body: paletteSettings (required) + :param bool dark_foreground: darkForeground + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_login_theme_css_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.get_login_theme_css_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def get_login_theme_css_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """getLoginThemeCss # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_login_theme_css_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param PaletteSettings body: paletteSettings (required) + :param bool dark_foreground: darkForeground + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'dark_foreground'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_login_theme_css_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `get_login_theme_css_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'dark_foreground' in params: + query_params.append(('darkForeground', params['dark_foreground'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['plain/text']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/whiteLabel/loginThemeCss{?darkForeground}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_login_white_label_params_using_get(self, **kwargs): # noqa: E501 + """getLoginWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_login_white_label_params_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str logo_image_checksum: logoImageChecksum + :param str favicon_checksum: faviconChecksum + :return: LoginWhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_login_white_label_params_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_login_white_label_params_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_login_white_label_params_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getLoginWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_login_white_label_params_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str logo_image_checksum: logoImageChecksum + :param str favicon_checksum: faviconChecksum + :return: LoginWhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['logo_image_checksum', 'favicon_checksum'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_login_white_label_params_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'logo_image_checksum' in params: + query_params.append(('logoImageChecksum', params['logo_image_checksum'])) # noqa: E501 + if 'favicon_checksum' in params: + query_params.append(('faviconChecksum', params['favicon_checksum'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/whiteLabel/loginWhiteLabelParams{?logoImageChecksum,faviconChecksum}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='LoginWhiteLabelingParams', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_white_label_params_using_get(self, **kwargs): # noqa: E501 + """getWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_white_label_params_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str logo_image_checksum: logoImageChecksum + :param str favicon_checksum: faviconChecksum + :return: WhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_white_label_params_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_white_label_params_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_white_label_params_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_white_label_params_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str logo_image_checksum: logoImageChecksum + :param str favicon_checksum: faviconChecksum + :return: WhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['logo_image_checksum', 'favicon_checksum'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_white_label_params_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'logo_image_checksum' in params: + query_params.append(('logoImageChecksum', params['logo_image_checksum'])) # noqa: E501 + if 'favicon_checksum' in params: + query_params.append(('faviconChecksum', params['favicon_checksum'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/whiteLabel/whiteLabelParams{?logoImageChecksum,faviconChecksum}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='WhiteLabelingParams', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def is_customer_white_labeling_allowed_using_get(self, **kwargs): # noqa: E501 + """isCustomerWhiteLabelingAllowed # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_customer_white_labeling_allowed_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.is_customer_white_labeling_allowed_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.is_customer_white_labeling_allowed_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def is_customer_white_labeling_allowed_using_get_with_http_info(self, **kwargs): # noqa: E501 + """isCustomerWhiteLabelingAllowed # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_customer_white_labeling_allowed_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method is_customer_white_labeling_allowed_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/whiteLabel/isCustomerWhiteLabelingAllowed', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def is_white_labeling_allowed_using_get(self, **kwargs): # noqa: E501 + """isWhiteLabelingAllowed # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_white_labeling_allowed_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.is_white_labeling_allowed_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.is_white_labeling_allowed_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def is_white_labeling_allowed_using_get_with_http_info(self, **kwargs): # noqa: E501 + """isWhiteLabelingAllowed # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_white_labeling_allowed_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method is_white_labeling_allowed_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/whiteLabel/isWhiteLabelingAllowed', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def preview_white_label_params_using_post(self, body, **kwargs): # noqa: E501 + """previewWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.preview_white_label_params_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param WhiteLabelingParams body: whiteLabelingParams (required) + :return: WhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.preview_white_label_params_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.preview_white_label_params_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def preview_white_label_params_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """previewWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.preview_white_label_params_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param WhiteLabelingParams body: whiteLabelingParams (required) + :return: WhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method preview_white_label_params_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `preview_white_label_params_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/whiteLabel/previewWhiteLabelParams', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='WhiteLabelingParams', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_login_white_label_params_using_post(self, body, **kwargs): # noqa: E501 + """saveLoginWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_login_white_label_params_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param LoginWhiteLabelingParams body: loginWhiteLabelingParams (required) + :return: LoginWhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_login_white_label_params_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_login_white_label_params_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_login_white_label_params_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveLoginWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_login_white_label_params_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param LoginWhiteLabelingParams body: loginWhiteLabelingParams (required) + :return: LoginWhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_login_white_label_params_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_login_white_label_params_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/whiteLabel/loginWhiteLabelParams', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='LoginWhiteLabelingParams', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_white_label_params_using_post(self, body, **kwargs): # noqa: E501 + """saveWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_white_label_params_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param WhiteLabelingParams body: whiteLabelingParams (required) + :return: WhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_white_label_params_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_white_label_params_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_white_label_params_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveWhiteLabelParams # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_white_label_params_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param WhiteLabelingParams body: whiteLabelingParams (required) + :return: WhiteLabelingParams + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_white_label_params_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_white_label_params_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/whiteLabel/whiteLabelParams', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='WhiteLabelingParams', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api_client.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api_client.py new file mode 100644 index 0000000..49831fa --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api_client.py @@ -0,0 +1,722 @@ +# coding: utf-8 +# Copyright 2020. ThingsBoard +# # +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# # +# http://www.apache.org/licenses/LICENSE-2.0 +# # +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import absolute_import + +import datetime +import json +import mimetypes +from multiprocessing.pool import ThreadPool +import os +import re +import tempfile + +# python 2 and python 3 compatibility library +import six +from six.moves.urllib.parse import quote + +from tb_rest_client.configuration import Configuration +import tb_rest_client.models.models_ce +import tb_rest_client.models.models_pe +from tb_rest_client import rest + + +class ApiClient(object): + """ + :param configuration: .Configuration object for this client + :param header_name: a header to pass when making calls to the API. + :param header_value: a header value to pass when making calls to + the API. + :param cookie: a cookie to include in the header when making calls + to the API + """ + + PRIMITIVE_TYPES = (float, bool, bytes, six.text_type) + six.integer_types + NATIVE_TYPES_MAPPING = { + 'int': int, + 'long': int if six.PY3 else long, # noqa: F821 + 'float': float, + 'str': str, + 'bool': bool, + 'date': datetime.date, + 'datetime': datetime.datetime, + 'object': object, + } + + def __init__(self, configuration=None, header_name=None, header_value=None, + cookie=None): + if configuration is None: + configuration = Configuration() + self.configuration = configuration + + # Use the pool property to lazily initialize the ThreadPool. + self._pool = None + self.rest_client = rest.RESTClientObject(configuration) + self.default_headers = {} + if header_name is not None: + self.default_headers[header_name] = header_value + self.cookie = cookie + # Set default User-Agent. + self.user_agent = 'Swagger-Codegen/1.0.0/python' + + def __del__(self): + if self._pool is not None: + self._pool.close() + self._pool.join() + + @property + def pool(self): + if self._pool is None: + self._pool = ThreadPool() + return self._pool + + @property + def user_agent(self): + """User agent for this API client""" + return self.default_headers['User-Agent'] + + @user_agent.setter + def user_agent(self, value): + self.default_headers['User-Agent'] = value + + def set_default_header(self, header_name, header_value): + self.default_headers[header_name] = header_value + + def __call_api( + self, resource_path, method, path_params=None, + query_params=None, header_params=None, body=None, post_params=None, + files=None, response_type=None, auth_settings=None, + _return_http_data_only=None, collection_formats=None, + _preload_content=True, _request_timeout=None): + + config = self.configuration + + # header parameters + header_params = header_params or {} + header_params.update(self.default_headers) + if self.cookie: + header_params['Cookie'] = self.cookie + if header_params: + header_params = self.sanitize_for_serialization(header_params) + header_params = dict(self.parameters_to_tuples(header_params, + collection_formats)) + + # path parameters + if path_params: + path_params = self.sanitize_for_serialization(path_params) + path_params = self.parameters_to_tuples(path_params, + collection_formats) + for k, v in path_params: + if isinstance(v, dict) and v.get("entityType") is not None and v.get('id') is not None: + v = v["id"] + # specified safe chars, encode everything + if v is not None: + resource_path = resource_path.replace( + '{%s}' % k, + quote(str(v) if v is not None else "", safe=config.safe_chars_for_path_param) + ).replace( + '{?%s}' % k, + quote(str("?"+k+"="+v) if v is not None else "", safe=config.safe_chars_for_path_param) + ).replace( + '{?%s,' % k, + quote(str("?"+k+"="+v) if v is not None else "", safe=config.safe_chars_for_path_param) + ).replace( + ',%s' % k, + quote(str("&"+k+"="+v) if v is not None else "", safe=config.safe_chars_for_path_param) + ).replace( + ',?%s' % k, + quote(str("&"+k+"="+v) if v is not None else "", safe=config.safe_chars_for_path_param) + ).replace( + ',%s}' % k, + quote("}" + str(v) if v is not None else "", safe=config.safe_chars_for_path_param) + ) + # resource_path = resource_path.replace( + # '{%s}' % k, + # quote(str(k+"="+v), safe=config.safe_chars_for_path_param) + # ).replace( + # '{?%s}' % k, + # quote(str("?"+k+"="+v), safe=config.safe_chars_for_path_param) + # ).replace( + # '{?%s,' % k, + # quote(str("?"+k+"="+v) + "{", safe=config.safe_chars_for_path_param) + # ).replace( + # ',%s,' % k, + # quote("}" + str("&"+k+"="+v) + "{", safe=config.safe_chars_for_path_param) + # ).replace( + # ',?%s,' % k, + # quote("}" + str("&"+k+"="+v) + "{", safe=config.safe_chars_for_path_param) + # ).replace( + # ',%s}' % k, + # quote("}" + str(v), safe=config.safe_chars_for_path_param) + # ) + + # query parameters + if query_params: + query_params = self.sanitize_for_serialization(query_params) + query_params = [param for param in query_params if (isinstance(param, tuple) and len(param) > 1 and param[1] is not None) or not isinstance(param, tuple)] + query_params = self.parameters_to_tuples(query_params, + collection_formats) + + # post parameters + if post_params or files: + post_params = self.prepare_post_parameters(post_params, files) + post_params = [param for param in post_params if (isinstance(param, tuple) and len(param) > 1 and param[1] is not None) or not isinstance(param, tuple)] + post_params = self.sanitize_for_serialization(post_params) + post_params = self.parameters_to_tuples(post_params, + collection_formats) + + # auth setting + self.update_params_for_auth(header_params, query_params, auth_settings) + + # body + if body: + body = self.sanitize_for_serialization(body) + + # request url + clean_path = self.sanitize_path(resource_path) + url = self.configuration.host + clean_path + + # perform request and return response + response_data = self.request( + method, url, query_params=query_params, headers=header_params, + post_params=post_params, body=body, + _preload_content=_preload_content, + _request_timeout=_request_timeout) + + self.last_response = response_data + + return_data = response_data + if _preload_content: + # deserialize response data + if response_type: + return_data = self.deserialize(response_data, response_type) + else: + return_data = None + + if _return_http_data_only: + return (return_data) + else: + return (return_data, response_data.status, + response_data.getheaders()) + + def sanitize_path(self, url): + pattern = r'(\{[\?a-zA-Z,]{1,}\})' + matching = re.search(pattern, url) + if matching is not None and len(matching.groups()) > 0: + for match in matching.groups(): + clean_url = url.replace(match, "") + else: + clean_url = url + return clean_url + + def sanitize_for_serialization(self, obj): + """Builds a JSON POST object. + + If obj is None, return None. + If obj is str, int, long, float, bool, return directly. + If obj is datetime.datetime, datetime.date + convert to string in iso8601 format. + If obj is list, sanitize each element in the list. + If obj is dict, return the dict. + If obj is swagger model, return the properties dict. + + :param obj: The data to serialize. + :return: The serialized form of data. + """ + if obj is None: + return None + elif isinstance(obj, self.PRIMITIVE_TYPES): + return obj + elif isinstance(obj, list): + return [self.sanitize_for_serialization(sub_obj) + for sub_obj in obj] + elif isinstance(obj, tuple): + return tuple(self.sanitize_for_serialization(sub_obj) + for sub_obj in obj) + elif isinstance(obj, (datetime.datetime, datetime.date)): + return obj.isoformat() + + if isinstance(obj, dict): + obj_dict = obj + else: + # Convert model obj to dict except + # attributes `swagger_types`, `attribute_map` + # and attributes which value is not None. + # Convert attribute name to json key in + # model definition for request. + obj_dict = {obj.attribute_map[attr]: getattr(obj, attr) + for attr, _ in six.iteritems(obj.swagger_types) + if getattr(obj, attr) is not None} + + return {key: self.sanitize_for_serialization(val) + for key, val in six.iteritems(obj_dict)} + + def deserialize(self, response, response_type): + """Deserializes response into an object. + + :param response: RESTResponse object to be deserialized. + :param response_type: class literal for + deserialized object, or string of class name. + + :return: deserialized object. + """ + # handle file downloading + # save response body into a tmp file and return the instance + if response_type == "file": + return self.__deserialize_file(response) + + # fetch data from response object + try: + data = json.loads(response.data) + except ValueError: + data = response.data + + return self.__deserialize(data, response_type) + + def __deserialize(self, data, klass): + """Deserializes dict, list, str into an object.. + + :param data: dict, list or str. + :param klass: class literal, or string of class name. + + :return: object. + """ + if data is None: + return None + + if klass == "DeferredResultResponseEntity": + return self.__deserialize(data, type(data)) + # + # elif type(klass) == str: + # # convert str to class + elif klass in self.NATIVE_TYPES_MAPPING: + klass = self.NATIVE_TYPES_MAPPING[klass] + elif klass == list: + return_data = [self.__deserialize(sub_data, type(sub_data)) + for sub_data in data] + return return_data + + elif klass == dict: + return_data = {k: self.__deserialize(v, type(v)) + for k, v in six.iteritems(data)} + return return_data + elif type(klass) == str: + if klass.startswith('list['): + sub_kls = re.match(r'list\[(.*)\]', klass).group(1) + return [self.__deserialize(sub_data, sub_kls) + for sub_data in data] + + if klass.startswith('dict('): + sub_kls = re.match(r'dict\(([^,]*), (.*)\)', klass).group(2) + return {k: self.__deserialize(v, sub_kls) + for k, v in six.iteritems(data)} + + # convert str to class + if klass in self.NATIVE_TYPES_MAPPING: + klass = self.NATIVE_TYPES_MAPPING[klass] + try: + found_class = getattr(tb_rest_client.models.models_pe, klass) + if sorted(list(found_class.attribute_map.values())) == sorted(list(data.keys())): + klass = found_class + + # if all(attr in list(found_class.attribute_map.values()) for attr in list(data.keys())): + # klass = found_class + else: + found_class = getattr(tb_rest_client.models.models_ce, klass) + # if sorted(list(found_class.attribute_map.values())) == sorted(list(data.keys())): + klass = found_class + + except AttributeError: + found_class = getattr(tb_rest_client.models.models_ce, klass) + # if all(attr in list(found_class.attribute_map.values()) for attr in list(data.keys())): + # if sorted(list(found_class.attribute_map.values())) == sorted(list(data.keys())): + klass = found_class + # else: + # return self.__deserialize(data, type(data)) + return self.__deserialize_data(data, klass) + + def __deserialize_data(self, data, klass): + try: + if klass in self.PRIMITIVE_TYPES: + return self.__deserialize_primitive(data, klass) + elif klass == object: + return self.__deserialize_object(data) + elif klass == datetime.date: + return self.__deserialize_date(data) + elif klass == datetime.datetime: + return self.__deserialize_datatime(data) + else: + return self.__deserialize_model(data, klass) + except Exception as e: + return e + + def call_api(self, resource_path, method, + path_params=None, query_params=None, header_params=None, + body=None, post_params=None, files=None, + response_type=None, auth_settings=None, async_req=None, + _return_http_data_only=None, collection_formats=None, + _preload_content=True, _request_timeout=None): + """Makes the HTTP request (synchronous) and returns deserialized data. + + To make an async request, set the async_req parameter. + + :param resource_path: Path to method endpoint. + :param method: Method to call. + :param path_params: Path parameters in the url. + :param query_params: Query parameters in the url. + :param header_params: Header parameters to be + placed in the request header. + :param body: Request body. + :param post_params dict: Request post form parameters, + for `application/x-www-form-urlencoded`, `multipart/form-data`. + :param auth_settings list: Auth Settings names for the request. + :param response: Response data type. + :param files dict: key -> filename, value -> filepath, + for `multipart/form-data`. + :param async_req bool: execute request asynchronously + :param _return_http_data_only: response data without head status code + and headers + :param collection_formats: dict of collection formats for path, query, + header, and post parameters. + :param _preload_content: if False, the urllib3.HTTPResponse object will + be returned without reading/decoding response + data. Default is True. + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :return: + If async_req parameter is True, + the request will be called asynchronously. + The method will return the request thread. + If parameter async_req is False or missing, + then the method will return the response directly. + """ + if not async_req: + return self.__call_api(resource_path, method, + path_params, query_params, header_params, + body, post_params, files, + response_type, auth_settings, + _return_http_data_only, collection_formats, + _preload_content, _request_timeout) + else: + thread = self.pool.apply_async(self.__call_api, (resource_path, + method, path_params, query_params, + header_params, body, + post_params, files, + response_type, auth_settings, + _return_http_data_only, + collection_formats, + _preload_content, _request_timeout)) + return thread + + def request(self, method, url, query_params=None, headers=None, + post_params=None, body=None, _preload_content=True, + _request_timeout=None): + """Makes the HTTP request using RESTClient.""" + if method == "GET": + return self.rest_client.GET(url, + query_params=query_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + headers=headers) + elif method == "HEAD": + return self.rest_client.HEAD(url, + query_params=query_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + headers=headers) + elif method == "OPTIONS": + return self.rest_client.OPTIONS(url, + query_params=query_params, + headers=headers, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + elif method == "POST": + return self.rest_client.POST(url, + query_params=query_params, + headers=headers, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + elif method == "PUT": + return self.rest_client.PUT(url, + query_params=query_params, + headers=headers, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + elif method == "PATCH": + return self.rest_client.PATCH(url, + query_params=query_params, + headers=headers, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + elif method == "DELETE": + return self.rest_client.DELETE(url, + query_params=query_params, + headers=headers, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + else: + raise ValueError( + "http method must be `GET`, `HEAD`, `OPTIONS`," + " `POST`, `PATCH`, `PUT` or `DELETE`." + ) + + def parameters_to_tuples(self, params, collection_formats): + """Get parameters as list of tuples, formatting collections. + + :param params: Parameters as dict or list of two-tuples + :param dict collection_formats: Parameter collection formats + :return: Parameters as list of tuples, collections formatted + """ + new_params = [] + if collection_formats is None: + collection_formats = {} + for k, v in six.iteritems(params) if isinstance(params, dict) else params: # noqa: E501 + if k in collection_formats: + collection_format = collection_formats[k] + if collection_format == 'multi': + new_params.extend((k, value) for value in v) + else: + if collection_format == 'ssv': + delimiter = ' ' + elif collection_format == 'tsv': + delimiter = '\t' + elif collection_format == 'pipes': + delimiter = '|' + else: # csv is the default + delimiter = ',' + new_params.append( + (k, delimiter.join(str(value) for value in v))) + else: + new_params.append((k, v)) + return new_params + + def prepare_post_parameters(self, post_params=None, files=None): + """Builds form parameters. + + :param post_params: Normal form parameters. + :param files: File parameters. + :return: Form parameters with files. + """ + params = [] + + if post_params: + params = post_params + + if files: + for k, v in six.iteritems(files): + if not v: + continue + file_names = v if type(v) is list else [v] + for n in file_names: + with open(n, 'rb') as f: + filename = os.path.basename(f.name) + filedata = f.read() + mimetype = (mimetypes.guess_type(filename)[0] or + 'application/octet-stream') + params.append( + tuple([k, tuple([filename, filedata, mimetype])])) + + return params + + def select_header_accept(self, accepts): + """Returns `Accept` based on an array of accepts provided. + + :param accepts: List of headers. + :return: Accept (e.g. application/json). + """ + if not accepts: + return + + accepts = [x.lower() for x in accepts] + + if 'application/json' in accepts: + return 'application/json' + else: + return ', '.join(accepts) + + def select_header_content_type(self, content_types): + """Returns `Content-Type` based on an array of content_types provided. + + :param content_types: List of content-types. + :return: Content-Type (e.g. application/json). + """ + if not content_types: + return 'application/json' + + content_types = [x.lower() for x in content_types] + + if 'application/json' in content_types or '*/*' in content_types: + return 'application/json' + else: + return content_types[0] + + def update_params_for_auth(self, headers, querys, auth_settings): + """Updates header and query params based on authentication setting. + + :param headers: Header parameters dict to be updated. + :param querys: Query parameters tuple list to be updated. + :param auth_settings: Authentication setting identifiers list. + """ + if not auth_settings: + return + + for auth in auth_settings: + auth_setting = self.configuration.auth_settings().get(auth) + if auth_setting: + if not auth_setting['value']: + continue + elif auth_setting['in'] == 'header': + headers[auth_setting['key']] = auth_setting['value'] + elif auth_setting['in'] == 'query': + querys.append((auth_setting['key'], auth_setting['value'])) + else: + raise ValueError( + 'Authentication token must be in `query` or `header`' + ) + + def __deserialize_file(self, response): + """Deserializes body to file + + Saves response body into a file in a temporary folder, + using the filename from the `Content-Disposition` header if provided. + + :param response: RESTResponse. + :return: file path. + """ + fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) + os.close(fd) + os.remove(path) + + content_disposition = response.getheader("Content-Disposition") + if content_disposition: + filename = re.search(r'filename=[\'"]?([^\'"\s]+)[\'"]?', + content_disposition).group(1) + path = os.path.join(os.path.dirname(path), filename) + + with open(path, "wb") as f: + f.write(response.data) + + return path + + def __deserialize_primitive(self, data, klass): + """Deserializes string to primitive type. + + :param data: str. + :param klass: class literal. + + :return: int, long, float, str, bool. + """ + try: + return klass(data) + except UnicodeEncodeError: + return six.text_type(data) + except TypeError: + return data + + def __deserialize_object(self, value): + """Return a original value. + + :return: object. + """ + return value + + def __deserialize_date(self, string): + """Deserializes string to date. + + :param string: str. + :return: date. + """ + try: + from dateutil.parser import parse + return parse(string).date() + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, + reason="Failed to parse `{0}` as date object".format(string) + ) + + def __deserialize_datatime(self, string): + """Deserializes string to datetime. + + The string should be in iso8601 datetime format. + + :param string: str. + :return: datetime. + """ + try: + from dateutil.parser import parse + return parse(string) + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, + reason=( + "Failed to parse `{0}` as datetime object" + .format(string) + ) + ) + + def __hasattr(self, object, name): + return name in object.__class__.__dict__ + + def __deserialize_model(self, data, klass): + """Deserializes list or dict to model. + + :param data: dict, list. + :param klass: class literal. + :return: model object. + """ + + if (not klass.swagger_types and + not self.__hasattr(klass, 'get_real_child_model')): + return data + + kwargs = {} + if klass.swagger_types is not None: + for attr, attr_type in six.iteritems(klass.swagger_types): + if (data is not None and + klass.attribute_map[attr] in data and + isinstance(data, (list, dict))): + value = data[klass.attribute_map[attr]] + kwargs[attr] = self.__deserialize(value, attr_type) + + instance = klass(**kwargs) + + if (isinstance(instance, dict) and + klass.swagger_types is not None and + isinstance(data, dict)): + for key, value in data.items(): + if key not in klass.swagger_types: + instance[key] = value + if self.__hasattr(instance, 'get_real_child_model'): + klass_name = instance.get_real_child_model(data) + if klass_name: + instance = self.__deserialize(data, klass_name) + return instance diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/configuration.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/configuration.py new file mode 100644 index 0000000..38ae482 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/configuration.py @@ -0,0 +1,249 @@ +# coding: utf-8 +# Copyright 2020. ThingsBoard +# # +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# # +# http://www.apache.org/licenses/LICENSE-2.0 +# # +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import absolute_import + +import copy +import logging +import multiprocessing +import sys +import urllib3 + +import six +from six.moves import http_client as httplib + + +class Configuration(object): + _default = None + + def __init__(self): + """Constructor""" + if self._default: + for key in self._default.__dict__.keys(): + self.__dict__[key] = copy.copy(self._default.__dict__[key]) + return + + # Default Base url + self.host = "http://127.0.0.1:8080" + # Temp file folder for downloading files + self.temp_folder_path = None + + # Authentication Settings + # dict to store API key(s) + self.api_key = {} + # dict to store API prefix (e.g. Bearer) + self.api_key_prefix = {} + # function to refresh API key if expired + self.refresh_api_key_hook = None + # Username for HTTP basic authentication + self.username = "" + # Password for HTTP basic authentication + self.password = "" + + # Logging Settings + self.logger = {} + self.logger["package_logger"] = logging.getLogger("tb_rest_client") + self.logger["urllib3_logger"] = logging.getLogger("urllib3") + # Log format + self.logger_format = '%(asctime)s %(levelname)s %(message)s' + # Log stream handler + self.logger_stream_handler = None + # Log file handler + self.logger_file_handler = None + # Debug file location + self.logger_file = None + # Debug switch + self.debug = False + + # SSL/TLS verification + # Set this to false to skip verifying SSL certificate when calling API + # from https server. + self.verify_ssl = True + # Set this to customize the certificate file to verify the peer. + self.ssl_ca_cert = None + # client certificate file + self.cert_file = None + # client key file + self.key_file = None + # Set this to True/False to enable/disable SSL hostname verification. + self.assert_hostname = None + + # urllib3 connection pool's maximum number of connections saved + # per pool. urllib3 uses 1 connection as default value, but this is + # not the best value when you are making a lot of possibly parallel + # requests to the same host, which is often the case here. + # cpu_count * 5 is used as default value to increase performance. + self.connection_pool_maxsize = multiprocessing.cpu_count() * 5 + + # Proxy URL + self.proxy = None + # Safe chars for path_param + self.safe_chars_for_path_param = '' + + @classmethod + def set_default(cls, default): + cls._default = default + + @property + def logger_file(self): + """The logger file. + + If the logger_file is None, then add stream handler and remove file + handler. Otherwise, add file handler and remove stream handler. + + :param value: The logger_file path. + :type: str + """ + return self.__logger_file + + @logger_file.setter + def logger_file(self, value): + """The logger file. + + If the logger_file is None, then add stream handler and remove file + handler. Otherwise, add file handler and remove stream handler. + + :param value: The logger_file path. + :type: str + """ + self.__logger_file = value + if self.__logger_file: + # If set logging file, + # then add file handler and remove stream handler. + self.logger_file_handler = logging.FileHandler(self.__logger_file) + self.logger_file_handler.setFormatter(self.logger_formatter) + for _, logger in six.iteritems(self.logger): + logger.addHandler(self.logger_file_handler) + if self.logger_stream_handler: + logger.removeHandler(self.logger_stream_handler) + else: + # If not set logging file, + # then add stream handler and remove file handler. + self.logger_stream_handler = logging.StreamHandler() + self.logger_stream_handler.setFormatter(self.logger_formatter) + for _, logger in six.iteritems(self.logger): + logger.addHandler(self.logger_stream_handler) + if self.logger_file_handler: + logger.removeHandler(self.logger_file_handler) + + @property + def debug(self): + """Debug status + + :param value: The debug status, True or False. + :type: bool + """ + return self.__debug + + @debug.setter + def debug(self, value): + """Debug status + + :param value: The debug status, True or False. + :type: bool + """ + self.__debug = value + if self.__debug: + # if debug status is True, turn on debug logging + for _, logger in six.iteritems(self.logger): + logger.setLevel(logging.DEBUG) + # turn on httplib debug + httplib.HTTPConnection.debuglevel = 1 + else: + # if debug status is False, turn off debug logging, + # setting log level to default `logging.WARNING` + for _, logger in six.iteritems(self.logger): + logger.setLevel(logging.WARNING) + # turn off httplib debug + httplib.HTTPConnection.debuglevel = 0 + + @property + def logger_format(self): + """The logger format. + + The logger_formatter will be updated when sets logger_format. + + :param value: The format string. + :type: str + """ + return self.__logger_format + + @logger_format.setter + def logger_format(self, value): + """The logger format. + + The logger_formatter will be updated when sets logger_format. + + :param value: The format string. + :type: str + """ + self.__logger_format = value + self.logger_formatter = logging.Formatter(self.__logger_format) + + def get_api_key_with_prefix(self, identifier): + """Gets API key (with prefix if set). + + :param identifier: The identifier of apiKey. + :return: The token for api_pe key authentication. + """ + + if self.refresh_api_key_hook: + self.refresh_api_key_hook(self) + + key = self.api_key.get(identifier) + if key: + prefix = self.api_key_prefix.get(identifier) + if prefix: + return "%s %s" % (prefix, key) + else: + return key + + def get_basic_auth_token(self): + """Gets HTTP basic authentication header (string). + + :return: The token for basic HTTP authentication. + """ + return urllib3.util.make_headers( + basic_auth=self.username + ':' + self.password + ).get('authorization') + + def auth_settings(self): + """Gets Auth Settings dict for api_pe client. + + :return: The Auth Settings information dict. + """ + return { + 'X-Authorization': + { + 'type': 'api_key', + 'in': 'header', + 'key': 'X-Authorization', + 'value': self.get_api_key_with_prefix('X-Authorization') + }, + + } + + def to_debug_report(self): + """Gets the essential information for debugging. + + :return: The report for debugging. + """ + return "Python SDK Debug Report:\n" \ + "OS: {env}\n" \ + "Python Version: {pyversion}\n" \ + "Version of the API: 2.0\n" \ + "SDK Package Version: 1.0.0". \ + format(env=sys.platform, pyversion=sys.version) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1571ac9cb84b52cba5a7d419971c1757d207614c GIT binary patch literal 195 zcmYj~K?=e!5JgkzLWCZ~g&n0^5l^5CaUGg=+6L1kWTMd9xb*;D#;vz-7)i7+s5oKuYe5QkH&t&9@w04eru^ InlWe-GWn74+wYs1 zoq6--%|0*_i&dB4Pw#ur4u3eiq~rs7DExC49=75?ufM9KBw3Oyl_jcFl$Me{OP-}B ziAk&{$;qlrl(C*H%TT`sFtji_N=A!}7k#8_9#I#n;~Sy#yh)hHTS zSIZ{VESg!@$QIQqT3Of1DXLAhv5v{9YMPkFx=yyM>0&zTdO1VQ6f;>j$XRN(n9aIT z&QWv4T-Hr;o|-S_vu>6P)Izb4b&Fi27K_EKTjdh9R4ipZMV_seiDj(YlfzS}WGFo*~au>%=WDbPdZoNXIl^JRN?xksBF=iX999XDV7*2rl`CA<=gOmM zM2xUrD@RpIq*$LPFH^_FG1lv(R7xn;=gYLphz#rXGOLb@+;*v)(3eP&bMj zS$D~s)Xm~%*4yPR>Q-?p>mBkob-TEo^-g(*x>MZAdY8OQ-7W5By<6U+?iKg4?v^Lj zed0dW7s~t91L6VJd*p-aA@LCFz4Br8h%tqc#d_yd|tgEUSK^SUsNxNmsk(Vm(?rc71l%YRdq_7Vtqiqrd}7X zvpy)_P;ZJiSzjdIQg4g5Ss#+`sCUJ?tcCoT`ndQw>%;Q5)O+GR))&j)R-X``V0}dX zj(T6b&-xPiyXuqTldK*2d+Jl-Q>-tQzpp+mKFvBV|3H04e1`R~{6qCw@mbah`A6z= z;&ZH%@{iT$#phYO@=w$k#1~i}m4B+fD89&gME;rjlK2wqQTgZU%i_zdQ}Qp=SHxFX zUnc)jeN}vw^)dNZ>TBX_tfl;G^>y)e)=K`3`iA%h>$E(rzA3)RIwSv9eM@|cbyohJ z`nLEs>*Mn8)px{qSZnzY>I3lsYft{8`mXpc>zw>2^*!-D)_M8Q>igpRtjFZPs2_+Q zus$LGRsB%>koD#A-_(!9k64e(e^);iKW2S}{15dL@e|fp%Kub96+dNtmHaRDGx0Ol zSIhraKNmk|eU1E3{X+bL^|kVU)Gx&^SzjmrSN%%-iuLs;aRZzzRi!8WTi^zevp^<+ zOyV{-f=mV}11V#26G%Bo1xN*xn?Wi;sz9ok+yYV!QUg-Mi zOl}8h0BHniWO4^c6G$^iGm|?(T0mMsTAADhG6kd!q>ahlAX7o6flOm^4@f)6bdc#x z?gg0vG81GblanB`KxTu?W^y0M9FVynbD7)^G7n@v$b2RbfGhx62(pmLgCL7Q7K1Ei z@({=pkfk6?nLG?~HpnuNWlSCcIR|7p$Z{r+f~)}P0O?@z7|2SHRUoUFJPxuNWDUp~ zCQpEz3$hkuEt4lf&I4HovX049Am@Xu2U*YLX^;y*Hh^qk@(jpEkWC<)m^=%z8DtB{ z7ADVuYz65A>16Ue$TpBJkS-=KfNTfZ0kVV1iy%8ec7g0-@)F2ykZzD}CNG0r2(kxc z50h6w_JZ_)^e}l9WFJT`NH3F9AblYFLH09w4Wu7r0Azs4>mY+5Lm)#;-T*lOauDPo zlQ%&w0yzY7h{;6-#wm(0;%rJ#rxukV^{*7CJ%Y8#?OY{&U|ikbx&qEC0+ZXCNsZ2 zojD5FDdSqvh+%)*u8K`|ag}DN{PHrM2l|wgqZl~-Jx-cKf>T}zw2f4I^i!O7I7g4ZuOf+Wy)2FWs)ucq+|N5sMrdj4{W| z+Kf>+_d!=>;b59pC5^E!lO$bj)?(wSCfrH#VWaVvK1Ua*w;%vZ;>%^!ZP}aYFaUEBl?_U#02U6|{eo-4w3*nYbQ81d( z_qY^~Gt9yVbv*55DTp}PgfZE2rmpB$#vG!hGl%RmoX@#l_*QUxKxhtlns&xxW~Vzp z5_)_(JWR8AD%ECZY^O>;GBJ9PLWAR17iK`;Ck45HoL@z*^fOYUKfNFjX$8T7;`Y2? zvQuX`FWjTufi>);Y(2hTMSgU0-I`3uE%BY$Z(iKcm(o6up>Q2$<9UvOmb z&=@$S$IZq4LlwA>BdoSd##2ZZ{*|h=;d&A5#t_=ZDwP)#l2Lb=)?ud zCUSbvXHtJQfgh8x3$!7zVtX0vJhP_21$^n+Xb3i(ch#8h0?T%Bnpd8<7n$vkYV*=Qo zQItQ;M@JKd5hj&J+Q3QjX*da*-`-UE7zVcY1lF2#;i9;tEomNfrK{YW9uHqj6XW$n z-(PE51jixjTL0C)L&7OwxL|MW6=xHVrq?b<`L4yb~Fn?90ehf>KYgW5JmQtTX}6 z%W6HtX9pYVj9Yvsq1!xree!jGrmLF!Rq#?-Ru=4XV{jTL#%DC>jIRohQ&ZG?16h~y zLj?yczo{NZ!%uC2|0kTKYJb|?us)Iv7&V8HK7f0*SL1^Z?+rdp z3+@IJe^tTD&@9*zGk?>kEqKci#SQ-G{?nUH2ua|)a1DOaZ>21ClP6kQw8MUbC63QCzaHbxuwe) znFr8iL>j^YlUxkxa>7&i(^F#vQxG``{z%akWNaQqiGVR|Rb<{g(Eo7@8-_z7v>8ZKsWwbkb3R#*$=O%1nrQ66*@1eGG^4VaqQ;E*>P+&R5^9$Nc zqc-i~khx))OsQoS(oPNPqMM_q6Pz0MicVI~;66orIg?<`Fp4i{n5!>6i;3?NiZlHC z2R4I)a1I&EO%Uq2^f1M?)P61I;44Ls>v?2sr(MR*a6x7R%YOap`P87LsJB_&0y0(k zp`O$WxoN_$&YWaWp6NwoYWAo?b9~2}K^C(m>H}k0LY8TMMCpQR&DfWcy)N2QpG~k$ zo^aG^6>dhx6mEJMSqohsJu&By*~T3o-Q@(za8=+VUOoI=HgXDqi;HR4P)TA!Y<)5QW{iiQr7&#(Iy@8=Q zz@9Ax^+tjf|STMJk*`s zowI?*C8CYetPnWS#?=}sCBGM_Cj_xL7O(D6E$jpz*AZA&6sLi72=`d%U z%F3dN?xn`H{^oP&_W+%)^wXK%M=c7jCYxJ&85dk7=H-2a>munesrM7C=B+WAyPrTy zxQy_y=m9d-gqb3#2f4TLB{kGT46qk=Tl4_}wJEAY9sFJgg{VGAXnkRD7V6Z5dKA}^ zEl8bVRHXVM>R)3*%i$w;h=_lgnJd`Ol!8otAbF-b)rSdI+s&iExtKsb{K`eD-DrJ; zY3K^$pi79(PTFdf(isXf`Vr~tpw;O~c`fy&)V?Y>{W?z1EumX+XmNS-*&ilTEZhtV z`UJBC6|r~;SFt)ttS+*_N$nDx9$qE(r17cZdR8Ch7JfhtQ&C%#Oh%|hK`M@B0zFFR zNji()??IiOjHBo3%Lv-Z_&Gx#BUp}>v;;{Htp$EGUsoK_ifjepW@3rGktWkzIGQS7 zr@&zeE`9@VWT;(b@FA6@#~DRuEE*KYsY!h}A#;~#qK!5xXa+V*dBmG6Pf$^84LKNS zk5f9&O|aWG#+^}99qTbNOf5(g_*A6dk=YSWkU2PO^Oygu~ zEu1H>M51WcSCFmAE*^gJ3uk>Lcgp#-b0n8t#hus*(dk`HhM0Ym&F|L`o3LTLm)G(; zLbn!7QD0YN^FL7N8|iwoHHZD;R9!nVGoo)G%Z#FHGP;*HQjARU091}i7_b|2BamtqG`d*?1=e%fMC&@hVz|uXe?;~3a ze=uYbGE}ZRS+3Xh{cH;NF-&Co0WwwDxP&_%r02FXeU(zec!;d^HhlbyrXMD{*mueQ z^-V@&JVLE2jg#>BC_Pq%k@Xlow}jaS)e~wJK0}X_$*)!-$Mp%aG!%3)pX*N+jD_H| z-z6UEeEk%eD$UWtES{#vnu37S&k$*ycwlJ>&yuZ{ca#$W&~t>^3pTkpIXusOf_2g` zFA!=hN{HYu68B3G&UYSF0@zSgjxX_x!o7@K(R4^&rUupFO!O-R3KIi;pqq^KDw+IG zVonvOh*WWa@bhc*Tu`*xy*FQe^t#unK|ziPyS_n|SU6LD(S9V7 z?QOC(OnBovz^6*|`}o2C`!L%vgwJHJBb`cQI`Dgg6#9<1YdYNYnAedTrGG@_fBx){ zso{?7cy2V4UbAA=$__7;bC=uV91Xb~MZv|jN{2#*m!AFMB-{=ME<^TnR%FLdS8jwE dpH-VnF$s@;vr$`8Tl$;)x2g31@9&h-Ujr_aU1Inl+hU8Mf zE;KWcO$54x$|+T;+~R{%A&)8_a!7K?FUW7$Yfi4pO}A7M=j&Ml1PC&cN=xqSJbGrj z`|IxML0YT%7M^>5-EIH#70dbuH6|Yyjq7;T6%^cRS={DM$8Oo?>$Dv6Ewl=EEMDO5 zV~e}O-6^z++*!5i#qg$WSw6$FwizcI>icOZIs53=>KeQ8gS);Nxt&TDCrZnHq~kPE zY%~3Y>6C?iy_w2*Aea;n`a)^NdL0oe!5+pc)@(Usn^LTQaA{NP-cqxv%?@qap%JG| zo<^#PaUn$#3DlIn9QNYorE8<@8A$qFk?4^2Wxa4iEH}ez4aP3ABz+Jrv0LB1ay4i2 zUQZ<8n5mwK*h3)|W-PJy8dr=6AEsC&(o2wIJ-t57h#|Nm5+Oq^IBRb&F=AMOYw%6w$bjSN$D@umFoikhBUFi#r4e z{)(TwEti*gnR~oqT19@5&++PGyHyfpUgIYoTRV2k6W&&ZpB%T!e4d{&Bfju4a(dh< z^H=y8GcqUUFmiU>D)R;Ysu`(@Dn`zYT6~e8e{8jC`~rUs-xK_G{sz7$`PVqZcb>n= z-@^A4_hB|~XSEx=8z-wmYqFYwTDiA&Yl&<~v8WR&#ZZBLqzw8QE0*a^!SFX3&d16Y&=Q@TU+^=-K@q`u-1V`#lTbkHgdL4(%Y!vb36p=(-~hb~$kw^y+y zltXXp3SQPs;wWumt$00^8{++@NFJ(5Pj7bO zcC)vQNRhnXxO%0Dz#uO7!stGn8HDYC{62^}G2Faqq*ME!06`%nD+|=VnKgRbnHL1u zOb5X?!G(GaMae1I`JadH!Ry=ZSA&Hq6*fkbBSgLNLv?xy*r#L%Lu<-JsKz0B&c&F$x)zE zfL^CT1M0aceKii4cqX{NAA@@^=@yZYY3+UgDfyTM_eB4chtI4SS-1DCSZIyUG3R*gLe@TM|+EdfeV)tia`l~Uf$MZT1 zCTMdMkDv4+@GU}u5qu=kVLzq5UsL}KeB{COn&j#)sKnMITU)zGp0=Dl`=<5t4}Ru6 zavl{lQl_D^<2-V;J9Kq%$B}R8qAt-j=dm?(cbpv?$Ca~eJ@7Q8Rs~QrhVHJnN5@#+ zPctj%zo9Fb>E<(c{XJ`PHqx;X{hY2E`kxFfq5?M_xG6ruI-n_HuX{sE*@}aAJ~C&0 zem>^O8Zz6SkUAE~i1E*O9O;=DRe;E=cok_zBLm?!_^V()dk+Ic%14})tgO?3=09<= z@@A+)t))DV8Ff3eKRu-F%v72 zHs2YuxrmDlSUm-n3yX&FMZ@$u?w5vbcjZgUuFQhc)GnY2j$NdJ-9t>vH!$``yo#)$ zYA<}{+VvWe`uNkV0(wbvR94%+MFezmsI0spa7WZK^KtRSO*O=YGIKkz(pjM!_9Uf= zX8+73?PbM$6;P{w+uSWAsi$5tM@&{iPTKG2%r$G;K~^-k29p~f=9jepJG|-}C|u`^ z(3rF} z#8KSDa1-x=`SF$6WU3;+HPj1Psn-LQ&dNPx>)lZ2m>dz0vJwmfOMXF;k!nsjgEKQc zgJ6c`QQoM?*I~XEnJ<_Ofe?yJFZ=wQD#mwBf?mjCJBcK z_nm64&UeSyAIGw}KNH(IN8cjGr%zMjEfGQRH{y-9@{iz)29oXy7|ke3yy?AxzEObclP(`_*j}p5@w(>v#@)(6LMZKB)O+XCD4n@omRH`s?}L w1<&=|YIzh9zDIjDQDlx3@=dCga?>yrN3ny*n=9uUg*!#yfgRtoJ;aCq0i3GWzW@LL literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/admin_settings_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/admin_settings_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e8314781ad96193dd5841fcfab75bc6a29bfca8 GIT binary patch literal 3261 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_condition.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_condition.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b3a1dadfd3f63caf2e1c827f6c2c9c06e4e1c77 GIT binary patch literal 3995 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 LI5zNIAKBvHRO=?a literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_condition_spec.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_condition_spec.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33b8cfd74bf13603ec06746921a564cd2bbb27e0 GIT binary patch literal 2694 zcmZ`*-EZ4A5T_{GmKD3}ilSKBhjHD|&f99ID~16<8no*dwgJh|biiP2P-%&_)yR@U z(rIHTPw5|$Jm!7-XY{(Kz75#hfPLIiN#-_*5RxbBc>LYn?~cjZZJ)ri{@ecGk0v3% z0+y#!N4`Xq89nmB#OuC!0>>h|3yByuD6nnX;pJ-1(r=mzQ3#6yP=pTqNP z9H%4wO(s;tpFY}n#_#{|t#7|P&J>SRZPYY0ah7U6&R%kpaWOUHOvN+FmE4+2Z8Xml zDYWF%`K6~y_>7Y$8%7b zPGo8Xp38GFk}Ey2+U5LXo@QHOnLqk!>2?KjJ(npU<~o-l-H@xjhAN5C2ok76^P4!U7B>FJkZG?L09JeI>Ok|UXRLCt>y z;U{Y$&hrn2mwPbucQ8o;X(5=BzS|@*=`$FRh{%0S`t^uKHCP)_J!-(}MPAf|wHf)* z0<3=2irTO)L>C}&@0FMCCqhlYu_(sqY=GZ0y|(`B(K4n|^Dq%wa}Xd+83&jr{&6#w z{KyB6J{*6AJm)GKDKY6*L4BA(oDG+7gxyrxoQQNPl4PfABNqaJP9Bue8y7eGQY(Ip8$r0M{*dakbpSl8&$B^I!?bG#X3~+Bu<6N)S*){EtBCPQ8lps zSJC@XL#}&i9A-VxiHDgQ$vZunZtHoz^^$nd%XfgU>7DNFr5?~z-pWO|36uiGL4fQF z!XyT=^(-8Hv;;s+fsqcv<4_04v2MOodO-k3njrWDu>6UB`*e2gw3FRqy|-dj2Ynni zR=JF;*7o^WZ-B`P>mrFDC+dB`?JipMix&A1`l`jw*506-)}XQy z76ia%K)%U4$Wqd zE_7%CjkIJ*tWD`oM6MRVmOZ~@7{anvSpjW59oS-47^6;I;Wbj$p$evnDVeqD1Z8bo zBvVa_K@U-zAh_)ce6&rijvm?I=x z8y7&R>SCWBkOO3$GwaT?4(=wnyx1W!Q2652bj#Z-DB9)J9xj8-k2s~`Y%9Rp>i8`zSu(G<=Lx{3b^(78fZQ_15Y zA7p0Cv%w1)!qqO6q27%lPg70CUWw=k7 z(>gn>mF6iwPQr>+1P#&Iq^&BjpPf+QJlysYL+lkSY}aQ1Ol1%}#ZQ>HGcz6psI%5- zq1&mLz)R@|0W`g7f^sVe@RXx34G2vZLIN*=y?z^uDjrOY46rmCcn}s*mHX=`VRKP8 zal*@OZo-~m!;O|~zw`)mC}R!gdalR3YcN==aa_%xqyC35l~hS}5ruk{N2@Vs*&c-E Vp>P+?>QdS_J66?s>%QW literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_data.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a226d88f02574d53eb2a7f8db460f352f6492e4 GIT binary patch literal 14317 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 b6D881z;i2@W9R6B;m~r>RJ5!V;9>t4pDvM_ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_data_page_link.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_data_page_link.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40abaf3b4a81bbe79fd93498e22eae4ec7a847a9 GIT binary patch literal 11269 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

}z~3S*u|?Ue~~FME02<0j4jAC{VI z_m~^BJU9CG+cfe6i3S4i^u&8B(J1ZEv@Bg zDbf3v{YKl}8%r_SZ}eT-!|?GjUDfmCT2#jd2s6q>7J0fj#7e_XRZlK=n! literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_data_query.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_data_query.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51ff71cfcc38bd0789974d9ebb052a76ebb1dc1d GIT binary patch literal 6704 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1828c6541845a3e800e5b56482e54ac328fe46b9 GIT binary patch literal 3140 zcmb7GTW=dT7A8j{X*8A{C(Q;;_l4bd+f^5l(k=EyaE+!-8sx=U)G5#kTTDko${uGl zGa;$87G$7+1N3j$kAC0%GxNGn{R<21q}a63Gp%_dH9`kzH`W8eLZ9-Pyc>0 z-d$ttAM|mt`1tq))oh`WY{Vp&UdBh<_1?&HePh&+4e4k8v^i>W_L#}0Y`tQ#rJBc$ zQA>Ketk;eoa>hb|@@zlN_spk7tflzk(e5+x;4e=?H}iR+MVcF{XNgUV+=%_+J7EhE z&+LAo)438_y_hLujVLn}8zo+*CbeQK7W-OFK7N1S+HyD;Sa-shPUxq_Ko*G^U|wmJ zCki8D@5N<0cz=6!yugy#ROL3Nb43~NsjWf0-525=kryxGp?LJ?`ybXIpOz{IVqr>^ zh?hzm>==qa_3t|sJ}V$3u|w!FDL%Oj#4UKNa;0Odq!=F#1pzidyqDVj*|?t+(}DRe z-rG~!AzY1xRZ;1nSK#G?pE+6TaXJ@6_X< zG5~w?cb9<0JrRp35M)BCNt(k!X)bnaXYBO6s%d7W(p3;eX`b3B>NP6gsBAJ?18?Ah z$R3ue@=|%mt4sXEBg@t`~e)$@<~ zAKo8;+3H>yC(pq~EF4EfT*ysv-oPO>%Ps<|W3qdc%6@sMTTu3G(%M6F%bRa5b?mRO zC&Zprp)u9ZPz`Neumc9$@c9pq6+(@yok~$mFoF+PvaZI4^8m&7P%Asrh>2&vY9no- zGSp>fZr7|JSSB1t@or09`Kmiu5 z2w--9LCLTtpTk$iU?VK?e=BxfuN}P(7(K66i}ZM%ZUg-9bPGF|97aB(>h$>=1}Qt@ zmZ;4Ryi@*=ee>~Oy(90aVH*p!@Q%GB-}(#RHjh31JKMA^%G$5k!aw$oT{vv97lCar zeA&Q?{=z>APRT}|`=54p@c#qb!A`&4c@mzoi@O*8`T8~6b?d)cFj@sP0njv$AO~xj zkoj~$q1T+h_k|-$&9FN35c3E!n=0fA{De#sdr5a9Y6Eo_)!ad2L08FvuY>dWDJB*~ zUT>#r+ajX-*s>&xEvi|e@D})PM{_&^(Go%^^pdqSK#V5 zF!u!2#cP+}`H#s7;~-&Y;1*R;os)|Z*pr6yCg_Y^KTtE&*VCa&2Sw_)XHsj*dK z8khPeok|v}e6m~BbW&)wnT=gO)09tpEl1m`g?u#2Y~?$dJgS;6<7}p?#&dOe6)#C0 zqMART@x9w#$V2Y)7Wa7f-=V*;{AzjKe}%1(Z_>9nzj4L>*9=W?Toi0zP)ERtcgjwQ zUwq!b$SNu*z*)b@eZ;wA}e6NNza~d-NE0AIF}gLA3d%qz3JDTk86ljiK4Gp2!cy_ zzMj061}Su$!QR3Ep~Edg$F%7#q~x*S2i|jfu6Y-NQ_qn9Ct_UKeNl`LRDwGp)=JP&x{!u~u@MvXY^{d=Dq^!0YncjsF7msrIS> literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/alarm_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c397ebc9bcdb8691f256b7d04eb90fbcc6125f6 GIT binary patch literal 13075 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 Uax%e}z>F3W`G9X*x`p-Qe+?gYGXMYp literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/asset_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/asset_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b76066b967ee0f65cf66d4c1e537330e7840268e GIT binary patch literal 3140 zcmb7GTW=dT7A8j{X*8A{C(Q;;_l4bd+f^5l(k=EyaE+!-8sx=U)G5#kTTDko${uGl zGa;$87G$7+1N3j$kAC0%GxNGn{R<21q}a63Gp%_dH9`kzH`W8eLZ9-Pyc>0 z-d$ttAM|mt`1tq))oh`WY{Vp&UdBh<_1?&HePh&+4e4k8v^i>W_L#}0Y`tQ#rJBc$ zQA>Ketk;eoa>hb|@@zlN_spk7tflzk(e5+x;4e=?H}iR+MVcF{XNgUV+=%_+J7EhE z&+LAo)438_y_hLujVLn}8zo+*CbeQK7W-OFK7N1S+HyD;Sa-shPUxq_Ko*G^U|wmJ zCki8D@5N<0cz=6!yugy#ROL3Nb43~NsjWf0-525=kryxGp?LJ?`ybXIpOz{IVqr>^ zh?hzm>==qa_3t|sJ}V$3u|w!FDL%Oj#4UKNa;0Odq!=F#1pzidyqDVj*|?t+(}DRe z-rG~!AzY1^cZfHzKpx)dV@CGi3 z>|v=YFO_G!>O_&l7e#06pXK071DXu-G${sCY@QT)Pkl5{`Ac(=s)H;Y56VMOJ^!fx z;r#)at?rd^@*Hf$!f`~zh1?Y94IEOl>>{ul7FIS&WxqVsEhzgoY3-r8<;^#jI`&uC z6JpP*(3t9HsD`#K*a3rW`22^*3ZX{UPNgU&7{P}tSyyAjd4S@3sFj^*#Kf~-wUM?^ z8EP`%P$2xzMV*1J(CLipHgIXAsAbcoQGn+6s7}pRFb`MIQkjtEt3qR{PC-g|pa6?j z1Tee5pk!E+&*3X$uo0H{zZJW#*N$EXjGkAkMS8qWw*mflx`mxf4kI5?b^81bgOnX{ zOVnlu-YI{`zWMmC-jR3Iu#E*%Q zzHDGcf8n15r(`3~{ZBhP`2T_JV5eX2JPA+P#oY`4eEpj3y7gZz7_9=D0BD*=kb^Z% z$b7n>&}+`$`@#{WW>_71hl@gCtjWK>V(%*0%Hru*#@nBgU}DQ1Hh+6XsHLR-R#qf& zX0|b?S37|}5AeNnfOnaMBlJyxZQON`?>e{>T#gQ~zoY3?Cs31?dJ_$>`bY!QD{%E2 zn0tci;&wjQQj@9LdkPnv)m4aF6W45v+pzMp)Yz&q zjZ1x#P9+OfKH05mIw`c;%*HOCY09U)mZNReLOz;hw(^}!9#zekaW+#`b#GH-YQG1vQ@i8j-JN0_67;RqEOWWB_Q%kOgXk} zc=L@5XfbsS?0E{Jcn4V-krgoCq-W2!?%;1loJ)-Bj~>^Q-t_Cv$2CN%MA6qP1i_^| zUr%03gA_W>U~gf7(BT%LW7>2VQu0{v1MfLK*SrhCsb|Rl6EQCAz9_~AD#4u)YbEd$ zi?h#r4gDs8Bv;VoNX)^tSEshBiA_phGhP&_7g6*Lwm1TZp3l1%3|LQJ1AlHnm%{=6 zx!0{t_`$iSe-5mBI}qR+3(@d3sB#4b2o)U_UP44uJ-*Z1ASLs7iq9&HBBZTZM&oW2 zk@)3I8*+*SKB7Eb1OFFrRz=M&S7fn@-4sF!*iY2mWTe4%oJ)t3z~dW3A*iWhFy@`5sQ-f!F1?8~+8YB=^Sv literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/asset_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/asset_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0492e706f448c7952a482800a1c7a912084d726 GIT binary patch literal 8578 zcmb_hO^n;d6(%X_XSve;`9Hsmo!C(lOLqR6Zfw`7?YM3LIf%DKE3{xJ&Fn61ttbyE zC%dJA0`{TkAwUm78#E1U6b0%_Pc6`U&%G7}kL@Xko&uymfj0f#a7l3~?n-vcT|V;7 z&ztw&_hyEA^<40Nm*dUzPuc^gdE#6=yon~m4c_-{8rK}yYy3>pKG!hKV`ksI zX)l|XUOROErQ_#Ez6T3w>)YZlCT++F}b za|N&{1WCIvqcDvCVE}@aaBHlLyYi{g*4Yd**et8E8k=MDY=JGZC0SEs=h%LB;I7&( z@iIHe4&7DmsO<``T%Tcw6RymTu*YPL!41?ro^WOM1bb4}%<@^(Je6=|_B1nPO_f(s z^Gw2(*->^(*3@_nHP0qonLWpj%bGbphnf=!S7y(%x~!S!^Qd_t;mYhq_L8hw;0vfZ znQ&#+U`<)G$QMy_D&flPG<#XrEb%4Oyb^QlRrcClrM-{6&c24{e)b0YI-UpEGJ6xx zgX|1Di{~M>525~zaON$~hu zu;W@xh=Fj|guT&-qVJ-Mfb>ny5cbq5lDT2`hjy>G*^nU?7BGdvg46fg#)YBhyBl0w zVWHk}-CnyK>BicX72db|{uNd?!g-rPAOhL$SroWowJSIUspUHxJe=)rOR*dlE{zz^ z8Vox-^@fcnh_=nt+LXyB>=qfrKqAUSDnw?8(595ZSj3yWxb2`nzCibEJ zD~;2qn%H*u$${Oyfvo}!I~MIKR=4M16KP6!d)p5STMp(u_oZ_igUzsF;nndi>kVk& zod+ptC3XC-g0jiCq3U04EhTt2V&Prv1Ib12bW`MiL2eF|>k1-8-TLe@$976fNhSTgDa0Bha}LoEGQ_JO{`vtXLDf zw8YcUxUNMGkyC~uIpYlaA~r04x3|7ryAXd|DjVJf!M^E&| z!y?dfo9_)&)~1$t9$Lp>$)B1zmi?J5n+mL-CSb{*Mvsiwl)bZ%rQ;Bv)CWm#lSsxW z`Z@hqDwlB0kKmHyPDJd-31YkHIS!g^8R52Dr@f&|+tw0wXdlBSlLI*x{*5f03bxT4 zqhGR*jM{XaCxCW{v^I%kOrrG1Kd4-SHa7x|hMkDn?F6%3v>bjQF<3s25Qrv`j7gN5I+P%pnu#>*L=ZdJ(sX(A828D-S%wX7vdy( z)YVY^Fyrm8a;9f*beMhaRk+-vtkpqf>sV@Wh-5X+^xUr9^UmQVYA;3Zt|I;7h*Ug+ z10txo2z3ibq|!&E!mBv9lPc@2&oQ}SO z97#AIhBIg{sE-%cwof}`9@q=ZYaC~9IJGcvpobGc8wYiv-g7)ZENs{V(Tv9rb@E(T zjHIBoH|)qW5J9e~mtJS^Pcn^}Fy^DmLU^rfe3`!z#F zN)@SBO|AaN(C4ie`7DJjsQVUA=B0g0gQ^>=C2*u)cEl{s(H|RVWM;wU*#gLoMs@ZYjgo1b{QX}7sZcdJ&5wBVG*6U$f{qmEPm6nuEt?(Xu4Y6;l!xHnEHtm zWmXyL-_WX&8()~Ht~}Qxl_PDwmE%_E)#sM=-Pox{MklJQ8?EH3A0~_G>&&u3!?LiJ z4SV!nwJaKGyQU1UxLrW@I>v0*Xwo>Hq0cRvdQYM(tZc7;n=<7dmOSobDnHa&O%$#& zV%{dxzD?vEBBR)mZ!)t_j-;%h_Yp`%(N#^?DjMeG&cD)^+T6|(;!0l{HSH+o>5QRj z#{cJ8F)EK&^om|B$1BZM(w$;8)C3o=(n~1{KiMMBEUe}c1m}RD;!%*mETf`UuoZa<=C+;J3pokkd#JE+I5Q-f?~vt9iv4+r_vV{7 zZ<0#IxA1%X_v6-=uUOWX)R_FaXuO9<-A2K!rp0aUwC$#C-cHjo?_4wY$l^Kf9$DNK z?qRN(=gyi{&4&+c%kmk1>sxVWQ~fjvC1+0_uC25CAN|ZXBOfG^#T}((FVb<+QEV&u zl<9GK{vMnh#-hF3F>+VXuuFV%(^o3fS)OixA zI>v<*ok*aj^sTTP*WbA}`aFY3Z&!45NZ)1Ma8s<-!+SNx-eR5PX}H23{^<6d4CLdk z=m0TOT@kT8Ar)qd41 zrppVw$URff^EbKA7mn;^K@@qJSB|VhyXgsUyTljAts=j`m&}MSe2iQiw~G7~e#wk1 zhy{#X9<}(Z{K}ElEc2`U8r~JY%&+6U$Zzo1@V>xb=WpP>#7iIsOPB5|CG?sIWwiB+ zo{;-})p)%AaD|AXSkw-cVyJ)w34;^H-eY=8u%U+-d1y2W7IkH^DZ|}bwqy?ytfFRu zgDW&C)43aVdSSc0Uo-2{FSTQ(e*^M;++2Pl+J*@#L-kPzT|#56(;NhCXHMOCahcxMrLGYR(Px;8SloOP$yE7CB|G?K&|Sgt`hBysqSZ%T)^l* z`}JQcc(&e&qofWE@kSyy#ofB-?5W9}TyMv%dUqd@pmVo&=XM<%U)<`3(GE5%1Y3Zl zbP%;;Y~#AIOATKEHhpG_G9(KSL*#y~yPtYNfDh^*xCtcc3W|bLu<6emKfdjL(_fzU zUTripLRcIBs7?c5Dhe`AItrvT?t zL?Q{H!1cE=F-|AV_s=XZPG@DbIBn0@GPV82zR6heV%Id}WdlBA2{~hW8&Th{sQ(g* z7jopUV~(7OyZ^BP6Psl+e!QHru{VYh1SjGoCrV`1d7Pkl7}B8O#2Yi5ID_Vev^b3y zXXed!$t*L@Ow7n}rfa^gf6tFehcx7?FnJU&$OY3(puQdIpJ4)x&|?yUFHniC16y0i zIQF-l6Z?Vn@w>lu4xEFW#$i8j4xIy6y8~C}4;}eko!2=2xpQO<+(YNkMzD2Ot*4$Y z4qTptL~Y<6dnXixvwoUcLjQeT!b~@tdF-E9ld}izSbjm5jr^|%7D)k(2Q>Ku=z&Zg z-+DZt)Fa=2`-wTTvg0qyIFO%ph19V?UWb3i<4Di!f*ed7z*oZe>=O(O z=wx*oX;CKu&41>k#jQ|DR86FGWBsy!o4cQ^(S@d z#7}d(VOL&*F7y4=B?qSYObet{uVs>CNgk>eOdLxK$gp~Cow`P+9i;iau-y}BZb$4- zL>UppsGlP1R{wO*)!DEYf47}Iq=KG03@Cge$9QCYGwPg*W=fzV>Udg5) z_~QtQ=bW3UW>PZ|mA030A#n?&wKcYvD$;#{0?fePc6R9M?o4c8*%K_@V68-Nv81&v zA|$n;6b#q$u>C8}tmzsxBKby@Fyp9NhV}eJY^3R7xGSyt8(WqV| z!#lVx20`iv0m5CcP4#ksYe(1~juhdXB*Fr|37yRfZK$}_(;}d4SwUaw4MXI<$+*)3 zuAA8Ar?;w%poScE$jiG_{E&)M3r_Pff=>CAT0!AiuI;#v=U_7yzIKY)+b=j3Y{HUn zJO0_X=X*Ci*K^CoQ8@SsedqfqQb!8;I#mi89gM_z5DY~=8Qz^;lFJq4kJzyz+X)5@kd!G*+A)d(f+EC?9iv4d7m*tjY=g~mXC$sf za_O0&91&D5Qhz{E^iZG&>FA!@-%?<&J>~3Mfi!*IS&>#G(yrPrwevl*&-?w3vc<*F z!SncUhwZ;#a-4rq=j7v~^D$n12ZeB2j&KF*x-Hk%ti^2YwY*1;@PvQh2w(d9UaKV7 zx>GO34_wCyIi4q-w7;o;n#D@+&mOKn;rD;}v(V0bnkk<4wNb;wq*-6{PWFtOjK@RM z$y7R$T*;?Hsg34?u8g(hJE=|$Ux|4~$&HWR?-(;!ZZ?hmLYuzONVBHM65YhSRI;B) zw6wV$57OrQtCP=jEE)D>-^BD?K8QEvN;6(&*~i}pVi!D;eW_w21#j;za{{b^cr!JfVY`uJy{3K^ zZ*EFu5l-4kCgi5;taP+t@`#VypALiF)D2jjnohOCN;aCr}EiI zuRVV9aG8`v^Q0SV&C!4&WE_l`a*&&j>594lkw_#;7s&-Rtegg&kqVDA^(K*u{yjpo+sv;Jv5{k8inv;jx4DTm+_0LfV zckDz(3FAN;azN>g(Hpwz%9wio7^CRj7&G)rW6$>99ee1Ng}aXZ;0_zzoy8q~o5#Ed za=To}jkFJKO8b1h(44h;CHEqL_adN2p&^1)Co1iw{n%vc6g71}_qFV9oEm=aC~^q@ z{JQxo4J~i>($_ILD2OKW!1c5|=`OYPrl+`ZF;VanTsIN63VVPQKW zyNi-;3Nve3?E1KhV3hGx2O`Wv38EcnL1VC+2T_ENnkf2!_7Vg)9f7>ocJzI-&W= zL+yzIzaW`g1)V71AJ+dYF&aUMCJ&oWQw_DTCjTsn`Jn9}6Vv3YU!CH19;|fZUR%VgU(>-99j-Z} z#>{APd~9Q-niwkz6|8vlEuGdv2Wn!VA1<)-%z-=2P)el zQUTmYlF>VbT`ghmcX%}^Ma{kTo$uBcb5EyVP26BF}NaSB%JVcRB?invrSTThjjk?jn-Cim@`Zj_gH z;_gu9-nQI5jhBS5gIE6$h0m_C&_zOnq<6fE7z75Nvdx`pNbn8{ZIKy@F zlGZ*ba2B?4$c~&N(mZ$6IH`F^e{n&>RcinmrgtLiN~Y?8TIR^C7Z=H?oho32p4P7Y`6Zn15;^0E^Kt%j1P z8@!zvWEbr%nIOrGmE^e2#@$crp5i#mDiA>=1&gBRMS7E$ut};@N|TqPNIs3CKVhHM z^N{&&Z60fjwPz@qveqVjpk$lX3g&(=Rfu`W?PZG47r^MB0y7}?WfUC}MEX=XA0Dl% zduwZJ^~=P7e%!-A9!3$|;IK>WS`^XOj%O-hQkFoN@8I0lA{m*zK}KY%HH_uKvFqHm zIdNXr(!lgz-r)*`wTjZfdi5a{_o#T8U)Yw-s|h~E9leYqaD12fEMPFu^0%x~)M1$| z!Z53$%fj#1K^WW&{J^hOCN6?fboC;5o^bhE{_u|&cDVJWHL#H!M`rd*7A&?Yln-UiL z_U*@e`+M&#unTiyLgwJN_Sd@`|H^XQmq&@To-`H3~V~IjuL1+{p{U@CsCE?a+p!v;? zO?^=*oTB6R)$76NdP6iE{a?qk2ps3MWcILVL+GD)V$G?^i@LlWM~FBFN9Q@yhu(k&IFwR&dHEUlT&1YaVF^`a9#?jGZl4$(uvc`KySWRbkh zICFFkI7?#IYHxXE`tDc>T7vubX& z?b2GcxQOmzE48|A+X`gB6-)(8A+#aI*``XzP8770fD69Vw9G9_-^u!hyKI6jI|_yF zStGyC9lg=g>-F6%vraDo-sdHZhNH@bmhG53)LJ2`RBSkgvkN&n5D!bMw4pZ~$fee8 zthbQy#=-c(AvB^px;Nh;Hg%)kvZzL=13BB9=#<;wZ!J4)c3vdnY@jq( z0&30$8Gzb!$ACKQf-FGoxH3@lF31FwdJl<*bM85}@pzZh7Ua$3=q z9kA%SLg=Q^fRJf4l!_l7OAE)mjMlLuW^6|SDsF9)0i$DXVKZiL6WTt5%V+_>XhE{p zHMvZXXEvAc* zG!4daG;Ik4uvZ~T2`Rq+p9JNjUotO#+nx!GCL4@XgJm%MVID8^vIjW-E_a;+YvbF$ zx*Gz0X^- zASB$Lfg8ijPZT84hzMK{Fm9xz_FO1sM1>kMgCFLDAoBoCjfI22;XbR3GzGH1iZGd* zIxH*E8G8);7)Lo4BOVj*hwY64 zKN$N%sO$@&#!PnwNwnNu%)AIm``I||F);?3fOP_zL!|vv9QarVy|XgV24XGunL~`% z+iT3Z!rAF(8K;=&zGbjL8nX;6yA79h5|W{I@kQJ&{3T+jh!I!l z9BR?e3UKN81u~fx%*U<3AAKMA38;;3gyGMA2@-r&+Y^>f!5(S*k=@j`WW37ymV!~P$*U^Uixx=Wp%w=Y`?wIxTV(( zqCncB3ao0%2c4MckN1Ic>fn3nJM-xL^$@rhPVZ$_Z7m-2@k&QIq-Q<>IoMUM{W{tC(58ww%YzY`$78uUuNM7Aso6vY^3ib>(WYQY^1T z>qW|fdQ$mXK`Z1}SJgv>a&fs>s;=Z$yIs%aE0vWirQ)(yUDFEdmFn8nVp%=9UJA=E zm)EX#Ib-=kb>%%K=~!jGa;;cGHKwComy7vjbt<9;E0`}ASM$}CwUP#!Yis3>a_V$g z9!NYBlvK2!Xe_^)FJIO2g?H6)KU-KW=F4ivC;Vz^a&_&>N=Z$@ZEd}(rdQVr?_#E_ zBh#f?Eagj8nCOV+owAv0<+b-#Dkx->{np^Hf);de zP_bS{|9AxxbfX}Yut)#XSQ=Zvknv|M&q6XZVtgJhV9~djM-3Sd)ki#Lz@9<$0d^jB z=(l{~`_A8y$zsOgaQTW3zAtD*pI(DUmtTf!QnXpG-o3FPTHg-_(URUC4vq#WM%3h)tBq#wZeg7Hse z#ukN$2t)DxO&8yTbngRiw|WQNZo%k^`zu8sy-ODEeg_z{xAqvuSoS4qKN7~j4lxcl z8iqrV zZF{iG7USBMth1m`fGOLAiD8Om|3RHc!nFGo*O3u-f`&?YFsdVU5yv&QrEm;2=m#lo zIVE6wB<`>g@rQ!ieKw1<>Q#Cmtf=5VU>{Cn-(jN)m#kMotpHWFs}@5Q%O+6mkx>0< z=&A62@re6FBeaZT82Hx;iF)S~gP_EX!=oXT<3a1JL53pehHlwU%wFIO;^Wn?_Q4() zNEOkkWSxtk#kN0VXkpp$kB^u9>qrYc@+|L`x6F}OY6;b5bNyDr@0 zm$@Im^CQ?z+)Frcl;{e#g+0*`UC~M27Odk=(t+bcBHZCz@iy!(;x6M7cT;lGaO9YP z8d+DoE8W903BMd$jzM|e8H1Lh-}0_}kBhd3W6GfZxRYV^-*-8z1=2_$O>z(VfjUVT zYt6-@#bon=RN+(A{>!7spS|Hj@IE{Ax6#VdFxJq$`!b5e5rNd@QCmr9~^Ps z>5$}ZK-nqIdrK*q1mdK@g_iBQ60@ZASUIRnxrjxm{!F?l!Pa~vkISo#Wv=2(Xo z%f0CfE5b3~PE20wZQy;3qM{*W`1x-|9*!gvw(*fS2K6m$11I~PFA+3+AhW&n7M!lb zGL zZlvx2&@Fa|`>iQn3Pge~KS8B%Rwjk^RMcL8*CQ>~W76Wb64)z;_6l+yy^MR~ zY~&9Vy+I)F6L9dbHb?+C!$n;*?dO3AlCbaO)#vs^MRXq~1U|Nc`|u99j}2cDpdns| zLx}6b4g5w-h&ZSP`}fACvSB*gin(!}*5H&@x2OW&f9dthu#0vHr9}1cXc>)1)9(8x zhF%gHQ7dK;UP{yGO-=hWuwhvc`Al>QeSVMh;S}PVJ%l&@hLG_m@ud*#LDI7CZBSxg zm@>+|fBi(U8dTFh52jS!FB0+=GNs6G;R)0jmjg|M4-_{sSZuC-QmblGNAolyC~%c1-34Id-4!(7`>#{Ed3vD?=jB+ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/audit_log_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/audit_log_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcf07675f7696a1af53b32d8922625a4ca0111b3 GIT binary patch literal 3186 zcmbVOU2hx56`ffw$>oYv{8b}vU#3kPmnlp-4f;YTLY&w!3>0z^IY2@**erL3)Jn@; zdS>WE1ob4N`5V%s-rGO3uYJm2DA12{XDOMIoTBK0Gds(fxpVHl=iWO-rxP+f&;NEZ zI@n+UdD&qy}hC5-nC&()}){L)B3Q^*;6L#vhkY9hN>Ue zh7IZMvTiee%oz&>o)>#*J~5vbv6kYCC%Z4iqdz?h-OT5O7HMv*o+mafawGPN?}RNx zJhyv=P8UjO^>VI^HDZ>j*eLNTHK`R_vDnjU{PF!gYiEOg-?|eK_ zyxTu8pA9?k^6fHwG?%IUV=;Lq7iQ=Aizfr}w-HGe8zV4)FAD)(E{q`To)RlX1u1$y z3o^`fG12j~S6TjX0cTjDaDdxX$(+XdJkGMio-^-GQgd2Y9gWEj^ftH9S$51$_>wQZ zQ;&nq!0avVzridXh*(SkA`?=L(;RL}bFo{wWT)$ubu*tST?SE<=BbUMZmsl<%ErSD zum_Ha?BPt6UMkOc*@_|uF^bOEKWzU?1G4n;in>t5PL&p?wk2Lc)4LfRP^4CT(aZUUV~)>?IK8U^TngXZ*Y1dGlZz*Ht=h4Y8T z)SRZ22Ehszopa)F_rGf!R+MxoXE8VmtNcG2URQ8OcL1jARr--aZ&R|5|DBRy>yrP- zWz?Kjf5jkWN8A$U*}iwmAG2>h{D&6Tr+;PZwm}*FHCy_} z-m#05E%q|7&807ESkYVhC&4LM%5(qI&KCZEWLwzjS36I_Q?|Z)>0hkhux+>gt0kjV zKobB>{RncfrVg3UmlTur#rt14(o}@20usppp=VQtB!ZuiX<{$wPQ0z5?V_2x=q%VP zIqclucViwExU2n|rZ|t=0M+>_A54-(RtJ8Ej?obR^^LPf0Lw<}O?O zdW~5tVZE)aNaD0l>NlcM?t zI>7ajAEs9j>)V)nhUOx;&F}u(=iN?OGwJtb3+pxQF~iO(>$;p}%H~9&{#jjyD5|K! zF^XmBXQ{DeZ5q$?O*)l~RQhDPvhJkNYBL|XM5ig&b{melWdn(7p4rlOGI>69iW-tqVv5wUdTi4^9J{L`(L5Ix%z5&?SF=ikl&zhZ*l9o3$EFk5V=^` z#Gs0U6YrFr63h6ax6U$T8C*To}hE=v~&XB*Sv8^0J!msF5 zHoyvq{1Q`+Gn?Mx=4HT`y@vN9BT?XkwTxH`r0>$*=v#O8w<69Z#??ocYf5-mU3(2`4#($|q3>g|SL=WgVN8zGlKGQZJ+E8*Fh*4n3c@FPpJi zaSi{48C_xr{sXUF8S;Y*m;V%AcgG;i6&#}ETY%*XIuI~AD!dAcX1jc+yGg3%@f4qB z7)3~A^NhyrD54WqGfjvp5;%)8cNwe_-Jz>yWy2_okgbU3Tuo_1e?Z;uXnkjO%}7+1 zLB^Yk*rFw_ERxahpc!&!z@N>YaY@;#iu1Fy~R)cym&n+XyC literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/byte_buffer.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/byte_buffer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..760483d864635d30a98e49344f5099dbef664e26 GIT binary patch literal 7139 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 dijlxgjz|+9Q9d#79Q>pN1O^gr>w{nh{g literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/component_descriptor_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/component_descriptor_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8e2d4419163844e55f34993778e7a39023f373f GIT binary patch literal 3351 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/default_rule_chain_create_request.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/default_rule_chain_create_request.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..162d36e1371718c74c8c228dedad676df440e044 GIT binary patch literal 3490 zcmb_ePj4H?72jDd$>o}o_r@9C$KN!G3K}m;Scb zsf&Be^CFJt@g&X1=JP^m$sgU{e#}4n^7oPZ^F^U~nj5RiZns&pFA|D=Ir0VWa;gAurXWw?SVpQ zlS9c^ycl5)pj^!3Y>YbRQ=aK-W#<~P`S|}jkdC6KukG$k^*Qi#!s0p8btr(LiNU$9 z>RPlU@7_W)gtkVwxN)%}r1Oshl??AdxdP;0xBmxYMOFMbeP#jyGS4UY?#vUlUcw0Nr{*y7cT7@mk6G^!QMuzEv3uS(pMLG{`Fk~6TY5`>-`@*t zuncT{-`6*6-8QHg9eB%N-`__}FZ~VgX=t0vK-RFMy9^G)BQj_8ohV!Q{+Vro5_ys+ z52GXRH1#q#*?-Bl-TtqZ9_@lOA*8AA;T-I#gV)0)WsUmc<|Bu}3e;78Kqi|hZBvB| zh?mPWu`lUPu|d$;Ml;vYSwx6rkgo-P>)it=B-&VI}+i zjJ?ZnBNNl16q|pbg9($@yu~LMWAga??nYK5A~TzqRA)FgKQ8vo6S1$O{6O?8P@#6+ zDRSK@F~Y6DsS#}bKpMLPwVSPD2@L||vgsKm^cDR3Bbp&}wAr;60qd+G$*13!E$r7s zW6HJTDiRYQP1zhPRCcS&2-gMNF9fauWss%DmbIyv>B~6F@h=0iW?8RJ!EQ4jy4s@2 zT%Cps^Rj`YinLh&L5x z-~M;hh}avn_80H|B(Iz^KV8vW#E=E6XgTzcyd%OQTXauj5m^kkFx;nRQ0C;~<1((Q z3K@!4V>ZJsTQ+AXKT}~VAK`L%HkQiPGC8Z_X@t@F57aUFut>=oTBR(wbgcrjdm7u%{tvITy$iC>*^xGsl=}cvououVA z{R(Au5Gj2IPh}&H)l)Q(xDbf^fVE$1?271|N+-s4#RV!o@!OTTKX|PQ?*2t;R1y-r zUmK$~Yua&+^lSTysx8oES$COwhM^~C|QX+Jh Mt-#00EJWt`FS}%ed;kCd literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/deferred_result_response_entity.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/deferred_result_response_entity.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a24fdf3e3426a1d095047271a7d9acfb7902ccb5 GIT binary patch literal 4234 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 B;&T81 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_credentials_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_credentials_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b52aaae1a6391d56ed498f5b2623ebff14ff28e GIT binary patch literal 3321 zcmbtWOK&5`5$E5S_mzd$&Y=?{cIaTqbqrq!S+KpkUhG91SZg35VvL8=O=+~` z47a-}TLg8|0zUW;aVK4s+wYTHDb7) z{dhF|>k4CkqlfcXfQL^o>^dgJ2261!#(cp2T?~Z3*9J9JQ^7cx)CYCWo-kEcjaN)H zbp5b4XehD8I?dz}XDpJqp6_J&w*9O~jFMkG-g+)S{lnA9zxli{GRv(qv(#lpZskt# zjdX=fW^Si2*<4GbU(U33R!+w{v0CnBHgj@4kvm3@K7MbC49-J@}vk`E06l zAeMHjQ@N*&#g4xGefNPk;b8$Ksq4dzQSr&^K)k>cookagt>kdOFA1;(;_b}s%!b{x znDp#7$@aE39^vUaEtKBYc^6{QPY4Cu{0ZJ<9bSfybCyUbLp+oj_F-Tw?JllfK{jFC7t8jP|&v2`CQF{a?mkwtdsA0$xW{ zrjxB#+26ze-u|fdTCgd;G`yWZV3Dx{?kIQIt~ln8*jFF_SsaLinyW3?LL7>Nzy*uI z)enXFwX3@ZwTM@25gdv`pKt5zW$2oVK-D18T?9wrG5JpT|7m9n|9|RQ*cntikD_CC ze)l3clV5RdFaO5{BPpN>fu?={J&>tG=d%Unc76Wt7oJ!ZJF9#~Q9|IO_R977MS~!m%_C8qWQNM{9T6Y z<76^a$;M}-m{@d|&F^1Dx~10c`nX6@OE<8nc6#O4gMIf5>^-Is6mt{6Yxg|-dmj1- zUD<;VHVq;03JqCoZeRlL0Ci?^0lK-3cTX{V-naSPe+9g=TGnj#ZP|jnp*?o6x-8?q z_Sv$ztIN^!Eg9xD3Xbb!BamOwCO?mAq93m=E_`G|bcPL5t_Q6-o6egftSDzccQ0l75pnEi? zQ%Je8IYmR5B(91KDZgM`*#JGD@=Lt(ELs!ux2{1Bu}i?u$`{oH5SkI80r^e(4*S}J z_*y2p!n%6sa6@I%T!jVwkIahWKb@ipuk9(7;H7d(spcK|78Xb~?vQG>NzIvx&4TZW z7xXPD&Ly*%q1TM$uy8xF81Cv6{Uh&nW}3%$20g=HO^w7KNe zIMy%Y_$zGjB#%VE+t)a@61`-|nPYulfFUnLyK?ROXKc6*xc{&r@D(ni?G*@f4Pyu) z9Ti=Rj>I~Av$ICV=g9<*WfaFKf3q>I+i^@sE#EYuvq%v~s`q8MERXxXJ(dlt9rC*( zqh|rt81p_&za#n8<+n|$$7AUDxy80f#P?YW!yODu0S;NfMX(l%04djsco>Cmhd~(J zXjaMIG}MyJJD5sgwD|=VgVyq!DpQ8o;w8@=jdn`YRAPfrp~a@6`Sc DS&l%A literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_data.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..197dff41474f0a4f5792f51408470c2d77c0187e GIT binary patch literal 4127 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

9K-Mb%buaPwW$rs4U!Ql{@ndJ!dKIuU0 z2+8Mw1dzTC&{+#4YGw67H}Q!IA>oOPtQNK=I@A8Dcp6qljLSD@sS$wk9v+zSH)6(Z zHUPvP0Y6aPG{5aYWl3%i_u`gb6CR7X9Zdwe&H7UMjX0*Wfp#-#vyi~-@>}!PWmi=^ zli*Cg@Jw+=dGrQ;uqgd*%$a;md+)RjT0PBNatOl6d|xlpXoulkOxi?(GSWQ7y`HtUCNODURXm&EjtokVu#|UkVD7#Xb2s4V-y`A%tlft>gY3x~O65jU z%v^hOPp-4*#(jzVW=vc!oZY-p$&j{Qb+*IWbFeHLCCQjHYm~!T~e=jm=PsNGJOwNl5AbmOQ%!`RyS$)t=ZK6WRa3UkCg{_Isw7)8zhm{fI zWO15t%3B+l@wehQjd!~SK-wc%x6?$L?fLe0d2*I~fXvGZTiQ6g9W%W%G2q4!`ttn! zICkSYS(bOR92XBcj>W9nTQfYLwz(>1VOhkk+#XELpp^H$f!Xbh!t`c+0D!%S9jtbm z)8qt$zy=xuM@t zlC^OdAu2!Om1X%a`wEo;ni9|q-9$SmGlY9x^yyf@(E1~n<^E^5ks6)}z>9$v7oN>= zdI$dov+G{h{!9)gUm@FRgUiFNEK`9G2N^chJ5czvN2^tXqUV@Y|E?Akmo3-wJRwe^ z#L3uo|m8$X(-WX}r|+za+em z;v%o@)N~cw@YurF)bfAy{8(EmXyt$F1znvWSzDj%rl6~@=_IF&1$w*-<6uL(que1c zQ`cvbUWO3FVND#nYyo+EK2mPl^YB>8bS@~gS}5fO#TL#ztXN)1NXDEJ6yRcL@=s(I z^~;#HzGE|BXuI%INr{&>rr@;-c`cCcrSqb%%6q?RSWSlOP?%Q5Jc?#bYjkXatTD~M zL?B99>S#l#?-~**j3f+tp$r#QJ%o{qGehK#S2bU~s$HX_u392c#VR-KMPtG7mJMg& zDzD=h1dfLpIL2xcdm_6_}B}p9ycinkI3$84~1*; zv_?>Hxrdgx)$&?NL)iBED}1O; z_0my(;X{2=JC5)k)>Tda|NfTr(t%RGlrI;ffs9TXiOWa=O>jX05fnn#mL;;f1hYlR T>uETL;*$TNOZ1Xj!m##V&XH!^ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18953ab763f9471b622da4293c7370bdaf1bba97 GIT binary patch literal 14135 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 X)+rx77in>@3F@kn%je`AqUrwwgd_mb literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_alarm.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_alarm.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81082bfdacde57d6dbfcfa0a273ddc66f334e188 GIT binary patch literal 6730 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_data.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d9ec3e4beca046a1e73f171cc00fc8925e1dfc9 GIT binary patch literal 5816 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66d93f02328b0f8f008f8e75949c2c1c000b46bd GIT binary patch literal 3261 zcmbVOOK&5`5$E67KD^oNCYMf(*rAgp*D-P-WWkSJFZQA}tThl5Hpav0rZie| zhTGkgErL2}0bc{;4@gJdlRq=poctF8ETpYe^vEW)fDUN5ySQD zZzsdQtTFa?dboTAc=!mzZemhwz!X`x#X$IbZBSD+6^w&PeNgA@2~%~|c*Rsh z*Nq z-fN@tRAXh`gJhcZ-rYJsUP5Fx(YZ_LTscj4^=2>G>Pq>x%!`*vUq1fh!}lwY&!##D zVri#3l?U2b?C8rsbRT*XJ}samb$!?|Dn5E0h!=RGb8Ql*l^h=SB>}cTyqmeb*|3`y zlb-!9+1=H~BRpTHh0?n^??Np45usq)Kf;@=!^`k-?lO1yRHgLy<%?oRmmOi!3^8LA zuR*QF)a@VGh*Qj7wFZH%SMfULgNAPGH&v6OM^7qLtygRisz|Nj-coI~j(emw)D7I% z)J=5@_x2AgV1so;`K|KCBYlvi`g2o^vax=u=63tp^T&M(x|QiTu~uS%fEE%4U3fye zJuR2kO0xF+Ef_I1#jZ&v-OBxs3Pi+7tq^zGROy@~`79Za54+yS+iA_4UQM(nXVBf= z#^l&BJK+ny5T}BJ(f}^zzh40^AIL;bfMhI{9%VTKmgRD%3eI*%lyy6sYEy=BoaLE| z<4&y%tR9aBYv2(=61&5xE=8u!c-e|$k28+X*gpK zW$O0E*|0Y~1oiU|y6->if$93eG)Z58oe&(xL}cjAa9+E zY7+SnQ6cCX?Pdna^Zb8OKwIhR8}e{pqF!96JOjUB>lrsq;54Xd%c)JP5Yulky!nlA zetQ*arc(0E`9*6Q-f*gv;0%k;8FRezUl<=%to3-O31|#Y{oe*(wRhXB16D^==8}Ea z+1$hb-sY(FT3{)bG`xL(#Uf)z+)-|@eR0Ykv2Q;7S{#X^nyW3?LL7^uzy*uI)sKbw zwX3@ZmH$_45gdzSpHG|YW$2oVK-D18T?8lLDfvwJ|7m9n|9|XS*cntiPoh(HdG{i? zkY96cFaM_nBPpN>fu?>0J&>tG=d%UnZhijF7oJEJ6RVsB?~$D@(FaLhU-(|QtP9{T@ zY<)tCi9L7Oyt7KQrN-{&xJZ++-NK^U1=C@v+h znW2x2288GqKPnR^75LPK4b7=?aXmAW*qC6ar_Oo zcw$E);O%Q1T8UjT;=-Z6_QQx5qFuT4y$c4s3AF!6A>b7zqUkm0at%WW9UT>2i;P4% ze7mzjM(4={k7X3cD04IP^|)-uF&(pf(}cbvMeL}qm*KJu9{Sc-Hmr8Y<%)bh@>EaE zdo=xy@1TS{b=T)yvXffxrno6m5Q|_8&0qC;b2b literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6680dec31fec18a92a39e7d0798f2b4cdb0d0b61 GIT binary patch literal 6791 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_provision_configuration.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_provision_configuration.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab9d765771e38aa286371fc41d19c7cb13c9f4cc GIT binary patch literal 3754 zcmcImU2hx572R1b$>o}o<& zC;cxs9p_&(Sp9hzJVep=Q3xGSZUoCps~FE8-(12M^vG88hj2I>z46ryJTy-Vu4MJD8VBX0b$1n|skD z>AbhSxSnIlbSyIy(Y<^U4dqrR+HP}xn`ilpsLLOJa{t3p$fpyTL1L~aGUoeIY3%6o zkJ|SwgwJyv5}Ph?4DyGs3t|^Mk(pGHk%IRRx|{^oka(Dw(X`)=^KnOi9}S06SqT^Y zI2Up#vo@9mKSKS^PE7UcuY$ot6rG`x4$R_^NqUurBV18QSkFW2p{S+6GR z!WWHW=ZN)u>F+f}uo#IeqIvA}05R|PQVwl zAjd@ILluqNr6nHaFpl9;fC99sJaZgn(gt@nLEpRh4vo08hihnr-{TP<17gaB z93&Y?kz{RMm2Qi&YlB1u-QMKNQ4Wb$0e%d`2f>k;yRa~4+xfH6x6z))Kno5Jo{yCqC4o< zRpwwKyBy?Q-u;rPDj=h&qp@}`s|F2;8uw5%ak%Es{cA={_+O6sQ(>x1?Uyg?oG=71HN132aVS_OY5mv&i);p#5rWfIYA`Z zb5GeL=i3K=br0RcimA+*<^#U3GTnYfJso$;xO3`b?xUi9~$IpNk|muVE)&C1UQP=o_dEJXSEs*T8-36ccmu zUw5adn>?ib2ygXKq$6XL+Q5z$E7%X`^j-K{X*BMOX!}oeFfsmyGkdTO4!0 zrFt8k@+5oN<-*@t3V#a^EdX2tkjgC!=az*sK>lOFcsoB5ZhN4zJ>*%0!$YtgpM#>V zVeZc;nmE#AH(q(HwSiYF`JrfFy`nw3*f@JBL!zZF>O+Yf#;78|`-@B}Lc&vcX`=Do zjiZUWinHwfg-1Fqs^uwIt*3qaekxL0t7bz{R z?gkXpS&g}@`M<#1JR8;A=6{1)z}}*l@2c1&)di)8p?raYE!HUl*JI5!6<=<>0Bosv z`+fn~bGKQl{_c`JmjSW4CxI#DB-+10;!K8NN)ppm!P?T&wierIT_xpY(HO%b2t$O| zDH5!(XoewOeKu2v0`nMlr%>A4Aa70jQzJw2d4g8>XCe8(<^x4dOM@6v65KM0;+VQi z)dy4&5mzdkNf3g!QEU?IJ05dA&-Y$=Rqs{cxpnw+BVc~u|JKLnW_=M!I&{=+RE4Xg ix=x*1NeH`QU4=MaBHgAiY12f{#mUS^T=_qhLG~yB literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_transport_configuration.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_profile_transport_configuration.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe6f7d4c771be50aa682c5a0de43d097751c60d8 GIT binary patch literal 2865 zcmb7GTW=dh6yBRJ**Kw~s-p0~P*96oYPS@G6s1v1Zvv#WYKw#{(005twzpmHZf3@5 zV>wUhGru8u%sc#cq~D42aaTX(!=Y5x!$UgGg&fMP1Gex5((kOt zG|xXCUan#2?=VRRWpSt^J%7PToL+!|LJ0r4)2oX>)UY;0T{N&ZMN=$bT@ayI#2Sj0 zSi-s}mQlEO%1>^}%_NrhR6a;j`B3pp7r8QsbdU@uhy@9l>h-%1Z>>;mHH%ZOH3NaV zgB%7h#w8A_C7>_JtI^|sqv5{ZsgGEOpXa<%W4 zftKlD-%&M~`}3FX4;pCbW=WiP!IKPfHI!GnGTYSii0r0Gzguhp(b<*G$tUo_o{z`RY&JwzusYf9A}*9dA1@!7MPf z9Z#JxHB+bd@Z6aNJKl~vb7$VFv(Yq-Ss;9HbY{VBbI&>YpClLX|8=tf$)J+l4fmXR z=~-~Zzi3*P|Hqj_T=1p|Z))4n1D+ae-JKBhG^sH`yB1L4AMlK(jW6eEkc*IUj~%ZvQ}vUx1RKEM^Kcs zc3sisRMv5FCaEa{tJ96j+9ppYvh<(Gtyle}ntX<#X$riPUg(By;MQHwZT%ev%Li|D zuk}}058V^=?oBWJkJ`Le1oF|Io@Ef#$=UVxoIS#&JMGNl5?3JZNZfV>LOQyZ^1*+g zZTn@tD8OaPMuAQ<=BBC?;q;YY%R1l!mDV^VY}uQhKV~Eldo2)BVRbb@-~c#u01(3a zbbmjxPCa5g6QHY?wyQoSx8CF%+7yKuMR&kq&p`9oZK@KC$)CfAXfk8{`v3&c?iw6b z-Jq+0n$^sG>^-4x5^t^$)dz(@) zm7jDeyuss4M$vuRqS77@BvC{{>+KdLCgWqglwlO1wN7wBMP)0B$n3#R1If!{)cidd z=q=GnP5KifBRcO5vP>tlg3B4AsAH*fG|??PH&LUp1tCqgD>t3M^@5-g_)WhVG(W@$ vT8+aNae??h!c=-nsuM)it4dprInCA(sYipZ!dRpJXTK@}uNgMoCK|@SK=AUv literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_search_query.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_search_query.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6b415305cc8d2f1d09f3ef62852dee79f778f99 GIT binary patch literal 4767 zcmb_f&u<&Y72aJg$>oZat=Mra=ZB{akd$dn+I5Q-gd)U^9iu@(rZ>Wv@Nu>|1~|{oX7|QKBTbZYk~T{CM;BdvCsZ z^CqcOd<(xvUmUiJS1jwF)R_LcXuO9<-A2K!mc?!EbnKRG-cHLg?_4YQ(Be7n9$4HJ z?tZS7=gx{%&4>4G%kmk1s~d55UHv2pC1;NxtgNzoAN|xfBOfG^#a*RkKhkm1Rcs^q zl<9#d;kPD#3PQ6>GK>vJENL-hF#R>t3T?*X9dt`a&&E>O6^5 z9pgfZZX{4s`c~MB>u)cQKhGf2-xggR(sx-eTo+6AaJk0Vo2;8W2^;Le4{zVeKtAe; zE)X--6A{}HQej4eeZO|wnDBlAC6R8xj`;(#n-A?$Cnp{GW3z zmlt@Ed#0Y}H@VN}4(wJz6nU9f4y=8<-@tpGzsg_3`x1Yhzk&BoVM~Wovdn!7^$l zILJbiGM(FDw;y&oyEU^ggHk6}`qyCJ$F0T3qGPC_GE^Uh&?Ph$JIz6$noG;vfDZI- zPpH)I9Sc><&`0|+#!0=x-oRn$`5m<_2w{#R)O0qm=8xggW8Ov*)0~bZFsK3xLAw3U}fB8 zD;Wcu)nZx+PS`mYOc^>Kj19>wt?*byGTx56p-!YETa3Z7fLhf}T_rker@Eh7at@+Pmq5a5eC2;Kn{bqz(qDcJPqO&;HNzZu+^ zabRscH9~Zo{HRV3E#ot?erRo4SORwsgs!|kfNTK@@ zk!SUVm600yH6*dP!6y8leB`Mui-3<8oegHGvZ72)THznzc}A2ic!M`);ZIu`k=Xc0 z^)b_*k#fW2F;oA#@?W~i&-S^o#!&QxfB!E|I?qQn&ebSUK!|HM5ATOMz1NCiD{|p^ygdUSA{2i6p z+OxHFhXV2NoX=DLIXW!X#wL5fme&3Pb)_IM*fIA1)(A{_TZNy$@ z$$H}H;?U(eNYsYzp?5?vIqRpHCG_9ZCCqfQnTP(7H9dRiPUPow*~tHDXpt1qctDfi zgC5A_@vTQg%1QErw;r2gEISjkOa!T0Pe>gLq;BR6+Gs+);M6f4SXeh z&pyJykd9lYnHF^t(EO)PTHFX#sI`=Iz*p_m{_K>uQ*WsgZnt^3{5w)ir_(iS@ZDKD zj&#*?YW!JRg1n?TDy@uClmn!>?XV}WLznq}>XHZ3e5M7`s^2yVv?Lc*3nrSS1!P|Rj!s>p(+<-7PT1*- zG`A&oPvfN(*ukT|gTi&LI=+qk3b~eJm;dFv^P^V5DSz!3eETxBox$R{D>378I)%;7 zpc6IQ6^G7|bwr%A2eoO=VMF3Nii>3r225^%CLt49YK&~Z(Ca};r^O!f((O=Z>vBdc zOA8~hqzM%9)zh@KTy zDXS%;g5Zy1ES__A2Ahe^#8uj2#)(8P@YdGYVyZ}&2?{bpd(+vXtGzR|iDh4~c#X9a zy}^?9rihU3hEgzG+r!QW)tvkm!6iEhAMq*(o@S|2n#Uv|PjMwJ1c7)G1b@O5LvP=4 z?edvU%>-x6m^jsBnJ{C^DQ9kdXTpQ?V4F)LLC;X#A@C=YJHpo$L2yX;=u`eV*hr|F zYc`wJ1v0&h`(zNLeh?t&^*dBA2e^`iozX}U?nxr7;Y}!QRcKem?Y&I8FjHHGib;!%RRQ!O7V-t?EGr~^Em1>~yEZ25i$8)eF3tv0M?Clqv z3U*@2w;liF+w;9wJ=b%~#c@pdF@5KIC{jlX`8rh!86k|sSr8C^GhZxIz*DqbfZ%(! HhY0a+s^Y;} literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_transport_configuration.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/device_transport_configuration.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4f6a2ac7a2d57945d7090d32870961a61f6b16b GIT binary patch literal 2794 zcma)8TW=dh6yBRJ**c}5s%im=p)D;2)lR7Z5v5T}ZvvzgH9pw=?6k zv7Dz={EpTy5w7r3x98f`>v?wdd;Tp)_#$}hh(HEAey=9Hb*Ek9*Ima68J>+%k`49O zIah++xv{>%u73YbXm@VriY1vgY7(0y&omq551GjspO{gulBr}$KA1>tG%HfcwPc%# zP7GV&Y^3Di^7)Z5#d5c6tc5;V=p=bpeBML%5bhNovA)R<%Z&!E^=iM;vgAL5CkHh>b2V&H2InORI&c^U2WkL>;3`I#Ywq6xrt?l*}MWSPsjFXI;Ts?8iK+AOS#8EZa z`SX|V4;uCFW=WiP!IKPfHI$dSGTYSi80@A=zguhp!`Y?I#icGFD=!p0z7Lpzu^$m4 zqc}|fz^-*i?=KPHDs1*6bCCWhp3i@$*eaV*1mh-(&cdrdC>NnO{pfXpcMc?;$z&ap zG;Ah+1(7)0u5ose&wJjUd)@i@@=xBjx9uB$=FGeuZ#yu-EHJelPn|Y3Q>PB_*qH@8 z-i|wSXWokQplKSjK=|P3%!1wKo^$v=NiN|3t7ZX`K_$5x?m6?)v*3{bh-q2=A7>76 z!J8($scl0Kcxte9dqy>{P0!ttW}?tO2tQSMfw4j=lSp6_KPHmcJQF*i$j4a6&?hh% zX9f(xzXjNH_pmX;XnSjA!{iakKk>@Oh-+?)QVWo1yQTZcBBPopm1T1!<>S8KtJF0$ z)#ijV{o=K?*;n6LN%NSedKE;a!diK?*XN+T^7@n`P#yI)BJfYyI8NCZ2I#~#ieT+2 z1#A^6OVPnW00E#mel7;Jh`lc{G)2^MPy7?O?Zwj9$)j=s{EB3BxwwD4BePXVT{eai z-PEWuM2kjG=V-lUkS5xc{+Ji)2y|KdWkAU+Yn2vo>q*}pdPUi4*A-nnWgTZ^lA1EG zI^C$OZSr&?OaH#ydfs0u#>W_%rocPyg>L8uZr%0V*56@pbpNgHwf+k0p?i$pz3JKi zQoz`8?NhwmrpHoj}UxyyJaKvyqq zSA9tSyv!-IB8o4HZh^zXz4_)=R7u3-$iYK2>9>x(3j)A)4UVI3P-CZtG;{BH_vzEZ zn>+AoB3UwE{oIUL-oGbfd@67y89p0$db91T)~E14G}I!ra4HndRpzSpXf{mCIvUKN486e)_zL2C6caW#`sbceR6 zm~X&C6cP7YyG5zU_!uu`7)5B9la%OI6p_9Cod(jC$0+YR(A-<3W0>?OMn-g)8)TA> zU4@L(L{U3Z=V_wLa&Dq7VoN}pY_DxPf$If9Bk-GkGibht5wscy=l@gU{{U0zDXEST hQLk!iIp#E5L!=&Uw+dsGnw$M92)t(4bere~{{mKA)w2Kq literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0f6b82b19ae053b147938c460ee27f708c6b7a0 GIT binary patch literal 10010 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_event.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_event.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1b1001d69c4b49928943a617e2d934919cc1b23 GIT binary patch literal 8461 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 YI8orc!xg^-yd;lQ0-~ffS%a7PKQ@u$R{#J2 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_event_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_event_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82ab4bde1209605811d0cdc508489d48762a778b GIT binary patch literal 3201 zcmbVOTW=$`6(*^XG#bm!-nz)PFKmNclwze#gT4rkk;^)Zeeo9Y255x_lhKfp$1BZf zNy>>;`N<2UKf`|Xd;4eRwNLpA1$y}oM|QRL1}!=eIUMou@H^*x=a9wbX2kG3`|H`z zZZP&Y`dEJge0+*#x6vs!V2Ud-;REj9Vj%pxHmIqZ3MRp{KB#l{gsHk}yke@M>!-Cr zLy3LXX(o?3W0A!3{2)MZ6(^ox6ngm9u25w|mJ>SIT!}Uc5~Da`(57KB_=Io9P^grJd-a(LXA1lR)cICBT{VK*(NJ^NiU z9&6(fUXIg3>9Nkc5Q~09DA?YQ@FwfT0SD0cMN5jxEfGe+?m)LKm4 z`GJi%#q3pU5a@apuTwr~=*D4FH7R=Zr9#zu#Rj2@)CS%y)mEE$M`}yGh4+TKrEcTh z{(%K-u!$(&EjM=6SnnRel~2{e?mc_H+oynAnNAXGB?bs)Az{pw7o04JWli%xO`jbDHGyWHLGKdjIaFHE(v+(U=@TZ+i!wW2fwlFZoiO z3l2I1v{-zw23kIpiJSt(L@GVXas(>N<$e{Ey^bjBc0SXl4C6S}BfC!7-Xt6LX2+m> z{&DxCM?ElHKb$4$3$PM`!j~pSLP_5@+RY6T z<@x`-n3mDgH{{X2L|wR2cL5&5z6)-ez-LgqR$ZG$A-Z?byvdDlv9%5{Qz?1k@}V&` zZ!A?qaD&B{%=pv(e=#_!nCWrO5>OSM`M-?3Y2%*R1e}hjOeCA$WM>cmdpo1nYeA&A zQS)~F1%r&8a7Wx{hvJ++X5W1BM{y!fYOc0qOK~br0v9X;S3eczSFY|FRN7y$WpFA^ zeZFk7m!WGe166}WcNv_8=j1El|EHBL{QsG2VP#OQJd4iR`s!tHCBNa?UjFw>Mp8f% z0!{q{dLUDW&Sy)?&HCcKuRL)o)>V0lqJRu^nMN_ePpT|+uh~xIt)cCs+56}mD6BZ} zwXh#Q$HbBdE%wT$D`HxIA87jJ+hNo`XK*5?%Tp4(sJTB`;$z-m} z+6#Sr9WQC^quCG81>&BFc*FzV;DWdR83kLbuZC#j)L394A407_~w=&5U#??oM8!CI|O&D-q zkvVbvhf5UUjkBNVE=V)w^h(906?f1|u1vF#<7r|C20;Eza;$am2A`HUdR90Uw2Of$xzgPP=6)O&_ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a994a00cd52ad0bbee432fc29b6e134f43d8453 GIT binary patch literal 3125 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_search_query.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/edge_search_query.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13ecace366da744c8d560e4dbf15a92a0d7ccf53 GIT binary patch literal 4699 zcmbtX&u<&Y72aJg$>oZa?bwkmr*5VVkd#48+I5Q-gd)U^9iv4-r zdGjWzRD27+r++_b|ML~g`WH2(e=ZvD;ZgTcaI0l;n>!u5Wt+Fta?Cr|%001oj=RSe zcZGYDYvsAKW>xdyBipikhTr;D+}%_^NxG+Qr5>)<7<+?tlfAIP9)JJd{S4&O zp6CKGQ#}!}eIXTQG}w1*_lybeCr}dU2JF~K-a8M(2s{y8Aww-VYacWi0aie~8SAZn zyA~z8b@fTOxhbSUII2ep7n`D6gP8vr+;24_DyM(r<@pPGg@t9YXh~YRlEocb5T5^I zuI2IqFLKY+^Za%0^Mzx(RS-p9=9OdX$ZmPU+b;3NajVF$@T+FT7d}R=jax&FZ0`YFY?#;H}Jl~@9=NpeU+C$43=Jb%s0iF2xYYO zv%ZiA1J!)G{Q2wg&BsnZ+;s=3q`fE?(9 zo=~aZn+#Xv*-SImDv{VaNy$7`rBxmcQ(rTpB^&*y?%;VJkNOD;ZV#;>E3v~+$6}() z4bke`^7@ck?hw6b-5xq<<%c=bdSjSFtHA9w%!iAe!8R*UIEFlFIFFlFLmFft;uvBF~&$#^&JhB}dw>@dd40%}z^b(QFB%yd7u-O^I7;f!5N{-MQ#`1P?!KDd#Pv?xuJ;ZQ1iBAu_wUuQ=f&M#80}!6La+@; zN(WIV#tyC7lT_f zuB(kEMu=zQAJyrh<$FPv53OwruD1t&ej*UAh;|c?vSb52AoZ;7*?429Nink_h3-ql znf0%vh*Z$8A&IjMHs<>H1J7+)1Z=$M6fnz^6=iDDs{R1a3!-Sj8{D1+KCvw#kC|*jB zNwhc@W&dCNQ+s4OV0s`}s5nD$0fz6yIsQG)EBB?0yAQ2zxI&jbC! zwsUGfvOaqE*Uq7HnA14Zht836=xTT9>im%-zpe8cr#yF#t)YA59NCDj&Wg3?>Eh7k zIY`uo?umCwQ8(+SnI-f;)FsSxvzaIUsWm-&=#J$VblJ%Na%hnh(0D+TKZG90Cmp)sr~7Uw^MJW6YjQoxcVDXOy|#%HK@)K@l0cFrISQq zN3Eig%`%GT1APW|gG8vq}(u**@;8dY1?AbMFOr5u$^3WDE{ zka*5z`Di9|A(qnCG7cnSfw8v6)>1{f5>Rj%+S|?!UCo`T%`5wY#T%@h=q;ACw?%~9 zHI&F*_i$JGpqi84BCup7p(92G!SgIVO7oZ`IVS=UB5&1a)7Hv*f|?1!Zk^R)q5Q(TNT<%al5ZYKs&O6zSKJljt3^SP76wC z?C{CODI=$0Mji6<0Tth)Vq(A~10&>=La7D{&vI?Ybvy_Au<*H4%-(*%sbK$=eB1HQ zzdhf3&2v4sTpUG$AJTW;L6JIA$U9UiWMnWBmq9?x&3v&+VNTIv0fO(@9^%4(0mbp8 Awg3PC literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_count_query.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_count_query.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f22fc2edc02ee676319b70c0d62571f330a772fc GIT binary patch literal 4089 zcmb_f&u<&Y72X{#$>oZa<-~QYxGe@Pkd!V&I!W7upa@R=3q=9Bi5#F{6Ks|{BWWda zmzo*cAxohL2|e{s=)pP~D9{#Y|Czn^l(TOEn)G|KB12J9fTmq==f}>QneV;%-kZm) z(FhzoPyYF$TV8RTe^F=t@zA-4SKmb;oQ@-0!Fq1TwKeN7TbDYe$Brlo@5B+F^o~oN zvS8azvm8Be9Vg&;p6(^-uKr~fDZxK_xc!uW@S9%+cH~i}c#>+PhOtSqRP(*;IX4-P zhGs8Q$yjnF4~J44%?CXhX~~}@Ix&1B;(JQ&y#Mx|F@yDX+t?ktv_mV&+9Hc}8{<;R zG?r*-vlb1K_S>7&?Kwn-eVLkw_T__US8lYU%@*fB=4o~qt@DRJzxz%B^2tD^K+N?( z#{8L78Z*}UyRExch5H#6iOo9n*vaml2Vw;t%T%h!NWr_Kbxwda5bq{tZ`f_cS--8H zN4vXHS%lMeoC&!r(-y>nFJOLWE2eV(DWP)@ul^GX>EKu#I+9MQ<_Jay@@LlZL|Ig9 zt1R9WzNnqJorcv;&#BA|+Vx>?FSEqgoPe0k|89|K>G+aGK2 zyPYO+*2cVKCsVufy|zrB>3JV(_mXaVFoKV!@3r2!+lEWZwLuggz>Of-4awuexR(H4 z+bW>Xsu1pYhB+p3gz#=PY7IuYABNb_gyBzsL?a$K6;^R8u5aJK^}ZgjE*hvcof9L} z%pPjfODFQGf@0$AJFu`j{`+HzNJ4ZuXE&bh;3N2WVg1E$U};4mZCyz-R0so4zw=_W z3_a`0j0O?`$5OH2*leGdt|~(VR8>^=l!~H8T{_Zt@xCGgR{Ze~FDP(M&zQuf54ESf zeMJ|6W#^QOf8G8sEfo}QX%!ko@YC}q{=XRNTkN!@>QJG{3Nu-%6QdVwwSiC8RzdAb z#;7G)$Q}P}#+5mr`d^vyU6!&Wnd8Yq6q~0CkzF-rdRq%vqLAA^rtixr#^1j{lQ~>h zl0;p@T!g8=%&0Lp>uSSXB*xsdf);Zhu3l%s6=zl{NO6@>w$ycty5I$wVbO=^+lTa> zLe4o>kTvP0IHLc7B5{sfR41M&L83MBUihcvb;Wm@S;O}aObs)=V&;qB)R~_>@n-T% zrf%hbJ8?(~Xnde4A7LHHl(E;73EeB@@mn9+SXBhR;yS@yI*`gF5_d3uTqLnMr#r<@ z@}h0h{U!>7C@Ngwt6@L)6ay2Ascb8+nk=OGFIisQi*#g+Qm> zOzzn=-7qgdi+V$um*78(c!K>*u_1Fy-xVS=bl`^;fRp2e3^(w6X@1PR6E7WJ> zTUQ;#1&fo{SihivQuxFRcIuoG&rbH!gz>nG2|=_noH52p&7cW8l3-|3f~r2tMOc zD$p)EO;_E4=w&gL5*E@a41Yg`;mf4DsCPC}g>AAJ=XV=Rb{gbQNq1;u zNM1>b J_^yvo@E_bJ7oh+E literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_data.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfe57eedab7ee9c15595cbeac2d7eb65db8ae55b GIT binary patch literal 4571 zcmbtY%WoUU8Q)zl$>oZYEx%$pj}Dq54%3=+ViW}gMTi?ahKqtOA~h)32Ad^kB&|ep zshOb?5mYa7|A3!*n0Q&j@G@^T1}f1nsh=nifcS>sT#(G6y26U zP3b#fFRI;MA0N*!rQZ=<9n!h17jBESTDV?i>~+?S_rq28@aK2mPC-8Di7pT`)e|jt zAf&>IRrXHxt|8(57@M^8D(KjX-#ZJ$On4-^LWWv!);wHg1Xuy_cBFUu&1x&|)YPZp z_O_4);ke$4x!4xnDyI2gg8f##MfvoXiRWMF6&A!|kw_Z3lEobo2+#j5*Km1(7rAHZ zdHy5r^M$8&qacdB%om?p$9BUL-foF6WvwE=#4no>U-%eV&RRu&g<{prbgTZWx#Dy#=F!>4?kdaVes~LXGB?(IAk=0vN9e-4Jklsg9ze2|Cp%tV#Obm5M6M1fkR^OIa zhtzV1=tb++&_OFd%$e5f!yH-#Zf{^ccwXR+% zCVns>r5KE8SqP?xS>%yw$*2=`Lmf+*1KJ5$6*qB}Xm8DQKeHtHm;b5SZ^05(>qf1( zh8?1^upF2Y!efk0hw{oYDWNDGvugI z5x~Yr6maNNwRf0!L4cEV5WGd)y@9OY6m0r=S@Lc7o59rypQ__EEjX_1qdFxL)AItd zp|xv)#rELyM*@C{lq_Q(i?`4L4W8O{)}3>W;;g)*0mw2?jdXD02`Kz_KW zUwFL{@|2t>&S+B0eATq@i$vz5k2{wUsL~OWP{}?!Ka`ul)7BT0=SjGXR^MS zig`h&b5ki_yl%!&GU`(iPe`8B=83P%s|IK)cjI|y>Rn;9lAPy?8qPMyv7yGou}5&J$8<5cu8l?+V^yE=<*z9REO?~cS_zf z?WdI`^xxMdtaQ_rC;q85y?W?o^A~j4%>UicqFF%W0Zsl0`(REUXFVCx^`9TS@u9g} z((5U``w=Jggw%*lScpFp@672xdCCo=46nmk<9-<5t*K>!_p)%$^rx zd?UlSf{+(Dmw`98Vo5;gkqe-q4_T)?0%bcIM z#JVJ(?t-!x&WB;HgC#&;zJgggDVPF%C69VGb!3QCjQo;aMvORPUYQg0%2ookM7 zBe+4JI_Px?G*j%%0CvN4@8hd*PZ3HE@0&nc&j zd@B?AMR?8gi!i5f=${AY0PBh%I3Zwkls^lKMk~2`yL!LZhQbjbXP{n-t4rTW! zo5T;3IEp~i-Jw>Id6sKCuH!i{x58IWF)jUqvj{UQ`L^SqEj{0R*>gR&TpSxbMdR|P j$Pz~i`3hAEsS21G=Rts1O?k0S-b@iRK=3`=gZY08xol?F literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_data_page_link.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_data_page_link.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f199db74b552987246919c5833439f3492b108ee GIT binary patch literal 6167 zcmb_gOK%&=5uOE5SpKDvTchkGh+RMNu{lFrDpf$W%Kd?YR88kVyCscG za_F9>*CMDxBHwbzH3@>i3ic4676J0O`s^?jN32uPqzKKd3SK*l66q8(l`hjf%ldZq?0-slQgm(%)1ib;sZ- zZa+1+E$qEiCC#lhqmcG*nug&rJP)>l=4SNW(3hOuzqR&&eSGgzSC8BdB@3F7lI@xb z!e+#_!q1rsncr4hp$s~LN%5#HA{DV#UHFk;kAo;sY}IF5Qfz#5VN0pjN~xsu3{{$; z7=$Gr)}j)|g%r)2KrK?2{8mu9aJ@f014+9fn#!knSk+E~E89wq?*sTvQ zUrCg_+Y(J^%%Ya4vByG2;8lz^hv&G<7j!$#Kj4de>8V-Ch%7(E4?i{b%!(tN?HoTcXl40P zeoT+J!o|q(K`YDO;wSXTf>^-F$w4d2Pw{0vk{5Z5oF25Y{0u*31j-H#%M3Lq3RxNzWmrnUs@`InJ@`=h{MONN`$ZxoXSzZn7piU|&+5mO?w z;WyiUy}nb_s~V?*rixR5ZspierL|D1yOIkT+to0v7t(Q#pyfq?a%@vIUQptR@*?5O z+E(mFVDLiCk>xv0zY)|b4$-ZFLuRqE6_*&+G<_vU^m+nGd$(L85cD6aTX;Xg8{J01 z&931kCH5@pfCtKyE^S?=yVR5ES}3#K6iTOSqs(>FC|z#C=~kySw6O1Vc8U3{0Wa1W z7aKtn@D7@6ErD{mun@c6(DJmd$9Zqm_62Xmc*pBozsQ5ACWA)M^i?P&8KwOo9jfK1 zAkzz(*p5VfV^%rD42U1Qt8GMSw(?g#`*LhQixEZjf` zw!;+ZUyf%&!}9ffeXXa2<0NJk%BmFoO@?Le+_lfa;D zYWav1Ll1uqUYc}LxpU>y=3~DeaE7ui7(mO`2Zpa-WQ}&Dbd;(Jwq6dKV!dF+?hlCg zmXz2yUSz0BXoI&p(rR8uBG@8n)-jnUAKSO=}abDR-_;LDz8Bx!@wF z_Q9pkdt>0DzMqnBUkhCO190_DmRjpfs07BYsf=gHhPJJJ^QQ6HM?bQ5t=*JDPSmybtX*5#U0bF1Ecu>Fs|?+J zJTcBS&SsHcx?~*tMTI`#6F2`iV1#{*P4-oOZ(b%-uIexsiAE=@(R9 z)Bmt*5EZm>piO!gazK;DTz9*4j!k#Y-`7X=CqL4yx6Z+*apSh2LE+rIJInJukBmU=BoZa#xUnwc+Y+W#8^U0XEV`sJQH>%vf z{wESlXYmt8=i(H|_JkH!>tW5WN7qqF7`5!#x}Jx~MAv0H(_8Wg^iC~n?U%LY8@PGW zy4&TiC`Zx)rLLVp6KdN?>l$O4%XcvLXS@+XB5$7fpKTTvk=zGQ;vDED@kH@r@AAN- zqgWJYHwA8wl#E?mN#PF5$5m5o*MkVx0u8?<&q9`-Keow*aXOI#>Zo1SR|=ARRLJNv zdYnOi*{-YD)-p{mPV19@oO&pB#`UEo_!4jQ0SenXZn>sw+Q=#`Gyh-LUh1_nR{lS3 z#x)O9+v-e<9=)ZQ@HyT6>AgY0IN2A^tbJpjP-k|Eqo~8F0@r)EsB6Ij(Z5mCd8bHj z2nwk<(`tcA#n~1znTD^Dg_#oZ;tW)R$iI+zT8DM!H#zD_1L^2hkWLG}l)IBvp7&Q!Xk{F0MxLI~O$1@uW?CIuF+kT;*k)0d zl28gXU31%dNSCG7$VQe(_ks;p4b>J4tJ|W6oZgp$;Ud(p-!7!&`=l=!N(vIRJnwmu z=*4L;2{{IrIOBQZk>~vlEE?giWt;iwZcQjB>=?L}A}Ru+`OwNIj{VjE3bXXqS81es zqSl9`{mZ}Tq+nBc-rq?$>W{|6?)94-I= literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_data_query.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_data_query.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecfb2dae46466e386cb2c923869fb31e6095cea3 GIT binary patch literal 6086 zcmb_gOOG4J5uOA(_^|Yk5EW0B+k{Lv#6y>>)1j*I|fdWd=Dn`IW7!BFIyQAfD zsGg>55)=?%b;>=r0MVWT8E_I9@xebJha7UtX|4eR`0QJP#QCacIef1kF?Xk@s~}mbYWyAOf5u-mF#AQ6uSrpu;8QkPn)2x~LZPhIO&eSqD44&ck z6NB5r-pQEgB;`pbd1j3@dh3SnSb3|f*} zreJW376fIM=YE^5**wo3Uf?cY&~%o+%NP056SI~RdA^VDe`0K#HAgrP3j9Dy<@rH= zNcXtHMbF`s%JbLw5#6&O7SMAvrSkk3U)DWEQAE${DV68P`5U@tQ7oe8#DL;&^0%HC zwI$B@H}KxaPx80%-p}9R-^BX>KgCbueUKLcs#3h~T1y40d(~I|Pdh?(dr|e)-D@j^ zv4}OAeiSiOfS-`TeyQP^+7N8lxQvWD=mh}VGF+GbRykSit04fOnBagJO-guf`K^xM zYh;mbO@70P){d&+;Lhg2>Bcbor4i2Th4XFJjXl<6V@uJYWcx!=Z z@@Rx4Ch@|i=%S12=xYK&k@6n-O}Il`Ai#P}u&EUjCf7BOAw|<_E?6WYM73hV;RDT} z<`4rCquL-G4SrO&@Vt*Fk|?;@H@u{T+oKMIq0H#g)@8Pjo{lM(`_z-`V+1JHw?O6l z7zyfhKLg6?V+N>l-v(9aXEpVMeioF=%~gB{Yi#wtJ+ziyV|Ir5YzvFlWL&HTEx1z9 zVylVUR7(r-k~eP25n7wF=#AQP$s0GO>kX~B$b+aMgRP+Dt5C`eOdu%^$}AOR9+^i` z%Efjhnrm|hJTv4H#{H{X`B{YZtF(efSOM2yEtKoxd_}Y#MWa!x(hTaAb{A2vb-sM= zYz0A1oN4=wO)L`z);)@0UZWX6(TX-jwEOZ9;C8j=a0(CMQg+MjZtQp-zNb8|3_+rk zC~{WL9Q-+`jX$nwf7LrSVfylbNdv(={ZXABg2|U;l)mx6z|xt$Pj3jsYVw=06=C5T z8sV6e>?h-`b}!m9R-{lJi8y=rRe2E?`mIRSZHpB);j-zMo|)2t3V1EzrI#%!_7O=4 zxPs?Pa*LePJ29!jn4S$9HTY4T9&IJsYPEw5K>nxIm$Q_cgeR?0+ef?_xA50tsJ-n} zl?S0i$x6(mJ%b=VVXK>H(zbF7b0H%S5F@kq$7!&TyMA3@c^O_BDI;J>Rym2Cqev-` z#)ne1wE;9vC`f!j?T1n9ff5pGE=uHUn2Z4U$uu_hRAvus(7Xw3?8$1vAyc~~*qCXS zsywR2PJp4Kv|?A2$aZ>b+4^kaN#O1??J} z)TvQ%d@^>7NcCJye4JupWY%1(Oe11sR)U9-hPiC^MuU#1H>WL9mB*m-AX4a^a{>_5 z)*-vR5Fmz|%Gk#JqEe3p&e2Wfm3YkrMY60g#26?RNWWR3f;P-wQRnPXF(%h@VKLlB z#^%kn%``B^<|WV=YnsdI1;8=GGF6FOGX;k}QB8n@+I~&;c_DCol17X46!)SM&jH3u z^O*$2(9Lh}p0Y=SMUhmSg$p`Z{)Rd=E|!N}^dY#MiuGJf{5}m8>72PHnZ`ppC&5BW z&SkMT4u)#no-{^Pz7BNel6IO|K>HO{z)WP;H1nyuV~oy5Rx=pCpo)6@&-(_Af;0}K$vy@jjLG6#xB8Up zWP7LX=yPszW=?V(E!vt8 zTfT+9&+$ZrhoX7pE88qB#+fMiC@x^Uq&di-ce8(wPBKxPUl+LhQ8IRMp@bVK9~VWj zO*>kg+49@+1bFH1$2Qq7&L&(iI_lK*oq!|*m2&#j6X%ehb($)+HBZxvvpQ3cGuUM( z4VKwoH zr`C?KLwGZLGrz@APl%E!&tvGUKuVb} zspNTo9Z2F>vohOc&{Q}j*U|>0=mgg?6d|e<$haQ|?U3Xh65Qwx3dgWb%eEW~K1qMMe_MrN z-F2)(@X3N}TJGL&$90Z7wqqCbgJ^M)zJCryY)K(cQYDuFMvs^!8sc(dtxFUNBU(_1 K<~pW>*zrG~oE5MD literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_data_sort_order.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_data_sort_order.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79dc1924460fa45195db93ddf239020ab2ee1625 GIT binary patch literal 4155 zcmb_f&2JmW72h2$$>o|-l-RK&J1qtYkeF#j%1J)}K@sd)vJnK8ipc!{(PF*ijHs2# zU20}1M+{YU{)(6!fMOK=x-TC;v_kQoaVLCGt zICwVxb=p=@@QbT zQxy*-S8{hCwb8uam64WwFV?Z)%MssJa_i&ww~gs9H5$gA(4rISaoP}RTQ~4sDw(t; zdfF^R{kZY|%J_JWDTAI&Oho7Me$_y2S>UQ_*R{2>08p|poR?^ZfD?F3?ifFEisMg!0((yxmhVl?a{|uFIM^2d6@BsAL2<^aCb0ZoR zMo>OR^CO0lC)`cUg)-Q1af&kd0*`nP(sj9zTX6z*#0lTbnXq0fWJEvbZsPYJ8fWHyp^hs{HP(5J$=??8r`_n z=k_Jwv*SR&?(iRv zCE^1yV4^afZs7&!HEsKgK5mIZacW6PGf?pDC;#tWv$5(oJvyVqPruwS^! zM`JCNR}_V<@jgW7YvNqVAO2t(@`-$Hnl*lisl;E))DO_1xZGg};OB_#fu9EP`Pik= z2|INEOg*qycoe0F$D7|xdqM7eR?2<^Z+xZo??Z8y^_CSLY(8vyt81GNhd=)$*^9cd z;HU?ZgU|fwL@7`C-7gjoYCq<^fi}D)d77YX@h|Qjtiwry-_V*hrBaoZu(B5!YmizY zHweXn<}5--`do_89-yaLX&LkMEGpmkU4}p3^ZkGN7s%swjY*p(pX{m-LDRAKscqPT)C5OQPr`fD*?o?Z!dzZxh;m zn;e%3hZQ;1zHR9RPoJnDC)s5UtgAPGv&M2lkj&Hc@LRmsBw0{7XLRyzD%KDGiB9Ys zxW<9!IXmpcU3LEO@$cc42L)3YIU{z+4m{(HJX1Vm>K#)wCGy)NXXG8iOUYZ8on7CQ zN1iBPMt$TR`zNHt{5`F#;Qa$r!AdV*c^sTLXIGEB$^2`kYUlrMFb}DDjzZ$?OJ!n-gpGf=eA}Fpogy>Ep-mKh6O}=H7B28raGraD z4%DRVO4)>a5(6xRM%`1-R$pVjSWA znt9z=o2<}_`sz*WWzWw%(qUH2cfo8uXxR&pA|=&Imcm&HnS0PRnP>NO!>nlIn!WB^ z#7j14p=iq19=pK;7bzO4nz_}Nfj4_PDzWN+f>Pkl(U=YI{101PQaXiL>m3wDa?dzs zC(a4+&K=gz@(!63KN@iT??VJRzNg!?F7t~MLVBs+$1IbT`={}oWSADevJ&WlEf4VB zvS^kKZ(o5N(=Gugom$|Ox?_gHG(@NM+8jxrL_Lgg z2@etf23_h`!;sE8{ZfX8(l!kFHnwigkbA|gfsr9O={3B|{L`43|G>yfS{gWg?s=A` zmLESN&<(2SNA?-`RuEE(wFsppT}S0Rp36MuGq?1Tm8cGiEPy9g0+-F@tsnSze9!l) q<#8g+V^nY(K_6IHI zKNpL;Xle;v#Cj~UB0I5qmKp7yZAPc(JYta(xi4Ad3U}Y>RU&(nwJX5`i!qPmdoqgC zq538ZWW*n@Z9d`me)!fiI}bC-<5X!m33Z&MijT7ATxUF(=usx)so+vWO&{k;z!3 zIv~3|4~Al;8?1IX|AeR6cCgIXzFN9fg51bO3dCIHBIG+lDx6s6Uv`$v74BzH66$5# zW02iF3&aRK5~+}Z77_37E^`8`fOr_|(WKuAvvF5F4~9b_4Z@Rom_=eJ(hkJDS8zXD z52>I3Y%K1gsqfGUhOjUSNzZApnDtyV1R`=?vR*ZEqYB1aRE=sF>rp*wU~EKQw1Clz zno$emLbQm$y;U^VQXT8vhjF5XoT~MWCu_?TM8(4-P>N%M0A(BiPjANcNbqCyoY0@_ zBEq@MhB6p;N_RfU;9<>0ggDZnQs+2GCqa_zc8t$LQ0MfcIbHTXnj*?Z){Ob+0oIv|yxz8YtteKZjK^^r=u942g{wp|IAXE_y?;%*KPtqx zo5o?*g-krit+Pb9W+zgSLsLuAtLw21)>51NN*#Y|PNw z_Igp%nNR1B?4mXbRG_t#sCTSw71j$A__8Bc7WI`R826)Km5QFCSX^P#>t|wdtgf?? zWMPn~RZPkwM(dkVUWc+0AUA4WB&qTk~N3wn1H*CxC^ZB)8qKmSbxfcG{U@Gv@Q8D*?%1floGm+?>~Zs zp>O?SDJdmFGJNvUob(wWA7BEaS{mu3YE);bpvS^t>` z@lpp;aJeD-YDYMysxDRbcl zr>>-ILCLeW>}KiA&rbvYCdB4VBGe@yD#fpXmI~j0Oj{JJbMf_k+Ffrq>8fck#-i|i z9|dia(7fsUr2lxQ26tp3!u1X`^;(oRaetzPPsvv!6O<-pq_5G8%7?r`9lcd^9c8_7 zF=;Zju+Ch|cHNrm)SbFp{}9b>)=u*E3zGi`U13WhFVUo0#?DC0X*PyPJ<4Kvja4c} P<`H)7x>vXA$lm_|Q?Qes literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..596ade1fddec92abf788e0b86327a8b270530f42 GIT binary patch literal 4126 zcmbtX&u<&Y72aJg$>oZY<=AoJv?vBCnuKXg+6hvif?}AKXh*0`86ssjix%r8XC$pm z?ozWuJ7TCqBlp%rQS{h@)tm3>KeN}Ka?Y(loqlgtWT+no(srepo!NOa^Sw9kd-E92 z&$|Ym^?$tR{AJNF{z;wL$42KCN^%_)H#~!z-0GR0so$1o>37b{-8FcQ+s_Sd3;QtV z<+;@|D*0g5Gz^#FY43#5c5*uoBxf6qR-4rythsvRPApj%B}xvvDvYCq?ZnTRidisJ zJFyH$f=RJA6p2dMpeKSvu%}@XDz+T39Vxaxdw)l%!BVZJ^bQ@`p&G_D9(R)(#)TA7 zSD=-sYr!C_y?=AEJ%h-wFCrDtzHAU|i{)Byv&z`dSrqRDORVwf^&1(;^?`_hm?Z4&~YJ`(^H|AnnL{*5n-@^PxvrF~tlSAhgO7bUE!oaZ@bR=G`WN-_AxxZPS&2667 ztvtWVi`;o`dIeGBCGI{q4o%My&Tfg%O?yRN=JR^Q6)r{=COv+EFFrTCIewA9fp?i- z;+OHB=Wp^WcrWm`_}h42-~}B0JE_x%RH*jX_$X@V zYDchR-5KdV8HIlgWV|hdel+M&y#nT)-s$!*cIA5Uf z)&4-FR>(a!`_M*T=3%vFmy9@hsBNLFpd`OS#m%wdXEl5tZEKA8(3Fc~>gC2TH+omc z7J4=}TabnN*60@#_1QHRus-zZF)p^k2u=`2td$*jvyxBC{w&6v50LXbOu91chf$zn zDT##|Y$cc4iRf+p@a3f;OBnsvUTrghTh^km8`m%|+=}J4_@pMHr^zfeYQ3;i8|;Hx z(I?d#*K1&sxHbs7PvHF!?D#|!zuOCesisjU$1fi&ItCi@>R>;0d>{KL-~WJ&h3H`v ztb$oE9bH`0{(f|EVub2Mwu^u;eW*=^to>a9)!5iIU_Ep6*Si9Ir^B7G4U4z%3BEI3 z^)yxW(Nnltl0pq7DBAunm!Qe?EJ^a1B?d2=E?O}qfqZF72QO{+tfCmIkK|)Cz9auB zIHSu`lrt)HX>jt8vylsGXZsM1Z8*>0%>%gD*m?>VQ(*B6lX^$iq4_nn;D9^_6WOCb zw|A3?r$GP`&06&Tu+KT>x#Shvjb^>s_MDZ?R(t(^VM$*H#+n-m7oi_uP%mdkuf(^ZHuTE9rJ~eYN4uHJa_U_80!cwZl)GL~rpbNhkP4phly4n(x}77(-IXM+2Bi{w17 zT83P*fXZPkUPBphr3f%`o+=7dGlU`6 zzfYe?wb9&^E+Id`5@O6WBoos#3npQ9IAy_kNY6Td$TOcmPx@3end)`c)tmAS0I68n zIg%phDfbB96N2uRPMj455h|MZ-=Gm12c|N>bYs^#GFOe?fA%};z&gmO+}Idfht`3u z?6Ix#hn9R-#BsAb~f{c zdt}Vc9@|s-IaSv3za1MS1vC!OO6GqYJP$uGs!5yz(uK?V%*(2xari_qJJ?N7530nU)|g zX-<;PALm0leM!>dwm`C~Wa=UVM#>x@vrX+@n5Z<@4+ip0tflu)Z8BV%&sKqSGVJIq zNs?tM1?{(K0eAhdr&3$5Y5Hki$DlO#MC_l&ONQ^DBy`!^)@92zal_-Lx6JY@*Iqd8 z6|C~V-GXZ_Qr{Xao<4vxmZlh}c|buR5+$T%VoGe^}~55rZA-w^mUFaT~u;Vf;} zaZO|i7GiE;Fo2Xwi-Y5UOTf?bOgZvdZ z-@ZdPgWmZu3nGqo)=hD!LvwmE!Do#TkNuk*jOkO&3#>SR5O1p4?tBBb;aTHc`Q2h6%fme97ROC=$# z9K$v(+j1HQ(n5CFTH?HI V5jQi{Z&Jic2nn`z9n%5D{{#N(_U`}y literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9e8b2114085e50ad4c79083f2e954036c5254eb GIT binary patch literal 3760 zcmbVPO>Y~=8QvW(m&-LN%O7!~q$mb$5r=6_+6j__pa@Q5$H+x)BL^sm6r1JFNLq>9 zrDukA#8AyaLJw_!LJ!i>_x8{1wWpkYE6}9RJ1bHYWd%VNobPvLp7(p0H=Ch@@A1En zd$*Sy=RY)<|2z!tqv*S+gwu6|D_Gy{y0&FqX4^`)^2iYt;T<``lip#aTNP~6X;tF~ zuH%Fp-;zCikN@ylXjeYX6;Cs5)F?4&o@u_5Kj$Xr@yP7tDjiF% zd#*+{6K|0)>VN74U4B^{{6A(eD1bw@B#$Uj-v6IJ2cURAs)0#QG5 zyS}W6P+U234&81bgWbAl%tkfQ6iap`lp$8GPDf%{Tsv~QSHyL318qax6tAIeid*7! zv`gX*v4Zxhs6q8_72(6oq-Os!h-9oc9zS`wN=Bf0(vP*~=s>|a2ZJ-oaI+)%DfgVX zpRU3}hAQ7y@t|F*<3SD$87>9vfHsw94&rPS_xt;8EAwt}3P2PUSXYY`EER>9#RI9x ztW_1&MnWQ-e$;0upP=XuQ3-eAL}d+&N1sj5j$E}op;2W5VPmv1VHkPB-2^R|XXD#v z%=0@u<^yok=R$6!8H^y!_-3i_jaId&M8H*z2pEK!>O`f3G>c8H&TzIWg{NhI>ulzQ zqv}BTU)}ja!yY?Xn&chqOSf{hE#L3R?3teTiB3Q5b%y)!sqFpsy}KQ_ki0XDlRcO{ z2zwEENR;$bI7G+7)u&Aa_rWA|8IgUrhx$`z1q3iuHzHugj z_LMq7G?;zVr$WMh>7$xByAFisj{p8h!r4i$so?n*da#zc;}#v%s+)q$s*+};;FwQ- z>R#GK->NeELkW*BZC1>VeBmm>h9*E`MP61EH?20_L+2$~jUSAgb0|}h(CqZ1{?xW! z(q?NxQ+xT#=8v-+mUeHU4r4e1MDuglyoAdQ)dZpzE19(3LB_Sf=^Cair(yk4O{xYR z6gNmt4oC!N*2cGdJo~a%(^(#{~KBfL6XW|{QLl?%()|{t- zsZBgl0Y!V_9S0|5EngD332RH{b zRowM>LZP-ge*1Il^ku*(<1CWJP%4v3BpLj;NE368cZxd|luZ!J>NMSFD7Jk81xnV>Fe+Y*l^qlyqOF+AO3ys!$d zpK4Q72Juk6hO_Mbg-4<*s^ux5)}x-y)rw@(@~zz#K2p!9Zwk+z=|)BMS==AVqOvFV z7x9wlzeLfLc|3NLg)Y(!(hhSQ--q7P>Bwh||Al_&F4LHeuU}Nb1zA(nv%WxaqV$7f zcH*3nmAT{gyp_QP@tVcEbO_{f`hc{VN|vb}`Pv^2L1l{C5E*$8n^GaK2ttJqtH6=Z zi7k@L5*uGT4;ZT#@J^G7ro;rRb;xRg^bLAYe`W9fipQBizZ|q&^;?j>Dh^UYCvKwX zn<r{X$42H?m@T6CJpbYv4w@M(-dBBolX+?a_Y$Hs`2ngw(#pd%4-+d2d%H zNcXXl9Pj+N|7okDen~iqK>|i56h$w}e0Qeu%kbJaC}A$)vn=~ zw=_X(1iu5RqCa)&9#vbHV=uX=p4BiU7 sz-!c|?)?Fs-9l9`B^6mn;g<@x6tB7#F|=fTonn_JB)B#V+yKu0f6YUQXaE2J literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_key.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_key.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3abd1765351dea8e44bbef9114909f7d79f7d7e GIT binary patch literal 4093 zcmbVP&2JmW72h2$$>oZYWhZg%w1+_gIAIf$vV#JJpa@nh+7)Wcg`|9xXt7#yM$*dU zE%UaBS3$4OqM-+s2;0RB8`-N6f zuvMp4j22zT2{@j$tvK1#pQVu!e5JX%#ut9G6xfkRsp4^>jT&@JoFjAol}tJk zHEr%j{kZYL{K@tlB7>exOho(gezYm)8qs{6^Y?j@zKCXd^A|Jsa*)sZG67<)`?AA# zq|%r%%kS4`tO^fPEYdNv&|@Qga2|*icq|jCA|nNF@6K`ptbuqlHd}*sy_5DD`en4a zDV0TdQtzZfZpx$%vEW;n-&yWZdG;xw@c^&>D+=l0SR6W%R-xhuhF{_DtmO$$6m6|2 zZi}+;58PHsmPJJb2hP6R@}<9B5fkH9SyaWO9SLNBk*SlGxF)6#oYsW6E^gpk6>o{R z@tqX!h@1FMiJypD_+Aqw9R0glrJ0!6?EYHr4)yZ0wdO2wK=V#F(wd`!^G!MQ8ykk3 zEy<6S=cN3}C86T$_53szQyh@tQh)|DDPOY}C4;Ej-K|@bX9ZBI#xl?B_GMOh zE_W4?Srt(%cgS!j57imohj{gSD1~v#L zzG3m|<4*_&K_^a&AlCc4nIDGO$b{jCWE6@KC026j7r4V4W7X>?VjcMT_@O$zWYF(Q zC`Qh<1EaaazdV+3V>&Xj2v0Xq2Nh1&yXbrNC@Fr-Drp7^KDYLRC(|@~W)*EV%fW~7 zay3^Guvf0~@v(N!3sTh{0R_D8h!!P(ICTn;mg-RV$wTZRPFeQMqA~(!29EL#TyWq0 zqq~X7_z!oFIK*~bbqoF8p-ZhJJ8roJr=@r~+*|z~0|mJUSiSlYT*6xNN15faRhEYz zFC{xsHx?Y_KyomRuan&R$GkVt#=2cw^7Z93k?XZ`tFo}RwzBlu=WET@^us4h&E>W5 zOwa1C7FL>z=X#neUo=Vo-C|9%^Sn} zZvw_Y{AOmab_@^D0E~F`&AmN%RPY6<(Nro`SqaMYB4f|JR>;qtB0_5lK_h)BMQC-_ zSCN6vRo_72`@Ty*hM(_xuY=+nnXjsl2j~AZ<~)4sM^pX>&9!uYGvmtuq$a7LxN?T? z#NVgXHHBh0dCGR|dXDTwe0nX}-$msj*)5sj03dT=I2@DtYV?=647r@jS5LSQ9meWj z#pI8!APiQ$n#fFDgEEQ?RAV_c$R=0W=}Yu$iXB9SfSo&j>ZaG4=bxy=&Yo)=c)PRB zj@(7(_n-cb?XkUrDU6&E+h=>8@kX90?lbkCDVh>xQwPq-+ec)e2r=ip@J)H-i2@|* zBk#~Zg2|8jX=Vle3#NjZUOw|MIC9R;9(iN=2~)N5UyU4+0vaD^ihEcGGDYn5Y?Mc# zJ1aKW=8-zT*>C~(r82R^#f?8M;*L3|I|cj#-c`K%CJKYFFI?cOU_bW=10%Ww*m71j zX-M;5v8=om>BtzRu46{c&D^gq*gW&+x>2t!qWLZ@Oys-i4BtPc=XBSkqMxg*`J>0Op3xL%-7}N9; z6RPgb|9Nh064^-nbyk7AqB%O7JWh0MYM`_7rbHTQR2Cq&MKT;AXU)8BtW8$vMSb-a z*0TF&9$79c=Bq$j585{UQDmB0$&xoK;i?~WP3GA(-7qWK*k+TTi+IWM06+$yo^e}husPE(r=uU|TWOQxpaYCVCXO6~=R?8rGHj=977S&rdq z#=i$h^!orVPcm|w9>_ekLNG7&`;anOxqlqV3Hep=EGvN&Sn>}Tw~U!$!|8K)F?b2? zIIdAf0LnTAT2RT-xB*(u^QTGw7k;G#?S@^A{E2N@N)Rjd0Oc!39h-hzPS>n@RS8^nBmeqU|EIp^d)4xZXWyr_DQsm-Np*`V crTn<9#8ulOdgiLnQ`oY3Jhlyx!NAY|4~u5$f&c&j literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_relation.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_relation.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f500fcbd843e2221d8b06532aef2df1c2e0f9eca GIT binary patch literal 5945 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_relation_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_relation_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8aa78b51e809cccfd6a999e28179a6e0cef64ee GIT binary patch literal 7322 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_view.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_view.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da6fbe62409c28d3527a9070b900db2ffd45cfa3 GIT binary patch literal 9222 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_view_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_view_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22813e055ca4d46b1952d6204c47ac3fce8be6be GIT binary patch literal 10826 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_view_search_query.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/entity_view_search_query.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80f232456798b2c1a474727ef0a1972c3af9fd0c GIT binary patch literal 4912 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/event_filter.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/event_filter.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7dff719de6ef7b74ce72072a13e1c9b6870ab9b4 GIT binary patch literal 2623 zcmZ`)&2Jnv6!&<%Uz6QZN>x!fU<$NdP)&#kma-Rk%J$3*&)y&{q+w&(XMl5UW8MLhHf2{?RDM{znd z-(*5d{$zFIDZl^2w}Cr(lxZHP#_CCA<196Nl)d0K<6>e*nU1H5Yqd2|#u}a{N*Kkr zV-s7xEci&P!QC4pYxAXU*E$V-)X<5uuFN9Sg>$7<8Y!TRy(RLvdt>ETJqMP_Sfy5= zUY?7gTJDOK4(FfnG}{tOeD$lv+a<{LT%~}Rn_NYFTWJF~miU*QMQ6f;41`2>3G5hT z_f7+G43AZ+w6IF@{>~Cdzy=TxV>_DkJ5e_7nipa?RN5gtrlU-%p-MZz7Q6=cleGxv z`H#Zp9t`sxOo~8Q2!^ERH%Lr+38V*;f4aJaF*H0%gfSclh)>1=--%(|jubxv&k_9bDFisz z*-(pdr}XB-3><8^k`P9`RLUHSbRv>ur{i1}LFSx%NTaO}U>M9;>CH$8Ghn6Dn{!zC zEiU*NlqX!OL7alilyJ;L{ zUEqlanI5V;U6pQ|`3&nOalf1IK!&DwI=2_QkdW$DE}~6HB4F%?m~UZ}#NfoPgJX`C z5Ry@$Z^MCeZYSR<>R||~Y#4qD82&^<13JAtXI1Bz;gnaZz=*?nkM1(dX3SRhsJ><^wu;63ipUaxs6xI^5?e4Q(+i8rwn!$b@Hf@YS-j}` zn=lMcj9#XJ7kJF8dem$F6R-;6T zbb9FwVmLkr7+Kw&IuMY!1QQpazK^fsGpGC+7pVlg+_XLYF{*zP252K_P8dE04wt+2 zb8Vz#h*0nGhct?FI6eRZvedIsN~VSl7Msb;drmj;MW=Jcswaxa1K!W Ltp|0l4u$(4_)U(& literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/event_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/event_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f66e58e0e46f6979dfb107bc7f2ee94779a0213d GIT binary patch literal 3141 zcmb7G-EJGl72X*x$>o}o?9?^l_GX&2PMN}_)1W9ID1wvNG13dUjU1pL8f=z3BXZ^C z?s{gZL<9vCkRC+3^nLpbeTTj6RbHV$>wagJ6llpV8iMn;b7tl{=X~eP6dN0%hu_n` zpO5}=!}I=0gY}<}!9x`D0G0HHo@A0|Y{*>8hupP|VdIG>8`3}Xq_6zb#;_^*zSnEU zkC^9$0>5XIG#{JKidakW)#LqV;?qBV8M>J-3N6yySUpQ@TI5DditmIiL_D*TLZ@>j zw0bd9#u`y(DmF?Sr6#pvCl(W}4nFx{Vr{uS7+810h)(FI#XuH`8DL&%l_v^4WADdh zI{09Bb-aMcY^rh_)48II$7*K~@AidwU*yG$cw0RF-Gh&6kWWjM1FIuIxDMCD4yR!K2B-WCMd0P#4rli8@B6w`tEE*_7Sb_iGf zq>yT?@;=1EA7FlOFQIz<*TCQ*ipfza4{q_uCBsI?lUz1ZHuTYQv`u+iHf8IK4O^-$ z+cG%wPT4R}!C^;sRwEh88)x1ylwG-j_J-V)TWGuTro4rAL%t(_f_78-aPCj5_TwX1 z?@Kv1drzM|-XR~SS$5oaCariXs|IMZmvAV*`ca?C=P2eqRFW;csIJ)pw4E`%wV-dX(>}gK z6F&dtQWJ4s#9|6)nULxr&Ec>#7yGqy_Iiz~5v3A#NKK;CX`08j(3+g^l2^V_*+D(< zbbxRFDhFR1P-T#(Nil$QdQj-G`gox7BePD|L6(jNSm34-(T zM|~>Ja4mEe-k}HMu=!t~D8wH5A(f&yKo8zs?R7O+oNp-Lx3#h}jUajUe=VdX^xM|< zxK!H$j=kLKCDTm+Leoa$Y+F|y8j|_%qZo2~E0~8XXsLWVGsrZK1uF)a{r{n4Skuzs zD`W5!miW<%UDs<*BjtLUjQu91evj`?sj%~!r%0ZP^VHwaNxc(hy>pQIkYBJz-Z!88 zg`e<~hHWgo1wZ8{zV#QrZJu)do^9F|1&;&r!Ji$JYY2vJ>3ktgC{N7iN zAvLw?phFrcmA0uu`oLevG_kMgP7Ec7@1vMIs4RFY8Sr&*9=pKAf>_JUh@a+Ka zT>`v|d<>Ac0Jd@0LB8wY9^jgEfc?E6NH@2kcD+pufz?Mcm|lUaZ(;6FD28~@Wp`fr ztha$|n0{Y%Ag^hSsWz6$HX`bosy$Y?>a4Cp+@H8`W890CpQXlDjcHu!E$rpauY9sw z)vR}cw3&@u3f5$pUdx4H)k0R9Ww!F&o-C@GM{zb&RpYrjzKWOZ{uzq-H7cLq<{_md z)?%D>{}cL~%TbGW{~fkMc9X_@zIDa^*9=Xs6Bh+!t2zSC`Gt2u{9^O|I=_%l@BqP6 zq6F;AJKtq9RcCx;_f}a#%2w?XnR*)A+8bSLenp|G1xjGcZ!qQ9vdQP0YiKcb4J_Ht zfu*|vWc7%wfcY*xfWCDHe=Fi#qF)bsO#h0Ge$)9#^rT7@#VZ5>Ur+G$}0Hvj`p2rdyDb$ATU5=k##nYr&~!Nc;z4RM?3qMu#fFWe{s6@F|SmFpAa-VhA3|LQJ1Al2im%IV~Iq%jc{P5D#Zv*R| z69l-%LNt5>s$4};MyTkh@HIp<)nj|TEmAU%rx;dY6d`TRGU|7uh_+wOv|)%MfsZIf z4L2x4($UPSh~kXkSHUvX9lQIhY8hn_w>9CM*C}`C52^YMRYaP#%H4c~@*NcS&Ivr9 zao-R8SANrf75co580v&92!o#o_}p!;qIW=By^pHmTIt)=Y1NK(5^JZpL+L2w$6C`} QN=@!z;dAWF0>tuv0ruzi2mk;8 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/file.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/file.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd2417fcb658890ce5f0f5ed46b15c5b6db6c43c GIT binary patch literal 10988 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/home_dashboard.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/home_dashboard.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e588d0bde06959a0c23a027c39e11ac879a793d GIT binary patch literal 9551 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/home_dashboard_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/home_dashboard_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec0f78ebc29dff676f8c931af8307ccbb96274bc GIT binary patch literal 4162 zcmb_f&u<&Y72X{#$>oZa<;0OKrw9fukc3T5+6mHwpa@Q5$Mr>SBNZr!6r1JFNL-2J z(lbLlVkq<=qo@7}JxE6%3iOa3d+T4Z*Pe3rtw57}Z&suzkqXeJ1n2jgH}Adq-kY~+ ztrj@=J^A}d`|B0Q`4?T*p*LH#go1^Y8aa&?Q7mipL3J) zXlOdAN=A|^`E)3?(R|RAk(T^fq7%b6BHmGQ_oH_@#thb*O=C}J(+Q0vZHhG3O{_~L z`>{k%n>*1UX}+^LIi7=L*pqz|(YbsO?a7U1wAtYNXS|<2jn?_Y5AWW~g?uuQeMrpp zK*s!;R2n@BUlha=Jd%B>A|nNFAFgu}SVQ8y#B_%3Mx6GV z`gydsCzX|O(vMRi_hi2Tvfvw--`R?(p8XXtxR0X$j7mDV7Kg5+Rj4?E(S`hlwLDQ2 zCEF{C+rk%>7jCO0%OVgm1~ocSP|D>IISh|ns^;; zRooD7psk5jaTD#bxFy!mUK3?p{hQhKU#C6!AkrOsC68g5k=}Z;^KhN8pn2SlwC3pG zo>LAzrv~DtBl(#TI2mEG3ZM*Bx~HOEBfpggDK5%zDF6rBl=JLG{bAJY9yYA$TTACM zh|FuJX}8X@s+b5CCL&wyBtnMgQwBusNI}&J)nn1RK}1ttJ2}Z#Ojj`ZQJ2pQ-h(x|T*%#|4=g2p zzMbP{t6t1%GYUYbo8c8o)kLCWmGqK+WKyNb!&MPgy^wiYc6ZNbUOK9Rg@1q5{GA5m zoBbqCo7k7^rfN@q(3JgWde-fl-K5M;EYv8@tt)AU3bA45e`ZE( z=(n!S;XtnQDdrxF=`k-|MGBzt(b#LsD+=fK2H!{L6@jtjkKUSBU{=qV$R$ z3uo*dvtt*|$Tpm(zA2AAQ2<3_?49_hTc$KdCA(DztN3)Z4qq> zVoc#`)fv4vkJ&Sxjg4*^M_s*%PQK5wzFO3`r=qSQk%G9_A$DQS3cqFr-$j0FMfbM8 zAuTOKWqUU;gw!5hzuqOm)lIA&plCuw)m{D0bL+LNpp!4N3g{K>(OK;*`w0n(IxFu< zjJwNlvf>|-=0%|>M+nh*|iRvW_->igZc-S?W zXL-6|R(uw9hcYW1$ivI>(hYo$qUrVZ*bNrAcyjUdGPn9|;4PnxO04>ypcJ?(G-ji< zD{o@Xk9d1izZrZgCU%4FpM zl9XO#@_Shj@UjxX0hZ56J2KBQ8{JwcH;CrMp1hEno?k%OAt*!OTl6*ag%#lo9`yzK z`JnEq_dvQR^iqmLN`>K96Ipz=IH}3W=3*|nm^I>Ubl_sHfs5%f<&qR+#_m2lpzkp@ z2$Pr$QPBd1E*LnA|S z%_Yob{#l$nw24_(($c`yZPJ~?(<0*+AXW64t?p5EF8ui$O;XcCq)9#B@m%IHpSh)P zS&8bP$O8CZC2%LLANX(jp6^x5lL+u3@vfuFn39U{l9lr7w-k$xMYPRT-=y%S>2h#v J;JZHJ!S~csDxd%W literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/input_stream.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/input_stream.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a90ae8170b5ed623c6708d86b2eaf3baef628352 GIT binary patch literal 2623 zcmZ`)OK%%D5ax2J*IIJZGzgmZP&RFos6`~FK~cbPjHG#?EnpXM3KT+%4Yj1CjaR#C zl5%1}J~=@wVA zklj5E#0flBsnWtK$@@FY9040ZJdEvV((gpsxNBaB;ZSLZ@OU0&QVmtw0kPmUxSy;= z*w23y7I&eU@1Roz!a^`4J-(qqsd5Ym4|dR56}1;(1J${LJyS(gnM8#0g!Fb1+I zTQDxjMF`wG#lp8~KCv5CD>0s$we_bDmobKhM~N_o!vx}!alm(SF>XhSAA#ox{&*Jx zoa=0;#kf;?^FamXFBOWSsjzu~VNwU*%E{lLUCm+u7uJ@rCWUTaNB!nKY(&>#k zto$Yyd<@1DF4Z7T!R2wvH%j-ewY^?T#wOD7I8KGl^r2TUqmscP(G^hpm+k&&AiCW& zj!R1yix^0Y|bmc!XzfUo+bO> zo9Fbvdq94<^E2J0yT0{jWJdSsF0*XLY-Nw?tF~gRn7psZjP21qZ|2SD3fZdL+Kfpb zBsw#;Uq2ux|KrI9{D03j;3O+g?gs~C{`8EU$S>HYlmBT(Pzuo00ZnBW^ngqSY^~2Q zewFF9C(2GVWIl4Cj2-YLSK7u3cm_W%nR|7UKCsTGU3u2y3;5T1VPm;k|TWFFSN)QC~^KxG%*j7CeKYxJ;&>&4=PhTW2N7 zB9WL?n3N}+(zk=W2D(a+SBQjQ=yw6If5pMR;vf&8W;)Pp?KR%dDb#L;oCmxNXf{3r zS+`*CYiI^9(DW|<%e;20@J;-(Xn?%NGp1-AWoBr1a%GCzP(j_Zx(J|{LiH6;Bny_r z#uolqGZuf#NeE>5sS-)MVOSCuul)j z0rJe7cIJ5o*#|EYye&CEKY0YQ!T%&|`$aX+LCO}j9O}SW*fJu>yEB(6sz3`+>5QXe z7U}fj8N{%C4ls(kGj*5%aS0L^puUf<;xlLb85gO9dAVqN`eQWzCJazU@H%1m7$h8b z>*vZyDG;IE;}7Sk&f)j~Ccsk9LMoXW7FaAMGw(Uw#21~;C99q&9uIgwvm>7MpQ{L7 zXrUE{*IFcx+P=O7x*SWez#)sm@Q{{#slXwn&p9y+)m9jO59b`21IoPS8Ap~P=Pq#K zNX!(dcHSm!mahE#BKd~yrysM!F%#bq7S8;}wLtn=Z->A6`6W%!( zHMuHSC(NUa)tF!R>#Y7EG}f#gr|K6d{}FTr)k&kBR^Q literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/key_filter.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/key_filter.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2c501e2a5a861210ae6f4c4fa8144fb89ea699c GIT binary patch literal 4621 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 Un(^W$IWk3J0tDZ)Jy`z#08)Hy6951J literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/key_filter_predicate.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/key_filter_predicate.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb6f7b044316e538078b7ed60ca61fc08e609674 GIT binary patch literal 2694 zcmZ`*OK;mo5MDm?qGdM?f}l^C#t%sQK&_ZXh_-}ZZdG#LAx zUS=N`FLyE25~hfCS!6|aVs$OE+FjeMPS<(NA}4a+u*enep3|*F_6BQJf(I639>?>1 z7^egET^7iQKYO_GoZox;y=T5W$|R3drR6x(ah57R%wBPw@nEcnnT#ibOR+T;N-Lfx zB2a>F$12u*CE!CT`gd*&wa%A29c@nN(FyH1>qJ?oI`}T6NJ9Zh>6<|wcW$g6AJ3sO z9*I;3bS}?>fmrDTt8LCdjV$?zO{g)KRa3!9YlZ@K_GBNDM^UhMM;l z;b&_h&9je>&IT0r7HC@ww`JCEW-3;9%vC=LOBqSn@*KU}6%Djp_*QXB%(lySg3@sI1F z;72}i^5OU^@|??TAcIl64C;dnan>B>wb@kK90ln(NRpkliChQ*ojfFy%l9!95jV1? z%*PDK_M~$fGQY_KJ_3e>N1`96NI;zOjWXD4Evq{p#VVBXC{6>N$wRAfl}P%BOjcn1 zuW9E;gN>d(Yl=wL5inWzUw^bVXOGvfr?&yJzoN zQ)_Cku&uhTP2I?WMtkb+*ALjq@3gal-|y)LcDm)xeeZzH?w-0Q`g6Kz^naQ%(gK<~ z&{TF|2Rap;wLYb+Rwmb<2|bo*3q-3jm0(dWq>csHhd&N_>UVr6o;VmA80s=6&8A=p z@HKFrb$}03jF!Dt)O6<4{zJQ{4FeTuEhQQuYgvW$+OVLUD3nEgB?(5oC|IR#s3;?s z+2pG;GIC_Jy^>^Mkf>D%gU zXt?Om0UBxHCb80mGYWD!2V3U+!le)vmC_2d)wpMhSyGHzRY})KQAHJu6J5B*rsWrv z?I0P8!a)JNkC#&LIfkOiwJ+J8eeUbJ5r)0}1s(B7AUDR?kiBX`-#1ISL z^R1|Y9WZGQr}!+`lf|=vL+cc7+F`cVA%M+{*bKxU(LMUYV0giUG=f~dv@H1vp*RZ) zS`2yR`;Vbv2wgv~#guv>9e@0gOjZq?D-b|kOQXzGjao7_nyK~D-lTs8?3qHAW5MG- z?`3+(v))S);%X11;JD_47~xxYpdH5Yk< zCc4~aCh7?$++@l0%Q|x{+jVQMQ+Mia{VImrtQ}YLm!$tOroxs&ULc`b=Fw=(ST+Zd Xd9=>bja6z@=I(awx>vXAsO|p%+W4x} literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/lw_m2m_instance.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/lw_m2m_instance.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c5c4dbffcf2ca4f130855c42ca8998be6695935 GIT binary patch literal 3915 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/lw_m2m_resource_observe.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/lw_m2m_resource_observe.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecc761c744640001b6c81a55afa9c8c8ec13bb8a GIT binary patch literal 6459 zcmb_gON`sd5hW>#qBt7=*Y>PG%eAw%<*X&!iy+Bhc4BA!L4ZVFcpM;5K3q!OGecVv zm0WfV-SYfNWGORwwdY19q%%++(ZHI`%M zQ;nJ2T+h|>%vjROdH;s4X^xBQ-fGZUiM}2Bg1L8ZF5PplfBYRsjob=_8+0NmdQBOG zoyc7cAG+e=Yn^d9JNSZ^1DIx{9^ig7gKs|-jP1N*X{Z%e4*+uR$TY2+X)}~^X|>B zUA~eqd8f-e;Mk42yy-sTBEpJ!_iE*`65*o|M4ECQax90}US&j0xXn9U_>wcXu{Q4# z!x1=M3FK<8QE7(lYV_D&S>Zx)nAV#i<14&V!8GR!s9&o!sT{ouXk5b`nb0%W0EI`7Q*B+Z+uXiiWCycW zfgNIp)ri9#j2y{Y1@;y@szzq`3`UM+tpYpF=F~`umoV~n)+(?Q?4%l*<+B($m9+}& zG+)lY2it^4-VZ zyV}0Xqp&BM{7xg{;t}shwLAB2&XXBNZnNb_k&6mUEOepb3>#Oja(AeIm-L^G!bZCy zToHb|k{HB|5H=!R&R~hOD52T*J3YVETB|73W3v&4tvDBSWSoP6m#w(yODTdzPx9CZ zSZqJwYhK51^Vn2nAxzkfi;}l^n@h1KEZ{2$=z0OOYnUvG)I}Rt%%G?>X*9j4Zs7h1 zcl2`CfOyeh2$#(TOrIiT^v0Q1l~J223)2bho6#X%0O;sEQ= zx-u})at2tB);9)uv}OjDYF!^#XqA}0gm(iNqkm-@FzzMSciYf(%Vm5y=wOQk9d{|& z4z==Z?0B0h%X!dQ(aV&UPjqK{soESb(_4L(1yNH3?V#h!P;9DE*ig!t3d@DqjCgB# z`&rL5aTse~{^1-gy*_x}j<-XjHpvaATbhDpxL7;kEds zuHSqBPlJgKkDQX%Yz6Q^Ri%Sy`0(JdT93W<)i%vhhMdY+>8{1L=i#l=^T;bl7f@J+ zrEmUh)F*F8H^1zkng&88rPqWT$u6qXO_ub6tZ<;+*MOwne}0?88`Iehk`FDj!=_?x`q1% zZ5Ye$pPtHmCS#MPr5DxHefEO(qS`g7t^a;$j~a3kx1t2;`tUQGs(mBMnWCGTI0m-M zMxq+h#WekVjDDpbr?{nch@(VE?|+urMZn&KLF|!=GJ_FIfZrW8gjtgC_!Ke8W&V)* zaRSo%$EF%Vz_vtRyp3h>Z@@37OhO`;f}|rbrk1)B-1pU$?tho0bX|gc+S;DV_V|w~q9#s3)O2^NZytTTM!X;O^{H!D`2RM;pH3=!;&Q~bjk^0i z)7b&{{UpmY-08UVGa6L5&rRLm#LSME|0=_LXWl3ArZoxHJFngg&Zi+-inBTyj^Rvw zza;T@h4UXXoQH?1Hv#qQkQzsO{JVaDM4ARSeT+Y&K?V28sc;V&+7a>JWQgxdgh|kc z%M#poMPqyDU(rHMyaPE?>{UQ8hCTKDfpoDe>^IMK*)jS}p#OTrcEbN4i8T#>ii!SA zg9`uYXS$4~9W7w|HKoz!B-=@3NpNC(b!Jh`fY5 zqBE>SjKg&BSH%1D4Gat@;xTG*L53c!e{RHuRX?JbK)j0;Wj)qE9n*GfFSPu2gZYd9 zAi@+S9M$@jsg7t!wzAL)n|>==L?v0OsBg{fxs2O6qiR_D|dq8AVAy`lYEO3eQEsr*RSU1+9tV*u;RDs>`AOJz%)R$~i6 zZ?7d|Q_@LWYggJIAvWw zQCxiD`W=RP(kScVo0vMyu~OQBk8$oOqu&CQ*q+GBD43o`kh= z9*ejbGn&})JpR!0{*5Kd&K<+lOIxWnnL8m#rdk#JLy`wZDN*jl%pkVnT%`_)`-HIt z;{VkzH?i2^p7$SOkzVC&%^uAwTQzl+kB|=Nfa!V2oq6zty%yC=o<}bnjufD$un9ab zf^>a0OL2I#Ti-%oY!AI>l7Nh@h)e8#m57{{K}$?nna(_xi$yBFMa8CEs-_YzBoHNJ zqMx9!HB&cC!#1#Glb`j{aMHS=TQ8lWaTMFO=;(&CyQl5gCv4L;ONG?2&@K>PM-dx> giwjh-5@S*`rm+b>o~Un;yk%CO{MjyIR!-1PqdA0*DvOSYb(ESK75v51pQisx*b`H^pPKeo18p9iX?!Y6?Wb$Hm?ZYzF2=(pt^ z76h@t^I(z{WBZp<8YS-Cz5hUb^2Og`zw=pXL{?a5W~s}{!iq`xSh!NinVXa*n`>e8 zqnWnOiYnLAYO$Bu%!zd=CPwdk{LaL=YHc`l{)Q3VFv!ZGDpNbezBal@HD=bW$|@Va zvvGR8fXHmB3n%GbQOU7hAIgn^5O0d2d?eSz-H&d)-+-B5A0VmpXs^X+4PnoDa1CJ1OLV9=Q-gqvt_Vyz%+Pj|tH%9LXxr-R1* zcS=OW39S%!Qfkhe%3>z-e1G75TrZy-mAL&%+j?0#U>ePwPNuR-LBz9%+(yjaLbEr~ zDYgibz_EvX5scY_{lxCUO$+`r`;pwjU?!ihUNlpz3Mr<*oeQORvI61F3UR*)F~}_@xEUhDDZ^ zL!6N9lxD0y9O`1vp6B{7&ql*)AGuO|IC%fo5UHV8E1B+s&JY|W#QY@9GZ1~~!P=7{ zL0Z5wP2>`1lRb*vpxQSb0C<;tLr&`OKeG9ai?$C=t$4<kQvN5pEI42;ID&g0 z@?&-<`0nFx`2jy@xz+;iJ>&ZVL8huu?AAI%siJ=i+g4Wh zOd2(R@{5tajRPB`Hv(TPUIyyc4UheX$GwA6?vaO^zmSpsK;vi2SORni&P^}iHdnE? zj%JAvJ$C(nA?q*KEt~yNFG1drjy2@5x;xe=!p_t&Dmy*}5*51+^US)s1%{dx2sO91 zNxbbhRvLaVKV1Y0c-azsUQ~xtS8kCj*(#B*GCt4vvXtY(6+ovnCJmv8#ap z?5kAn{LVoXj80Xd&bqo=p&U%5^Imz%yx|vYt2>|s4*e^cNB&vi^Vco|4w>h0lf1_r zVFLOFL|-6&oxaxJdko(TSt!h#MW2~BA!=??M+L0u8U`mQLX}C9zvI1!67fqbN+Xrh z<);tLi6b7&8<>Er%pt36m&!8Ll?BT7F8$r$=knIfw8(bEsB{xijvne1e;=gL0)HiB z{#n0eC__DMs321^CdpIY5U33$Z7y2TNfP}iNxp!dr*zCi*1OE5jofoqoVk>|gX+h2 zd9QKmduKFw5o-VOBjgPz%Gpcc6*@`2CU|sJd^t3d+3deWMi+95MI9#zD%>omc`r%m zmXn<>98;zU9tEIDLZ5$~S*7r2#t^yvx1z~SAOE-L9VL_LQ};U){EX<}o&E|Y_D|@d zAY?oYyD{$}v#5`F)QwIW@FO^l_^VihdhcS I9Da@eA6B@&nE(I) literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/node_connection_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/node_connection_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2927467714dc67258595a276338d1476b4bf01e GIT binary patch literal 4592 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_client_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_client_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e02127d60394dc0dbc252af3b35f0d9010bc3d8 GIT binary patch literal 4440 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 K*qH?gDgOq+v6)T) literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_custom_mapper_config.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_custom_mapper_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7b89bd72a8dfdbe0f91f11c3311befba513fecc GIT binary patch literal 5377 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 bG`?GL-m%EDrRd9)*$g4Uv0=ahq=Nqe_Q>i- literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27177b682635907c8c4cb8acb33837e643cc1f15 GIT binary patch literal 3980 zcmbVP&u<&Y72X{#$<>;YCEHP=qzDFW5tnUE+78l#pa^zj$H+xWBL@iB1e@i~NLq>9 zrDle9#8T)%LV*Ik^xlJX^u0ax(EnqP?I~y90yOFOW=V>YXtec$J3n@Qeeb>Ry?M;$ z=K}}N=HE`+|Ge%v|Dw+HcH1>oxozO_KrpRL5#JE&4 zjU`&z+=+Tg^Y;4qc#bLku1rlt=ki{(BiEYIdV}+y@H9J!R{7%(?%pdvZuVpf#9a4e z%%4f6v0|0qZ``#ae3W66*sMa1?d-utAa=qNnMxHIDR}#El@nkM#5;-E?YA3o)@|zN z(aw%k7U8%ZXF~4Cw1H{Cw@|;c5mPz+l+byASN{oxbYK>TOwuaNIf9Wv{=!ILzZSV4VVRAKse@?i5JEO`GDsAQlwHlIFTB@$>JcOtDh8ZdCiA>c$a z-0Vs|lAe?F<54iAr?MRtbsL2_9%ZnQ;ZlGHw5Zs#8>RiI(>ZKdo#$RV%Q}PQPNL0k z3oM^T*g_Mcuj(wX$~0gC)I$H;GmGoZsFiH=p$P149@%1WZj09P;No|c{M^Di$PHHU%kO!IRMQa95i z&YD=4Y-egmzTcGTGd=BC%}&y8_735g>HCd)cbo7-d8Ze}`|ur1Y=`7#VcbdJRZS~` z9#tWHFbfMklY$$)L&yPLCngMkM(SHcQDGIg;`;UtTCV_4h;0@{KGH>YHZ|M6HiVLhEH>20a<-eklI7hB=P7#Cm z*qQst`RcQfqNMdtAc8Z22yjytnG75v3C|uy1!+Gu*28I+N z*+yP9SxD<&;4<8ebYzTDH?gAb=I%F_w4M8Fov7Ou(Ym0GDe^2kgP%^3bhKGxt&_!3 zN3Ww%EUU(p(!&yO;WkXWhn>W)N0XjC2`%S2ilA$!a{;%Z*% zMm_Zg_Oj>a9;q%b7rS7#?ze3oqDVLOisfxy!HwAOnB22_x?x^^7IpeEFYU|2%Xmrk zU*gqtAA0N-3tU`+xD1(F`#$g%M!gEF{X3`x?jrTsg?nOTf-AbFsB3+J!cO4_r|ir* zBbK>?#x%>2h$B-+&fNp@NpftjPFZ9nNFyq}9%h-m+C!qyjZ9&X88I!d01~!*PGXT> z7T93vB4;pq1@HJ?({xdSwGOcsNZ+DA3t!u_zvfXY&@MW4SN#H0XN6TtGf0{+{M{IY z&n_hv#rTzwN^WG;_BI-DBiF!yx@~pilV*w8$%AC=bH$_gG??95BzVT~uQ+;|l(X z8f|(2{QIm{DDvkMlfMeD&94b_0jEKzDOW5C+K_;yG7SGf!04#pGAJ5FoY|-^lB{Xe zML!S15Rt6kp>{0{>4?!t75d0xSnEgFtTj&_leGIrhU9nG=tO@M{SIxmlvlJg@MD|Y z78JB3_$8()`opU3QE`siwrsLRaOrx{B$w}aF7uer+{*W?LS;~90i0_taL2VD`0x0h s@71bf_x^zPuA|7Al8P9TR|3@t=or`V+l362eX*N3zJ2LUYGTL1t6 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_mapper_config.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/o_auth2_mapper_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9bc1daddd535ce2854dacc2554f9d8fa5671c9c GIT binary patch literal 6218 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 z z6jMoYN8oOzW#Z$)hZ|yui(KMThLPktVNYHMFSCE*k^+-_$_1-cziHBaNgApYOq@#! zNb>q^ow$al9VGdKu-z9)ZeJWu%1Z_~z^i_U!ga1XzKv84X`N%2{_DF7=e>ec`r0q} z_GRijgBuqaVoKu_UyWbTM?3Y2Q|HV&BgEN*Y8G+0lHlr$OK=bJk8i6c=M!l*j(bO; z*TX8E6nn^kJE2a^G9#)b1z-a#|3HT$?JPKh>$AkhnklJADV3s_2^?F5W5|1h?(m-* z2|j0Gm!q9_Dz;p~(plk^(q}qT5d3i@is#HsmD5#I5tiJ`sPHBla4%cKy;PAdFBD*g z_MWp(KSDSe2bO)oqHWfU^)8E>d!mK3I+TLp2ZpfyaU~}icp1=;cm%2-c$TJANghN( zP5>n-1c7)O1b+gZ!M5+Xc4?MM({)p)7^~D|sW`>HQ%aS3dklh$q&C-Ek~|fPexjKn zURMOcDTzm0`Lji%HI-bwUawrCgLlIY1`k+hNM^nFpQC_Kxx z9oO+3IAh^!rmhd((40w^SU31G-(vAE8JbDda6`6jC^t6|+P@ UT5sy31G({7!crb(Kgxoe#+PJgC0V`$xLn~p3h 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 F{{w|qO9=n~ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/object_node.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/object_node.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77ae69e827b40becf4e47e8928b72c6471e5ac16 GIT binary patch literal 2613 zcmZ`)OK;mo5MDm?qNOxRgP>^--L^qowTR?2C<+*kku)!~1?(bDfkJ4(P~=KtOp)~N z%83Q}(K$2Uvck?n-gzO=J5-_Cq9o3&aV!?*tXe*cdKV}H_O z{&TUoi>8*)MXbjnE3y--XPMFN*=BTl&SMrik^728u5kC9UL~?OSi2HDuo&|=zNe!& z9jb4$Kt}w@!;Po>-jCmTX6I2Rd7LUOC!vnBRPj;vg6oV26FtggJQZAut%*=t@jMZM z5_~&WvF0lQA4xH|vpCW^U+#9bvCtCW049OXc6)L&N3&!3W$fX9!>h4FdKK(i(ohu(jYvZhgl?sBJDuTdky!q zwUGMx&&J{|n))7{UzN)Mb)T=u^!c<2F6C@MGF|c zs2Q~|E<_g)xc3Tgz5iTDVG@H}T?0oQ z4L+!t8PEDDV0QAIqVD^!q<#N7ApAww^z7;TZ|>AN-aqA%D&(jcm;8oF%yuo!_TiZ4 z_JQ?){d(sYd)MA|v@>Hfd(Yl=wL5clWzUwM>WZ#X;=W=tchBClX4cGJVOw=wo4Jt# ziO$U3uOG0J|LJ4{|KHOMoOH{R``!VYKRt6#i`=ww6?ug z)O6<4`9r&?jRF;DEhXw4Yg>i&(geNi$dyHXB?-p;C|IRprzjFv+4TBcB#xAIR+20X z619p+dBEs=H^v)KRbsrxBE&*o0$%5uL4D029-v$r%VK})ZWWG-Ult9>OFE;9)=^gadM6jEs0{^5o|c7&I*P&@pgtCE5-VLe z;~kI3(mb7y7=~^8Fuh&M?`tU8{N8jitmn{3mXtEJ2~O zHtlBV$S+Pp{w}=c4I<1X94fzW0hS8ie?nUns8f;kecD@VH|d&bFvg=(@lF+>A z`=tG7rv_JKAp&(7dU`ENmbgFB!l#t0kpW7MGRB|MjEaU_q>kRExsGz(xR*4U`d4SJ zWxH<8b?Q#tt$&2(HfzUO`X$MKjIOYykQZrEE#qb+<}@2aq#mWPyv8b(AoJw9cHOI6 Hb>!^-|9Xi= literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/ota_package.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/ota_package.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c02303d7f83d4cf830384a09af7eabf72861df6 GIT binary patch literal 13188 zcmcIq>vP=JbqBE6Czo%E67{g*M=aB}cJ;6lhmjOLD9NM<`qcM7(CNocKlDqd_}0m%%yjyQ61PojyT5a>z=BvT zxs*~$dw_G#y%*=)-#G`s#c7R>79{*#`Rn^N_cclS88Oj670g-u?4uw|s!B{|N<*&7 z;;2*=aZFWHmnD{B>OG06T)msBrkS!V&8Lk;S&|AG{#Mq_=9+!JWmrtRdU1J0JNNcd zK}asOEX{1%j@79#cV+r==MkXT4>an_RQ_I~{I2w$^TN!{*v8(>5LLl%cI# zeD(C)9t&Ot%uCcbpEump>UT-nJ#+xN{EBqYG zFIDP9qkkzdXYsTDL6Iab0TziMsiyLhDKUkm-jkUsXj;&Wpjnnfd!7|QN5pxNjpBSv zNXOX(&L`Ov=(K2=VS8{sE6(={x=+wKqE%H~X+L_XOa)D|1E3jp5H!mUf#z8rbc8(x zT4Yayjxh~%oIL|N$tFRk*)-@3dlqz-&4TV_dqMZHeV}t}4p&OEI(wdd?4DfB@GN_Q z9lj^sm8&_PyOC!vhFq4-vzLUVzzdMP9CBIq3OgbsBYXssQpjalnH?39A}>O6EabB6 zI6EOEqkI&SS3@q#PO^^+$rvAl?`cIa6HI#b{)q<%wRPfpJLA;fiSOd#WCJC>NgRb zn|9^O%EbjrCAL;?7`Cn91ZkqBAxy&f(wud!bz?}Q7z(7wGi|H2W*HkLKd2X5h;v8d z4B3PR`Eza<&5qG%+%Ad8^~MbbIl|p&=oH>w3aQG=)z^9brrp`_rh+rwXsjV$IqMr< zv5tg*#G*U5+Z>$5DfV^8+~8iyY&xFG49BPz&fj+U`OYeGl$WO#-A20eCKLY)@ih-)>^HGr=Wkaw`%B|a*Q=E4}}b<1Zi$X zoI;XzOsBy;Rp^=OSPd`RO>Wh(p503@yE+-zc`h__q-*91tgMc7tz3bT)g0-w3}dR} zzA-(`bEJ6%idVBxe38~6=c~5FD)p&IcB6BoHR%E+xEgLGOm-#Rr?~&%9H|a8C8#QB zTF{K3SwVAx<^?SXIwELM&{09h1RWQ2LeNPUSLn#rX_u}r<>E@<7F`A0w2Lc(d(%yU zn{jbva93Rw+#VMifcv7G1~=yCgs=t6UF-*SuK4!N)Z-1ps4a8J3g1l*6^F>p`2un62Ax#Qq8 z7nXthsXGDg8Fx}}f9g(xdzQ(|SXTs`vU#}YI@%G<&^8c34UO?tvx(c6+0>T(TUBNL zId4MmIf)+}c|C9wZ#q1UM8>GTB{aZBVvgnR#rHN#SWQpX6&~uVCLZnD! zl*ky72_ln3$YHH%A~Qtx5Say;pYl|jH&*{&CVwbdFXI}&w#(OSJeQQ4X1!I0HRfu| zTH`0mym`xxJ{y%AX06=5jc2RoiPEv7WjsppBW*v!qGL^`Cnde!FpeRDe>wDcvR^?~KiZt`d1@)pqmDEY{?R%8D1kg8 zI9=(61Sgj_?_cJ4oTQu|b6~Btie}taB6G)|2gQAXo@o~>?sP0X2d+HUL^K8cEm)L( z7c|^g!l@t1)*KYZ;Uydd!ajM0SaQ-k_&uWZn8|JKk7ye+s7_siKRORG>LYS!k==sG zzrVbTMJf2VP@#X@z&$m-l25!U{fknu%FuaU@z+E|D!G1aVSWcqVqpsTf!<)1Xd-#@ z2caJXY3uPFU>7q8*asuOpNygxt~ls=AnsD$w zcwZ*&fpS;=2A$CZR0{b}-F(>R728`o*gtyXwt7mheF!AN)$8|}`K*_EYw@I)S$_T8 z@sl4H#}lu;Dvl?Q9j~S@T)lAOc(w4>wX67lLdW??aDMFgYnx}6nzxLG$u!Uo*Km{6 zuJh#n$xxty%vUrts(ETngI^xy9}dgMi8h=m>G;=7wA zgeSqdamP9cgA$#a9;W_=gu=P^Mx8sNz!tZT-m!ud_M@J&MusI>pWvpE5nTt3v?R^3 zn{;*>#s#-0@#GjwXVmt0v;ae;vk1zOhvXr29E9@jW{IPW_txm+$sw{MDTUF~@;{QW zALWPwyFocJEXn!=lp`a$C`Ve7=GY$PsOc5!42%m<7Ow^|l&S5XX#s{p`TJok(>wDJ zx(z^g$kB0Bds`4uaGxUelfb2i#(yE90CzkR!gT!|LH+G8bO)*14<_~WK^!z@d+-u0 ztXQ9h4FQH^Q#?CU+xyf$6oxt!!#;cJJ<4g=j zarGUs{LU6E2Wp%QsOa89b>Qgjp^chbvChJ%08=tBjw!W`kkLb7`e!{%o3<=wL%a`0@s4Y>Bkq6E!#zGWX<-uZj}PnmLA*I>w(b34(9%?_ zb69}DH)t{9zCmr;(7w@&_i!U>2xSK(?%hlg_l4M&!82r868^MX^>T=RG~UCj?}&RZ z-or6TM)%_#cK2}(*`(3i;~O=%Vx5Ok0j6R*E_NTLwv$6+`d%3C!G_`x`VD||7c;~W zr7iquNIyFWQhIGT8$uf03k$BkBck69BRLq7WO6^CL2n<=fJ+*?J)B!?tyuKx8sI5* zR%3Wl+Z#jU`P~ptyzD*puHH~%;~4hR>k^A%`P?8ZCm^^MVmaCyUozQ_D1IYEFFk*Y)qGnaBi%>p@H8LcQ7qvM<pE zj`i7Gu`a=~0A2A>Dwav9?RSSp_uD;m=|kEO8VN%qGU-4~6M&?tyC4p^JfVI4+nW{Zas)dvC?1*A_J>1b_pKgw_{KEE+7E(m zxY40y3CLmF`!Ly)6pHk{^kIlxbX$RzXbW(C8{Jfawx(>^=uRbUbgS6tPH%p_7q0^> zNmakk|p|j273479H_x8Kc)+cE-7l_ch27Axq z)AOgOH5T+F_)A*jQ#jdii@A3T#^>_K_nYAcZ|63+1;0qvB)JWJVgK9EZKAheTz8At zB<&;jZovbz>~{rp^gUs~h~XWfV!aOKgCs3V1!8zn+usiz=-&$iy<6Du_?Qhp!4A01 z55kR#BK|4FZ7PzeyVu?kyKjbZyp6W~_;ow`7;ZCiH#jaua3sUxaYt=GOT>{r0ntx< zv->NYn9?2Dk&wKk8_ENDQTod1FC($tNjWGqa+SNv9o11?)k)t~tY@9HgW@8l+>>1O zF23l|m%UTcJ2@wdf}|9Blw9?G?g4$`_uFY?9_{CxJVvVi$oqu{Qgk$mn1cQzPEqv# zf-6xkXp@6B={uMQebTtr6_-ke(wi?_6?G7PL4{v0gxa+>w;YqBKo9>lX4aj)oI|O6 z89$qr$U$`mlc669pzg~LAaJQxL#cRKr=`>Qhl)ofV}|2c)*BcxFMIM=W2^1uPBn~; z8Z*wkk0rM$>}RFT=OZ50ovd`K(W)B_`wUL}0bRf7+sm$Tlr5tWv4C1=6i*wdarV@PX**tO!)RNd39gS)LoA(__GdwFyHgW& zjux%Wd`5h*^fD;==`>K6DCU%PFD*V=da0ZIc3fXt`hO*TDJ`qYj8c$Mj)RgOMJ|3= zP{+DlMk#(!$Q0xW;+4&4kar>ITWcyd7qLKZ`hFbTR~|?Y$jju-Qq;@vHiLR{RED>q zd04_NUh}zMvWCyJnRXk!9537MexoJTlWrtl1}b67Jk~_`%$Tw{xz%SN?bDZ5Q0Plv zeBiYbc`Y>EcZt3#i)&xkj3&dm&)^ZLHb@1OQjs;fJ{l;IQ?`_N1oFPzNMR(@pt=#b zsO%t&Y}6W(JKjJ6zzyXlRpTp>K(+Ag+g#OZEoWV8)o$=Q%ApL4YpAq08kg`aagFpO z1F6P~Tu9d+`h_=M8iTkMa|@K&>HHmCpCs+clM9L}7q>2>-=j}|x{A=BKDr>$$v2gv zzmPA5kPp&V)bEnczB(K;Bq-M8y1p-1)f z8j*D(z2^#X_6oJpn$ugL{Q@F6C#kZcDp}BvR7LqvO(`F!s`9^TTKOL}qx@RUD*vtK zl>bum%73Z_<$ZNT`ITB!eyNTskJK^c7wWk3AL@ki@9L!bZ_3PXVwS>;@(HAkd_h(U zvExLHkISEwkIkPeo}o;>0oH_A*FNCrn||X;2g(6v0XC80kSuA{PjV2Ak#1NL+cj zyPg>;5kZ}#Q~wI-=zIIm?6s$ydN0tr-7EQB(3=uh)zp zGtUbJe$OUpzHh!LVlBmYPj;V)&%gOPbTeNSTBNzLdY0I<$c>m3KM7licxESsPUlK! z^I?CK$cq>8P(1nl!%u3EJEh8jSeQ~J;!tUW6+`j6 z{zIq2mjyOS>=1hF6_2h0aRN_Ou5@gb6yu|zAixHQ_ftEWjr&P49hjfu{e7h!!eu`x zq}o?`A7bGzFu%8*P`&zVVDJdV_mwR4FzeqoCOO?UF_?4+OJLixPTX| zP!hhTMfIN3IG@E?cGP!vt#~S{2Dr1Ga9CjZqdt`{QOx_OBwKh(&Kj7!= zvG>Dgf9A*hxM3R$Z^2Lav2Xo_Z<{Avzi*qiMH&9oTlgpZ1hKQ=o8F7Swimu^K%&3! z&w_I@Q~jM*cJTdk+rdgCA6j`9o_njS7yhOEE!%bS-!D9p0-6A5n#b4&GEJPdv!Li~ z&hLNcSW|PZ4ou{WQfZqihOcQ%WccL!&e;38vMP)%?$$+ne^Vm5i7DQ*hUA1iy z(Rze$dlH-2TCLZxqQ@%s^EG={!Dbdu$1>jfBW+B?y6esFUm@1TcKyw)NaD1JHAlohQ?>UMZbz%D5LYhl=onXNS2gQhAZ=!2m#{Tir`K|!S+$V9W|^&gwRYt zqQS!jPmmJWFW(9-;i>w5z+KQPOGw$OT_UefV_UnVi_NcTRkgqiZ21GG9Bjd2Oh`Yf09=)D^bf^C);#{I%4|+`hhR%N-2;2&!PZY&V7y-X=8`Kgv zvLl6)1M(|$5Khb@oJ^apP)aBZcEF$0(~qwNte)YP*c0QzPDC+2Pzi31SSx{NU7UT@ zYv}g~DXB;o77;0mUhgMqj!zzp-B(+&a{caS|85c8c zn50PHGD={hH42?{JhLjI03;o%;35$oxy!C<8D$aBH3=OFD5>a=sroHd#G#eSU6Ta$ zZ4~!h3Ot{2-w*s(e$#&y`n-+c>Vzx^gI@>u+-)zzdO%x!fU4qJ={wYE)h>1tE2p?a X=_q8+TGK7cS?*EdbL`9l1o?je^o$Z5 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/ota_package_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/ota_package_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa57247e0ea4bd70779ce4233ea6874ae7d5471f GIT binary patch literal 12976 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 MwXR`iwSeIHXTY3|H2?qr literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/ota_package_ota_package_idchecksumchecksum_algorithm_body.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/ota_package_ota_package_idchecksumchecksum_algorithm_body.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bbd69387efeab6a7661fe08fc5c8d85e8b4de01 GIT binary patch literal 3940 zcmcInO>Y~=8QvW($>o}o8w?mB~!_j zd_IxdXg*G5q$Pim=)~~Vh!2(A`RwDNG2>3VZ7hdAacCuZTja5BV_qtm#S)Y@_o8vq z{&;Q9o@2>mBr_8cUp|foa)jj_xiG1p@m^A}QS?C9`c zw(eUMzQ}P%Y&y_mCx7_5Aa=nMnMoBHDR_Us!%1Kbi3f=pPWr7lAGP&2(O@8zm2ghS zxsU^ywXiJs4(4~dF}3HP3I-4H>I{u^;1-8m(yKHa!9*o-dmeg*zAA2ts;C{gy_&3x zy6}&jL$~Kkf43nT^N|R|wIin&h^AOVe@!fl>*$-}J#hp5l6YVI2>r6~;M^Y<4>nBn zEQB(r`KS~GiqZy7q&&B>!cQ>}yI}{I^$7!TB2LWH_9J-zviJPJ1 zr-tBUi1{pnWvudnibk!{GmmpP%Wx?W611s2a};HhC{6cU*8GLHlcch!AjrBggQ?~Z z(e!?SSKmS-+?f-Wtve$c)`YHX`fQ=$g1SOieve0d1mROIo{Yl0*OILSSDn&IU zxnS2s$0`{mS!8mh$f++`;c1!flmkck`1Y@p_U|-8ubm}v-p1-=Cszacpe?f(`h57e z)1==X?<0M(2dz)VO#D3e#r%$^OnUb3*JY5`~r;`hg4Wqed z!#-Tw8t)f=7(y-+hIh!KH8eF=a|3s}y0F@Uy25^~`C&0oVD6>D79ga}8 zp-tabTvde~Ub?D|&c;gFG-ycSbQiCtK(95XzgbveL0x4J();b1^Ansr!<8@ra|7f# zbpKpt55B=OmFYh=|8Jftv!2xcpS~DJfC#(f2lmHBcXX$BpJp$jG!Y!_1kni4+9qkY z@AA<^8w*%{$+x?CCbw5u5&WLktt*A>Cr>I0>&yK3Ykap^{Z2a@`2NT=uoJfo?K}=nob$V9-r4$VrfJvzVdl^(NaI7A z>H*Hdnksm0%qUi>(>q_=G%6FhL{A|8SSpi9+!Xk6k;LXT-3bpU&NuN|95+A(;X=L! z__-&Tm=Q*>Zc#URNc(}X^&EqK5Yaq&#E%Uc4a|b+2Wo}bqF?9oqRc>4LZd=uMP-$7^yzX~o2YaBh z)G~(9%LD$8-cU{5z}yyI8%|C4)+^6lS;7^Wd|NcI9v8M8>0;^h4h|{Ibx|KkR7*w` z0ZK5`Y!OPU!b=lvipnS&tLtVi|K7`E9(b}cjOn4LH$6u0iQbv|wZ&!~4%xsIXYS&3$7*g{>y_dTs)NO))92^AUj-xRM&O7YzXXT?k?M- z{~zoem?!{ovcvni8S=cpD`S)jk&+z$Eu!?xm5Ta+6e3Gd5kt`%hA&wer&Vl{>Vi|k zP(BaCA-32g3Yh0M-_bGUQ5O_Fa}51U18Tc_tXaC|le1`hn_{*qCgn=GDQzy%Ad_L3 zlLo{pcxUP9m=(9Xa-EEqMI#K0APfQDla%OY7?LQbGj$j^j}a$Sa`%=f`;-2}$dE9E zR4x2d$ltf+OHtF(0F%lDv5`l(s6L_Q7t~PTo@;F3LmIu0SAU4ccRZJQp6|W#s@|)> zW55V62wZ>3|EZ79&H5af+H}-MXbPsJx=BQ>3>drO92d)!SmB;1HC-dv)ue&P{J?j8 H;M9KsXG$ri literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_alarm_data.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_alarm_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87942daab0da278dc182c3d096ec90a007ed2e63 GIT binary patch literal 5286 zcmbtY&668P6`vW6q|vN){Sjy5wd2rg^x;rsYN|S(GR(`yCyniDFyn z=S-(8?CY&mMgzg5xZf8_E7pres04cusYtW6kZnn^@!`8$TK85P4Q<}grZ?21w87Jk zYM@<6k#q!dN?!32n$tg&Z5{mHj|Whnpf1GSq^z_Vy|xzzT>rBfZsc z*E?yqp*{~cH-$6^NBK_5#imH==;nV3^;^vjrIS|?g)6w#KadCuX0ga5twP1(4jBZ$ z;&0uS%S*h>Jzg=TB0tX;c=fT}Dv2^*U<<)Vi%$NCVrll&XXgNJ9@fCjNvDI4SXZh=RF7b2x4LpzWZ*Yd^asDQM z3(phW2W{TYPTYnuu7x_h8i%q=nSpBFx^sP%c%)b-4wYiafFmh`j>gJmdP}f91u|0L zs1+pZ$#heO-Fj}(YblJZnc$!j4a(>2hDkq+;zSpzmn<5FVnjPvn zx+w49{s_1F84_*}tsqaa29bxkkrqtq4pG;)q3_?<6p5eawMteDj3O$*SQE#BDOFVW zDvT~bgGhB`)Qyr*r_!iKmLQxgQ{o}16*E_fcw=7MQ%f$P%fE(=A1kcHMiO<>2Ih)3 zQn@KEHAM12O?rby9JL$0ZFrO9QvJP)4LA>Rp%-@Uk-8hY9guGbI&lP}HH@5U?-9Up z5Mm==5E2(nw%*&$ydc0Ubr5_PSk&uCN>0hne;%ICZ{K#m8l0I?Ykf392R?FqQJ!ux z_%qVU(7J2EF!taNHw9cEQI)jK(hcOX1ZL-*_Fsm|B8mKA`;V-XKyr#v}EMPluIck-2VF%(3GzkjJeT`OCwh`u>`2@6RKK9a-_-sG&cEufBNERCul#p z`v2eQ#=`IU0c?bm)?XmW=2@Q{`vx@{>(6mo`vD!vfiK1!*gxI2>ZK`9L-LU)Fk9RdDX6YT+Ib;T{BepDv_q*EM|vnDUUIG@=ujn@=Fx$+_@7gw zp~Jb^Z6G&;L31P*em}*9qhvUU2xi8CdXs`~}i&rpCo2HhqE z{3|k%^~l!N6NGqoon8By_34K{bsjm73L1gk(AjYwx!N7Ny13)Ww{%gL=!o{%8oE2q zj*ZRJS+nkYngYNAden#R6K|I`)x4fYR#1OcS1{7eM?Ud)t;x{{8b|#Xbk+3#$T@e$@hpCaCMYe<1*aq!N^Ci=)jm^_?BMBWopN1$(rKjTqH&-lawL|(_ONHZGo z5VwJ^g7?|GXc$s-Ix2GfO`V43o8cviUGcX^Ra>M zHov5J&rB#y?ktKx?IKL=P63y1pzU|K6)~b}FMs9QwZ*KUqK8=p{Uwc2+2Y;_D4;D$ zW#vtQGp?4IkApK#+93|anM)yDR_KO3Nx`dmKTb5zU{=g$L2uP>n{$yQ71c^+Tgys_ zm;15KTr;N~WW@(z+!tBlp4gtoOBVPgZuKoBu5-%qZG^)Jj~%=EU*BEYE0vt;fBcef zAE&Z2SUJ!VGb*PK6lP_ROU+ls6KB`jCC=G{`XuM@i2>gr@HL?a0mjFE6Gw~ud{ZlA zrCtxcbXM-+G|>%pZkIVeEGvN=nDPsfj?}Z{3{KC*jZQPLM-i=}bq^|AL}dUzO;i?BxBW;`k_F{4B>7nYcm3l?p#cB;2n+P*6~IGlu1Fnp^C;~TYt{3gLAISC)}DhQtD(QsD8 zAR(u?l9hr$+z*1kV2Gi&@3?k#u2S=kGh&RDYK{pI`B-~P38vyyk0-1d^HH@U3)EM=qK&KI_EKK zYmt^!)b48$(BeFfy3E`2l-uSAm6epxSnN}0=A5dAC6_QrevgvxQ}SF8lQU;Al7LPq z>IM?ea&5oZYKjJ8sourdEP0F?=oftt2K{4#cAIODvBNr%`rkf>aB(1&N zrDukY#nLCa_a57#K&_%EU?e~fZ7=-``Zw&gr<{E&+NQrZE7BB6Np?eNXXkr=@4er9 z`)1R{Mc=~j=HDK-OD|j2KdCYKbJ4hrOI<+0t(L`Y?!

Hg~7xn0ujBxMA@EcOO~Y z74A-_HzU_m$)ZGQ+3)BmO%&To zKW92+VP9{hG8zab#l5~zTCrX%LM7P!NJW~hg=|ZTjSt@0(z>_WXlV0WL1!FQmeXRrX%}f)U}v6q|JPD&*KmFYgCpCfpE-kf9cwwYOIp0aie~8R@Nl zyWUB=4fT1rxhbSUII4G2E;dC{$29*dsNZUKsGR&2(YTCD{R4%tU>1u^(kfIe?vO$7 zSNxsZa(RiDxyLJ}RpjUR0Ehy}4qWea(mh@~W%s#V6^CZ@I)&Cs>InJwQmNodvV z(9F?~>JF|CajBo9;P%i8@)ACXI?Ro-U`lt0zP>G&htyXbVhpXGqzc)WW~TJq7sZXaV(fp zMRl*k=mIo|R7XbLC<%2cjcQ~G!pSlf9*SBqbCrlU=8ZkEwaylKW~h8Z_dl-RNy2nj{zN?_Ovic!=}8uydEx-O%lTVnfi0BN(k=;xoRXdYdAL8jeB1qcaAroW_0a|$#K`fF z>U5F8pOQ|7)*TCmu?K&=ArJzIs-$g}ZlDeqnB8|eeig}FbWmA4Je#8@7Rsb5eMcj;?^5PgZiOp-co)V=?-e7qaJjvFf;n9!kBM*2=FDt|C z5nF$={+vqjbFVit^g@IIqs4Eeio-S0lqUhU=H!YX$>(X~I{J+^{K|nekSAy(d$2nu zz{tv_4r#zBET#;_{EF{}hUO?l8h~p!FpZ6pB#49ou}gr-Igph08(IYDbbpd&f(#h3&87apRRStjgXn)6|Q z-yz!_&WcIBH05bXK8gh96*ol+>g$nqo{JQJnj!_gq15vuJ(LkIxYrSMsFFUd zU(leT!)vpzf!quR&5>OA!xR^elHnjCn01pZIBKI8p}-2H9Z`U!pMDuo-!G|uh5{5Z z=rSqbUr~vyhqksJBgMPp?AlkYPe1sX^U!%%&`9it&W`iY)$Y*M#T`e!sf)TqN3=)Q z(A{x%Y`i?3HS3w}@bJ%+l1gBakR0PMnw0l#8^Z{U1v zpu5elDBm+1N>e+FCQ!RbQ@c~Z6EpYgD$lcLECN z6{WKBrob6j%go2Y87J)!2ja}76fP@t!=9w%)jS_38fY*p=DT3F>bK3gNRodkOp2kZS_!Tbo9Tcu}%JFTa!$^-EyZT?>UD|7voa%r4 zl5ZcUwli2c&=NB$rwUpDP%l9yKUNohn2niJge;#4+oOv16XxdCfB^NVFBy+*VYz-GvWjYa3 zkQv%{oV)Zr$C+?q*%vI@VC__Iv9x_hbZ|HcrC|706UNtT1^I1)OL7uE;#Ckl$+O|C zh($t9aV0ASfw&h0f58$%Z{Kn4>RhGf6KBL2E7cqmAjVy%nydA@V;&p?+k6Wk=sBwQ z3H<)IG~r7`5d59+(WCqWu+gNN+r+PSl4MW9E_yOQ2oUx9G1aRDZ-zKdbp==Qw<_;@gft|L*zTSW`% cDW`~;F%J$Ra;}_96ap0)5O93Y_7F4v2Z^{Pj{pDw literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_asset.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_asset.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7e34ee6bfe8e731b6a860dfe9b507bb77441bfc GIT binary patch literal 5153 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 b31Vi77 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_customer.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_customer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..208e227f24e229e59849bcb03c099015da87e208 GIT binary patch literal 5252 zcmbtY&2!tv6$e0&1R+Y69e*iyl1-c@Wu_*bcrxv16pz#RV|t<8$ermhO%ag0l3#zIGf1b3ge^6uca?!YoTU|oIt%k*I?zHWOZJtiUG0$8hchllI?mo7- zE8M+YBhQ^ptCA0|*_P!qTz7V&?zZ}I97@hUy}o&eeSG^Tz8Sd@OBQvNmi?BF;;v#l z@s~`;EbQx@SVjZEq`2P~N-NfDi%<#nAX1TL8zI|~V(X)KceL)U*J|3lp-FG3MsbbD zEmgy~kfPfXs40Ch>_xSAuVk-hn9}cvt`6zFtQT&Jjaqo6%Gd?gjqiu+?D~h7-cLc^ z>WMB8Gu0C<_CQF573=JS>Lnw>Cowi@>2=7l6<<9J#7wv;xx8d>vFLIBUOe@bX@FiY;Y&Qy`$d~!bV{6ZDc*46|;>X6VB46dl&4@32jGP#^ ziu@IR(u^#LC5)UJw~G8UKVwG9qKuKVS&OgnS07uAWqyvI$8&|h#$U(t7=ME^JXiUf z{4G3>b04&MJ6XLAV_XY$_(@;sxFh61)ozLYDHbd7(GaJ5XlE|vw zqM6x6bqDt+xYaLFaC>M4X$cQR9mYnPGo?F3U*DFeht!uJVhpXQM1d%KAj1bCqif*$~hI*+2@6zufR!}Hng+wQl6wP~GJv-K@R$MHpV zy2;p2Ng+e)t_7pmgM*s_!H-xR|uOw$p*jkeGt+x)i!E5wPyO>>jk5u63z* zdt#j(c8Ku{p4hSk#CR;@VJwsu$EZm(-oX8oxLoiCr)H3oTrC>SE~;nDe@dSy!|9Br zzukN>h4`tj8v%MDoZl$$yQty0TByqtKw5E9C6LtfG;ss{MiYK%q5b7?+Q=S!J+^%2 zUEkIEFTIa3{{#al1WwwWj3Zx}BP&t(r__(U!kXg*8Ipx|m#450G3l$ZwX-FQl`w1Z zY)xwQthIQDDJL3>pIZKq^mTd0AWZFTVi?7y3FcGZXVi5X#gW$j!`Rw~1LzBbouK=q z$N!(ZjYS{%K0bSshF>DN<{6&i_!bQs!@n`(?1$kTY5pf;^B-QgSSzz6IJ`2Y!r{Kf zyFH%}lS-+}vk*J;fAcw;;sf>dNHs6Shu=@}p-11W7Y6!VGQ8YYM=+sG63t@*eawGF zgN6y`7cjwKIg$qZQ#3e2f<+uK%O(kM#6B-${WXZ1S)W9oj{em5YwDk|KE(;TO``V~ zR3htD$oRa~`?c9lAQd=g7BoUKi*X_ShP_d(NJX zPo=YA-S;%5c{$9e4&8n4fIgvVKdmgG|6^UkN;h4(?;lu`tC1RJ^Otnl%>Vh&qFF%W z0Zsl9_Q9My-gRq8>0^HI&Zj2PNRyQ`Yed@J6H-TDZis)zqn4hDggJ=3iCd9oG%_D< z178X6vkx#Zq&&!}Cq*3xwEl^cP%a&6E#<3NQLz*I;gq%$Z=)S{nmoMn6>Ut(#A$2r z-fj5MwTXj8b+l!5qaC-xwz`5!y3Fjn80kA>q-!{90qt?1&aD~jYX1Y!JwVrl9V`_6%NK#a2o)k((TM+E%JfZq#xz&}3Nn|xWMhnPw(DfD`n zrITV0M}|(QQ?twoUr7Pnz?Od`;Yd3x&fv^E*qAeeI!j&^IX!r65s!iQEdAW^g+cHI z3%eZkv{A9;2bel9j?#gHWD0^mWl%h4PDYi@nu(?4UPgsvE4Y`f;a;jpXFdurL;J3C zkAAOlCLCDy1&g*=GuAsSZr&9w96>@U7=DWh+czpX`8`5QViG(eRS-N$Q{NzY#ool|LUE&8fI`T$K|fc{l8!C-H*-@vh&ddN~N_Rilw2v=g^rn+w>qu}mHn zHTzlw`HOT1Bx+%+eqq@aX`pHCf%Q<@rzT*e~#Ln?km#WOif%^bN%06L7Q8z?-> zwH?>-9Jr)o7ykXM<`$&A(79i*(C+X+F#F0Y2NtHrM5Hn*Q W9K_;OIaet9DY75n_@3<{T>K9Y${^1G literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_dashboard_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_dashboard_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..605448d7f9b322ad7f399255039983aa1fc1c709 GIT binary patch literal 5418 zcmb_g&5zs06(=c5qPW`i`ZNCSIChh&s3pfn&|_Ag ze8XgZ-nVew`p1)I^QdKgMV-mZMduodx`c{b4U5~{Y1<9k+?|GF?zu+prp0sIeQa@8 zxLdhKo;#~nB_FQXmgO^CcQ&GUUHvo(C1)R9U%kWLzx|sMX}Pd*V0iEE4Gn* z#&p8Mp591g)E7*O`#qtwV%@d~m0%Ad6=}8{vJENL-g|pP>+Vvmrp*(Y^n_}Z)OgZT zHOvbs;+8;5>5E}Es=a-6^mqo6UPr__r0243xGt7!;ngZ*=UJTG50}{WcQ3t@33;n4 zVo1zXSG3pzAr)3EvCGvGLoGOKZZ0trSV7|TNN@C- z)mGA}sn5dobs>#}qjoFdVqL^lkojN3{8qh1_2iXD=NgLo7b;=FEf%??kt$1ySVleBrURWj8$G-7WD0<6e<3@`Gl^7d~bVjeA9Y zm>)4Sb7BrNN5{P)KgQoMGi6c6%<)l=pWr7STa9^sil4@PfuG@LaX-Mn#~JR6{2YH1 z_k-LAY%ZinZ^IcYp$=CtYFACK`EsBBYC}yh}dh3-^nh%UIO2OC~2ZAYc zl!pVx9)LuoS~BWHai|k%%p(g>P!_53P*w7&t3-Qk*4$G|E`a2l-_(Atuq$hE)JkgL z6|E(5U0kV&_<@>?47GODtaUdLS>h|zcP`ZsNW{f%*t$n1ujyt$aUy87BRH;R^i;!J zfFME=8~soXaT(B-uXZ<6FF-TWLGUBUqfVnLI0ZZVdAL6>zU_Y7KReUB)e(~x;^z3G zHWhOIGqTOVx@*BncK`1;1;Qdhm#of`HMFrMX7iqoYX;sFo0p`}J&AaB=d~CS3%Zu1 z-t3AcHeOdv9!w3>Q0$QI~HRSu-G*P)H$eVw=#|$24>d)xI$Jatwo=aro6F zp4b+X(c-(X92;R6H}Eo@M8q6vI13T|;I|J%%B0&Y zh)~+_Ynn6=Irk!n7^(Kf$6u!K@iMyX1rD=z5*aVU>{VcK0-BFtL6(?)kll*s1++%G#;7+zvZU9$x)D zF{U)-nANY{#^zd?KHyY`e5=dtq!qT+RW!1-hW*~+zBLy21P*=>`5;8koiGZVFv73l zJZ{8y>t9nYX&6e=I)yGIcaaKrri7PgG51FlMW`s-$G&y#%6ytr(ZjR^dP!?kIzK#Z z1@t;oX>ncPOs!?=QY*m<~m_lQgUpbkCPLunC3GspjN%6IfF?uQ>9>D zfoTCbd9STg*YLE1H2)xM_e7ezCpM?$B`^FAMg0Jk>l|@>8|gOEZ^thG*LN3&y@FHz zk6-ZZMd~~KGcWYUF0<1|5wk-m+-AGuiL-5O6ZY(WbrO5{tby+y_=3@e65~$|CQldH zIjWLN3*9cLbXx4<)Y1uc=9?LDEiC{bVEI?lkW94T^iS_8I|z4)KFX36#Q?zCB3MJ{ z?4FR;Ww-FIBOyr*$9;$5nYjcbk|Q01Oe&dmG6F(&pB-F$~2 z@iWQZB?WfA%}K^s1i?Q^MtYS00{Mur;?{9h4v`Jwu!E7*4+2EPUYpwGAfV?BXNs^> z(t?-HgL7k^wp!HeX%WzdUBp=G4I}8LIi{rrB{TxS)LA`)u0hNdERsK_>L*k^SH`r= zd5^T9Q;)iV%ClVCaUIXWUUlrkzn{1KqO*v7TJmkjpMCdy@090yZn-#$9CVD7^wBbP hq>$&RQOKZTC}xR+NSztyDuqQwPJ}qVXM2bv{{xRKTWSCR literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_device.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_device.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc81b080082276e14b34cf8501ce6857a2a6519a GIT binary patch literal 5186 zcmbtY&2!tv6$e0&1R+ZPh%JA`=_XE-u&qfao=iI$#p5)xJ-yIwX_z#4fR{ih|0;Uh{jdi>K`bC1zIekq*bU`+#y2n zSNzg#xxB>7+~XC~D)I|_fma{dt&%A7MZWaN+Ob=n@a|Ojk#VcckMd(?#1}qBj*nYq z{t7=~Mi#^ZMox}fWxmW$nUSifV&rt*;%E5TM^&;OCt@6k< zt&1ZUEsxvl*b_>3hTlJ^bas)2tP3r67#ACH55^n!*m`ED%~~Zb21W~&V628C!IU1V z`yECRU_VxojJt6!)QL2DktIkb%T#zMYQ@x5qO&n??6D=6Fy&tl8b4ETz(y~Qk_PsQ zHxjuiE;mH)zM2dIjZWNd^tTa2dY9|(UTPp_h>QI&x=Xrl=ypIMA&5FL7;6|g)&3(u zydcCzzJMDOtoOH5F9`5D9RxoB4)rREl2fv?KM&8Rw{N@O3{M@@XFXpXAtsJ5s?$w0 zKOtp|tUDIyu!q09ArSJ&I!Vne*+3muKeg#}urj7g0e3|TJ&*`ew_k1tT1(f8)Z2Zr z!X}+yy!m5WR)7_cMLY~IS#gA#WV)-kpOF2Qyx}WTm`R?9#`25mxvf8;50bIs+%CUZ ze-TCanP(g5{SdBh)b{Pge}?o;c^nvPP9{7_J5K}G(Qh>1R}N)d9;1yWxz2s*|Ks~5 zcQJ%da899al53(wzA{HnGT5I|KXM0a#^7@lhjJ}XVi_XOZ^jJgOAZr%mgRg!#&q5~ zZ2gqGj0MlwJ|K5fo-*h%mQ9?Z_%mVW)b|N>Eu(lY$A29A^T8nbf>0;Sd(yMN)m~$< z_kA26wMn`cNTzvoQ=HzQK|}ZXDYrfd<+-H)VNCkLg@@^5mimM1G6Oi+ci3LfHiJoZ zH05asocp@@P)%6@_4P?9FJuL~Q&!NYuh9#_e5MJ!%tp`Qze>`~+Ml`0%W!@MLgt*4(9`jq`hHFQGn`XQpxdNve?cX-9@^U4 zMOt>p*|XQIPe1sD^U!%%&`8Ec&W`iY)$YjE#T`e!p^Lgi2dYQb$lY;vYe+B zCLp^=ExS{wu8aqZe-T2S$Ww1WAP)~IxG|GW~=7f7Y$O@ZU6mZ^_3 zE)K;Z&aSCTIapfghJ8s%r+Gh)AW&ag%yz+SHE5etj3oWkO6IGTmXPBPIy!aDo_3HH z?}wd%NDFtx_B38n{};H`J1AV|gyY*tW0BT6cJ;r$yR_dbIo1F8CEq?uZD+VVpN1KI z(+>&8Cn$Pm{;=!pS$kw{_OL!_ZTKkwzZKxr-v|2f@!aIUB0G@O3Tdg|$1I(e`$+%0 zq0UH|6SUG2ECXA9MWT^zmYm_qS!06}dYs*dhxC+SBxt#b@UIpRusVQO_DR zTfT>>^I|6*9!R1f_)`wVb7nH8e9lb#B)2l^BbMM+wuW1&GM(Hgu#D_G&RzP&#hGwi zIS?$~VC_V2v7~)RL^w`_QZW3Q5_YcF3i7*zm4qa4WKKcwI7@2NA{GfbWg=-Q2*kZ0 z_%oImtM(n&uFk46n>8cDSe+)rhYWX}YNpWdjp;uOvpKC3?hMlVg#6%ln85W!5d4k6 z(X0GF3p Q6!R3Z2ROcGdk7N$19a&B4gdfE literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_device_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_device_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33fe3d649809cd734e76f50cd4d8a9e9e79038c5 GIT binary patch literal 5319 zcmbtY&u<&Y72aJg$>oZYWyg^%J9fu$nv_LMIx&J4f?_z0Y$F%ija;B$nr@amBWY!l zOV11)i=|F-?>+VqpcY!7HHx-}wwL||{Tue$Q_j8>ZPV|~iWEgrQk+oQ+4;TSd+&R1 z-)u5F>s$EU`}?!zrB^NMU(^`?xoF(NrLLpkR>R^pcUpGCHg~7tn0u~~yKC_rcb{6^ z74A;1k>}2;Rmq1dwq^MYzXuy}XI=d$2_#^SG zHLFq5uBp$%^>rZ)!eKp1xL6mRDyI2gLj6`fqH_F~N8=VQ^-mPSf>|swNh4RXxI+fP zU;YcX;qn46a*vlxE6=a;8D4&BHwvQ2XZhSyYsYSQ!rLtIQ=?Xq&-2q}#1}qB&Wu_` z{t7>9MrOneMqVAYihO~eGb3eD#>n|$i!bsEPp!r*zsO(1eU4w^mvKMEzrz{s^ZW{b z9rx4R2W{R+&)kPGRze-Fh{tgxK7v~Ns($am?Ij|TVo@tpilG9MBn(O#X_x5@!S*!B zNQ1*su&gVSbs4s+nMqd?SXnc{!6jOh?b!}Hy|C5Vsv5iX=UcJTpX{UfGKQzqq>9ZLtN_TD7Zbaf~D2N*-^(!fEhFu)wN-WcT2 zDh^!Jx;Ajp^0>WH zp^NffhfxNY5UWVW?YI-_L>k@50;H2gDm)aGeCjIETAMcZ+>&#c^6%~1PZXT7)`_E} zhP~poM6Qb)HPLyj#sfmF6*p_$Ed-R#jp{qsYlt7>S~rXylD=!Y8Bll#qE-y6)r_2K z?-n3-5Mm==zzrP(a`S3;EA;|YV;ux<1B`kNMZqc9*`J5|{^i^5SN)5J6G zepIK6Z2p3@GO#u+*v9Vv{;ohAB)XEmS+a&Y++fPalTpm@nIiF$6uKu7y&k;$F0`J0 zOHyxj#S)wJj?qJ&+p+}QxXt2bjFlCqs7ah&#`S`TUGVznrr;;}A{rn5s6KRr7xdOL z6d#iIi`B2I7(a7=BStqwJTR*KcIr4m8+CaGcq>k(43d7DM(&{BXv8la$p(3vHnRJ_ z9r0l3aNnK_-(V+0hA}=+Y#iqRnMuAfMP4HHkE#DGim8q;2@+EiSVaU2spU#INcnk!@;!~ zDGv4>x8L#97*|bQo`>+mm|)&|6U?B#E-C11G2;&t%;?gq?IoZdON*D?>;z7fNvdg_ zp!fbSXwY!t@{yb{cupk5?~p|%4hzrHNG0zUk~29$B;`)_`1Qj#pO$Z>Rlmq3=W6*XFQJdq3D={$g8*% zX+|SU;x_P=@H~4L0|UyLoO)W+NkHqLJ1M2#q1IAfz>12U+D|65oqEfyu-)Y0&0o{T zlyEFq{kQMKn^q2-N2+_9R+n2z6t>h&RI-I;@1wE4Il{V#LmKd&2JYOVLBD8_ui@-$ zu)FmyDGf9mN>jUtCSbeBU)vMNryZpE$6>1{(%eI_HHnu@@GD&EdnjDztmE5AlaV$%cKLt4JGa*=IOYHP z1>c^hw$s0Gv?&hhoW5Qd-=N5v`NcD5*V-l4+5PG`>+t;nA1Lstp$iE{-vms4EwYnO zC6^YuUCh#Hv5Rv?JJgwBrUbII0Cr%@KazN)pE;+$I2|}<9l||Ka}~Kh*lZD-f%rUq zEBVY|_>6@ej(XOp*z#RWofcE+kU~-g!C!`8JZEagHJo=Su9BM>HIl{PX10c#sUjU0 zDbNh;P3Iwf?s3K(S@r~r*H|;r8!TyViU`M+Pzr`mIbrKgB`3d2cu7zKNYn~~=UIZB z=CMe~3A&_(AP|p&;ICL>816f+U7oJiY~~?3Mrt*u2gvczDQAlP{)h@k;WnQN2zv(W zJwku*eN6y6A_)FL0O?WwQQ&A+#jWF4IYZKS!ZvzRKL`-}dM&D#gMc2kH&TR#k_h&> ziftRSI*-28+l!Z5=4_P~l+f__i4%23S3{H=SR{Wy#Sf|2m&DY}A&o?! zV~e_j!n0i4aUIWrb2@h6Kl?Sm=*+`0OTO*+)9;?|UG!YfEfbvjA?KXmow$uq&TR^f`H?Dwuiv+fBvm9iU0rr literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_device_profile.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_device_profile.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23bad7d33c9b3e11f3c2db735d48e9dd5fd115af GIT binary patch literal 5418 zcmb_g&5s*N74L4h?RJl6@}12$l}*^ih}hXgE6`{*%CeJ0T%52IB;;l3ZFkkobkcS^ zRpo5PI1Q}E` zbvi%qTX=5&?P{Kz*WH&e;tuF|p}={W5www`{@ zbjrfMUQcB_5KM{(eWA2sy+njcu!pgVHCqbVx)iG)yt}S-Z?VzP<_&FnLp@F#JdIQX z<3fsVBv4cOQrL?d?_L|do`Iy_5nUb9ds#1B6HAToTAi^AteZXv7uk*XFTa-ydAldN zkeI2Sh}c6R6=p25EA`7pg^yA&iS#1$SWU0*6vPnR5?vufEjVj$EHV;ULE^PoulL*a zDD5=V=i%C#kVe8$JxaM)6Wuz<{I6hss~J%~`4rK(j->v9OjuYJi=FxE2R2O@7prj>h>p8#B}Z?wR>_KiF-9dATjM}5 zWsd50hp`7B5vxeXowyt7R2uWh5)_nW$~0JAO?rk#61N+@4S1IB)%tsv8*n7zQZJ0|lgS&p9gv?0q9n$`HH@BW zy9nS!NMfU3zzr?~z=?oa?`>pW5a6{s2)+k-)EQ(Yr)1|p59N#G+wRwcb2H6bA2EsG zH^&dvDbeCTC)*6IdlnYS9{lx|fLkQ!lGRzdiaNH$Y~Is;&A^*{^P&{GFX7Mbz7Zp0 zLC>Pp8$GeeX6%>otDf1i0tHaaqcCfiX9uWBC|^Q)PEap-gHy8=AzdRP89h`V?T+Vk zpc&kckolrM{TK_Q zDf`%DHy%b4b4-j{`>>hXdt+=dt#I~697T<*B*a+Kx1BdA(BIZcLS%{#6VU-3AA}-GM5jzFj7Z+cQaj|paK1SM& zj-AtUjO^^&hvmzWGHIixJOL|=JccG-x1l{$&s`QtgY6KThG}Rdm@49A@q$GG2w*>%ih9G#|l&EHQnMP~Wep ze-|vsvrsZ&=9j3%)?-^+PZ37mbGGbd>(dW@<~(*D7c_#$p|j~ccC|Znb#c>?Z|kBi z(RJ{NHFP(fO&f=>vt&K+GzFOjP}GO+Q*Vn7=e(b0R?z>Uu3)B{&wT1{S(CF7n2zY@ zbk)%RbZ8M3r12n4@iF*-rigdl9#ZgH9K7?fiD>fBC=XW=s`Z4_F(4h{&v+c^UB0sb zl~<4ySw$pOdyD(dSlpAi_(9}D5WR5HC~(pU zzl!^~5#McoMX{t|C{67&nvmQ@DBPJ6UY^6)?~oLsqG})i+O=!*SwY2*vI^)W%~9F> z_H8Sm<4k4cHGw;|mYI)>I&StMF5sC}b$lD)Ho|YmuKw3|7q(j^ zr}`hinc>&65�e06RBv8iQWuy~cVQ@zg8_B|2d5)?|o@SP}3Zq^F&+axmSN-`40 zg5X&mS!YE|5^@SRSt$s_gCO_w>p4;R_>_b$Ja3VEw1 zx{#Quo@lWRAr(d}vUjVOjS3&en53l_p~q@`ZMPt%!%fi@GSq^z=H?`;(#Vx8?$CnZ zm;bffaCw0jxyMVUl;;=u3@<;j8wFA1vwZH6wPiOv;oU9qW1~`$ALl1bi!Xe%oE(*k z{3U+Mw9JSZw7fhj75O|rZCc8rjFvN5i7)V19$Af9ewM$A=Nx~HpTqMQ{|;w(9_Q!z z1w2o1AGCQrS-6eGSPpf#EHlf3u2i{X3{bdO-Wk1MiG7M=-QYyP1kpN zHhfbg5LCTIJ+q7Q4(<bl;i^g zNGTX0ax9pDq`XsMFabRx)sj&s>V`U&1|nI2lCnsNhoq8ETqWA8`?Wo>xN}Tfa4OM*xRH5*z&jZa5l%Rz%W(d_c9gnRo%Rkq(0IK`8Yql7dsP)1Qauv)i}b zZw42p;#|!pYQdR~F3QtQOn6El4XwKtR?Hs!?WTaQBrX&DEM7$(HZpzwNrz`RPfmML z3f-4*ba!5OGMa|2MX5J?Vv$WTq|qy%*s=s=@R-HJENGe>qax9N3HMX7fr2+UH(e>x zy+z%!i}IQ2Jf*LmF^Y`lU#>hSXnyKGjBdRU{=}gDtw41&r0Vh{l&Cl}++EUVOLSn~FCf3jP^L%H(T z5m$B(JOW^Q8MAwelsCKUjxg=P>>0-~XBO(0Q2Ch){>lmh;fn z?$FiwEk|C^d0n8r=Ob(AZaG^vKIYDnb>Gtz$>z|bI&>d<+w_r7>uF>O^&jXGM!M<9 z$Nsi8J{r+))_+EqP5++`E$RhnJV=v&hPb<@0gZp+B(z-!wU+V~jHuX& z{a^y^#9L~IohA>j{)#51aA)2cT)7Q{Ti$OsRo$7py3~$aVOw2ACLM2HFXZ-QDVU;u!;i!qk>!in&MP5p)|R(C_;J{@pflI0eKE>zrn4D8D)F^8`rMP zCOH*7NJ{80X^cu{ceZu`efm^VToc&DYnk{s8Ng9Oh#i08QmC2aI$=*z@NM3YEgFza z^64z-t@=%~;gbYarC>gnNdbX>zpWG3%xMQnej{x6MUuNGHYeq!mG~uY^)?dMIpz2^ z!g+-Ej$Qt*@6PR%3QqYye!;hoQ`s4uKXgU*Ku;$z#!|=?r&jXV*|xTcgZ7|0&Ow}| z;IIY9COs%JI^Qt+0FiFkD!HW4>!FuUial(PI-yS2XCGge6hIP8`8(2*V48CV2W%$N z&U?hqB5y_h02H@~;t>1{9shi0MEQ(`U5otk+rGyenGRY=u%V98!ht z8 zJ*S+){M`{hripJ3K}dyEy7x$l-Cuo@vnzt&FC-_u%0EO#>RfT_xGEyMPX9L_g?@BQ9; ze4}J}*|%`r{M)1UZ%sl0~u7a?sIH5-YZy ze9m;j!hzmSWHb~^in{}$v||0P2$f*>A{A-29qoK_k+VqBclr(tK zQ4Nd>DdLVmP3a3^KWe;lIe$IFltE9#I;8iqez+yp8{y?TW9L|$+zr>*wf8T+n}NL9 z7cmes)fXLhPe_FoYwW%HMI*vT2{!5IHOR4f^XBbqYh*%-b-JNa3>BD1!l0gsUYXt&Y^*y*y30pl zUwxTu$*@U(E!E715$>&t4c0!ftoBZWtT--AL(A=>4CjZaYc3X(5Vr%}ren zT&cGmsvs8kb-JPx9d-lJ6=X{)UCP>IPD&C%tup2|F}1a9hOUigwtUkhQB|`;GxLk; z4(^X|t6!qv_Q(pd5}t=TNJd#Or8`33z?Q2c>MM>ghSuvN2d&ZwbI^KwR6wgda!u>P z$VJQJ_6GKZ!kuAlTH)*h3t0~u>@qGkqZnoz#cU%p(PpiZ76YS$N-$Bvkzh^>)p3VW z19*>AM@GFU4s{}pR%8is$ubolidr#smFR9R8hdQX6-@cpy~fWJT(1#Fouq-iqRm8Z ziAxO;-&51>-{?l|Mt>LKBfeCB_hJLlLR{#FojauIhHeKG41!KK0$&Xyry4&3L<&M| zAIulILTF9`559RxoB3iTR_l2fv?KM&8Rw{N@O3{Oq#vYxN)AQDb4s?$vbKOseo ztQ`wP*u&r55D0W+m84>pY@!ZppV@LgKpBIjAiE}o9!LbH+b^@8R?@X5^=@CRv8RSV z+4!+7D?o|IG9HGFtT;kVGS_w7PsnCV-tgEAT9TtfBl$)3+`6C8=f~J>Zi&Cyc)kMs z%#RJ|eh9}l%KElqA1ZZI9tXOblL<{yE|UB@`i3lsQj(@VD4$BJ$Xm z@yVJdd5Pp%L^8$UO&T;LpPg~wSs2fydVfOo?83#GI7s;Hs*Lv8zQsE|oBU}-H05cC zn)|i+1kG_zeSK2L3vvI|9QS?t&b$!FXA=M7+dPN$DoL`4b^7rBiUtkqrx&npFg%y? zFXt$K2J*xBHcO_-e#Raz!}J-5morV`&PQLd4&w@;tGte;j^(Ep*XV5OU_eB|$2)2orT<@1+x)y)6-$f8+5;{i?a0rtV1BHnd# zM5$eIc>ZIP6l6(7menC0?hC0SSZRoV#-olt5a9|Cc>}j1&1hsO+y=f1-e>P)U_|+f z(@e`c326OeC#5_$)LP0{v7%WgrAwcGrfk}tENG_|v60H7YG{2^=f6OnsbHakvd} z22EYctkOa+>`O`_&HHhjfb!B}whLyfLED^1Bx$EsGT*1Pgp762)v0Utw1c#GFYFFP zTDT*2=kb#Azrd}&hr)GEI=+px6ltnsSO4p~E8|wlss6_=`Sww2JHwNUNI0Nv`Z>V( z1I5eC7alqL);?L9J*-b#8V>Y0@#E~?2lmM!+vKw%J6zNXX{q1GES;A7NacH>&L~+B zs?rkd0$cux1S8F?IKvb3kTHG$ah_-@a&*|PMYap9r|D;h&&=CDV`0ou&l)vbzK5xc z;w2pfNS+}0a}L9E<}#vu#(|hg?qpO){J@=T4R=yyI)70>8QD9|9s140nQ~Y;5G>kc z?L=?0q`f0LI2wdfF#H}8cCXh8^1FnTL?mcrNI~#8OIOn(7700L9BC;C#N8nH3zisr z_8r%*&Z{z;b3lTLDoxG~3GO)6Oqt)G5PukAbKWM@8KCzG_v|;9pv58x{!Y;7RsKO( zG+uL?xN65q;yCP~C-s8>ac$70dNl~>HRF*ow32kd$vJG;S|;y_+5;^D^1-9%OTBR{ z+%>0|w4{WFPtP4rGqW^iaS4m$52^SO6;EX_HFF#y@N{rc*HL(uYdfyvIdDJ6F8%vy z%`ZDg;d&L{cKpRp&-c!HuIEoZYKjJ8s9jB9zCS_ZbPK=<1pcqbL+31CKBNr%`rkf>aB&|*E z(lbNHV(F9Idyj2VpjJ^7FjAn0wwL||{Tue$Q_j8>ZPVYI)zTD6Np`d3&d&G#-h01! z^JbI9Mc=}8^KXyarI#)1pH!Hl?S(hqr#{o0jW|WKpcN9CUP)#ENYv zpEI4XaGHoc)9B@Lc* zR0Hioint??Q~F}qj~ee>$zRXVWzZ9`4(YwDA8v`YMtG&p*qba)?uDyt{ryYtW*~3& zMGVAD^+ku>7gAxwDtoVf$%yb#f=N1h6>@AQR}TU)9d3wN$WRN;+B>U^04pHgiuCrN zUGF5lhWb3*+7i+r%=4Xui!Bk?(arx7>bII5N++)(3RiKfe;^SS%wmyAT7`6cI}oYygLvTh<7&72U!l0wEa+%&1Y+r$l z6qvVyWPO=z$*@RH8xIoV_p}gx&5=-I#57q8lmw$r!|^soPGHZd!<9 zU2{{H17YfIhboB01D!7EM2Fo#bOo_Wr3+b^h@~W%s#QkcCc3s3P1E{*&z5hBB(!RF zsAqmr-ogD5ZuK)H+#Xp$mSPPe4|5|enA9DiZeYvh5!Dq(XhZ43$U&(zLLZdg8Wm6~ zk6cr_IC4?)xV?cnp?YUnpHV%#$U@eGF1w72%_s(oqnK@EjBVB`X)!R0s03q8oCu~= zQQfaFx&RF#)sayzibI`9qZ(O)aI#E^hon|aT_w7k^V*(RatU4jHER4=VI?-=sFO4> zSG1YPEpfRa;`?gS8#KC6yV2i)H;FIT-@Vj;^AH#NVdpNXyP?|w`G%m=jbOBfkyGtI z0yqvrY~%|BxEKf`W4*tVdO?6!>LB}F!t~dHw0WDQI)jKl1=2X1ZL-*_Fsm|A@mKA`;V-XKyrz|-^MPlH78R9Nj^^-*HLe@;a3i&fjmVM*~7gt z0rGYBwMp>e6B!mv5P|&Rr1i-{@})V_5|@8O^=FXGTMjvvL#;0nppb|9&DiGokR$Xk zYxjImX8XK!#1vEOX{>?F{s$D$l&=_!nbD0)BUd%C1gP#4s#->JtjYg0Hu*t+`uu1o zXg|67|KI7x!teV5Y=o26Um(fmS)UyHCN&!C&v9A@0UgVMFUA}=IPeI?%rfEN(2NfU z>yDW2XjV+>r76!s^4t@cEpCbwRM#i%JQpecI7JHDq15vuJ(3YGIM*?BsFFCJ%ZenIs!6d;d5 zw+R9NicDlZw6*mZA>JKl&%S1T`oT|~ht9)-MqoE`cAbZ=c1Nx*?mF@fUDPEyqCK)k z?yj?IWAk*@tb3lO0I+}_^^yD7+oMf2tEZ6_)PJZe80lssANzaOi`Vat7e0Ji5x0r{z9Q6TMJpcA4YD(h|slDZe1;NIgr=@a$aN=rjX6k7yOGdr;XTDg*FY z`Wo_?f$$j%V~%`QsM+#8be-o-=_o=%1;L+lES@tj!pghNcvM^sg~`kv!VEMhqjEZSu4L~paCeMfX~I0>a-_*N5kuh$Cln*^8SBz(lHAb65R z!)XzNgq-3^S_%SjF9`mEA%@<*$k@|I1IM=7C_K5 zRPPh`gS#~0i$xIpo$%4C{6nx&r<&WuRXa_x$6*gOsUHOJdV?AH zc@wj?7HL^U?SU2nEzXmuOTB$hxnqt{X-Nr<#Xfar&Zufwav6i<_bB;3CC>ygIdc{x z3Fw5Pt|Rd**LGaTbFeNQyY%m8Ilt_j#G0)5w&Tx#dcJqwb3M0O&by#;F6fr&K!GTB4lyik#pdteTj_=tXe8&F(zak|~ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_edge_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_edge_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f47f60ada483614b22f141ea490b6951976f53b3 GIT binary patch literal 5253 zcmbtY&2!tv6$e0&1R+Y69e*iyl1-c@Wu_*bcrxv16pzzb_T)mlkvr32nj#=~CBY^M zdUxqq41JP&@2QhRXClq?;`Y!(+e`m~{tdYHlv57AW!k2{w-9KGAC}!f!eYPid++_; z!&}CSi@t^H=HK_4-=4Ire^F!na?!YoTU|oIt%k*I?zHWOZJtiUG0$8hcf;a2?mn`( zE8N{&BhQ@;tCA0|*_P!qT(`HQ?w0y_97@hUS>L$LKD_m@Z$_@il0{vmWxu7PxU1N9 z`~}l73;TLImeD{kDem=!(u(!kB2Xwn<1QC#D3 zOVuzgr0BK;YD!-Wdr|G}E7|KArt~|at3!G(>xElltrlLXGIoJ=<9p#MTYvx3yD7+< zJ<$bXrh1~q?hC1~VwJsDy<|lAD8?o&y$U%t_$Np`66F>WbN7wPk47q{Me{fAjBB9|*ZG$C7)l+e`pw(xt3)HkTJ2CNh6*SWGpJ~!Tc)=KJJ25^ z{bi%zSWm`VGVD}SgIE#ZNv!`LWurgVqs>)Z15koxjNjG^_)&_Sy(#2mEV9Olp} z4qel_ICRnSxV?crp?GI-aZ>T@A`4junrt&JHlr>m9Cg`7O4oX&l;i`Whf*+7#IayP z6Xk;rqY7{!QY{&EqHd^TX*44XkWCh;@K99piK|3=bJo~nODJQO-a`*-b5YrpW1dZav2s=^j(!g_a!3M?HApHR@1dA z^-fQ$vcn!Rdck8`mVg+KMLdj&(&893iN|ZWpAeY~-r&>}a+0e>quE9EjQUUL8)ZnH z(e(El&!-SSb#@~_FNF6S1^y5+i)PO1cwdX^@xqu*%4FU_^TJWdid+sPNO)|+J72Z`)~w(Zm?r? zANTnGbGMP`2fmN*-niixNUm9ir$D|*gU0Z$O*#8vI7gcQ@yPs#7tYtpGzku`OsR0V zZ~ku2Cd9Z>>hdha&ivne&nEaleLYgmbMfJi6MX2=N9(zPK9dYDw$%|#D3e69m_T3i zFKN&);rtvX7%WH9U~hs3M@TS_17_Jc0gl+`MXbL9Q8Vk4=#$Z(`hH9OQ`VhkLwDEN zwehKR)~tJ;raUi)8P%b?=k3!cH0`IACG>x&OIYcqEBE|;YkW0w!)*S7E}Qwk8d@|9 zXgr|FKg2$mlgGPm4k>@k58nF3BpPY5lBSKwyL&?F2+R%f&v?|*Q;{$SkvDKF(u_vt z!)@Rz;eGZ#28NUeIrXHdu`*ok_f8fZyR(KStp?Cmr8L+KV*UvCIGU-KB$8!72a8FZlK{ zwVlD)d4`zMIQ<4;{DNX>>Jxj;zO_$`vj^32#^F~4{LFwK40^ynI@z0iS)`|!N-in% zdYGk?Vh?AAPN-9}%m`me0o=fres%q-ZLGle=!UKKe#cx(}mf%h!^-toCX z@Hq>+9QCwOvE_T1IxCLSfrDfUg1=-?JZDBmmCc%prQ}{lg=8zZm#yJmsz`@E3NS?ZiLQ7&2JR(&PJWf;JB#%Wx zP7oz21cA601b@X6!)@Pj?eZ*@rt_wx7^&2p2Oz~=r<^MFoe>GKX$qn-T(jq literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_entity_data.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_entity_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0ed22d6abb14f066aa73b9f74f53b7d54220f3b GIT binary patch literal 5319 zcmbtY&u<&Y72aJg$>oZYWyg^%J9fu$nv_LMIx&J4f?_z0Wuq6`ja;B$nr@byk+e3s zOV11)i=|Fd?>+VqpcY!7HHx%{wwL||{Tue$Q_j8>ZPV|~iWEgrQk*O~v-5ku_ue;e z-)u5F>sz?){ry?<(yNyBFRF}RE-JT>)OBRsYFOOnPTOwS=I%5cbI&z$cP*ad?vBM> z;cn*|dG4%Qm3(;Hwk)6Fdax12>*_~IC^`FRW%U93;Qo(&({m@0EQ*zuy_SxWSh0=d zGo}+3_Vh*~qrPBLJnjjl73;P|s04cwsYtWskZnk@_WoNNT6dRfHEo{Iq$gCPq{fq$ zs-a&<5w`?NN?!}RQSGgp!^blW>2*Y`LwYXjhU;Rv7T&Bfc9q4+<8X2Pv ztF5F{Q=f(F>p~iY!*VO(VqL^l4D-K)`mK74^6@K=$}J@IPh`S^Su8S1BUiGxLk7Vw z|GC?6d4U(X$4jP`=U4d*FYnlmf++G?KDT3S+YL{64@>;is8;0j{Iu!ug^!*yqgs)_ z!q1wX88L&NS4XuXU*P9VPg#`FbADLki~Pcl)tKcM`D?h(@k{(N?x*;7IKzFOU*WIg zewzEB%^T^N`!L4sP=_nAj`Sv#`l^2K!O9X5NwHQtREnVhk|YdD8flm54Z-#_$Vh|3 zUa+hylXV$(s+mb|C$O?+f`dymDO#=WrJ-mDtC_2=7>(jV`m_#}0kNzzVpQLHO& z>T)1Uy^T->v3RP}Ii2XR9f-CdUa52@s}r@9Bx5y-7+c5C#;oaD*&EsLO_jt}^%jjB zUQ~9FK15Q#K*sHX6=XSfA<8f~@|?-t0or=DTo_PWet59)gf7Z^ z4MrJYLZn(U>O^s<6KQlK3y@A0Df5t3@~Nvtdu>|Zb4$))$iKI0KULU_wK!@eHLMk_ zC30QdsEPQA8g~e_cGRqOH{np?8`XEN*Wf?IwQksYMEb7jWnK}sG1{n1kvVv2vv!93ie)4VitNz8qimeV;Xu(mAE-F(Z zo4+8f46KJ1Y-9KTa96+&5?x8(ELlSt+hEGVlU~g5nLP256uKwjy&k;$Dm0(2C8;;N zVu?-ej?qJ&+p+}QxXt2bjFn}ls7jn(MtVWSE_nTOQ}B~~E$Sa$R32`G7xdOL6d#iI z^VP4b7(d(oMvQIaLRG2IBfml ztc(G}+Hq@4Y^{+JG8P=rL0z6RC^O3&2S<);Y%fsT$JDfd>_of&d1Uv4-t{Hmj?sVI z6MWX(6 zaqAsVjd9h~<#`A{^aym=L7Bl`h!Hh1w+FkpHIsbb8yd2JW`A zZR2(7EL)E~O_5;^BdP=UnYT-?*{q#rmeBrzE@7sd&3xwXTH~`3O%BJ;=&~9Avw=mU zfW`xw{1(>1m^_|!Z$J@ezW?S&CM3xMn=H&ktlkw;N8oUXKjTqLAM%blh`frVNHZEy z61Rb`gy-42=onDUc4#-yXiI}lKqoFb#Kw?ayw~-ZFLicY@%8FXsmCJurA_|2E3<%JGW@iFB;@)I6E8c zZv9IN1I>cclrEwQ*e>GN&IEFK8GXM+QbdWez3`Q5S7y_kik_w=jF&V=rL%j7qk!I4 zDlM)HoPV`UeH^NB3J-BuPF;%Y(p)F(N(ySt^KsUJ3e$YH3P!75(;S&3>8MgLZ@9F8 zK)Tn~scY7>gEapnZ1+T(dn7g|@sbICjikPZ%yrH>zKt*$VY6eG|L41Nd$od7{;yx~ z?Rly@{R>B%;*iei>xJ1H1WRAFHQ%JQHO93!(2sMA8fXW%|Lvf zzLk7xFnr3wn4_FkDzKx}cL^^EN&tykLGU~a zkkdRS2{}QRv=9X1aS;3!Qw+m>$FW?jZ9l*LGaTbFeubyYQd=l3#S@u`x@&?fBF0p6^}sT+b~RhpvLoev-Z@rj8Wy e3Ka?&Nz908aNw6S<=iAcsK|nV<9oIT$MJt=^)>|n literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_entity_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_entity_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97ed5f44c00ee8e99f05745e5b4933d327d0f4b9 GIT binary patch literal 5319 zcmbtY&vVkIQg&j}i6_&JM)5d}e@rg48@V$brYQn)R}yRz zpm&#!#Zo7^_a1x5Os#2WT2H6#q3xxALH`C^d&=3jPTTZ*3xTF6N{SOoSnO|n@4fFm zyhSoU?_2oY`TNuM`ByFLU(}fVxoBL+rLLghR?Ffxce-}VHg~7xn0ujBxNY$Qcb{0? z74CMSRpid9RV#)!Y|HW)e)l$_cwPM{2_L+k!>qoK_c+Vq5alr(tK zQ4Nd>DdLVmP3g;FKWe;nEq^@2ltE9#I;7{aez-1H8sW7%W0zQ*JPeoF&G)XnlYzX` z7cmes)fXN1NJxbh%k16y6(hoj2{!5IWyrCXT;B`COt>v#Aww-VYi}+y0<3^|J<=P4 zcD1u^(kfIe?vO$7 zSNy_lxxB>7+~XC~D)LKwj#r=9t&%A7dA{((+O}Js@a|Xmv2m-+7x{5B;tL-mC&sNZ ze}$hkBXeR7Bd?BIWqyjEHX~J0#mJew#h3WmCsu2opX0CLzQE7(3%DQS-{B1RMShXL zj{9-$gEnuZC+@-+H$olWjCG_pKZ06^s(I($&1E8zVx4ZN6hj3hNf?wg)-KZW%}Cp7u&ZVUz(TM5-gBUKEEqkw!PN1nFd%3J*oCn7T@I*Jh19v*ZG%{ClhM69s2%#8D?{ zV6SK`k?Z1WL&T5NWI$+iqjsaeiGUJct-o`nf%qXV_ruNu(sx6*0}2m8ryId)4I`)8 zy#I}^$j$5h&D0A}jdT#a4KV686eXu*XMY~K?{5plL82?^nmg^${3Kh4%=hOwZ=-wSg=P2O?ld&%q(vL90jfkU!cBEsOuDpBklg@vEBDZ*O!1h zLI24}@QwEyi@zHa@MfH(z#Pdoivkqr*J#jC;NpxBuou#iMEKJ<1ngaSm~QsdVei_E z6npy)+wX8{Osb|S&p`M*CYZP06f>x=PYU{4%=p6;Gy3#udkLtA(&A+|JAxBcl4=$w z=)M078Z?}^a3CiPo+AnIyD35(DaAo-FbgNCaO6%e!-FLVob!MbF#T?zzF$)RJ|0l) zpv&Zje?uj*wrp)ZMecXs*|Bd}pT7SyXUo|tXk>gNXWQ9wwL5Zkaodrv>!L2v>FtR% za<`pr8?RGm#d_#z$_xvbQ6ITay&ZbZX8p9Xg8mP51uNZb;GPS{n~P{|gWy${Cv<{0Y|4r#!99JmWh2K|yjzJ{~2 z!R|J{q%_cMC{67gnt<&hf9*{nmlrVh8(fMgQMFHf<=VCRw4kELX$A8otx@Ux?%^n) zx0OoE>jLLrEmI$dYMjDD9F|j;^18Ip3;U9iTJwCIb)dqunC*huYS1=ECP_M~mCPG1 zEg_K}bam>QJ?$VZJ_@@7krp0^&1t-3f?wfM-$UU#Cmr8LnvAsBv8(^{-G$v&$*KO= zFZuQ&wVmPFgH5qd=k)c$_y$GR%rBlgJJt@d&K}k$S%>cr_&|YA4Sh&}G(Y<$VDf8` zoqTGAwAAlomQKrkoHKf%&I~gnkfkNC16%%)#3TJIIK!pcz%gqd?mW#^fl9qx%JPd-rVu@k6@3?k#wpz29`{Wp_)tnw6#{;LDDfatgDjbB{d@3O9 z8LamR{oeOA0gOcu{DT0}qx^%w(X5)=#IJUOq>sZMdQv|K5c>vQs#k-69=1DDhK7<3 z>~jg*w&uyVqV_Wr?2C|9va{(y=fQt?6(Q!|G& z5`m5_>J|#ma&5}RWNZ&YD literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_entity_view.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_entity_view.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19274cc99a08878839a666cc5587ef37505f5fdd GIT binary patch literal 5319 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_event.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_event.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..732342ef582365a44f9736ff26e7deabb07bd768 GIT binary patch literal 5153 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_rpc.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_rpc.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50825defa996c3daddbc5904bb8256bd151d1bd3 GIT binary patch literal 5087 zcmbtY&2JmW72jPh$>oZY<&XF?Nhfi>Sk$BwBWNKghST^1z0j`Z0tM4_v)ma;Ym?md z%+Rq|`Xm><6-9v-MNuHq(deOvwwL||{Tue$Q_j8>ZPVYI)zTD2#df>W&d&F|_kQoa zd5_8BqHp23`PZH9_=IKsgBsJ1i^dha>LLnmbu4akr)PI;^L09o`Ib7R8x}8d_p!xY z;ck~YW$vt5jdFO^wk)6Fxw9D$Hq`f%P;z$r+S(oV@vR^DX5@MzSv*i$4kH~W1I0Fz zFPKhPIMkboj7Ne=aepY3RxIs_Pzm-RR>Wgq=Lr6nmQI8TXHpHNbY5rFbztxVYoPNq^T*0gUjzU;~#Ue;LrJBVZ0tA2M zKe!#2S9q0syk=Tuex5Jz`eVCO5mmm(mmXW&cE=Om-5NhKX;t|$KWavN;bY|3q*dj| z`3WMZhe{8fCH_-p)ie2?&Nafa_Qe}lh? z?@{hUZQjZjZUKy|p$>1S(MYv#-nq6y8l+g%3zcH1Ksyo!=}g4R^rm2YqGKewVif9? z%49=^{br8k)dcWrCODLc7Ug^P!@)4@^|qP@uu-iSEBz^s|15L6Nz%(o@jy4+%;lge z^EN{j48%j7E$Kvuy+HH?X_Cqo@-``xk_1nuin(n}?JSz1YkM<0zG)JpsvXhH;-R{O z_Y=J8rzp5Rwt~Eb-JuSMQI<^Uj?p)?<;gMimB$!E>$S0iR%MJiXuUNqp;aBbrgdTL zqUCXW4SPb|&gi`>QxjKr()-S9=^|B-*&$qotTnjvsfCz2~HlW(@W?+B{7Vx zyB1KeN58%y;NwUmNx&>wM;)3zz2mHFGP+9cbwvt2lyFIRUSc^dq-RCytyHYAiONs5 zePYWRNW^Cm9|J^Q9HAyD>MGu+q^%Wiv^-5J@et8K@ld@`>!)<<7=(W!}%t z*HD~>uxBHu|B>axIBv^hAg$r#3=@a*xW0~l!?j;K6kK_fHnK;*nZQ~Y%>M!H%WPq= zor0I#*fg?)fjmBkL(UBYrjet=O2o!dw}mU({o&l*4)K2 z)-d5W$95mPZF$PjmBVVh4|$a-Wv0GQsp}+)=YqO30d>FYdl5RP)OgxzUw)$r!+Z9N z8)_Qg1>$BNzT|h;Y0%(%cG_z96Y*S>znq}Ff8ks)9K?G6q8#!4eRDVZX56Qx(3Ypc zXJO6ezL|lY`cjg`3&H;T8Q4?0R9=L}Z^ZnCcXd?l;B?3Sj0O$hrw#&cD0nW~ zznww*aJmnJ+N_wy`S2}X2IMo~tpJ&LopssN_jBq$05VxUy(ZTB3o5bo$kx^lVyU~% zu6@<|?4zGJkDNy(jR59uiiVxp4`-yEd8@s!-{s-u-_gc&<)5@hZ{LEcT+Ji;=H712 z)m{>XJ#`tCe1+Nca3bHC5P1gq4G297f=g!%*=G#N>qt8d(Qf-Iin7dx($vnO33^?` zgZ&wjBv@Lm+k3GV_s-B7qH& zXJ#%1QCX=Urjmk1b3T#=$Sy1AyI{5&c1_YDNjQy)xs7Lk{rI%#?E4=DG6s~i^@oj{k2uB^e{vY36+G|yu`oH~(Z!c5Z86BU4!2w}Y#&4{F z9A$0^JI=1POL}IHn$voQoE=F$((@FgPx5FJw~9Q4Xq2)_nqrpDswo2YeyDRq=6I>B z0=2-Fe3h3D*#fQktRyd{~E5gdU7Q?fNoNmVJuB4;wT?>hJBM-gYrSmjW#c%5|< zy~&d9T@fJx2&G{7!6WQlZGZswEWIaSXQph)`QpwfA%$P?GylpO=%jDz~K?ibt J&-UOI{tK4}*V_O9 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_rule_chain.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_rule_chain.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bdb54c3a7e0c5881fb977f2e92b15f625e0fd2a GIT binary patch literal 5286 zcmbtY&668P6`vW6q|vN){Sjy5wd2rj;ximyEYkVdis0b$M3y< zZ<57D-@vz~kw|?lGk?VAkEUZi=-=c)8Blc@`)4!&P?egNyHFMBeO+ z7!)(r7ajIMNQD)v?EU&h!@|c2HtFb9@Uf9x*-wa>a6`mGhFWme-d<%yumZ)Kk=`1# z>z$<6P@jjJn?f22^Li)YVpGI*O!L2l_^oD#%E_yU#ueP^A1H(cwOFK*R-s~XhZKTe z@waZvJoWIH6 z!t(_80h_ne6Sts@tDz2W54z&xtuTs*s(JIywN=8AVx4ZN6hj3VNf=}_7B16Ug6#>A zkpS~ifUGZ*O&Rv;nMSWBP_kx%14^_g+p`zOgRtA(t{b%tk98xZKN%D8Y3jCduU6x<$JK~};BQHQ!w7EI}m&^NH<@`(D1BaESSZsed<8etAvZ;uLS zl}D~=T^PA&dE8#do)En=tj~y^U0@;WL6%*{#YPkZ#Zk=GGsHG)m9!WbK~#dVB#s4B zqNwh57+C-Yk?P2(7sa7Yq!EoQfjL>G!b4Fjrmhm*jd^2FExCj#{~9%ZtYC?aIO-$~ z>=kV!a#LJti1>k;^ahP?)Nb^*;Z5R8_4h6|;5@{Ie%QH3;%?}6K)xa9bR#IOVfa*g zj{uH?C^q~B5?Bm61jc%QJN1G9uhc>CUC^RlM^SQ0cJ}k|e17}3`_=Hwj9BaW1|9gw z@kMpIN#V~(CL`;v1;yCIKim*-fdo~OHcK{8hY8H?JMF&=l*tFLN}&f5e(TOlZ$iuI zT9tacFIL%-85Dil14%;h`VG4HzkYEm0gUiKaXWVrxz&2;zL6G_IrHNW-rj2m^V7HnNAi zV*uoK_O(Iq@*5cxOaOuW;iUFSL-Lh5+!B_5ME$2w%rl3amIJjf5ulKV`psD9`I1BA zFst``QKtL6b;uS|_B572rvH5cXv)_NjhWJoOCwh`VFJ|m33V-_I8x<*8moN2KYej( zCtyEm{r~TFW9Ik#01m=Q?Jp2#^R!QneS-##_UAaQ{RAC}fiK1w*uU@)!OS9I|I!Q( z`}+>r?r>C0%B3k!gY(=Im?Lfq6x7!z>AVmq{x}5+I-%5yQ+g;OUUIJ^;7}!==D~rE z_@C3Dfy24kV<1z5q2@>|{C)}xNAYkF5X`zs6dbkD%RpcS+~yDiY%t&p?1Y z2HhqE{3|Mv^~l!N6NGqoon8B?_34K{bsjm73L1gk$k}lox!N7My13)Ww{%gLC`Eg0 zjock)$Hw95tXcOxO#xs5GwLJviMLCKYSvFHE9n17SFqB}RzC4}t;y908uR%Jx@zYC zWMt7SP~(A`;v?*XIYqqd=7<8z;_#i@Ci=)im@J$`MBW!tM}TjLKjTqH&-lawSYF4i zNHQAn5Vt{J1@E(WF)*U&$Z4i!odmT0sgqKa9cnG*8LX(;sr_(D+NrnJ4SQ`KUj7wr zOyR|{HT=#k7}C|rq@%vKXML@kbi%H>j7ql7Y<)1P?~F-ZK_UinPk`*giXnc*5Wa!@ z*pTivzodB2Y$#3bESjL&MVQ)~B3!V-cCB5)oIR{hVh*1e@C^cA6Z&9aoc5bIT4ec6 zt&o=beazBnxsPn37wSweb9`7@0ywbc7sMTjXUQ3!o=Z0-&5)f(w2JH=P__ulAow(W z4f)KF@EHqZj(XOp+46l%o##y{6(OdA;LkZNo-;4P%BRhER5CFmL{b+_%+@e5Ri=!P zoXp6+>)fO7InIO;%Yk6g25TpJizV&5qJ!ill!D<~P1wC&E68sWxx^>YN4N@tr&%%FFVI!lNH}~{P|DM_s)8*=T^(Pm!K3+(g(xTkwU&n dl~M)~Gh-e(@W`2PE|UvXq(G44d$tFk@jq5gCD8x? literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_tb_resource_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_tb_resource_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d28b59615eebdae48488019e929217449d1c214 GIT binary patch literal 5452 zcmb_g&5zs06(=c5qPW`iN1Tlv$H~ObM^)646C-G`*ceXZ59A`dUKc2orVPcI-K8yw z^32Hbs`91l-h1q!K)pZ@HBz7j()7^3pnn6eJ>~3M(Kh|P;ZoLWC9mz2(hTS0&EtD- ze)ISqlf^~f!gcNIhwZJGE$g4unY>(dE~2P&sJPX#xXqo8-LlQyX*uRzXcewnyujTD z7I%faU1$}#vu4$b;U(L$e1_}hX58CQKTbl)*^SFm_%>6?XZ9bMIwB zUh9hFi*RE@NF!n1juI|5M6V7q{~MU!YDQE~UPW{+qNsnM5*D__qAh6^Di(KW zL+~s9&TYB8#LL{{71Jy7Gkk$pAK0yuDDy?W^uXG-Tb}T4RrsNCugnkgBWA`IK4y-N zdu9F-KW1hY!~$ks9{0+8nZIIYs-lXS<9Uyt;IBTgT8sQ7e+~B~eu}@2`yu`YXSg5c zZ}QW)AK^Y=^H#ci9h-3})Zxwc4WW{OjKn7}?NBwZ-MqX)U{WmVgi0|q0F;EmP-6=- zy(!qP6&YDEp9RwTGTD$}x1Me5r35>znc%<^Ey{Ry!`>k5bhhed?}o=ZvC^OJmE^P3 zZ6`@5EyO)tb5oZ?*3{b!RnQanbh@My9d-iI5ri+5E@XXzn3A+<@u&-?c1IW+*m8M9W5p5X&^tA9&?}8V zgWg-C0(#|h6Fs2v8BLNXFf`7wSYB`^XYBlx36#iq{jlAumAdz|vRmmyY+0VoMN%3v>+u<9t zEnLsJMDU*Di`rBO0FTK$BkPuhjk1SdT@`SSgkLf|OV-iGxtPOz+PxW&lZ#%FLJuU| z+RYc^L_FwPk$S5yR@kg#Gk(}3TUMY0Zi~2?9n7jj)FrU5qC6(Vm%QQ0Il7R(5z*uq zwewT*m|krL|2d-nxb{4T@-rV{RO*Lt8pgce-8|1=ou)hr*=tT_9J0nN3thpuv5;Sx zixhc;7}>)w#~8^^<^KmKFUZXRWdbYYOee8HTPI(dp*I2lCp3Nx)!YM=OEni862T7n zxIc^$kuN#OEc;QBugs8<_YUGSbqvP_$d*kv2nv@r>m0Ce90ueM&>is1C%! z-^N(j>z1EW z_X>^un#T8GgM17X6M+5|jo7+xYwIBb%v;WmeaZUl!=F3%o%;oiuyW*VJNI4fj$B>b zcI0VY)Fnz4A6O%I+u649T6R{gJD#TSvjB?v$bIPT(Ca!Ir1Hb*`a9O- zYJ{vg{erF<`k##~qJlIYq$%D9AJ7!>tZO3*Ym38oZkRA93z)Jv7D+*0NF4*$A^wcV zk>2M;3s89tMUiDRqAzYkz6zda?_gp?v6$0L%Q^{Y{Uax(7(din%2%t^TUp|fM{5c=$4eG+~6=z*^y_`cDH z7UK^QCVm%Lid8G5rG6h&IxY8+&~!tcZO#nmmX?4Ju>6u#BpWR`!&CEx2jxE5^Uzt5 z8vwE`LN=s6P9JGLH*$Q=!X8IE>(p%dK1gTzT1tjUvmp3$E|BNUjo5P9eg2k?oiQiv z9*&)@aqLu?a#V6WBm0(fo4z$U69-!k1dG>MJJFjgY2OkN(xXrchVMvW=Sr<0-zJ$! zSrU?976gy7U^^{hk&si+NlQT>?gYVCSYpubJFZ=wZ{Cc0pDttbn#=^c+;*y&fxkb7 z#XQ-~cM6g}6YT@iVDEdKgzSkR_&W(nkMf@;AW_!bCa&61vO+KHVkGs006uZhp>{P0 z=z+U4WmqbSuuo^ey0u8>Ep89A2A9X;E$8lo o@=HmdHB(0l`6e|=8CVR(EOFqkGviz!->7I8A&&3a9-PVl09kx%SO5S3 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_tenant.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_tenant.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2ada811394d8ee797dce0db57054f5b8a7e1672 GIT binary patch literal 5186 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_user.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_user.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3ad319ab450f2a8cd5bcdb95f9e47a525453f18 GIT binary patch literal 5120 zcmbtY&2JmW72jPh$>oZYza2YH(n*{;Wl@t(jG%>}7*694^g_Fl3lvP#&5|>cRwj4p znW1B`^hxTarvOFK90Jtp&FGZPVYI<Iy=gw9XZ>k?Bq2%o2>+5&ehqr&?o1PnqWKpcN9CUP)#ENYt zpEI4XaGK#!VgA=pzt!weKK&F?xr(IzflOGS#Ue^tg^I-;A_RZM zuiTc)OT5fIUNN;IKhKwVb zKWTcF#1eW=O=@L+n!jRts-lXXGkJ}l<*)8ptz~|WzlQe;f1SU9_YwXb&hS3U-{f!M zeT@4so43>IZIE#-)Zx#RkVDnHb?5pjnUG?gZm1MP0p^h~sAr;Arndwe>yDA`@?O|i zUnZL}?A0?euO;ADGr?g+G$~uN7si9I+uf-f#)f`3Qu-6x|I^fMCrLLgM6s^9smp;Y z^|nG4#NvTYS9GGoZXmjXY)Pd{S)I&DNg}9K#@Hr?ww6uT_3_A-Z>l7!YIbO3{!rOL z`Upw=5*fEgR*>a5c_@Qqqsa+ho zsCnF8$C^;MGptQ3oLyug>p_EE#>GYy!)&9Nt!F0MtX0xtV02IkCQ3LG%xR%IZZK*9 z?~&@rs29bdPNdO_EI}?=rp!ZDE2gdz-HkU0o&9-uKTW>velt8Zt;>2ow*yZ&d8kZ@2!29}7+KpE zh_HvhyD8x4$SO(2EZIOA);_c3yn`|ZOHOuG3O$f;Om|*pKFy?ORqCC-SY=NQf3omn zTULM)uVuUp8(DUQs${NfNKeRSOWyF<3|f+-Lp}LJ<=ncT(C5e4ZElIbS%1C){OlYX z(EShx+bHYXihZcmO?e#XYEC9JNx4Y!8)!F@`;|jEmd9uzd-(eayZOoae;9tLH4Md5 zER#!{=9h?&Cl<&^=J``0XC2`S0i81E=@a}dR+@-BKFj!I zO_RJt@+=~m{O|^K8j{b=9N<|P&!u{QLiOy##hN%s`0T8V_Sv?@D?OY1X+<>U8Hk#n zYx4=3dNj{;N6e`}Cc8A&}1`{>7Jh4(nBtWD)E1;r$hL8rIJ&VBKJNF6Cd& zQT`0%hw*KuOq2bLHC~44vk)(5n#7&=;MDeOYCpgUAvk@e8l)*}R2+s?jy z&HD6%UpNn)hXsw$YUJ!X4_)n!TwUCC(Ptp{`)2o6UUW?_1Ne5w_*ymvq&P|M|$GQ9$DXP4OYt!I&cUx;3KE zt~k8#u?Y&YpdyRv5Dxc+)Df&S#6ROvM<4KT1&F+kq)0Ow5em0~uY&#TeRPZ{UU8af zStkL_f9#|b=Z0EK`6_1A?9_fRr|r~R>xR8H53hVl3sVqq+8SQCjq`GC9PHP}%hlJq zNhj>8D=1`B%&Lc@yf8s|7Iz;YJqE;uvj+EBgLwm2QiIxUeoeubSx}nNIaC4IMWEQ5 z!z|xG-ye_^8AH`R{f%qameYcY9;6kFmo!JE%j26zK;IgbmNx~im0G4g?y9)lhPZ>K zE=5*pp%?Zg1(9ZdTqmHsw3w}e(Q42(_Yq0jsg=z4DJ>yl9dvc-nl>Ew_$A*yN_A&=auEp!v`s$;nDapX zGCK>8oPBGbEX^L)r!5T^dffPNckcuH~XYK64a?_-os%YB6My-;VAEO1q6 z33h=c|3re3W>%cxiFwHAKY%z7G!-3m*sevk3#@18XNS+s?w_$R<|t>Cnl0bM&_(`| zE&?P^5d1lZ;W={=Q9j~;&!ppIR7d>aIN2JNSVs=Py*QsX8{QiXa!w{SMHlfY{y-&Djzqtf07D4cLf<{~U2Vqfv z&28eT9Vdz7u!ok^4+8kLL6^$aAfRo=J!NPm>41~-Sg^HBrzdI;vp)Hxz%#+4Ct06>8H5VkwU&ng;Hi1X2c>m@VS|Cu8^lw#2w)H Jp6$Uk{12nV=gj~B literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_widgets_bundle.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/page_data_widgets_bundle.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7644fa24e077509f94b1bca4a8c3427823b1ca8e GIT binary patch literal 5418 zcmb_g&5zs06(=c5qPW`ix8v`QV>hXaT5@azEfyQYN&JCaWH;-gh0>IvG_$+3B~qRl z*+et7?IV`;PwGrwE;?6H)J0U>YFXUoPSca8)cd!Yg&g&apVTA1<=%?_PW-6Y^GH z#E_V&zUZ(ALMp6SWS8m}jS3$oVA9cx&|@XJx?K=Ma8txWhFWmeUSDJ+u!6*^kzO0L z>z$<6P!Ge^RUwUpdApNvu`1#^$o#KheyiD`dh#lwa}`DX1C_9_Ef#G_t5C7HLmPr$ z@po>^5@W{%}Oew?3pVzuV^Nq!3V1%8^J!F?b94rjRU=V$qw zxF6s?U~@h_avPg*E!5#pBfcuM`d|?At{AH3tvlBj2}_D~x}j1G4d5hUu+!MUOs@&H zWkg0s%x3|#zD!nS*sEu|dM&|5YbH40M2j+>y)Yhx-R^qbY~AosH&XhOZGwE7y6q(C zriCchH8*uRBu%}wPzAAgq|*hR=&&1zt{`-&bS~=?z?7sdYn4IU1ZivDOkLliZ26{3 z%ByCFDD#Wj4$6lp>KCZEJ+gwVhA*OxZAV=&wL8Mtz?MfxG*%p84!zSO2ffk=H0Yfl z70@e>T+_QSa?$g+y$qh%0%v$><`%FEEMz^{w9B|yiDDo+irI38-e#?m76W69N-(y@ zzF^86)vWLd;DidGW2DlRuf{6I}chDJAPH~Q;{Eb-;~I~N-WB;rCp?A#-hH*`CoI1zNZ5jL)2 z^i*5706~N#Hu?n*Gh7C31I&7VJ@tYBkJUl&1IVLJp(;5gJNtRKzbL-#emy)h)4cVZ zNe6Lrd{LVUZT@qz&B(fIVUz6P-)_P=40OrrELlMtE-{<;bX+s=rr5kFg&s)6vpevC z*Jng5=vtI|y)PEo41XCv>X|JoPyn}i+|1r()jsMH%9l`{6VyxI@WgCINW>12lLxc)rkZ*08y)Dy}2O)UP$qYl5m}Q+C7&q4OE4xBO z9w0{c@Yxs~xi9`-0P@Y48H7xLgyQEUDrnc_p&42e-hWKvhf(e3Hn~i@qCz6Mp{VwU zF&6SAd)Qf;T+lswlCbn zNITK7eR+nF?PGhed^u7kZPb*Y^^uaqx*XayOg}8!usJ$-3`pN-_(esE^#I-X^`AvvFEk!T9^Sf|YKz@~OXRO|C{_ zn$yqes-gec$Ra98<3XC@WAFh@5zo3cqU5zWeCuPA(PXJnmaZc6?+d9TKsv;q@u;JB z#Lfa#UPe)58I3%P+mNq<=h>T>7*W>cG}E$90$TsfNhy;LwU+V(R@Cg&el%t6)LZI? zy*3Z8{FWF~nsU?{Hg3bYu1z0s>RWv4OWmXscGVR$vbBc&?&7{R7WX&~eh~QpL@yjS z3LH1Wui!jx#CMxtQ7&m1O4B-tE+lu63iqajmuE2ddlW^esM<%rcJ11HT2RrWv;ulb zYg9VFb=nH(b*9qts=%3A%hbm~9Vhz`2k_LTv@k97!oH;B*gPL6Cs;8pW?Vq625oZ& zlVqk^$-Dy75_0lESEsJwX$NWXLD(ILv~W+XPs>ZY@Ea8MJyfo9*zs+o+ep71yZT?> zUD)cCoa%r4l5g*)zB4@i(%sl$cKRq{JcPn+<{eL+O>2{|XAkR>*u!THeD}Z?j6ReY ze`+v!y2#E^wL)6z_d%u8av!IbUZ}IZnGx605�e8vPAM;=lv2>zPO<2k!!XgTSQNJ}nfj7eJu zm$NloPL=5tNCgKDr4iCBM4Nv=TtNEet(RK z-9$IvAxQj8vUf>=?Qe6EF&07aCCNyS@?Rn!5!T!$uG&GeK^*ollKMe_XgKInyBY-a zyseos?38q{OXtA3HBYV$ebln`&(vlJy0buH^oNU&xt?1s=aGYs nk&-@Irj8WyEHz3QR1C!|aS*99<6NPzsAv-*j_=tX;>iC1bQNDG literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/relation_entity_type_filter.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/relation_entity_type_filter.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4dd958018ef663035a037beae65b72ca332c55c9 GIT binary patch literal 4801 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/resource.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/resource.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38f879ab5733931a1fe683e20bde157018ad6483 GIT binary patch literal 7122 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/response_entity.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/response_entity.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e842f0a460ca033f91d2b67ffca119441f4b15fd GIT binary patch literal 6235 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 JXBHrW{{#09=;r_c literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2720fe158f85404b702153388d8671ccd1b4acd0 GIT binary patch literal 8714 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain_connection_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain_connection_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d894cd3f8704ef6a25631ca80ee2c03bc52560b3 GIT binary patch literal 5557 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c542c21a341cbcb6027e43bc0a1b05625c01b3a GIT binary patch literal 3202 zcmbVO&u<&Y72X*x$>oZYW5+e(_A*EiCrn||X;2g(6v2t@80kT7Ef*+=2Ak#1h+KKO zyPg?35lfwUm<*A~#}M{2**0;<=p`I$bEC z)r+|@)`&7wu~Fh>YEmnig|I1IN)|SJ;z`7I0bV5HZ2C_)Z0P{+#JW=Qwdp9oA z!6!Sb;{`_dc&dJ}FfW#KM#+5igZCSTPj8 z>fduJJSeb9Vu#RUzqtP<5GU|hY!s;Apd&l0kqqU=i8l&mS8k%+kX!N^+OB+0UPrqrZ^-x2Zb=``{aLl~be^dP z(>Tq)l?$``aP&{=v19xTNce|fABjO3J5ieeu&4F$Y?vE3`Cn*fHUjm8;PhMhOONAgsh_x_4b>K!rbor3iT z{ER*HzWee|{D>blY-8yy`7uB8t-thb^O)-oZPT_Wv7dNL|Ck>mW|n;0dlA_7(w7ZL z^q2l=a7IR|zthSNzJFyqSc#lND^J5SZ+-RBzmVUsT_^v?rAJag697%~2>U>$iL;(8 zDJq+bJ5L>BYP!`Ci9As%ZBvE(g1?YyV&Bl6SWC{|Lov5dS#Vb};OpQ#c7};1F`4gH zZCgaN9&y{A#wNB_>rJfav5Nh8$=+44oyD`UjCX!Z8xyN;d5e$NS#`c!e>*FZI5Ruw z)GOSk?*@720_1HZZUDUwz>V7u_H74wANQ#P?eG3X`ne6Y>uq5OygstU>=I;s9do}& zF~o%~yY<>-%vQeJlSNhYWt`1b)p)KBFXJWKe~n^3 zMdkCGJfw8RT8y*qze9iPeAMFIe}%1(y+>odc>gUvxMFO2%D8ACd)1L}%Fnzr;u%}? z*Lj8~L^_|vw)RLDn_p6@YJnEm@;gj9)@<>` zjZ26zeFZSt&;h1P1jO}-xPbZry_mjthkq~PT%unOdQ5*z$G;5&E(200isBWDfM31@ zYJn?xkwVGg_&GWVC1w#yrcKu-C6gsP;Lqu`$Jc^Y&v7~Ii*aG6q8J~j1Q$lEmB33b z&c5k2^ali#G^A^aSQJICc+Hn47Abwjh*6|opkRq3bI5(xy=2H*P^~-5Z2J*LaAQZ$Xx;D9Q*K9Ti?dMbkaD+q*`}=J5=}DvTneGrF^*svAXg z#Q97c1}PHwi&EEUlcFXa&#j6m_DF>)I8T9x?vATkMp?viO+d#0$|w3Ws(wio5ooP) zw<96Ff#M!Wf#);s`+@)3Z~Cu8pSKZLosb1#@QVPSyX{p(4`{28P*q$jeUmz^+QCj@ a?G$$?9fiDEYq~?}$~{DUj-6S6`2G*2oDB*9 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain_meta_data.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_chain_meta_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14878adf33d680c69f2877f3492ca1b8ea1ca635 GIT binary patch literal 6253 zcmb_gO^g%C74B}g|9U(F11vDG>{cKPcq43fH>*`f><9uZ8bvYD42dEqsOfRl%rw~D zrn<~BmXRV2r`&T&q%emZ$Z4}m6h%4bkV9@!4lU&rDbk+zmM9_Ls~$H!w&#Z>ZFhD3 zyn6lKtM9$8SK;)uW8k{|yJsse<_zN>)W}{o8dq^gmr-z|X>gNUZL?|Wr`5FdGuO=B zGI);LPYrGhdo$O}b8FeC=Di!HVK@xeopnE0i@qItlC!0o%Xiqd?=3od2*Y)JbEwddTZiJ-CL+Jc8&$%LvNnl z{P6O7iIBIuB7np!>WUV7BxHmc^X&cFWv#;X5KLNX9(t^XS9c1c32uo%NKXmQRyO7t z2^>MV$&*M4EFYt?a9^umf)w}WRQm-wpuX}#*U7@@ip7Q!p z6uy=Y}>qy%sU(f1iLa^lU}EmtoMx&5Kv5T0F5Rk zJUd>{^V;o=nqJiY$+jPd)w5l9fpA_RpkkE&Irv=2WWH zBCqD-saDD}iVv^)GE!~;KCT~d@i@*?J&KP@uyhCX!Az#2{&WAtW9UK13qs~b3bZHzvBm<3Z=HO z%)=tuu(C+C5{haewjUxWJhBSe;Z;J3m$xcaN1ToWJEMer!fMz?y~ zU#WLD5FLXLYVTdHBN&QHU9a^30StsIF2y>x)%FqE>e?jH_QRz>_!2N3c#q5BKDF*f zTylXdU%74#vP5T56s&?d{FPAKc{`^4qJL^^9cn{1EkyqGqB`A#nlA}L1LMAdl{EW* zyd@CWwTr#PI}2CQ1rHu)KN_61C(;LIUJBKd2+DWJUB3!1;zHNFR2y9}&vx_f^p(#| zS%xln%;2FHF)0pHlYH(P?k~w*3Z?#;ab+@MwuowYQJrpWF8V-g#~FhE_sg$lGA9XX zTD7i+7?(BA|HEDfG*?3&g(_7mu@;$UlF7bdmi>ps&tQ zV<-b7dJtJB4{U-0d(&_%E zu|xfaMCOsk1yXo4E>K^O`VX||e@ho#zWml@LhWm#;C0#V3X73_nBGffQBolrOhO55 zHhw~b8YLIUQ8HQNePQ$W6gHC?>|x4r98G4C0BiEt9_$Z@v^_1_kf&g?;Ri`?*hZoa z_5GCWdLZC^J_&d}Ke!gVM4gOrUWMBz%$A0G=0%koF9$P3wuR?18QFo0dGQ@~S}RDo>4py=iTl z*!@{ojE5yvM0%711=6Eur7hYOCjB(CjQ(q?jG1;a^O>_{WM?C#8q!axil+bJz#u9} zQ-U=4C*T8`Jl=JCK#5kqe||~ts*@dhl3pQE?h2`Vfdm_W#{HHW`w-`#@-pd8TM>or zJ~ts>8SgWcdy%JfSK3}@g?kI16Jy#R zA2<5nNLMa}e?AJA+?QMtTQ6GWElGc?uZakF^|8n&FXZVi~PrN8T69oMDg_Y!GufOq9`t| zAv=RTVh5*PI3DwGiWS@R35|0duPfgIFa7@5CJV;-gbS#n-iki1kYu82LGPvF0+PaB zTgA5KX}WR#k=O2tIQKwojLJ(Z@N3-BMHIGm%yLX*d&mGSv+`fZp4n~{tjd3!f@2=0 zw$-28btT43PJ4gt8I(6AUh&M@GPVeFCX)LM=5Q{EgF_qvcA-FeR;Tkrk>vZ;TwLgO zL8ani7b$bcQ^~qah-q;F-~h`%k#=OB8LNMCqTC=F6MLAFMdbH@vO!RWz$fVl^PU#r z9`gc@deW$x@|z%?6kRFbCZ$~W&qG;C*5rITAsdUYa{c`V zILQ|X*ZnKWN3U{rk&TF|`37CpqojP`bd!z^hg)OY&J7C+K zCcpAmdP=zDowMkROWUDxL!Sl2g-9rP`=m3X1h5(_A7ZBb78UbUyi`Zm^vMG0K^btg zgra2Fre#|t3*Je;!oRKZ%eqstj>0?3j%hi2KTA&ObjdE+mEtgNEYSPkM-f|6$a7RF cB%sk0lSD&|POP;+K{28wg=kL6EFp^g59Xpt3IG5A literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_node.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_node.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cdf6f06388a84b1769d994144b9da44558da9e4e GIT binary patch literal 7325 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 Glm7uKRn*u3 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_node_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/rule_node_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5119ba4e9d821fbd2c9bdd18a6c1065c17d9dbc GIT binary patch literal 3187 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/security_settings.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/security_settings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..329a0727f8f36b11e6aebfa0c68aacdbeccfbf2a GIT binary patch literal 5028 zcmb_g&2JmW72jPh$<>;Y<&VggohE|>NJ;}Houolg!7<{-A829FM&uR+(PFdQ8A&UV zyX%>uZ4q=Ya{quHdMMh1bac<{DVLs${soKPddk_i0%`htvm{HCVpODFX})LPy!Yn! z-n?PDyzE=}?*HYm^M^Mq>z~w^{#-OZMN-$0ajR`{n>$^*ZJW|*JEknPOLr|^;_h>c zyTUyvwaeVuwCd&XmTg%+!}o9}PPWyL(@=8u`R&bz?B;`?_-5ozDp{N;E&Gv<(?qeI z^a;}`3;TK}mGM9@DIWEO(u!qW5h}qR$12wBddPO9*!txC9j&vCW>cFTIGwpUL)w>R;kLNm3~w|TdzU5Yqi}=W{`lGl1(WwP zk$_{SG7+)ILMp7-U>`QF84*59K_t=}kYg+T^i@X8gu5aUGSq^z&i)1?h7~y8j`dEz z(}>buQ#}c{w}mtuj_Xm%#kNQqnC5>4^;@lo^677KJbyy3uy8CE9Z9>iWO0WMgqQzV zYP-C`tK2j7GJl)<{M2*1T@h7YU-%d~Gig=%S$@up zoD!!na(>+6Z}7F}R=dV8@QWyy`8vOZa)n>!Z=yWSzsKJ~xyqLS43@8Mil{GRy}v26 zCTI*)>;A*r8w3=^qHd@ZLj@p68I&;59@9I5jWonaL*r4PD3j^7410~@$Zn-LMa={U zR%lT{vlk})u-n~lm~+WXaiZI2f2M?dfE}Ntl0QhhakQV80LXeNU+;xagRL;`3LbRR z?KlZStwk@>DnFf#Rs>nGG7 zpb&4Ra$9`V6v<;X?Jb(!xYNw`;cb$S8XsJ1!nug6Ss3lXAz)%BAm0&0-59Q-X@pm! zB7kF2BOC{61ms4xpL;=o{d5pq0V8S+S;eW?^yf{IZ@b?N)@L=`7_W@rIVT_0DbX>% zB>9Kdu7xAA2Y5NT~x89IK_a!{s!`DKXNYb|<^?oME zP3p;3FKp>SAQY!in3F5AWopua{}AaVfxO}kuFT1>Q0$17j6bT6?c^n0dBzULIR6`* z(05j%U$`41UlzjuEIx_XuFrXOw&W_Lt2>1@jlGaD%&7Dxx{ONwrG+??r-_g~_;P}< z8T0*rarIrv87NJmiLCs=E8cq=TuUVVnTZOFG7PlHjP6nYS!9EG51pB%1z=`67t@=u=ZT^Un0$+#S`xwE1U1IN&Y*_+evTy1BRdf@f1hCH z1PA{=%Q9tT)4u6-k)Nn)7+J9KsVz>)9hvPPK0o#)ojJ#Y?eTn5f{>yf9cLzkB@ zqcL<3y(79Lihf$Tg#Md)2`k-V<)MFMO|KrhlliA~&CLJB(4tx3#sfFyXP|>QW$bl- zNFi2v@ZRU z%NY9&k|IFV?6q%PyS|JFK7N`nVLo0NqNnoZ(W@aKZ>aL>w!p(r%iPCn63@>Nuf*K# z#!BaJHCxz5P_j%*Z%FhE2CD$seSENe0!DJ&fwyla~U1PoW|)(};sP;_-zSb_V_@Phk@HA4j53w3cU$K0uT z1uTK&Z%H`P&Wba*a2(s1GspEfJW~`70>>8N82nzO9|*oM9DKpTgrib7iR>T!OV z0&tQk2!1za#dD4gwu@PFewfV5sPGah0IjWIUaCs(B62W8d)L{cUpSm81D1Wk;w{!m z^$trryCOnN8A`$M>qXeTQ!mMPh+7hq*dtH{!HXhL%gb0KqN)U)gLGXJlG1&GU z*RCC>(qi766cd%2h!;}qIkiHmS0*4>#I<=l6Xyj}9}@4c#stJ(B7)$M*rTod<5{CQ z^-``Vx6vUwSmmDT-$LS&w(*kzILib z=~tX(7~zs{JN~Ps=X;ku*K=#tu{-z??Q<1b?noiuqDrNJgPCz03-G*!E^d&oQ*>Hj K!S`$r&fz~)kU63N literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/server_security_config.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/server_security_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b555579556c986142226c44d7b4a8e1bb4c35555 GIT binary patch literal 8949 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 J*&ckxe*qiEFhKwS literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/sign_up_request.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/sign_up_request.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e1bc9e68e1a145e5e85092565736df197ae5ad3 GIT binary patch literal 5747 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tb_resource.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tb_resource.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..220d385fcae7e85df771f3213e2e5022131cde80 GIT binary patch literal 7544 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 YL+L1F&sx(h%31DF;&bfG0tESg0GO5(&Hw-a literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tb_resource_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tb_resource_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a392444152def18979a1386c97cd9c98808fb96c GIT binary patch literal 6580 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12aa69cc58941371afd037516b274693f5cf3395 GIT binary patch literal 10892 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2afbfd375fe1383f75b8606f94c2eb2d74848a5 GIT binary patch literal 3155 zcmb7GU2hx56`ffw$>oZYWydw*_GOwNNtwc=)1WVeBILu4;TO4x6rg1rY?eDiY31cE zH8XS~f_kY8)U@ z8#JW1&pOTc31=)6Xa`4WerP@~VlBm2PxlYRXTN(Mx|J^rEz;arJxy#{SU^nHDZ#f*eLNTHK`Rlu{hFd^vMTD)=v7po^>}2>4t7v^kk8k9@dps zd7>~g_E9`ZdmrpBuNT-d9jn~Nbg!7ihia!6?{+!s%O`}m^@QfmoP{ zO2jLr4NmmMZ@Q123SSfulGr}<7!{vh2jVt7Q@PTyRZst%DdPW{s>pFy&qvs*5PIFG`FceeJ&IFd%cnGsF@K4#o#kW{uGrT9(OCdKPlh}E0l!8=};we9Ou(G%TBw_xO+*>>0AvoCo9m?+{0kmIlJI3Ef9q{^Gr>*0T=Uf8sh|Icg-C;jT=MR>{9PtX0;{ter9`+q-Yvo|t_7Q6~Rmd6m37IDLn(oBb8u~uEd4R!!vyuZ}3-|F$ zEX;|)-d@?XMMUSXys~)|o7h^d@8AT|C;$G2y~|)Hi^oG5?|x2#i7yY>?41>-7NWX4 zS&_t<*~O&V?j-&+!uMAQA2JC~=(|8$d+0Dfba+Q7lMb=Jr|DWJP?MT^8w0@lNC)E^ zc=cOYdyej+w#^^>%jccVvS!ln%NF))I%5W#ixlfplqs8s3Z>5KGDQ7E!HrQDOFv7E zEog?5|i(B(BviM7*kye%8ZOViAjzLUwLvi>U0rmC#HRHrxb zlGHxB`4tA=yYGcO)hS&Z_*a-PHy?e9mn+~{TX~N^;U<;Ef1}?ly zc1aB5v+g>>kX!Htf^UflaIcEK%WbME0Lbi($ppJ>*_{T^aGim9u{et^1H5#1$B#;u~P)3K|eBx+=U5iPk!Nud_vJ=J6P>Wf(6$#u#*}4oC$?eqDuCig2MW9v$b55pYp+BVI*R+3g@hy?4EQ5^y)V~&O zaYc{}ejnYCD+A_p&)*6>AFig`ZdOs-)KpOPyBJDOEB!M}2Cc<6Oe!_; f!tGqU%3VrVAwgD3?ow(p^q2491|E2Ae!uo_M|M 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_profile_configuration.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_profile_configuration.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5d0a5efa451a8172c85440660937c600ac934dc GIT binary patch literal 2774 zcmai0OK%%D5Z;#_UdwJ;1VNJ?%A`e7wTR?2Edm&hku)!~1?(VpfkJ4pp>`>0Bqy%Jv6m|F0wjSWJgY7cWg5{9mkAr$9-Z&ZshG*kte)ew^NCnHLF?S4{gix8J_h) zoc7gs8J7`z_GoRL-GBPMZ)P56lEtagaun(~OBEYrFPY95AL&6RtG|isgym zO0cb1#hNW~Hjtus_r^f$e6iiuW`{2A(2BEml!dB|c_Bp_3P?)dz(%0`!3HjPINco!w-d4S^+Lk?6%K5)!9utqlH3)9%bgu?l58j8m>Nd1x1&5=rmS zk`?Uo*IxT4h1|E(ILzA6iF=vsi`#9HZmDVhwUfBp&bPte^mgmkLK}1yH*+3tfMQVW z2E@i7Ok$9)ZQ!V*ApljiiF|+WS)eWQn z^TZ-8ps52*We0YkQ^8)V6UugFeEpfwBZ;y>%qdfg$mK%nSb&xIu_zAp8@>~NT(mVb zbqSreCSVWn&0s(K0233mrn6GibQaM1L#L<>xZ+w%IfE5VyRcswR+JruvZya5eAtcn zGF3}OnYm<*zd0u}N5)%ANfz=%Ekh^`m_5$Md>y7s%$KbQxse|NzkAtuaoKp#L;W>A zcq^~TU1Lxhi4F|ldm!cTEf3@z=I)>=@~2^6`q#6YbA_woSH%qUC9P4#+|jWP^mZ;( zQR@rTP%R4|g&CEcqu>@^5-VM}L!Qf7*fRSU9)+@~lvbdvMqP8*CB>>)m2}+{Rh*7d zq6^R1w1c9u#gmaJ+zqk)HeO1_7ifw)&$;OMwr_iO)pqR0KfX7A^j38mfBRM6zCiEJ z_}cqZaw_%&&775a2<181cMhxrVxc{5O|uYp87@0qTRA*AxnHv0{}gSyMK#Z%rHfjQ zA~NKZm>LOJdGfi zFHKusB{c7Xgc3yF1;G<&7^2tTSAt6YkYF4?B$IUm>k0%=+SWLRsz#-p3em)V;cU>S zgfn%}lP>O0LQ7#A$oswJ?EE4imh=V|E z2EmV5XPEChp4~V<%;kzx{+xuFP8kZPz2P*i2hdam!84ko zM4ropARyh9W`n|z@*!RdKL}7HN4Qslq7ekN+tEx7p~^xe_9NKs%+cYCyCW?EI>I&D zkPchPiEAWL5t28kqswusquOD@PnJx5ty`Y$cwWtO>u%kve}d*UYR9MkE7JcIUExR} jFOX0z^J+AvESrtUJW6fp#xj*O^9|rRb-!-cQ3L)10btC- literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_profile_data.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_profile_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7925644d7a12a74b7b2468f5c999c98830a385ed GIT binary patch literal 3449 zcmb_eTW=f372a7c$>o}q?OfbAedxe#?J|W)r$Ny|Py{EjW3&%)8mT}*G}sJxhSbXB z?s{hEL@f0r{SfKV@9lHZzp<}<%3mnZy5E@<6;T(UElO}MyL;x$ch33FnaMky$iwgX zUyg^r?s(qc>EZk@z{6uS^9Y^v2A*WnpRfUQqd)N7SR2%yd9o&hBToh@IIIoo(%<&F zb@7CGUc~X+*-f*t`7{?=@-Lrm@9;1lUI}B-uUYhr1o|rzqE3L9bVP@<@ zQKbC`o6GGvL}pW!SwZ{qLX6c$Uu^a`|1r<sp~g-ZAk|7v)6jAk-)%0pN@3dx|>@}w_oDH{YBeT;Saj;zbZ5gRmA zQ#NIIsKULLY%QN;BySvfgGjbz2jdO7CU0VF%Ukj`#*TbTzKwBB1_oZ4q- z<{mo97G7NSYypbTn7+B7ckt;p-ot8t-dj;mR`Z8k@F~ogaH&RVhA^iY->yQs)vc9l z@hZZOOiiNGX_^U}YfVvn?U#X3lTr2H=_cO&<4^tH8*r_krAgk0bUMoQSbfx2*(-CN z@BK+S>=*mUm+Yh7hmZP55B0DR$qP^#g2R~DA19L(WbZqm=5&aW8rDTIhT|!Wv4lmv zV!sUI7(3cHzEAFpaQ>qejm~2$P_Jhux!$pG$-uvE|F^D-s%&xw76R$D>ZbpX z=l)~IZD}$|*Qq0(U+~(m@XC2DYOQdIyiCn;>Cc#?-T|}TF%opoKVeV2uRi{xf8Za~ zY;EB!{6qgBu)!j*^+R9Zvvu2`v+BrO1c&}1(tF`=crQcSTm-TPiQXbO4o}F@)q7gm z!uwBb3oB7ZY2|Tr;+`TZ{)T`Tfe zWdpfaC~Z@PVu?SOX<}DwryL?iZKIhx=qxfxGT>`rKX!r-3(6~ht8CglruC>O&0S%H zwOY5aqRUG5?FE0A;l@Nvhf-|*mJ}0J?|Ac{U#9A*&fdl(PsGG*Vp6Shs;`H7{|xF~ zoJfFs8?bA49r(Kr_y`vT2R+#Oj;wSFwVUBWLZ|~&v*`uk`WC+Z4$TlF+U(AofOR`% z&7|L!Ey!zHW6I9yArlifP1zhP9QIb15pEE;atPcE%3zWjTh^wc&}-1;_AdkSU|FxU zK-$cP?vqHe=weAz%*olR^RIGrpm>#xLQrpnq2wSN&WMc`93^D}gT|BfF~A!QBb zv-ZEDVD0p&;kW-8H6nJ4p8fgVYa?;VjiP{*Et>@novE-@Ty8-51=Gp~$N`mK;ge&~nm>Q7NjYtB~NxBBSD1EU|?C)kjq&cB$r4ia9jz zV}cZ87Aa<$bn;V?S+G6-1zl|Yb4jdcil-w!%W&VW@xpIcZvEhl2iL)N z*DZoxp?W~zSBrGnh~rGf@r3ZvR?#)sNT|!Ux;M%2Oib}uMsbXiH^V(6F57WT8=Zb> z!Z~?@2)+xIgAV0XI-FS*Q)agCt_)AhO`daC?Y0{{I?If<+ V3bnPebd!piyFdj#G_w%d|8HLkbJ_p^ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_profile_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/tenant_profile_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6695d389f2a3f999e203bacef6a13b7953219f35 GIT binary patch literal 3261 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/uri.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/uri.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb840363432b711e8b921c2d8ec6c721469dd6f1 GIT binary patch literal 12182 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 xWj=4}rd~DD)#W1-pn7pb%OxD{?I{rbv2s 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/user_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/user_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22c4c13e92c691eae25e880d3951276540aa3fb5 GIT binary patch literal 3125 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 D!r*-Z literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/widget_type.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/widget_type.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4a14f79211245da2c1353714c6134762adca300 GIT binary patch literal 6742 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/widgets_bundle.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/__pycache__/widgets_bundle.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5aacc8e3fe89b08f43e7c913ac501c0091e2a192 GIT binary patch literal 6838 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/admin_settings.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/admin_settings.py new file mode 100644 index 0000000..0758688 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/admin_settings.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AdminSettings(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'created_time': 'int', + 'id': 'AdminSettingsId', + 'json_value': 'str', + 'key': 'str' + } + + attribute_map = { + 'created_time': 'createdTime', + 'id': 'id', + 'json_value': 'jsonValue', + 'key': 'key' + } + + def __init__(self, created_time=None, id=None, json_value=None, key=None): # noqa: E501 + """AdminSettings - a model defined in Swagger""" # noqa: E501 + self._created_time = None + self._id = None + self._json_value = None + self._key = None + self.discriminator = None + if created_time is not None: + self.created_time = created_time + if id is not None: + self.id = id + if json_value is not None: + self.json_value = json_value + if key is not None: + self.key = key + + @property + def created_time(self): + """Gets the created_time of this AdminSettings. # noqa: E501 + + + :return: The created_time of this AdminSettings. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this AdminSettings. + + + :param created_time: The created_time of this AdminSettings. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def id(self): + """Gets the id of this AdminSettings. # noqa: E501 + + + :return: The id of this AdminSettings. # noqa: E501 + :rtype: AdminSettingsId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this AdminSettings. + + + :param id: The id of this AdminSettings. # noqa: E501 + :type: AdminSettingsId + """ + + self._id = id + + @property + def json_value(self): + """Gets the json_value of this AdminSettings. # noqa: E501 + + + :return: The json_value of this AdminSettings. # noqa: E501 + :rtype: str + """ + return self._json_value + + @json_value.setter + def json_value(self, json_value): + """Sets the json_value of this AdminSettings. + + + :param json_value: The json_value of this AdminSettings. # noqa: E501 + :type: str + """ + + self._json_value = json_value + + @property + def key(self): + """Gets the key of this AdminSettings. # noqa: E501 + + + :return: The key of this AdminSettings. # noqa: E501 + :rtype: str + """ + return self._key + + @key.setter + def key(self, key): + """Sets the key of this AdminSettings. + + + :param key: The key of this AdminSettings. # noqa: E501 + :type: str + """ + + self._key = key + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AdminSettings, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AdminSettings): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/admin_settings_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/admin_settings_id.py new file mode 100644 index 0000000..4d13848 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/admin_settings_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class AdminSettingsId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """AdminSettingsId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this AdminSettingsId. # noqa: E501 + + + :return: The id of this AdminSettingsId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this AdminSettingsId. + + + :param id: The id of this AdminSettingsId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AdminSettingsId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AdminSettingsId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm.py new file mode 100644 index 0000000..5eae8d1 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm.py @@ -0,0 +1,512 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Alarm(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'ack_ts': 'int', + 'clear_ts': 'int', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'details': 'str', + 'end_ts': 'int', + 'id': 'AlarmId', + 'name': 'str', + 'originator': 'EntityId', + 'propagate': 'bool', + 'propagate_relation_types': 'list[str]', + 'severity': 'str', + 'start_ts': 'int', + 'status': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'ack_ts': 'ackTs', + 'clear_ts': 'clearTs', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'details': 'details', + 'end_ts': 'endTs', + 'id': 'id', + 'name': 'name', + 'originator': 'originator', + 'propagate': 'propagate', + 'propagate_relation_types': 'propagateRelationTypes', + 'severity': 'severity', + 'start_ts': 'startTs', + 'status': 'status', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, ack_ts=None, clear_ts=None, created_time=None, customer_id=None, details=None, end_ts=None, id=None, name=None, originator=None, propagate=None, propagate_relation_types=None, severity=None, start_ts=None, status=None, tenant_id=None, type=None): # noqa: E501 + """Alarm - a model defined in Swagger""" # noqa: E501 + self._ack_ts = None + self._clear_ts = None + self._created_time = None + self._customer_id = None + self._details = None + self._end_ts = None + self._id = None + self._name = None + self._originator = None + self._propagate = None + self._propagate_relation_types = None + self._severity = None + self._start_ts = None + self._status = None + self._tenant_id = None + self._type = None + self.discriminator = None + if ack_ts is not None: + self.ack_ts = ack_ts + if clear_ts is not None: + self.clear_ts = clear_ts + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if details is not None: + self.details = details + if end_ts is not None: + self.end_ts = end_ts + if id is not None: + self.id = id + if name is not None: + self.name = name + if originator is not None: + self.originator = originator + if propagate is not None: + self.propagate = propagate + if propagate_relation_types is not None: + self.propagate_relation_types = propagate_relation_types + if severity is not None: + self.severity = severity + if start_ts is not None: + self.start_ts = start_ts + if status is not None: + self.status = status + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def ack_ts(self): + """Gets the ack_ts of this Alarm. # noqa: E501 + + + :return: The ack_ts of this Alarm. # noqa: E501 + :rtype: int + """ + return self._ack_ts + + @ack_ts.setter + def ack_ts(self, ack_ts): + """Sets the ack_ts of this Alarm. + + + :param ack_ts: The ack_ts of this Alarm. # noqa: E501 + :type: int + """ + + self._ack_ts = ack_ts + + @property + def clear_ts(self): + """Gets the clear_ts of this Alarm. # noqa: E501 + + + :return: The clear_ts of this Alarm. # noqa: E501 + :rtype: int + """ + return self._clear_ts + + @clear_ts.setter + def clear_ts(self, clear_ts): + """Sets the clear_ts of this Alarm. + + + :param clear_ts: The clear_ts of this Alarm. # noqa: E501 + :type: int + """ + + self._clear_ts = clear_ts + + @property + def created_time(self): + """Gets the created_time of this Alarm. # noqa: E501 + + + :return: The created_time of this Alarm. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Alarm. + + + :param created_time: The created_time of this Alarm. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this Alarm. # noqa: E501 + + + :return: The customer_id of this Alarm. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this Alarm. + + + :param customer_id: The customer_id of this Alarm. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def details(self): + """Gets the details of this Alarm. # noqa: E501 + + + :return: The details of this Alarm. # noqa: E501 + :rtype: str + """ + return self._details + + @details.setter + def details(self, details): + """Sets the details of this Alarm. + + + :param details: The details of this Alarm. # noqa: E501 + :type: str + """ + + self._details = details + + @property + def end_ts(self): + """Gets the end_ts of this Alarm. # noqa: E501 + + + :return: The end_ts of this Alarm. # noqa: E501 + :rtype: int + """ + return self._end_ts + + @end_ts.setter + def end_ts(self, end_ts): + """Sets the end_ts of this Alarm. + + + :param end_ts: The end_ts of this Alarm. # noqa: E501 + :type: int + """ + + self._end_ts = end_ts + + @property + def id(self): + """Gets the id of this Alarm. # noqa: E501 + + + :return: The id of this Alarm. # noqa: E501 + :rtype: AlarmId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Alarm. + + + :param id: The id of this Alarm. # noqa: E501 + :type: AlarmId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this Alarm. # noqa: E501 + + + :return: The name of this Alarm. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Alarm. + + + :param name: The name of this Alarm. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def originator(self): + """Gets the originator of this Alarm. # noqa: E501 + + + :return: The originator of this Alarm. # noqa: E501 + :rtype: EntityId + """ + return self._originator + + @originator.setter + def originator(self, originator): + """Sets the originator of this Alarm. + + + :param originator: The originator of this Alarm. # noqa: E501 + :type: EntityId + """ + + self._originator = originator + + @property + def propagate(self): + """Gets the propagate of this Alarm. # noqa: E501 + + + :return: The propagate of this Alarm. # noqa: E501 + :rtype: bool + """ + return self._propagate + + @propagate.setter + def propagate(self, propagate): + """Sets the propagate of this Alarm. + + + :param propagate: The propagate of this Alarm. # noqa: E501 + :type: bool + """ + + self._propagate = propagate + + @property + def propagate_relation_types(self): + """Gets the propagate_relation_types of this Alarm. # noqa: E501 + + + :return: The propagate_relation_types of this Alarm. # noqa: E501 + :rtype: list[str] + """ + return self._propagate_relation_types + + @propagate_relation_types.setter + def propagate_relation_types(self, propagate_relation_types): + """Sets the propagate_relation_types of this Alarm. + + + :param propagate_relation_types: The propagate_relation_types of this Alarm. # noqa: E501 + :type: list[str] + """ + + self._propagate_relation_types = propagate_relation_types + + @property + def severity(self): + """Gets the severity of this Alarm. # noqa: E501 + + + :return: The severity of this Alarm. # noqa: E501 + :rtype: str + """ + return self._severity + + @severity.setter + def severity(self, severity): + """Sets the severity of this Alarm. + + + :param severity: The severity of this Alarm. # noqa: E501 + :type: str + """ + allowed_values = ["CRITICAL", "MAJOR", "MINOR", "WARNING", "INDETERMINATE"] # noqa: E501 + if severity not in allowed_values: + raise ValueError( + "Invalid value for `severity` ({0}), must be one of {1}" # noqa: E501 + .format(severity, allowed_values) + ) + + self._severity = severity + + @property + def start_ts(self): + """Gets the start_ts of this Alarm. # noqa: E501 + + + :return: The start_ts of this Alarm. # noqa: E501 + :rtype: int + """ + return self._start_ts + + @start_ts.setter + def start_ts(self, start_ts): + """Sets the start_ts of this Alarm. + + + :param start_ts: The start_ts of this Alarm. # noqa: E501 + :type: int + """ + + self._start_ts = start_ts + + @property + def status(self): + """Gets the status of this Alarm. # noqa: E501 + + + :return: The status of this Alarm. # noqa: E501 + :rtype: str + """ + return self._status + + @status.setter + def status(self, status): + """Sets the status of this Alarm. + + + :param status: The status of this Alarm. # noqa: E501 + :type: str + """ + allowed_values = ["ACTIVE_UNACK", "ACTIVE_ACK", "CLEARED_UNACK", "CLEARED_ACK"] # noqa: E501 + if status not in allowed_values: + raise ValueError( + "Invalid value for `status` ({0}), must be one of {1}" # noqa: E501 + .format(status, allowed_values) + ) + + self._status = status + + @property + def tenant_id(self): + """Gets the tenant_id of this Alarm. # noqa: E501 + + + :return: The tenant_id of this Alarm. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Alarm. + + + :param tenant_id: The tenant_id of this Alarm. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this Alarm. # noqa: E501 + + + :return: The type of this Alarm. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Alarm. + + + :param type: The type of this Alarm. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Alarm, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Alarm): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition.py new file mode 100644 index 0000000..702e569 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AlarmCondition(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'condition': 'list[AlarmConditionFilter]', + 'spec': 'AlarmConditionSpec' + } + + attribute_map = { + 'condition': 'condition', + 'spec': 'spec' + } + + def __init__(self, condition=None, spec=None): # noqa: E501 + """AlarmCondition - a model defined in Swagger""" # noqa: E501 + self._condition = None + self._spec = None + self.discriminator = None + if condition is not None: + self.condition = condition + if spec is not None: + self.spec = spec + + @property + def condition(self): + """Gets the condition of this AlarmCondition. # noqa: E501 + + + :return: The condition of this AlarmCondition. # noqa: E501 + :rtype: list[AlarmConditionFilter] + """ + return self._condition + + @condition.setter + def condition(self, condition): + """Sets the condition of this AlarmCondition. + + + :param condition: The condition of this AlarmCondition. # noqa: E501 + :type: list[AlarmConditionFilter] + """ + + self._condition = condition + + @property + def spec(self): + """Gets the spec of this AlarmCondition. # noqa: E501 + + + :return: The spec of this AlarmCondition. # noqa: E501 + :rtype: AlarmConditionSpec + """ + return self._spec + + @spec.setter + def spec(self, spec): + """Sets the spec of this AlarmCondition. + + + :param spec: The spec of this AlarmCondition. # noqa: E501 + :type: AlarmConditionSpec + """ + + self._spec = spec + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AlarmCondition, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AlarmCondition): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition_filter.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition_filter.py new file mode 100644 index 0000000..eb55e17 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition_filter.py @@ -0,0 +1,194 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AlarmConditionFilter(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'key': 'AlarmConditionFilterKey', + 'predicate': 'KeyFilterPredicate', + 'value': 'object', + 'value_type': 'str' + } + + attribute_map = { + 'key': 'key', + 'predicate': 'predicate', + 'value': 'value', + 'value_type': 'valueType' + } + + def __init__(self, key=None, predicate=None, value=None, value_type=None): # noqa: E501 + """AlarmConditionFilter - a model defined in Swagger""" # noqa: E501 + self._key = None + self._predicate = None + self._value = None + self._value_type = None + self.discriminator = None + if key is not None: + self.key = key + if predicate is not None: + self.predicate = predicate + if value is not None: + self.value = value + if value_type is not None: + self.value_type = value_type + + @property + def key(self): + """Gets the key of this AlarmConditionFilter. # noqa: E501 + + + :return: The key of this AlarmConditionFilter. # noqa: E501 + :rtype: AlarmConditionFilterKey + """ + return self._key + + @key.setter + def key(self, key): + """Sets the key of this AlarmConditionFilter. + + + :param key: The key of this AlarmConditionFilter. # noqa: E501 + :type: AlarmConditionFilterKey + """ + + self._key = key + + @property + def predicate(self): + """Gets the predicate of this AlarmConditionFilter. # noqa: E501 + + + :return: The predicate of this AlarmConditionFilter. # noqa: E501 + :rtype: KeyFilterPredicate + """ + return self._predicate + + @predicate.setter + def predicate(self, predicate): + """Sets the predicate of this AlarmConditionFilter. + + + :param predicate: The predicate of this AlarmConditionFilter. # noqa: E501 + :type: KeyFilterPredicate + """ + + self._predicate = predicate + + @property + def value(self): + """Gets the value of this AlarmConditionFilter. # noqa: E501 + + + :return: The value of this AlarmConditionFilter. # noqa: E501 + :rtype: object + """ + return self._value + + @value.setter + def value(self, value): + """Sets the value of this AlarmConditionFilter. + + + :param value: The value of this AlarmConditionFilter. # noqa: E501 + :type: object + """ + + self._value = value + + @property + def value_type(self): + """Gets the value_type of this AlarmConditionFilter. # noqa: E501 + + + :return: The value_type of this AlarmConditionFilter. # noqa: E501 + :rtype: str + """ + return self._value_type + + @value_type.setter + def value_type(self, value_type): + """Sets the value_type of this AlarmConditionFilter. + + + :param value_type: The value_type of this AlarmConditionFilter. # noqa: E501 + :type: str + """ + allowed_values = ["STRING", "NUMERIC", "BOOLEAN", "DATE_TIME"] # noqa: E501 + if value_type not in allowed_values: + raise ValueError( + "Invalid value for `value_type` ({0}), must be one of {1}" # noqa: E501 + .format(value_type, allowed_values) + ) + + self._value_type = value_type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AlarmConditionFilter, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AlarmConditionFilter): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition_filter_key.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition_filter_key.py new file mode 100644 index 0000000..9c833b7 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition_filter_key.py @@ -0,0 +1,142 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AlarmConditionFilterKey(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'key': 'str', + 'type': 'str' + } + + attribute_map = { + 'key': 'key', + 'type': 'type' + } + + def __init__(self, key=None, type=None): # noqa: E501 + """AlarmConditionFilterKey - a model defined in Swagger""" # noqa: E501 + self._key = None + self._type = None + self.discriminator = None + if key is not None: + self.key = key + if type is not None: + self.type = type + + @property + def key(self): + """Gets the key of this AlarmConditionFilterKey. # noqa: E501 + + + :return: The key of this AlarmConditionFilterKey. # noqa: E501 + :rtype: str + """ + return self._key + + @key.setter + def key(self, key): + """Sets the key of this AlarmConditionFilterKey. + + + :param key: The key of this AlarmConditionFilterKey. # noqa: E501 + :type: str + """ + + self._key = key + + @property + def type(self): + """Gets the type of this AlarmConditionFilterKey. # noqa: E501 + + + :return: The type of this AlarmConditionFilterKey. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this AlarmConditionFilterKey. + + + :param type: The type of this AlarmConditionFilterKey. # noqa: E501 + :type: str + """ + allowed_values = ["ATTRIBUTE", "TIME_SERIES", "ENTITY_FIELD", "CONSTANT"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AlarmConditionFilterKey, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AlarmConditionFilterKey): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition_spec.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition_spec.py new file mode 100644 index 0000000..174e58d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_condition_spec.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AlarmConditionSpec(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """AlarmConditionSpec - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AlarmConditionSpec, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AlarmConditionSpec): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_data.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_data.py new file mode 100644 index 0000000..25a43d5 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_data.py @@ -0,0 +1,590 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AlarmData(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'ack_ts': 'int', + 'clear_ts': 'int', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'details': 'str', + 'end_ts': 'int', + 'entity_id': 'EntityId', + 'id': 'AlarmId', + 'latest': 'dict(str, dict(str, TsValue))', + 'name': 'str', + 'originator': 'EntityId', + 'originator_name': 'str', + 'propagate': 'bool', + 'propagate_relation_types': 'list[str]', + 'severity': 'str', + 'start_ts': 'int', + 'status': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'ack_ts': 'ackTs', + 'clear_ts': 'clearTs', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'details': 'details', + 'end_ts': 'endTs', + 'entity_id': 'entityId', + 'id': 'id', + 'latest': 'latest', + 'name': 'name', + 'originator': 'originator', + 'originator_name': 'originatorName', + 'propagate': 'propagate', + 'propagate_relation_types': 'propagateRelationTypes', + 'severity': 'severity', + 'start_ts': 'startTs', + 'status': 'status', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, ack_ts=None, clear_ts=None, created_time=None, customer_id=None, details=None, end_ts=None, entity_id=None, id=None, latest=None, name=None, originator=None, originator_name=None, propagate=None, propagate_relation_types=None, severity=None, start_ts=None, status=None, tenant_id=None, type=None): # noqa: E501 + """AlarmData - a model defined in Swagger""" # noqa: E501 + self._ack_ts = None + self._clear_ts = None + self._created_time = None + self._customer_id = None + self._details = None + self._end_ts = None + self._entity_id = None + self._id = None + self._latest = None + self._name = None + self._originator = None + self._originator_name = None + self._propagate = None + self._propagate_relation_types = None + self._severity = None + self._start_ts = None + self._status = None + self._tenant_id = None + self._type = None + self.discriminator = None + if ack_ts is not None: + self.ack_ts = ack_ts + if clear_ts is not None: + self.clear_ts = clear_ts + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if details is not None: + self.details = details + if end_ts is not None: + self.end_ts = end_ts + if entity_id is not None: + self.entity_id = entity_id + if id is not None: + self.id = id + if latest is not None: + self.latest = latest + if name is not None: + self.name = name + if originator is not None: + self.originator = originator + if originator_name is not None: + self.originator_name = originator_name + if propagate is not None: + self.propagate = propagate + if propagate_relation_types is not None: + self.propagate_relation_types = propagate_relation_types + if severity is not None: + self.severity = severity + if start_ts is not None: + self.start_ts = start_ts + if status is not None: + self.status = status + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def ack_ts(self): + """Gets the ack_ts of this AlarmData. # noqa: E501 + + + :return: The ack_ts of this AlarmData. # noqa: E501 + :rtype: int + """ + return self._ack_ts + + @ack_ts.setter + def ack_ts(self, ack_ts): + """Sets the ack_ts of this AlarmData. + + + :param ack_ts: The ack_ts of this AlarmData. # noqa: E501 + :type: int + """ + + self._ack_ts = ack_ts + + @property + def clear_ts(self): + """Gets the clear_ts of this AlarmData. # noqa: E501 + + + :return: The clear_ts of this AlarmData. # noqa: E501 + :rtype: int + """ + return self._clear_ts + + @clear_ts.setter + def clear_ts(self, clear_ts): + """Sets the clear_ts of this AlarmData. + + + :param clear_ts: The clear_ts of this AlarmData. # noqa: E501 + :type: int + """ + + self._clear_ts = clear_ts + + @property + def created_time(self): + """Gets the created_time of this AlarmData. # noqa: E501 + + + :return: The created_time of this AlarmData. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this AlarmData. + + + :param created_time: The created_time of this AlarmData. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this AlarmData. # noqa: E501 + + + :return: The customer_id of this AlarmData. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this AlarmData. + + + :param customer_id: The customer_id of this AlarmData. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def details(self): + """Gets the details of this AlarmData. # noqa: E501 + + + :return: The details of this AlarmData. # noqa: E501 + :rtype: str + """ + return self._details + + @details.setter + def details(self, details): + """Sets the details of this AlarmData. + + + :param details: The details of this AlarmData. # noqa: E501 + :type: str + """ + + self._details = details + + @property + def end_ts(self): + """Gets the end_ts of this AlarmData. # noqa: E501 + + + :return: The end_ts of this AlarmData. # noqa: E501 + :rtype: int + """ + return self._end_ts + + @end_ts.setter + def end_ts(self, end_ts): + """Sets the end_ts of this AlarmData. + + + :param end_ts: The end_ts of this AlarmData. # noqa: E501 + :type: int + """ + + self._end_ts = end_ts + + @property + def entity_id(self): + """Gets the entity_id of this AlarmData. # noqa: E501 + + + :return: The entity_id of this AlarmData. # noqa: E501 + :rtype: EntityId + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this AlarmData. + + + :param entity_id: The entity_id of this AlarmData. # noqa: E501 + :type: EntityId + """ + + self._entity_id = entity_id + + @property + def id(self): + """Gets the id of this AlarmData. # noqa: E501 + + + :return: The id of this AlarmData. # noqa: E501 + :rtype: AlarmId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this AlarmData. + + + :param id: The id of this AlarmData. # noqa: E501 + :type: AlarmId + """ + + self._id = id + + @property + def latest(self): + """Gets the latest of this AlarmData. # noqa: E501 + + + :return: The latest of this AlarmData. # noqa: E501 + :rtype: dict(str, dict(str, TsValue)) + """ + return self._latest + + @latest.setter + def latest(self, latest): + """Sets the latest of this AlarmData. + + + :param latest: The latest of this AlarmData. # noqa: E501 + :type: dict(str, dict(str, TsValue)) + """ + + self._latest = latest + + @property + def name(self): + """Gets the name of this AlarmData. # noqa: E501 + + + :return: The name of this AlarmData. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this AlarmData. + + + :param name: The name of this AlarmData. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def originator(self): + """Gets the originator of this AlarmData. # noqa: E501 + + + :return: The originator of this AlarmData. # noqa: E501 + :rtype: EntityId + """ + return self._originator + + @originator.setter + def originator(self, originator): + """Sets the originator of this AlarmData. + + + :param originator: The originator of this AlarmData. # noqa: E501 + :type: EntityId + """ + + self._originator = originator + + @property + def originator_name(self): + """Gets the originator_name of this AlarmData. # noqa: E501 + + + :return: The originator_name of this AlarmData. # noqa: E501 + :rtype: str + """ + return self._originator_name + + @originator_name.setter + def originator_name(self, originator_name): + """Sets the originator_name of this AlarmData. + + + :param originator_name: The originator_name of this AlarmData. # noqa: E501 + :type: str + """ + + self._originator_name = originator_name + + @property + def propagate(self): + """Gets the propagate of this AlarmData. # noqa: E501 + + + :return: The propagate of this AlarmData. # noqa: E501 + :rtype: bool + """ + return self._propagate + + @propagate.setter + def propagate(self, propagate): + """Sets the propagate of this AlarmData. + + + :param propagate: The propagate of this AlarmData. # noqa: E501 + :type: bool + """ + + self._propagate = propagate + + @property + def propagate_relation_types(self): + """Gets the propagate_relation_types of this AlarmData. # noqa: E501 + + + :return: The propagate_relation_types of this AlarmData. # noqa: E501 + :rtype: list[str] + """ + return self._propagate_relation_types + + @propagate_relation_types.setter + def propagate_relation_types(self, propagate_relation_types): + """Sets the propagate_relation_types of this AlarmData. + + + :param propagate_relation_types: The propagate_relation_types of this AlarmData. # noqa: E501 + :type: list[str] + """ + + self._propagate_relation_types = propagate_relation_types + + @property + def severity(self): + """Gets the severity of this AlarmData. # noqa: E501 + + + :return: The severity of this AlarmData. # noqa: E501 + :rtype: str + """ + return self._severity + + @severity.setter + def severity(self, severity): + """Sets the severity of this AlarmData. + + + :param severity: The severity of this AlarmData. # noqa: E501 + :type: str + """ + allowed_values = ["CRITICAL", "MAJOR", "MINOR", "WARNING", "INDETERMINATE"] # noqa: E501 + if severity not in allowed_values: + raise ValueError( + "Invalid value for `severity` ({0}), must be one of {1}" # noqa: E501 + .format(severity, allowed_values) + ) + + self._severity = severity + + @property + def start_ts(self): + """Gets the start_ts of this AlarmData. # noqa: E501 + + + :return: The start_ts of this AlarmData. # noqa: E501 + :rtype: int + """ + return self._start_ts + + @start_ts.setter + def start_ts(self, start_ts): + """Sets the start_ts of this AlarmData. + + + :param start_ts: The start_ts of this AlarmData. # noqa: E501 + :type: int + """ + + self._start_ts = start_ts + + @property + def status(self): + """Gets the status of this AlarmData. # noqa: E501 + + + :return: The status of this AlarmData. # noqa: E501 + :rtype: str + """ + return self._status + + @status.setter + def status(self, status): + """Sets the status of this AlarmData. + + + :param status: The status of this AlarmData. # noqa: E501 + :type: str + """ + allowed_values = ["ACTIVE_UNACK", "ACTIVE_ACK", "CLEARED_UNACK", "CLEARED_ACK"] # noqa: E501 + if status not in allowed_values: + raise ValueError( + "Invalid value for `status` ({0}), must be one of {1}" # noqa: E501 + .format(status, allowed_values) + ) + + self._status = status + + @property + def tenant_id(self): + """Gets the tenant_id of this AlarmData. # noqa: E501 + + + :return: The tenant_id of this AlarmData. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this AlarmData. + + + :param tenant_id: The tenant_id of this AlarmData. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this AlarmData. # noqa: E501 + + + :return: The type of this AlarmData. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this AlarmData. + + + :param type: The type of this AlarmData. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AlarmData, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AlarmData): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_data_page_link.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_data_page_link.py new file mode 100644 index 0000000..3280a0e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_data_page_link.py @@ -0,0 +1,417 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AlarmDataPageLink(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'dynamic': 'bool', + 'page': 'int', + 'page_size': 'int', + 'sort_order': 'EntityDataSortOrder', + 'start_ts': 'int', + 'text_search': 'str', + 'end_ts': 'int', + 'time_window': 'int', + 'type_list': 'list[str]', + 'status_list': 'list[str]', + 'severity_list': 'list[str]', + 'search_propagated_alarms': 'bool' + } + + attribute_map = { + 'dynamic': 'dynamic', + 'page': 'page', + 'page_size': 'pageSize', + 'sort_order': 'sortOrder', + 'start_ts': 'startTs', + 'text_search': 'textSearch', + 'end_ts': 'endTs', + 'time_window': 'timeWindow', + 'type_list': 'typeList', + 'status_list': 'statusList', + 'severity_list': 'severityList', + 'search_propagated_alarms': 'searchPropagatedAlarms' + } + + def __init__(self, dynamic=None, page=None, page_size=None, sort_order=None, start_ts=None, text_search=None, end_ts=None, time_window=None, type_list=None, status_list=None, severity_list=None, search_propagated_alarms=None): # noqa: E501 + """AlarmDataPageLink - a model defined in Swagger""" # noqa: E501 + self._dynamic = None + self._page = None + self._page_size = None + self._sort_order = None + self._start_ts = None + self._text_search = None + self._end_ts = None + self._time_window = None + self._type_list = None + self._status_list = None + self._severity_list = None + self._search_propagated_alarms = None + self.discriminator = None + if dynamic is not None: + self.dynamic = dynamic + if page is not None: + self.page = page + if page_size is not None: + self.page_size = page_size + if sort_order is not None: + self.sort_order = sort_order + self.start_ts = start_ts + if text_search is not None: + self.text_search = text_search + self.end_ts = end_ts + self.time_window = time_window + self.type_list = type_list + self.status_list = status_list + self.severity_list = severity_list + self.search_propagated_alarms = search_propagated_alarms + + @property + def dynamic(self): + """Gets the dynamic of this AlarmDataPageLink. # noqa: E501 + + + :return: The dynamic of this AlarmDataPageLink. # noqa: E501 + :rtype: bool + """ + return self._dynamic + + @dynamic.setter + def dynamic(self, dynamic): + """Sets the dynamic of this AlarmDataPageLink. + + + :param dynamic: The dynamic of this AlarmDataPageLink. # noqa: E501 + :type: bool + """ + + self._dynamic = dynamic + + @property + def page(self): + """Gets the page of this AlarmDataPageLink. # noqa: E501 + + + :return: The page of this AlarmDataPageLink. # noqa: E501 + :rtype: int + """ + return self._page + + @page.setter + def page(self, page): + """Sets the page of this AlarmDataPageLink. + + + :param page: The page of this AlarmDataPageLink. # noqa: E501 + :type: int + """ + + self._page = page + + @property + def page_size(self): + """Gets the page_size of this AlarmDataPageLink. # noqa: E501 + + + :return: The page_size of this AlarmDataPageLink. # noqa: E501 + :rtype: int + """ + return self._page_size + + @page_size.setter + def page_size(self, page_size): + """Sets the page_size of this AlarmDataPageLink. + + + :param page_size: The page_size of this AlarmDataPageLink. # noqa: E501 + :type: int + """ + + self._page_size = page_size + + @property + def sort_order(self): + """Gets the sort_order of this AlarmDataPageLink. # noqa: E501 + + + :return: The sort_order of this AlarmDataPageLink. # noqa: E501 + :rtype: EntityDataSortOrder + """ + return self._sort_order + + @sort_order.setter + def sort_order(self, sort_order): + """Sets the sort_order of this AlarmDataPageLink. + + + :param sort_order: The sort_order of this AlarmDataPageLink. # noqa: E501 + :type: EntityDataSortOrder + """ + + self._sort_order = sort_order + + @property + def start_ts(self): + """Gets the start_ts of this AlarmDataPageLink. # noqa: E501 + + + :return: The start_ts of this AlarmDataPageLink. # noqa: E501 + :rtype: int + """ + return self._start_ts + + @start_ts.setter + def start_ts(self, start_ts): + """Sets the start_ts of this AlarmDataPageLink. + + + :param start_ts: The start_ts of this AlarmDataPageLink. # noqa: E501 + :type: int + """ + if start_ts is None: + raise ValueError("Invalid value for `start_ts`, must not be `None`") # noqa: E501 + + self._start_ts = start_ts + + @property + def text_search(self): + """Gets the text_search of this AlarmDataPageLink. # noqa: E501 + + + :return: The text_search of this AlarmDataPageLink. # noqa: E501 + :rtype: str + """ + return self._text_search + + @text_search.setter + def text_search(self, text_search): + """Sets the text_search of this AlarmDataPageLink. + + + :param text_search: The text_search of this AlarmDataPageLink. # noqa: E501 + :type: str + """ + + self._text_search = text_search + + @property + def end_ts(self): + """Gets the end_ts of this AlarmDataPageLink. # noqa: E501 + + + :return: The end_ts of this AlarmDataPageLink. # noqa: E501 + :rtype: int + """ + return self._end_ts + + @end_ts.setter + def end_ts(self, end_ts): + """Sets the end_ts of this AlarmDataPageLink. + + + :param end_ts: The end_ts of this AlarmDataPageLink. # noqa: E501 + :type: int + """ + if end_ts is None: + raise ValueError("Invalid value for `end_ts`, must not be `None`") # noqa: E501 + + self._end_ts = end_ts + + @property + def time_window(self): + """Gets the time_window of this AlarmDataPageLink. # noqa: E501 + + + :return: The time_window of this AlarmDataPageLink. # noqa: E501 + :rtype: int + """ + return self._time_window + + @time_window.setter + def time_window(self, time_window): + """Sets the time_window of this AlarmDataPageLink. + + + :param time_window: The time_window of this AlarmDataPageLink. # noqa: E501 + :type: int + """ + if time_window is None: + raise ValueError("Invalid value for `time_window`, must not be `None`") # noqa: E501 + + self._time_window = time_window + + @property + def type_list(self): + """Gets the type_list of this AlarmDataPageLink. # noqa: E501 + + + :return: The type_list of this AlarmDataPageLink. # noqa: E501 + :rtype: list[str] + """ + return self._type_list + + @type_list.setter + def type_list(self, type_list): + """Sets the type_list of this AlarmDataPageLink. + + + :param type_list: The type_list of this AlarmDataPageLink. # noqa: E501 + :type: list[str] + """ + if type_list is None: + raise ValueError("Invalid value for `type_list`, must not be `None`") # noqa: E501 + + self._type_list = type_list + + @property + def status_list(self): + """Gets the status_list of this AlarmDataPageLink. # noqa: E501 + + + :return: The status_list of this AlarmDataPageLink. # noqa: E501 + :rtype: list[str] + """ + return self._status_list + + @status_list.setter + def status_list(self, status_list): + """Sets the status_list of this AlarmDataPageLink. + + + :param status_list: The status_list of this AlarmDataPageLink. # noqa: E501 + :type: list[str] + """ + if status_list is None: + raise ValueError("Invalid value for `status_list`, must not be `None`") # noqa: E501 + allowed_values = ["ANY", "ACTIVE", "CLEARED", "ACK", "UNACK"] # noqa: E501 + if not set(status_list).issubset(set(allowed_values)): + raise ValueError( + "Invalid values for `status_list` [{0}], must be a subset of [{1}]" # noqa: E501 + .format(", ".join(map(str, set(status_list) - set(allowed_values))), # noqa: E501 + ", ".join(map(str, allowed_values))) + ) + + self._status_list = status_list + + @property + def severity_list(self): + """Gets the severity_list of this AlarmDataPageLink. # noqa: E501 + + + :return: The severity_list of this AlarmDataPageLink. # noqa: E501 + :rtype: list[str] + """ + return self._severity_list + + @severity_list.setter + def severity_list(self, severity_list): + """Sets the severity_list of this AlarmDataPageLink. + + + :param severity_list: The severity_list of this AlarmDataPageLink. # noqa: E501 + :type: list[str] + """ + if severity_list is None: + raise ValueError("Invalid value for `severity_list`, must not be `None`") # noqa: E501 + allowed_values = ["CRITICAL", "MAJOR", "MINOR", "WARNING", "INDETERMINATE"] # noqa: E501 + if not set(severity_list).issubset(set(allowed_values)): + raise ValueError( + "Invalid values for `severity_list` [{0}], must be a subset of [{1}]" # noqa: E501 + .format(", ".join(map(str, set(severity_list) - set(allowed_values))), # noqa: E501 + ", ".join(map(str, allowed_values))) + ) + + self._severity_list = severity_list + + @property + def search_propagated_alarms(self): + """Gets the search_propagated_alarms of this AlarmDataPageLink. # noqa: E501 + + + :return: The search_propagated_alarms of this AlarmDataPageLink. # noqa: E501 + :rtype: bool + """ + return self._search_propagated_alarms + + @search_propagated_alarms.setter + def search_propagated_alarms(self, search_propagated_alarms): + """Sets the search_propagated_alarms of this AlarmDataPageLink. + + + :param search_propagated_alarms: The search_propagated_alarms of this AlarmDataPageLink. # noqa: E501 + :type: bool + """ + if search_propagated_alarms is None: + raise ValueError("Invalid value for `search_propagated_alarms`, must not be `None`") # noqa: E501 + + self._search_propagated_alarms = search_propagated_alarms + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AlarmDataPageLink, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AlarmDataPageLink): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_data_query.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_data_query.py new file mode 100644 index 0000000..65fd4d9 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_data_query.py @@ -0,0 +1,240 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AlarmDataQuery(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'alarm_fields': 'list[EntityKey]', + 'entity_fields': 'list[EntityKey]', + 'entity_filter': 'EntityFilter', + 'key_filters': 'list[KeyFilter]', + 'latest_values': 'list[EntityKey]', + 'page_link': 'AlarmDataPageLink' + } + + attribute_map = { + 'alarm_fields': 'alarmFields', + 'entity_fields': 'entityFields', + 'entity_filter': 'entityFilter', + 'key_filters': 'keyFilters', + 'latest_values': 'latestValues', + 'page_link': 'pageLink' + } + + def __init__(self, alarm_fields=None, entity_fields=None, entity_filter=None, key_filters=None, latest_values=None, page_link=None): # noqa: E501 + """AlarmDataQuery - a model defined in Swagger""" # noqa: E501 + self._alarm_fields = None + self._entity_fields = None + self._entity_filter = None + self._key_filters = None + self._latest_values = None + self._page_link = None + self.discriminator = None + if alarm_fields is not None: + self.alarm_fields = alarm_fields + if entity_fields is not None: + self.entity_fields = entity_fields + if entity_filter is not None: + self.entity_filter = entity_filter + if key_filters is not None: + self.key_filters = key_filters + if latest_values is not None: + self.latest_values = latest_values + if page_link is not None: + self.page_link = page_link + + @property + def alarm_fields(self): + """Gets the alarm_fields of this AlarmDataQuery. # noqa: E501 + + + :return: The alarm_fields of this AlarmDataQuery. # noqa: E501 + :rtype: list[EntityKey] + """ + return self._alarm_fields + + @alarm_fields.setter + def alarm_fields(self, alarm_fields): + """Sets the alarm_fields of this AlarmDataQuery. + + + :param alarm_fields: The alarm_fields of this AlarmDataQuery. # noqa: E501 + :type: list[EntityKey] + """ + + self._alarm_fields = alarm_fields + + @property + def entity_fields(self): + """Gets the entity_fields of this AlarmDataQuery. # noqa: E501 + + + :return: The entity_fields of this AlarmDataQuery. # noqa: E501 + :rtype: list[EntityKey] + """ + return self._entity_fields + + @entity_fields.setter + def entity_fields(self, entity_fields): + """Sets the entity_fields of this AlarmDataQuery. + + + :param entity_fields: The entity_fields of this AlarmDataQuery. # noqa: E501 + :type: list[EntityKey] + """ + + self._entity_fields = entity_fields + + @property + def entity_filter(self): + """Gets the entity_filter of this AlarmDataQuery. # noqa: E501 + + + :return: The entity_filter of this AlarmDataQuery. # noqa: E501 + :rtype: EntityFilter + """ + return self._entity_filter + + @entity_filter.setter + def entity_filter(self, entity_filter): + """Sets the entity_filter of this AlarmDataQuery. + + + :param entity_filter: The entity_filter of this AlarmDataQuery. # noqa: E501 + :type: EntityFilter + """ + + self._entity_filter = entity_filter + + @property + def key_filters(self): + """Gets the key_filters of this AlarmDataQuery. # noqa: E501 + + + :return: The key_filters of this AlarmDataQuery. # noqa: E501 + :rtype: list[KeyFilter] + """ + return self._key_filters + + @key_filters.setter + def key_filters(self, key_filters): + """Sets the key_filters of this AlarmDataQuery. + + + :param key_filters: The key_filters of this AlarmDataQuery. # noqa: E501 + :type: list[KeyFilter] + """ + + self._key_filters = key_filters + + @property + def latest_values(self): + """Gets the latest_values of this AlarmDataQuery. # noqa: E501 + + + :return: The latest_values of this AlarmDataQuery. # noqa: E501 + :rtype: list[EntityKey] + """ + return self._latest_values + + @latest_values.setter + def latest_values(self, latest_values): + """Sets the latest_values of this AlarmDataQuery. + + + :param latest_values: The latest_values of this AlarmDataQuery. # noqa: E501 + :type: list[EntityKey] + """ + + self._latest_values = latest_values + + @property + def page_link(self): + """Gets the page_link of this AlarmDataQuery. # noqa: E501 + + + :return: The page_link of this AlarmDataQuery. # noqa: E501 + :rtype: AlarmDataPageLink + """ + return self._page_link + + @page_link.setter + def page_link(self, page_link): + """Sets the page_link of this AlarmDataQuery. + + + :param page_link: The page_link of this AlarmDataQuery. # noqa: E501 + :type: AlarmDataPageLink + """ + + self._page_link = page_link + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AlarmDataQuery, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AlarmDataQuery): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_id.py new file mode 100644 index 0000000..0a7ef84 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class AlarmId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """AlarmId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this AlarmId. # noqa: E501 + + + :return: The id of this AlarmId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this AlarmId. + + + :param id: The id of this AlarmId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AlarmId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AlarmId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_info.py new file mode 100644 index 0000000..f5fd6f1 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_info.py @@ -0,0 +1,538 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AlarmInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'ack_ts': 'int', + 'clear_ts': 'int', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'details': 'str', + 'end_ts': 'int', + 'id': 'AlarmId', + 'name': 'str', + 'originator': 'EntityId', + 'originator_name': 'str', + 'propagate': 'bool', + 'propagate_relation_types': 'list[str]', + 'severity': 'str', + 'start_ts': 'int', + 'status': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'ack_ts': 'ackTs', + 'clear_ts': 'clearTs', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'details': 'details', + 'end_ts': 'endTs', + 'id': 'id', + 'name': 'name', + 'originator': 'originator', + 'originator_name': 'originatorName', + 'propagate': 'propagate', + 'propagate_relation_types': 'propagateRelationTypes', + 'severity': 'severity', + 'start_ts': 'startTs', + 'status': 'status', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, ack_ts=None, clear_ts=None, created_time=None, customer_id=None, details=None, end_ts=None, id=None, name=None, originator=None, originator_name=None, propagate=None, propagate_relation_types=None, severity=None, start_ts=None, status=None, tenant_id=None, type=None): # noqa: E501 + """AlarmInfo - a model defined in Swagger""" # noqa: E501 + self._ack_ts = None + self._clear_ts = None + self._created_time = None + self._customer_id = None + self._details = None + self._end_ts = None + self._id = None + self._name = None + self._originator = None + self._originator_name = None + self._propagate = None + self._propagate_relation_types = None + self._severity = None + self._start_ts = None + self._status = None + self._tenant_id = None + self._type = None + self.discriminator = None + if ack_ts is not None: + self.ack_ts = ack_ts + if clear_ts is not None: + self.clear_ts = clear_ts + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if details is not None: + self.details = details + if end_ts is not None: + self.end_ts = end_ts + if id is not None: + self.id = id + if name is not None: + self.name = name + if originator is not None: + self.originator = originator + if originator_name is not None: + self.originator_name = originator_name + if propagate is not None: + self.propagate = propagate + if propagate_relation_types is not None: + self.propagate_relation_types = propagate_relation_types + if severity is not None: + self.severity = severity + if start_ts is not None: + self.start_ts = start_ts + if status is not None: + self.status = status + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def ack_ts(self): + """Gets the ack_ts of this AlarmInfo. # noqa: E501 + + + :return: The ack_ts of this AlarmInfo. # noqa: E501 + :rtype: int + """ + return self._ack_ts + + @ack_ts.setter + def ack_ts(self, ack_ts): + """Sets the ack_ts of this AlarmInfo. + + + :param ack_ts: The ack_ts of this AlarmInfo. # noqa: E501 + :type: int + """ + + self._ack_ts = ack_ts + + @property + def clear_ts(self): + """Gets the clear_ts of this AlarmInfo. # noqa: E501 + + + :return: The clear_ts of this AlarmInfo. # noqa: E501 + :rtype: int + """ + return self._clear_ts + + @clear_ts.setter + def clear_ts(self, clear_ts): + """Sets the clear_ts of this AlarmInfo. + + + :param clear_ts: The clear_ts of this AlarmInfo. # noqa: E501 + :type: int + """ + + self._clear_ts = clear_ts + + @property + def created_time(self): + """Gets the created_time of this AlarmInfo. # noqa: E501 + + + :return: The created_time of this AlarmInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this AlarmInfo. + + + :param created_time: The created_time of this AlarmInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this AlarmInfo. # noqa: E501 + + + :return: The customer_id of this AlarmInfo. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this AlarmInfo. + + + :param customer_id: The customer_id of this AlarmInfo. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def details(self): + """Gets the details of this AlarmInfo. # noqa: E501 + + + :return: The details of this AlarmInfo. # noqa: E501 + :rtype: str + """ + return self._details + + @details.setter + def details(self, details): + """Sets the details of this AlarmInfo. + + + :param details: The details of this AlarmInfo. # noqa: E501 + :type: str + """ + + self._details = details + + @property + def end_ts(self): + """Gets the end_ts of this AlarmInfo. # noqa: E501 + + + :return: The end_ts of this AlarmInfo. # noqa: E501 + :rtype: int + """ + return self._end_ts + + @end_ts.setter + def end_ts(self, end_ts): + """Sets the end_ts of this AlarmInfo. + + + :param end_ts: The end_ts of this AlarmInfo. # noqa: E501 + :type: int + """ + + self._end_ts = end_ts + + @property + def id(self): + """Gets the id of this AlarmInfo. # noqa: E501 + + + :return: The id of this AlarmInfo. # noqa: E501 + :rtype: AlarmId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this AlarmInfo. + + + :param id: The id of this AlarmInfo. # noqa: E501 + :type: AlarmId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this AlarmInfo. # noqa: E501 + + + :return: The name of this AlarmInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this AlarmInfo. + + + :param name: The name of this AlarmInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def originator(self): + """Gets the originator of this AlarmInfo. # noqa: E501 + + + :return: The originator of this AlarmInfo. # noqa: E501 + :rtype: EntityId + """ + return self._originator + + @originator.setter + def originator(self, originator): + """Sets the originator of this AlarmInfo. + + + :param originator: The originator of this AlarmInfo. # noqa: E501 + :type: EntityId + """ + + self._originator = originator + + @property + def originator_name(self): + """Gets the originator_name of this AlarmInfo. # noqa: E501 + + + :return: The originator_name of this AlarmInfo. # noqa: E501 + :rtype: str + """ + return self._originator_name + + @originator_name.setter + def originator_name(self, originator_name): + """Sets the originator_name of this AlarmInfo. + + + :param originator_name: The originator_name of this AlarmInfo. # noqa: E501 + :type: str + """ + + self._originator_name = originator_name + + @property + def propagate(self): + """Gets the propagate of this AlarmInfo. # noqa: E501 + + + :return: The propagate of this AlarmInfo. # noqa: E501 + :rtype: bool + """ + return self._propagate + + @propagate.setter + def propagate(self, propagate): + """Sets the propagate of this AlarmInfo. + + + :param propagate: The propagate of this AlarmInfo. # noqa: E501 + :type: bool + """ + + self._propagate = propagate + + @property + def propagate_relation_types(self): + """Gets the propagate_relation_types of this AlarmInfo. # noqa: E501 + + + :return: The propagate_relation_types of this AlarmInfo. # noqa: E501 + :rtype: list[str] + """ + return self._propagate_relation_types + + @propagate_relation_types.setter + def propagate_relation_types(self, propagate_relation_types): + """Sets the propagate_relation_types of this AlarmInfo. + + + :param propagate_relation_types: The propagate_relation_types of this AlarmInfo. # noqa: E501 + :type: list[str] + """ + + self._propagate_relation_types = propagate_relation_types + + @property + def severity(self): + """Gets the severity of this AlarmInfo. # noqa: E501 + + + :return: The severity of this AlarmInfo. # noqa: E501 + :rtype: str + """ + return self._severity + + @severity.setter + def severity(self, severity): + """Sets the severity of this AlarmInfo. + + + :param severity: The severity of this AlarmInfo. # noqa: E501 + :type: str + """ + allowed_values = ["CRITICAL", "MAJOR", "MINOR", "WARNING", "INDETERMINATE"] # noqa: E501 + if severity not in allowed_values: + raise ValueError( + "Invalid value for `severity` ({0}), must be one of {1}" # noqa: E501 + .format(severity, allowed_values) + ) + + self._severity = severity + + @property + def start_ts(self): + """Gets the start_ts of this AlarmInfo. # noqa: E501 + + + :return: The start_ts of this AlarmInfo. # noqa: E501 + :rtype: int + """ + return self._start_ts + + @start_ts.setter + def start_ts(self, start_ts): + """Sets the start_ts of this AlarmInfo. + + + :param start_ts: The start_ts of this AlarmInfo. # noqa: E501 + :type: int + """ + + self._start_ts = start_ts + + @property + def status(self): + """Gets the status of this AlarmInfo. # noqa: E501 + + + :return: The status of this AlarmInfo. # noqa: E501 + :rtype: str + """ + return self._status + + @status.setter + def status(self, status): + """Sets the status of this AlarmInfo. + + + :param status: The status of this AlarmInfo. # noqa: E501 + :type: str + """ + allowed_values = ["ACTIVE_UNACK", "ACTIVE_ACK", "CLEARED_UNACK", "CLEARED_ACK"] # noqa: E501 + if status not in allowed_values: + raise ValueError( + "Invalid value for `status` ({0}), must be one of {1}" # noqa: E501 + .format(status, allowed_values) + ) + + self._status = status + + @property + def tenant_id(self): + """Gets the tenant_id of this AlarmInfo. # noqa: E501 + + + :return: The tenant_id of this AlarmInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this AlarmInfo. + + + :param tenant_id: The tenant_id of this AlarmInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this AlarmInfo. # noqa: E501 + + + :return: The type of this AlarmInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this AlarmInfo. + + + :param type: The type of this AlarmInfo. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AlarmInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AlarmInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_rule.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_rule.py new file mode 100644 index 0000000..c25f449 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_rule.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AlarmRule(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'alarm_details': 'str', + 'condition': 'AlarmCondition', + 'dashboard_id': 'DashboardId', + 'schedule': 'AlarmSchedule' + } + + attribute_map = { + 'alarm_details': 'alarmDetails', + 'condition': 'condition', + 'dashboard_id': 'dashboardId', + 'schedule': 'schedule' + } + + def __init__(self, alarm_details=None, condition=None, dashboard_id=None, schedule=None): # noqa: E501 + """AlarmRule - a model defined in Swagger""" # noqa: E501 + self._alarm_details = None + self._condition = None + self._dashboard_id = None + self._schedule = None + self.discriminator = None + if alarm_details is not None: + self.alarm_details = alarm_details + if condition is not None: + self.condition = condition + if dashboard_id is not None: + self.dashboard_id = dashboard_id + if schedule is not None: + self.schedule = schedule + + @property + def alarm_details(self): + """Gets the alarm_details of this AlarmRule. # noqa: E501 + + + :return: The alarm_details of this AlarmRule. # noqa: E501 + :rtype: str + """ + return self._alarm_details + + @alarm_details.setter + def alarm_details(self, alarm_details): + """Sets the alarm_details of this AlarmRule. + + + :param alarm_details: The alarm_details of this AlarmRule. # noqa: E501 + :type: str + """ + + self._alarm_details = alarm_details + + @property + def condition(self): + """Gets the condition of this AlarmRule. # noqa: E501 + + + :return: The condition of this AlarmRule. # noqa: E501 + :rtype: AlarmCondition + """ + return self._condition + + @condition.setter + def condition(self, condition): + """Sets the condition of this AlarmRule. + + + :param condition: The condition of this AlarmRule. # noqa: E501 + :type: AlarmCondition + """ + + self._condition = condition + + @property + def dashboard_id(self): + """Gets the dashboard_id of this AlarmRule. # noqa: E501 + + + :return: The dashboard_id of this AlarmRule. # noqa: E501 + :rtype: DashboardId + """ + return self._dashboard_id + + @dashboard_id.setter + def dashboard_id(self, dashboard_id): + """Sets the dashboard_id of this AlarmRule. + + + :param dashboard_id: The dashboard_id of this AlarmRule. # noqa: E501 + :type: DashboardId + """ + + self._dashboard_id = dashboard_id + + @property + def schedule(self): + """Gets the schedule of this AlarmRule. # noqa: E501 + + + :return: The schedule of this AlarmRule. # noqa: E501 + :rtype: AlarmSchedule + """ + return self._schedule + + @schedule.setter + def schedule(self, schedule): + """Sets the schedule of this AlarmRule. + + + :param schedule: The schedule of this AlarmRule. # noqa: E501 + :type: AlarmSchedule + """ + + self._schedule = schedule + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AlarmRule, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AlarmRule): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_schedule.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_schedule.py new file mode 100644 index 0000000..d039ca6 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/alarm_schedule.py @@ -0,0 +1,116 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AlarmSchedule(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'type': 'str' + } + + attribute_map = { + 'type': 'type' + } + + def __init__(self, type=None): # noqa: E501 + """AlarmSchedule - a model defined in Swagger""" # noqa: E501 + self._type = None + self.discriminator = None + if type is not None: + self.type = type + + @property + def type(self): + """Gets the type of this AlarmSchedule. # noqa: E501 + + + :return: The type of this AlarmSchedule. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this AlarmSchedule. + + + :param type: The type of this AlarmSchedule. # noqa: E501 + :type: str + """ + allowed_values = ["ANY_TIME", "SPECIFIC_TIME", "CUSTOM"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AlarmSchedule, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AlarmSchedule): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset.py new file mode 100644 index 0000000..1978242 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset.py @@ -0,0 +1,292 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Asset(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'id': 'AssetId', + 'label': 'str', + 'name': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'id': 'id', + 'label': 'label', + 'name': 'name', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, created_time=None, customer_id=None, id=None, label=None, name=None, tenant_id=None, type=None): # noqa: E501 + """Asset - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._customer_id = None + self._id = None + self._label = None + self._name = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if id is not None: + self.id = id + if label is not None: + self.label = label + if name is not None: + self.name = name + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this Asset. # noqa: E501 + + + :return: The additional_info of this Asset. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Asset. + + + :param additional_info: The additional_info of this Asset. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this Asset. # noqa: E501 + + + :return: The created_time of this Asset. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Asset. + + + :param created_time: The created_time of this Asset. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this Asset. # noqa: E501 + + + :return: The customer_id of this Asset. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this Asset. + + + :param customer_id: The customer_id of this Asset. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def id(self): + """Gets the id of this Asset. # noqa: E501 + + + :return: The id of this Asset. # noqa: E501 + :rtype: AssetId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Asset. + + + :param id: The id of this Asset. # noqa: E501 + :type: AssetId + """ + + self._id = id + + @property + def label(self): + """Gets the label of this Asset. # noqa: E501 + + + :return: The label of this Asset. # noqa: E501 + :rtype: str + """ + return self._label + + @label.setter + def label(self, label): + """Sets the label of this Asset. + + + :param label: The label of this Asset. # noqa: E501 + :type: str + """ + + self._label = label + + @property + def name(self): + """Gets the name of this Asset. # noqa: E501 + + + :return: The name of this Asset. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Asset. + + + :param name: The name of this Asset. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def tenant_id(self): + """Gets the tenant_id of this Asset. # noqa: E501 + + + :return: The tenant_id of this Asset. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Asset. + + + :param tenant_id: The tenant_id of this Asset. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this Asset. # noqa: E501 + + + :return: The type of this Asset. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Asset. + + + :param type: The type of this Asset. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Asset, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Asset): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset_id.py new file mode 100644 index 0000000..e175807 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class AssetId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """AssetId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this AssetId. # noqa: E501 + + + :return: The id of this AssetId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this AssetId. + + + :param id: The id of this AssetId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AssetId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AssetId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset_info.py new file mode 100644 index 0000000..5c50f90 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset_info.py @@ -0,0 +1,344 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AssetInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'customer_is_public': 'bool', + 'customer_title': 'str', + 'id': 'AssetId', + 'label': 'str', + 'name': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'customer_is_public': 'customerIsPublic', + 'customer_title': 'customerTitle', + 'id': 'id', + 'label': 'label', + 'name': 'name', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, created_time=None, customer_id=None, customer_is_public=None, customer_title=None, id=None, label=None, name=None, tenant_id=None, type=None): # noqa: E501 + """AssetInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._customer_id = None + self._customer_is_public = None + self._customer_title = None + self._id = None + self._label = None + self._name = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if customer_is_public is not None: + self.customer_is_public = customer_is_public + if customer_title is not None: + self.customer_title = customer_title + if id is not None: + self.id = id + if label is not None: + self.label = label + if name is not None: + self.name = name + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this AssetInfo. # noqa: E501 + + + :return: The additional_info of this AssetInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this AssetInfo. + + + :param additional_info: The additional_info of this AssetInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this AssetInfo. # noqa: E501 + + + :return: The created_time of this AssetInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this AssetInfo. + + + :param created_time: The created_time of this AssetInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this AssetInfo. # noqa: E501 + + + :return: The customer_id of this AssetInfo. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this AssetInfo. + + + :param customer_id: The customer_id of this AssetInfo. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def customer_is_public(self): + """Gets the customer_is_public of this AssetInfo. # noqa: E501 + + + :return: The customer_is_public of this AssetInfo. # noqa: E501 + :rtype: bool + """ + return self._customer_is_public + + @customer_is_public.setter + def customer_is_public(self, customer_is_public): + """Sets the customer_is_public of this AssetInfo. + + + :param customer_is_public: The customer_is_public of this AssetInfo. # noqa: E501 + :type: bool + """ + + self._customer_is_public = customer_is_public + + @property + def customer_title(self): + """Gets the customer_title of this AssetInfo. # noqa: E501 + + + :return: The customer_title of this AssetInfo. # noqa: E501 + :rtype: str + """ + return self._customer_title + + @customer_title.setter + def customer_title(self, customer_title): + """Sets the customer_title of this AssetInfo. + + + :param customer_title: The customer_title of this AssetInfo. # noqa: E501 + :type: str + """ + + self._customer_title = customer_title + + @property + def id(self): + """Gets the id of this AssetInfo. # noqa: E501 + + + :return: The id of this AssetInfo. # noqa: E501 + :rtype: AssetId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this AssetInfo. + + + :param id: The id of this AssetInfo. # noqa: E501 + :type: AssetId + """ + + self._id = id + + @property + def label(self): + """Gets the label of this AssetInfo. # noqa: E501 + + + :return: The label of this AssetInfo. # noqa: E501 + :rtype: str + """ + return self._label + + @label.setter + def label(self, label): + """Sets the label of this AssetInfo. + + + :param label: The label of this AssetInfo. # noqa: E501 + :type: str + """ + + self._label = label + + @property + def name(self): + """Gets the name of this AssetInfo. # noqa: E501 + + + :return: The name of this AssetInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this AssetInfo. + + + :param name: The name of this AssetInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def tenant_id(self): + """Gets the tenant_id of this AssetInfo. # noqa: E501 + + + :return: The tenant_id of this AssetInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this AssetInfo. + + + :param tenant_id: The tenant_id of this AssetInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this AssetInfo. # noqa: E501 + + + :return: The type of this AssetInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this AssetInfo. + + + :param type: The type of this AssetInfo. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AssetInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AssetInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset_search_query.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset_search_query.py new file mode 100644 index 0000000..6b5ade6 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/asset_search_query.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AssetSearchQuery(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'asset_types': 'list[str]', + 'parameters': 'RelationsSearchParameters', + 'relation_type': 'str' + } + + attribute_map = { + 'asset_types': 'assetTypes', + 'parameters': 'parameters', + 'relation_type': 'relationType' + } + + def __init__(self, asset_types=None, parameters=None, relation_type=None): # noqa: E501 + """AssetSearchQuery - a model defined in Swagger""" # noqa: E501 + self._asset_types = None + self._parameters = None + self._relation_type = None + self.discriminator = None + if asset_types is not None: + self.asset_types = asset_types + if parameters is not None: + self.parameters = parameters + if relation_type is not None: + self.relation_type = relation_type + + @property + def asset_types(self): + """Gets the asset_types of this AssetSearchQuery. # noqa: E501 + + + :return: The asset_types of this AssetSearchQuery. # noqa: E501 + :rtype: list[str] + """ + return self._asset_types + + @asset_types.setter + def asset_types(self, asset_types): + """Sets the asset_types of this AssetSearchQuery. + + + :param asset_types: The asset_types of this AssetSearchQuery. # noqa: E501 + :type: list[str] + """ + + self._asset_types = asset_types + + @property + def parameters(self): + """Gets the parameters of this AssetSearchQuery. # noqa: E501 + + + :return: The parameters of this AssetSearchQuery. # noqa: E501 + :rtype: RelationsSearchParameters + """ + return self._parameters + + @parameters.setter + def parameters(self, parameters): + """Sets the parameters of this AssetSearchQuery. + + + :param parameters: The parameters of this AssetSearchQuery. # noqa: E501 + :type: RelationsSearchParameters + """ + + self._parameters = parameters + + @property + def relation_type(self): + """Gets the relation_type of this AssetSearchQuery. # noqa: E501 + + + :return: The relation_type of this AssetSearchQuery. # noqa: E501 + :rtype: str + """ + return self._relation_type + + @relation_type.setter + def relation_type(self, relation_type): + """Sets the relation_type of this AssetSearchQuery. + + + :param relation_type: The relation_type of this AssetSearchQuery. # noqa: E501 + :type: str + """ + + self._relation_type = relation_type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AssetSearchQuery, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AssetSearchQuery): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/attributes_entity_view.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/attributes_entity_view.py new file mode 100644 index 0000000..caaeef9 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/attributes_entity_view.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AttributesEntityView(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'cs': 'list[str]', + 'sh': 'list[str]', + 'ss': 'list[str]' + } + + attribute_map = { + 'cs': 'cs', + 'sh': 'sh', + 'ss': 'ss' + } + + def __init__(self, cs=None, sh=None, ss=None): # noqa: E501 + """AttributesEntityView - a model defined in Swagger""" # noqa: E501 + self._cs = None + self._sh = None + self._ss = None + self.discriminator = None + if cs is not None: + self.cs = cs + if sh is not None: + self.sh = sh + if ss is not None: + self.ss = ss + + @property + def cs(self): + """Gets the cs of this AttributesEntityView. # noqa: E501 + + + :return: The cs of this AttributesEntityView. # noqa: E501 + :rtype: list[str] + """ + return self._cs + + @cs.setter + def cs(self, cs): + """Sets the cs of this AttributesEntityView. + + + :param cs: The cs of this AttributesEntityView. # noqa: E501 + :type: list[str] + """ + + self._cs = cs + + @property + def sh(self): + """Gets the sh of this AttributesEntityView. # noqa: E501 + + + :return: The sh of this AttributesEntityView. # noqa: E501 + :rtype: list[str] + """ + return self._sh + + @sh.setter + def sh(self, sh): + """Sets the sh of this AttributesEntityView. + + + :param sh: The sh of this AttributesEntityView. # noqa: E501 + :type: list[str] + """ + + self._sh = sh + + @property + def ss(self): + """Gets the ss of this AttributesEntityView. # noqa: E501 + + + :return: The ss of this AttributesEntityView. # noqa: E501 + :rtype: list[str] + """ + return self._ss + + @ss.setter + def ss(self, ss): + """Sets the ss of this AttributesEntityView. + + + :param ss: The ss of this AttributesEntityView. # noqa: E501 + :type: list[str] + """ + + self._ss = ss + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AttributesEntityView, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AttributesEntityView): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/audit_log.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/audit_log.py new file mode 100644 index 0000000..ed405d9 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/audit_log.py @@ -0,0 +1,408 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AuditLog(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action_data': 'str', + 'action_failure_details': 'str', + 'action_status': 'str', + 'action_type': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'entity_id': 'EntityId', + 'entity_name': 'str', + 'id': 'AuditLogId', + 'tenant_id': 'TenantId', + 'user_id': 'UserId', + 'user_name': 'str' + } + + attribute_map = { + 'action_data': 'actionData', + 'action_failure_details': 'actionFailureDetails', + 'action_status': 'actionStatus', + 'action_type': 'actionType', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'entity_id': 'entityId', + 'entity_name': 'entityName', + 'id': 'id', + 'tenant_id': 'tenantId', + 'user_id': 'userId', + 'user_name': 'userName' + } + + def __init__(self, action_data=None, action_failure_details=None, action_status=None, action_type=None, created_time=None, customer_id=None, entity_id=None, entity_name=None, id=None, tenant_id=None, user_id=None, user_name=None): # noqa: E501 + """AuditLog - a model defined in Swagger""" # noqa: E501 + self._action_data = None + self._action_failure_details = None + self._action_status = None + self._action_type = None + self._created_time = None + self._customer_id = None + self._entity_id = None + self._entity_name = None + self._id = None + self._tenant_id = None + self._user_id = None + self._user_name = None + self.discriminator = None + if action_data is not None: + self.action_data = action_data + if action_failure_details is not None: + self.action_failure_details = action_failure_details + if action_status is not None: + self.action_status = action_status + if action_type is not None: + self.action_type = action_type + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if entity_id is not None: + self.entity_id = entity_id + if entity_name is not None: + self.entity_name = entity_name + if id is not None: + self.id = id + if tenant_id is not None: + self.tenant_id = tenant_id + if user_id is not None: + self.user_id = user_id + if user_name is not None: + self.user_name = user_name + + @property + def action_data(self): + """Gets the action_data of this AuditLog. # noqa: E501 + + + :return: The action_data of this AuditLog. # noqa: E501 + :rtype: str + """ + return self._action_data + + @action_data.setter + def action_data(self, action_data): + """Sets the action_data of this AuditLog. + + + :param action_data: The action_data of this AuditLog. # noqa: E501 + :type: str + """ + + self._action_data = action_data + + @property + def action_failure_details(self): + """Gets the action_failure_details of this AuditLog. # noqa: E501 + + + :return: The action_failure_details of this AuditLog. # noqa: E501 + :rtype: str + """ + return self._action_failure_details + + @action_failure_details.setter + def action_failure_details(self, action_failure_details): + """Sets the action_failure_details of this AuditLog. + + + :param action_failure_details: The action_failure_details of this AuditLog. # noqa: E501 + :type: str + """ + + self._action_failure_details = action_failure_details + + @property + def action_status(self): + """Gets the action_status of this AuditLog. # noqa: E501 + + + :return: The action_status of this AuditLog. # noqa: E501 + :rtype: str + """ + return self._action_status + + @action_status.setter + def action_status(self, action_status): + """Sets the action_status of this AuditLog. + + + :param action_status: The action_status of this AuditLog. # noqa: E501 + :type: str + """ + allowed_values = ["SUCCESS", "FAILURE"] # noqa: E501 + if action_status not in allowed_values: + raise ValueError( + "Invalid value for `action_status` ({0}), must be one of {1}" # noqa: E501 + .format(action_status, allowed_values) + ) + + self._action_status = action_status + + @property + def action_type(self): + """Gets the action_type of this AuditLog. # noqa: E501 + + + :return: The action_type of this AuditLog. # noqa: E501 + :rtype: str + """ + return self._action_type + + @action_type.setter + def action_type(self, action_type): + """Sets the action_type of this AuditLog. + + + :param action_type: The action_type of this AuditLog. # noqa: E501 + :type: str + """ + allowed_values = ["ADDED", "DELETED", "UPDATED", "ATTRIBUTES_UPDATED", "ATTRIBUTES_DELETED", "TIMESERIES_UPDATED", "TIMESERIES_DELETED", "RPC_CALL", "CREDENTIALS_UPDATED", "ASSIGNED_TO_CUSTOMER", "UNASSIGNED_FROM_CUSTOMER", "ACTIVATED", "SUSPENDED", "CREDENTIALS_READ", "ATTRIBUTES_READ", "RELATION_ADD_OR_UPDATE", "RELATION_DELETED", "RELATIONS_DELETED", "ALARM_ACK", "ALARM_CLEAR", "ALARM_DELETE", "LOGIN", "LOGOUT", "LOCKOUT", "ASSIGNED_FROM_TENANT", "ASSIGNED_TO_TENANT", "PROVISION_SUCCESS", "PROVISION_FAILURE", "ASSIGNED_TO_EDGE", "UNASSIGNED_FROM_EDGE"] # noqa: E501 + if action_type not in allowed_values: + raise ValueError( + "Invalid value for `action_type` ({0}), must be one of {1}" # noqa: E501 + .format(action_type, allowed_values) + ) + + self._action_type = action_type + + @property + def created_time(self): + """Gets the created_time of this AuditLog. # noqa: E501 + + + :return: The created_time of this AuditLog. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this AuditLog. + + + :param created_time: The created_time of this AuditLog. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this AuditLog. # noqa: E501 + + + :return: The customer_id of this AuditLog. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this AuditLog. + + + :param customer_id: The customer_id of this AuditLog. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def entity_id(self): + """Gets the entity_id of this AuditLog. # noqa: E501 + + + :return: The entity_id of this AuditLog. # noqa: E501 + :rtype: EntityId + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this AuditLog. + + + :param entity_id: The entity_id of this AuditLog. # noqa: E501 + :type: EntityId + """ + + self._entity_id = entity_id + + @property + def entity_name(self): + """Gets the entity_name of this AuditLog. # noqa: E501 + + + :return: The entity_name of this AuditLog. # noqa: E501 + :rtype: str + """ + return self._entity_name + + @entity_name.setter + def entity_name(self, entity_name): + """Sets the entity_name of this AuditLog. + + + :param entity_name: The entity_name of this AuditLog. # noqa: E501 + :type: str + """ + + self._entity_name = entity_name + + @property + def id(self): + """Gets the id of this AuditLog. # noqa: E501 + + + :return: The id of this AuditLog. # noqa: E501 + :rtype: AuditLogId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this AuditLog. + + + :param id: The id of this AuditLog. # noqa: E501 + :type: AuditLogId + """ + + self._id = id + + @property + def tenant_id(self): + """Gets the tenant_id of this AuditLog. # noqa: E501 + + + :return: The tenant_id of this AuditLog. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this AuditLog. + + + :param tenant_id: The tenant_id of this AuditLog. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def user_id(self): + """Gets the user_id of this AuditLog. # noqa: E501 + + + :return: The user_id of this AuditLog. # noqa: E501 + :rtype: UserId + """ + return self._user_id + + @user_id.setter + def user_id(self, user_id): + """Sets the user_id of this AuditLog. + + + :param user_id: The user_id of this AuditLog. # noqa: E501 + :type: UserId + """ + + self._user_id = user_id + + @property + def user_name(self): + """Gets the user_name of this AuditLog. # noqa: E501 + + + :return: The user_name of this AuditLog. # noqa: E501 + :rtype: str + """ + return self._user_name + + @user_name.setter + def user_name(self, user_name): + """Sets the user_name of this AuditLog. + + + :param user_name: The user_name of this AuditLog. # noqa: E501 + :type: str + """ + + self._user_name = user_name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AuditLog, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AuditLog): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/audit_log_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/audit_log_id.py new file mode 100644 index 0000000..2867fe8 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/audit_log_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class AuditLogId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """AuditLogId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this AuditLogId. # noqa: E501 + + + :return: The id of this AuditLogId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this AuditLogId. + + + :param id: The id of this AuditLogId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AuditLogId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AuditLogId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/byte_buffer.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/byte_buffer.py new file mode 100644 index 0000000..6a2c961 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/byte_buffer.py @@ -0,0 +1,292 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ByteBuffer(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'char': 'str', + 'direct': 'bool', + 'double': 'float', + '_float': 'float', + '_int': 'int', + 'long': 'int', + 'read_only': 'bool', + 'short': 'int' + } + + attribute_map = { + 'char': 'char', + 'direct': 'direct', + 'double': 'double', + '_float': 'float', + '_int': 'int', + 'long': 'long', + 'read_only': 'readOnly', + 'short': 'short' + } + + def __init__(self, char=None, direct=None, double=None, _float=None, _int=None, long=None, read_only=None, short=None): # noqa: E501 + """ByteBuffer - a model defined in Swagger""" # noqa: E501 + self._char = None + self._direct = None + self._double = None + self.__float = None + self.__int = None + self._long = None + self._read_only = None + self._short = None + self.discriminator = None + if char is not None: + self.char = char + if direct is not None: + self.direct = direct + if double is not None: + self.double = double + if _float is not None: + self._float = _float + if _int is not None: + self._int = _int + if long is not None: + self.long = long + if read_only is not None: + self.read_only = read_only + if short is not None: + self.short = short + + @property + def char(self): + """Gets the char of this ByteBuffer. # noqa: E501 + + + :return: The char of this ByteBuffer. # noqa: E501 + :rtype: str + """ + return self._char + + @char.setter + def char(self, char): + """Sets the char of this ByteBuffer. + + + :param char: The char of this ByteBuffer. # noqa: E501 + :type: str + """ + + self._char = char + + @property + def direct(self): + """Gets the direct of this ByteBuffer. # noqa: E501 + + + :return: The direct of this ByteBuffer. # noqa: E501 + :rtype: bool + """ + return self._direct + + @direct.setter + def direct(self, direct): + """Sets the direct of this ByteBuffer. + + + :param direct: The direct of this ByteBuffer. # noqa: E501 + :type: bool + """ + + self._direct = direct + + @property + def double(self): + """Gets the double of this ByteBuffer. # noqa: E501 + + + :return: The double of this ByteBuffer. # noqa: E501 + :rtype: float + """ + return self._double + + @double.setter + def double(self, double): + """Sets the double of this ByteBuffer. + + + :param double: The double of this ByteBuffer. # noqa: E501 + :type: float + """ + + self._double = double + + @property + def _float(self): + """Gets the _float of this ByteBuffer. # noqa: E501 + + + :return: The _float of this ByteBuffer. # noqa: E501 + :rtype: float + """ + return self.__float + + @_float.setter + def _float(self, _float): + """Sets the _float of this ByteBuffer. + + + :param _float: The _float of this ByteBuffer. # noqa: E501 + :type: float + """ + + self.__float = _float + + @property + def _int(self): + """Gets the _int of this ByteBuffer. # noqa: E501 + + + :return: The _int of this ByteBuffer. # noqa: E501 + :rtype: int + """ + return self.__int + + @_int.setter + def _int(self, _int): + """Sets the _int of this ByteBuffer. + + + :param _int: The _int of this ByteBuffer. # noqa: E501 + :type: int + """ + + self.__int = _int + + @property + def long(self): + """Gets the long of this ByteBuffer. # noqa: E501 + + + :return: The long of this ByteBuffer. # noqa: E501 + :rtype: int + """ + return self._long + + @long.setter + def long(self, long): + """Sets the long of this ByteBuffer. + + + :param long: The long of this ByteBuffer. # noqa: E501 + :type: int + """ + + self._long = long + + @property + def read_only(self): + """Gets the read_only of this ByteBuffer. # noqa: E501 + + + :return: The read_only of this ByteBuffer. # noqa: E501 + :rtype: bool + """ + return self._read_only + + @read_only.setter + def read_only(self, read_only): + """Sets the read_only of this ByteBuffer. + + + :param read_only: The read_only of this ByteBuffer. # noqa: E501 + :type: bool + """ + + self._read_only = read_only + + @property + def short(self): + """Gets the short of this ByteBuffer. # noqa: E501 + + + :return: The short of this ByteBuffer. # noqa: E501 + :rtype: int + """ + return self._short + + @short.setter + def short(self, short): + """Sets the short of this ByteBuffer. + + + :param short: The short of this ByteBuffer. # noqa: E501 + :type: int + """ + + self._short = short + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ByteBuffer, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ByteBuffer): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/claim_request.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/claim_request.py new file mode 100644 index 0000000..385e3e9 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/claim_request.py @@ -0,0 +1,111 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ClaimRequest(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'secret_key': 'str' + } + + attribute_map = { + 'secret_key': 'secretKey' + } + + def __init__(self, secret_key=None): # noqa: E501 + """ClaimRequest - a model defined in Swagger""" # noqa: E501 + self._secret_key = None + self.discriminator = None + self.secret_key = secret_key + + @property + def secret_key(self): + """Gets the secret_key of this ClaimRequest. # noqa: E501 + + + :return: The secret_key of this ClaimRequest. # noqa: E501 + :rtype: str + """ + return self._secret_key + + @secret_key.setter + def secret_key(self, secret_key): + """Sets the secret_key of this ClaimRequest. + + + :param secret_key: The secret_key of this ClaimRequest. # noqa: E501 + :type: str + """ + if secret_key is None: + raise ValueError("Invalid value for `secret_key`, must not be `None`") # noqa: E501 + + self._secret_key = secret_key + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ClaimRequest, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ClaimRequest): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/component_descriptor.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/component_descriptor.py new file mode 100644 index 0000000..1399f00 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/component_descriptor.py @@ -0,0 +1,304 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ComponentDescriptor(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'actions': 'str', + 'clazz': 'str', + 'configuration_descriptor': 'str', + 'created_time': 'int', + 'id': 'ComponentDescriptorId', + 'name': 'str', + 'scope': 'str', + 'type': 'str' + } + + attribute_map = { + 'actions': 'actions', + 'clazz': 'clazz', + 'configuration_descriptor': 'configurationDescriptor', + 'created_time': 'createdTime', + 'id': 'id', + 'name': 'name', + 'scope': 'scope', + 'type': 'type' + } + + def __init__(self, actions=None, clazz=None, configuration_descriptor=None, created_time=None, id=None, name=None, scope=None, type=None): # noqa: E501 + """ComponentDescriptor - a model defined in Swagger""" # noqa: E501 + self._actions = None + self._clazz = None + self._configuration_descriptor = None + self._created_time = None + self._id = None + self._name = None + self._scope = None + self._type = None + self.discriminator = None + if actions is not None: + self.actions = actions + if clazz is not None: + self.clazz = clazz + if configuration_descriptor is not None: + self.configuration_descriptor = configuration_descriptor + if created_time is not None: + self.created_time = created_time + if id is not None: + self.id = id + if name is not None: + self.name = name + if scope is not None: + self.scope = scope + if type is not None: + self.type = type + + @property + def actions(self): + """Gets the actions of this ComponentDescriptor. # noqa: E501 + + + :return: The actions of this ComponentDescriptor. # noqa: E501 + :rtype: str + """ + return self._actions + + @actions.setter + def actions(self, actions): + """Sets the actions of this ComponentDescriptor. + + + :param actions: The actions of this ComponentDescriptor. # noqa: E501 + :type: str + """ + + self._actions = actions + + @property + def clazz(self): + """Gets the clazz of this ComponentDescriptor. # noqa: E501 + + + :return: The clazz of this ComponentDescriptor. # noqa: E501 + :rtype: str + """ + return self._clazz + + @clazz.setter + def clazz(self, clazz): + """Sets the clazz of this ComponentDescriptor. + + + :param clazz: The clazz of this ComponentDescriptor. # noqa: E501 + :type: str + """ + + self._clazz = clazz + + @property + def configuration_descriptor(self): + """Gets the configuration_descriptor of this ComponentDescriptor. # noqa: E501 + + + :return: The configuration_descriptor of this ComponentDescriptor. # noqa: E501 + :rtype: str + """ + return self._configuration_descriptor + + @configuration_descriptor.setter + def configuration_descriptor(self, configuration_descriptor): + """Sets the configuration_descriptor of this ComponentDescriptor. + + + :param configuration_descriptor: The configuration_descriptor of this ComponentDescriptor. # noqa: E501 + :type: str + """ + + self._configuration_descriptor = configuration_descriptor + + @property + def created_time(self): + """Gets the created_time of this ComponentDescriptor. # noqa: E501 + + + :return: The created_time of this ComponentDescriptor. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this ComponentDescriptor. + + + :param created_time: The created_time of this ComponentDescriptor. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def id(self): + """Gets the id of this ComponentDescriptor. # noqa: E501 + + + :return: The id of this ComponentDescriptor. # noqa: E501 + :rtype: ComponentDescriptorId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this ComponentDescriptor. + + + :param id: The id of this ComponentDescriptor. # noqa: E501 + :type: ComponentDescriptorId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this ComponentDescriptor. # noqa: E501 + + + :return: The name of this ComponentDescriptor. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this ComponentDescriptor. + + + :param name: The name of this ComponentDescriptor. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def scope(self): + """Gets the scope of this ComponentDescriptor. # noqa: E501 + + + :return: The scope of this ComponentDescriptor. # noqa: E501 + :rtype: str + """ + return self._scope + + @scope.setter + def scope(self, scope): + """Sets the scope of this ComponentDescriptor. + + + :param scope: The scope of this ComponentDescriptor. # noqa: E501 + :type: str + """ + allowed_values = ["SYSTEM", "TENANT"] # noqa: E501 + if scope not in allowed_values: + raise ValueError( + "Invalid value for `scope` ({0}), must be one of {1}" # noqa: E501 + .format(scope, allowed_values) + ) + + self._scope = scope + + @property + def type(self): + """Gets the type of this ComponentDescriptor. # noqa: E501 + + + :return: The type of this ComponentDescriptor. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this ComponentDescriptor. + + + :param type: The type of this ComponentDescriptor. # noqa: E501 + :type: str + """ + allowed_values = ["ENRICHMENT", "FILTER", "TRANSFORMATION", "ACTION", "EXTERNAL"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ComponentDescriptor, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ComponentDescriptor): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/component_descriptor_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/component_descriptor_id.py new file mode 100644 index 0000000..3a933c9 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/component_descriptor_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class ComponentDescriptorId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """ComponentDescriptorId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this ComponentDescriptorId. # noqa: E501 + + + :return: The id of this ComponentDescriptorId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this ComponentDescriptorId. + + + :param id: The id of this ComponentDescriptorId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ComponentDescriptorId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ComponentDescriptorId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/customer.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/customer.py new file mode 100644 index 0000000..10ec7e3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/customer.py @@ -0,0 +1,448 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Customer(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'address': 'str', + 'address2': 'str', + 'city': 'str', + 'country': 'str', + 'created_time': 'int', + 'email': 'str', + 'id': 'CustomerId', + 'name': 'str', + 'phone': 'str', + 'state': 'str', + 'tenant_id': 'TenantId', + 'title': 'str', + 'zip': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'address': 'address', + 'address2': 'address2', + 'city': 'city', + 'country': 'country', + 'created_time': 'createdTime', + 'email': 'email', + 'id': 'id', + 'name': 'name', + 'phone': 'phone', + 'state': 'state', + 'tenant_id': 'tenantId', + 'title': 'title', + 'zip': 'zip' + } + + def __init__(self, additional_info=None, address=None, address2=None, city=None, country=None, created_time=None, email=None, id=None, name=None, phone=None, state=None, tenant_id=None, title=None, zip=None): # noqa: E501 + """Customer - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._address = None + self._address2 = None + self._city = None + self._country = None + self._created_time = None + self._email = None + self._id = None + self._name = None + self._phone = None + self._state = None + self._tenant_id = None + self._title = None + self._zip = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if address is not None: + self.address = address + if address2 is not None: + self.address2 = address2 + if city is not None: + self.city = city + if country is not None: + self.country = country + if created_time is not None: + self.created_time = created_time + if email is not None: + self.email = email + if id is not None: + self.id = id + if name is not None: + self.name = name + if phone is not None: + self.phone = phone + if state is not None: + self.state = state + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + if zip is not None: + self.zip = zip + + @property + def additional_info(self): + """Gets the additional_info of this Customer. # noqa: E501 + + + :return: The additional_info of this Customer. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Customer. + + + :param additional_info: The additional_info of this Customer. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def address(self): + """Gets the address of this Customer. # noqa: E501 + + + :return: The address of this Customer. # noqa: E501 + :rtype: str + """ + return self._address + + @address.setter + def address(self, address): + """Sets the address of this Customer. + + + :param address: The address of this Customer. # noqa: E501 + :type: str + """ + + self._address = address + + @property + def address2(self): + """Gets the address2 of this Customer. # noqa: E501 + + + :return: The address2 of this Customer. # noqa: E501 + :rtype: str + """ + return self._address2 + + @address2.setter + def address2(self, address2): + """Sets the address2 of this Customer. + + + :param address2: The address2 of this Customer. # noqa: E501 + :type: str + """ + + self._address2 = address2 + + @property + def city(self): + """Gets the city of this Customer. # noqa: E501 + + + :return: The city of this Customer. # noqa: E501 + :rtype: str + """ + return self._city + + @city.setter + def city(self, city): + """Sets the city of this Customer. + + + :param city: The city of this Customer. # noqa: E501 + :type: str + """ + + self._city = city + + @property + def country(self): + """Gets the country of this Customer. # noqa: E501 + + + :return: The country of this Customer. # noqa: E501 + :rtype: str + """ + return self._country + + @country.setter + def country(self, country): + """Sets the country of this Customer. + + + :param country: The country of this Customer. # noqa: E501 + :type: str + """ + + self._country = country + + @property + def created_time(self): + """Gets the created_time of this Customer. # noqa: E501 + + + :return: The created_time of this Customer. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Customer. + + + :param created_time: The created_time of this Customer. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def email(self): + """Gets the email of this Customer. # noqa: E501 + + + :return: The email of this Customer. # noqa: E501 + :rtype: str + """ + return self._email + + @email.setter + def email(self, email): + """Sets the email of this Customer. + + + :param email: The email of this Customer. # noqa: E501 + :type: str + """ + + self._email = email + + @property + def id(self): + """Gets the id of this Customer. # noqa: E501 + + + :return: The id of this Customer. # noqa: E501 + :rtype: CustomerId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Customer. + + + :param id: The id of this Customer. # noqa: E501 + :type: CustomerId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this Customer. # noqa: E501 + + + :return: The name of this Customer. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Customer. + + + :param name: The name of this Customer. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def phone(self): + """Gets the phone of this Customer. # noqa: E501 + + + :return: The phone of this Customer. # noqa: E501 + :rtype: str + """ + return self._phone + + @phone.setter + def phone(self, phone): + """Sets the phone of this Customer. + + + :param phone: The phone of this Customer. # noqa: E501 + :type: str + """ + + self._phone = phone + + @property + def state(self): + """Gets the state of this Customer. # noqa: E501 + + + :return: The state of this Customer. # noqa: E501 + :rtype: str + """ + return self._state + + @state.setter + def state(self, state): + """Sets the state of this Customer. + + + :param state: The state of this Customer. # noqa: E501 + :type: str + """ + + self._state = state + + @property + def tenant_id(self): + """Gets the tenant_id of this Customer. # noqa: E501 + + + :return: The tenant_id of this Customer. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Customer. + + + :param tenant_id: The tenant_id of this Customer. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this Customer. # noqa: E501 + + + :return: The title of this Customer. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this Customer. + + + :param title: The title of this Customer. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def zip(self): + """Gets the zip of this Customer. # noqa: E501 + + + :return: The zip of this Customer. # noqa: E501 + :rtype: str + """ + return self._zip + + @zip.setter + def zip(self, zip): + """Sets the zip of this Customer. + + + :param zip: The zip of this Customer. # noqa: E501 + :type: str + """ + + self._zip = zip + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Customer, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Customer): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/customer_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/customer_id.py new file mode 100644 index 0000000..2d0b51b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/customer_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class CustomerId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """CustomerId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this CustomerId. # noqa: E501 + + + :return: The id of this CustomerId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this CustomerId. + + + :param id: The id of this CustomerId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(CustomerId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, CustomerId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/dashboard.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/dashboard.py new file mode 100644 index 0000000..8076ae0 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/dashboard.py @@ -0,0 +1,344 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Dashboard(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'assigned_customers': 'list[ShortCustomerInfo]', + 'configuration': 'str', + 'created_time': 'int', + 'id': 'DashboardId', + 'image': 'str', + 'mobile_hide': 'bool', + 'mobile_order': 'int', + 'name': 'str', + 'tenant_id': 'TenantId', + 'title': 'str' + } + + attribute_map = { + 'assigned_customers': 'assignedCustomers', + 'configuration': 'configuration', + 'created_time': 'createdTime', + 'id': 'id', + 'image': 'image', + 'mobile_hide': 'mobileHide', + 'mobile_order': 'mobileOrder', + 'name': 'name', + 'tenant_id': 'tenantId', + 'title': 'title' + } + + def __init__(self, assigned_customers=None, configuration=None, created_time=None, id=None, image=None, mobile_hide=None, mobile_order=None, name=None, tenant_id=None, title=None): # noqa: E501 + """Dashboard - a model defined in Swagger""" # noqa: E501 + self._assigned_customers = None + self._configuration = None + self._created_time = None + self._id = None + self._image = None + self._mobile_hide = None + self._mobile_order = None + self._name = None + self._tenant_id = None + self._title = None + self.discriminator = None + if assigned_customers is not None: + self.assigned_customers = assigned_customers + if configuration is not None: + self.configuration = configuration + if created_time is not None: + self.created_time = created_time + if id is not None: + self.id = id + if image is not None: + self.image = image + if mobile_hide is not None: + self.mobile_hide = mobile_hide + if mobile_order is not None: + self.mobile_order = mobile_order + if name is not None: + self.name = name + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + + @property + def assigned_customers(self): + """Gets the assigned_customers of this Dashboard. # noqa: E501 + + + :return: The assigned_customers of this Dashboard. # noqa: E501 + :rtype: list[ShortCustomerInfo] + """ + return self._assigned_customers + + @assigned_customers.setter + def assigned_customers(self, assigned_customers): + """Sets the assigned_customers of this Dashboard. + + + :param assigned_customers: The assigned_customers of this Dashboard. # noqa: E501 + :type: list[ShortCustomerInfo] + """ + + self._assigned_customers = assigned_customers + + @property + def configuration(self): + """Gets the configuration of this Dashboard. # noqa: E501 + + + :return: The configuration of this Dashboard. # noqa: E501 + :rtype: str + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this Dashboard. + + + :param configuration: The configuration of this Dashboard. # noqa: E501 + :type: str + """ + + self._configuration = configuration + + @property + def created_time(self): + """Gets the created_time of this Dashboard. # noqa: E501 + + + :return: The created_time of this Dashboard. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Dashboard. + + + :param created_time: The created_time of this Dashboard. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def id(self): + """Gets the id of this Dashboard. # noqa: E501 + + + :return: The id of this Dashboard. # noqa: E501 + :rtype: DashboardId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Dashboard. + + + :param id: The id of this Dashboard. # noqa: E501 + :type: DashboardId + """ + + self._id = id + + @property + def image(self): + """Gets the image of this Dashboard. # noqa: E501 + + + :return: The image of this Dashboard. # noqa: E501 + :rtype: str + """ + return self._image + + @image.setter + def image(self, image): + """Sets the image of this Dashboard. + + + :param image: The image of this Dashboard. # noqa: E501 + :type: str + """ + + self._image = image + + @property + def mobile_hide(self): + """Gets the mobile_hide of this Dashboard. # noqa: E501 + + + :return: The mobile_hide of this Dashboard. # noqa: E501 + :rtype: bool + """ + return self._mobile_hide + + @mobile_hide.setter + def mobile_hide(self, mobile_hide): + """Sets the mobile_hide of this Dashboard. + + + :param mobile_hide: The mobile_hide of this Dashboard. # noqa: E501 + :type: bool + """ + + self._mobile_hide = mobile_hide + + @property + def mobile_order(self): + """Gets the mobile_order of this Dashboard. # noqa: E501 + + + :return: The mobile_order of this Dashboard. # noqa: E501 + :rtype: int + """ + return self._mobile_order + + @mobile_order.setter + def mobile_order(self, mobile_order): + """Sets the mobile_order of this Dashboard. + + + :param mobile_order: The mobile_order of this Dashboard. # noqa: E501 + :type: int + """ + + self._mobile_order = mobile_order + + @property + def name(self): + """Gets the name of this Dashboard. # noqa: E501 + + + :return: The name of this Dashboard. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Dashboard. + + + :param name: The name of this Dashboard. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def tenant_id(self): + """Gets the tenant_id of this Dashboard. # noqa: E501 + + + :return: The tenant_id of this Dashboard. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Dashboard. + + + :param tenant_id: The tenant_id of this Dashboard. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this Dashboard. # noqa: E501 + + + :return: The title of this Dashboard. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this Dashboard. + + + :param title: The title of this Dashboard. # noqa: E501 + :type: str + """ + + self._title = title + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Dashboard, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Dashboard): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/dashboard_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/dashboard_id.py new file mode 100644 index 0000000..7e07dea --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/dashboard_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class DashboardId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """DashboardId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this DashboardId. # noqa: E501 + + + :return: The id of this DashboardId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this DashboardId. + + + :param id: The id of this DashboardId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DashboardId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DashboardId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/dashboard_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/dashboard_info.py new file mode 100644 index 0000000..d696f98 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/dashboard_info.py @@ -0,0 +1,318 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DashboardInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'assigned_customers': 'list[ShortCustomerInfo]', + 'created_time': 'int', + 'id': 'DashboardId', + 'image': 'str', + 'mobile_hide': 'bool', + 'mobile_order': 'int', + 'name': 'str', + 'tenant_id': 'TenantId', + 'title': 'str' + } + + attribute_map = { + 'assigned_customers': 'assignedCustomers', + 'created_time': 'createdTime', + 'id': 'id', + 'image': 'image', + 'mobile_hide': 'mobileHide', + 'mobile_order': 'mobileOrder', + 'name': 'name', + 'tenant_id': 'tenantId', + 'title': 'title' + } + + def __init__(self, assigned_customers=None, created_time=None, id=None, image=None, mobile_hide=None, mobile_order=None, name=None, tenant_id=None, title=None): # noqa: E501 + """DashboardInfo - a model defined in Swagger""" # noqa: E501 + self._assigned_customers = None + self._created_time = None + self._id = None + self._image = None + self._mobile_hide = None + self._mobile_order = None + self._name = None + self._tenant_id = None + self._title = None + self.discriminator = None + if assigned_customers is not None: + self.assigned_customers = assigned_customers + if created_time is not None: + self.created_time = created_time + if id is not None: + self.id = id + if image is not None: + self.image = image + if mobile_hide is not None: + self.mobile_hide = mobile_hide + if mobile_order is not None: + self.mobile_order = mobile_order + if name is not None: + self.name = name + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + + @property + def assigned_customers(self): + """Gets the assigned_customers of this DashboardInfo. # noqa: E501 + + + :return: The assigned_customers of this DashboardInfo. # noqa: E501 + :rtype: list[ShortCustomerInfo] + """ + return self._assigned_customers + + @assigned_customers.setter + def assigned_customers(self, assigned_customers): + """Sets the assigned_customers of this DashboardInfo. + + + :param assigned_customers: The assigned_customers of this DashboardInfo. # noqa: E501 + :type: list[ShortCustomerInfo] + """ + + self._assigned_customers = assigned_customers + + @property + def created_time(self): + """Gets the created_time of this DashboardInfo. # noqa: E501 + + + :return: The created_time of this DashboardInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this DashboardInfo. + + + :param created_time: The created_time of this DashboardInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def id(self): + """Gets the id of this DashboardInfo. # noqa: E501 + + + :return: The id of this DashboardInfo. # noqa: E501 + :rtype: DashboardId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this DashboardInfo. + + + :param id: The id of this DashboardInfo. # noqa: E501 + :type: DashboardId + """ + + self._id = id + + @property + def image(self): + """Gets the image of this DashboardInfo. # noqa: E501 + + + :return: The image of this DashboardInfo. # noqa: E501 + :rtype: str + """ + return self._image + + @image.setter + def image(self, image): + """Sets the image of this DashboardInfo. + + + :param image: The image of this DashboardInfo. # noqa: E501 + :type: str + """ + + self._image = image + + @property + def mobile_hide(self): + """Gets the mobile_hide of this DashboardInfo. # noqa: E501 + + + :return: The mobile_hide of this DashboardInfo. # noqa: E501 + :rtype: bool + """ + return self._mobile_hide + + @mobile_hide.setter + def mobile_hide(self, mobile_hide): + """Sets the mobile_hide of this DashboardInfo. + + + :param mobile_hide: The mobile_hide of this DashboardInfo. # noqa: E501 + :type: bool + """ + + self._mobile_hide = mobile_hide + + @property + def mobile_order(self): + """Gets the mobile_order of this DashboardInfo. # noqa: E501 + + + :return: The mobile_order of this DashboardInfo. # noqa: E501 + :rtype: int + """ + return self._mobile_order + + @mobile_order.setter + def mobile_order(self, mobile_order): + """Sets the mobile_order of this DashboardInfo. + + + :param mobile_order: The mobile_order of this DashboardInfo. # noqa: E501 + :type: int + """ + + self._mobile_order = mobile_order + + @property + def name(self): + """Gets the name of this DashboardInfo. # noqa: E501 + + + :return: The name of this DashboardInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this DashboardInfo. + + + :param name: The name of this DashboardInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def tenant_id(self): + """Gets the tenant_id of this DashboardInfo. # noqa: E501 + + + :return: The tenant_id of this DashboardInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this DashboardInfo. + + + :param tenant_id: The tenant_id of this DashboardInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this DashboardInfo. # noqa: E501 + + + :return: The title of this DashboardInfo. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this DashboardInfo. + + + :param title: The title of this DashboardInfo. # noqa: E501 + :type: str + """ + + self._title = title + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DashboardInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DashboardInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/default_rule_chain_create_request.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/default_rule_chain_create_request.py new file mode 100644 index 0000000..ad4a750 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/default_rule_chain_create_request.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DefaultRuleChainCreateRequest(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str' + } + + attribute_map = { + 'name': 'name' + } + + def __init__(self, name=None): # noqa: E501 + """DefaultRuleChainCreateRequest - a model defined in Swagger""" # noqa: E501 + self._name = None + self.discriminator = None + if name is not None: + self.name = name + + @property + def name(self): + """Gets the name of this DefaultRuleChainCreateRequest. # noqa: E501 + + + :return: The name of this DefaultRuleChainCreateRequest. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this DefaultRuleChainCreateRequest. + + + :param name: The name of this DefaultRuleChainCreateRequest. # noqa: E501 + :type: str + """ + + self._name = name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DefaultRuleChainCreateRequest, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DefaultRuleChainCreateRequest): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/deferred_result_response_entity.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/deferred_result_response_entity.py new file mode 100644 index 0000000..1e0fcf1 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/deferred_result_response_entity.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeferredResultResponseEntity(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'result': 'object', + 'set_or_expired': 'bool' + } + + attribute_map = { + 'result': 'result', + 'set_or_expired': 'setOrExpired' + } + + def __init__(self, result=None, set_or_expired=None): # noqa: E501 + """DeferredResultResponseEntity - a model defined in Swagger""" # noqa: E501 + self._result = None + self._set_or_expired = None + self.discriminator = None + if result is not None: + self.result = result + if set_or_expired is not None: + self.set_or_expired = set_or_expired + + @property + def result(self): + """Gets the result of this DeferredResultResponseEntity. # noqa: E501 + + + :return: The result of this DeferredResultResponseEntity. # noqa: E501 + :rtype: object + """ + return self._result + + @result.setter + def result(self, result): + """Sets the result of this DeferredResultResponseEntity. + + + :param result: The result of this DeferredResultResponseEntity. # noqa: E501 + :type: object + """ + + self._result = result + + @property + def set_or_expired(self): + """Gets the set_or_expired of this DeferredResultResponseEntity. # noqa: E501 + + + :return: The set_or_expired of this DeferredResultResponseEntity. # noqa: E501 + :rtype: bool + """ + return self._set_or_expired + + @set_or_expired.setter + def set_or_expired(self, set_or_expired): + """Sets the set_or_expired of this DeferredResultResponseEntity. + + + :param set_or_expired: The set_or_expired of this DeferredResultResponseEntity. # noqa: E501 + :type: bool + """ + + self._set_or_expired = set_or_expired + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeferredResultResponseEntity, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeferredResultResponseEntity): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device.py new file mode 100644 index 0000000..76523e6 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device.py @@ -0,0 +1,396 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Device(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'device_data': 'DeviceData', + 'device_profile_id': 'DeviceProfileId', + 'firmware_id': 'OtaPackageId', + 'id': 'DeviceId', + 'label': 'str', + 'name': 'str', + 'software_id': 'OtaPackageId', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'device_data': 'deviceData', + 'device_profile_id': 'deviceProfileId', + 'firmware_id': 'firmwareId', + 'id': 'id', + 'label': 'label', + 'name': 'name', + 'software_id': 'softwareId', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, created_time=None, customer_id=None, device_data=None, device_profile_id=None, firmware_id=None, id=None, label=None, name=None, software_id=None, tenant_id=None, type=None): # noqa: E501 + """Device - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._customer_id = None + self._device_data = None + self._device_profile_id = None + self._firmware_id = None + self._id = None + self._label = None + self._name = None + self._software_id = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if device_data is not None: + self.device_data = device_data + if device_profile_id is not None: + self.device_profile_id = device_profile_id + if firmware_id is not None: + self.firmware_id = firmware_id + if id is not None: + self.id = id + if label is not None: + self.label = label + if name is not None: + self.name = name + if software_id is not None: + self.software_id = software_id + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this Device. # noqa: E501 + + + :return: The additional_info of this Device. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Device. + + + :param additional_info: The additional_info of this Device. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this Device. # noqa: E501 + + + :return: The created_time of this Device. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Device. + + + :param created_time: The created_time of this Device. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this Device. # noqa: E501 + + + :return: The customer_id of this Device. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this Device. + + + :param customer_id: The customer_id of this Device. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def device_data(self): + """Gets the device_data of this Device. # noqa: E501 + + + :return: The device_data of this Device. # noqa: E501 + :rtype: DeviceData + """ + return self._device_data + + @device_data.setter + def device_data(self, device_data): + """Sets the device_data of this Device. + + + :param device_data: The device_data of this Device. # noqa: E501 + :type: DeviceData + """ + + self._device_data = device_data + + @property + def device_profile_id(self): + """Gets the device_profile_id of this Device. # noqa: E501 + + + :return: The device_profile_id of this Device. # noqa: E501 + :rtype: DeviceProfileId + """ + return self._device_profile_id + + @device_profile_id.setter + def device_profile_id(self, device_profile_id): + """Sets the device_profile_id of this Device. + + + :param device_profile_id: The device_profile_id of this Device. # noqa: E501 + :type: DeviceProfileId + """ + + self._device_profile_id = device_profile_id + + @property + def firmware_id(self): + """Gets the firmware_id of this Device. # noqa: E501 + + + :return: The firmware_id of this Device. # noqa: E501 + :rtype: OtaPackageId + """ + return self._firmware_id + + @firmware_id.setter + def firmware_id(self, firmware_id): + """Sets the firmware_id of this Device. + + + :param firmware_id: The firmware_id of this Device. # noqa: E501 + :type: OtaPackageId + """ + + self._firmware_id = firmware_id + + @property + def id(self): + """Gets the id of this Device. # noqa: E501 + + + :return: The id of this Device. # noqa: E501 + :rtype: DeviceId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Device. + + + :param id: The id of this Device. # noqa: E501 + :type: DeviceId + """ + + self._id = id + + @property + def label(self): + """Gets the label of this Device. # noqa: E501 + + + :return: The label of this Device. # noqa: E501 + :rtype: str + """ + return self._label + + @label.setter + def label(self, label): + """Sets the label of this Device. + + + :param label: The label of this Device. # noqa: E501 + :type: str + """ + + self._label = label + + @property + def name(self): + """Gets the name of this Device. # noqa: E501 + + + :return: The name of this Device. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Device. + + + :param name: The name of this Device. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def software_id(self): + """Gets the software_id of this Device. # noqa: E501 + + + :return: The software_id of this Device. # noqa: E501 + :rtype: OtaPackageId + """ + return self._software_id + + @software_id.setter + def software_id(self, software_id): + """Sets the software_id of this Device. + + + :param software_id: The software_id of this Device. # noqa: E501 + :type: OtaPackageId + """ + + self._software_id = software_id + + @property + def tenant_id(self): + """Gets the tenant_id of this Device. # noqa: E501 + + + :return: The tenant_id of this Device. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Device. + + + :param tenant_id: The tenant_id of this Device. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this Device. # noqa: E501 + + + :return: The type of this Device. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Device. + + + :param type: The type of this Device. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Device, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Device): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_configuration.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_configuration.py new file mode 100644 index 0000000..8da3895 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_configuration.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceConfiguration(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """DeviceConfiguration - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceConfiguration, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceConfiguration): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_credentials.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_credentials.py new file mode 100644 index 0000000..7b2f1ca --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_credentials.py @@ -0,0 +1,246 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceCredentials(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'created_time': 'int', + 'credentials_id': 'str', + 'credentials_type': 'str', + 'credentials_value': 'str', + 'device_id': 'DeviceId', + 'id': 'DeviceCredentialsId' + } + + attribute_map = { + 'created_time': 'createdTime', + 'credentials_id': 'credentialsId', + 'credentials_type': 'credentialsType', + 'credentials_value': 'credentialsValue', + 'device_id': 'deviceId', + 'id': 'id' + } + + def __init__(self, created_time=None, credentials_id=None, credentials_type=None, credentials_value=None, device_id=None, id=None): # noqa: E501 + """DeviceCredentials - a model defined in Swagger""" # noqa: E501 + self._created_time = None + self._credentials_id = None + self._credentials_type = None + self._credentials_value = None + self._device_id = None + self._id = None + self.discriminator = None + if created_time is not None: + self.created_time = created_time + if credentials_id is not None: + self.credentials_id = credentials_id + if credentials_type is not None: + self.credentials_type = credentials_type + if credentials_value is not None: + self.credentials_value = credentials_value + if device_id is not None: + self.device_id = device_id + if id is not None: + self.id = id + + @property + def created_time(self): + """Gets the created_time of this DeviceCredentials. # noqa: E501 + + + :return: The created_time of this DeviceCredentials. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this DeviceCredentials. + + + :param created_time: The created_time of this DeviceCredentials. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def credentials_id(self): + """Gets the credentials_id of this DeviceCredentials. # noqa: E501 + + + :return: The credentials_id of this DeviceCredentials. # noqa: E501 + :rtype: str + """ + return self._credentials_id + + @credentials_id.setter + def credentials_id(self, credentials_id): + """Sets the credentials_id of this DeviceCredentials. + + + :param credentials_id: The credentials_id of this DeviceCredentials. # noqa: E501 + :type: str + """ + + self._credentials_id = credentials_id + + @property + def credentials_type(self): + """Gets the credentials_type of this DeviceCredentials. # noqa: E501 + + + :return: The credentials_type of this DeviceCredentials. # noqa: E501 + :rtype: str + """ + return self._credentials_type + + @credentials_type.setter + def credentials_type(self, credentials_type): + """Sets the credentials_type of this DeviceCredentials. + + + :param credentials_type: The credentials_type of this DeviceCredentials. # noqa: E501 + :type: str + """ + allowed_values = ["ACCESS_TOKEN", "X509_CERTIFICATE", "MQTT_BASIC", "LWM2M_CREDENTIALS"] # noqa: E501 + if credentials_type not in allowed_values: + raise ValueError( + "Invalid value for `credentials_type` ({0}), must be one of {1}" # noqa: E501 + .format(credentials_type, allowed_values) + ) + + self._credentials_type = credentials_type + + @property + def credentials_value(self): + """Gets the credentials_value of this DeviceCredentials. # noqa: E501 + + + :return: The credentials_value of this DeviceCredentials. # noqa: E501 + :rtype: str + """ + return self._credentials_value + + @credentials_value.setter + def credentials_value(self, credentials_value): + """Sets the credentials_value of this DeviceCredentials. + + + :param credentials_value: The credentials_value of this DeviceCredentials. # noqa: E501 + :type: str + """ + + self._credentials_value = credentials_value + + @property + def device_id(self): + """Gets the device_id of this DeviceCredentials. # noqa: E501 + + + :return: The device_id of this DeviceCredentials. # noqa: E501 + :rtype: DeviceId + """ + return self._device_id + + @device_id.setter + def device_id(self, device_id): + """Sets the device_id of this DeviceCredentials. + + + :param device_id: The device_id of this DeviceCredentials. # noqa: E501 + :type: DeviceId + """ + + self._device_id = device_id + + @property + def id(self): + """Gets the id of this DeviceCredentials. # noqa: E501 + + + :return: The id of this DeviceCredentials. # noqa: E501 + :rtype: DeviceCredentialsId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this DeviceCredentials. + + + :param id: The id of this DeviceCredentials. # noqa: E501 + :type: DeviceCredentialsId + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceCredentials, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceCredentials): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_credentials_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_credentials_id.py new file mode 100644 index 0000000..f39f1b6 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_credentials_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class DeviceCredentialsId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """DeviceCredentialsId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this DeviceCredentialsId. # noqa: E501 + + + :return: The id of this DeviceCredentialsId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this DeviceCredentialsId. + + + :param id: The id of this DeviceCredentialsId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceCredentialsId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceCredentialsId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_data.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_data.py new file mode 100644 index 0000000..ca9587d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_data.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceData(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'configuration': 'DeviceConfiguration', + 'transport_configuration': 'DeviceTransportConfiguration' + } + + attribute_map = { + 'configuration': 'configuration', + 'transport_configuration': 'transportConfiguration' + } + + def __init__(self, configuration=None, transport_configuration=None): # noqa: E501 + """DeviceData - a model defined in Swagger""" # noqa: E501 + self._configuration = None + self._transport_configuration = None + self.discriminator = None + if configuration is not None: + self.configuration = configuration + if transport_configuration is not None: + self.transport_configuration = transport_configuration + + @property + def configuration(self): + """Gets the configuration of this DeviceData. # noqa: E501 + + + :return: The configuration of this DeviceData. # noqa: E501 + :rtype: DeviceConfiguration + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this DeviceData. + + + :param configuration: The configuration of this DeviceData. # noqa: E501 + :type: DeviceConfiguration + """ + + self._configuration = configuration + + @property + def transport_configuration(self): + """Gets the transport_configuration of this DeviceData. # noqa: E501 + + + :return: The transport_configuration of this DeviceData. # noqa: E501 + :rtype: DeviceTransportConfiguration + """ + return self._transport_configuration + + @transport_configuration.setter + def transport_configuration(self, transport_configuration): + """Sets the transport_configuration of this DeviceData. + + + :param transport_configuration: The transport_configuration of this DeviceData. # noqa: E501 + :type: DeviceTransportConfiguration + """ + + self._transport_configuration = transport_configuration + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceData, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceData): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_id.py new file mode 100644 index 0000000..d43e2fd --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_id.py @@ -0,0 +1,103 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +from .entity_id import EntityId + + +class DeviceId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """DeviceId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this DeviceId. # noqa: E501 + + + :return: The id of this DeviceId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this DeviceId. + + + :param id: The id of this DeviceId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_info.py new file mode 100644 index 0000000..0892126 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_info.py @@ -0,0 +1,474 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'customer_is_public': 'bool', + 'customer_title': 'str', + 'device_data': 'DeviceData', + 'device_profile_id': 'DeviceProfileId', + 'device_profile_name': 'str', + 'firmware_id': 'OtaPackageId', + 'id': 'DeviceId', + 'label': 'str', + 'name': 'str', + 'software_id': 'OtaPackageId', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'customer_is_public': 'customerIsPublic', + 'customer_title': 'customerTitle', + 'device_data': 'deviceData', + 'device_profile_id': 'deviceProfileId', + 'device_profile_name': 'deviceProfileName', + 'firmware_id': 'firmwareId', + 'id': 'id', + 'label': 'label', + 'name': 'name', + 'software_id': 'softwareId', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, created_time=None, customer_id=None, customer_is_public=None, customer_title=None, device_data=None, device_profile_id=None, device_profile_name=None, firmware_id=None, id=None, label=None, name=None, software_id=None, tenant_id=None, type=None): # noqa: E501 + """DeviceInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._customer_id = None + self._customer_is_public = None + self._customer_title = None + self._device_data = None + self._device_profile_id = None + self._device_profile_name = None + self._firmware_id = None + self._id = None + self._label = None + self._name = None + self._software_id = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if customer_is_public is not None: + self.customer_is_public = customer_is_public + if customer_title is not None: + self.customer_title = customer_title + if device_data is not None: + self.device_data = device_data + if device_profile_id is not None: + self.device_profile_id = device_profile_id + if device_profile_name is not None: + self.device_profile_name = device_profile_name + if firmware_id is not None: + self.firmware_id = firmware_id + if id is not None: + self.id = id + if label is not None: + self.label = label + if name is not None: + self.name = name + if software_id is not None: + self.software_id = software_id + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this DeviceInfo. # noqa: E501 + + + :return: The additional_info of this DeviceInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this DeviceInfo. + + + :param additional_info: The additional_info of this DeviceInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this DeviceInfo. # noqa: E501 + + + :return: The created_time of this DeviceInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this DeviceInfo. + + + :param created_time: The created_time of this DeviceInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this DeviceInfo. # noqa: E501 + + + :return: The customer_id of this DeviceInfo. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this DeviceInfo. + + + :param customer_id: The customer_id of this DeviceInfo. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def customer_is_public(self): + """Gets the customer_is_public of this DeviceInfo. # noqa: E501 + + + :return: The customer_is_public of this DeviceInfo. # noqa: E501 + :rtype: bool + """ + return self._customer_is_public + + @customer_is_public.setter + def customer_is_public(self, customer_is_public): + """Sets the customer_is_public of this DeviceInfo. + + + :param customer_is_public: The customer_is_public of this DeviceInfo. # noqa: E501 + :type: bool + """ + + self._customer_is_public = customer_is_public + + @property + def customer_title(self): + """Gets the customer_title of this DeviceInfo. # noqa: E501 + + + :return: The customer_title of this DeviceInfo. # noqa: E501 + :rtype: str + """ + return self._customer_title + + @customer_title.setter + def customer_title(self, customer_title): + """Sets the customer_title of this DeviceInfo. + + + :param customer_title: The customer_title of this DeviceInfo. # noqa: E501 + :type: str + """ + + self._customer_title = customer_title + + @property + def device_data(self): + """Gets the device_data of this DeviceInfo. # noqa: E501 + + + :return: The device_data of this DeviceInfo. # noqa: E501 + :rtype: DeviceData + """ + return self._device_data + + @device_data.setter + def device_data(self, device_data): + """Sets the device_data of this DeviceInfo. + + + :param device_data: The device_data of this DeviceInfo. # noqa: E501 + :type: DeviceData + """ + + self._device_data = device_data + + @property + def device_profile_id(self): + """Gets the device_profile_id of this DeviceInfo. # noqa: E501 + + + :return: The device_profile_id of this DeviceInfo. # noqa: E501 + :rtype: DeviceProfileId + """ + return self._device_profile_id + + @device_profile_id.setter + def device_profile_id(self, device_profile_id): + """Sets the device_profile_id of this DeviceInfo. + + + :param device_profile_id: The device_profile_id of this DeviceInfo. # noqa: E501 + :type: DeviceProfileId + """ + + self._device_profile_id = device_profile_id + + @property + def device_profile_name(self): + """Gets the device_profile_name of this DeviceInfo. # noqa: E501 + + + :return: The device_profile_name of this DeviceInfo. # noqa: E501 + :rtype: str + """ + return self._device_profile_name + + @device_profile_name.setter + def device_profile_name(self, device_profile_name): + """Sets the device_profile_name of this DeviceInfo. + + + :param device_profile_name: The device_profile_name of this DeviceInfo. # noqa: E501 + :type: str + """ + + self._device_profile_name = device_profile_name + + @property + def firmware_id(self): + """Gets the firmware_id of this DeviceInfo. # noqa: E501 + + + :return: The firmware_id of this DeviceInfo. # noqa: E501 + :rtype: OtaPackageId + """ + return self._firmware_id + + @firmware_id.setter + def firmware_id(self, firmware_id): + """Sets the firmware_id of this DeviceInfo. + + + :param firmware_id: The firmware_id of this DeviceInfo. # noqa: E501 + :type: OtaPackageId + """ + + self._firmware_id = firmware_id + + @property + def id(self): + """Gets the id of this DeviceInfo. # noqa: E501 + + + :return: The id of this DeviceInfo. # noqa: E501 + :rtype: DeviceId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this DeviceInfo. + + + :param id: The id of this DeviceInfo. # noqa: E501 + :type: DeviceId + """ + + self._id = id + + @property + def label(self): + """Gets the label of this DeviceInfo. # noqa: E501 + + + :return: The label of this DeviceInfo. # noqa: E501 + :rtype: str + """ + return self._label + + @label.setter + def label(self, label): + """Sets the label of this DeviceInfo. + + + :param label: The label of this DeviceInfo. # noqa: E501 + :type: str + """ + + self._label = label + + @property + def name(self): + """Gets the name of this DeviceInfo. # noqa: E501 + + + :return: The name of this DeviceInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this DeviceInfo. + + + :param name: The name of this DeviceInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def software_id(self): + """Gets the software_id of this DeviceInfo. # noqa: E501 + + + :return: The software_id of this DeviceInfo. # noqa: E501 + :rtype: OtaPackageId + """ + return self._software_id + + @software_id.setter + def software_id(self, software_id): + """Sets the software_id of this DeviceInfo. + + + :param software_id: The software_id of this DeviceInfo. # noqa: E501 + :type: OtaPackageId + """ + + self._software_id = software_id + + @property + def tenant_id(self): + """Gets the tenant_id of this DeviceInfo. # noqa: E501 + + + :return: The tenant_id of this DeviceInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this DeviceInfo. + + + :param tenant_id: The tenant_id of this DeviceInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this DeviceInfo. # noqa: E501 + + + :return: The type of this DeviceInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this DeviceInfo. + + + :param type: The type of this DeviceInfo. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile.py new file mode 100644 index 0000000..77b3646 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile.py @@ -0,0 +1,544 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceProfile(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'created_time': 'int', + 'default': 'bool', + 'default_dashboard_id': 'DashboardId', + 'default_queue_name': 'str', + 'default_rule_chain_id': 'RuleChainId', + 'description': 'str', + 'firmware_id': 'OtaPackageId', + 'id': 'DeviceProfileId', + 'image': 'str', + 'name': 'str', + 'profile_data': 'DeviceProfileData', + 'provision_device_key': 'str', + 'provision_type': 'str', + 'software_id': 'OtaPackageId', + 'tenant_id': 'TenantId', + 'transport_type': 'str', + 'type': 'str' + } + + attribute_map = { + 'created_time': 'createdTime', + 'default': 'default', + 'default_dashboard_id': 'defaultDashboardId', + 'default_queue_name': 'defaultQueueName', + 'default_rule_chain_id': 'defaultRuleChainId', + 'description': 'description', + 'firmware_id': 'firmwareId', + 'id': 'id', + 'image': 'image', + 'name': 'name', + 'profile_data': 'profileData', + 'provision_device_key': 'provisionDeviceKey', + 'provision_type': 'provisionType', + 'software_id': 'softwareId', + 'tenant_id': 'tenantId', + 'transport_type': 'transportType', + 'type': 'type' + } + + def __init__(self, created_time=None, default=None, default_dashboard_id=None, default_queue_name=None, default_rule_chain_id=None, description=None, firmware_id=None, id=None, image=None, name=None, profile_data=None, provision_device_key=None, provision_type=None, software_id=None, tenant_id=None, transport_type=None, type=None): # noqa: E501 + """DeviceProfile - a model defined in Swagger""" # noqa: E501 + self._created_time = None + self._default = None + self._default_dashboard_id = None + self._default_queue_name = None + self._default_rule_chain_id = None + self._description = None + self._firmware_id = None + self._id = None + self._image = None + self._name = None + self._profile_data = None + self._provision_device_key = None + self._provision_type = None + self._software_id = None + self._tenant_id = None + self._transport_type = None + self._type = None + self.discriminator = None + if created_time is not None: + self.created_time = created_time + if default is not None: + self.default = default + if default_dashboard_id is not None: + self.default_dashboard_id = default_dashboard_id + if default_queue_name is not None: + self.default_queue_name = default_queue_name + if default_rule_chain_id is not None: + self.default_rule_chain_id = default_rule_chain_id + if description is not None: + self.description = description + if firmware_id is not None: + self.firmware_id = firmware_id + if id is not None: + self.id = id + if image is not None: + self.image = image + if name is not None: + self.name = name + if profile_data is not None: + self.profile_data = profile_data + if provision_device_key is not None: + self.provision_device_key = provision_device_key + if provision_type is not None: + self.provision_type = provision_type + if software_id is not None: + self.software_id = software_id + if tenant_id is not None: + self.tenant_id = tenant_id + if transport_type is not None: + self.transport_type = transport_type + if type is not None: + self.type = type + + @property + def created_time(self): + """Gets the created_time of this DeviceProfile. # noqa: E501 + + + :return: The created_time of this DeviceProfile. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this DeviceProfile. + + + :param created_time: The created_time of this DeviceProfile. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def default(self): + """Gets the default of this DeviceProfile. # noqa: E501 + + + :return: The default of this DeviceProfile. # noqa: E501 + :rtype: bool + """ + return self._default + + @default.setter + def default(self, default): + """Sets the default of this DeviceProfile. + + + :param default: The default of this DeviceProfile. # noqa: E501 + :type: bool + """ + + self._default = default + + @property + def default_dashboard_id(self): + """Gets the default_dashboard_id of this DeviceProfile. # noqa: E501 + + + :return: The default_dashboard_id of this DeviceProfile. # noqa: E501 + :rtype: DashboardId + """ + return self._default_dashboard_id + + @default_dashboard_id.setter + def default_dashboard_id(self, default_dashboard_id): + """Sets the default_dashboard_id of this DeviceProfile. + + + :param default_dashboard_id: The default_dashboard_id of this DeviceProfile. # noqa: E501 + :type: DashboardId + """ + + self._default_dashboard_id = default_dashboard_id + + @property + def default_queue_name(self): + """Gets the default_queue_name of this DeviceProfile. # noqa: E501 + + + :return: The default_queue_name of this DeviceProfile. # noqa: E501 + :rtype: str + """ + return self._default_queue_name + + @default_queue_name.setter + def default_queue_name(self, default_queue_name): + """Sets the default_queue_name of this DeviceProfile. + + + :param default_queue_name: The default_queue_name of this DeviceProfile. # noqa: E501 + :type: str + """ + + self._default_queue_name = default_queue_name + + @property + def default_rule_chain_id(self): + """Gets the default_rule_chain_id of this DeviceProfile. # noqa: E501 + + + :return: The default_rule_chain_id of this DeviceProfile. # noqa: E501 + :rtype: RuleChainId + """ + return self._default_rule_chain_id + + @default_rule_chain_id.setter + def default_rule_chain_id(self, default_rule_chain_id): + """Sets the default_rule_chain_id of this DeviceProfile. + + + :param default_rule_chain_id: The default_rule_chain_id of this DeviceProfile. # noqa: E501 + :type: RuleChainId + """ + + self._default_rule_chain_id = default_rule_chain_id + + @property + def description(self): + """Gets the description of this DeviceProfile. # noqa: E501 + + + :return: The description of this DeviceProfile. # noqa: E501 + :rtype: str + """ + return self._description + + @description.setter + def description(self, description): + """Sets the description of this DeviceProfile. + + + :param description: The description of this DeviceProfile. # noqa: E501 + :type: str + """ + + self._description = description + + @property + def firmware_id(self): + """Gets the firmware_id of this DeviceProfile. # noqa: E501 + + + :return: The firmware_id of this DeviceProfile. # noqa: E501 + :rtype: OtaPackageId + """ + return self._firmware_id + + @firmware_id.setter + def firmware_id(self, firmware_id): + """Sets the firmware_id of this DeviceProfile. + + + :param firmware_id: The firmware_id of this DeviceProfile. # noqa: E501 + :type: OtaPackageId + """ + + self._firmware_id = firmware_id + + @property + def id(self): + """Gets the id of this DeviceProfile. # noqa: E501 + + + :return: The id of this DeviceProfile. # noqa: E501 + :rtype: DeviceProfileId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this DeviceProfile. + + + :param id: The id of this DeviceProfile. # noqa: E501 + :type: DeviceProfileId + """ + + self._id = id + + @property + def image(self): + """Gets the image of this DeviceProfile. # noqa: E501 + + + :return: The image of this DeviceProfile. # noqa: E501 + :rtype: str + """ + return self._image + + @image.setter + def image(self, image): + """Sets the image of this DeviceProfile. + + + :param image: The image of this DeviceProfile. # noqa: E501 + :type: str + """ + + self._image = image + + @property + def name(self): + """Gets the name of this DeviceProfile. # noqa: E501 + + + :return: The name of this DeviceProfile. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this DeviceProfile. + + + :param name: The name of this DeviceProfile. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def profile_data(self): + """Gets the profile_data of this DeviceProfile. # noqa: E501 + + + :return: The profile_data of this DeviceProfile. # noqa: E501 + :rtype: DeviceProfileData + """ + return self._profile_data + + @profile_data.setter + def profile_data(self, profile_data): + """Sets the profile_data of this DeviceProfile. + + + :param profile_data: The profile_data of this DeviceProfile. # noqa: E501 + :type: DeviceProfileData + """ + + self._profile_data = profile_data + + @property + def provision_device_key(self): + """Gets the provision_device_key of this DeviceProfile. # noqa: E501 + + + :return: The provision_device_key of this DeviceProfile. # noqa: E501 + :rtype: str + """ + return self._provision_device_key + + @provision_device_key.setter + def provision_device_key(self, provision_device_key): + """Sets the provision_device_key of this DeviceProfile. + + + :param provision_device_key: The provision_device_key of this DeviceProfile. # noqa: E501 + :type: str + """ + + self._provision_device_key = provision_device_key + + @property + def provision_type(self): + """Gets the provision_type of this DeviceProfile. # noqa: E501 + + + :return: The provision_type of this DeviceProfile. # noqa: E501 + :rtype: str + """ + return self._provision_type + + @provision_type.setter + def provision_type(self, provision_type): + """Sets the provision_type of this DeviceProfile. + + + :param provision_type: The provision_type of this DeviceProfile. # noqa: E501 + :type: str + """ + allowed_values = ["DISABLED", "ALLOW_CREATE_NEW_DEVICES", "CHECK_PRE_PROVISIONED_DEVICES"] # noqa: E501 + if provision_type not in allowed_values: + raise ValueError( + "Invalid value for `provision_type` ({0}), must be one of {1}" # noqa: E501 + .format(provision_type, allowed_values) + ) + + self._provision_type = provision_type + + @property + def software_id(self): + """Gets the software_id of this DeviceProfile. # noqa: E501 + + + :return: The software_id of this DeviceProfile. # noqa: E501 + :rtype: OtaPackageId + """ + return self._software_id + + @software_id.setter + def software_id(self, software_id): + """Sets the software_id of this DeviceProfile. + + + :param software_id: The software_id of this DeviceProfile. # noqa: E501 + :type: OtaPackageId + """ + + self._software_id = software_id + + @property + def tenant_id(self): + """Gets the tenant_id of this DeviceProfile. # noqa: E501 + + + :return: The tenant_id of this DeviceProfile. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this DeviceProfile. + + + :param tenant_id: The tenant_id of this DeviceProfile. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def transport_type(self): + """Gets the transport_type of this DeviceProfile. # noqa: E501 + + + :return: The transport_type of this DeviceProfile. # noqa: E501 + :rtype: str + """ + return self._transport_type + + @transport_type.setter + def transport_type(self, transport_type): + """Sets the transport_type of this DeviceProfile. + + + :param transport_type: The transport_type of this DeviceProfile. # noqa: E501 + :type: str + """ + allowed_values = ["DEFAULT", "MQTT", "COAP", "LWM2M", "SNMP"] # noqa: E501 + if transport_type not in allowed_values: + raise ValueError( + "Invalid value for `transport_type` ({0}), must be one of {1}" # noqa: E501 + .format(transport_type, allowed_values) + ) + + self._transport_type = transport_type + + @property + def type(self): + """Gets the type of this DeviceProfile. # noqa: E501 + + + :return: The type of this DeviceProfile. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this DeviceProfile. + + + :param type: The type of this DeviceProfile. # noqa: E501 + :type: str + """ + allowed_values = ["DEFAULT"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceProfile, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceProfile): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_alarm.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_alarm.py new file mode 100644 index 0000000..0aec2f9 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_alarm.py @@ -0,0 +1,240 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceProfileAlarm(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'alarm_type': 'str', + 'clear_rule': 'AlarmRule', + 'create_rules': 'dict(str, AlarmRule)', + 'id': 'str', + 'propagate': 'bool', + 'propagate_relation_types': 'list[str]' + } + + attribute_map = { + 'alarm_type': 'alarmType', + 'clear_rule': 'clearRule', + 'create_rules': 'createRules', + 'id': 'id', + 'propagate': 'propagate', + 'propagate_relation_types': 'propagateRelationTypes' + } + + def __init__(self, alarm_type=None, clear_rule=None, create_rules=None, id=None, propagate=None, propagate_relation_types=None): # noqa: E501 + """DeviceProfileAlarm - a model defined in Swagger""" # noqa: E501 + self._alarm_type = None + self._clear_rule = None + self._create_rules = None + self._id = None + self._propagate = None + self._propagate_relation_types = None + self.discriminator = None + if alarm_type is not None: + self.alarm_type = alarm_type + if clear_rule is not None: + self.clear_rule = clear_rule + if create_rules is not None: + self.create_rules = create_rules + if id is not None: + self.id = id + if propagate is not None: + self.propagate = propagate + if propagate_relation_types is not None: + self.propagate_relation_types = propagate_relation_types + + @property + def alarm_type(self): + """Gets the alarm_type of this DeviceProfileAlarm. # noqa: E501 + + + :return: The alarm_type of this DeviceProfileAlarm. # noqa: E501 + :rtype: str + """ + return self._alarm_type + + @alarm_type.setter + def alarm_type(self, alarm_type): + """Sets the alarm_type of this DeviceProfileAlarm. + + + :param alarm_type: The alarm_type of this DeviceProfileAlarm. # noqa: E501 + :type: str + """ + + self._alarm_type = alarm_type + + @property + def clear_rule(self): + """Gets the clear_rule of this DeviceProfileAlarm. # noqa: E501 + + + :return: The clear_rule of this DeviceProfileAlarm. # noqa: E501 + :rtype: AlarmRule + """ + return self._clear_rule + + @clear_rule.setter + def clear_rule(self, clear_rule): + """Sets the clear_rule of this DeviceProfileAlarm. + + + :param clear_rule: The clear_rule of this DeviceProfileAlarm. # noqa: E501 + :type: AlarmRule + """ + + self._clear_rule = clear_rule + + @property + def create_rules(self): + """Gets the create_rules of this DeviceProfileAlarm. # noqa: E501 + + + :return: The create_rules of this DeviceProfileAlarm. # noqa: E501 + :rtype: dict(str, AlarmRule) + """ + return self._create_rules + + @create_rules.setter + def create_rules(self, create_rules): + """Sets the create_rules of this DeviceProfileAlarm. + + + :param create_rules: The create_rules of this DeviceProfileAlarm. # noqa: E501 + :type: dict(str, AlarmRule) + """ + + self._create_rules = create_rules + + @property + def id(self): + """Gets the id of this DeviceProfileAlarm. # noqa: E501 + + + :return: The id of this DeviceProfileAlarm. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this DeviceProfileAlarm. + + + :param id: The id of this DeviceProfileAlarm. # noqa: E501 + :type: str + """ + + self._id = id + + @property + def propagate(self): + """Gets the propagate of this DeviceProfileAlarm. # noqa: E501 + + + :return: The propagate of this DeviceProfileAlarm. # noqa: E501 + :rtype: bool + """ + return self._propagate + + @propagate.setter + def propagate(self, propagate): + """Sets the propagate of this DeviceProfileAlarm. + + + :param propagate: The propagate of this DeviceProfileAlarm. # noqa: E501 + :type: bool + """ + + self._propagate = propagate + + @property + def propagate_relation_types(self): + """Gets the propagate_relation_types of this DeviceProfileAlarm. # noqa: E501 + + + :return: The propagate_relation_types of this DeviceProfileAlarm. # noqa: E501 + :rtype: list[str] + """ + return self._propagate_relation_types + + @propagate_relation_types.setter + def propagate_relation_types(self, propagate_relation_types): + """Sets the propagate_relation_types of this DeviceProfileAlarm. + + + :param propagate_relation_types: The propagate_relation_types of this DeviceProfileAlarm. # noqa: E501 + :type: list[str] + """ + + self._propagate_relation_types = propagate_relation_types + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceProfileAlarm, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceProfileAlarm): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_configuration.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_configuration.py new file mode 100644 index 0000000..a7abe89 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_configuration.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceProfileConfiguration(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """DeviceProfileConfiguration - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceProfileConfiguration, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceProfileConfiguration): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_data.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_data.py new file mode 100644 index 0000000..cbe0af3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_data.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceProfileData(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'alarms': 'list[DeviceProfileAlarm]', + 'configuration': 'DeviceProfileConfiguration', + 'provision_configuration': 'DeviceProfileProvisionConfiguration', + 'transport_configuration': 'DeviceProfileTransportConfiguration' + } + + attribute_map = { + 'alarms': 'alarms', + 'configuration': 'configuration', + 'provision_configuration': 'provisionConfiguration', + 'transport_configuration': 'transportConfiguration' + } + + def __init__(self, alarms=None, configuration=None, provision_configuration=None, transport_configuration=None): # noqa: E501 + """DeviceProfileData - a model defined in Swagger""" # noqa: E501 + self._alarms = None + self._configuration = None + self._provision_configuration = None + self._transport_configuration = None + self.discriminator = None + if alarms is not None: + self.alarms = alarms + if configuration is not None: + self.configuration = configuration + if provision_configuration is not None: + self.provision_configuration = provision_configuration + if transport_configuration is not None: + self.transport_configuration = transport_configuration + + @property + def alarms(self): + """Gets the alarms of this DeviceProfileData. # noqa: E501 + + + :return: The alarms of this DeviceProfileData. # noqa: E501 + :rtype: list[DeviceProfileAlarm] + """ + return self._alarms + + @alarms.setter + def alarms(self, alarms): + """Sets the alarms of this DeviceProfileData. + + + :param alarms: The alarms of this DeviceProfileData. # noqa: E501 + :type: list[DeviceProfileAlarm] + """ + + self._alarms = alarms + + @property + def configuration(self): + """Gets the configuration of this DeviceProfileData. # noqa: E501 + + + :return: The configuration of this DeviceProfileData. # noqa: E501 + :rtype: DeviceProfileConfiguration + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this DeviceProfileData. + + + :param configuration: The configuration of this DeviceProfileData. # noqa: E501 + :type: DeviceProfileConfiguration + """ + + self._configuration = configuration + + @property + def provision_configuration(self): + """Gets the provision_configuration of this DeviceProfileData. # noqa: E501 + + + :return: The provision_configuration of this DeviceProfileData. # noqa: E501 + :rtype: DeviceProfileProvisionConfiguration + """ + return self._provision_configuration + + @provision_configuration.setter + def provision_configuration(self, provision_configuration): + """Sets the provision_configuration of this DeviceProfileData. + + + :param provision_configuration: The provision_configuration of this DeviceProfileData. # noqa: E501 + :type: DeviceProfileProvisionConfiguration + """ + + self._provision_configuration = provision_configuration + + @property + def transport_configuration(self): + """Gets the transport_configuration of this DeviceProfileData. # noqa: E501 + + + :return: The transport_configuration of this DeviceProfileData. # noqa: E501 + :rtype: DeviceProfileTransportConfiguration + """ + return self._transport_configuration + + @transport_configuration.setter + def transport_configuration(self, transport_configuration): + """Sets the transport_configuration of this DeviceProfileData. + + + :param transport_configuration: The transport_configuration of this DeviceProfileData. # noqa: E501 + :type: DeviceProfileTransportConfiguration + """ + + self._transport_configuration = transport_configuration + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceProfileData, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceProfileData): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_id.py new file mode 100644 index 0000000..3b22fe6 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class DeviceProfileId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """DeviceProfileId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this DeviceProfileId. # noqa: E501 + + + :return: The id of this DeviceProfileId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this DeviceProfileId. + + + :param id: The id of this DeviceProfileId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceProfileId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceProfileId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_info.py new file mode 100644 index 0000000..00cd245 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_info.py @@ -0,0 +1,252 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceProfileInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'default_dashboard_id': 'DashboardId', + 'id': 'EntityId', + 'image': 'str', + 'name': 'str', + 'transport_type': 'str', + 'type': 'str' + } + + attribute_map = { + 'default_dashboard_id': 'defaultDashboardId', + 'id': 'id', + 'image': 'image', + 'name': 'name', + 'transport_type': 'transportType', + 'type': 'type' + } + + def __init__(self, default_dashboard_id=None, id=None, image=None, name=None, transport_type=None, type=None): # noqa: E501 + """DeviceProfileInfo - a model defined in Swagger""" # noqa: E501 + self._default_dashboard_id = None + self._id = None + self._image = None + self._name = None + self._transport_type = None + self._type = None + self.discriminator = None + if default_dashboard_id is not None: + self.default_dashboard_id = default_dashboard_id + if id is not None: + self.id = id + if image is not None: + self.image = image + if name is not None: + self.name = name + if transport_type is not None: + self.transport_type = transport_type + if type is not None: + self.type = type + + @property + def default_dashboard_id(self): + """Gets the default_dashboard_id of this DeviceProfileInfo. # noqa: E501 + + + :return: The default_dashboard_id of this DeviceProfileInfo. # noqa: E501 + :rtype: DashboardId + """ + return self._default_dashboard_id + + @default_dashboard_id.setter + def default_dashboard_id(self, default_dashboard_id): + """Sets the default_dashboard_id of this DeviceProfileInfo. + + + :param default_dashboard_id: The default_dashboard_id of this DeviceProfileInfo. # noqa: E501 + :type: DashboardId + """ + + self._default_dashboard_id = default_dashboard_id + + @property + def id(self): + """Gets the id of this DeviceProfileInfo. # noqa: E501 + + + :return: The id of this DeviceProfileInfo. # noqa: E501 + :rtype: EntityId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this DeviceProfileInfo. + + + :param id: The id of this DeviceProfileInfo. # noqa: E501 + :type: EntityId + """ + + self._id = id + + @property + def image(self): + """Gets the image of this DeviceProfileInfo. # noqa: E501 + + + :return: The image of this DeviceProfileInfo. # noqa: E501 + :rtype: str + """ + return self._image + + @image.setter + def image(self, image): + """Sets the image of this DeviceProfileInfo. + + + :param image: The image of this DeviceProfileInfo. # noqa: E501 + :type: str + """ + + self._image = image + + @property + def name(self): + """Gets the name of this DeviceProfileInfo. # noqa: E501 + + + :return: The name of this DeviceProfileInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this DeviceProfileInfo. + + + :param name: The name of this DeviceProfileInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def transport_type(self): + """Gets the transport_type of this DeviceProfileInfo. # noqa: E501 + + + :return: The transport_type of this DeviceProfileInfo. # noqa: E501 + :rtype: str + """ + return self._transport_type + + @transport_type.setter + def transport_type(self, transport_type): + """Sets the transport_type of this DeviceProfileInfo. + + + :param transport_type: The transport_type of this DeviceProfileInfo. # noqa: E501 + :type: str + """ + allowed_values = ["DEFAULT", "MQTT", "COAP", "LWM2M", "SNMP"] # noqa: E501 + if transport_type not in allowed_values: + raise ValueError( + "Invalid value for `transport_type` ({0}), must be one of {1}" # noqa: E501 + .format(transport_type, allowed_values) + ) + + self._transport_type = transport_type + + @property + def type(self): + """Gets the type of this DeviceProfileInfo. # noqa: E501 + + + :return: The type of this DeviceProfileInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this DeviceProfileInfo. + + + :param type: The type of this DeviceProfileInfo. # noqa: E501 + :type: str + """ + allowed_values = ["DEFAULT"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceProfileInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceProfileInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_provision_configuration.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_provision_configuration.py new file mode 100644 index 0000000..bff208a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_provision_configuration.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceProfileProvisionConfiguration(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'provision_device_secret': 'str' + } + + attribute_map = { + 'provision_device_secret': 'provisionDeviceSecret' + } + + def __init__(self, provision_device_secret=None): # noqa: E501 + """DeviceProfileProvisionConfiguration - a model defined in Swagger""" # noqa: E501 + self._provision_device_secret = None + self.discriminator = None + if provision_device_secret is not None: + self.provision_device_secret = provision_device_secret + + @property + def provision_device_secret(self): + """Gets the provision_device_secret of this DeviceProfileProvisionConfiguration. # noqa: E501 + + + :return: The provision_device_secret of this DeviceProfileProvisionConfiguration. # noqa: E501 + :rtype: str + """ + return self._provision_device_secret + + @provision_device_secret.setter + def provision_device_secret(self, provision_device_secret): + """Sets the provision_device_secret of this DeviceProfileProvisionConfiguration. + + + :param provision_device_secret: The provision_device_secret of this DeviceProfileProvisionConfiguration. # noqa: E501 + :type: str + """ + + self._provision_device_secret = provision_device_secret + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceProfileProvisionConfiguration, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceProfileProvisionConfiguration): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_transport_configuration.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_transport_configuration.py new file mode 100644 index 0000000..1f65fdc --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_profile_transport_configuration.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceProfileTransportConfiguration(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """DeviceProfileTransportConfiguration - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceProfileTransportConfiguration, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceProfileTransportConfiguration): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_search_query.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_search_query.py new file mode 100644 index 0000000..74c0cfd --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_search_query.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceSearchQuery(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'device_types': 'list[str]', + 'parameters': 'RelationsSearchParameters', + 'relation_type': 'str' + } + + attribute_map = { + 'device_types': 'deviceTypes', + 'parameters': 'parameters', + 'relation_type': 'relationType' + } + + def __init__(self, device_types=None, parameters=None, relation_type=None): # noqa: E501 + """DeviceSearchQuery - a model defined in Swagger""" # noqa: E501 + self._device_types = None + self._parameters = None + self._relation_type = None + self.discriminator = None + if device_types is not None: + self.device_types = device_types + if parameters is not None: + self.parameters = parameters + if relation_type is not None: + self.relation_type = relation_type + + @property + def device_types(self): + """Gets the device_types of this DeviceSearchQuery. # noqa: E501 + + + :return: The device_types of this DeviceSearchQuery. # noqa: E501 + :rtype: list[str] + """ + return self._device_types + + @device_types.setter + def device_types(self, device_types): + """Sets the device_types of this DeviceSearchQuery. + + + :param device_types: The device_types of this DeviceSearchQuery. # noqa: E501 + :type: list[str] + """ + + self._device_types = device_types + + @property + def parameters(self): + """Gets the parameters of this DeviceSearchQuery. # noqa: E501 + + + :return: The parameters of this DeviceSearchQuery. # noqa: E501 + :rtype: RelationsSearchParameters + """ + return self._parameters + + @parameters.setter + def parameters(self, parameters): + """Sets the parameters of this DeviceSearchQuery. + + + :param parameters: The parameters of this DeviceSearchQuery. # noqa: E501 + :type: RelationsSearchParameters + """ + + self._parameters = parameters + + @property + def relation_type(self): + """Gets the relation_type of this DeviceSearchQuery. # noqa: E501 + + + :return: The relation_type of this DeviceSearchQuery. # noqa: E501 + :rtype: str + """ + return self._relation_type + + @relation_type.setter + def relation_type(self, relation_type): + """Sets the relation_type of this DeviceSearchQuery. + + + :param relation_type: The relation_type of this DeviceSearchQuery. # noqa: E501 + :type: str + """ + + self._relation_type = relation_type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceSearchQuery, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceSearchQuery): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_transport_configuration.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_transport_configuration.py new file mode 100644 index 0000000..caa2f9a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/device_transport_configuration.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceTransportConfiguration(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """DeviceTransportConfiguration - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceTransportConfiguration, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceTransportConfiguration): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge.py new file mode 100644 index 0000000..64b6d21 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge.py @@ -0,0 +1,422 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Edge(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'cloud_endpoint': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'edge_license_key': 'str', + 'id': 'EdgeId', + 'label': 'str', + 'name': 'str', + 'root_rule_chain_id': 'RuleChainId', + 'routing_key': 'str', + 'secret': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'cloud_endpoint': 'cloudEndpoint', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'edge_license_key': 'edgeLicenseKey', + 'id': 'id', + 'label': 'label', + 'name': 'name', + 'root_rule_chain_id': 'rootRuleChainId', + 'routing_key': 'routingKey', + 'secret': 'secret', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, cloud_endpoint=None, created_time=None, customer_id=None, edge_license_key=None, id=None, label=None, name=None, root_rule_chain_id=None, routing_key=None, secret=None, tenant_id=None, type=None): # noqa: E501 + """Edge - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._cloud_endpoint = None + self._created_time = None + self._customer_id = None + self._edge_license_key = None + self._id = None + self._label = None + self._name = None + self._root_rule_chain_id = None + self._routing_key = None + self._secret = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if cloud_endpoint is not None: + self.cloud_endpoint = cloud_endpoint + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if edge_license_key is not None: + self.edge_license_key = edge_license_key + if id is not None: + self.id = id + if label is not None: + self.label = label + if name is not None: + self.name = name + if root_rule_chain_id is not None: + self.root_rule_chain_id = root_rule_chain_id + if routing_key is not None: + self.routing_key = routing_key + if secret is not None: + self.secret = secret + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this Edge. # noqa: E501 + + + :return: The additional_info of this Edge. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Edge. + + + :param additional_info: The additional_info of this Edge. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def cloud_endpoint(self): + """Gets the cloud_endpoint of this Edge. # noqa: E501 + + + :return: The cloud_endpoint of this Edge. # noqa: E501 + :rtype: str + """ + return self._cloud_endpoint + + @cloud_endpoint.setter + def cloud_endpoint(self, cloud_endpoint): + """Sets the cloud_endpoint of this Edge. + + + :param cloud_endpoint: The cloud_endpoint of this Edge. # noqa: E501 + :type: str + """ + + self._cloud_endpoint = cloud_endpoint + + @property + def created_time(self): + """Gets the created_time of this Edge. # noqa: E501 + + + :return: The created_time of this Edge. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Edge. + + + :param created_time: The created_time of this Edge. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this Edge. # noqa: E501 + + + :return: The customer_id of this Edge. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this Edge. + + + :param customer_id: The customer_id of this Edge. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def edge_license_key(self): + """Gets the edge_license_key of this Edge. # noqa: E501 + + + :return: The edge_license_key of this Edge. # noqa: E501 + :rtype: str + """ + return self._edge_license_key + + @edge_license_key.setter + def edge_license_key(self, edge_license_key): + """Sets the edge_license_key of this Edge. + + + :param edge_license_key: The edge_license_key of this Edge. # noqa: E501 + :type: str + """ + + self._edge_license_key = edge_license_key + + @property + def id(self): + """Gets the id of this Edge. # noqa: E501 + + + :return: The id of this Edge. # noqa: E501 + :rtype: EdgeId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Edge. + + + :param id: The id of this Edge. # noqa: E501 + :type: EdgeId + """ + + self._id = id + + @property + def label(self): + """Gets the label of this Edge. # noqa: E501 + + + :return: The label of this Edge. # noqa: E501 + :rtype: str + """ + return self._label + + @label.setter + def label(self, label): + """Sets the label of this Edge. + + + :param label: The label of this Edge. # noqa: E501 + :type: str + """ + + self._label = label + + @property + def name(self): + """Gets the name of this Edge. # noqa: E501 + + + :return: The name of this Edge. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Edge. + + + :param name: The name of this Edge. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def root_rule_chain_id(self): + """Gets the root_rule_chain_id of this Edge. # noqa: E501 + + + :return: The root_rule_chain_id of this Edge. # noqa: E501 + :rtype: RuleChainId + """ + return self._root_rule_chain_id + + @root_rule_chain_id.setter + def root_rule_chain_id(self, root_rule_chain_id): + """Sets the root_rule_chain_id of this Edge. + + + :param root_rule_chain_id: The root_rule_chain_id of this Edge. # noqa: E501 + :type: RuleChainId + """ + + self._root_rule_chain_id = root_rule_chain_id + + @property + def routing_key(self): + """Gets the routing_key of this Edge. # noqa: E501 + + + :return: The routing_key of this Edge. # noqa: E501 + :rtype: str + """ + return self._routing_key + + @routing_key.setter + def routing_key(self, routing_key): + """Sets the routing_key of this Edge. + + + :param routing_key: The routing_key of this Edge. # noqa: E501 + :type: str + """ + + self._routing_key = routing_key + + @property + def secret(self): + """Gets the secret of this Edge. # noqa: E501 + + + :return: The secret of this Edge. # noqa: E501 + :rtype: str + """ + return self._secret + + @secret.setter + def secret(self, secret): + """Sets the secret of this Edge. + + + :param secret: The secret of this Edge. # noqa: E501 + :type: str + """ + + self._secret = secret + + @property + def tenant_id(self): + """Gets the tenant_id of this Edge. # noqa: E501 + + + :return: The tenant_id of this Edge. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Edge. + + + :param tenant_id: The tenant_id of this Edge. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this Edge. # noqa: E501 + + + :return: The type of this Edge. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Edge. + + + :param type: The type of this Edge. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Edge, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Edge): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_event.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_event.py new file mode 100644 index 0000000..dadcb98 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_event.py @@ -0,0 +1,330 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EdgeEvent(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str', + 'body': 'str', + 'created_time': 'int', + 'edge_id': 'EdgeId', + 'entity_id': 'str', + 'id': 'EdgeEventId', + 'tenant_id': 'TenantId', + 'type': 'str', + 'uid': 'str' + } + + attribute_map = { + 'action': 'action', + 'body': 'body', + 'created_time': 'createdTime', + 'edge_id': 'edgeId', + 'entity_id': 'entityId', + 'id': 'id', + 'tenant_id': 'tenantId', + 'type': 'type', + 'uid': 'uid' + } + + def __init__(self, action=None, body=None, created_time=None, edge_id=None, entity_id=None, id=None, tenant_id=None, type=None, uid=None): # noqa: E501 + """EdgeEvent - a model defined in Swagger""" # noqa: E501 + self._action = None + self._body = None + self._created_time = None + self._edge_id = None + self._entity_id = None + self._id = None + self._tenant_id = None + self._type = None + self._uid = None + self.discriminator = None + if action is not None: + self.action = action + if body is not None: + self.body = body + if created_time is not None: + self.created_time = created_time + if edge_id is not None: + self.edge_id = edge_id + if entity_id is not None: + self.entity_id = entity_id + if id is not None: + self.id = id + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + if uid is not None: + self.uid = uid + + @property + def action(self): + """Gets the action of this EdgeEvent. # noqa: E501 + + + :return: The action of this EdgeEvent. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this EdgeEvent. + + + :param action: The action of this EdgeEvent. # noqa: E501 + :type: str + """ + allowed_values = ["ADDED", "DELETED", "UPDATED", "POST_ATTRIBUTES", "ATTRIBUTES_UPDATED", "ATTRIBUTES_DELETED", "TIMESERIES_UPDATED", "CREDENTIALS_UPDATED", "ASSIGNED_TO_CUSTOMER", "UNASSIGNED_FROM_CUSTOMER", "RELATION_ADD_OR_UPDATE", "RELATION_DELETED", "RPC_CALL", "ALARM_ACK", "ALARM_CLEAR", "ASSIGNED_TO_EDGE", "UNASSIGNED_FROM_EDGE", "CREDENTIALS_REQUEST", "ENTITY_MERGE_REQUEST"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + @property + def body(self): + """Gets the body of this EdgeEvent. # noqa: E501 + + + :return: The body of this EdgeEvent. # noqa: E501 + :rtype: str + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this EdgeEvent. + + + :param body: The body of this EdgeEvent. # noqa: E501 + :type: str + """ + + self._body = body + + @property + def created_time(self): + """Gets the created_time of this EdgeEvent. # noqa: E501 + + + :return: The created_time of this EdgeEvent. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this EdgeEvent. + + + :param created_time: The created_time of this EdgeEvent. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def edge_id(self): + """Gets the edge_id of this EdgeEvent. # noqa: E501 + + + :return: The edge_id of this EdgeEvent. # noqa: E501 + :rtype: EdgeId + """ + return self._edge_id + + @edge_id.setter + def edge_id(self, edge_id): + """Sets the edge_id of this EdgeEvent. + + + :param edge_id: The edge_id of this EdgeEvent. # noqa: E501 + :type: EdgeId + """ + + self._edge_id = edge_id + + @property + def entity_id(self): + """Gets the entity_id of this EdgeEvent. # noqa: E501 + + + :return: The entity_id of this EdgeEvent. # noqa: E501 + :rtype: str + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this EdgeEvent. + + + :param entity_id: The entity_id of this EdgeEvent. # noqa: E501 + :type: str + """ + + self._entity_id = entity_id + + @property + def id(self): + """Gets the id of this EdgeEvent. # noqa: E501 + + + :return: The id of this EdgeEvent. # noqa: E501 + :rtype: EdgeEventId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EdgeEvent. + + + :param id: The id of this EdgeEvent. # noqa: E501 + :type: EdgeEventId + """ + + self._id = id + + @property + def tenant_id(self): + """Gets the tenant_id of this EdgeEvent. # noqa: E501 + + + :return: The tenant_id of this EdgeEvent. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this EdgeEvent. + + + :param tenant_id: The tenant_id of this EdgeEvent. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this EdgeEvent. # noqa: E501 + + + :return: The type of this EdgeEvent. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EdgeEvent. + + + :param type: The type of this EdgeEvent. # noqa: E501 + :type: str + """ + allowed_values = ["DASHBOARD", "ASSET", "DEVICE", "DEVICE_PROFILE", "ENTITY_VIEW", "ALARM", "RULE_CHAIN", "RULE_CHAIN_METADATA", "EDGE", "USER", "CUSTOMER", "RELATION", "TENANT", "WIDGETS_BUNDLE", "WIDGET_TYPE", "ADMIN_SETTINGS"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + @property + def uid(self): + """Gets the uid of this EdgeEvent. # noqa: E501 + + + :return: The uid of this EdgeEvent. # noqa: E501 + :rtype: str + """ + return self._uid + + @uid.setter + def uid(self, uid): + """Sets the uid of this EdgeEvent. + + + :param uid: The uid of this EdgeEvent. # noqa: E501 + :type: str + """ + + self._uid = uid + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EdgeEvent, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EdgeEvent): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_event_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_event_id.py new file mode 100644 index 0000000..7c1ebde --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_event_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class EdgeEventId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """EdgeEventId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this EdgeEventId. # noqa: E501 + + + :return: The id of this EdgeEventId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EdgeEventId. + + + :param id: The id of this EdgeEventId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EdgeEventId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EdgeEventId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_id.py new file mode 100644 index 0000000..6642b9a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class EdgeId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """EdgeId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this EdgeId. # noqa: E501 + + + :return: The id of this EdgeId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EdgeId. + + + :param id: The id of this EdgeId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EdgeId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EdgeId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_info.py new file mode 100644 index 0000000..4a100ab --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_info.py @@ -0,0 +1,474 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EdgeInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'cloud_endpoint': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'customer_is_public': 'bool', + 'customer_title': 'str', + 'edge_license_key': 'str', + 'id': 'EdgeId', + 'label': 'str', + 'name': 'str', + 'root_rule_chain_id': 'RuleChainId', + 'routing_key': 'str', + 'secret': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'cloud_endpoint': 'cloudEndpoint', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'customer_is_public': 'customerIsPublic', + 'customer_title': 'customerTitle', + 'edge_license_key': 'edgeLicenseKey', + 'id': 'id', + 'label': 'label', + 'name': 'name', + 'root_rule_chain_id': 'rootRuleChainId', + 'routing_key': 'routingKey', + 'secret': 'secret', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, cloud_endpoint=None, created_time=None, customer_id=None, customer_is_public=None, customer_title=None, edge_license_key=None, id=None, label=None, name=None, root_rule_chain_id=None, routing_key=None, secret=None, tenant_id=None, type=None): # noqa: E501 + """EdgeInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._cloud_endpoint = None + self._created_time = None + self._customer_id = None + self._customer_is_public = None + self._customer_title = None + self._edge_license_key = None + self._id = None + self._label = None + self._name = None + self._root_rule_chain_id = None + self._routing_key = None + self._secret = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if cloud_endpoint is not None: + self.cloud_endpoint = cloud_endpoint + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if customer_is_public is not None: + self.customer_is_public = customer_is_public + if customer_title is not None: + self.customer_title = customer_title + if edge_license_key is not None: + self.edge_license_key = edge_license_key + if id is not None: + self.id = id + if label is not None: + self.label = label + if name is not None: + self.name = name + if root_rule_chain_id is not None: + self.root_rule_chain_id = root_rule_chain_id + if routing_key is not None: + self.routing_key = routing_key + if secret is not None: + self.secret = secret + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this EdgeInfo. # noqa: E501 + + + :return: The additional_info of this EdgeInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this EdgeInfo. + + + :param additional_info: The additional_info of this EdgeInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def cloud_endpoint(self): + """Gets the cloud_endpoint of this EdgeInfo. # noqa: E501 + + + :return: The cloud_endpoint of this EdgeInfo. # noqa: E501 + :rtype: str + """ + return self._cloud_endpoint + + @cloud_endpoint.setter + def cloud_endpoint(self, cloud_endpoint): + """Sets the cloud_endpoint of this EdgeInfo. + + + :param cloud_endpoint: The cloud_endpoint of this EdgeInfo. # noqa: E501 + :type: str + """ + + self._cloud_endpoint = cloud_endpoint + + @property + def created_time(self): + """Gets the created_time of this EdgeInfo. # noqa: E501 + + + :return: The created_time of this EdgeInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this EdgeInfo. + + + :param created_time: The created_time of this EdgeInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this EdgeInfo. # noqa: E501 + + + :return: The customer_id of this EdgeInfo. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this EdgeInfo. + + + :param customer_id: The customer_id of this EdgeInfo. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def customer_is_public(self): + """Gets the customer_is_public of this EdgeInfo. # noqa: E501 + + + :return: The customer_is_public of this EdgeInfo. # noqa: E501 + :rtype: bool + """ + return self._customer_is_public + + @customer_is_public.setter + def customer_is_public(self, customer_is_public): + """Sets the customer_is_public of this EdgeInfo. + + + :param customer_is_public: The customer_is_public of this EdgeInfo. # noqa: E501 + :type: bool + """ + + self._customer_is_public = customer_is_public + + @property + def customer_title(self): + """Gets the customer_title of this EdgeInfo. # noqa: E501 + + + :return: The customer_title of this EdgeInfo. # noqa: E501 + :rtype: str + """ + return self._customer_title + + @customer_title.setter + def customer_title(self, customer_title): + """Sets the customer_title of this EdgeInfo. + + + :param customer_title: The customer_title of this EdgeInfo. # noqa: E501 + :type: str + """ + + self._customer_title = customer_title + + @property + def edge_license_key(self): + """Gets the edge_license_key of this EdgeInfo. # noqa: E501 + + + :return: The edge_license_key of this EdgeInfo. # noqa: E501 + :rtype: str + """ + return self._edge_license_key + + @edge_license_key.setter + def edge_license_key(self, edge_license_key): + """Sets the edge_license_key of this EdgeInfo. + + + :param edge_license_key: The edge_license_key of this EdgeInfo. # noqa: E501 + :type: str + """ + + self._edge_license_key = edge_license_key + + @property + def id(self): + """Gets the id of this EdgeInfo. # noqa: E501 + + + :return: The id of this EdgeInfo. # noqa: E501 + :rtype: EdgeId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EdgeInfo. + + + :param id: The id of this EdgeInfo. # noqa: E501 + :type: EdgeId + """ + + self._id = id + + @property + def label(self): + """Gets the label of this EdgeInfo. # noqa: E501 + + + :return: The label of this EdgeInfo. # noqa: E501 + :rtype: str + """ + return self._label + + @label.setter + def label(self, label): + """Sets the label of this EdgeInfo. + + + :param label: The label of this EdgeInfo. # noqa: E501 + :type: str + """ + + self._label = label + + @property + def name(self): + """Gets the name of this EdgeInfo. # noqa: E501 + + + :return: The name of this EdgeInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this EdgeInfo. + + + :param name: The name of this EdgeInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def root_rule_chain_id(self): + """Gets the root_rule_chain_id of this EdgeInfo. # noqa: E501 + + + :return: The root_rule_chain_id of this EdgeInfo. # noqa: E501 + :rtype: RuleChainId + """ + return self._root_rule_chain_id + + @root_rule_chain_id.setter + def root_rule_chain_id(self, root_rule_chain_id): + """Sets the root_rule_chain_id of this EdgeInfo. + + + :param root_rule_chain_id: The root_rule_chain_id of this EdgeInfo. # noqa: E501 + :type: RuleChainId + """ + + self._root_rule_chain_id = root_rule_chain_id + + @property + def routing_key(self): + """Gets the routing_key of this EdgeInfo. # noqa: E501 + + + :return: The routing_key of this EdgeInfo. # noqa: E501 + :rtype: str + """ + return self._routing_key + + @routing_key.setter + def routing_key(self, routing_key): + """Sets the routing_key of this EdgeInfo. + + + :param routing_key: The routing_key of this EdgeInfo. # noqa: E501 + :type: str + """ + + self._routing_key = routing_key + + @property + def secret(self): + """Gets the secret of this EdgeInfo. # noqa: E501 + + + :return: The secret of this EdgeInfo. # noqa: E501 + :rtype: str + """ + return self._secret + + @secret.setter + def secret(self, secret): + """Sets the secret of this EdgeInfo. + + + :param secret: The secret of this EdgeInfo. # noqa: E501 + :type: str + """ + + self._secret = secret + + @property + def tenant_id(self): + """Gets the tenant_id of this EdgeInfo. # noqa: E501 + + + :return: The tenant_id of this EdgeInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this EdgeInfo. + + + :param tenant_id: The tenant_id of this EdgeInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this EdgeInfo. # noqa: E501 + + + :return: The type of this EdgeInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EdgeInfo. + + + :param type: The type of this EdgeInfo. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EdgeInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EdgeInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_search_query.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_search_query.py new file mode 100644 index 0000000..daf0fbc --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/edge_search_query.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EdgeSearchQuery(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'edge_types': 'list[str]', + 'parameters': 'RelationsSearchParameters', + 'relation_type': 'str' + } + + attribute_map = { + 'edge_types': 'edgeTypes', + 'parameters': 'parameters', + 'relation_type': 'relationType' + } + + def __init__(self, edge_types=None, parameters=None, relation_type=None): # noqa: E501 + """EdgeSearchQuery - a model defined in Swagger""" # noqa: E501 + self._edge_types = None + self._parameters = None + self._relation_type = None + self.discriminator = None + if edge_types is not None: + self.edge_types = edge_types + if parameters is not None: + self.parameters = parameters + if relation_type is not None: + self.relation_type = relation_type + + @property + def edge_types(self): + """Gets the edge_types of this EdgeSearchQuery. # noqa: E501 + + + :return: The edge_types of this EdgeSearchQuery. # noqa: E501 + :rtype: list[str] + """ + return self._edge_types + + @edge_types.setter + def edge_types(self, edge_types): + """Sets the edge_types of this EdgeSearchQuery. + + + :param edge_types: The edge_types of this EdgeSearchQuery. # noqa: E501 + :type: list[str] + """ + + self._edge_types = edge_types + + @property + def parameters(self): + """Gets the parameters of this EdgeSearchQuery. # noqa: E501 + + + :return: The parameters of this EdgeSearchQuery. # noqa: E501 + :rtype: RelationsSearchParameters + """ + return self._parameters + + @parameters.setter + def parameters(self, parameters): + """Sets the parameters of this EdgeSearchQuery. + + + :param parameters: The parameters of this EdgeSearchQuery. # noqa: E501 + :type: RelationsSearchParameters + """ + + self._parameters = parameters + + @property + def relation_type(self): + """Gets the relation_type of this EdgeSearchQuery. # noqa: E501 + + + :return: The relation_type of this EdgeSearchQuery. # noqa: E501 + :rtype: str + """ + return self._relation_type + + @relation_type.setter + def relation_type(self, relation_type): + """Sets the relation_type of this EdgeSearchQuery. + + + :param relation_type: The relation_type of this EdgeSearchQuery. # noqa: E501 + :type: str + """ + + self._relation_type = relation_type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EdgeSearchQuery, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EdgeSearchQuery): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_count_query.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_count_query.py new file mode 100644 index 0000000..5a8d68d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_count_query.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityCountQuery(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_filter': 'EntityFilter', + 'key_filters': 'list[KeyFilter]' + } + + attribute_map = { + 'entity_filter': 'entityFilter', + 'key_filters': 'keyFilters' + } + + def __init__(self, entity_filter=None, key_filters=None): # noqa: E501 + """EntityCountQuery - a model defined in Swagger""" # noqa: E501 + self._entity_filter = None + self._key_filters = None + self.discriminator = None + if entity_filter is not None: + self.entity_filter = entity_filter + if key_filters is not None: + self.key_filters = key_filters + + @property + def entity_filter(self): + """Gets the entity_filter of this EntityCountQuery. # noqa: E501 + + + :return: The entity_filter of this EntityCountQuery. # noqa: E501 + :rtype: EntityFilter + """ + return self._entity_filter + + @entity_filter.setter + def entity_filter(self, entity_filter): + """Sets the entity_filter of this EntityCountQuery. + + + :param entity_filter: The entity_filter of this EntityCountQuery. # noqa: E501 + :type: EntityFilter + """ + + self._entity_filter = entity_filter + + @property + def key_filters(self): + """Gets the key_filters of this EntityCountQuery. # noqa: E501 + + + :return: The key_filters of this EntityCountQuery. # noqa: E501 + :rtype: list[KeyFilter] + """ + return self._key_filters + + @key_filters.setter + def key_filters(self, key_filters): + """Sets the key_filters of this EntityCountQuery. + + + :param key_filters: The key_filters of this EntityCountQuery. # noqa: E501 + :type: list[KeyFilter] + """ + + self._key_filters = key_filters + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityCountQuery, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityCountQuery): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data.py new file mode 100644 index 0000000..b8f99b2 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityData(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_id': 'EntityId', + 'latest': 'dict(str, dict(str, TsValue))', + 'timeseries': 'dict(str, list[TsValue])' + } + + attribute_map = { + 'entity_id': 'entityId', + 'latest': 'latest', + 'timeseries': 'timeseries' + } + + def __init__(self, entity_id=None, latest=None, timeseries=None): # noqa: E501 + """EntityData - a model defined in Swagger""" # noqa: E501 + self._entity_id = None + self._latest = None + self._timeseries = None + self.discriminator = None + if entity_id is not None: + self.entity_id = entity_id + if latest is not None: + self.latest = latest + if timeseries is not None: + self.timeseries = timeseries + + @property + def entity_id(self): + """Gets the entity_id of this EntityData. # noqa: E501 + + + :return: The entity_id of this EntityData. # noqa: E501 + :rtype: EntityId + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this EntityData. + + + :param entity_id: The entity_id of this EntityData. # noqa: E501 + :type: EntityId + """ + + self._entity_id = entity_id + + @property + def latest(self): + """Gets the latest of this EntityData. # noqa: E501 + + + :return: The latest of this EntityData. # noqa: E501 + :rtype: dict(str, dict(str, TsValue)) + """ + return self._latest + + @latest.setter + def latest(self, latest): + """Sets the latest of this EntityData. + + + :param latest: The latest of this EntityData. # noqa: E501 + :type: dict(str, dict(str, TsValue)) + """ + + self._latest = latest + + @property + def timeseries(self): + """Gets the timeseries of this EntityData. # noqa: E501 + + + :return: The timeseries of this EntityData. # noqa: E501 + :rtype: dict(str, list[TsValue]) + """ + return self._timeseries + + @timeseries.setter + def timeseries(self, timeseries): + """Sets the timeseries of this EntityData. + + + :param timeseries: The timeseries of this EntityData. # noqa: E501 + :type: dict(str, list[TsValue]) + """ + + self._timeseries = timeseries + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityData, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityData): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data_page_link.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data_page_link.py new file mode 100644 index 0000000..1c711a0 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data_page_link.py @@ -0,0 +1,219 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityDataPageLink(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'page_size': 'int', + 'page': 'int', + 'text_search': 'str', + 'sort_order': 'EntityDataSortOrder', + 'dynamic': 'bool' + } + + attribute_map = { + 'page_size': 'pageSize', + 'page': 'page', + 'text_search': 'textSearch', + 'sort_order': 'sortOrder', + 'dynamic': 'dynamic' + } + + def __init__(self, page_size=None, page=None, text_search=None, sort_order=None, dynamic=None): # noqa: E501 + """EntityDataPageLink - a model defined in Swagger""" # noqa: E501 + self._page_size = None + self._page = None + self._text_search = None + self._sort_order = None + self._dynamic = None + self.discriminator = None + self.page_size = page_size + self.page = page + self.text_search = text_search + self.sort_order = sort_order + self.dynamic = dynamic + + @property + def page_size(self): + """Gets the page_size of this EntityDataPageLink. # noqa: E501 + + + :return: The page_size of this EntityDataPageLink. # noqa: E501 + :rtype: int + """ + return self._page_size + + @page_size.setter + def page_size(self, page_size): + """Sets the page_size of this EntityDataPageLink. + + + :param page_size: The page_size of this EntityDataPageLink. # noqa: E501 + :type: int + """ + if page_size is None: + raise ValueError("Invalid value for `page_size`, must not be `None`") # noqa: E501 + + self._page_size = page_size + + @property + def page(self): + """Gets the page of this EntityDataPageLink. # noqa: E501 + + + :return: The page of this EntityDataPageLink. # noqa: E501 + :rtype: int + """ + return self._page + + @page.setter + def page(self, page): + """Sets the page of this EntityDataPageLink. + + + :param page: The page of this EntityDataPageLink. # noqa: E501 + :type: int + """ + if page is None: + raise ValueError("Invalid value for `page`, must not be `None`") # noqa: E501 + + self._page = page + + @property + def text_search(self): + """Gets the text_search of this EntityDataPageLink. # noqa: E501 + + + :return: The text_search of this EntityDataPageLink. # noqa: E501 + :rtype: str + """ + return self._text_search + + @text_search.setter + def text_search(self, text_search): + """Sets the text_search of this EntityDataPageLink. + + + :param text_search: The text_search of this EntityDataPageLink. # noqa: E501 + :type: str + """ + if text_search is None: + raise ValueError("Invalid value for `text_search`, must not be `None`") # noqa: E501 + + self._text_search = text_search + + @property + def sort_order(self): + """Gets the sort_order of this EntityDataPageLink. # noqa: E501 + + + :return: The sort_order of this EntityDataPageLink. # noqa: E501 + :rtype: EntityDataSortOrder + """ + return self._sort_order + + @sort_order.setter + def sort_order(self, sort_order): + """Sets the sort_order of this EntityDataPageLink. + + + :param sort_order: The sort_order of this EntityDataPageLink. # noqa: E501 + :type: EntityDataSortOrder + """ + if sort_order is None: + raise ValueError("Invalid value for `sort_order`, must not be `None`") # noqa: E501 + + self._sort_order = sort_order + + @property + def dynamic(self): + """Gets the dynamic of this EntityDataPageLink. # noqa: E501 + + + :return: The dynamic of this EntityDataPageLink. # noqa: E501 + :rtype: bool + """ + return self._dynamic + + @dynamic.setter + def dynamic(self, dynamic): + """Sets the dynamic of this EntityDataPageLink. + + + :param dynamic: The dynamic of this EntityDataPageLink. # noqa: E501 + :type: bool + """ + if dynamic is None: + raise ValueError("Invalid value for `dynamic`, must not be `None`") # noqa: E501 + + self._dynamic = dynamic + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityDataPageLink, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityDataPageLink): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data_query.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data_query.py new file mode 100644 index 0000000..488306e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data_query.py @@ -0,0 +1,214 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityDataQuery(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_fields': 'list[EntityKey]', + 'entity_filter': 'EntityFilter', + 'key_filters': 'list[KeyFilter]', + 'latest_values': 'list[EntityKey]', + 'page_link': 'EntityDataPageLink' + } + + attribute_map = { + 'entity_fields': 'entityFields', + 'entity_filter': 'entityFilter', + 'key_filters': 'keyFilters', + 'latest_values': 'latestValues', + 'page_link': 'pageLink' + } + + def __init__(self, entity_fields=None, entity_filter=None, key_filters=None, latest_values=None, page_link=None): # noqa: E501 + """EntityDataQuery - a model defined in Swagger""" # noqa: E501 + self._entity_fields = None + self._entity_filter = None + self._key_filters = None + self._latest_values = None + self._page_link = None + self.discriminator = None + if entity_fields is not None: + self.entity_fields = entity_fields + if entity_filter is not None: + self.entity_filter = entity_filter + if key_filters is not None: + self.key_filters = key_filters + if latest_values is not None: + self.latest_values = latest_values + if page_link is not None: + self.page_link = page_link + + @property + def entity_fields(self): + """Gets the entity_fields of this EntityDataQuery. # noqa: E501 + + + :return: The entity_fields of this EntityDataQuery. # noqa: E501 + :rtype: list[EntityKey] + """ + return self._entity_fields + + @entity_fields.setter + def entity_fields(self, entity_fields): + """Sets the entity_fields of this EntityDataQuery. + + + :param entity_fields: The entity_fields of this EntityDataQuery. # noqa: E501 + :type: list[EntityKey] + """ + + self._entity_fields = entity_fields + + @property + def entity_filter(self): + """Gets the entity_filter of this EntityDataQuery. # noqa: E501 + + + :return: The entity_filter of this EntityDataQuery. # noqa: E501 + :rtype: EntityFilter + """ + return self._entity_filter + + @entity_filter.setter + def entity_filter(self, entity_filter): + """Sets the entity_filter of this EntityDataQuery. + + + :param entity_filter: The entity_filter of this EntityDataQuery. # noqa: E501 + :type: EntityFilter + """ + + self._entity_filter = entity_filter + + @property + def key_filters(self): + """Gets the key_filters of this EntityDataQuery. # noqa: E501 + + + :return: The key_filters of this EntityDataQuery. # noqa: E501 + :rtype: list[KeyFilter] + """ + return self._key_filters + + @key_filters.setter + def key_filters(self, key_filters): + """Sets the key_filters of this EntityDataQuery. + + + :param key_filters: The key_filters of this EntityDataQuery. # noqa: E501 + :type: list[KeyFilter] + """ + + self._key_filters = key_filters + + @property + def latest_values(self): + """Gets the latest_values of this EntityDataQuery. # noqa: E501 + + + :return: The latest_values of this EntityDataQuery. # noqa: E501 + :rtype: list[EntityKey] + """ + return self._latest_values + + @latest_values.setter + def latest_values(self, latest_values): + """Sets the latest_values of this EntityDataQuery. + + + :param latest_values: The latest_values of this EntityDataQuery. # noqa: E501 + :type: list[EntityKey] + """ + + self._latest_values = latest_values + + @property + def page_link(self): + """Gets the page_link of this EntityDataQuery. # noqa: E501 + + + :return: The page_link of this EntityDataQuery. # noqa: E501 + :rtype: EntityDataPageLink + """ + return self._page_link + + @page_link.setter + def page_link(self, page_link): + """Sets the page_link of this EntityDataQuery. + + + :param page_link: The page_link of this EntityDataQuery. # noqa: E501 + :type: EntityDataPageLink + """ + + self._page_link = page_link + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityDataQuery, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityDataQuery): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data_sort_order.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data_sort_order.py new file mode 100644 index 0000000..94f35eb --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_data_sort_order.py @@ -0,0 +1,142 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityDataSortOrder(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'direction': 'str', + 'key': 'EntityKey' + } + + attribute_map = { + 'direction': 'direction', + 'key': 'key' + } + + def __init__(self, direction=None, key=None): # noqa: E501 + """EntityDataSortOrder - a model defined in Swagger""" # noqa: E501 + self._direction = None + self._key = None + self.discriminator = None + if direction is not None: + self.direction = direction + if key is not None: + self.key = key + + @property + def direction(self): + """Gets the direction of this EntityDataSortOrder. # noqa: E501 + + + :return: The direction of this EntityDataSortOrder. # noqa: E501 + :rtype: str + """ + return self._direction + + @direction.setter + def direction(self, direction): + """Sets the direction of this EntityDataSortOrder. + + + :param direction: The direction of this EntityDataSortOrder. # noqa: E501 + :type: str + """ + allowed_values = ["ASC", "DESC"] # noqa: E501 + if direction not in allowed_values: + raise ValueError( + "Invalid value for `direction` ({0}), must be one of {1}" # noqa: E501 + .format(direction, allowed_values) + ) + + self._direction = direction + + @property + def key(self): + """Gets the key of this EntityDataSortOrder. # noqa: E501 + + + :return: The key of this EntityDataSortOrder. # noqa: E501 + :rtype: EntityKey + """ + return self._key + + @key.setter + def key(self, key): + """Sets the key of this EntityDataSortOrder. + + + :param key: The key of this EntityDataSortOrder. # noqa: E501 + :type: EntityKey + """ + + self._key = key + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityDataSortOrder, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityDataSortOrder): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_filter.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_filter.py new file mode 100644 index 0000000..280d900 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_filter.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityFilter(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """EntityFilter - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityFilter, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityFilter): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_id.py new file mode 100644 index 0000000..0e77132 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_id.py @@ -0,0 +1,142 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_type': 'str', + 'id': 'str' + } + + attribute_map = { + 'entity_type': 'entityType', + 'id': 'id' + } + + def __init__(self, entity_type=None, id=None): # noqa: E501 + """EntityId - a model defined in Swagger""" # noqa: E501 + self._entity_type = None + self._id = None + self.discriminator = None + if entity_type is not None: + self.entity_type = entity_type + if id is not None: + self.id = id + + @property + def entity_type(self): + """Gets the entity_type of this EntityId. # noqa: E501 + + + :return: The entity_type of this EntityId. # noqa: E501 + :rtype: str + """ + return self._entity_type + + @entity_type.setter + def entity_type(self, entity_type): + """Sets the entity_type of this EntityId. + + + :param entity_type: The entity_type of this EntityId. # noqa: E501 + :type: str + """ + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "RULE_CHAIN", "RULE_NODE", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if entity_type not in allowed_values: + raise ValueError( + "Invalid value for `entity_type` ({0}), must be one of {1}" # noqa: E501 + .format(entity_type, allowed_values) + ) + + self._entity_type = entity_type + + @property + def id(self): + """Gets the id of this EntityId. # noqa: E501 + + + :return: The id of this EntityId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EntityId. + + + :param id: The id of this EntityId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_info.py new file mode 100644 index 0000000..b436433 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_info.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'EntityId', + 'name': 'str' + } + + attribute_map = { + 'id': 'id', + 'name': 'name' + } + + def __init__(self, id=None, name=None): # noqa: E501 + """EntityInfo - a model defined in Swagger""" # noqa: E501 + self._id = None + self._name = None + self.discriminator = None + if id is not None: + self.id = id + if name is not None: + self.name = name + + @property + def id(self): + """Gets the id of this EntityInfo. # noqa: E501 + + + :return: The id of this EntityInfo. # noqa: E501 + :rtype: EntityId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EntityInfo. + + + :param id: The id of this EntityInfo. # noqa: E501 + :type: EntityId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this EntityInfo. # noqa: E501 + + + :return: The name of this EntityInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this EntityInfo. + + + :param name: The name of this EntityInfo. # noqa: E501 + :type: str + """ + + self._name = name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_key.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_key.py new file mode 100644 index 0000000..68a1f06 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_key.py @@ -0,0 +1,144 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityKey(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'type': 'str', + 'key': 'str' + } + + attribute_map = { + 'type': 'type', + 'key': 'key' + } + + def __init__(self, type=None, key=None): # noqa: E501 + """EntityKey - a model defined in Swagger""" # noqa: E501 + self._type = None + self._key = None + self.discriminator = None + self.type = type + self.key = key + + @property + def type(self): + """Gets the type of this EntityKey. # noqa: E501 + + + :return: The type of this EntityKey. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntityKey. + + + :param type: The type of this EntityKey. # noqa: E501 + :type: str + """ + if type is None: + raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 + allowed_values = ["ATTRIBUTE", "CLIENT_ATTRIBUTE", "SHARED_ATTRIBUTE", "SERVER_ATTRIBUTE", "TIME_SERIES", "ENTITY_FIELD", "ALARM_FIELD"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + @property + def key(self): + """Gets the key of this EntityKey. # noqa: E501 + + + :return: The key of this EntityKey. # noqa: E501 + :rtype: str + """ + return self._key + + @key.setter + def key(self, key): + """Sets the key of this EntityKey. + + + :param key: The key of this EntityKey. # noqa: E501 + :type: str + """ + if key is None: + raise ValueError("Invalid value for `key`, must not be `None`") # noqa: E501 + + self._key = key + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityKey, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityKey): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_relation.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_relation.py new file mode 100644 index 0000000..87fd9f3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_relation.py @@ -0,0 +1,220 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityRelation(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + '_from': 'EntityId', + 'to': 'EntityId', + 'type': 'str', + 'type_group': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + '_from': 'from', + 'to': 'to', + 'type': 'type', + 'type_group': 'typeGroup' + } + + def __init__(self, additional_info=None, _from=None, to=None, type=None, type_group=None): # noqa: E501 + """EntityRelation - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self.__from = None + self._to = None + self._type = None + self._type_group = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if _from is not None: + self._from = _from + if to is not None: + self.to = to + if type is not None: + self.type = type + if type_group is not None: + self.type_group = type_group + + @property + def additional_info(self): + """Gets the additional_info of this EntityRelation. # noqa: E501 + + + :return: The additional_info of this EntityRelation. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this EntityRelation. + + + :param additional_info: The additional_info of this EntityRelation. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def _from(self): + """Gets the _from of this EntityRelation. # noqa: E501 + + + :return: The _from of this EntityRelation. # noqa: E501 + :rtype: EntityId + """ + return self.__from + + @_from.setter + def _from(self, _from): + """Sets the _from of this EntityRelation. + + + :param _from: The _from of this EntityRelation. # noqa: E501 + :type: EntityId + """ + + self.__from = _from + + @property + def to(self): + """Gets the to of this EntityRelation. # noqa: E501 + + + :return: The to of this EntityRelation. # noqa: E501 + :rtype: EntityId + """ + return self._to + + @to.setter + def to(self, to): + """Sets the to of this EntityRelation. + + + :param to: The to of this EntityRelation. # noqa: E501 + :type: EntityId + """ + + self._to = to + + @property + def type(self): + """Gets the type of this EntityRelation. # noqa: E501 + + + :return: The type of this EntityRelation. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntityRelation. + + + :param type: The type of this EntityRelation. # noqa: E501 + :type: str + """ + + self._type = type + + @property + def type_group(self): + """Gets the type_group of this EntityRelation. # noqa: E501 + + + :return: The type_group of this EntityRelation. # noqa: E501 + :rtype: str + """ + return self._type_group + + @type_group.setter + def type_group(self, type_group): + """Sets the type_group of this EntityRelation. + + + :param type_group: The type_group of this EntityRelation. # noqa: E501 + :type: str + """ + allowed_values = ["COMMON", "ALARM", "DASHBOARD", "RULE_CHAIN", "RULE_NODE", "EDGE", "EDGE_AUTO_ASSIGN_RULE_CHAIN"] # noqa: E501 + if type_group not in allowed_values: + raise ValueError( + "Invalid value for `type_group` ({0}), must be one of {1}" # noqa: E501 + .format(type_group, allowed_values) + ) + + self._type_group = type_group + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityRelation, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityRelation): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_relation_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_relation_info.py new file mode 100644 index 0000000..ad9a8e8 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_relation_info.py @@ -0,0 +1,272 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityRelationInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + '_from': 'EntityId', + 'from_name': 'str', + 'to': 'EntityId', + 'to_name': 'str', + 'type': 'str', + 'type_group': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + '_from': 'from', + 'from_name': 'fromName', + 'to': 'to', + 'to_name': 'toName', + 'type': 'type', + 'type_group': 'typeGroup' + } + + def __init__(self, additional_info=None, _from=None, from_name=None, to=None, to_name=None, type=None, type_group=None): # noqa: E501 + """EntityRelationInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self.__from = None + self._from_name = None + self._to = None + self._to_name = None + self._type = None + self._type_group = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if _from is not None: + self._from = _from + if from_name is not None: + self.from_name = from_name + if to is not None: + self.to = to + if to_name is not None: + self.to_name = to_name + if type is not None: + self.type = type + if type_group is not None: + self.type_group = type_group + + @property + def additional_info(self): + """Gets the additional_info of this EntityRelationInfo. # noqa: E501 + + + :return: The additional_info of this EntityRelationInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this EntityRelationInfo. + + + :param additional_info: The additional_info of this EntityRelationInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def _from(self): + """Gets the _from of this EntityRelationInfo. # noqa: E501 + + + :return: The _from of this EntityRelationInfo. # noqa: E501 + :rtype: EntityId + """ + return self.__from + + @_from.setter + def _from(self, _from): + """Sets the _from of this EntityRelationInfo. + + + :param _from: The _from of this EntityRelationInfo. # noqa: E501 + :type: EntityId + """ + + self.__from = _from + + @property + def from_name(self): + """Gets the from_name of this EntityRelationInfo. # noqa: E501 + + + :return: The from_name of this EntityRelationInfo. # noqa: E501 + :rtype: str + """ + return self._from_name + + @from_name.setter + def from_name(self, from_name): + """Sets the from_name of this EntityRelationInfo. + + + :param from_name: The from_name of this EntityRelationInfo. # noqa: E501 + :type: str + """ + + self._from_name = from_name + + @property + def to(self): + """Gets the to of this EntityRelationInfo. # noqa: E501 + + + :return: The to of this EntityRelationInfo. # noqa: E501 + :rtype: EntityId + """ + return self._to + + @to.setter + def to(self, to): + """Sets the to of this EntityRelationInfo. + + + :param to: The to of this EntityRelationInfo. # noqa: E501 + :type: EntityId + """ + + self._to = to + + @property + def to_name(self): + """Gets the to_name of this EntityRelationInfo. # noqa: E501 + + + :return: The to_name of this EntityRelationInfo. # noqa: E501 + :rtype: str + """ + return self._to_name + + @to_name.setter + def to_name(self, to_name): + """Sets the to_name of this EntityRelationInfo. + + + :param to_name: The to_name of this EntityRelationInfo. # noqa: E501 + :type: str + """ + + self._to_name = to_name + + @property + def type(self): + """Gets the type of this EntityRelationInfo. # noqa: E501 + + + :return: The type of this EntityRelationInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntityRelationInfo. + + + :param type: The type of this EntityRelationInfo. # noqa: E501 + :type: str + """ + + self._type = type + + @property + def type_group(self): + """Gets the type_group of this EntityRelationInfo. # noqa: E501 + + + :return: The type_group of this EntityRelationInfo. # noqa: E501 + :rtype: str + """ + return self._type_group + + @type_group.setter + def type_group(self, type_group): + """Sets the type_group of this EntityRelationInfo. + + + :param type_group: The type_group of this EntityRelationInfo. # noqa: E501 + :type: str + """ + allowed_values = ["COMMON", "ALARM", "DASHBOARD", "RULE_CHAIN", "RULE_NODE", "EDGE", "EDGE_AUTO_ASSIGN_RULE_CHAIN"] # noqa: E501 + if type_group not in allowed_values: + raise ValueError( + "Invalid value for `type_group` ({0}), must be one of {1}" # noqa: E501 + .format(type_group, allowed_values) + ) + + self._type_group = type_group + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityRelationInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityRelationInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_relations_query.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_relations_query.py new file mode 100644 index 0000000..162a260 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_relations_query.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityRelationsQuery(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'filters': 'list[RelationEntityTypeFilter]', + 'parameters': 'RelationsSearchParameters' + } + + attribute_map = { + 'filters': 'filters', + 'parameters': 'parameters' + } + + def __init__(self, filters=None, parameters=None): # noqa: E501 + """EntityRelationsQuery - a model defined in Swagger""" # noqa: E501 + self._filters = None + self._parameters = None + self.discriminator = None + if filters is not None: + self.filters = filters + if parameters is not None: + self.parameters = parameters + + @property + def filters(self): + """Gets the filters of this EntityRelationsQuery. # noqa: E501 + + + :return: The filters of this EntityRelationsQuery. # noqa: E501 + :rtype: list[RelationEntityTypeFilter] + """ + return self._filters + + @filters.setter + def filters(self, filters): + """Sets the filters of this EntityRelationsQuery. + + + :param filters: The filters of this EntityRelationsQuery. # noqa: E501 + :type: list[RelationEntityTypeFilter] + """ + + self._filters = filters + + @property + def parameters(self): + """Gets the parameters of this EntityRelationsQuery. # noqa: E501 + + + :return: The parameters of this EntityRelationsQuery. # noqa: E501 + :rtype: RelationsSearchParameters + """ + return self._parameters + + @parameters.setter + def parameters(self, parameters): + """Sets the parameters of this EntityRelationsQuery. + + + :param parameters: The parameters of this EntityRelationsQuery. # noqa: E501 + :type: RelationsSearchParameters + """ + + self._parameters = parameters + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityRelationsQuery, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityRelationsQuery): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_subtype.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_subtype.py new file mode 100644 index 0000000..cb64e54 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_subtype.py @@ -0,0 +1,168 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntitySubtype(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_type': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'entity_type': 'entityType', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, entity_type=None, tenant_id=None, type=None): # noqa: E501 + """EntitySubtype - a model defined in Swagger""" # noqa: E501 + self._entity_type = None + self._tenant_id = None + self._type = None + self.discriminator = None + if entity_type is not None: + self.entity_type = entity_type + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def entity_type(self): + """Gets the entity_type of this EntitySubtype. # noqa: E501 + + + :return: The entity_type of this EntitySubtype. # noqa: E501 + :rtype: str + """ + return self._entity_type + + @entity_type.setter + def entity_type(self, entity_type): + """Sets the entity_type of this EntitySubtype. + + + :param entity_type: The entity_type of this EntitySubtype. # noqa: E501 + :type: str + """ + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "RULE_CHAIN", "RULE_NODE", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if entity_type not in allowed_values: + raise ValueError( + "Invalid value for `entity_type` ({0}), must be one of {1}" # noqa: E501 + .format(entity_type, allowed_values) + ) + + self._entity_type = entity_type + + @property + def tenant_id(self): + """Gets the tenant_id of this EntitySubtype. # noqa: E501 + + + :return: The tenant_id of this EntitySubtype. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this EntitySubtype. + + + :param tenant_id: The tenant_id of this EntitySubtype. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this EntitySubtype. # noqa: E501 + + + :return: The type of this EntitySubtype. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntitySubtype. + + + :param type: The type of this EntitySubtype. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntitySubtype, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntitySubtype): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view.py new file mode 100644 index 0000000..193400d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view.py @@ -0,0 +1,370 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityView(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'end_time_ms': 'int', + 'entity_id': 'EntityId', + 'id': 'EntityViewId', + 'keys': 'TelemetryEntityView', + 'name': 'str', + 'start_time_ms': 'int', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'end_time_ms': 'endTimeMs', + 'entity_id': 'entityId', + 'id': 'id', + 'keys': 'keys', + 'name': 'name', + 'start_time_ms': 'startTimeMs', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, created_time=None, customer_id=None, end_time_ms=None, entity_id=None, id=None, keys=None, name=None, start_time_ms=None, tenant_id=None, type=None): # noqa: E501 + """EntityView - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._customer_id = None + self._end_time_ms = None + self._entity_id = None + self._id = None + self._keys = None + self._name = None + self._start_time_ms = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if end_time_ms is not None: + self.end_time_ms = end_time_ms + if entity_id is not None: + self.entity_id = entity_id + if id is not None: + self.id = id + if keys is not None: + self.keys = keys + if name is not None: + self.name = name + if start_time_ms is not None: + self.start_time_ms = start_time_ms + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this EntityView. # noqa: E501 + + + :return: The additional_info of this EntityView. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this EntityView. + + + :param additional_info: The additional_info of this EntityView. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this EntityView. # noqa: E501 + + + :return: The created_time of this EntityView. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this EntityView. + + + :param created_time: The created_time of this EntityView. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this EntityView. # noqa: E501 + + + :return: The customer_id of this EntityView. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this EntityView. + + + :param customer_id: The customer_id of this EntityView. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def end_time_ms(self): + """Gets the end_time_ms of this EntityView. # noqa: E501 + + + :return: The end_time_ms of this EntityView. # noqa: E501 + :rtype: int + """ + return self._end_time_ms + + @end_time_ms.setter + def end_time_ms(self, end_time_ms): + """Sets the end_time_ms of this EntityView. + + + :param end_time_ms: The end_time_ms of this EntityView. # noqa: E501 + :type: int + """ + + self._end_time_ms = end_time_ms + + @property + def entity_id(self): + """Gets the entity_id of this EntityView. # noqa: E501 + + + :return: The entity_id of this EntityView. # noqa: E501 + :rtype: EntityId + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this EntityView. + + + :param entity_id: The entity_id of this EntityView. # noqa: E501 + :type: EntityId + """ + + self._entity_id = entity_id + + @property + def id(self): + """Gets the id of this EntityView. # noqa: E501 + + + :return: The id of this EntityView. # noqa: E501 + :rtype: EntityViewId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EntityView. + + + :param id: The id of this EntityView. # noqa: E501 + :type: EntityViewId + """ + + self._id = id + + @property + def keys(self): + """Gets the keys of this EntityView. # noqa: E501 + + + :return: The keys of this EntityView. # noqa: E501 + :rtype: TelemetryEntityView + """ + return self._keys + + @keys.setter + def keys(self, keys): + """Sets the keys of this EntityView. + + + :param keys: The keys of this EntityView. # noqa: E501 + :type: TelemetryEntityView + """ + + self._keys = keys + + @property + def name(self): + """Gets the name of this EntityView. # noqa: E501 + + + :return: The name of this EntityView. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this EntityView. + + + :param name: The name of this EntityView. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def start_time_ms(self): + """Gets the start_time_ms of this EntityView. # noqa: E501 + + + :return: The start_time_ms of this EntityView. # noqa: E501 + :rtype: int + """ + return self._start_time_ms + + @start_time_ms.setter + def start_time_ms(self, start_time_ms): + """Sets the start_time_ms of this EntityView. + + + :param start_time_ms: The start_time_ms of this EntityView. # noqa: E501 + :type: int + """ + + self._start_time_ms = start_time_ms + + @property + def tenant_id(self): + """Gets the tenant_id of this EntityView. # noqa: E501 + + + :return: The tenant_id of this EntityView. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this EntityView. + + + :param tenant_id: The tenant_id of this EntityView. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this EntityView. # noqa: E501 + + + :return: The type of this EntityView. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntityView. + + + :param type: The type of this EntityView. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityView, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityView): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view_id.py new file mode 100644 index 0000000..a27f6ad --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view_id.py @@ -0,0 +1,142 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityViewId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_type': 'str', + 'id': 'str' + } + + attribute_map = { + 'entity_type': 'entityType', + 'id': 'id' + } + + def __init__(self, entity_type=None, id=None): # noqa: E501 + """EntityViewId - a model defined in Swagger""" # noqa: E501 + self._entity_type = None + self._id = None + self.discriminator = None + if entity_type is not None: + self.entity_type = entity_type + if id is not None: + self.id = id + + @property + def entity_type(self): + """Gets the entity_type of this EntityViewId. # noqa: E501 + + + :return: The entity_type of this EntityViewId. # noqa: E501 + :rtype: str + """ + return self._entity_type + + @entity_type.setter + def entity_type(self, entity_type): + """Sets the entity_type of this EntityViewId. + + + :param entity_type: The entity_type of this EntityViewId. # noqa: E501 + :type: str + """ + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "RULE_CHAIN", "RULE_NODE", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if entity_type not in allowed_values: + raise ValueError( + "Invalid value for `entity_type` ({0}), must be one of {1}" # noqa: E501 + .format(entity_type, allowed_values) + ) + + self._entity_type = entity_type + + @property + def id(self): + """Gets the id of this EntityViewId. # noqa: E501 + + + :return: The id of this EntityViewId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EntityViewId. + + + :param id: The id of this EntityViewId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityViewId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityViewId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view_info.py new file mode 100644 index 0000000..2c4af50 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view_info.py @@ -0,0 +1,422 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityViewInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'customer_is_public': 'bool', + 'customer_title': 'str', + 'end_time_ms': 'int', + 'entity_id': 'EntityId', + 'id': 'EntityViewId', + 'keys': 'TelemetryEntityView', + 'name': 'str', + 'start_time_ms': 'int', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'customer_is_public': 'customerIsPublic', + 'customer_title': 'customerTitle', + 'end_time_ms': 'endTimeMs', + 'entity_id': 'entityId', + 'id': 'id', + 'keys': 'keys', + 'name': 'name', + 'start_time_ms': 'startTimeMs', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, created_time=None, customer_id=None, customer_is_public=None, customer_title=None, end_time_ms=None, entity_id=None, id=None, keys=None, name=None, start_time_ms=None, tenant_id=None, type=None): # noqa: E501 + """EntityViewInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._customer_id = None + self._customer_is_public = None + self._customer_title = None + self._end_time_ms = None + self._entity_id = None + self._id = None + self._keys = None + self._name = None + self._start_time_ms = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if customer_is_public is not None: + self.customer_is_public = customer_is_public + if customer_title is not None: + self.customer_title = customer_title + if end_time_ms is not None: + self.end_time_ms = end_time_ms + if entity_id is not None: + self.entity_id = entity_id + if id is not None: + self.id = id + if keys is not None: + self.keys = keys + if name is not None: + self.name = name + if start_time_ms is not None: + self.start_time_ms = start_time_ms + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this EntityViewInfo. # noqa: E501 + + + :return: The additional_info of this EntityViewInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this EntityViewInfo. + + + :param additional_info: The additional_info of this EntityViewInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this EntityViewInfo. # noqa: E501 + + + :return: The created_time of this EntityViewInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this EntityViewInfo. + + + :param created_time: The created_time of this EntityViewInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this EntityViewInfo. # noqa: E501 + + + :return: The customer_id of this EntityViewInfo. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this EntityViewInfo. + + + :param customer_id: The customer_id of this EntityViewInfo. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def customer_is_public(self): + """Gets the customer_is_public of this EntityViewInfo. # noqa: E501 + + + :return: The customer_is_public of this EntityViewInfo. # noqa: E501 + :rtype: bool + """ + return self._customer_is_public + + @customer_is_public.setter + def customer_is_public(self, customer_is_public): + """Sets the customer_is_public of this EntityViewInfo. + + + :param customer_is_public: The customer_is_public of this EntityViewInfo. # noqa: E501 + :type: bool + """ + + self._customer_is_public = customer_is_public + + @property + def customer_title(self): + """Gets the customer_title of this EntityViewInfo. # noqa: E501 + + + :return: The customer_title of this EntityViewInfo. # noqa: E501 + :rtype: str + """ + return self._customer_title + + @customer_title.setter + def customer_title(self, customer_title): + """Sets the customer_title of this EntityViewInfo. + + + :param customer_title: The customer_title of this EntityViewInfo. # noqa: E501 + :type: str + """ + + self._customer_title = customer_title + + @property + def end_time_ms(self): + """Gets the end_time_ms of this EntityViewInfo. # noqa: E501 + + + :return: The end_time_ms of this EntityViewInfo. # noqa: E501 + :rtype: int + """ + return self._end_time_ms + + @end_time_ms.setter + def end_time_ms(self, end_time_ms): + """Sets the end_time_ms of this EntityViewInfo. + + + :param end_time_ms: The end_time_ms of this EntityViewInfo. # noqa: E501 + :type: int + """ + + self._end_time_ms = end_time_ms + + @property + def entity_id(self): + """Gets the entity_id of this EntityViewInfo. # noqa: E501 + + + :return: The entity_id of this EntityViewInfo. # noqa: E501 + :rtype: EntityId + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this EntityViewInfo. + + + :param entity_id: The entity_id of this EntityViewInfo. # noqa: E501 + :type: EntityId + """ + + self._entity_id = entity_id + + @property + def id(self): + """Gets the id of this EntityViewInfo. # noqa: E501 + + + :return: The id of this EntityViewInfo. # noqa: E501 + :rtype: EntityViewId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EntityViewInfo. + + + :param id: The id of this EntityViewInfo. # noqa: E501 + :type: EntityViewId + """ + + self._id = id + + @property + def keys(self): + """Gets the keys of this EntityViewInfo. # noqa: E501 + + + :return: The keys of this EntityViewInfo. # noqa: E501 + :rtype: TelemetryEntityView + """ + return self._keys + + @keys.setter + def keys(self, keys): + """Sets the keys of this EntityViewInfo. + + + :param keys: The keys of this EntityViewInfo. # noqa: E501 + :type: TelemetryEntityView + """ + + self._keys = keys + + @property + def name(self): + """Gets the name of this EntityViewInfo. # noqa: E501 + + + :return: The name of this EntityViewInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this EntityViewInfo. + + + :param name: The name of this EntityViewInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def start_time_ms(self): + """Gets the start_time_ms of this EntityViewInfo. # noqa: E501 + + + :return: The start_time_ms of this EntityViewInfo. # noqa: E501 + :rtype: int + """ + return self._start_time_ms + + @start_time_ms.setter + def start_time_ms(self, start_time_ms): + """Sets the start_time_ms of this EntityViewInfo. + + + :param start_time_ms: The start_time_ms of this EntityViewInfo. # noqa: E501 + :type: int + """ + + self._start_time_ms = start_time_ms + + @property + def tenant_id(self): + """Gets the tenant_id of this EntityViewInfo. # noqa: E501 + + + :return: The tenant_id of this EntityViewInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this EntityViewInfo. + + + :param tenant_id: The tenant_id of this EntityViewInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this EntityViewInfo. # noqa: E501 + + + :return: The type of this EntityViewInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntityViewInfo. + + + :param type: The type of this EntityViewInfo. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityViewInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityViewInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view_search_query.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view_search_query.py new file mode 100644 index 0000000..3c89fb7 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/entity_view_search_query.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityViewSearchQuery(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_view_types': 'list[str]', + 'parameters': 'RelationsSearchParameters', + 'relation_type': 'str' + } + + attribute_map = { + 'entity_view_types': 'entityViewTypes', + 'parameters': 'parameters', + 'relation_type': 'relationType' + } + + def __init__(self, entity_view_types=None, parameters=None, relation_type=None): # noqa: E501 + """EntityViewSearchQuery - a model defined in Swagger""" # noqa: E501 + self._entity_view_types = None + self._parameters = None + self._relation_type = None + self.discriminator = None + if entity_view_types is not None: + self.entity_view_types = entity_view_types + if parameters is not None: + self.parameters = parameters + if relation_type is not None: + self.relation_type = relation_type + + @property + def entity_view_types(self): + """Gets the entity_view_types of this EntityViewSearchQuery. # noqa: E501 + + + :return: The entity_view_types of this EntityViewSearchQuery. # noqa: E501 + :rtype: list[str] + """ + return self._entity_view_types + + @entity_view_types.setter + def entity_view_types(self, entity_view_types): + """Sets the entity_view_types of this EntityViewSearchQuery. + + + :param entity_view_types: The entity_view_types of this EntityViewSearchQuery. # noqa: E501 + :type: list[str] + """ + + self._entity_view_types = entity_view_types + + @property + def parameters(self): + """Gets the parameters of this EntityViewSearchQuery. # noqa: E501 + + + :return: The parameters of this EntityViewSearchQuery. # noqa: E501 + :rtype: RelationsSearchParameters + """ + return self._parameters + + @parameters.setter + def parameters(self, parameters): + """Sets the parameters of this EntityViewSearchQuery. + + + :param parameters: The parameters of this EntityViewSearchQuery. # noqa: E501 + :type: RelationsSearchParameters + """ + + self._parameters = parameters + + @property + def relation_type(self): + """Gets the relation_type of this EntityViewSearchQuery. # noqa: E501 + + + :return: The relation_type of this EntityViewSearchQuery. # noqa: E501 + :rtype: str + """ + return self._relation_type + + @relation_type.setter + def relation_type(self, relation_type): + """Sets the relation_type of this EntityViewSearchQuery. + + + :param relation_type: The relation_type of this EntityViewSearchQuery. # noqa: E501 + :type: str + """ + + self._relation_type = relation_type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityViewSearchQuery, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityViewSearchQuery): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/event.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/event.py new file mode 100644 index 0000000..9dbd924 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/event.py @@ -0,0 +1,266 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Event(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'body': 'str', + 'created_time': 'int', + 'entity_id': 'EntityId', + 'id': 'EventId', + 'tenant_id': 'TenantId', + 'type': 'str', + 'uid': 'str' + } + + attribute_map = { + 'body': 'body', + 'created_time': 'createdTime', + 'entity_id': 'entityId', + 'id': 'id', + 'tenant_id': 'tenantId', + 'type': 'type', + 'uid': 'uid' + } + + def __init__(self, body=None, created_time=None, entity_id=None, id=None, tenant_id=None, type=None, uid=None): # noqa: E501 + """Event - a model defined in Swagger""" # noqa: E501 + self._body = None + self._created_time = None + self._entity_id = None + self._id = None + self._tenant_id = None + self._type = None + self._uid = None + self.discriminator = None + if body is not None: + self.body = body + if created_time is not None: + self.created_time = created_time + if entity_id is not None: + self.entity_id = entity_id + if id is not None: + self.id = id + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + if uid is not None: + self.uid = uid + + @property + def body(self): + """Gets the body of this Event. # noqa: E501 + + + :return: The body of this Event. # noqa: E501 + :rtype: str + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this Event. + + + :param body: The body of this Event. # noqa: E501 + :type: str + """ + + self._body = body + + @property + def created_time(self): + """Gets the created_time of this Event. # noqa: E501 + + + :return: The created_time of this Event. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Event. + + + :param created_time: The created_time of this Event. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def entity_id(self): + """Gets the entity_id of this Event. # noqa: E501 + + + :return: The entity_id of this Event. # noqa: E501 + :rtype: EntityId + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this Event. + + + :param entity_id: The entity_id of this Event. # noqa: E501 + :type: EntityId + """ + + self._entity_id = entity_id + + @property + def id(self): + """Gets the id of this Event. # noqa: E501 + + + :return: The id of this Event. # noqa: E501 + :rtype: EventId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Event. + + + :param id: The id of this Event. # noqa: E501 + :type: EventId + """ + + self._id = id + + @property + def tenant_id(self): + """Gets the tenant_id of this Event. # noqa: E501 + + + :return: The tenant_id of this Event. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Event. + + + :param tenant_id: The tenant_id of this Event. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this Event. # noqa: E501 + + + :return: The type of this Event. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Event. + + + :param type: The type of this Event. # noqa: E501 + :type: str + """ + + self._type = type + + @property + def uid(self): + """Gets the uid of this Event. # noqa: E501 + + + :return: The uid of this Event. # noqa: E501 + :rtype: str + """ + return self._uid + + @uid.setter + def uid(self, uid): + """Sets the uid of this Event. + + + :param uid: The uid of this Event. # noqa: E501 + :type: str + """ + + self._uid = uid + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Event, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Event): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/event_filter.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/event_filter.py new file mode 100644 index 0000000..cd8518b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/event_filter.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EventFilter(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """EventFilter - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EventFilter, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EventFilter): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/event_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/event_id.py new file mode 100644 index 0000000..3c89a2b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/event_id.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EventId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'str' + } + + attribute_map = { + 'id': 'id' + } + + def __init__(self, id=None): # noqa: E501 + """EventId - a model defined in Swagger""" # noqa: E501 + self._id = None + self.discriminator = None + if id is not None: + self.id = id + + @property + def id(self): + """Gets the id of this EventId. # noqa: E501 + + + :return: The id of this EventId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EventId. + + + :param id: The id of this EventId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EventId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EventId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/file.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/file.py new file mode 100644 index 0000000..54e5a63 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/file.py @@ -0,0 +1,474 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class File(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'absolute': 'bool', + 'absolute_file': 'file', + 'absolute_path': 'str', + 'canonical_file': 'file', + 'canonical_path': 'str', + 'directory': 'bool', + 'file': 'bool', + 'free_space': 'int', + 'hidden': 'bool', + 'name': 'str', + 'parent': 'str', + 'parent_file': 'file', + 'path': 'str', + 'total_space': 'int', + 'usable_space': 'int' + } + + attribute_map = { + 'absolute': 'absolute', + 'absolute_file': 'absoluteFile', + 'absolute_path': 'absolutePath', + 'canonical_file': 'canonicalFile', + 'canonical_path': 'canonicalPath', + 'directory': 'directory', + 'file': 'file', + 'free_space': 'freeSpace', + 'hidden': 'hidden', + 'name': 'name', + 'parent': 'parent', + 'parent_file': 'parentFile', + 'path': 'path', + 'total_space': 'totalSpace', + 'usable_space': 'usableSpace' + } + + def __init__(self, absolute=None, absolute_file=None, absolute_path=None, canonical_file=None, canonical_path=None, directory=None, file=None, free_space=None, hidden=None, name=None, parent=None, parent_file=None, path=None, total_space=None, usable_space=None): # noqa: E501 + """File - a model defined in Swagger""" # noqa: E501 + self._absolute = None + self._absolute_file = None + self._absolute_path = None + self._canonical_file = None + self._canonical_path = None + self._directory = None + self._file = None + self._free_space = None + self._hidden = None + self._name = None + self._parent = None + self._parent_file = None + self._path = None + self._total_space = None + self._usable_space = None + self.discriminator = None + if absolute is not None: + self.absolute = absolute + if absolute_file is not None: + self.absolute_file = absolute_file + if absolute_path is not None: + self.absolute_path = absolute_path + if canonical_file is not None: + self.canonical_file = canonical_file + if canonical_path is not None: + self.canonical_path = canonical_path + if directory is not None: + self.directory = directory + if file is not None: + self.file = file + if free_space is not None: + self.free_space = free_space + if hidden is not None: + self.hidden = hidden + if name is not None: + self.name = name + if parent is not None: + self.parent = parent + if parent_file is not None: + self.parent_file = parent_file + if path is not None: + self.path = path + if total_space is not None: + self.total_space = total_space + if usable_space is not None: + self.usable_space = usable_space + + @property + def absolute(self): + """Gets the absolute of this File. # noqa: E501 + + + :return: The absolute of this File. # noqa: E501 + :rtype: bool + """ + return self._absolute + + @absolute.setter + def absolute(self, absolute): + """Sets the absolute of this File. + + + :param absolute: The absolute of this File. # noqa: E501 + :type: bool + """ + + self._absolute = absolute + + @property + def absolute_file(self): + """Gets the absolute_file of this File. # noqa: E501 + + + :return: The absolute_file of this File. # noqa: E501 + :rtype: file + """ + return self._absolute_file + + @absolute_file.setter + def absolute_file(self, absolute_file): + """Sets the absolute_file of this File. + + + :param absolute_file: The absolute_file of this File. # noqa: E501 + :type: file + """ + + self._absolute_file = absolute_file + + @property + def absolute_path(self): + """Gets the absolute_path of this File. # noqa: E501 + + + :return: The absolute_path of this File. # noqa: E501 + :rtype: str + """ + return self._absolute_path + + @absolute_path.setter + def absolute_path(self, absolute_path): + """Sets the absolute_path of this File. + + + :param absolute_path: The absolute_path of this File. # noqa: E501 + :type: str + """ + + self._absolute_path = absolute_path + + @property + def canonical_file(self): + """Gets the canonical_file of this File. # noqa: E501 + + + :return: The canonical_file of this File. # noqa: E501 + :rtype: file + """ + return self._canonical_file + + @canonical_file.setter + def canonical_file(self, canonical_file): + """Sets the canonical_file of this File. + + + :param canonical_file: The canonical_file of this File. # noqa: E501 + :type: file + """ + + self._canonical_file = canonical_file + + @property + def canonical_path(self): + """Gets the canonical_path of this File. # noqa: E501 + + + :return: The canonical_path of this File. # noqa: E501 + :rtype: str + """ + return self._canonical_path + + @canonical_path.setter + def canonical_path(self, canonical_path): + """Sets the canonical_path of this File. + + + :param canonical_path: The canonical_path of this File. # noqa: E501 + :type: str + """ + + self._canonical_path = canonical_path + + @property + def directory(self): + """Gets the directory of this File. # noqa: E501 + + + :return: The directory of this File. # noqa: E501 + :rtype: bool + """ + return self._directory + + @directory.setter + def directory(self, directory): + """Sets the directory of this File. + + + :param directory: The directory of this File. # noqa: E501 + :type: bool + """ + + self._directory = directory + + @property + def file(self): + """Gets the file of this File. # noqa: E501 + + + :return: The file of this File. # noqa: E501 + :rtype: bool + """ + return self._file + + @file.setter + def file(self, file): + """Sets the file of this File. + + + :param file: The file of this File. # noqa: E501 + :type: bool + """ + + self._file = file + + @property + def free_space(self): + """Gets the free_space of this File. # noqa: E501 + + + :return: The free_space of this File. # noqa: E501 + :rtype: int + """ + return self._free_space + + @free_space.setter + def free_space(self, free_space): + """Sets the free_space of this File. + + + :param free_space: The free_space of this File. # noqa: E501 + :type: int + """ + + self._free_space = free_space + + @property + def hidden(self): + """Gets the hidden of this File. # noqa: E501 + + + :return: The hidden of this File. # noqa: E501 + :rtype: bool + """ + return self._hidden + + @hidden.setter + def hidden(self, hidden): + """Sets the hidden of this File. + + + :param hidden: The hidden of this File. # noqa: E501 + :type: bool + """ + + self._hidden = hidden + + @property + def name(self): + """Gets the name of this File. # noqa: E501 + + + :return: The name of this File. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this File. + + + :param name: The name of this File. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def parent(self): + """Gets the parent of this File. # noqa: E501 + + + :return: The parent of this File. # noqa: E501 + :rtype: str + """ + return self._parent + + @parent.setter + def parent(self, parent): + """Sets the parent of this File. + + + :param parent: The parent of this File. # noqa: E501 + :type: str + """ + + self._parent = parent + + @property + def parent_file(self): + """Gets the parent_file of this File. # noqa: E501 + + + :return: The parent_file of this File. # noqa: E501 + :rtype: file + """ + return self._parent_file + + @parent_file.setter + def parent_file(self, parent_file): + """Sets the parent_file of this File. + + + :param parent_file: The parent_file of this File. # noqa: E501 + :type: file + """ + + self._parent_file = parent_file + + @property + def path(self): + """Gets the path of this File. # noqa: E501 + + + :return: The path of this File. # noqa: E501 + :rtype: str + """ + return self._path + + @path.setter + def path(self, path): + """Sets the path of this File. + + + :param path: The path of this File. # noqa: E501 + :type: str + """ + + self._path = path + + @property + def total_space(self): + """Gets the total_space of this File. # noqa: E501 + + + :return: The total_space of this File. # noqa: E501 + :rtype: int + """ + return self._total_space + + @total_space.setter + def total_space(self, total_space): + """Sets the total_space of this File. + + + :param total_space: The total_space of this File. # noqa: E501 + :type: int + """ + + self._total_space = total_space + + @property + def usable_space(self): + """Gets the usable_space of this File. # noqa: E501 + + + :return: The usable_space of this File. # noqa: E501 + :rtype: int + """ + return self._usable_space + + @usable_space.setter + def usable_space(self, usable_space): + """Sets the usable_space of this File. + + + :param usable_space: The usable_space of this File. # noqa: E501 + :type: int + """ + + self._usable_space = usable_space + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(File, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, File): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/home_dashboard.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/home_dashboard.py new file mode 100644 index 0000000..cb4d3d0 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/home_dashboard.py @@ -0,0 +1,370 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class HomeDashboard(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'assigned_customers': 'list[ShortCustomerInfo]', + 'configuration': 'str', + 'created_time': 'int', + 'hide_dashboard_toolbar': 'bool', + 'id': 'DashboardId', + 'image': 'str', + 'mobile_hide': 'bool', + 'mobile_order': 'int', + 'name': 'str', + 'tenant_id': 'TenantId', + 'title': 'str' + } + + attribute_map = { + 'assigned_customers': 'assignedCustomers', + 'configuration': 'configuration', + 'created_time': 'createdTime', + 'hide_dashboard_toolbar': 'hideDashboardToolbar', + 'id': 'id', + 'image': 'image', + 'mobile_hide': 'mobileHide', + 'mobile_order': 'mobileOrder', + 'name': 'name', + 'tenant_id': 'tenantId', + 'title': 'title' + } + + def __init__(self, assigned_customers=None, configuration=None, created_time=None, hide_dashboard_toolbar=None, id=None, image=None, mobile_hide=None, mobile_order=None, name=None, tenant_id=None, title=None): # noqa: E501 + """HomeDashboard - a model defined in Swagger""" # noqa: E501 + self._assigned_customers = None + self._configuration = None + self._created_time = None + self._hide_dashboard_toolbar = None + self._id = None + self._image = None + self._mobile_hide = None + self._mobile_order = None + self._name = None + self._tenant_id = None + self._title = None + self.discriminator = None + if assigned_customers is not None: + self.assigned_customers = assigned_customers + if configuration is not None: + self.configuration = configuration + if created_time is not None: + self.created_time = created_time + if hide_dashboard_toolbar is not None: + self.hide_dashboard_toolbar = hide_dashboard_toolbar + if id is not None: + self.id = id + if image is not None: + self.image = image + if mobile_hide is not None: + self.mobile_hide = mobile_hide + if mobile_order is not None: + self.mobile_order = mobile_order + if name is not None: + self.name = name + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + + @property + def assigned_customers(self): + """Gets the assigned_customers of this HomeDashboard. # noqa: E501 + + + :return: The assigned_customers of this HomeDashboard. # noqa: E501 + :rtype: list[ShortCustomerInfo] + """ + return self._assigned_customers + + @assigned_customers.setter + def assigned_customers(self, assigned_customers): + """Sets the assigned_customers of this HomeDashboard. + + + :param assigned_customers: The assigned_customers of this HomeDashboard. # noqa: E501 + :type: list[ShortCustomerInfo] + """ + + self._assigned_customers = assigned_customers + + @property + def configuration(self): + """Gets the configuration of this HomeDashboard. # noqa: E501 + + + :return: The configuration of this HomeDashboard. # noqa: E501 + :rtype: str + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this HomeDashboard. + + + :param configuration: The configuration of this HomeDashboard. # noqa: E501 + :type: str + """ + + self._configuration = configuration + + @property + def created_time(self): + """Gets the created_time of this HomeDashboard. # noqa: E501 + + + :return: The created_time of this HomeDashboard. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this HomeDashboard. + + + :param created_time: The created_time of this HomeDashboard. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def hide_dashboard_toolbar(self): + """Gets the hide_dashboard_toolbar of this HomeDashboard. # noqa: E501 + + + :return: The hide_dashboard_toolbar of this HomeDashboard. # noqa: E501 + :rtype: bool + """ + return self._hide_dashboard_toolbar + + @hide_dashboard_toolbar.setter + def hide_dashboard_toolbar(self, hide_dashboard_toolbar): + """Sets the hide_dashboard_toolbar of this HomeDashboard. + + + :param hide_dashboard_toolbar: The hide_dashboard_toolbar of this HomeDashboard. # noqa: E501 + :type: bool + """ + + self._hide_dashboard_toolbar = hide_dashboard_toolbar + + @property + def id(self): + """Gets the id of this HomeDashboard. # noqa: E501 + + + :return: The id of this HomeDashboard. # noqa: E501 + :rtype: DashboardId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this HomeDashboard. + + + :param id: The id of this HomeDashboard. # noqa: E501 + :type: DashboardId + """ + + self._id = id + + @property + def image(self): + """Gets the image of this HomeDashboard. # noqa: E501 + + + :return: The image of this HomeDashboard. # noqa: E501 + :rtype: str + """ + return self._image + + @image.setter + def image(self, image): + """Sets the image of this HomeDashboard. + + + :param image: The image of this HomeDashboard. # noqa: E501 + :type: str + """ + + self._image = image + + @property + def mobile_hide(self): + """Gets the mobile_hide of this HomeDashboard. # noqa: E501 + + + :return: The mobile_hide of this HomeDashboard. # noqa: E501 + :rtype: bool + """ + return self._mobile_hide + + @mobile_hide.setter + def mobile_hide(self, mobile_hide): + """Sets the mobile_hide of this HomeDashboard. + + + :param mobile_hide: The mobile_hide of this HomeDashboard. # noqa: E501 + :type: bool + """ + + self._mobile_hide = mobile_hide + + @property + def mobile_order(self): + """Gets the mobile_order of this HomeDashboard. # noqa: E501 + + + :return: The mobile_order of this HomeDashboard. # noqa: E501 + :rtype: int + """ + return self._mobile_order + + @mobile_order.setter + def mobile_order(self, mobile_order): + """Sets the mobile_order of this HomeDashboard. + + + :param mobile_order: The mobile_order of this HomeDashboard. # noqa: E501 + :type: int + """ + + self._mobile_order = mobile_order + + @property + def name(self): + """Gets the name of this HomeDashboard. # noqa: E501 + + + :return: The name of this HomeDashboard. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this HomeDashboard. + + + :param name: The name of this HomeDashboard. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def tenant_id(self): + """Gets the tenant_id of this HomeDashboard. # noqa: E501 + + + :return: The tenant_id of this HomeDashboard. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this HomeDashboard. + + + :param tenant_id: The tenant_id of this HomeDashboard. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this HomeDashboard. # noqa: E501 + + + :return: The title of this HomeDashboard. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this HomeDashboard. + + + :param title: The title of this HomeDashboard. # noqa: E501 + :type: str + """ + + self._title = title + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(HomeDashboard, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, HomeDashboard): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/home_dashboard_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/home_dashboard_info.py new file mode 100644 index 0000000..38fe7c5 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/home_dashboard_info.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class HomeDashboardInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'dashboard_id': 'DashboardId', + 'hide_dashboard_toolbar': 'bool' + } + + attribute_map = { + 'dashboard_id': 'dashboardId', + 'hide_dashboard_toolbar': 'hideDashboardToolbar' + } + + def __init__(self, dashboard_id=None, hide_dashboard_toolbar=None): # noqa: E501 + """HomeDashboardInfo - a model defined in Swagger""" # noqa: E501 + self._dashboard_id = None + self._hide_dashboard_toolbar = None + self.discriminator = None + if dashboard_id is not None: + self.dashboard_id = dashboard_id + if hide_dashboard_toolbar is not None: + self.hide_dashboard_toolbar = hide_dashboard_toolbar + + @property + def dashboard_id(self): + """Gets the dashboard_id of this HomeDashboardInfo. # noqa: E501 + + + :return: The dashboard_id of this HomeDashboardInfo. # noqa: E501 + :rtype: DashboardId + """ + return self._dashboard_id + + @dashboard_id.setter + def dashboard_id(self, dashboard_id): + """Sets the dashboard_id of this HomeDashboardInfo. + + + :param dashboard_id: The dashboard_id of this HomeDashboardInfo. # noqa: E501 + :type: DashboardId + """ + + self._dashboard_id = dashboard_id + + @property + def hide_dashboard_toolbar(self): + """Gets the hide_dashboard_toolbar of this HomeDashboardInfo. # noqa: E501 + + + :return: The hide_dashboard_toolbar of this HomeDashboardInfo. # noqa: E501 + :rtype: bool + """ + return self._hide_dashboard_toolbar + + @hide_dashboard_toolbar.setter + def hide_dashboard_toolbar(self, hide_dashboard_toolbar): + """Sets the hide_dashboard_toolbar of this HomeDashboardInfo. + + + :param hide_dashboard_toolbar: The hide_dashboard_toolbar of this HomeDashboardInfo. # noqa: E501 + :type: bool + """ + + self._hide_dashboard_toolbar = hide_dashboard_toolbar + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(HomeDashboardInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, HomeDashboardInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/input_stream.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/input_stream.py new file mode 100644 index 0000000..1d2d78d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/input_stream.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class InputStream(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """InputStream - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(InputStream, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, InputStream): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/key_filter.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/key_filter.py new file mode 100644 index 0000000..059d344 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/key_filter.py @@ -0,0 +1,168 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class KeyFilter(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'key': 'EntityKey', + 'predicate': 'KeyFilterPredicate', + 'value_type': 'str' + } + + attribute_map = { + 'key': 'key', + 'predicate': 'predicate', + 'value_type': 'valueType' + } + + def __init__(self, key=None, predicate=None, value_type=None): # noqa: E501 + """KeyFilter - a model defined in Swagger""" # noqa: E501 + self._key = None + self._predicate = None + self._value_type = None + self.discriminator = None + if key is not None: + self.key = key + if predicate is not None: + self.predicate = predicate + if value_type is not None: + self.value_type = value_type + + @property + def key(self): + """Gets the key of this KeyFilter. # noqa: E501 + + + :return: The key of this KeyFilter. # noqa: E501 + :rtype: EntityKey + """ + return self._key + + @key.setter + def key(self, key): + """Sets the key of this KeyFilter. + + + :param key: The key of this KeyFilter. # noqa: E501 + :type: EntityKey + """ + + self._key = key + + @property + def predicate(self): + """Gets the predicate of this KeyFilter. # noqa: E501 + + + :return: The predicate of this KeyFilter. # noqa: E501 + :rtype: KeyFilterPredicate + """ + return self._predicate + + @predicate.setter + def predicate(self, predicate): + """Sets the predicate of this KeyFilter. + + + :param predicate: The predicate of this KeyFilter. # noqa: E501 + :type: KeyFilterPredicate + """ + + self._predicate = predicate + + @property + def value_type(self): + """Gets the value_type of this KeyFilter. # noqa: E501 + + + :return: The value_type of this KeyFilter. # noqa: E501 + :rtype: str + """ + return self._value_type + + @value_type.setter + def value_type(self, value_type): + """Sets the value_type of this KeyFilter. + + + :param value_type: The value_type of this KeyFilter. # noqa: E501 + :type: str + """ + allowed_values = ["STRING", "NUMERIC", "BOOLEAN", "DATE_TIME"] # noqa: E501 + if value_type not in allowed_values: + raise ValueError( + "Invalid value for `value_type` ({0}), must be one of {1}" # noqa: E501 + .format(value_type, allowed_values) + ) + + self._value_type = value_type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(KeyFilter, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, KeyFilter): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/key_filter_predicate.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/key_filter_predicate.py new file mode 100644 index 0000000..2fa7687 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/key_filter_predicate.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class KeyFilterPredicate(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """KeyFilterPredicate - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(KeyFilterPredicate, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, KeyFilterPredicate): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/lw_m2m_instance.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/lw_m2m_instance.py new file mode 100644 index 0000000..ae2551c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/lw_m2m_instance.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class LwM2mInstance(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'resources': 'list[LwM2mResourceObserve]' + } + + attribute_map = { + 'id': 'id', + 'resources': 'resources' + } + + def __init__(self, id=None, resources=None): # noqa: E501 + """LwM2mInstance - a model defined in Swagger""" # noqa: E501 + self._id = None + self._resources = None + self.discriminator = None + if id is not None: + self.id = id + if resources is not None: + self.resources = resources + + @property + def id(self): + """Gets the id of this LwM2mInstance. # noqa: E501 + + + :return: The id of this LwM2mInstance. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this LwM2mInstance. + + + :param id: The id of this LwM2mInstance. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def resources(self): + """Gets the resources of this LwM2mInstance. # noqa: E501 + + + :return: The resources of this LwM2mInstance. # noqa: E501 + :rtype: list[LwM2mResourceObserve] + """ + return self._resources + + @resources.setter + def resources(self, resources): + """Sets the resources of this LwM2mInstance. + + + :param resources: The resources of this LwM2mInstance. # noqa: E501 + :type: list[LwM2mResourceObserve] + """ + + self._resources = resources + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(LwM2mInstance, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, LwM2mInstance): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/lw_m2m_object.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/lw_m2m_object.py new file mode 100644 index 0000000..994830d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/lw_m2m_object.py @@ -0,0 +1,240 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class LwM2mObject(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'int', + 'instances': 'list[LwM2mInstance]', + 'key_id': 'str', + 'mandatory': 'bool', + 'multiple': 'bool', + 'name': 'str' + } + + attribute_map = { + 'id': 'id', + 'instances': 'instances', + 'key_id': 'keyId', + 'mandatory': 'mandatory', + 'multiple': 'multiple', + 'name': 'name' + } + + def __init__(self, id=None, instances=None, key_id=None, mandatory=None, multiple=None, name=None): # noqa: E501 + """LwM2mObject - a model defined in Swagger""" # noqa: E501 + self._id = None + self._instances = None + self._key_id = None + self._mandatory = None + self._multiple = None + self._name = None + self.discriminator = None + if id is not None: + self.id = id + if instances is not None: + self.instances = instances + if key_id is not None: + self.key_id = key_id + if mandatory is not None: + self.mandatory = mandatory + if multiple is not None: + self.multiple = multiple + if name is not None: + self.name = name + + @property + def id(self): + """Gets the id of this LwM2mObject. # noqa: E501 + + + :return: The id of this LwM2mObject. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this LwM2mObject. + + + :param id: The id of this LwM2mObject. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def instances(self): + """Gets the instances of this LwM2mObject. # noqa: E501 + + + :return: The instances of this LwM2mObject. # noqa: E501 + :rtype: list[LwM2mInstance] + """ + return self._instances + + @instances.setter + def instances(self, instances): + """Sets the instances of this LwM2mObject. + + + :param instances: The instances of this LwM2mObject. # noqa: E501 + :type: list[LwM2mInstance] + """ + + self._instances = instances + + @property + def key_id(self): + """Gets the key_id of this LwM2mObject. # noqa: E501 + + + :return: The key_id of this LwM2mObject. # noqa: E501 + :rtype: str + """ + return self._key_id + + @key_id.setter + def key_id(self, key_id): + """Sets the key_id of this LwM2mObject. + + + :param key_id: The key_id of this LwM2mObject. # noqa: E501 + :type: str + """ + + self._key_id = key_id + + @property + def mandatory(self): + """Gets the mandatory of this LwM2mObject. # noqa: E501 + + + :return: The mandatory of this LwM2mObject. # noqa: E501 + :rtype: bool + """ + return self._mandatory + + @mandatory.setter + def mandatory(self, mandatory): + """Sets the mandatory of this LwM2mObject. + + + :param mandatory: The mandatory of this LwM2mObject. # noqa: E501 + :type: bool + """ + + self._mandatory = mandatory + + @property + def multiple(self): + """Gets the multiple of this LwM2mObject. # noqa: E501 + + + :return: The multiple of this LwM2mObject. # noqa: E501 + :rtype: bool + """ + return self._multiple + + @multiple.setter + def multiple(self, multiple): + """Sets the multiple of this LwM2mObject. + + + :param multiple: The multiple of this LwM2mObject. # noqa: E501 + :type: bool + """ + + self._multiple = multiple + + @property + def name(self): + """Gets the name of this LwM2mObject. # noqa: E501 + + + :return: The name of this LwM2mObject. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this LwM2mObject. + + + :param name: The name of this LwM2mObject. # noqa: E501 + :type: str + """ + + self._name = name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(LwM2mObject, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, LwM2mObject): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/lw_m2m_resource_observe.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/lw_m2m_resource_observe.py new file mode 100644 index 0000000..0c6ff9b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/lw_m2m_resource_observe.py @@ -0,0 +1,240 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class LwM2mResourceObserve(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'attribute': 'bool', + 'id': 'int', + 'key_name': 'str', + 'name': 'str', + 'observe': 'bool', + 'telemetry': 'bool' + } + + attribute_map = { + 'attribute': 'attribute', + 'id': 'id', + 'key_name': 'keyName', + 'name': 'name', + 'observe': 'observe', + 'telemetry': 'telemetry' + } + + def __init__(self, attribute=None, id=None, key_name=None, name=None, observe=None, telemetry=None): # noqa: E501 + """LwM2mResourceObserve - a model defined in Swagger""" # noqa: E501 + self._attribute = None + self._id = None + self._key_name = None + self._name = None + self._observe = None + self._telemetry = None + self.discriminator = None + if attribute is not None: + self.attribute = attribute + if id is not None: + self.id = id + if key_name is not None: + self.key_name = key_name + if name is not None: + self.name = name + if observe is not None: + self.observe = observe + if telemetry is not None: + self.telemetry = telemetry + + @property + def attribute(self): + """Gets the attribute of this LwM2mResourceObserve. # noqa: E501 + + + :return: The attribute of this LwM2mResourceObserve. # noqa: E501 + :rtype: bool + """ + return self._attribute + + @attribute.setter + def attribute(self, attribute): + """Sets the attribute of this LwM2mResourceObserve. + + + :param attribute: The attribute of this LwM2mResourceObserve. # noqa: E501 + :type: bool + """ + + self._attribute = attribute + + @property + def id(self): + """Gets the id of this LwM2mResourceObserve. # noqa: E501 + + + :return: The id of this LwM2mResourceObserve. # noqa: E501 + :rtype: int + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this LwM2mResourceObserve. + + + :param id: The id of this LwM2mResourceObserve. # noqa: E501 + :type: int + """ + + self._id = id + + @property + def key_name(self): + """Gets the key_name of this LwM2mResourceObserve. # noqa: E501 + + + :return: The key_name of this LwM2mResourceObserve. # noqa: E501 + :rtype: str + """ + return self._key_name + + @key_name.setter + def key_name(self, key_name): + """Sets the key_name of this LwM2mResourceObserve. + + + :param key_name: The key_name of this LwM2mResourceObserve. # noqa: E501 + :type: str + """ + + self._key_name = key_name + + @property + def name(self): + """Gets the name of this LwM2mResourceObserve. # noqa: E501 + + + :return: The name of this LwM2mResourceObserve. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this LwM2mResourceObserve. + + + :param name: The name of this LwM2mResourceObserve. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def observe(self): + """Gets the observe of this LwM2mResourceObserve. # noqa: E501 + + + :return: The observe of this LwM2mResourceObserve. # noqa: E501 + :rtype: bool + """ + return self._observe + + @observe.setter + def observe(self, observe): + """Sets the observe of this LwM2mResourceObserve. + + + :param observe: The observe of this LwM2mResourceObserve. # noqa: E501 + :type: bool + """ + + self._observe = observe + + @property + def telemetry(self): + """Gets the telemetry of this LwM2mResourceObserve. # noqa: E501 + + + :return: The telemetry of this LwM2mResourceObserve. # noqa: E501 + :rtype: bool + """ + return self._telemetry + + @telemetry.setter + def telemetry(self, telemetry): + """Sets the telemetry of this LwM2mResourceObserve. + + + :param telemetry: The telemetry of this LwM2mResourceObserve. # noqa: E501 + :type: bool + """ + + self._telemetry = telemetry + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(LwM2mResourceObserve, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, LwM2mResourceObserve): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/mapstring_ts_value.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/mapstring_ts_value.py new file mode 100644 index 0000000..4cc159e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/mapstring_ts_value.py @@ -0,0 +1,89 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class MapstringTsValue(dict): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + if hasattr(dict, "swagger_types"): + swagger_types.update(dict.swagger_types) + + attribute_map = { + } + if hasattr(dict, "attribute_map"): + attribute_map.update(dict.attribute_map) + + def __init__(self, *args, **kwargs): # noqa: E501 + """MapstringTsValue - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + dict.__init__(self, *args, **kwargs) + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(MapstringTsValue, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, MapstringTsValue): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/node_connection_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/node_connection_info.py new file mode 100644 index 0000000..995334c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/node_connection_info.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class NodeConnectionInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'from_index': 'int', + 'to_index': 'int', + 'type': 'str' + } + + attribute_map = { + 'from_index': 'fromIndex', + 'to_index': 'toIndex', + 'type': 'type' + } + + def __init__(self, from_index=None, to_index=None, type=None): # noqa: E501 + """NodeConnectionInfo - a model defined in Swagger""" # noqa: E501 + self._from_index = None + self._to_index = None + self._type = None + self.discriminator = None + if from_index is not None: + self.from_index = from_index + if to_index is not None: + self.to_index = to_index + if type is not None: + self.type = type + + @property + def from_index(self): + """Gets the from_index of this NodeConnectionInfo. # noqa: E501 + + + :return: The from_index of this NodeConnectionInfo. # noqa: E501 + :rtype: int + """ + return self._from_index + + @from_index.setter + def from_index(self, from_index): + """Sets the from_index of this NodeConnectionInfo. + + + :param from_index: The from_index of this NodeConnectionInfo. # noqa: E501 + :type: int + """ + + self._from_index = from_index + + @property + def to_index(self): + """Gets the to_index of this NodeConnectionInfo. # noqa: E501 + + + :return: The to_index of this NodeConnectionInfo. # noqa: E501 + :rtype: int + """ + return self._to_index + + @to_index.setter + def to_index(self, to_index): + """Sets the to_index of this NodeConnectionInfo. + + + :param to_index: The to_index of this NodeConnectionInfo. # noqa: E501 + :type: int + """ + + self._to_index = to_index + + @property + def type(self): + """Gets the type of this NodeConnectionInfo. # noqa: E501 + + + :return: The type of this NodeConnectionInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this NodeConnectionInfo. + + + :param type: The type of this NodeConnectionInfo. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(NodeConnectionInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, NodeConnectionInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_basic_mapper_config.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_basic_mapper_config.py new file mode 100644 index 0000000..b07050b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_basic_mapper_config.py @@ -0,0 +1,298 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2BasicMapperConfig(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'always_full_screen': 'bool', + 'customer_name_pattern': 'str', + 'default_dashboard_name': 'str', + 'email_attribute_key': 'str', + 'first_name_attribute_key': 'str', + 'last_name_attribute_key': 'str', + 'tenant_name_pattern': 'str', + 'tenant_name_strategy': 'str' + } + + attribute_map = { + 'always_full_screen': 'alwaysFullScreen', + 'customer_name_pattern': 'customerNamePattern', + 'default_dashboard_name': 'defaultDashboardName', + 'email_attribute_key': 'emailAttributeKey', + 'first_name_attribute_key': 'firstNameAttributeKey', + 'last_name_attribute_key': 'lastNameAttributeKey', + 'tenant_name_pattern': 'tenantNamePattern', + 'tenant_name_strategy': 'tenantNameStrategy' + } + + def __init__(self, always_full_screen=None, customer_name_pattern=None, default_dashboard_name=None, email_attribute_key=None, first_name_attribute_key=None, last_name_attribute_key=None, tenant_name_pattern=None, tenant_name_strategy=None): # noqa: E501 + """OAuth2BasicMapperConfig - a model defined in Swagger""" # noqa: E501 + self._always_full_screen = None + self._customer_name_pattern = None + self._default_dashboard_name = None + self._email_attribute_key = None + self._first_name_attribute_key = None + self._last_name_attribute_key = None + self._tenant_name_pattern = None + self._tenant_name_strategy = None + self.discriminator = None + if always_full_screen is not None: + self.always_full_screen = always_full_screen + if customer_name_pattern is not None: + self.customer_name_pattern = customer_name_pattern + if default_dashboard_name is not None: + self.default_dashboard_name = default_dashboard_name + if email_attribute_key is not None: + self.email_attribute_key = email_attribute_key + if first_name_attribute_key is not None: + self.first_name_attribute_key = first_name_attribute_key + if last_name_attribute_key is not None: + self.last_name_attribute_key = last_name_attribute_key + if tenant_name_pattern is not None: + self.tenant_name_pattern = tenant_name_pattern + if tenant_name_strategy is not None: + self.tenant_name_strategy = tenant_name_strategy + + @property + def always_full_screen(self): + """Gets the always_full_screen of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The always_full_screen of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: bool + """ + return self._always_full_screen + + @always_full_screen.setter + def always_full_screen(self, always_full_screen): + """Sets the always_full_screen of this OAuth2BasicMapperConfig. + + + :param always_full_screen: The always_full_screen of this OAuth2BasicMapperConfig. # noqa: E501 + :type: bool + """ + + self._always_full_screen = always_full_screen + + @property + def customer_name_pattern(self): + """Gets the customer_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The customer_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._customer_name_pattern + + @customer_name_pattern.setter + def customer_name_pattern(self, customer_name_pattern): + """Sets the customer_name_pattern of this OAuth2BasicMapperConfig. + + + :param customer_name_pattern: The customer_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._customer_name_pattern = customer_name_pattern + + @property + def default_dashboard_name(self): + """Gets the default_dashboard_name of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The default_dashboard_name of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._default_dashboard_name + + @default_dashboard_name.setter + def default_dashboard_name(self, default_dashboard_name): + """Sets the default_dashboard_name of this OAuth2BasicMapperConfig. + + + :param default_dashboard_name: The default_dashboard_name of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._default_dashboard_name = default_dashboard_name + + @property + def email_attribute_key(self): + """Gets the email_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The email_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._email_attribute_key + + @email_attribute_key.setter + def email_attribute_key(self, email_attribute_key): + """Sets the email_attribute_key of this OAuth2BasicMapperConfig. + + + :param email_attribute_key: The email_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._email_attribute_key = email_attribute_key + + @property + def first_name_attribute_key(self): + """Gets the first_name_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The first_name_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._first_name_attribute_key + + @first_name_attribute_key.setter + def first_name_attribute_key(self, first_name_attribute_key): + """Sets the first_name_attribute_key of this OAuth2BasicMapperConfig. + + + :param first_name_attribute_key: The first_name_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._first_name_attribute_key = first_name_attribute_key + + @property + def last_name_attribute_key(self): + """Gets the last_name_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The last_name_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._last_name_attribute_key + + @last_name_attribute_key.setter + def last_name_attribute_key(self, last_name_attribute_key): + """Sets the last_name_attribute_key of this OAuth2BasicMapperConfig. + + + :param last_name_attribute_key: The last_name_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._last_name_attribute_key = last_name_attribute_key + + @property + def tenant_name_pattern(self): + """Gets the tenant_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The tenant_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._tenant_name_pattern + + @tenant_name_pattern.setter + def tenant_name_pattern(self, tenant_name_pattern): + """Sets the tenant_name_pattern of this OAuth2BasicMapperConfig. + + + :param tenant_name_pattern: The tenant_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._tenant_name_pattern = tenant_name_pattern + + @property + def tenant_name_strategy(self): + """Gets the tenant_name_strategy of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The tenant_name_strategy of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._tenant_name_strategy + + @tenant_name_strategy.setter + def tenant_name_strategy(self, tenant_name_strategy): + """Sets the tenant_name_strategy of this OAuth2BasicMapperConfig. + + + :param tenant_name_strategy: The tenant_name_strategy of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + allowed_values = ["DOMAIN", "EMAIL", "CUSTOM"] # noqa: E501 + if tenant_name_strategy not in allowed_values: + raise ValueError( + "Invalid value for `tenant_name_strategy` ({0}), must be one of {1}" # noqa: E501 + .format(tenant_name_strategy, allowed_values) + ) + + self._tenant_name_strategy = tenant_name_strategy + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2BasicMapperConfig, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2BasicMapperConfig): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_client_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_client_info.py new file mode 100644 index 0000000..dd0d539 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_client_info.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2ClientInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'icon': 'str', + 'name': 'str', + 'url': 'str' + } + + attribute_map = { + 'icon': 'icon', + 'name': 'name', + 'url': 'url' + } + + def __init__(self, icon=None, name=None, url=None): # noqa: E501 + """OAuth2ClientInfo - a model defined in Swagger""" # noqa: E501 + self._icon = None + self._name = None + self._url = None + self.discriminator = None + if icon is not None: + self.icon = icon + if name is not None: + self.name = name + if url is not None: + self.url = url + + @property + def icon(self): + """Gets the icon of this OAuth2ClientInfo. # noqa: E501 + + + :return: The icon of this OAuth2ClientInfo. # noqa: E501 + :rtype: str + """ + return self._icon + + @icon.setter + def icon(self, icon): + """Sets the icon of this OAuth2ClientInfo. + + + :param icon: The icon of this OAuth2ClientInfo. # noqa: E501 + :type: str + """ + + self._icon = icon + + @property + def name(self): + """Gets the name of this OAuth2ClientInfo. # noqa: E501 + + + :return: The name of this OAuth2ClientInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this OAuth2ClientInfo. + + + :param name: The name of this OAuth2ClientInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def url(self): + """Gets the url of this OAuth2ClientInfo. # noqa: E501 + + + :return: The url of this OAuth2ClientInfo. # noqa: E501 + :rtype: str + """ + return self._url + + @url.setter + def url(self, url): + """Sets the url of this OAuth2ClientInfo. + + + :param url: The url of this OAuth2ClientInfo. # noqa: E501 + :type: str + """ + + self._url = url + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2ClientInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2ClientInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_client_registration_template.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_client_registration_template.py new file mode 100644 index 0000000..968d057 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_client_registration_template.py @@ -0,0 +1,526 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2ClientRegistrationTemplate(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'access_token_uri': 'str', + 'additional_info': 'str', + 'authorization_uri': 'str', + 'client_authentication_method': 'str', + 'comment': 'str', + 'created_time': 'int', + 'help_link': 'str', + 'id': 'OAuth2ClientRegistrationTemplateId', + 'jwk_set_uri': 'str', + 'login_button_icon': 'str', + 'login_button_label': 'str', + 'mapper_config': 'OAuth2MapperConfig', + 'name': 'str', + 'provider_id': 'str', + 'scope': 'list[str]', + 'user_info_uri': 'str', + 'user_name_attribute_name': 'str' + } + + attribute_map = { + 'access_token_uri': 'accessTokenUri', + 'additional_info': 'additionalInfo', + 'authorization_uri': 'authorizationUri', + 'client_authentication_method': 'clientAuthenticationMethod', + 'comment': 'comment', + 'created_time': 'createdTime', + 'help_link': 'helpLink', + 'id': 'id', + 'jwk_set_uri': 'jwkSetUri', + 'login_button_icon': 'loginButtonIcon', + 'login_button_label': 'loginButtonLabel', + 'mapper_config': 'mapperConfig', + 'name': 'name', + 'provider_id': 'providerId', + 'scope': 'scope', + 'user_info_uri': 'userInfoUri', + 'user_name_attribute_name': 'userNameAttributeName' + } + + def __init__(self, access_token_uri=None, additional_info=None, authorization_uri=None, client_authentication_method=None, comment=None, created_time=None, help_link=None, id=None, jwk_set_uri=None, login_button_icon=None, login_button_label=None, mapper_config=None, name=None, provider_id=None, scope=None, user_info_uri=None, user_name_attribute_name=None): # noqa: E501 + """OAuth2ClientRegistrationTemplate - a model defined in Swagger""" # noqa: E501 + self._access_token_uri = None + self._additional_info = None + self._authorization_uri = None + self._client_authentication_method = None + self._comment = None + self._created_time = None + self._help_link = None + self._id = None + self._jwk_set_uri = None + self._login_button_icon = None + self._login_button_label = None + self._mapper_config = None + self._name = None + self._provider_id = None + self._scope = None + self._user_info_uri = None + self._user_name_attribute_name = None + self.discriminator = None + if access_token_uri is not None: + self.access_token_uri = access_token_uri + if additional_info is not None: + self.additional_info = additional_info + if authorization_uri is not None: + self.authorization_uri = authorization_uri + if client_authentication_method is not None: + self.client_authentication_method = client_authentication_method + if comment is not None: + self.comment = comment + if created_time is not None: + self.created_time = created_time + if help_link is not None: + self.help_link = help_link + if id is not None: + self.id = id + if jwk_set_uri is not None: + self.jwk_set_uri = jwk_set_uri + if login_button_icon is not None: + self.login_button_icon = login_button_icon + if login_button_label is not None: + self.login_button_label = login_button_label + if mapper_config is not None: + self.mapper_config = mapper_config + if name is not None: + self.name = name + if provider_id is not None: + self.provider_id = provider_id + if scope is not None: + self.scope = scope + if user_info_uri is not None: + self.user_info_uri = user_info_uri + if user_name_attribute_name is not None: + self.user_name_attribute_name = user_name_attribute_name + + @property + def access_token_uri(self): + """Gets the access_token_uri of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The access_token_uri of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._access_token_uri + + @access_token_uri.setter + def access_token_uri(self, access_token_uri): + """Sets the access_token_uri of this OAuth2ClientRegistrationTemplate. + + + :param access_token_uri: The access_token_uri of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._access_token_uri = access_token_uri + + @property + def additional_info(self): + """Gets the additional_info of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The additional_info of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this OAuth2ClientRegistrationTemplate. + + + :param additional_info: The additional_info of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def authorization_uri(self): + """Gets the authorization_uri of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The authorization_uri of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._authorization_uri + + @authorization_uri.setter + def authorization_uri(self, authorization_uri): + """Sets the authorization_uri of this OAuth2ClientRegistrationTemplate. + + + :param authorization_uri: The authorization_uri of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._authorization_uri = authorization_uri + + @property + def client_authentication_method(self): + """Gets the client_authentication_method of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The client_authentication_method of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._client_authentication_method + + @client_authentication_method.setter + def client_authentication_method(self, client_authentication_method): + """Sets the client_authentication_method of this OAuth2ClientRegistrationTemplate. + + + :param client_authentication_method: The client_authentication_method of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._client_authentication_method = client_authentication_method + + @property + def comment(self): + """Gets the comment of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The comment of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._comment + + @comment.setter + def comment(self, comment): + """Sets the comment of this OAuth2ClientRegistrationTemplate. + + + :param comment: The comment of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._comment = comment + + @property + def created_time(self): + """Gets the created_time of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The created_time of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this OAuth2ClientRegistrationTemplate. + + + :param created_time: The created_time of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def help_link(self): + """Gets the help_link of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The help_link of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._help_link + + @help_link.setter + def help_link(self, help_link): + """Sets the help_link of this OAuth2ClientRegistrationTemplate. + + + :param help_link: The help_link of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._help_link = help_link + + @property + def id(self): + """Gets the id of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The id of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: OAuth2ClientRegistrationTemplateId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this OAuth2ClientRegistrationTemplate. + + + :param id: The id of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: OAuth2ClientRegistrationTemplateId + """ + + self._id = id + + @property + def jwk_set_uri(self): + """Gets the jwk_set_uri of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The jwk_set_uri of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._jwk_set_uri + + @jwk_set_uri.setter + def jwk_set_uri(self, jwk_set_uri): + """Sets the jwk_set_uri of this OAuth2ClientRegistrationTemplate. + + + :param jwk_set_uri: The jwk_set_uri of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._jwk_set_uri = jwk_set_uri + + @property + def login_button_icon(self): + """Gets the login_button_icon of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The login_button_icon of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._login_button_icon + + @login_button_icon.setter + def login_button_icon(self, login_button_icon): + """Sets the login_button_icon of this OAuth2ClientRegistrationTemplate. + + + :param login_button_icon: The login_button_icon of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._login_button_icon = login_button_icon + + @property + def login_button_label(self): + """Gets the login_button_label of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The login_button_label of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._login_button_label + + @login_button_label.setter + def login_button_label(self, login_button_label): + """Sets the login_button_label of this OAuth2ClientRegistrationTemplate. + + + :param login_button_label: The login_button_label of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._login_button_label = login_button_label + + @property + def mapper_config(self): + """Gets the mapper_config of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The mapper_config of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: OAuth2MapperConfig + """ + return self._mapper_config + + @mapper_config.setter + def mapper_config(self, mapper_config): + """Sets the mapper_config of this OAuth2ClientRegistrationTemplate. + + + :param mapper_config: The mapper_config of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: OAuth2MapperConfig + """ + + self._mapper_config = mapper_config + + @property + def name(self): + """Gets the name of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The name of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this OAuth2ClientRegistrationTemplate. + + + :param name: The name of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def provider_id(self): + """Gets the provider_id of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The provider_id of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._provider_id + + @provider_id.setter + def provider_id(self, provider_id): + """Sets the provider_id of this OAuth2ClientRegistrationTemplate. + + + :param provider_id: The provider_id of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._provider_id = provider_id + + @property + def scope(self): + """Gets the scope of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The scope of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: list[str] + """ + return self._scope + + @scope.setter + def scope(self, scope): + """Sets the scope of this OAuth2ClientRegistrationTemplate. + + + :param scope: The scope of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: list[str] + """ + + self._scope = scope + + @property + def user_info_uri(self): + """Gets the user_info_uri of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The user_info_uri of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._user_info_uri + + @user_info_uri.setter + def user_info_uri(self, user_info_uri): + """Sets the user_info_uri of this OAuth2ClientRegistrationTemplate. + + + :param user_info_uri: The user_info_uri of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._user_info_uri = user_info_uri + + @property + def user_name_attribute_name(self): + """Gets the user_name_attribute_name of this OAuth2ClientRegistrationTemplate. # noqa: E501 + + + :return: The user_name_attribute_name of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :rtype: str + """ + return self._user_name_attribute_name + + @user_name_attribute_name.setter + def user_name_attribute_name(self, user_name_attribute_name): + """Sets the user_name_attribute_name of this OAuth2ClientRegistrationTemplate. + + + :param user_name_attribute_name: The user_name_attribute_name of this OAuth2ClientRegistrationTemplate. # noqa: E501 + :type: str + """ + + self._user_name_attribute_name = user_name_attribute_name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2ClientRegistrationTemplate, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2ClientRegistrationTemplate): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_client_registration_template_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_client_registration_template_id.py new file mode 100644 index 0000000..c01de4d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_client_registration_template_id.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2ClientRegistrationTemplateId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'str' + } + + attribute_map = { + 'id': 'id' + } + + def __init__(self, id=None): # noqa: E501 + """OAuth2ClientRegistrationTemplateId - a model defined in Swagger""" # noqa: E501 + self._id = None + self.discriminator = None + if id is not None: + self.id = id + + @property + def id(self): + """Gets the id of this OAuth2ClientRegistrationTemplateId. # noqa: E501 + + + :return: The id of this OAuth2ClientRegistrationTemplateId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this OAuth2ClientRegistrationTemplateId. + + + :param id: The id of this OAuth2ClientRegistrationTemplateId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2ClientRegistrationTemplateId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2ClientRegistrationTemplateId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_custom_mapper_config.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_custom_mapper_config.py new file mode 100644 index 0000000..5da4a6a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_custom_mapper_config.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2CustomMapperConfig(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'password': 'str', + 'send_token': 'bool', + 'url': 'str', + 'username': 'str' + } + + attribute_map = { + 'password': 'password', + 'send_token': 'sendToken', + 'url': 'url', + 'username': 'username' + } + + def __init__(self, password=None, send_token=None, url=None, username=None): # noqa: E501 + """OAuth2CustomMapperConfig - a model defined in Swagger""" # noqa: E501 + self._password = None + self._send_token = None + self._url = None + self._username = None + self.discriminator = None + if password is not None: + self.password = password + if send_token is not None: + self.send_token = send_token + if url is not None: + self.url = url + if username is not None: + self.username = username + + @property + def password(self): + """Gets the password of this OAuth2CustomMapperConfig. # noqa: E501 + + + :return: The password of this OAuth2CustomMapperConfig. # noqa: E501 + :rtype: str + """ + return self._password + + @password.setter + def password(self, password): + """Sets the password of this OAuth2CustomMapperConfig. + + + :param password: The password of this OAuth2CustomMapperConfig. # noqa: E501 + :type: str + """ + + self._password = password + + @property + def send_token(self): + """Gets the send_token of this OAuth2CustomMapperConfig. # noqa: E501 + + + :return: The send_token of this OAuth2CustomMapperConfig. # noqa: E501 + :rtype: bool + """ + return self._send_token + + @send_token.setter + def send_token(self, send_token): + """Sets the send_token of this OAuth2CustomMapperConfig. + + + :param send_token: The send_token of this OAuth2CustomMapperConfig. # noqa: E501 + :type: bool + """ + + self._send_token = send_token + + @property + def url(self): + """Gets the url of this OAuth2CustomMapperConfig. # noqa: E501 + + + :return: The url of this OAuth2CustomMapperConfig. # noqa: E501 + :rtype: str + """ + return self._url + + @url.setter + def url(self, url): + """Sets the url of this OAuth2CustomMapperConfig. + + + :param url: The url of this OAuth2CustomMapperConfig. # noqa: E501 + :type: str + """ + + self._url = url + + @property + def username(self): + """Gets the username of this OAuth2CustomMapperConfig. # noqa: E501 + + + :return: The username of this OAuth2CustomMapperConfig. # noqa: E501 + :rtype: str + """ + return self._username + + @username.setter + def username(self, username): + """Sets the username of this OAuth2CustomMapperConfig. + + + :param username: The username of this OAuth2CustomMapperConfig. # noqa: E501 + :type: str + """ + + self._username = username + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2CustomMapperConfig, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2CustomMapperConfig): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_domain_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_domain_info.py new file mode 100644 index 0000000..2538c99 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_domain_info.py @@ -0,0 +1,142 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2DomainInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str', + 'scheme': 'str' + } + + attribute_map = { + 'name': 'name', + 'scheme': 'scheme' + } + + def __init__(self, name=None, scheme=None): # noqa: E501 + """OAuth2DomainInfo - a model defined in Swagger""" # noqa: E501 + self._name = None + self._scheme = None + self.discriminator = None + if name is not None: + self.name = name + if scheme is not None: + self.scheme = scheme + + @property + def name(self): + """Gets the name of this OAuth2DomainInfo. # noqa: E501 + + + :return: The name of this OAuth2DomainInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this OAuth2DomainInfo. + + + :param name: The name of this OAuth2DomainInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def scheme(self): + """Gets the scheme of this OAuth2DomainInfo. # noqa: E501 + + + :return: The scheme of this OAuth2DomainInfo. # noqa: E501 + :rtype: str + """ + return self._scheme + + @scheme.setter + def scheme(self, scheme): + """Sets the scheme of this OAuth2DomainInfo. + + + :param scheme: The scheme of this OAuth2DomainInfo. # noqa: E501 + :type: str + """ + allowed_values = ["HTTP", "HTTPS", "MIXED"] # noqa: E501 + if scheme not in allowed_values: + raise ValueError( + "Invalid value for `scheme` ({0}), must be one of {1}" # noqa: E501 + .format(scheme, allowed_values) + ) + + self._scheme = scheme + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2DomainInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2DomainInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_info.py new file mode 100644 index 0000000..88ca0ff --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_info.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2Info(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'enabled': 'bool', + 'oauth2_params_infos': 'list[OAuth2ParamsInfo]' + } + + attribute_map = { + 'enabled': 'enabled', + 'oauth2_params_infos': 'oauth2ParamsInfos' + } + + def __init__(self, enabled=None, oauth2_params_infos=None): # noqa: E501 + """OAuth2Info - a model defined in Swagger""" # noqa: E501 + self._enabled = None + self._oauth2_params_infos = None + self.discriminator = None + if enabled is not None: + self.enabled = enabled + if oauth2_params_infos is not None: + self.oauth2_params_infos = oauth2_params_infos + + @property + def enabled(self): + """Gets the enabled of this OAuth2Info. # noqa: E501 + + + :return: The enabled of this OAuth2Info. # noqa: E501 + :rtype: bool + """ + return self._enabled + + @enabled.setter + def enabled(self, enabled): + """Sets the enabled of this OAuth2Info. + + + :param enabled: The enabled of this OAuth2Info. # noqa: E501 + :type: bool + """ + + self._enabled = enabled + + @property + def oauth2_params_infos(self): + """Gets the oauth2_params_infos of this OAuth2Info. # noqa: E501 + + + :return: The oauth2_params_infos of this OAuth2Info. # noqa: E501 + :rtype: list[OAuth2ParamsInfo] + """ + return self._oauth2_params_infos + + @oauth2_params_infos.setter + def oauth2_params_infos(self, oauth2_params_infos): + """Sets the oauth2_params_infos of this OAuth2Info. + + + :param oauth2_params_infos: The oauth2_params_infos of this OAuth2Info. # noqa: E501 + :type: list[OAuth2ParamsInfo] + """ + + self._oauth2_params_infos = oauth2_params_infos + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2Info, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2Info): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_mapper_config.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_mapper_config.py new file mode 100644 index 0000000..2ff32aa --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_mapper_config.py @@ -0,0 +1,220 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2MapperConfig(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'activate_user': 'bool', + 'allow_user_creation': 'bool', + 'basic': 'OAuth2BasicMapperConfig', + 'custom': 'OAuth2CustomMapperConfig', + 'type': 'str' + } + + attribute_map = { + 'activate_user': 'activateUser', + 'allow_user_creation': 'allowUserCreation', + 'basic': 'basic', + 'custom': 'custom', + 'type': 'type' + } + + def __init__(self, activate_user=None, allow_user_creation=None, basic=None, custom=None, type=None): # noqa: E501 + """OAuth2MapperConfig - a model defined in Swagger""" # noqa: E501 + self._activate_user = None + self._allow_user_creation = None + self._basic = None + self._custom = None + self._type = None + self.discriminator = None + if activate_user is not None: + self.activate_user = activate_user + if allow_user_creation is not None: + self.allow_user_creation = allow_user_creation + if basic is not None: + self.basic = basic + if custom is not None: + self.custom = custom + if type is not None: + self.type = type + + @property + def activate_user(self): + """Gets the activate_user of this OAuth2MapperConfig. # noqa: E501 + + + :return: The activate_user of this OAuth2MapperConfig. # noqa: E501 + :rtype: bool + """ + return self._activate_user + + @activate_user.setter + def activate_user(self, activate_user): + """Sets the activate_user of this OAuth2MapperConfig. + + + :param activate_user: The activate_user of this OAuth2MapperConfig. # noqa: E501 + :type: bool + """ + + self._activate_user = activate_user + + @property + def allow_user_creation(self): + """Gets the allow_user_creation of this OAuth2MapperConfig. # noqa: E501 + + + :return: The allow_user_creation of this OAuth2MapperConfig. # noqa: E501 + :rtype: bool + """ + return self._allow_user_creation + + @allow_user_creation.setter + def allow_user_creation(self, allow_user_creation): + """Sets the allow_user_creation of this OAuth2MapperConfig. + + + :param allow_user_creation: The allow_user_creation of this OAuth2MapperConfig. # noqa: E501 + :type: bool + """ + + self._allow_user_creation = allow_user_creation + + @property + def basic(self): + """Gets the basic of this OAuth2MapperConfig. # noqa: E501 + + + :return: The basic of this OAuth2MapperConfig. # noqa: E501 + :rtype: OAuth2BasicMapperConfig + """ + return self._basic + + @basic.setter + def basic(self, basic): + """Sets the basic of this OAuth2MapperConfig. + + + :param basic: The basic of this OAuth2MapperConfig. # noqa: E501 + :type: OAuth2BasicMapperConfig + """ + + self._basic = basic + + @property + def custom(self): + """Gets the custom of this OAuth2MapperConfig. # noqa: E501 + + + :return: The custom of this OAuth2MapperConfig. # noqa: E501 + :rtype: OAuth2CustomMapperConfig + """ + return self._custom + + @custom.setter + def custom(self, custom): + """Sets the custom of this OAuth2MapperConfig. + + + :param custom: The custom of this OAuth2MapperConfig. # noqa: E501 + :type: OAuth2CustomMapperConfig + """ + + self._custom = custom + + @property + def type(self): + """Gets the type of this OAuth2MapperConfig. # noqa: E501 + + + :return: The type of this OAuth2MapperConfig. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this OAuth2MapperConfig. + + + :param type: The type of this OAuth2MapperConfig. # noqa: E501 + :type: str + """ + allowed_values = ["BASIC", "CUSTOM", "GITHUB", "APPLE"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2MapperConfig, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2MapperConfig): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_mobile_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_mobile_info.py new file mode 100644 index 0000000..2e44fcc --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_mobile_info.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2MobileInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'app_secret': 'str', + 'pkg_name': 'str' + } + + attribute_map = { + 'app_secret': 'appSecret', + 'pkg_name': 'pkgName' + } + + def __init__(self, app_secret=None, pkg_name=None): # noqa: E501 + """OAuth2MobileInfo - a model defined in Swagger""" # noqa: E501 + self._app_secret = None + self._pkg_name = None + self.discriminator = None + if app_secret is not None: + self.app_secret = app_secret + if pkg_name is not None: + self.pkg_name = pkg_name + + @property + def app_secret(self): + """Gets the app_secret of this OAuth2MobileInfo. # noqa: E501 + + + :return: The app_secret of this OAuth2MobileInfo. # noqa: E501 + :rtype: str + """ + return self._app_secret + + @app_secret.setter + def app_secret(self, app_secret): + """Sets the app_secret of this OAuth2MobileInfo. + + + :param app_secret: The app_secret of this OAuth2MobileInfo. # noqa: E501 + :type: str + """ + + self._app_secret = app_secret + + @property + def pkg_name(self): + """Gets the pkg_name of this OAuth2MobileInfo. # noqa: E501 + + + :return: The pkg_name of this OAuth2MobileInfo. # noqa: E501 + :rtype: str + """ + return self._pkg_name + + @pkg_name.setter + def pkg_name(self, pkg_name): + """Sets the pkg_name of this OAuth2MobileInfo. + + + :param pkg_name: The pkg_name of this OAuth2MobileInfo. # noqa: E501 + :type: str + """ + + self._pkg_name = pkg_name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2MobileInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2MobileInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_params_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_params_info.py new file mode 100644 index 0000000..4e24970 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_params_info.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2ParamsInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'client_registrations': 'list[OAuth2RegistrationInfo]', + 'domain_infos': 'list[OAuth2DomainInfo]', + 'mobile_infos': 'list[OAuth2MobileInfo]' + } + + attribute_map = { + 'client_registrations': 'clientRegistrations', + 'domain_infos': 'domainInfos', + 'mobile_infos': 'mobileInfos' + } + + def __init__(self, client_registrations=None, domain_infos=None, mobile_infos=None): # noqa: E501 + """OAuth2ParamsInfo - a model defined in Swagger""" # noqa: E501 + self._client_registrations = None + self._domain_infos = None + self._mobile_infos = None + self.discriminator = None + if client_registrations is not None: + self.client_registrations = client_registrations + if domain_infos is not None: + self.domain_infos = domain_infos + if mobile_infos is not None: + self.mobile_infos = mobile_infos + + @property + def client_registrations(self): + """Gets the client_registrations of this OAuth2ParamsInfo. # noqa: E501 + + + :return: The client_registrations of this OAuth2ParamsInfo. # noqa: E501 + :rtype: list[OAuth2RegistrationInfo] + """ + return self._client_registrations + + @client_registrations.setter + def client_registrations(self, client_registrations): + """Sets the client_registrations of this OAuth2ParamsInfo. + + + :param client_registrations: The client_registrations of this OAuth2ParamsInfo. # noqa: E501 + :type: list[OAuth2RegistrationInfo] + """ + + self._client_registrations = client_registrations + + @property + def domain_infos(self): + """Gets the domain_infos of this OAuth2ParamsInfo. # noqa: E501 + + + :return: The domain_infos of this OAuth2ParamsInfo. # noqa: E501 + :rtype: list[OAuth2DomainInfo] + """ + return self._domain_infos + + @domain_infos.setter + def domain_infos(self, domain_infos): + """Sets the domain_infos of this OAuth2ParamsInfo. + + + :param domain_infos: The domain_infos of this OAuth2ParamsInfo. # noqa: E501 + :type: list[OAuth2DomainInfo] + """ + + self._domain_infos = domain_infos + + @property + def mobile_infos(self): + """Gets the mobile_infos of this OAuth2ParamsInfo. # noqa: E501 + + + :return: The mobile_infos of this OAuth2ParamsInfo. # noqa: E501 + :rtype: list[OAuth2MobileInfo] + """ + return self._mobile_infos + + @mobile_infos.setter + def mobile_infos(self, mobile_infos): + """Sets the mobile_infos of this OAuth2ParamsInfo. + + + :param mobile_infos: The mobile_infos of this OAuth2ParamsInfo. # noqa: E501 + :type: list[OAuth2MobileInfo] + """ + + self._mobile_infos = mobile_infos + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2ParamsInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2ParamsInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_registration_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_registration_info.py new file mode 100644 index 0000000..34c9580 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/o_auth2_registration_info.py @@ -0,0 +1,455 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2RegistrationInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'access_token_uri': 'str', + 'additional_info': 'str', + 'authorization_uri': 'str', + 'client_authentication_method': 'str', + 'client_id': 'str', + 'client_secret': 'str', + 'jwk_set_uri': 'str', + 'login_button_icon': 'str', + 'login_button_label': 'str', + 'mapper_config': 'OAuth2MapperConfig', + 'platforms': 'list[str]', + 'scope': 'list[str]', + 'user_info_uri': 'str', + 'user_name_attribute_name': 'str' + } + + attribute_map = { + 'access_token_uri': 'accessTokenUri', + 'additional_info': 'additionalInfo', + 'authorization_uri': 'authorizationUri', + 'client_authentication_method': 'clientAuthenticationMethod', + 'client_id': 'clientId', + 'client_secret': 'clientSecret', + 'jwk_set_uri': 'jwkSetUri', + 'login_button_icon': 'loginButtonIcon', + 'login_button_label': 'loginButtonLabel', + 'mapper_config': 'mapperConfig', + 'platforms': 'platforms', + 'scope': 'scope', + 'user_info_uri': 'userInfoUri', + 'user_name_attribute_name': 'userNameAttributeName' + } + + def __init__(self, access_token_uri=None, additional_info=None, authorization_uri=None, client_authentication_method=None, client_id=None, client_secret=None, jwk_set_uri=None, login_button_icon=None, login_button_label=None, mapper_config=None, platforms=None, scope=None, user_info_uri=None, user_name_attribute_name=None): # noqa: E501 + """OAuth2RegistrationInfo - a model defined in Swagger""" # noqa: E501 + self._access_token_uri = None + self._additional_info = None + self._authorization_uri = None + self._client_authentication_method = None + self._client_id = None + self._client_secret = None + self._jwk_set_uri = None + self._login_button_icon = None + self._login_button_label = None + self._mapper_config = None + self._platforms = None + self._scope = None + self._user_info_uri = None + self._user_name_attribute_name = None + self.discriminator = None + if access_token_uri is not None: + self.access_token_uri = access_token_uri + if additional_info is not None: + self.additional_info = additional_info + if authorization_uri is not None: + self.authorization_uri = authorization_uri + if client_authentication_method is not None: + self.client_authentication_method = client_authentication_method + if client_id is not None: + self.client_id = client_id + if client_secret is not None: + self.client_secret = client_secret + if jwk_set_uri is not None: + self.jwk_set_uri = jwk_set_uri + if login_button_icon is not None: + self.login_button_icon = login_button_icon + if login_button_label is not None: + self.login_button_label = login_button_label + if mapper_config is not None: + self.mapper_config = mapper_config + if platforms is not None: + self.platforms = platforms + if scope is not None: + self.scope = scope + if user_info_uri is not None: + self.user_info_uri = user_info_uri + if user_name_attribute_name is not None: + self.user_name_attribute_name = user_name_attribute_name + + @property + def access_token_uri(self): + """Gets the access_token_uri of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The access_token_uri of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: str + """ + return self._access_token_uri + + @access_token_uri.setter + def access_token_uri(self, access_token_uri): + """Sets the access_token_uri of this OAuth2RegistrationInfo. + + + :param access_token_uri: The access_token_uri of this OAuth2RegistrationInfo. # noqa: E501 + :type: str + """ + + self._access_token_uri = access_token_uri + + @property + def additional_info(self): + """Gets the additional_info of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The additional_info of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this OAuth2RegistrationInfo. + + + :param additional_info: The additional_info of this OAuth2RegistrationInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def authorization_uri(self): + """Gets the authorization_uri of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The authorization_uri of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: str + """ + return self._authorization_uri + + @authorization_uri.setter + def authorization_uri(self, authorization_uri): + """Sets the authorization_uri of this OAuth2RegistrationInfo. + + + :param authorization_uri: The authorization_uri of this OAuth2RegistrationInfo. # noqa: E501 + :type: str + """ + + self._authorization_uri = authorization_uri + + @property + def client_authentication_method(self): + """Gets the client_authentication_method of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The client_authentication_method of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: str + """ + return self._client_authentication_method + + @client_authentication_method.setter + def client_authentication_method(self, client_authentication_method): + """Sets the client_authentication_method of this OAuth2RegistrationInfo. + + + :param client_authentication_method: The client_authentication_method of this OAuth2RegistrationInfo. # noqa: E501 + :type: str + """ + + self._client_authentication_method = client_authentication_method + + @property + def client_id(self): + """Gets the client_id of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The client_id of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: str + """ + return self._client_id + + @client_id.setter + def client_id(self, client_id): + """Sets the client_id of this OAuth2RegistrationInfo. + + + :param client_id: The client_id of this OAuth2RegistrationInfo. # noqa: E501 + :type: str + """ + + self._client_id = client_id + + @property + def client_secret(self): + """Gets the client_secret of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The client_secret of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: str + """ + return self._client_secret + + @client_secret.setter + def client_secret(self, client_secret): + """Sets the client_secret of this OAuth2RegistrationInfo. + + + :param client_secret: The client_secret of this OAuth2RegistrationInfo. # noqa: E501 + :type: str + """ + + self._client_secret = client_secret + + @property + def jwk_set_uri(self): + """Gets the jwk_set_uri of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The jwk_set_uri of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: str + """ + return self._jwk_set_uri + + @jwk_set_uri.setter + def jwk_set_uri(self, jwk_set_uri): + """Sets the jwk_set_uri of this OAuth2RegistrationInfo. + + + :param jwk_set_uri: The jwk_set_uri of this OAuth2RegistrationInfo. # noqa: E501 + :type: str + """ + + self._jwk_set_uri = jwk_set_uri + + @property + def login_button_icon(self): + """Gets the login_button_icon of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The login_button_icon of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: str + """ + return self._login_button_icon + + @login_button_icon.setter + def login_button_icon(self, login_button_icon): + """Sets the login_button_icon of this OAuth2RegistrationInfo. + + + :param login_button_icon: The login_button_icon of this OAuth2RegistrationInfo. # noqa: E501 + :type: str + """ + + self._login_button_icon = login_button_icon + + @property + def login_button_label(self): + """Gets the login_button_label of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The login_button_label of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: str + """ + return self._login_button_label + + @login_button_label.setter + def login_button_label(self, login_button_label): + """Sets the login_button_label of this OAuth2RegistrationInfo. + + + :param login_button_label: The login_button_label of this OAuth2RegistrationInfo. # noqa: E501 + :type: str + """ + + self._login_button_label = login_button_label + + @property + def mapper_config(self): + """Gets the mapper_config of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The mapper_config of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: OAuth2MapperConfig + """ + return self._mapper_config + + @mapper_config.setter + def mapper_config(self, mapper_config): + """Sets the mapper_config of this OAuth2RegistrationInfo. + + + :param mapper_config: The mapper_config of this OAuth2RegistrationInfo. # noqa: E501 + :type: OAuth2MapperConfig + """ + + self._mapper_config = mapper_config + + @property + def platforms(self): + """Gets the platforms of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The platforms of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: list[str] + """ + return self._platforms + + @platforms.setter + def platforms(self, platforms): + """Sets the platforms of this OAuth2RegistrationInfo. + + + :param platforms: The platforms of this OAuth2RegistrationInfo. # noqa: E501 + :type: list[str] + """ + allowed_values = ["WEB", "ANDROID", "IOS"] # noqa: E501 + if not set(platforms).issubset(set(allowed_values)): + raise ValueError( + "Invalid values for `platforms` [{0}], must be a subset of [{1}]" # noqa: E501 + .format(", ".join(map(str, set(platforms) - set(allowed_values))), # noqa: E501 + ", ".join(map(str, allowed_values))) + ) + + self._platforms = platforms + + @property + def scope(self): + """Gets the scope of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The scope of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: list[str] + """ + return self._scope + + @scope.setter + def scope(self, scope): + """Sets the scope of this OAuth2RegistrationInfo. + + + :param scope: The scope of this OAuth2RegistrationInfo. # noqa: E501 + :type: list[str] + """ + + self._scope = scope + + @property + def user_info_uri(self): + """Gets the user_info_uri of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The user_info_uri of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: str + """ + return self._user_info_uri + + @user_info_uri.setter + def user_info_uri(self, user_info_uri): + """Sets the user_info_uri of this OAuth2RegistrationInfo. + + + :param user_info_uri: The user_info_uri of this OAuth2RegistrationInfo. # noqa: E501 + :type: str + """ + + self._user_info_uri = user_info_uri + + @property + def user_name_attribute_name(self): + """Gets the user_name_attribute_name of this OAuth2RegistrationInfo. # noqa: E501 + + + :return: The user_name_attribute_name of this OAuth2RegistrationInfo. # noqa: E501 + :rtype: str + """ + return self._user_name_attribute_name + + @user_name_attribute_name.setter + def user_name_attribute_name(self, user_name_attribute_name): + """Sets the user_name_attribute_name of this OAuth2RegistrationInfo. + + + :param user_name_attribute_name: The user_name_attribute_name of this OAuth2RegistrationInfo. # noqa: E501 + :type: str + """ + + self._user_name_attribute_name = user_name_attribute_name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2RegistrationInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2RegistrationInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/object_node.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/object_node.py new file mode 100644 index 0000000..67c8b13 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/object_node.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ObjectNode(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """ObjectNode - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ObjectNode, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ObjectNode): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package.py new file mode 100644 index 0000000..bb54f93 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package.py @@ -0,0 +1,538 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OtaPackage(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'checksum': 'str', + 'checksum_algorithm': 'str', + 'content_type': 'str', + 'created_time': 'int', + 'data': 'ByteBuffer', + 'data_size': 'int', + 'device_profile_id': 'DeviceProfileId', + 'file_name': 'str', + 'has_data': 'bool', + 'id': 'OtaPackageId', + 'tag': 'str', + 'tenant_id': 'TenantId', + 'title': 'str', + 'type': 'str', + 'url': 'str', + 'version': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'checksum': 'checksum', + 'checksum_algorithm': 'checksumAlgorithm', + 'content_type': 'contentType', + 'created_time': 'createdTime', + 'data': 'data', + 'data_size': 'dataSize', + 'device_profile_id': 'deviceProfileId', + 'file_name': 'fileName', + 'has_data': 'hasData', + 'id': 'id', + 'tag': 'tag', + 'tenant_id': 'tenantId', + 'title': 'title', + 'type': 'type', + 'url': 'url', + 'version': 'version' + } + + def __init__(self, additional_info=None, checksum=None, checksum_algorithm=None, content_type=None, created_time=None, data=None, data_size=None, device_profile_id=None, file_name=None, has_data=None, id=None, tag=None, tenant_id=None, title=None, type=None, url=None, version=None): # noqa: E501 + """OtaPackage - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._checksum = None + self._checksum_algorithm = None + self._content_type = None + self._created_time = None + self._data = None + self._data_size = None + self._device_profile_id = None + self._file_name = None + self._has_data = None + self._id = None + self._tag = None + self._tenant_id = None + self._title = None + self._type = None + self._url = None + self._version = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if checksum is not None: + self.checksum = checksum + if checksum_algorithm is not None: + self.checksum_algorithm = checksum_algorithm + if content_type is not None: + self.content_type = content_type + if created_time is not None: + self.created_time = created_time + if data is not None: + self.data = data + if data_size is not None: + self.data_size = data_size + if device_profile_id is not None: + self.device_profile_id = device_profile_id + if file_name is not None: + self.file_name = file_name + if has_data is not None: + self.has_data = has_data + if id is not None: + self.id = id + if tag is not None: + self.tag = tag + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + if type is not None: + self.type = type + if url is not None: + self.url = url + if version is not None: + self.version = version + + @property + def additional_info(self): + """Gets the additional_info of this OtaPackage. # noqa: E501 + + + :return: The additional_info of this OtaPackage. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this OtaPackage. + + + :param additional_info: The additional_info of this OtaPackage. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def checksum(self): + """Gets the checksum of this OtaPackage. # noqa: E501 + + + :return: The checksum of this OtaPackage. # noqa: E501 + :rtype: str + """ + return self._checksum + + @checksum.setter + def checksum(self, checksum): + """Sets the checksum of this OtaPackage. + + + :param checksum: The checksum of this OtaPackage. # noqa: E501 + :type: str + """ + + self._checksum = checksum + + @property + def checksum_algorithm(self): + """Gets the checksum_algorithm of this OtaPackage. # noqa: E501 + + + :return: The checksum_algorithm of this OtaPackage. # noqa: E501 + :rtype: str + """ + return self._checksum_algorithm + + @checksum_algorithm.setter + def checksum_algorithm(self, checksum_algorithm): + """Sets the checksum_algorithm of this OtaPackage. + + + :param checksum_algorithm: The checksum_algorithm of this OtaPackage. # noqa: E501 + :type: str + """ + allowed_values = ["MD5", "SHA256", "SHA384", "SHA512", "CRC32", "MURMUR3_32", "MURMUR3_128"] # noqa: E501 + if checksum_algorithm not in allowed_values: + raise ValueError( + "Invalid value for `checksum_algorithm` ({0}), must be one of {1}" # noqa: E501 + .format(checksum_algorithm, allowed_values) + ) + + self._checksum_algorithm = checksum_algorithm + + @property + def content_type(self): + """Gets the content_type of this OtaPackage. # noqa: E501 + + + :return: The content_type of this OtaPackage. # noqa: E501 + :rtype: str + """ + return self._content_type + + @content_type.setter + def content_type(self, content_type): + """Sets the content_type of this OtaPackage. + + + :param content_type: The content_type of this OtaPackage. # noqa: E501 + :type: str + """ + + self._content_type = content_type + + @property + def created_time(self): + """Gets the created_time of this OtaPackage. # noqa: E501 + + + :return: The created_time of this OtaPackage. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this OtaPackage. + + + :param created_time: The created_time of this OtaPackage. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def data(self): + """Gets the data of this OtaPackage. # noqa: E501 + + + :return: The data of this OtaPackage. # noqa: E501 + :rtype: ByteBuffer + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this OtaPackage. + + + :param data: The data of this OtaPackage. # noqa: E501 + :type: ByteBuffer + """ + + self._data = data + + @property + def data_size(self): + """Gets the data_size of this OtaPackage. # noqa: E501 + + + :return: The data_size of this OtaPackage. # noqa: E501 + :rtype: int + """ + return self._data_size + + @data_size.setter + def data_size(self, data_size): + """Sets the data_size of this OtaPackage. + + + :param data_size: The data_size of this OtaPackage. # noqa: E501 + :type: int + """ + + self._data_size = data_size + + @property + def device_profile_id(self): + """Gets the device_profile_id of this OtaPackage. # noqa: E501 + + + :return: The device_profile_id of this OtaPackage. # noqa: E501 + :rtype: DeviceProfileId + """ + return self._device_profile_id + + @device_profile_id.setter + def device_profile_id(self, device_profile_id): + """Sets the device_profile_id of this OtaPackage. + + + :param device_profile_id: The device_profile_id of this OtaPackage. # noqa: E501 + :type: DeviceProfileId + """ + + self._device_profile_id = device_profile_id + + @property + def file_name(self): + """Gets the file_name of this OtaPackage. # noqa: E501 + + + :return: The file_name of this OtaPackage. # noqa: E501 + :rtype: str + """ + return self._file_name + + @file_name.setter + def file_name(self, file_name): + """Sets the file_name of this OtaPackage. + + + :param file_name: The file_name of this OtaPackage. # noqa: E501 + :type: str + """ + + self._file_name = file_name + + @property + def has_data(self): + """Gets the has_data of this OtaPackage. # noqa: E501 + + + :return: The has_data of this OtaPackage. # noqa: E501 + :rtype: bool + """ + return self._has_data + + @has_data.setter + def has_data(self, has_data): + """Sets the has_data of this OtaPackage. + + + :param has_data: The has_data of this OtaPackage. # noqa: E501 + :type: bool + """ + + self._has_data = has_data + + @property + def id(self): + """Gets the id of this OtaPackage. # noqa: E501 + + + :return: The id of this OtaPackage. # noqa: E501 + :rtype: OtaPackageId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this OtaPackage. + + + :param id: The id of this OtaPackage. # noqa: E501 + :type: OtaPackageId + """ + + self._id = id + + @property + def tag(self): + """Gets the tag of this OtaPackage. # noqa: E501 + + + :return: The tag of this OtaPackage. # noqa: E501 + :rtype: str + """ + return self._tag + + @tag.setter + def tag(self, tag): + """Sets the tag of this OtaPackage. + + + :param tag: The tag of this OtaPackage. # noqa: E501 + :type: str + """ + + self._tag = tag + + @property + def tenant_id(self): + """Gets the tenant_id of this OtaPackage. # noqa: E501 + + + :return: The tenant_id of this OtaPackage. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this OtaPackage. + + + :param tenant_id: The tenant_id of this OtaPackage. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this OtaPackage. # noqa: E501 + + + :return: The title of this OtaPackage. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this OtaPackage. + + + :param title: The title of this OtaPackage. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def type(self): + """Gets the type of this OtaPackage. # noqa: E501 + + + :return: The type of this OtaPackage. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this OtaPackage. + + + :param type: The type of this OtaPackage. # noqa: E501 + :type: str + """ + allowed_values = ["FIRMWARE", "SOFTWARE"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + @property + def url(self): + """Gets the url of this OtaPackage. # noqa: E501 + + + :return: The url of this OtaPackage. # noqa: E501 + :rtype: str + """ + return self._url + + @url.setter + def url(self, url): + """Sets the url of this OtaPackage. + + + :param url: The url of this OtaPackage. # noqa: E501 + :type: str + """ + + self._url = url + + @property + def version(self): + """Gets the version of this OtaPackage. # noqa: E501 + + + :return: The version of this OtaPackage. # noqa: E501 + :rtype: str + """ + return self._version + + @version.setter + def version(self, version): + """Sets the version of this OtaPackage. + + + :param version: The version of this OtaPackage. # noqa: E501 + :type: str + """ + + self._version = version + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OtaPackage, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OtaPackage): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package_id.py new file mode 100644 index 0000000..5c6865e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package_id.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OtaPackageId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'str' + } + + attribute_map = { + 'id': 'id' + } + + def __init__(self, id=None): # noqa: E501 + """OtaPackageId - a model defined in Swagger""" # noqa: E501 + self._id = None + self.discriminator = None + if id is not None: + self.id = id + + @property + def id(self): + """Gets the id of this OtaPackageId. # noqa: E501 + + + :return: The id of this OtaPackageId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this OtaPackageId. + + + :param id: The id of this OtaPackageId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OtaPackageId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OtaPackageId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package_info.py new file mode 100644 index 0000000..fabf092 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package_info.py @@ -0,0 +1,512 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OtaPackageInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'checksum': 'str', + 'checksum_algorithm': 'str', + 'content_type': 'str', + 'created_time': 'int', + 'data_size': 'int', + 'device_profile_id': 'DeviceProfileId', + 'file_name': 'str', + 'has_data': 'bool', + 'id': 'OtaPackageId', + 'tag': 'str', + 'tenant_id': 'TenantId', + 'title': 'str', + 'type': 'str', + 'url': 'str', + 'version': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'checksum': 'checksum', + 'checksum_algorithm': 'checksumAlgorithm', + 'content_type': 'contentType', + 'created_time': 'createdTime', + 'data_size': 'dataSize', + 'device_profile_id': 'deviceProfileId', + 'file_name': 'fileName', + 'has_data': 'hasData', + 'id': 'id', + 'tag': 'tag', + 'tenant_id': 'tenantId', + 'title': 'title', + 'type': 'type', + 'url': 'url', + 'version': 'version' + } + + def __init__(self, additional_info=None, checksum=None, checksum_algorithm=None, content_type=None, created_time=None, data_size=None, device_profile_id=None, file_name=None, has_data=None, id=None, tag=None, tenant_id=None, title=None, type=None, url=None, version=None): # noqa: E501 + """OtaPackageInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._checksum = None + self._checksum_algorithm = None + self._content_type = None + self._created_time = None + self._data_size = None + self._device_profile_id = None + self._file_name = None + self._has_data = None + self._id = None + self._tag = None + self._tenant_id = None + self._title = None + self._type = None + self._url = None + self._version = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if checksum is not None: + self.checksum = checksum + if checksum_algorithm is not None: + self.checksum_algorithm = checksum_algorithm + if content_type is not None: + self.content_type = content_type + if created_time is not None: + self.created_time = created_time + if data_size is not None: + self.data_size = data_size + if device_profile_id is not None: + self.device_profile_id = device_profile_id + if file_name is not None: + self.file_name = file_name + if has_data is not None: + self.has_data = has_data + if id is not None: + self.id = id + if tag is not None: + self.tag = tag + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + if type is not None: + self.type = type + if url is not None: + self.url = url + if version is not None: + self.version = version + + @property + def additional_info(self): + """Gets the additional_info of this OtaPackageInfo. # noqa: E501 + + + :return: The additional_info of this OtaPackageInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this OtaPackageInfo. + + + :param additional_info: The additional_info of this OtaPackageInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def checksum(self): + """Gets the checksum of this OtaPackageInfo. # noqa: E501 + + + :return: The checksum of this OtaPackageInfo. # noqa: E501 + :rtype: str + """ + return self._checksum + + @checksum.setter + def checksum(self, checksum): + """Sets the checksum of this OtaPackageInfo. + + + :param checksum: The checksum of this OtaPackageInfo. # noqa: E501 + :type: str + """ + + self._checksum = checksum + + @property + def checksum_algorithm(self): + """Gets the checksum_algorithm of this OtaPackageInfo. # noqa: E501 + + + :return: The checksum_algorithm of this OtaPackageInfo. # noqa: E501 + :rtype: str + """ + return self._checksum_algorithm + + @checksum_algorithm.setter + def checksum_algorithm(self, checksum_algorithm): + """Sets the checksum_algorithm of this OtaPackageInfo. + + + :param checksum_algorithm: The checksum_algorithm of this OtaPackageInfo. # noqa: E501 + :type: str + """ + allowed_values = ["MD5", "SHA256", "SHA384", "SHA512", "CRC32", "MURMUR3_32", "MURMUR3_128"] # noqa: E501 + if checksum_algorithm not in allowed_values: + raise ValueError( + "Invalid value for `checksum_algorithm` ({0}), must be one of {1}" # noqa: E501 + .format(checksum_algorithm, allowed_values) + ) + + self._checksum_algorithm = checksum_algorithm + + @property + def content_type(self): + """Gets the content_type of this OtaPackageInfo. # noqa: E501 + + + :return: The content_type of this OtaPackageInfo. # noqa: E501 + :rtype: str + """ + return self._content_type + + @content_type.setter + def content_type(self, content_type): + """Sets the content_type of this OtaPackageInfo. + + + :param content_type: The content_type of this OtaPackageInfo. # noqa: E501 + :type: str + """ + + self._content_type = content_type + + @property + def created_time(self): + """Gets the created_time of this OtaPackageInfo. # noqa: E501 + + + :return: The created_time of this OtaPackageInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this OtaPackageInfo. + + + :param created_time: The created_time of this OtaPackageInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def data_size(self): + """Gets the data_size of this OtaPackageInfo. # noqa: E501 + + + :return: The data_size of this OtaPackageInfo. # noqa: E501 + :rtype: int + """ + return self._data_size + + @data_size.setter + def data_size(self, data_size): + """Sets the data_size of this OtaPackageInfo. + + + :param data_size: The data_size of this OtaPackageInfo. # noqa: E501 + :type: int + """ + + self._data_size = data_size + + @property + def device_profile_id(self): + """Gets the device_profile_id of this OtaPackageInfo. # noqa: E501 + + + :return: The device_profile_id of this OtaPackageInfo. # noqa: E501 + :rtype: DeviceProfileId + """ + return self._device_profile_id + + @device_profile_id.setter + def device_profile_id(self, device_profile_id): + """Sets the device_profile_id of this OtaPackageInfo. + + + :param device_profile_id: The device_profile_id of this OtaPackageInfo. # noqa: E501 + :type: DeviceProfileId + """ + + self._device_profile_id = device_profile_id + + @property + def file_name(self): + """Gets the file_name of this OtaPackageInfo. # noqa: E501 + + + :return: The file_name of this OtaPackageInfo. # noqa: E501 + :rtype: str + """ + return self._file_name + + @file_name.setter + def file_name(self, file_name): + """Sets the file_name of this OtaPackageInfo. + + + :param file_name: The file_name of this OtaPackageInfo. # noqa: E501 + :type: str + """ + + self._file_name = file_name + + @property + def has_data(self): + """Gets the has_data of this OtaPackageInfo. # noqa: E501 + + + :return: The has_data of this OtaPackageInfo. # noqa: E501 + :rtype: bool + """ + return self._has_data + + @has_data.setter + def has_data(self, has_data): + """Sets the has_data of this OtaPackageInfo. + + + :param has_data: The has_data of this OtaPackageInfo. # noqa: E501 + :type: bool + """ + + self._has_data = has_data + + @property + def id(self): + """Gets the id of this OtaPackageInfo. # noqa: E501 + + + :return: The id of this OtaPackageInfo. # noqa: E501 + :rtype: OtaPackageId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this OtaPackageInfo. + + + :param id: The id of this OtaPackageInfo. # noqa: E501 + :type: OtaPackageId + """ + + self._id = id + + @property + def tag(self): + """Gets the tag of this OtaPackageInfo. # noqa: E501 + + + :return: The tag of this OtaPackageInfo. # noqa: E501 + :rtype: str + """ + return self._tag + + @tag.setter + def tag(self, tag): + """Sets the tag of this OtaPackageInfo. + + + :param tag: The tag of this OtaPackageInfo. # noqa: E501 + :type: str + """ + + self._tag = tag + + @property + def tenant_id(self): + """Gets the tenant_id of this OtaPackageInfo. # noqa: E501 + + + :return: The tenant_id of this OtaPackageInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this OtaPackageInfo. + + + :param tenant_id: The tenant_id of this OtaPackageInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this OtaPackageInfo. # noqa: E501 + + + :return: The title of this OtaPackageInfo. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this OtaPackageInfo. + + + :param title: The title of this OtaPackageInfo. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def type(self): + """Gets the type of this OtaPackageInfo. # noqa: E501 + + + :return: The type of this OtaPackageInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this OtaPackageInfo. + + + :param type: The type of this OtaPackageInfo. # noqa: E501 + :type: str + """ + allowed_values = ["FIRMWARE", "SOFTWARE"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + @property + def url(self): + """Gets the url of this OtaPackageInfo. # noqa: E501 + + + :return: The url of this OtaPackageInfo. # noqa: E501 + :rtype: str + """ + return self._url + + @url.setter + def url(self, url): + """Sets the url of this OtaPackageInfo. + + + :param url: The url of this OtaPackageInfo. # noqa: E501 + :type: str + """ + + self._url = url + + @property + def version(self): + """Gets the version of this OtaPackageInfo. # noqa: E501 + + + :return: The version of this OtaPackageInfo. # noqa: E501 + :rtype: str + """ + return self._version + + @version.setter + def version(self, version): + """Sets the version of this OtaPackageInfo. + + + :param version: The version of this OtaPackageInfo. # noqa: E501 + :type: str + """ + + self._version = version + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OtaPackageInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OtaPackageInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package_ota_package_idchecksumchecksum_algorithm_body.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package_ota_package_idchecksumchecksum_algorithm_body.py new file mode 100644 index 0000000..b980fa6 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ota_package_ota_package_idchecksumchecksum_algorithm_body.py @@ -0,0 +1,113 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OtaPackageOtaPackageIdchecksumchecksumAlgorithmBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'file': 'str' + } + + attribute_map = { + 'file': 'file' + } + + def __init__(self, file=None): # noqa: E501 + """OtaPackageOtaPackageIdchecksumchecksumAlgorithmBody - a model defined in Swagger""" # noqa: E501 + self._file = None + self.discriminator = None + self.file = file + + @property + def file(self): + """Gets the file of this OtaPackageOtaPackageIdchecksumchecksumAlgorithmBody. # noqa: E501 + + file # noqa: E501 + + :return: The file of this OtaPackageOtaPackageIdchecksumchecksumAlgorithmBody. # noqa: E501 + :rtype: str + """ + return self._file + + @file.setter + def file(self, file): + """Sets the file of this OtaPackageOtaPackageIdchecksumchecksumAlgorithmBody. + + file # noqa: E501 + + :param file: The file of this OtaPackageOtaPackageIdchecksumchecksumAlgorithmBody. # noqa: E501 + :type: str + """ + if file is None: + raise ValueError("Invalid value for `file`, must not be `None`") # noqa: E501 + + self._file = file + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OtaPackageOtaPackageIdchecksumchecksumAlgorithmBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OtaPackageOtaPackageIdchecksumchecksumAlgorithmBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_alarm_data.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_alarm_data.py new file mode 100644 index 0000000..8f19211 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_alarm_data.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataAlarmData(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[AlarmData]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataAlarmData - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataAlarmData. # noqa: E501 + + + :return: The data of this PageDataAlarmData. # noqa: E501 + :rtype: list[AlarmData] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataAlarmData. + + + :param data: The data of this PageDataAlarmData. # noqa: E501 + :type: list[AlarmData] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataAlarmData. # noqa: E501 + + + :return: The has_next of this PageDataAlarmData. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataAlarmData. + + + :param has_next: The has_next of this PageDataAlarmData. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataAlarmData. # noqa: E501 + + + :return: The total_elements of this PageDataAlarmData. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataAlarmData. + + + :param total_elements: The total_elements of this PageDataAlarmData. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataAlarmData. # noqa: E501 + + + :return: The total_pages of this PageDataAlarmData. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataAlarmData. + + + :param total_pages: The total_pages of this PageDataAlarmData. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataAlarmData, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataAlarmData): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_alarm_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_alarm_info.py new file mode 100644 index 0000000..0e9bec8 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_alarm_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataAlarmInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[AlarmInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataAlarmInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataAlarmInfo. # noqa: E501 + + + :return: The data of this PageDataAlarmInfo. # noqa: E501 + :rtype: list[AlarmInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataAlarmInfo. + + + :param data: The data of this PageDataAlarmInfo. # noqa: E501 + :type: list[AlarmInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataAlarmInfo. # noqa: E501 + + + :return: The has_next of this PageDataAlarmInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataAlarmInfo. + + + :param has_next: The has_next of this PageDataAlarmInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataAlarmInfo. # noqa: E501 + + + :return: The total_elements of this PageDataAlarmInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataAlarmInfo. + + + :param total_elements: The total_elements of this PageDataAlarmInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataAlarmInfo. # noqa: E501 + + + :return: The total_pages of this PageDataAlarmInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataAlarmInfo. + + + :param total_pages: The total_pages of this PageDataAlarmInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataAlarmInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataAlarmInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_asset.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_asset.py new file mode 100644 index 0000000..338343e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_asset.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataAsset(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[Asset]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataAsset - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataAsset. # noqa: E501 + + + :return: The data of this PageDataAsset. # noqa: E501 + :rtype: list[Asset] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataAsset. + + + :param data: The data of this PageDataAsset. # noqa: E501 + :type: list[Asset] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataAsset. # noqa: E501 + + + :return: The has_next of this PageDataAsset. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataAsset. + + + :param has_next: The has_next of this PageDataAsset. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataAsset. # noqa: E501 + + + :return: The total_elements of this PageDataAsset. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataAsset. + + + :param total_elements: The total_elements of this PageDataAsset. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataAsset. # noqa: E501 + + + :return: The total_pages of this PageDataAsset. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataAsset. + + + :param total_pages: The total_pages of this PageDataAsset. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataAsset, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataAsset): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_asset_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_asset_info.py new file mode 100644 index 0000000..356e990 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_asset_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataAssetInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[AssetInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataAssetInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataAssetInfo. # noqa: E501 + + + :return: The data of this PageDataAssetInfo. # noqa: E501 + :rtype: list[AssetInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataAssetInfo. + + + :param data: The data of this PageDataAssetInfo. # noqa: E501 + :type: list[AssetInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataAssetInfo. # noqa: E501 + + + :return: The has_next of this PageDataAssetInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataAssetInfo. + + + :param has_next: The has_next of this PageDataAssetInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataAssetInfo. # noqa: E501 + + + :return: The total_elements of this PageDataAssetInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataAssetInfo. + + + :param total_elements: The total_elements of this PageDataAssetInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataAssetInfo. # noqa: E501 + + + :return: The total_pages of this PageDataAssetInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataAssetInfo. + + + :param total_pages: The total_pages of this PageDataAssetInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataAssetInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataAssetInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_audit_log.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_audit_log.py new file mode 100644 index 0000000..a59f5ad --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_audit_log.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataAuditLog(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[AuditLog]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataAuditLog - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataAuditLog. # noqa: E501 + + + :return: The data of this PageDataAuditLog. # noqa: E501 + :rtype: list[AuditLog] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataAuditLog. + + + :param data: The data of this PageDataAuditLog. # noqa: E501 + :type: list[AuditLog] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataAuditLog. # noqa: E501 + + + :return: The has_next of this PageDataAuditLog. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataAuditLog. + + + :param has_next: The has_next of this PageDataAuditLog. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataAuditLog. # noqa: E501 + + + :return: The total_elements of this PageDataAuditLog. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataAuditLog. + + + :param total_elements: The total_elements of this PageDataAuditLog. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataAuditLog. # noqa: E501 + + + :return: The total_pages of this PageDataAuditLog. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataAuditLog. + + + :param total_pages: The total_pages of this PageDataAuditLog. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataAuditLog, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataAuditLog): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_customer.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_customer.py new file mode 100644 index 0000000..1908c41 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_customer.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataCustomer(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[Customer]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataCustomer - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataCustomer. # noqa: E501 + + + :return: The data of this PageDataCustomer. # noqa: E501 + :rtype: list[Customer] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataCustomer. + + + :param data: The data of this PageDataCustomer. # noqa: E501 + :type: list[Customer] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataCustomer. # noqa: E501 + + + :return: The has_next of this PageDataCustomer. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataCustomer. + + + :param has_next: The has_next of this PageDataCustomer. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataCustomer. # noqa: E501 + + + :return: The total_elements of this PageDataCustomer. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataCustomer. + + + :param total_elements: The total_elements of this PageDataCustomer. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataCustomer. # noqa: E501 + + + :return: The total_pages of this PageDataCustomer. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataCustomer. + + + :param total_pages: The total_pages of this PageDataCustomer. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataCustomer, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataCustomer): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_dashboard_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_dashboard_info.py new file mode 100644 index 0000000..9d058bb --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_dashboard_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataDashboardInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[DashboardInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataDashboardInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataDashboardInfo. # noqa: E501 + + + :return: The data of this PageDataDashboardInfo. # noqa: E501 + :rtype: list[DashboardInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataDashboardInfo. + + + :param data: The data of this PageDataDashboardInfo. # noqa: E501 + :type: list[DashboardInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataDashboardInfo. # noqa: E501 + + + :return: The has_next of this PageDataDashboardInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataDashboardInfo. + + + :param has_next: The has_next of this PageDataDashboardInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataDashboardInfo. # noqa: E501 + + + :return: The total_elements of this PageDataDashboardInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataDashboardInfo. + + + :param total_elements: The total_elements of this PageDataDashboardInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataDashboardInfo. # noqa: E501 + + + :return: The total_pages of this PageDataDashboardInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataDashboardInfo. + + + :param total_pages: The total_pages of this PageDataDashboardInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataDashboardInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataDashboardInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device.py new file mode 100644 index 0000000..e3bdb47 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataDevice(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[Device]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataDevice - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataDevice. # noqa: E501 + + + :return: The data of this PageDataDevice. # noqa: E501 + :rtype: list[Device] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataDevice. + + + :param data: The data of this PageDataDevice. # noqa: E501 + :type: list[Device] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataDevice. # noqa: E501 + + + :return: The has_next of this PageDataDevice. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataDevice. + + + :param has_next: The has_next of this PageDataDevice. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataDevice. # noqa: E501 + + + :return: The total_elements of this PageDataDevice. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataDevice. + + + :param total_elements: The total_elements of this PageDataDevice. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataDevice. # noqa: E501 + + + :return: The total_pages of this PageDataDevice. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataDevice. + + + :param total_pages: The total_pages of this PageDataDevice. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataDevice, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataDevice): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device_info.py new file mode 100644 index 0000000..5e59340 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataDeviceInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[DeviceInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataDeviceInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataDeviceInfo. # noqa: E501 + + + :return: The data of this PageDataDeviceInfo. # noqa: E501 + :rtype: list[DeviceInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataDeviceInfo. + + + :param data: The data of this PageDataDeviceInfo. # noqa: E501 + :type: list[DeviceInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataDeviceInfo. # noqa: E501 + + + :return: The has_next of this PageDataDeviceInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataDeviceInfo. + + + :param has_next: The has_next of this PageDataDeviceInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataDeviceInfo. # noqa: E501 + + + :return: The total_elements of this PageDataDeviceInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataDeviceInfo. + + + :param total_elements: The total_elements of this PageDataDeviceInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataDeviceInfo. # noqa: E501 + + + :return: The total_pages of this PageDataDeviceInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataDeviceInfo. + + + :param total_pages: The total_pages of this PageDataDeviceInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataDeviceInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataDeviceInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device_profile.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device_profile.py new file mode 100644 index 0000000..6ecbc34 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device_profile.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataDeviceProfile(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[DeviceProfile]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataDeviceProfile - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataDeviceProfile. # noqa: E501 + + + :return: The data of this PageDataDeviceProfile. # noqa: E501 + :rtype: list[DeviceProfile] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataDeviceProfile. + + + :param data: The data of this PageDataDeviceProfile. # noqa: E501 + :type: list[DeviceProfile] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataDeviceProfile. # noqa: E501 + + + :return: The has_next of this PageDataDeviceProfile. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataDeviceProfile. + + + :param has_next: The has_next of this PageDataDeviceProfile. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataDeviceProfile. # noqa: E501 + + + :return: The total_elements of this PageDataDeviceProfile. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataDeviceProfile. + + + :param total_elements: The total_elements of this PageDataDeviceProfile. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataDeviceProfile. # noqa: E501 + + + :return: The total_pages of this PageDataDeviceProfile. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataDeviceProfile. + + + :param total_pages: The total_pages of this PageDataDeviceProfile. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataDeviceProfile, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataDeviceProfile): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device_profile_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device_profile_info.py new file mode 100644 index 0000000..1d848fd --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_device_profile_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataDeviceProfileInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[DeviceProfileInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataDeviceProfileInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataDeviceProfileInfo. # noqa: E501 + + + :return: The data of this PageDataDeviceProfileInfo. # noqa: E501 + :rtype: list[DeviceProfileInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataDeviceProfileInfo. + + + :param data: The data of this PageDataDeviceProfileInfo. # noqa: E501 + :type: list[DeviceProfileInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataDeviceProfileInfo. # noqa: E501 + + + :return: The has_next of this PageDataDeviceProfileInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataDeviceProfileInfo. + + + :param has_next: The has_next of this PageDataDeviceProfileInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataDeviceProfileInfo. # noqa: E501 + + + :return: The total_elements of this PageDataDeviceProfileInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataDeviceProfileInfo. + + + :param total_elements: The total_elements of this PageDataDeviceProfileInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataDeviceProfileInfo. # noqa: E501 + + + :return: The total_pages of this PageDataDeviceProfileInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataDeviceProfileInfo. + + + :param total_pages: The total_pages of this PageDataDeviceProfileInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataDeviceProfileInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataDeviceProfileInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_edge.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_edge.py new file mode 100644 index 0000000..ead69cf --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_edge.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataEdge(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[Edge]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataEdge - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataEdge. # noqa: E501 + + + :return: The data of this PageDataEdge. # noqa: E501 + :rtype: list[Edge] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataEdge. + + + :param data: The data of this PageDataEdge. # noqa: E501 + :type: list[Edge] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataEdge. # noqa: E501 + + + :return: The has_next of this PageDataEdge. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataEdge. + + + :param has_next: The has_next of this PageDataEdge. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataEdge. # noqa: E501 + + + :return: The total_elements of this PageDataEdge. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataEdge. + + + :param total_elements: The total_elements of this PageDataEdge. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataEdge. # noqa: E501 + + + :return: The total_pages of this PageDataEdge. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataEdge. + + + :param total_pages: The total_pages of this PageDataEdge. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataEdge, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataEdge): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_edge_event.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_edge_event.py new file mode 100644 index 0000000..361239f --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_edge_event.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataEdgeEvent(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[EdgeEvent]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataEdgeEvent - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataEdgeEvent. # noqa: E501 + + + :return: The data of this PageDataEdgeEvent. # noqa: E501 + :rtype: list[EdgeEvent] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataEdgeEvent. + + + :param data: The data of this PageDataEdgeEvent. # noqa: E501 + :type: list[EdgeEvent] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataEdgeEvent. # noqa: E501 + + + :return: The has_next of this PageDataEdgeEvent. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataEdgeEvent. + + + :param has_next: The has_next of this PageDataEdgeEvent. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataEdgeEvent. # noqa: E501 + + + :return: The total_elements of this PageDataEdgeEvent. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataEdgeEvent. + + + :param total_elements: The total_elements of this PageDataEdgeEvent. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataEdgeEvent. # noqa: E501 + + + :return: The total_pages of this PageDataEdgeEvent. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataEdgeEvent. + + + :param total_pages: The total_pages of this PageDataEdgeEvent. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataEdgeEvent, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataEdgeEvent): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_edge_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_edge_info.py new file mode 100644 index 0000000..fa627c0 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_edge_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataEdgeInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[EdgeInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataEdgeInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataEdgeInfo. # noqa: E501 + + + :return: The data of this PageDataEdgeInfo. # noqa: E501 + :rtype: list[EdgeInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataEdgeInfo. + + + :param data: The data of this PageDataEdgeInfo. # noqa: E501 + :type: list[EdgeInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataEdgeInfo. # noqa: E501 + + + :return: The has_next of this PageDataEdgeInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataEdgeInfo. + + + :param has_next: The has_next of this PageDataEdgeInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataEdgeInfo. # noqa: E501 + + + :return: The total_elements of this PageDataEdgeInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataEdgeInfo. + + + :param total_elements: The total_elements of this PageDataEdgeInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataEdgeInfo. # noqa: E501 + + + :return: The total_pages of this PageDataEdgeInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataEdgeInfo. + + + :param total_pages: The total_pages of this PageDataEdgeInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataEdgeInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataEdgeInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_data.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_data.py new file mode 100644 index 0000000..98d6a30 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_data.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataEntityData(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[EntityData]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataEntityData - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataEntityData. # noqa: E501 + + + :return: The data of this PageDataEntityData. # noqa: E501 + :rtype: list[EntityData] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataEntityData. + + + :param data: The data of this PageDataEntityData. # noqa: E501 + :type: list[EntityData] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataEntityData. # noqa: E501 + + + :return: The has_next of this PageDataEntityData. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataEntityData. + + + :param has_next: The has_next of this PageDataEntityData. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataEntityData. # noqa: E501 + + + :return: The total_elements of this PageDataEntityData. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataEntityData. + + + :param total_elements: The total_elements of this PageDataEntityData. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataEntityData. # noqa: E501 + + + :return: The total_pages of this PageDataEntityData. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataEntityData. + + + :param total_pages: The total_pages of this PageDataEntityData. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataEntityData, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataEntityData): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_info.py new file mode 100644 index 0000000..37242d6 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataEntityInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[EntityInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataEntityInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataEntityInfo. # noqa: E501 + + + :return: The data of this PageDataEntityInfo. # noqa: E501 + :rtype: list[EntityInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataEntityInfo. + + + :param data: The data of this PageDataEntityInfo. # noqa: E501 + :type: list[EntityInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataEntityInfo. # noqa: E501 + + + :return: The has_next of this PageDataEntityInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataEntityInfo. + + + :param has_next: The has_next of this PageDataEntityInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataEntityInfo. # noqa: E501 + + + :return: The total_elements of this PageDataEntityInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataEntityInfo. + + + :param total_elements: The total_elements of this PageDataEntityInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataEntityInfo. # noqa: E501 + + + :return: The total_pages of this PageDataEntityInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataEntityInfo. + + + :param total_pages: The total_pages of this PageDataEntityInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataEntityInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataEntityInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_view.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_view.py new file mode 100644 index 0000000..18af4ac --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_view.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataEntityView(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[EntityView]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataEntityView - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataEntityView. # noqa: E501 + + + :return: The data of this PageDataEntityView. # noqa: E501 + :rtype: list[EntityView] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataEntityView. + + + :param data: The data of this PageDataEntityView. # noqa: E501 + :type: list[EntityView] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataEntityView. # noqa: E501 + + + :return: The has_next of this PageDataEntityView. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataEntityView. + + + :param has_next: The has_next of this PageDataEntityView. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataEntityView. # noqa: E501 + + + :return: The total_elements of this PageDataEntityView. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataEntityView. + + + :param total_elements: The total_elements of this PageDataEntityView. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataEntityView. # noqa: E501 + + + :return: The total_pages of this PageDataEntityView. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataEntityView. + + + :param total_pages: The total_pages of this PageDataEntityView. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataEntityView, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataEntityView): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_view_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_view_info.py new file mode 100644 index 0000000..779ac7b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_entity_view_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataEntityViewInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[EntityViewInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataEntityViewInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataEntityViewInfo. # noqa: E501 + + + :return: The data of this PageDataEntityViewInfo. # noqa: E501 + :rtype: list[EntityViewInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataEntityViewInfo. + + + :param data: The data of this PageDataEntityViewInfo. # noqa: E501 + :type: list[EntityViewInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataEntityViewInfo. # noqa: E501 + + + :return: The has_next of this PageDataEntityViewInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataEntityViewInfo. + + + :param has_next: The has_next of this PageDataEntityViewInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataEntityViewInfo. # noqa: E501 + + + :return: The total_elements of this PageDataEntityViewInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataEntityViewInfo. + + + :param total_elements: The total_elements of this PageDataEntityViewInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataEntityViewInfo. # noqa: E501 + + + :return: The total_pages of this PageDataEntityViewInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataEntityViewInfo. + + + :param total_pages: The total_pages of this PageDataEntityViewInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataEntityViewInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataEntityViewInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_event.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_event.py new file mode 100644 index 0000000..546d50f --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_event.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataEvent(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[Event]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataEvent - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataEvent. # noqa: E501 + + + :return: The data of this PageDataEvent. # noqa: E501 + :rtype: list[Event] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataEvent. + + + :param data: The data of this PageDataEvent. # noqa: E501 + :type: list[Event] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataEvent. # noqa: E501 + + + :return: The has_next of this PageDataEvent. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataEvent. + + + :param has_next: The has_next of this PageDataEvent. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataEvent. # noqa: E501 + + + :return: The total_elements of this PageDataEvent. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataEvent. + + + :param total_elements: The total_elements of this PageDataEvent. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataEvent. # noqa: E501 + + + :return: The total_pages of this PageDataEvent. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataEvent. + + + :param total_pages: The total_pages of this PageDataEvent. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataEvent, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataEvent): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_ota_package_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_ota_package_info.py new file mode 100644 index 0000000..f72cbd0 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_ota_package_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataOtaPackageInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[OtaPackageInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataOtaPackageInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataOtaPackageInfo. # noqa: E501 + + + :return: The data of this PageDataOtaPackageInfo. # noqa: E501 + :rtype: list[OtaPackageInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataOtaPackageInfo. + + + :param data: The data of this PageDataOtaPackageInfo. # noqa: E501 + :type: list[OtaPackageInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataOtaPackageInfo. # noqa: E501 + + + :return: The has_next of this PageDataOtaPackageInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataOtaPackageInfo. + + + :param has_next: The has_next of this PageDataOtaPackageInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataOtaPackageInfo. # noqa: E501 + + + :return: The total_elements of this PageDataOtaPackageInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataOtaPackageInfo. + + + :param total_elements: The total_elements of this PageDataOtaPackageInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataOtaPackageInfo. # noqa: E501 + + + :return: The total_pages of this PageDataOtaPackageInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataOtaPackageInfo. + + + :param total_pages: The total_pages of this PageDataOtaPackageInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataOtaPackageInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataOtaPackageInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_rpc.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_rpc.py new file mode 100644 index 0000000..843b0dc --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_rpc.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataRpc(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[Rpc]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataRpc - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataRpc. # noqa: E501 + + + :return: The data of this PageDataRpc. # noqa: E501 + :rtype: list[Rpc] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataRpc. + + + :param data: The data of this PageDataRpc. # noqa: E501 + :type: list[Rpc] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataRpc. # noqa: E501 + + + :return: The has_next of this PageDataRpc. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataRpc. + + + :param has_next: The has_next of this PageDataRpc. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataRpc. # noqa: E501 + + + :return: The total_elements of this PageDataRpc. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataRpc. + + + :param total_elements: The total_elements of this PageDataRpc. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataRpc. # noqa: E501 + + + :return: The total_pages of this PageDataRpc. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataRpc. + + + :param total_pages: The total_pages of this PageDataRpc. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataRpc, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataRpc): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_rule_chain.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_rule_chain.py new file mode 100644 index 0000000..0910b7d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_rule_chain.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataRuleChain(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[RuleChain]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataRuleChain - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataRuleChain. # noqa: E501 + + + :return: The data of this PageDataRuleChain. # noqa: E501 + :rtype: list[RuleChain] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataRuleChain. + + + :param data: The data of this PageDataRuleChain. # noqa: E501 + :type: list[RuleChain] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataRuleChain. # noqa: E501 + + + :return: The has_next of this PageDataRuleChain. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataRuleChain. + + + :param has_next: The has_next of this PageDataRuleChain. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataRuleChain. # noqa: E501 + + + :return: The total_elements of this PageDataRuleChain. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataRuleChain. + + + :param total_elements: The total_elements of this PageDataRuleChain. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataRuleChain. # noqa: E501 + + + :return: The total_pages of this PageDataRuleChain. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataRuleChain. + + + :param total_pages: The total_pages of this PageDataRuleChain. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataRuleChain, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataRuleChain): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tb_resource_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tb_resource_info.py new file mode 100644 index 0000000..2de807b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tb_resource_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataTbResourceInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[TbResourceInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataTbResourceInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataTbResourceInfo. # noqa: E501 + + + :return: The data of this PageDataTbResourceInfo. # noqa: E501 + :rtype: list[TbResourceInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataTbResourceInfo. + + + :param data: The data of this PageDataTbResourceInfo. # noqa: E501 + :type: list[TbResourceInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataTbResourceInfo. # noqa: E501 + + + :return: The has_next of this PageDataTbResourceInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataTbResourceInfo. + + + :param has_next: The has_next of this PageDataTbResourceInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataTbResourceInfo. # noqa: E501 + + + :return: The total_elements of this PageDataTbResourceInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataTbResourceInfo. + + + :param total_elements: The total_elements of this PageDataTbResourceInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataTbResourceInfo. # noqa: E501 + + + :return: The total_pages of this PageDataTbResourceInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataTbResourceInfo. + + + :param total_pages: The total_pages of this PageDataTbResourceInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataTbResourceInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataTbResourceInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tenant.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tenant.py new file mode 100644 index 0000000..cf6492f --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tenant.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataTenant(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[Tenant]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataTenant - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataTenant. # noqa: E501 + + + :return: The data of this PageDataTenant. # noqa: E501 + :rtype: list[Tenant] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataTenant. + + + :param data: The data of this PageDataTenant. # noqa: E501 + :type: list[Tenant] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataTenant. # noqa: E501 + + + :return: The has_next of this PageDataTenant. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataTenant. + + + :param has_next: The has_next of this PageDataTenant. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataTenant. # noqa: E501 + + + :return: The total_elements of this PageDataTenant. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataTenant. + + + :param total_elements: The total_elements of this PageDataTenant. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataTenant. # noqa: E501 + + + :return: The total_pages of this PageDataTenant. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataTenant. + + + :param total_pages: The total_pages of this PageDataTenant. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataTenant, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataTenant): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tenant_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tenant_info.py new file mode 100644 index 0000000..d9f52ab --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tenant_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataTenantInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[TenantInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataTenantInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataTenantInfo. # noqa: E501 + + + :return: The data of this PageDataTenantInfo. # noqa: E501 + :rtype: list[TenantInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataTenantInfo. + + + :param data: The data of this PageDataTenantInfo. # noqa: E501 + :type: list[TenantInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataTenantInfo. # noqa: E501 + + + :return: The has_next of this PageDataTenantInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataTenantInfo. + + + :param has_next: The has_next of this PageDataTenantInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataTenantInfo. # noqa: E501 + + + :return: The total_elements of this PageDataTenantInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataTenantInfo. + + + :param total_elements: The total_elements of this PageDataTenantInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataTenantInfo. # noqa: E501 + + + :return: The total_pages of this PageDataTenantInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataTenantInfo. + + + :param total_pages: The total_pages of this PageDataTenantInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataTenantInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataTenantInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tenant_profile.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tenant_profile.py new file mode 100644 index 0000000..74279c0 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_tenant_profile.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataTenantProfile(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[TenantProfile]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataTenantProfile - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataTenantProfile. # noqa: E501 + + + :return: The data of this PageDataTenantProfile. # noqa: E501 + :rtype: list[TenantProfile] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataTenantProfile. + + + :param data: The data of this PageDataTenantProfile. # noqa: E501 + :type: list[TenantProfile] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataTenantProfile. # noqa: E501 + + + :return: The has_next of this PageDataTenantProfile. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataTenantProfile. + + + :param has_next: The has_next of this PageDataTenantProfile. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataTenantProfile. # noqa: E501 + + + :return: The total_elements of this PageDataTenantProfile. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataTenantProfile. + + + :param total_elements: The total_elements of this PageDataTenantProfile. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataTenantProfile. # noqa: E501 + + + :return: The total_pages of this PageDataTenantProfile. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataTenantProfile. + + + :param total_pages: The total_pages of this PageDataTenantProfile. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataTenantProfile, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataTenantProfile): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_user.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_user.py new file mode 100644 index 0000000..c5ecdc1 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_user.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataUser(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[User]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataUser - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataUser. # noqa: E501 + + + :return: The data of this PageDataUser. # noqa: E501 + :rtype: list[User] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataUser. + + + :param data: The data of this PageDataUser. # noqa: E501 + :type: list[User] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataUser. # noqa: E501 + + + :return: The has_next of this PageDataUser. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataUser. + + + :param has_next: The has_next of this PageDataUser. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataUser. # noqa: E501 + + + :return: The total_elements of this PageDataUser. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataUser. + + + :param total_elements: The total_elements of this PageDataUser. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataUser. # noqa: E501 + + + :return: The total_pages of this PageDataUser. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataUser. + + + :param total_pages: The total_pages of this PageDataUser. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataUser, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataUser): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_widgets_bundle.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_widgets_bundle.py new file mode 100644 index 0000000..9a86173 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/page_data_widgets_bundle.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataWidgetsBundle(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[WidgetsBundle]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataWidgetsBundle - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataWidgetsBundle. # noqa: E501 + + + :return: The data of this PageDataWidgetsBundle. # noqa: E501 + :rtype: list[WidgetsBundle] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataWidgetsBundle. + + + :param data: The data of this PageDataWidgetsBundle. # noqa: E501 + :type: list[WidgetsBundle] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataWidgetsBundle. # noqa: E501 + + + :return: The has_next of this PageDataWidgetsBundle. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataWidgetsBundle. + + + :param has_next: The has_next of this PageDataWidgetsBundle. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataWidgetsBundle. # noqa: E501 + + + :return: The total_elements of this PageDataWidgetsBundle. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataWidgetsBundle. + + + :param total_elements: The total_elements of this PageDataWidgetsBundle. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataWidgetsBundle. # noqa: E501 + + + :return: The total_pages of this PageDataWidgetsBundle. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataWidgetsBundle. + + + :param total_pages: The total_pages of this PageDataWidgetsBundle. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataWidgetsBundle, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataWidgetsBundle): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/relation_entity_type_filter.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/relation_entity_type_filter.py new file mode 100644 index 0000000..cfcdb20 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/relation_entity_type_filter.py @@ -0,0 +1,145 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RelationEntityTypeFilter(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'relation_type': 'str', + 'entity_types': 'list[str]' + } + + attribute_map = { + 'relation_type': 'relationType', + 'entity_types': 'entityTypes' + } + + def __init__(self, relation_type=None, entity_types=None): # noqa: E501 + """RelationEntityTypeFilter - a model defined in Swagger""" # noqa: E501 + self._relation_type = None + self._entity_types = None + self.discriminator = None + self.relation_type = relation_type + self.entity_types = entity_types + + @property + def relation_type(self): + """Gets the relation_type of this RelationEntityTypeFilter. # noqa: E501 + + + :return: The relation_type of this RelationEntityTypeFilter. # noqa: E501 + :rtype: str + """ + return self._relation_type + + @relation_type.setter + def relation_type(self, relation_type): + """Sets the relation_type of this RelationEntityTypeFilter. + + + :param relation_type: The relation_type of this RelationEntityTypeFilter. # noqa: E501 + :type: str + """ + if relation_type is None: + raise ValueError("Invalid value for `relation_type`, must not be `None`") # noqa: E501 + + self._relation_type = relation_type + + @property + def entity_types(self): + """Gets the entity_types of this RelationEntityTypeFilter. # noqa: E501 + + + :return: The entity_types of this RelationEntityTypeFilter. # noqa: E501 + :rtype: list[str] + """ + return self._entity_types + + @entity_types.setter + def entity_types(self, entity_types): + """Sets the entity_types of this RelationEntityTypeFilter. + + + :param entity_types: The entity_types of this RelationEntityTypeFilter. # noqa: E501 + :type: list[str] + """ + if entity_types is None: + raise ValueError("Invalid value for `entity_types`, must not be `None`") # noqa: E501 + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "RULE_CHAIN", "RULE_NODE", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if not set(entity_types).issubset(set(allowed_values)): + raise ValueError( + "Invalid values for `entity_types` [{0}], must be a subset of [{1}]" # noqa: E501 + .format(", ".join(map(str, set(entity_types) - set(allowed_values))), # noqa: E501 + ", ".join(map(str, allowed_values))) + ) + + self._entity_types = entity_types + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RelationEntityTypeFilter, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RelationEntityTypeFilter): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/relations_search_parameters.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/relations_search_parameters.py new file mode 100644 index 0000000..772bede --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/relations_search_parameters.py @@ -0,0 +1,290 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RelationsSearchParameters(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_id': 'EntityId', + 'root_id': 'str', + 'root_type': 'str', + 'direction': 'str', + 'relation_type_group': 'str', + 'max_level': 'int', + 'fetch_last_level_only': 'bool' + } + + attribute_map = { + 'entity_id': 'entityId', + 'root_id': 'rootId', + 'root_type': 'rootType', + 'direction': 'direction', + 'relation_type_group': 'relationTypeGroup', + 'max_level': 'maxLevel', + 'fetch_last_level_only': 'fetchLastLevelOnly' + } + + def __init__(self, entity_id=None, root_id=None, root_type=None, direction=None, relation_type_group=None, max_level=None, fetch_last_level_only=None): # noqa: E501 + """RelationsSearchParameters - a model defined in Swagger""" # noqa: E501 + self._entity_id = None + self._root_id = None + self._root_type = None + self._direction = None + self._relation_type_group = None + self._max_level = None + self._fetch_last_level_only = None + self.discriminator = None + if entity_id is not None: + self.entity_id = entity_id + self.root_id = root_id + self.root_type = root_type + self.direction = direction + self.relation_type_group = relation_type_group + self.max_level = max_level + self.fetch_last_level_only = fetch_last_level_only + + @property + def entity_id(self): + """Gets the entity_id of this RelationsSearchParameters. # noqa: E501 + + + :return: The entity_id of this RelationsSearchParameters. # noqa: E501 + :rtype: EntityId + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this RelationsSearchParameters. + + + :param entity_id: The entity_id of this RelationsSearchParameters. # noqa: E501 + :type: EntityId + """ + + self._entity_id = entity_id + + @property + def root_id(self): + """Gets the root_id of this RelationsSearchParameters. # noqa: E501 + + + :return: The root_id of this RelationsSearchParameters. # noqa: E501 + :rtype: str + """ + return self._root_id + + @root_id.setter + def root_id(self, root_id): + """Sets the root_id of this RelationsSearchParameters. + + + :param root_id: The root_id of this RelationsSearchParameters. # noqa: E501 + :type: str + """ + if root_id is None: + raise ValueError("Invalid value for `root_id`, must not be `None`") # noqa: E501 + + self._root_id = root_id + + @property + def root_type(self): + """Gets the root_type of this RelationsSearchParameters. # noqa: E501 + + + :return: The root_type of this RelationsSearchParameters. # noqa: E501 + :rtype: str + """ + return self._root_type + + @root_type.setter + def root_type(self, root_type): + """Sets the root_type of this RelationsSearchParameters. + + + :param root_type: The root_type of this RelationsSearchParameters. # noqa: E501 + :type: str + """ + if root_type is None: + raise ValueError("Invalid value for `root_type`, must not be `None`") # noqa: E501 + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "RULE_CHAIN", "RULE_NODE", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if root_type not in allowed_values: + raise ValueError( + "Invalid value for `root_type` ({0}), must be one of {1}" # noqa: E501 + .format(root_type, allowed_values) + ) + + self._root_type = root_type + + @property + def direction(self): + """Gets the direction of this RelationsSearchParameters. # noqa: E501 + + + :return: The direction of this RelationsSearchParameters. # noqa: E501 + :rtype: str + """ + return self._direction + + @direction.setter + def direction(self, direction): + """Sets the direction of this RelationsSearchParameters. + + + :param direction: The direction of this RelationsSearchParameters. # noqa: E501 + :type: str + """ + if direction is None: + raise ValueError("Invalid value for `direction`, must not be `None`") # noqa: E501 + allowed_values = ["FROM", "TO"] # noqa: E501 + if direction not in allowed_values: + raise ValueError( + "Invalid value for `direction` ({0}), must be one of {1}" # noqa: E501 + .format(direction, allowed_values) + ) + + self._direction = direction + + @property + def relation_type_group(self): + """Gets the relation_type_group of this RelationsSearchParameters. # noqa: E501 + + + :return: The relation_type_group of this RelationsSearchParameters. # noqa: E501 + :rtype: str + """ + return self._relation_type_group + + @relation_type_group.setter + def relation_type_group(self, relation_type_group): + """Sets the relation_type_group of this RelationsSearchParameters. + + + :param relation_type_group: The relation_type_group of this RelationsSearchParameters. # noqa: E501 + :type: str + """ + if relation_type_group is None: + raise ValueError("Invalid value for `relation_type_group`, must not be `None`") # noqa: E501 + allowed_values = ["COMMON", "ALARM", "DASHBOARD", "RULE_CHAIN", "RULE_NODE", "EDGE", "EDGE_AUTO_ASSIGN_RULE_CHAIN"] # noqa: E501 + if relation_type_group not in allowed_values: + raise ValueError( + "Invalid value for `relation_type_group` ({0}), must be one of {1}" # noqa: E501 + .format(relation_type_group, allowed_values) + ) + + self._relation_type_group = relation_type_group + + @property + def max_level(self): + """Gets the max_level of this RelationsSearchParameters. # noqa: E501 + + + :return: The max_level of this RelationsSearchParameters. # noqa: E501 + :rtype: int + """ + return self._max_level + + @max_level.setter + def max_level(self, max_level): + """Sets the max_level of this RelationsSearchParameters. + + + :param max_level: The max_level of this RelationsSearchParameters. # noqa: E501 + :type: int + """ + if max_level is None: + raise ValueError("Invalid value for `max_level`, must not be `None`") # noqa: E501 + + self._max_level = max_level + + @property + def fetch_last_level_only(self): + """Gets the fetch_last_level_only of this RelationsSearchParameters. # noqa: E501 + + + :return: The fetch_last_level_only of this RelationsSearchParameters. # noqa: E501 + :rtype: bool + """ + return self._fetch_last_level_only + + @fetch_last_level_only.setter + def fetch_last_level_only(self, fetch_last_level_only): + """Sets the fetch_last_level_only of this RelationsSearchParameters. + + + :param fetch_last_level_only: The fetch_last_level_only of this RelationsSearchParameters. # noqa: E501 + :type: bool + """ + if fetch_last_level_only is None: + raise ValueError("Invalid value for `fetch_last_level_only`, must not be `None`") # noqa: E501 + + self._fetch_last_level_only = fetch_last_level_only + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RelationsSearchParameters, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RelationsSearchParameters): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/resource.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/resource.py new file mode 100644 index 0000000..8900e69 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/resource.py @@ -0,0 +1,292 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Resource(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'description': 'str', + 'file': 'file', + 'filename': 'str', + 'input_stream': 'InputStream', + 'open': 'bool', + 'readable': 'bool', + 'uri': 'URI', + 'url': 'URL' + } + + attribute_map = { + 'description': 'description', + 'file': 'file', + 'filename': 'filename', + 'input_stream': 'inputStream', + 'open': 'open', + 'readable': 'readable', + 'uri': 'uri', + 'url': 'url' + } + + def __init__(self, description=None, file=None, filename=None, input_stream=None, open=None, readable=None, uri=None, url=None): # noqa: E501 + """Resource - a model defined in Swagger""" # noqa: E501 + self._description = None + self._file = None + self._filename = None + self._input_stream = None + self._open = None + self._readable = None + self._uri = None + self._url = None + self.discriminator = None + if description is not None: + self.description = description + if file is not None: + self.file = file + if filename is not None: + self.filename = filename + if input_stream is not None: + self.input_stream = input_stream + if open is not None: + self.open = open + if readable is not None: + self.readable = readable + if uri is not None: + self.uri = uri + if url is not None: + self.url = url + + @property + def description(self): + """Gets the description of this Resource. # noqa: E501 + + + :return: The description of this Resource. # noqa: E501 + :rtype: str + """ + return self._description + + @description.setter + def description(self, description): + """Sets the description of this Resource. + + + :param description: The description of this Resource. # noqa: E501 + :type: str + """ + + self._description = description + + @property + def file(self): + """Gets the file of this Resource. # noqa: E501 + + + :return: The file of this Resource. # noqa: E501 + :rtype: file + """ + return self._file + + @file.setter + def file(self, file): + """Sets the file of this Resource. + + + :param file: The file of this Resource. # noqa: E501 + :type: file + """ + + self._file = file + + @property + def filename(self): + """Gets the filename of this Resource. # noqa: E501 + + + :return: The filename of this Resource. # noqa: E501 + :rtype: str + """ + return self._filename + + @filename.setter + def filename(self, filename): + """Sets the filename of this Resource. + + + :param filename: The filename of this Resource. # noqa: E501 + :type: str + """ + + self._filename = filename + + @property + def input_stream(self): + """Gets the input_stream of this Resource. # noqa: E501 + + + :return: The input_stream of this Resource. # noqa: E501 + :rtype: InputStream + """ + return self._input_stream + + @input_stream.setter + def input_stream(self, input_stream): + """Sets the input_stream of this Resource. + + + :param input_stream: The input_stream of this Resource. # noqa: E501 + :type: InputStream + """ + + self._input_stream = input_stream + + @property + def open(self): + """Gets the open of this Resource. # noqa: E501 + + + :return: The open of this Resource. # noqa: E501 + :rtype: bool + """ + return self._open + + @open.setter + def open(self, open): + """Sets the open of this Resource. + + + :param open: The open of this Resource. # noqa: E501 + :type: bool + """ + + self._open = open + + @property + def readable(self): + """Gets the readable of this Resource. # noqa: E501 + + + :return: The readable of this Resource. # noqa: E501 + :rtype: bool + """ + return self._readable + + @readable.setter + def readable(self, readable): + """Sets the readable of this Resource. + + + :param readable: The readable of this Resource. # noqa: E501 + :type: bool + """ + + self._readable = readable + + @property + def uri(self): + """Gets the uri of this Resource. # noqa: E501 + + + :return: The uri of this Resource. # noqa: E501 + :rtype: URI + """ + return self._uri + + @uri.setter + def uri(self, uri): + """Sets the uri of this Resource. + + + :param uri: The uri of this Resource. # noqa: E501 + :type: URI + """ + + self._uri = uri + + @property + def url(self): + """Gets the url of this Resource. # noqa: E501 + + + :return: The url of this Resource. # noqa: E501 + :rtype: URL + """ + return self._url + + @url.setter + def url(self, url): + """Sets the url of this Resource. + + + :param url: The url of this Resource. # noqa: E501 + :type: URL + """ + + self._url = url + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Resource, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Resource): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/response_entity.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/response_entity.py new file mode 100644 index 0000000..3b3b703 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/response_entity.py @@ -0,0 +1,168 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ResponseEntity(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'body': 'object', + 'status_code': 'str', + 'status_code_value': 'int' + } + + attribute_map = { + 'body': 'body', + 'status_code': 'statusCode', + 'status_code_value': 'statusCodeValue' + } + + def __init__(self, body=None, status_code=None, status_code_value=None): # noqa: E501 + """ResponseEntity - a model defined in Swagger""" # noqa: E501 + self._body = None + self._status_code = None + self._status_code_value = None + self.discriminator = None + if body is not None: + self.body = body + if status_code is not None: + self.status_code = status_code + if status_code_value is not None: + self.status_code_value = status_code_value + + @property + def body(self): + """Gets the body of this ResponseEntity. # noqa: E501 + + + :return: The body of this ResponseEntity. # noqa: E501 + :rtype: object + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this ResponseEntity. + + + :param body: The body of this ResponseEntity. # noqa: E501 + :type: object + """ + + self._body = body + + @property + def status_code(self): + """Gets the status_code of this ResponseEntity. # noqa: E501 + + + :return: The status_code of this ResponseEntity. # noqa: E501 + :rtype: str + """ + return self._status_code + + @status_code.setter + def status_code(self, status_code): + """Sets the status_code of this ResponseEntity. + + + :param status_code: The status_code of this ResponseEntity. # noqa: E501 + :type: str + """ + allowed_values = ["100 CONTINUE", "101 SWITCHING_PROTOCOLS", "102 PROCESSING", "103 CHECKPOINT", "200 OK", "201 CREATED", "202 ACCEPTED", "203 NON_AUTHORITATIVE_INFORMATION", "204 NO_CONTENT", "205 RESET_CONTENT", "206 PARTIAL_CONTENT", "207 MULTI_STATUS", "208 ALREADY_REPORTED", "226 IM_USED", "300 MULTIPLE_CHOICES", "301 MOVED_PERMANENTLY", "302 FOUND", "302 MOVED_TEMPORARILY", "303 SEE_OTHER", "304 NOT_MODIFIED", "305 USE_PROXY", "307 TEMPORARY_REDIRECT", "308 PERMANENT_REDIRECT", "400 BAD_REQUEST", "401 UNAUTHORIZED", "402 PAYMENT_REQUIRED", "403 FORBIDDEN", "404 NOT_FOUND", "405 METHOD_NOT_ALLOWED", "406 NOT_ACCEPTABLE", "407 PROXY_AUTHENTICATION_REQUIRED", "408 REQUEST_TIMEOUT", "409 CONFLICT", "410 GONE", "411 LENGTH_REQUIRED", "412 PRECONDITION_FAILED", "413 PAYLOAD_TOO_LARGE", "413 REQUEST_ENTITY_TOO_LARGE", "414 URI_TOO_LONG", "414 REQUEST_URI_TOO_LONG", "415 UNSUPPORTED_MEDIA_TYPE", "416 REQUESTED_RANGE_NOT_SATISFIABLE", "417 EXPECTATION_FAILED", "418 I_AM_A_TEAPOT", "419 INSUFFICIENT_SPACE_ON_RESOURCE", "420 METHOD_FAILURE", "421 DESTINATION_LOCKED", "422 UNPROCESSABLE_ENTITY", "423 LOCKED", "424 FAILED_DEPENDENCY", "425 TOO_EARLY", "426 UPGRADE_REQUIRED", "428 PRECONDITION_REQUIRED", "429 TOO_MANY_REQUESTS", "431 REQUEST_HEADER_FIELDS_TOO_LARGE", "451 UNAVAILABLE_FOR_LEGAL_REASONS", "500 INTERNAL_SERVER_ERROR", "501 NOT_IMPLEMENTED", "502 BAD_GATEWAY", "503 SERVICE_UNAVAILABLE", "504 GATEWAY_TIMEOUT", "505 HTTP_VERSION_NOT_SUPPORTED", "506 VARIANT_ALSO_NEGOTIATES", "507 INSUFFICIENT_STORAGE", "508 LOOP_DETECTED", "509 BANDWIDTH_LIMIT_EXCEEDED", "510 NOT_EXTENDED", "511 NETWORK_AUTHENTICATION_REQUIRED"] # noqa: E501 + if status_code not in allowed_values: + raise ValueError( + "Invalid value for `status_code` ({0}), must be one of {1}" # noqa: E501 + .format(status_code, allowed_values) + ) + + self._status_code = status_code + + @property + def status_code_value(self): + """Gets the status_code_value of this ResponseEntity. # noqa: E501 + + + :return: The status_code_value of this ResponseEntity. # noqa: E501 + :rtype: int + """ + return self._status_code_value + + @status_code_value.setter + def status_code_value(self, status_code_value): + """Sets the status_code_value of this ResponseEntity. + + + :param status_code_value: The status_code_value of this ResponseEntity. # noqa: E501 + :type: int + """ + + self._status_code_value = status_code_value + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ResponseEntity, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ResponseEntity): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rpc.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rpc.py new file mode 100644 index 0000000..95e3a35 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rpc.py @@ -0,0 +1,324 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Rpc(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'device_id': 'DeviceId', + 'expiration_time': 'int', + 'id': 'RpcId', + 'request': 'str', + 'response': 'str', + 'status': 'str', + 'tenant_id': 'TenantId' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'device_id': 'deviceId', + 'expiration_time': 'expirationTime', + 'id': 'id', + 'request': 'request', + 'response': 'response', + 'status': 'status', + 'tenant_id': 'tenantId' + } + + def __init__(self, additional_info=None, created_time=None, device_id=None, expiration_time=None, id=None, request=None, response=None, status=None, tenant_id=None): # noqa: E501 + """Rpc - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._device_id = None + self._expiration_time = None + self._id = None + self._request = None + self._response = None + self._status = None + self._tenant_id = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if device_id is not None: + self.device_id = device_id + if expiration_time is not None: + self.expiration_time = expiration_time + if id is not None: + self.id = id + if request is not None: + self.request = request + if response is not None: + self.response = response + if status is not None: + self.status = status + if tenant_id is not None: + self.tenant_id = tenant_id + + @property + def additional_info(self): + """Gets the additional_info of this Rpc. # noqa: E501 + + + :return: The additional_info of this Rpc. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Rpc. + + + :param additional_info: The additional_info of this Rpc. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this Rpc. # noqa: E501 + + + :return: The created_time of this Rpc. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Rpc. + + + :param created_time: The created_time of this Rpc. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def device_id(self): + """Gets the device_id of this Rpc. # noqa: E501 + + + :return: The device_id of this Rpc. # noqa: E501 + :rtype: DeviceId + """ + return self._device_id + + @device_id.setter + def device_id(self, device_id): + """Sets the device_id of this Rpc. + + + :param device_id: The device_id of this Rpc. # noqa: E501 + :type: DeviceId + """ + + self._device_id = device_id + + @property + def expiration_time(self): + """Gets the expiration_time of this Rpc. # noqa: E501 + + + :return: The expiration_time of this Rpc. # noqa: E501 + :rtype: int + """ + return self._expiration_time + + @expiration_time.setter + def expiration_time(self, expiration_time): + """Sets the expiration_time of this Rpc. + + + :param expiration_time: The expiration_time of this Rpc. # noqa: E501 + :type: int + """ + + self._expiration_time = expiration_time + + @property + def id(self): + """Gets the id of this Rpc. # noqa: E501 + + + :return: The id of this Rpc. # noqa: E501 + :rtype: RpcId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Rpc. + + + :param id: The id of this Rpc. # noqa: E501 + :type: RpcId + """ + + self._id = id + + @property + def request(self): + """Gets the request of this Rpc. # noqa: E501 + + + :return: The request of this Rpc. # noqa: E501 + :rtype: str + """ + return self._request + + @request.setter + def request(self, request): + """Sets the request of this Rpc. + + + :param request: The request of this Rpc. # noqa: E501 + :type: str + """ + + self._request = request + + @property + def response(self): + """Gets the response of this Rpc. # noqa: E501 + + + :return: The response of this Rpc. # noqa: E501 + :rtype: str + """ + return self._response + + @response.setter + def response(self, response): + """Sets the response of this Rpc. + + + :param response: The response of this Rpc. # noqa: E501 + :type: str + """ + + self._response = response + + @property + def status(self): + """Gets the status of this Rpc. # noqa: E501 + + + :return: The status of this Rpc. # noqa: E501 + :rtype: str + """ + return self._status + + @status.setter + def status(self, status): + """Sets the status of this Rpc. + + + :param status: The status of this Rpc. # noqa: E501 + :type: str + """ + allowed_values = ["QUEUED", "DELIVERED", "SUCCESSFUL", "TIMEOUT", "FAILED"] # noqa: E501 + if status not in allowed_values: + raise ValueError( + "Invalid value for `status` ({0}), must be one of {1}" # noqa: E501 + .format(status, allowed_values) + ) + + self._status = status + + @property + def tenant_id(self): + """Gets the tenant_id of this Rpc. # noqa: E501 + + + :return: The tenant_id of this Rpc. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Rpc. + + + :param tenant_id: The tenant_id of this Rpc. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Rpc, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Rpc): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rpc_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rpc_id.py new file mode 100644 index 0000000..d45b2b4 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rpc_id.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RpcId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'str' + } + + attribute_map = { + 'id': 'id' + } + + def __init__(self, id=None): # noqa: E501 + """RpcId - a model defined in Swagger""" # noqa: E501 + self._id = None + self.discriminator = None + if id is not None: + self.id = id + + @property + def id(self): + """Gets the id of this RpcId. # noqa: E501 + + + :return: The id of this RpcId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this RpcId. + + + :param id: The id of this RpcId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RpcId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RpcId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain.py new file mode 100644 index 0000000..01d42f3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain.py @@ -0,0 +1,350 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RuleChain(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'configuration': 'str', + 'created_time': 'int', + 'debug_mode': 'bool', + 'first_rule_node_id': 'RuleNodeId', + 'id': 'RuleChainId', + 'name': 'str', + 'root': 'bool', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'configuration': 'configuration', + 'created_time': 'createdTime', + 'debug_mode': 'debugMode', + 'first_rule_node_id': 'firstRuleNodeId', + 'id': 'id', + 'name': 'name', + 'root': 'root', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, configuration=None, created_time=None, debug_mode=None, first_rule_node_id=None, id=None, name=None, root=None, tenant_id=None, type=None): # noqa: E501 + """RuleChain - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._configuration = None + self._created_time = None + self._debug_mode = None + self._first_rule_node_id = None + self._id = None + self._name = None + self._root = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if configuration is not None: + self.configuration = configuration + if created_time is not None: + self.created_time = created_time + if debug_mode is not None: + self.debug_mode = debug_mode + if first_rule_node_id is not None: + self.first_rule_node_id = first_rule_node_id + if id is not None: + self.id = id + if name is not None: + self.name = name + if root is not None: + self.root = root + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this RuleChain. # noqa: E501 + + + :return: The additional_info of this RuleChain. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this RuleChain. + + + :param additional_info: The additional_info of this RuleChain. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def configuration(self): + """Gets the configuration of this RuleChain. # noqa: E501 + + + :return: The configuration of this RuleChain. # noqa: E501 + :rtype: str + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this RuleChain. + + + :param configuration: The configuration of this RuleChain. # noqa: E501 + :type: str + """ + + self._configuration = configuration + + @property + def created_time(self): + """Gets the created_time of this RuleChain. # noqa: E501 + + + :return: The created_time of this RuleChain. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this RuleChain. + + + :param created_time: The created_time of this RuleChain. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def debug_mode(self): + """Gets the debug_mode of this RuleChain. # noqa: E501 + + + :return: The debug_mode of this RuleChain. # noqa: E501 + :rtype: bool + """ + return self._debug_mode + + @debug_mode.setter + def debug_mode(self, debug_mode): + """Sets the debug_mode of this RuleChain. + + + :param debug_mode: The debug_mode of this RuleChain. # noqa: E501 + :type: bool + """ + + self._debug_mode = debug_mode + + @property + def first_rule_node_id(self): + """Gets the first_rule_node_id of this RuleChain. # noqa: E501 + + + :return: The first_rule_node_id of this RuleChain. # noqa: E501 + :rtype: RuleNodeId + """ + return self._first_rule_node_id + + @first_rule_node_id.setter + def first_rule_node_id(self, first_rule_node_id): + """Sets the first_rule_node_id of this RuleChain. + + + :param first_rule_node_id: The first_rule_node_id of this RuleChain. # noqa: E501 + :type: RuleNodeId + """ + + self._first_rule_node_id = first_rule_node_id + + @property + def id(self): + """Gets the id of this RuleChain. # noqa: E501 + + + :return: The id of this RuleChain. # noqa: E501 + :rtype: RuleChainId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this RuleChain. + + + :param id: The id of this RuleChain. # noqa: E501 + :type: RuleChainId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this RuleChain. # noqa: E501 + + + :return: The name of this RuleChain. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this RuleChain. + + + :param name: The name of this RuleChain. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def root(self): + """Gets the root of this RuleChain. # noqa: E501 + + + :return: The root of this RuleChain. # noqa: E501 + :rtype: bool + """ + return self._root + + @root.setter + def root(self, root): + """Sets the root of this RuleChain. + + + :param root: The root of this RuleChain. # noqa: E501 + :type: bool + """ + + self._root = root + + @property + def tenant_id(self): + """Gets the tenant_id of this RuleChain. # noqa: E501 + + + :return: The tenant_id of this RuleChain. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this RuleChain. + + + :param tenant_id: The tenant_id of this RuleChain. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this RuleChain. # noqa: E501 + + + :return: The type of this RuleChain. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this RuleChain. + + + :param type: The type of this RuleChain. # noqa: E501 + :type: str + """ + allowed_values = ["CORE", "EDGE"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RuleChain, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RuleChain): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_connection_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_connection_info.py new file mode 100644 index 0000000..5608b17 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_connection_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RuleChainConnectionInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'from_index': 'int', + 'target_rule_chain_id': 'RuleChainId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'from_index': 'fromIndex', + 'target_rule_chain_id': 'targetRuleChainId', + 'type': 'type' + } + + def __init__(self, additional_info=None, from_index=None, target_rule_chain_id=None, type=None): # noqa: E501 + """RuleChainConnectionInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._from_index = None + self._target_rule_chain_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if from_index is not None: + self.from_index = from_index + if target_rule_chain_id is not None: + self.target_rule_chain_id = target_rule_chain_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this RuleChainConnectionInfo. # noqa: E501 + + + :return: The additional_info of this RuleChainConnectionInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this RuleChainConnectionInfo. + + + :param additional_info: The additional_info of this RuleChainConnectionInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def from_index(self): + """Gets the from_index of this RuleChainConnectionInfo. # noqa: E501 + + + :return: The from_index of this RuleChainConnectionInfo. # noqa: E501 + :rtype: int + """ + return self._from_index + + @from_index.setter + def from_index(self, from_index): + """Sets the from_index of this RuleChainConnectionInfo. + + + :param from_index: The from_index of this RuleChainConnectionInfo. # noqa: E501 + :type: int + """ + + self._from_index = from_index + + @property + def target_rule_chain_id(self): + """Gets the target_rule_chain_id of this RuleChainConnectionInfo. # noqa: E501 + + + :return: The target_rule_chain_id of this RuleChainConnectionInfo. # noqa: E501 + :rtype: RuleChainId + """ + return self._target_rule_chain_id + + @target_rule_chain_id.setter + def target_rule_chain_id(self, target_rule_chain_id): + """Sets the target_rule_chain_id of this RuleChainConnectionInfo. + + + :param target_rule_chain_id: The target_rule_chain_id of this RuleChainConnectionInfo. # noqa: E501 + :type: RuleChainId + """ + + self._target_rule_chain_id = target_rule_chain_id + + @property + def type(self): + """Gets the type of this RuleChainConnectionInfo. # noqa: E501 + + + :return: The type of this RuleChainConnectionInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this RuleChainConnectionInfo. + + + :param type: The type of this RuleChainConnectionInfo. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RuleChainConnectionInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RuleChainConnectionInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_data.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_data.py new file mode 100644 index 0000000..144ec4b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_data.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RuleChainData(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'metadata': 'list[RuleChainMetaData]', + 'rule_chains': 'list[RuleChain]' + } + + attribute_map = { + 'metadata': 'metadata', + 'rule_chains': 'ruleChains' + } + + def __init__(self, metadata=None, rule_chains=None): # noqa: E501 + """RuleChainData - a model defined in Swagger""" # noqa: E501 + self._metadata = None + self._rule_chains = None + self.discriminator = None + if metadata is not None: + self.metadata = metadata + if rule_chains is not None: + self.rule_chains = rule_chains + + @property + def metadata(self): + """Gets the metadata of this RuleChainData. # noqa: E501 + + + :return: The metadata of this RuleChainData. # noqa: E501 + :rtype: list[RuleChainMetaData] + """ + return self._metadata + + @metadata.setter + def metadata(self, metadata): + """Sets the metadata of this RuleChainData. + + + :param metadata: The metadata of this RuleChainData. # noqa: E501 + :type: list[RuleChainMetaData] + """ + + self._metadata = metadata + + @property + def rule_chains(self): + """Gets the rule_chains of this RuleChainData. # noqa: E501 + + + :return: The rule_chains of this RuleChainData. # noqa: E501 + :rtype: list[RuleChain] + """ + return self._rule_chains + + @rule_chains.setter + def rule_chains(self, rule_chains): + """Sets the rule_chains of this RuleChainData. + + + :param rule_chains: The rule_chains of this RuleChainData. # noqa: E501 + :type: list[RuleChain] + """ + + self._rule_chains = rule_chains + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RuleChainData, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RuleChainData): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_id.py new file mode 100644 index 0000000..6d69c4b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_id.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RuleChainId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'str' + } + + attribute_map = { + 'id': 'id' + } + + def __init__(self, id=None): # noqa: E501 + """RuleChainId - a model defined in Swagger""" # noqa: E501 + self._id = None + self.discriminator = None + if id is not None: + self.id = id + + @property + def id(self): + """Gets the id of this RuleChainId. # noqa: E501 + + + :return: The id of this RuleChainId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this RuleChainId. + + + :param id: The id of this RuleChainId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RuleChainId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RuleChainId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_meta_data.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_meta_data.py new file mode 100644 index 0000000..6609146 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_chain_meta_data.py @@ -0,0 +1,214 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RuleChainMetaData(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'connections': 'list[NodeConnectionInfo]', + 'first_node_index': 'int', + 'nodes': 'list[RuleNode]', + 'rule_chain_connections': 'list[RuleChainConnectionInfo]', + 'rule_chain_id': 'RuleChainId' + } + + attribute_map = { + 'connections': 'connections', + 'first_node_index': 'firstNodeIndex', + 'nodes': 'nodes', + 'rule_chain_connections': 'ruleChainConnections', + 'rule_chain_id': 'ruleChainId' + } + + def __init__(self, connections=None, first_node_index=None, nodes=None, rule_chain_connections=None, rule_chain_id=None): # noqa: E501 + """RuleChainMetaData - a model defined in Swagger""" # noqa: E501 + self._connections = None + self._first_node_index = None + self._nodes = None + self._rule_chain_connections = None + self._rule_chain_id = None + self.discriminator = None + if connections is not None: + self.connections = connections + if first_node_index is not None: + self.first_node_index = first_node_index + if nodes is not None: + self.nodes = nodes + if rule_chain_connections is not None: + self.rule_chain_connections = rule_chain_connections + if rule_chain_id is not None: + self.rule_chain_id = rule_chain_id + + @property + def connections(self): + """Gets the connections of this RuleChainMetaData. # noqa: E501 + + + :return: The connections of this RuleChainMetaData. # noqa: E501 + :rtype: list[NodeConnectionInfo] + """ + return self._connections + + @connections.setter + def connections(self, connections): + """Sets the connections of this RuleChainMetaData. + + + :param connections: The connections of this RuleChainMetaData. # noqa: E501 + :type: list[NodeConnectionInfo] + """ + + self._connections = connections + + @property + def first_node_index(self): + """Gets the first_node_index of this RuleChainMetaData. # noqa: E501 + + + :return: The first_node_index of this RuleChainMetaData. # noqa: E501 + :rtype: int + """ + return self._first_node_index + + @first_node_index.setter + def first_node_index(self, first_node_index): + """Sets the first_node_index of this RuleChainMetaData. + + + :param first_node_index: The first_node_index of this RuleChainMetaData. # noqa: E501 + :type: int + """ + + self._first_node_index = first_node_index + + @property + def nodes(self): + """Gets the nodes of this RuleChainMetaData. # noqa: E501 + + + :return: The nodes of this RuleChainMetaData. # noqa: E501 + :rtype: list[RuleNode] + """ + return self._nodes + + @nodes.setter + def nodes(self, nodes): + """Sets the nodes of this RuleChainMetaData. + + + :param nodes: The nodes of this RuleChainMetaData. # noqa: E501 + :type: list[RuleNode] + """ + + self._nodes = nodes + + @property + def rule_chain_connections(self): + """Gets the rule_chain_connections of this RuleChainMetaData. # noqa: E501 + + + :return: The rule_chain_connections of this RuleChainMetaData. # noqa: E501 + :rtype: list[RuleChainConnectionInfo] + """ + return self._rule_chain_connections + + @rule_chain_connections.setter + def rule_chain_connections(self, rule_chain_connections): + """Sets the rule_chain_connections of this RuleChainMetaData. + + + :param rule_chain_connections: The rule_chain_connections of this RuleChainMetaData. # noqa: E501 + :type: list[RuleChainConnectionInfo] + """ + + self._rule_chain_connections = rule_chain_connections + + @property + def rule_chain_id(self): + """Gets the rule_chain_id of this RuleChainMetaData. # noqa: E501 + + + :return: The rule_chain_id of this RuleChainMetaData. # noqa: E501 + :rtype: RuleChainId + """ + return self._rule_chain_id + + @rule_chain_id.setter + def rule_chain_id(self, rule_chain_id): + """Sets the rule_chain_id of this RuleChainMetaData. + + + :param rule_chain_id: The rule_chain_id of this RuleChainMetaData. # noqa: E501 + :type: RuleChainId + """ + + self._rule_chain_id = rule_chain_id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RuleChainMetaData, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RuleChainMetaData): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_node.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_node.py new file mode 100644 index 0000000..1b67086 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_node.py @@ -0,0 +1,292 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RuleNode(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'configuration': 'str', + 'created_time': 'int', + 'debug_mode': 'bool', + 'id': 'RuleNodeId', + 'name': 'str', + 'rule_chain_id': 'RuleChainId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'configuration': 'configuration', + 'created_time': 'createdTime', + 'debug_mode': 'debugMode', + 'id': 'id', + 'name': 'name', + 'rule_chain_id': 'ruleChainId', + 'type': 'type' + } + + def __init__(self, additional_info=None, configuration=None, created_time=None, debug_mode=None, id=None, name=None, rule_chain_id=None, type=None): # noqa: E501 + """RuleNode - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._configuration = None + self._created_time = None + self._debug_mode = None + self._id = None + self._name = None + self._rule_chain_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if configuration is not None: + self.configuration = configuration + if created_time is not None: + self.created_time = created_time + if debug_mode is not None: + self.debug_mode = debug_mode + if id is not None: + self.id = id + if name is not None: + self.name = name + if rule_chain_id is not None: + self.rule_chain_id = rule_chain_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this RuleNode. # noqa: E501 + + + :return: The additional_info of this RuleNode. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this RuleNode. + + + :param additional_info: The additional_info of this RuleNode. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def configuration(self): + """Gets the configuration of this RuleNode. # noqa: E501 + + + :return: The configuration of this RuleNode. # noqa: E501 + :rtype: str + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this RuleNode. + + + :param configuration: The configuration of this RuleNode. # noqa: E501 + :type: str + """ + + self._configuration = configuration + + @property + def created_time(self): + """Gets the created_time of this RuleNode. # noqa: E501 + + + :return: The created_time of this RuleNode. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this RuleNode. + + + :param created_time: The created_time of this RuleNode. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def debug_mode(self): + """Gets the debug_mode of this RuleNode. # noqa: E501 + + + :return: The debug_mode of this RuleNode. # noqa: E501 + :rtype: bool + """ + return self._debug_mode + + @debug_mode.setter + def debug_mode(self, debug_mode): + """Sets the debug_mode of this RuleNode. + + + :param debug_mode: The debug_mode of this RuleNode. # noqa: E501 + :type: bool + """ + + self._debug_mode = debug_mode + + @property + def id(self): + """Gets the id of this RuleNode. # noqa: E501 + + + :return: The id of this RuleNode. # noqa: E501 + :rtype: RuleNodeId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this RuleNode. + + + :param id: The id of this RuleNode. # noqa: E501 + :type: RuleNodeId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this RuleNode. # noqa: E501 + + + :return: The name of this RuleNode. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this RuleNode. + + + :param name: The name of this RuleNode. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def rule_chain_id(self): + """Gets the rule_chain_id of this RuleNode. # noqa: E501 + + + :return: The rule_chain_id of this RuleNode. # noqa: E501 + :rtype: RuleChainId + """ + return self._rule_chain_id + + @rule_chain_id.setter + def rule_chain_id(self, rule_chain_id): + """Sets the rule_chain_id of this RuleNode. + + + :param rule_chain_id: The rule_chain_id of this RuleNode. # noqa: E501 + :type: RuleChainId + """ + + self._rule_chain_id = rule_chain_id + + @property + def type(self): + """Gets the type of this RuleNode. # noqa: E501 + + + :return: The type of this RuleNode. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this RuleNode. + + + :param type: The type of this RuleNode. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RuleNode, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RuleNode): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_node_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_node_id.py new file mode 100644 index 0000000..627ef0e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/rule_node_id.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RuleNodeId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'str' + } + + attribute_map = { + 'id': 'id' + } + + def __init__(self, id=None): # noqa: E501 + """RuleNodeId - a model defined in Swagger""" # noqa: E501 + self._id = None + self.discriminator = None + if id is not None: + self.id = id + + @property + def id(self): + """Gets the id of this RuleNodeId. # noqa: E501 + + + :return: The id of this RuleNodeId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this RuleNodeId. + + + :param id: The id of this RuleNodeId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RuleNodeId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RuleNodeId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/save_ota_package_info_request.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/save_ota_package_info_request.py new file mode 100644 index 0000000..26f136b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/save_ota_package_info_request.py @@ -0,0 +1,538 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class SaveOtaPackageInfoRequest(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'checksum': 'str', + 'checksum_algorithm': 'str', + 'content_type': 'str', + 'created_time': 'int', + 'data_size': 'int', + 'device_profile_id': 'DeviceProfileId', + 'file_name': 'str', + 'has_data': 'bool', + 'id': 'OtaPackageId', + 'tag': 'str', + 'tenant_id': 'TenantId', + 'title': 'str', + 'type': 'str', + 'url': 'str', + 'uses_url': 'bool', + 'version': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'checksum': 'checksum', + 'checksum_algorithm': 'checksumAlgorithm', + 'content_type': 'contentType', + 'created_time': 'createdTime', + 'data_size': 'dataSize', + 'device_profile_id': 'deviceProfileId', + 'file_name': 'fileName', + 'has_data': 'hasData', + 'id': 'id', + 'tag': 'tag', + 'tenant_id': 'tenantId', + 'title': 'title', + 'type': 'type', + 'url': 'url', + 'uses_url': 'usesUrl', + 'version': 'version' + } + + def __init__(self, additional_info=None, checksum=None, checksum_algorithm=None, content_type=None, created_time=None, data_size=None, device_profile_id=None, file_name=None, has_data=None, id=None, tag=None, tenant_id=None, title=None, type=None, url=None, uses_url=None, version=None): # noqa: E501 + """SaveOtaPackageInfoRequest - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._checksum = None + self._checksum_algorithm = None + self._content_type = None + self._created_time = None + self._data_size = None + self._device_profile_id = None + self._file_name = None + self._has_data = None + self._id = None + self._tag = None + self._tenant_id = None + self._title = None + self._type = None + self._url = None + self._uses_url = None + self._version = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if checksum is not None: + self.checksum = checksum + if checksum_algorithm is not None: + self.checksum_algorithm = checksum_algorithm + if content_type is not None: + self.content_type = content_type + if created_time is not None: + self.created_time = created_time + if data_size is not None: + self.data_size = data_size + if device_profile_id is not None: + self.device_profile_id = device_profile_id + if file_name is not None: + self.file_name = file_name + if has_data is not None: + self.has_data = has_data + if id is not None: + self.id = id + if tag is not None: + self.tag = tag + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + if type is not None: + self.type = type + if url is not None: + self.url = url + if uses_url is not None: + self.uses_url = uses_url + if version is not None: + self.version = version + + @property + def additional_info(self): + """Gets the additional_info of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The additional_info of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this SaveOtaPackageInfoRequest. + + + :param additional_info: The additional_info of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def checksum(self): + """Gets the checksum of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The checksum of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: str + """ + return self._checksum + + @checksum.setter + def checksum(self, checksum): + """Sets the checksum of this SaveOtaPackageInfoRequest. + + + :param checksum: The checksum of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: str + """ + + self._checksum = checksum + + @property + def checksum_algorithm(self): + """Gets the checksum_algorithm of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The checksum_algorithm of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: str + """ + return self._checksum_algorithm + + @checksum_algorithm.setter + def checksum_algorithm(self, checksum_algorithm): + """Sets the checksum_algorithm of this SaveOtaPackageInfoRequest. + + + :param checksum_algorithm: The checksum_algorithm of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: str + """ + allowed_values = ["MD5", "SHA256", "SHA384", "SHA512", "CRC32", "MURMUR3_32", "MURMUR3_128"] # noqa: E501 + if checksum_algorithm not in allowed_values: + raise ValueError( + "Invalid value for `checksum_algorithm` ({0}), must be one of {1}" # noqa: E501 + .format(checksum_algorithm, allowed_values) + ) + + self._checksum_algorithm = checksum_algorithm + + @property + def content_type(self): + """Gets the content_type of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The content_type of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: str + """ + return self._content_type + + @content_type.setter + def content_type(self, content_type): + """Sets the content_type of this SaveOtaPackageInfoRequest. + + + :param content_type: The content_type of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: str + """ + + self._content_type = content_type + + @property + def created_time(self): + """Gets the created_time of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The created_time of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this SaveOtaPackageInfoRequest. + + + :param created_time: The created_time of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def data_size(self): + """Gets the data_size of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The data_size of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: int + """ + return self._data_size + + @data_size.setter + def data_size(self, data_size): + """Sets the data_size of this SaveOtaPackageInfoRequest. + + + :param data_size: The data_size of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: int + """ + + self._data_size = data_size + + @property + def device_profile_id(self): + """Gets the device_profile_id of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The device_profile_id of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: DeviceProfileId + """ + return self._device_profile_id + + @device_profile_id.setter + def device_profile_id(self, device_profile_id): + """Sets the device_profile_id of this SaveOtaPackageInfoRequest. + + + :param device_profile_id: The device_profile_id of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: DeviceProfileId + """ + + self._device_profile_id = device_profile_id + + @property + def file_name(self): + """Gets the file_name of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The file_name of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: str + """ + return self._file_name + + @file_name.setter + def file_name(self, file_name): + """Sets the file_name of this SaveOtaPackageInfoRequest. + + + :param file_name: The file_name of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: str + """ + + self._file_name = file_name + + @property + def has_data(self): + """Gets the has_data of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The has_data of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: bool + """ + return self._has_data + + @has_data.setter + def has_data(self, has_data): + """Sets the has_data of this SaveOtaPackageInfoRequest. + + + :param has_data: The has_data of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: bool + """ + + self._has_data = has_data + + @property + def id(self): + """Gets the id of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The id of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: OtaPackageId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this SaveOtaPackageInfoRequest. + + + :param id: The id of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: OtaPackageId + """ + + self._id = id + + @property + def tag(self): + """Gets the tag of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The tag of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: str + """ + return self._tag + + @tag.setter + def tag(self, tag): + """Sets the tag of this SaveOtaPackageInfoRequest. + + + :param tag: The tag of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: str + """ + + self._tag = tag + + @property + def tenant_id(self): + """Gets the tenant_id of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The tenant_id of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this SaveOtaPackageInfoRequest. + + + :param tenant_id: The tenant_id of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The title of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this SaveOtaPackageInfoRequest. + + + :param title: The title of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def type(self): + """Gets the type of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The type of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this SaveOtaPackageInfoRequest. + + + :param type: The type of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: str + """ + allowed_values = ["FIRMWARE", "SOFTWARE"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + @property + def url(self): + """Gets the url of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The url of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: str + """ + return self._url + + @url.setter + def url(self, url): + """Sets the url of this SaveOtaPackageInfoRequest. + + + :param url: The url of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: str + """ + + self._url = url + + @property + def uses_url(self): + """Gets the uses_url of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The uses_url of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: bool + """ + return self._uses_url + + @uses_url.setter + def uses_url(self, uses_url): + """Sets the uses_url of this SaveOtaPackageInfoRequest. + + + :param uses_url: The uses_url of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: bool + """ + + self._uses_url = uses_url + + @property + def version(self): + """Gets the version of this SaveOtaPackageInfoRequest. # noqa: E501 + + + :return: The version of this SaveOtaPackageInfoRequest. # noqa: E501 + :rtype: str + """ + return self._version + + @version.setter + def version(self, version): + """Sets the version of this SaveOtaPackageInfoRequest. + + + :param version: The version of this SaveOtaPackageInfoRequest. # noqa: E501 + :type: str + """ + + self._version = version + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SaveOtaPackageInfoRequest, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SaveOtaPackageInfoRequest): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/security_settings.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/security_settings.py new file mode 100644 index 0000000..623feb5 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/security_settings.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class SecuritySettings(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'max_failed_login_attempts': 'int', + 'password_policy': 'UserPasswordPolicy', + 'user_lockout_notification_email': 'str' + } + + attribute_map = { + 'max_failed_login_attempts': 'maxFailedLoginAttempts', + 'password_policy': 'passwordPolicy', + 'user_lockout_notification_email': 'userLockoutNotificationEmail' + } + + def __init__(self, max_failed_login_attempts=None, password_policy=None, user_lockout_notification_email=None): # noqa: E501 + """SecuritySettings - a model defined in Swagger""" # noqa: E501 + self._max_failed_login_attempts = None + self._password_policy = None + self._user_lockout_notification_email = None + self.discriminator = None + if max_failed_login_attempts is not None: + self.max_failed_login_attempts = max_failed_login_attempts + if password_policy is not None: + self.password_policy = password_policy + if user_lockout_notification_email is not None: + self.user_lockout_notification_email = user_lockout_notification_email + + @property + def max_failed_login_attempts(self): + """Gets the max_failed_login_attempts of this SecuritySettings. # noqa: E501 + + + :return: The max_failed_login_attempts of this SecuritySettings. # noqa: E501 + :rtype: int + """ + return self._max_failed_login_attempts + + @max_failed_login_attempts.setter + def max_failed_login_attempts(self, max_failed_login_attempts): + """Sets the max_failed_login_attempts of this SecuritySettings. + + + :param max_failed_login_attempts: The max_failed_login_attempts of this SecuritySettings. # noqa: E501 + :type: int + """ + + self._max_failed_login_attempts = max_failed_login_attempts + + @property + def password_policy(self): + """Gets the password_policy of this SecuritySettings. # noqa: E501 + + + :return: The password_policy of this SecuritySettings. # noqa: E501 + :rtype: UserPasswordPolicy + """ + return self._password_policy + + @password_policy.setter + def password_policy(self, password_policy): + """Sets the password_policy of this SecuritySettings. + + + :param password_policy: The password_policy of this SecuritySettings. # noqa: E501 + :type: UserPasswordPolicy + """ + + self._password_policy = password_policy + + @property + def user_lockout_notification_email(self): + """Gets the user_lockout_notification_email of this SecuritySettings. # noqa: E501 + + + :return: The user_lockout_notification_email of this SecuritySettings. # noqa: E501 + :rtype: str + """ + return self._user_lockout_notification_email + + @user_lockout_notification_email.setter + def user_lockout_notification_email(self, user_lockout_notification_email): + """Sets the user_lockout_notification_email of this SecuritySettings. + + + :param user_lockout_notification_email: The user_lockout_notification_email of this SecuritySettings. # noqa: E501 + :type: str + """ + + self._user_lockout_notification_email = user_lockout_notification_email + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SecuritySettings, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SecuritySettings): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/server_security_config.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/server_security_config.py new file mode 100644 index 0000000..062935b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/server_security_config.py @@ -0,0 +1,318 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ServerSecurityConfig(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'bootstrap_server_account_timeout': 'int', + 'bootstrap_server_is': 'bool', + 'client_hold_off_time': 'int', + 'host': 'str', + 'port': 'int', + 'security_host': 'str', + 'security_port': 'int', + 'server_id': 'int', + 'server_public_key': 'str' + } + + attribute_map = { + 'bootstrap_server_account_timeout': 'bootstrapServerAccountTimeout', + 'bootstrap_server_is': 'bootstrapServerIs', + 'client_hold_off_time': 'clientHoldOffTime', + 'host': 'host', + 'port': 'port', + 'security_host': 'securityHost', + 'security_port': 'securityPort', + 'server_id': 'serverId', + 'server_public_key': 'serverPublicKey' + } + + def __init__(self, bootstrap_server_account_timeout=None, bootstrap_server_is=None, client_hold_off_time=None, host=None, port=None, security_host=None, security_port=None, server_id=None, server_public_key=None): # noqa: E501 + """ServerSecurityConfig - a model defined in Swagger""" # noqa: E501 + self._bootstrap_server_account_timeout = None + self._bootstrap_server_is = None + self._client_hold_off_time = None + self._host = None + self._port = None + self._security_host = None + self._security_port = None + self._server_id = None + self._server_public_key = None + self.discriminator = None + if bootstrap_server_account_timeout is not None: + self.bootstrap_server_account_timeout = bootstrap_server_account_timeout + if bootstrap_server_is is not None: + self.bootstrap_server_is = bootstrap_server_is + if client_hold_off_time is not None: + self.client_hold_off_time = client_hold_off_time + if host is not None: + self.host = host + if port is not None: + self.port = port + if security_host is not None: + self.security_host = security_host + if security_port is not None: + self.security_port = security_port + if server_id is not None: + self.server_id = server_id + if server_public_key is not None: + self.server_public_key = server_public_key + + @property + def bootstrap_server_account_timeout(self): + """Gets the bootstrap_server_account_timeout of this ServerSecurityConfig. # noqa: E501 + + + :return: The bootstrap_server_account_timeout of this ServerSecurityConfig. # noqa: E501 + :rtype: int + """ + return self._bootstrap_server_account_timeout + + @bootstrap_server_account_timeout.setter + def bootstrap_server_account_timeout(self, bootstrap_server_account_timeout): + """Sets the bootstrap_server_account_timeout of this ServerSecurityConfig. + + + :param bootstrap_server_account_timeout: The bootstrap_server_account_timeout of this ServerSecurityConfig. # noqa: E501 + :type: int + """ + + self._bootstrap_server_account_timeout = bootstrap_server_account_timeout + + @property + def bootstrap_server_is(self): + """Gets the bootstrap_server_is of this ServerSecurityConfig. # noqa: E501 + + + :return: The bootstrap_server_is of this ServerSecurityConfig. # noqa: E501 + :rtype: bool + """ + return self._bootstrap_server_is + + @bootstrap_server_is.setter + def bootstrap_server_is(self, bootstrap_server_is): + """Sets the bootstrap_server_is of this ServerSecurityConfig. + + + :param bootstrap_server_is: The bootstrap_server_is of this ServerSecurityConfig. # noqa: E501 + :type: bool + """ + + self._bootstrap_server_is = bootstrap_server_is + + @property + def client_hold_off_time(self): + """Gets the client_hold_off_time of this ServerSecurityConfig. # noqa: E501 + + + :return: The client_hold_off_time of this ServerSecurityConfig. # noqa: E501 + :rtype: int + """ + return self._client_hold_off_time + + @client_hold_off_time.setter + def client_hold_off_time(self, client_hold_off_time): + """Sets the client_hold_off_time of this ServerSecurityConfig. + + + :param client_hold_off_time: The client_hold_off_time of this ServerSecurityConfig. # noqa: E501 + :type: int + """ + + self._client_hold_off_time = client_hold_off_time + + @property + def host(self): + """Gets the host of this ServerSecurityConfig. # noqa: E501 + + + :return: The host of this ServerSecurityConfig. # noqa: E501 + :rtype: str + """ + return self._host + + @host.setter + def host(self, host): + """Sets the host of this ServerSecurityConfig. + + + :param host: The host of this ServerSecurityConfig. # noqa: E501 + :type: str + """ + + self._host = host + + @property + def port(self): + """Gets the port of this ServerSecurityConfig. # noqa: E501 + + + :return: The port of this ServerSecurityConfig. # noqa: E501 + :rtype: int + """ + return self._port + + @port.setter + def port(self, port): + """Sets the port of this ServerSecurityConfig. + + + :param port: The port of this ServerSecurityConfig. # noqa: E501 + :type: int + """ + + self._port = port + + @property + def security_host(self): + """Gets the security_host of this ServerSecurityConfig. # noqa: E501 + + + :return: The security_host of this ServerSecurityConfig. # noqa: E501 + :rtype: str + """ + return self._security_host + + @security_host.setter + def security_host(self, security_host): + """Sets the security_host of this ServerSecurityConfig. + + + :param security_host: The security_host of this ServerSecurityConfig. # noqa: E501 + :type: str + """ + + self._security_host = security_host + + @property + def security_port(self): + """Gets the security_port of this ServerSecurityConfig. # noqa: E501 + + + :return: The security_port of this ServerSecurityConfig. # noqa: E501 + :rtype: int + """ + return self._security_port + + @security_port.setter + def security_port(self, security_port): + """Sets the security_port of this ServerSecurityConfig. + + + :param security_port: The security_port of this ServerSecurityConfig. # noqa: E501 + :type: int + """ + + self._security_port = security_port + + @property + def server_id(self): + """Gets the server_id of this ServerSecurityConfig. # noqa: E501 + + + :return: The server_id of this ServerSecurityConfig. # noqa: E501 + :rtype: int + """ + return self._server_id + + @server_id.setter + def server_id(self, server_id): + """Sets the server_id of this ServerSecurityConfig. + + + :param server_id: The server_id of this ServerSecurityConfig. # noqa: E501 + :type: int + """ + + self._server_id = server_id + + @property + def server_public_key(self): + """Gets the server_public_key of this ServerSecurityConfig. # noqa: E501 + + + :return: The server_public_key of this ServerSecurityConfig. # noqa: E501 + :rtype: str + """ + return self._server_public_key + + @server_public_key.setter + def server_public_key(self, server_public_key): + """Sets the server_public_key of this ServerSecurityConfig. + + + :param server_public_key: The server_public_key of this ServerSecurityConfig. # noqa: E501 + :type: str + """ + + self._server_public_key = server_public_key + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ServerSecurityConfig, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ServerSecurityConfig): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/short_customer_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/short_customer_info.py new file mode 100644 index 0000000..049ff01 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/short_customer_info.py @@ -0,0 +1,189 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ShortCustomerInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'customer_id': 'CustomerId', + 'public': 'bool', + 'title': 'str', + 'is_public': 'bool' + } + + attribute_map = { + 'customer_id': 'customerId', + 'public': 'public', + 'title': 'title', + 'is_public': 'isPublic' + } + + def __init__(self, customer_id=None, public=None, title=None, is_public=None): # noqa: E501 + """ShortCustomerInfo - a model defined in Swagger""" # noqa: E501 + self._customer_id = None + self._public = None + self._title = None + self._is_public = None + self.discriminator = None + if customer_id is not None: + self.customer_id = customer_id + if public is not None: + self.public = public + if title is not None: + self.title = title + self.is_public = is_public + + @property + def customer_id(self): + """Gets the customer_id of this ShortCustomerInfo. # noqa: E501 + + + :return: The customer_id of this ShortCustomerInfo. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this ShortCustomerInfo. + + + :param customer_id: The customer_id of this ShortCustomerInfo. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def public(self): + """Gets the public of this ShortCustomerInfo. # noqa: E501 + + + :return: The public of this ShortCustomerInfo. # noqa: E501 + :rtype: bool + """ + return self._public + + @public.setter + def public(self, public): + """Sets the public of this ShortCustomerInfo. + + + :param public: The public of this ShortCustomerInfo. # noqa: E501 + :type: bool + """ + + self._public = public + + @property + def title(self): + """Gets the title of this ShortCustomerInfo. # noqa: E501 + + + :return: The title of this ShortCustomerInfo. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this ShortCustomerInfo. + + + :param title: The title of this ShortCustomerInfo. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def is_public(self): + """Gets the is_public of this ShortCustomerInfo. # noqa: E501 + + + :return: The is_public of this ShortCustomerInfo. # noqa: E501 + :rtype: bool + """ + return self._is_public + + @is_public.setter + def is_public(self, is_public): + """Sets the is_public of this ShortCustomerInfo. + + + :param is_public: The is_public of this ShortCustomerInfo. # noqa: E501 + :type: bool + """ + if is_public is None: + raise ValueError("Invalid value for `is_public`, must not be `None`") # noqa: E501 + + self._is_public = is_public + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ShortCustomerInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ShortCustomerInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/sign_up_request.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/sign_up_request.py new file mode 100644 index 0000000..f3cd5e2 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/sign_up_request.py @@ -0,0 +1,214 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class SignUpRequest(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'email': 'str', + 'first_name': 'str', + 'last_name': 'str', + 'password': 'str', + 'recaptcha_response': 'str' + } + + attribute_map = { + 'email': 'email', + 'first_name': 'firstName', + 'last_name': 'lastName', + 'password': 'password', + 'recaptcha_response': 'recaptchaResponse' + } + + def __init__(self, email=None, first_name=None, last_name=None, password=None, recaptcha_response=None): # noqa: E501 + """SignUpRequest - a model defined in Swagger""" # noqa: E501 + self._email = None + self._first_name = None + self._last_name = None + self._password = None + self._recaptcha_response = None + self.discriminator = None + if email is not None: + self.email = email + if first_name is not None: + self.first_name = first_name + if last_name is not None: + self.last_name = last_name + if password is not None: + self.password = password + if recaptcha_response is not None: + self.recaptcha_response = recaptcha_response + + @property + def email(self): + """Gets the email of this SignUpRequest. # noqa: E501 + + + :return: The email of this SignUpRequest. # noqa: E501 + :rtype: str + """ + return self._email + + @email.setter + def email(self, email): + """Sets the email of this SignUpRequest. + + + :param email: The email of this SignUpRequest. # noqa: E501 + :type: str + """ + + self._email = email + + @property + def first_name(self): + """Gets the first_name of this SignUpRequest. # noqa: E501 + + + :return: The first_name of this SignUpRequest. # noqa: E501 + :rtype: str + """ + return self._first_name + + @first_name.setter + def first_name(self, first_name): + """Sets the first_name of this SignUpRequest. + + + :param first_name: The first_name of this SignUpRequest. # noqa: E501 + :type: str + """ + + self._first_name = first_name + + @property + def last_name(self): + """Gets the last_name of this SignUpRequest. # noqa: E501 + + + :return: The last_name of this SignUpRequest. # noqa: E501 + :rtype: str + """ + return self._last_name + + @last_name.setter + def last_name(self, last_name): + """Sets the last_name of this SignUpRequest. + + + :param last_name: The last_name of this SignUpRequest. # noqa: E501 + :type: str + """ + + self._last_name = last_name + + @property + def password(self): + """Gets the password of this SignUpRequest. # noqa: E501 + + + :return: The password of this SignUpRequest. # noqa: E501 + :rtype: str + """ + return self._password + + @password.setter + def password(self, password): + """Sets the password of this SignUpRequest. + + + :param password: The password of this SignUpRequest. # noqa: E501 + :type: str + """ + + self._password = password + + @property + def recaptcha_response(self): + """Gets the recaptcha_response of this SignUpRequest. # noqa: E501 + + + :return: The recaptcha_response of this SignUpRequest. # noqa: E501 + :rtype: str + """ + return self._recaptcha_response + + @recaptcha_response.setter + def recaptcha_response(self, recaptcha_response): + """Sets the recaptcha_response of this SignUpRequest. + + + :param recaptcha_response: The recaptcha_response of this SignUpRequest. # noqa: E501 + :type: str + """ + + self._recaptcha_response = recaptcha_response + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SignUpRequest, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SignUpRequest): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/sms_provider_configuration.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/sms_provider_configuration.py new file mode 100644 index 0000000..7974cb2 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/sms_provider_configuration.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class SmsProviderConfiguration(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """SmsProviderConfiguration - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SmsProviderConfiguration, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SmsProviderConfiguration): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tb_resource.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tb_resource.py new file mode 100644 index 0000000..74d5025 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tb_resource.py @@ -0,0 +1,298 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TbResource(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'created_time': 'int', + 'data': 'str', + 'file_name': 'str', + 'id': 'TbResourceId', + 'resource_key': 'str', + 'resource_type': 'str', + 'tenant_id': 'TenantId', + 'title': 'str' + } + + attribute_map = { + 'created_time': 'createdTime', + 'data': 'data', + 'file_name': 'fileName', + 'id': 'id', + 'resource_key': 'resourceKey', + 'resource_type': 'resourceType', + 'tenant_id': 'tenantId', + 'title': 'title' + } + + def __init__(self, created_time=None, data=None, file_name=None, id=None, resource_key=None, resource_type=None, tenant_id=None, title=None): # noqa: E501 + """TbResource - a model defined in Swagger""" # noqa: E501 + self._created_time = None + self._data = None + self._file_name = None + self._id = None + self._resource_key = None + self._resource_type = None + self._tenant_id = None + self._title = None + self.discriminator = None + if created_time is not None: + self.created_time = created_time + if data is not None: + self.data = data + if file_name is not None: + self.file_name = file_name + if id is not None: + self.id = id + if resource_key is not None: + self.resource_key = resource_key + if resource_type is not None: + self.resource_type = resource_type + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + + @property + def created_time(self): + """Gets the created_time of this TbResource. # noqa: E501 + + + :return: The created_time of this TbResource. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this TbResource. + + + :param created_time: The created_time of this TbResource. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def data(self): + """Gets the data of this TbResource. # noqa: E501 + + + :return: The data of this TbResource. # noqa: E501 + :rtype: str + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this TbResource. + + + :param data: The data of this TbResource. # noqa: E501 + :type: str + """ + + self._data = data + + @property + def file_name(self): + """Gets the file_name of this TbResource. # noqa: E501 + + + :return: The file_name of this TbResource. # noqa: E501 + :rtype: str + """ + return self._file_name + + @file_name.setter + def file_name(self, file_name): + """Sets the file_name of this TbResource. + + + :param file_name: The file_name of this TbResource. # noqa: E501 + :type: str + """ + + self._file_name = file_name + + @property + def id(self): + """Gets the id of this TbResource. # noqa: E501 + + + :return: The id of this TbResource. # noqa: E501 + :rtype: TbResourceId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this TbResource. + + + :param id: The id of this TbResource. # noqa: E501 + :type: TbResourceId + """ + + self._id = id + + @property + def resource_key(self): + """Gets the resource_key of this TbResource. # noqa: E501 + + + :return: The resource_key of this TbResource. # noqa: E501 + :rtype: str + """ + return self._resource_key + + @resource_key.setter + def resource_key(self, resource_key): + """Sets the resource_key of this TbResource. + + + :param resource_key: The resource_key of this TbResource. # noqa: E501 + :type: str + """ + + self._resource_key = resource_key + + @property + def resource_type(self): + """Gets the resource_type of this TbResource. # noqa: E501 + + + :return: The resource_type of this TbResource. # noqa: E501 + :rtype: str + """ + return self._resource_type + + @resource_type.setter + def resource_type(self, resource_type): + """Sets the resource_type of this TbResource. + + + :param resource_type: The resource_type of this TbResource. # noqa: E501 + :type: str + """ + allowed_values = ["LWM2M_MODEL", "JKS", "PKCS_12"] # noqa: E501 + if resource_type not in allowed_values: + raise ValueError( + "Invalid value for `resource_type` ({0}), must be one of {1}" # noqa: E501 + .format(resource_type, allowed_values) + ) + + self._resource_type = resource_type + + @property + def tenant_id(self): + """Gets the tenant_id of this TbResource. # noqa: E501 + + + :return: The tenant_id of this TbResource. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this TbResource. + + + :param tenant_id: The tenant_id of this TbResource. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this TbResource. # noqa: E501 + + + :return: The title of this TbResource. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this TbResource. + + + :param title: The title of this TbResource. # noqa: E501 + :type: str + """ + + self._title = title + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TbResource, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TbResource): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tb_resource_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tb_resource_id.py new file mode 100644 index 0000000..f2aa75e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tb_resource_id.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TbResourceId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'str' + } + + attribute_map = { + 'id': 'id' + } + + def __init__(self, id=None): # noqa: E501 + """TbResourceId - a model defined in Swagger""" # noqa: E501 + self._id = None + self.discriminator = None + if id is not None: + self.id = id + + @property + def id(self): + """Gets the id of this TbResourceId. # noqa: E501 + + + :return: The id of this TbResourceId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this TbResourceId. + + + :param id: The id of this TbResourceId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TbResourceId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TbResourceId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tb_resource_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tb_resource_info.py new file mode 100644 index 0000000..75829a1 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tb_resource_info.py @@ -0,0 +1,246 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TbResourceInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'created_time': 'int', + 'id': 'TbResourceId', + 'resource_key': 'str', + 'resource_type': 'str', + 'tenant_id': 'TenantId', + 'title': 'str' + } + + attribute_map = { + 'created_time': 'createdTime', + 'id': 'id', + 'resource_key': 'resourceKey', + 'resource_type': 'resourceType', + 'tenant_id': 'tenantId', + 'title': 'title' + } + + def __init__(self, created_time=None, id=None, resource_key=None, resource_type=None, tenant_id=None, title=None): # noqa: E501 + """TbResourceInfo - a model defined in Swagger""" # noqa: E501 + self._created_time = None + self._id = None + self._resource_key = None + self._resource_type = None + self._tenant_id = None + self._title = None + self.discriminator = None + if created_time is not None: + self.created_time = created_time + if id is not None: + self.id = id + if resource_key is not None: + self.resource_key = resource_key + if resource_type is not None: + self.resource_type = resource_type + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + + @property + def created_time(self): + """Gets the created_time of this TbResourceInfo. # noqa: E501 + + + :return: The created_time of this TbResourceInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this TbResourceInfo. + + + :param created_time: The created_time of this TbResourceInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def id(self): + """Gets the id of this TbResourceInfo. # noqa: E501 + + + :return: The id of this TbResourceInfo. # noqa: E501 + :rtype: TbResourceId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this TbResourceInfo. + + + :param id: The id of this TbResourceInfo. # noqa: E501 + :type: TbResourceId + """ + + self._id = id + + @property + def resource_key(self): + """Gets the resource_key of this TbResourceInfo. # noqa: E501 + + + :return: The resource_key of this TbResourceInfo. # noqa: E501 + :rtype: str + """ + return self._resource_key + + @resource_key.setter + def resource_key(self, resource_key): + """Sets the resource_key of this TbResourceInfo. + + + :param resource_key: The resource_key of this TbResourceInfo. # noqa: E501 + :type: str + """ + + self._resource_key = resource_key + + @property + def resource_type(self): + """Gets the resource_type of this TbResourceInfo. # noqa: E501 + + + :return: The resource_type of this TbResourceInfo. # noqa: E501 + :rtype: str + """ + return self._resource_type + + @resource_type.setter + def resource_type(self, resource_type): + """Sets the resource_type of this TbResourceInfo. + + + :param resource_type: The resource_type of this TbResourceInfo. # noqa: E501 + :type: str + """ + allowed_values = ["LWM2M_MODEL", "JKS", "PKCS_12"] # noqa: E501 + if resource_type not in allowed_values: + raise ValueError( + "Invalid value for `resource_type` ({0}), must be one of {1}" # noqa: E501 + .format(resource_type, allowed_values) + ) + + self._resource_type = resource_type + + @property + def tenant_id(self): + """Gets the tenant_id of this TbResourceInfo. # noqa: E501 + + + :return: The tenant_id of this TbResourceInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this TbResourceInfo. + + + :param tenant_id: The tenant_id of this TbResourceInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this TbResourceInfo. # noqa: E501 + + + :return: The title of this TbResourceInfo. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this TbResourceInfo. + + + :param title: The title of this TbResourceInfo. # noqa: E501 + :type: str + """ + + self._title = title + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TbResourceInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TbResourceInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/telemetry_entity_view.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/telemetry_entity_view.py new file mode 100644 index 0000000..f3802f3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/telemetry_entity_view.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TelemetryEntityView(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'attributes': 'AttributesEntityView', + 'timeseries': 'list[str]' + } + + attribute_map = { + 'attributes': 'attributes', + 'timeseries': 'timeseries' + } + + def __init__(self, attributes=None, timeseries=None): # noqa: E501 + """TelemetryEntityView - a model defined in Swagger""" # noqa: E501 + self._attributes = None + self._timeseries = None + self.discriminator = None + if attributes is not None: + self.attributes = attributes + if timeseries is not None: + self.timeseries = timeseries + + @property + def attributes(self): + """Gets the attributes of this TelemetryEntityView. # noqa: E501 + + + :return: The attributes of this TelemetryEntityView. # noqa: E501 + :rtype: AttributesEntityView + """ + return self._attributes + + @attributes.setter + def attributes(self, attributes): + """Sets the attributes of this TelemetryEntityView. + + + :param attributes: The attributes of this TelemetryEntityView. # noqa: E501 + :type: AttributesEntityView + """ + + self._attributes = attributes + + @property + def timeseries(self): + """Gets the timeseries of this TelemetryEntityView. # noqa: E501 + + + :return: The timeseries of this TelemetryEntityView. # noqa: E501 + :rtype: list[str] + """ + return self._timeseries + + @timeseries.setter + def timeseries(self, timeseries): + """Sets the timeseries of this TelemetryEntityView. + + + :param timeseries: The timeseries of this TelemetryEntityView. # noqa: E501 + :type: list[str] + """ + + self._timeseries = timeseries + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TelemetryEntityView, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TelemetryEntityView): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant.py new file mode 100644 index 0000000..f8d234c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant.py @@ -0,0 +1,474 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Tenant(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'address': 'str', + 'address2': 'str', + 'city': 'str', + 'country': 'str', + 'created_time': 'int', + 'email': 'str', + 'id': 'TenantId', + 'name': 'str', + 'phone': 'str', + 'region': 'str', + 'state': 'str', + 'tenant_profile_id': 'TenantProfileId', + 'title': 'str', + 'zip': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'address': 'address', + 'address2': 'address2', + 'city': 'city', + 'country': 'country', + 'created_time': 'createdTime', + 'email': 'email', + 'id': 'id', + 'name': 'name', + 'phone': 'phone', + 'region': 'region', + 'state': 'state', + 'tenant_profile_id': 'tenantProfileId', + 'title': 'title', + 'zip': 'zip' + } + + def __init__(self, additional_info=None, address=None, address2=None, city=None, country=None, created_time=None, email=None, id=None, name=None, phone=None, region=None, state=None, tenant_profile_id=None, title=None, zip=None): # noqa: E501 + """Tenant - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._address = None + self._address2 = None + self._city = None + self._country = None + self._created_time = None + self._email = None + self._id = None + self._name = None + self._phone = None + self._region = None + self._state = None + self._tenant_profile_id = None + self._title = None + self._zip = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if address is not None: + self.address = address + if address2 is not None: + self.address2 = address2 + if city is not None: + self.city = city + if country is not None: + self.country = country + if created_time is not None: + self.created_time = created_time + if email is not None: + self.email = email + if id is not None: + self.id = id + if name is not None: + self.name = name + if phone is not None: + self.phone = phone + if region is not None: + self.region = region + if state is not None: + self.state = state + if tenant_profile_id is not None: + self.tenant_profile_id = tenant_profile_id + if title is not None: + self.title = title + if zip is not None: + self.zip = zip + + @property + def additional_info(self): + """Gets the additional_info of this Tenant. # noqa: E501 + + + :return: The additional_info of this Tenant. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Tenant. + + + :param additional_info: The additional_info of this Tenant. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def address(self): + """Gets the address of this Tenant. # noqa: E501 + + + :return: The address of this Tenant. # noqa: E501 + :rtype: str + """ + return self._address + + @address.setter + def address(self, address): + """Sets the address of this Tenant. + + + :param address: The address of this Tenant. # noqa: E501 + :type: str + """ + + self._address = address + + @property + def address2(self): + """Gets the address2 of this Tenant. # noqa: E501 + + + :return: The address2 of this Tenant. # noqa: E501 + :rtype: str + """ + return self._address2 + + @address2.setter + def address2(self, address2): + """Sets the address2 of this Tenant. + + + :param address2: The address2 of this Tenant. # noqa: E501 + :type: str + """ + + self._address2 = address2 + + @property + def city(self): + """Gets the city of this Tenant. # noqa: E501 + + + :return: The city of this Tenant. # noqa: E501 + :rtype: str + """ + return self._city + + @city.setter + def city(self, city): + """Sets the city of this Tenant. + + + :param city: The city of this Tenant. # noqa: E501 + :type: str + """ + + self._city = city + + @property + def country(self): + """Gets the country of this Tenant. # noqa: E501 + + + :return: The country of this Tenant. # noqa: E501 + :rtype: str + """ + return self._country + + @country.setter + def country(self, country): + """Sets the country of this Tenant. + + + :param country: The country of this Tenant. # noqa: E501 + :type: str + """ + + self._country = country + + @property + def created_time(self): + """Gets the created_time of this Tenant. # noqa: E501 + + + :return: The created_time of this Tenant. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Tenant. + + + :param created_time: The created_time of this Tenant. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def email(self): + """Gets the email of this Tenant. # noqa: E501 + + + :return: The email of this Tenant. # noqa: E501 + :rtype: str + """ + return self._email + + @email.setter + def email(self, email): + """Sets the email of this Tenant. + + + :param email: The email of this Tenant. # noqa: E501 + :type: str + """ + + self._email = email + + @property + def id(self): + """Gets the id of this Tenant. # noqa: E501 + + + :return: The id of this Tenant. # noqa: E501 + :rtype: TenantId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Tenant. + + + :param id: The id of this Tenant. # noqa: E501 + :type: TenantId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this Tenant. # noqa: E501 + + + :return: The name of this Tenant. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Tenant. + + + :param name: The name of this Tenant. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def phone(self): + """Gets the phone of this Tenant. # noqa: E501 + + + :return: The phone of this Tenant. # noqa: E501 + :rtype: str + """ + return self._phone + + @phone.setter + def phone(self, phone): + """Sets the phone of this Tenant. + + + :param phone: The phone of this Tenant. # noqa: E501 + :type: str + """ + + self._phone = phone + + @property + def region(self): + """Gets the region of this Tenant. # noqa: E501 + + + :return: The region of this Tenant. # noqa: E501 + :rtype: str + """ + return self._region + + @region.setter + def region(self, region): + """Sets the region of this Tenant. + + + :param region: The region of this Tenant. # noqa: E501 + :type: str + """ + + self._region = region + + @property + def state(self): + """Gets the state of this Tenant. # noqa: E501 + + + :return: The state of this Tenant. # noqa: E501 + :rtype: str + """ + return self._state + + @state.setter + def state(self, state): + """Sets the state of this Tenant. + + + :param state: The state of this Tenant. # noqa: E501 + :type: str + """ + + self._state = state + + @property + def tenant_profile_id(self): + """Gets the tenant_profile_id of this Tenant. # noqa: E501 + + + :return: The tenant_profile_id of this Tenant. # noqa: E501 + :rtype: TenantProfileId + """ + return self._tenant_profile_id + + @tenant_profile_id.setter + def tenant_profile_id(self, tenant_profile_id): + """Sets the tenant_profile_id of this Tenant. + + + :param tenant_profile_id: The tenant_profile_id of this Tenant. # noqa: E501 + :type: TenantProfileId + """ + + self._tenant_profile_id = tenant_profile_id + + @property + def title(self): + """Gets the title of this Tenant. # noqa: E501 + + + :return: The title of this Tenant. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this Tenant. + + + :param title: The title of this Tenant. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def zip(self): + """Gets the zip of this Tenant. # noqa: E501 + + + :return: The zip of this Tenant. # noqa: E501 + :rtype: str + """ + return self._zip + + @zip.setter + def zip(self, zip): + """Sets the zip of this Tenant. + + + :param zip: The zip of this Tenant. # noqa: E501 + :type: str + """ + + self._zip = zip + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Tenant, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Tenant): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_id.py new file mode 100644 index 0000000..2643776 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class TenantId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """TenantId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this TenantId. # noqa: E501 + + + :return: The id of this TenantId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this TenantId. + + + :param id: The id of this TenantId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TenantId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TenantId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_info.py new file mode 100644 index 0000000..ebcfbf6 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_info.py @@ -0,0 +1,500 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TenantInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'address': 'str', + 'address2': 'str', + 'city': 'str', + 'country': 'str', + 'created_time': 'int', + 'email': 'str', + 'id': 'TenantId', + 'name': 'str', + 'phone': 'str', + 'region': 'str', + 'state': 'str', + 'tenant_profile_id': 'TenantProfileId', + 'tenant_profile_name': 'str', + 'title': 'str', + 'zip': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'address': 'address', + 'address2': 'address2', + 'city': 'city', + 'country': 'country', + 'created_time': 'createdTime', + 'email': 'email', + 'id': 'id', + 'name': 'name', + 'phone': 'phone', + 'region': 'region', + 'state': 'state', + 'tenant_profile_id': 'tenantProfileId', + 'tenant_profile_name': 'tenantProfileName', + 'title': 'title', + 'zip': 'zip' + } + + def __init__(self, additional_info=None, address=None, address2=None, city=None, country=None, created_time=None, email=None, id=None, name=None, phone=None, region=None, state=None, tenant_profile_id=None, tenant_profile_name=None, title=None, zip=None): # noqa: E501 + """TenantInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._address = None + self._address2 = None + self._city = None + self._country = None + self._created_time = None + self._email = None + self._id = None + self._name = None + self._phone = None + self._region = None + self._state = None + self._tenant_profile_id = None + self._tenant_profile_name = None + self._title = None + self._zip = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if address is not None: + self.address = address + if address2 is not None: + self.address2 = address2 + if city is not None: + self.city = city + if country is not None: + self.country = country + if created_time is not None: + self.created_time = created_time + if email is not None: + self.email = email + if id is not None: + self.id = id + if name is not None: + self.name = name + if phone is not None: + self.phone = phone + if region is not None: + self.region = region + if state is not None: + self.state = state + if tenant_profile_id is not None: + self.tenant_profile_id = tenant_profile_id + if tenant_profile_name is not None: + self.tenant_profile_name = tenant_profile_name + if title is not None: + self.title = title + if zip is not None: + self.zip = zip + + @property + def additional_info(self): + """Gets the additional_info of this TenantInfo. # noqa: E501 + + + :return: The additional_info of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this TenantInfo. + + + :param additional_info: The additional_info of this TenantInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def address(self): + """Gets the address of this TenantInfo. # noqa: E501 + + + :return: The address of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._address + + @address.setter + def address(self, address): + """Sets the address of this TenantInfo. + + + :param address: The address of this TenantInfo. # noqa: E501 + :type: str + """ + + self._address = address + + @property + def address2(self): + """Gets the address2 of this TenantInfo. # noqa: E501 + + + :return: The address2 of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._address2 + + @address2.setter + def address2(self, address2): + """Sets the address2 of this TenantInfo. + + + :param address2: The address2 of this TenantInfo. # noqa: E501 + :type: str + """ + + self._address2 = address2 + + @property + def city(self): + """Gets the city of this TenantInfo. # noqa: E501 + + + :return: The city of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._city + + @city.setter + def city(self, city): + """Sets the city of this TenantInfo. + + + :param city: The city of this TenantInfo. # noqa: E501 + :type: str + """ + + self._city = city + + @property + def country(self): + """Gets the country of this TenantInfo. # noqa: E501 + + + :return: The country of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._country + + @country.setter + def country(self, country): + """Sets the country of this TenantInfo. + + + :param country: The country of this TenantInfo. # noqa: E501 + :type: str + """ + + self._country = country + + @property + def created_time(self): + """Gets the created_time of this TenantInfo. # noqa: E501 + + + :return: The created_time of this TenantInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this TenantInfo. + + + :param created_time: The created_time of this TenantInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def email(self): + """Gets the email of this TenantInfo. # noqa: E501 + + + :return: The email of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._email + + @email.setter + def email(self, email): + """Sets the email of this TenantInfo. + + + :param email: The email of this TenantInfo. # noqa: E501 + :type: str + """ + + self._email = email + + @property + def id(self): + """Gets the id of this TenantInfo. # noqa: E501 + + + :return: The id of this TenantInfo. # noqa: E501 + :rtype: TenantId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this TenantInfo. + + + :param id: The id of this TenantInfo. # noqa: E501 + :type: TenantId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this TenantInfo. # noqa: E501 + + + :return: The name of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this TenantInfo. + + + :param name: The name of this TenantInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def phone(self): + """Gets the phone of this TenantInfo. # noqa: E501 + + + :return: The phone of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._phone + + @phone.setter + def phone(self, phone): + """Sets the phone of this TenantInfo. + + + :param phone: The phone of this TenantInfo. # noqa: E501 + :type: str + """ + + self._phone = phone + + @property + def region(self): + """Gets the region of this TenantInfo. # noqa: E501 + + + :return: The region of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._region + + @region.setter + def region(self, region): + """Sets the region of this TenantInfo. + + + :param region: The region of this TenantInfo. # noqa: E501 + :type: str + """ + + self._region = region + + @property + def state(self): + """Gets the state of this TenantInfo. # noqa: E501 + + + :return: The state of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._state + + @state.setter + def state(self, state): + """Sets the state of this TenantInfo. + + + :param state: The state of this TenantInfo. # noqa: E501 + :type: str + """ + + self._state = state + + @property + def tenant_profile_id(self): + """Gets the tenant_profile_id of this TenantInfo. # noqa: E501 + + + :return: The tenant_profile_id of this TenantInfo. # noqa: E501 + :rtype: TenantProfileId + """ + return self._tenant_profile_id + + @tenant_profile_id.setter + def tenant_profile_id(self, tenant_profile_id): + """Sets the tenant_profile_id of this TenantInfo. + + + :param tenant_profile_id: The tenant_profile_id of this TenantInfo. # noqa: E501 + :type: TenantProfileId + """ + + self._tenant_profile_id = tenant_profile_id + + @property + def tenant_profile_name(self): + """Gets the tenant_profile_name of this TenantInfo. # noqa: E501 + + + :return: The tenant_profile_name of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._tenant_profile_name + + @tenant_profile_name.setter + def tenant_profile_name(self, tenant_profile_name): + """Sets the tenant_profile_name of this TenantInfo. + + + :param tenant_profile_name: The tenant_profile_name of this TenantInfo. # noqa: E501 + :type: str + """ + + self._tenant_profile_name = tenant_profile_name + + @property + def title(self): + """Gets the title of this TenantInfo. # noqa: E501 + + + :return: The title of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this TenantInfo. + + + :param title: The title of this TenantInfo. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def zip(self): + """Gets the zip of this TenantInfo. # noqa: E501 + + + :return: The zip of this TenantInfo. # noqa: E501 + :rtype: str + """ + return self._zip + + @zip.setter + def zip(self, zip): + """Sets the zip of this TenantInfo. + + + :param zip: The zip of this TenantInfo. # noqa: E501 + :type: str + """ + + self._zip = zip + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TenantInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TenantInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile.py new file mode 100644 index 0000000..b78c64e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile.py @@ -0,0 +1,292 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TenantProfile(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'created_time': 'int', + 'default': 'bool', + 'description': 'str', + 'id': 'TenantProfileId', + 'isolated_tb_core': 'bool', + 'isolated_tb_rule_engine': 'bool', + 'name': 'str', + 'profile_data': 'TenantProfileData' + } + + attribute_map = { + 'created_time': 'createdTime', + 'default': 'default', + 'description': 'description', + 'id': 'id', + 'isolated_tb_core': 'isolatedTbCore', + 'isolated_tb_rule_engine': 'isolatedTbRuleEngine', + 'name': 'name', + 'profile_data': 'profileData' + } + + def __init__(self, created_time=None, default=None, description=None, id=None, isolated_tb_core=None, isolated_tb_rule_engine=None, name=None, profile_data=None): # noqa: E501 + """TenantProfile - a model defined in Swagger""" # noqa: E501 + self._created_time = None + self._default = None + self._description = None + self._id = None + self._isolated_tb_core = None + self._isolated_tb_rule_engine = None + self._name = None + self._profile_data = None + self.discriminator = None + if created_time is not None: + self.created_time = created_time + if default is not None: + self.default = default + if description is not None: + self.description = description + if id is not None: + self.id = id + if isolated_tb_core is not None: + self.isolated_tb_core = isolated_tb_core + if isolated_tb_rule_engine is not None: + self.isolated_tb_rule_engine = isolated_tb_rule_engine + if name is not None: + self.name = name + if profile_data is not None: + self.profile_data = profile_data + + @property + def created_time(self): + """Gets the created_time of this TenantProfile. # noqa: E501 + + + :return: The created_time of this TenantProfile. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this TenantProfile. + + + :param created_time: The created_time of this TenantProfile. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def default(self): + """Gets the default of this TenantProfile. # noqa: E501 + + + :return: The default of this TenantProfile. # noqa: E501 + :rtype: bool + """ + return self._default + + @default.setter + def default(self, default): + """Sets the default of this TenantProfile. + + + :param default: The default of this TenantProfile. # noqa: E501 + :type: bool + """ + + self._default = default + + @property + def description(self): + """Gets the description of this TenantProfile. # noqa: E501 + + + :return: The description of this TenantProfile. # noqa: E501 + :rtype: str + """ + return self._description + + @description.setter + def description(self, description): + """Sets the description of this TenantProfile. + + + :param description: The description of this TenantProfile. # noqa: E501 + :type: str + """ + + self._description = description + + @property + def id(self): + """Gets the id of this TenantProfile. # noqa: E501 + + + :return: The id of this TenantProfile. # noqa: E501 + :rtype: TenantProfileId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this TenantProfile. + + + :param id: The id of this TenantProfile. # noqa: E501 + :type: TenantProfileId + """ + + self._id = id + + @property + def isolated_tb_core(self): + """Gets the isolated_tb_core of this TenantProfile. # noqa: E501 + + + :return: The isolated_tb_core of this TenantProfile. # noqa: E501 + :rtype: bool + """ + return self._isolated_tb_core + + @isolated_tb_core.setter + def isolated_tb_core(self, isolated_tb_core): + """Sets the isolated_tb_core of this TenantProfile. + + + :param isolated_tb_core: The isolated_tb_core of this TenantProfile. # noqa: E501 + :type: bool + """ + + self._isolated_tb_core = isolated_tb_core + + @property + def isolated_tb_rule_engine(self): + """Gets the isolated_tb_rule_engine of this TenantProfile. # noqa: E501 + + + :return: The isolated_tb_rule_engine of this TenantProfile. # noqa: E501 + :rtype: bool + """ + return self._isolated_tb_rule_engine + + @isolated_tb_rule_engine.setter + def isolated_tb_rule_engine(self, isolated_tb_rule_engine): + """Sets the isolated_tb_rule_engine of this TenantProfile. + + + :param isolated_tb_rule_engine: The isolated_tb_rule_engine of this TenantProfile. # noqa: E501 + :type: bool + """ + + self._isolated_tb_rule_engine = isolated_tb_rule_engine + + @property + def name(self): + """Gets the name of this TenantProfile. # noqa: E501 + + + :return: The name of this TenantProfile. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this TenantProfile. + + + :param name: The name of this TenantProfile. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def profile_data(self): + """Gets the profile_data of this TenantProfile. # noqa: E501 + + + :return: The profile_data of this TenantProfile. # noqa: E501 + :rtype: TenantProfileData + """ + return self._profile_data + + @profile_data.setter + def profile_data(self, profile_data): + """Sets the profile_data of this TenantProfile. + + + :param profile_data: The profile_data of this TenantProfile. # noqa: E501 + :type: TenantProfileData + """ + + self._profile_data = profile_data + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TenantProfile, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TenantProfile): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile_configuration.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile_configuration.py new file mode 100644 index 0000000..05b59e3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile_configuration.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TenantProfileConfiguration(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """TenantProfileConfiguration - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TenantProfileConfiguration, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TenantProfileConfiguration): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile_data.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile_data.py new file mode 100644 index 0000000..880c758 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile_data.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TenantProfileData(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'configuration': 'TenantProfileConfiguration' + } + + attribute_map = { + 'configuration': 'configuration' + } + + def __init__(self, configuration=None): # noqa: E501 + """TenantProfileData - a model defined in Swagger""" # noqa: E501 + self._configuration = None + self.discriminator = None + if configuration is not None: + self.configuration = configuration + + @property + def configuration(self): + """Gets the configuration of this TenantProfileData. # noqa: E501 + + + :return: The configuration of this TenantProfileData. # noqa: E501 + :rtype: TenantProfileConfiguration + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this TenantProfileData. + + + :param configuration: The configuration of this TenantProfileData. # noqa: E501 + :type: TenantProfileConfiguration + """ + + self._configuration = configuration + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TenantProfileData, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TenantProfileData): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile_id.py new file mode 100644 index 0000000..980d083 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/tenant_profile_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class TenantProfileId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """TenantProfileId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this TenantProfileId. # noqa: E501 + + + :return: The id of this TenantProfileId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this TenantProfileId. + + + :param id: The id of this TenantProfileId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TenantProfileId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TenantProfileId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/test_sms_request.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/test_sms_request.py new file mode 100644 index 0000000..dc5db17 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/test_sms_request.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TestSmsRequest(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'message': 'str', + 'number_to': 'str', + 'provider_configuration': 'SmsProviderConfiguration' + } + + attribute_map = { + 'message': 'message', + 'number_to': 'numberTo', + 'provider_configuration': 'providerConfiguration' + } + + def __init__(self, message=None, number_to=None, provider_configuration=None): # noqa: E501 + """TestSmsRequest - a model defined in Swagger""" # noqa: E501 + self._message = None + self._number_to = None + self._provider_configuration = None + self.discriminator = None + if message is not None: + self.message = message + if number_to is not None: + self.number_to = number_to + if provider_configuration is not None: + self.provider_configuration = provider_configuration + + @property + def message(self): + """Gets the message of this TestSmsRequest. # noqa: E501 + + + :return: The message of this TestSmsRequest. # noqa: E501 + :rtype: str + """ + return self._message + + @message.setter + def message(self, message): + """Sets the message of this TestSmsRequest. + + + :param message: The message of this TestSmsRequest. # noqa: E501 + :type: str + """ + + self._message = message + + @property + def number_to(self): + """Gets the number_to of this TestSmsRequest. # noqa: E501 + + + :return: The number_to of this TestSmsRequest. # noqa: E501 + :rtype: str + """ + return self._number_to + + @number_to.setter + def number_to(self, number_to): + """Sets the number_to of this TestSmsRequest. + + + :param number_to: The number_to of this TestSmsRequest. # noqa: E501 + :type: str + """ + + self._number_to = number_to + + @property + def provider_configuration(self): + """Gets the provider_configuration of this TestSmsRequest. # noqa: E501 + + + :return: The provider_configuration of this TestSmsRequest. # noqa: E501 + :rtype: SmsProviderConfiguration + """ + return self._provider_configuration + + @provider_configuration.setter + def provider_configuration(self, provider_configuration): + """Sets the provider_configuration of this TestSmsRequest. + + + :param provider_configuration: The provider_configuration of this TestSmsRequest. # noqa: E501 + :type: SmsProviderConfiguration + """ + + self._provider_configuration = provider_configuration + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TestSmsRequest, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TestSmsRequest): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ts_value.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ts_value.py new file mode 100644 index 0000000..87824c0 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/ts_value.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TsValue(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'ts': 'int', + 'value': 'str' + } + + attribute_map = { + 'ts': 'ts', + 'value': 'value' + } + + def __init__(self, ts=None, value=None): # noqa: E501 + """TsValue - a model defined in Swagger""" # noqa: E501 + self._ts = None + self._value = None + self.discriminator = None + if ts is not None: + self.ts = ts + if value is not None: + self.value = value + + @property + def ts(self): + """Gets the ts of this TsValue. # noqa: E501 + + + :return: The ts of this TsValue. # noqa: E501 + :rtype: int + """ + return self._ts + + @ts.setter + def ts(self, ts): + """Sets the ts of this TsValue. + + + :param ts: The ts of this TsValue. # noqa: E501 + :type: int + """ + + self._ts = ts + + @property + def value(self): + """Gets the value of this TsValue. # noqa: E501 + + + :return: The value of this TsValue. # noqa: E501 + :rtype: str + """ + return self._value + + @value.setter + def value(self, value): + """Sets the value of this TsValue. + + + :param value: The value of this TsValue. # noqa: E501 + :type: str + """ + + self._value = value + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TsValue, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TsValue): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/update_message.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/update_message.py new file mode 100644 index 0000000..d45b1e2 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/update_message.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class UpdateMessage(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'message': 'str', + 'update_available': 'bool' + } + + attribute_map = { + 'message': 'message', + 'update_available': 'updateAvailable' + } + + def __init__(self, message=None, update_available=None): # noqa: E501 + """UpdateMessage - a model defined in Swagger""" # noqa: E501 + self._message = None + self._update_available = None + self.discriminator = None + if message is not None: + self.message = message + if update_available is not None: + self.update_available = update_available + + @property + def message(self): + """Gets the message of this UpdateMessage. # noqa: E501 + + + :return: The message of this UpdateMessage. # noqa: E501 + :rtype: str + """ + return self._message + + @message.setter + def message(self, message): + """Sets the message of this UpdateMessage. + + + :param message: The message of this UpdateMessage. # noqa: E501 + :type: str + """ + + self._message = message + + @property + def update_available(self): + """Gets the update_available of this UpdateMessage. # noqa: E501 + + + :return: The update_available of this UpdateMessage. # noqa: E501 + :rtype: bool + """ + return self._update_available + + @update_available.setter + def update_available(self, update_available): + """Sets the update_available of this UpdateMessage. + + + :param update_available: The update_available of this UpdateMessage. # noqa: E501 + :type: bool + """ + + self._update_available = update_available + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(UpdateMessage, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, UpdateMessage): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/uri.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/uri.py new file mode 100644 index 0000000..6d849b2 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/uri.py @@ -0,0 +1,526 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class URI(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'absolute': 'bool', + 'authority': 'str', + 'fragment': 'str', + 'host': 'str', + 'opaque': 'bool', + 'path': 'str', + 'port': 'int', + 'query': 'str', + 'raw_authority': 'str', + 'raw_fragment': 'str', + 'raw_path': 'str', + 'raw_query': 'str', + 'raw_scheme_specific_part': 'str', + 'raw_user_info': 'str', + 'scheme': 'str', + 'scheme_specific_part': 'str', + 'user_info': 'str' + } + + attribute_map = { + 'absolute': 'absolute', + 'authority': 'authority', + 'fragment': 'fragment', + 'host': 'host', + 'opaque': 'opaque', + 'path': 'path', + 'port': 'port', + 'query': 'query', + 'raw_authority': 'rawAuthority', + 'raw_fragment': 'rawFragment', + 'raw_path': 'rawPath', + 'raw_query': 'rawQuery', + 'raw_scheme_specific_part': 'rawSchemeSpecificPart', + 'raw_user_info': 'rawUserInfo', + 'scheme': 'scheme', + 'scheme_specific_part': 'schemeSpecificPart', + 'user_info': 'userInfo' + } + + def __init__(self, absolute=None, authority=None, fragment=None, host=None, opaque=None, path=None, port=None, query=None, raw_authority=None, raw_fragment=None, raw_path=None, raw_query=None, raw_scheme_specific_part=None, raw_user_info=None, scheme=None, scheme_specific_part=None, user_info=None): # noqa: E501 + """URI - a model defined in Swagger""" # noqa: E501 + self._absolute = None + self._authority = None + self._fragment = None + self._host = None + self._opaque = None + self._path = None + self._port = None + self._query = None + self._raw_authority = None + self._raw_fragment = None + self._raw_path = None + self._raw_query = None + self._raw_scheme_specific_part = None + self._raw_user_info = None + self._scheme = None + self._scheme_specific_part = None + self._user_info = None + self.discriminator = None + if absolute is not None: + self.absolute = absolute + if authority is not None: + self.authority = authority + if fragment is not None: + self.fragment = fragment + if host is not None: + self.host = host + if opaque is not None: + self.opaque = opaque + if path is not None: + self.path = path + if port is not None: + self.port = port + if query is not None: + self.query = query + if raw_authority is not None: + self.raw_authority = raw_authority + if raw_fragment is not None: + self.raw_fragment = raw_fragment + if raw_path is not None: + self.raw_path = raw_path + if raw_query is not None: + self.raw_query = raw_query + if raw_scheme_specific_part is not None: + self.raw_scheme_specific_part = raw_scheme_specific_part + if raw_user_info is not None: + self.raw_user_info = raw_user_info + if scheme is not None: + self.scheme = scheme + if scheme_specific_part is not None: + self.scheme_specific_part = scheme_specific_part + if user_info is not None: + self.user_info = user_info + + @property + def absolute(self): + """Gets the absolute of this URI. # noqa: E501 + + + :return: The absolute of this URI. # noqa: E501 + :rtype: bool + """ + return self._absolute + + @absolute.setter + def absolute(self, absolute): + """Sets the absolute of this URI. + + + :param absolute: The absolute of this URI. # noqa: E501 + :type: bool + """ + + self._absolute = absolute + + @property + def authority(self): + """Gets the authority of this URI. # noqa: E501 + + + :return: The authority of this URI. # noqa: E501 + :rtype: str + """ + return self._authority + + @authority.setter + def authority(self, authority): + """Sets the authority of this URI. + + + :param authority: The authority of this URI. # noqa: E501 + :type: str + """ + + self._authority = authority + + @property + def fragment(self): + """Gets the fragment of this URI. # noqa: E501 + + + :return: The fragment of this URI. # noqa: E501 + :rtype: str + """ + return self._fragment + + @fragment.setter + def fragment(self, fragment): + """Sets the fragment of this URI. + + + :param fragment: The fragment of this URI. # noqa: E501 + :type: str + """ + + self._fragment = fragment + + @property + def host(self): + """Gets the host of this URI. # noqa: E501 + + + :return: The host of this URI. # noqa: E501 + :rtype: str + """ + return self._host + + @host.setter + def host(self, host): + """Sets the host of this URI. + + + :param host: The host of this URI. # noqa: E501 + :type: str + """ + + self._host = host + + @property + def opaque(self): + """Gets the opaque of this URI. # noqa: E501 + + + :return: The opaque of this URI. # noqa: E501 + :rtype: bool + """ + return self._opaque + + @opaque.setter + def opaque(self, opaque): + """Sets the opaque of this URI. + + + :param opaque: The opaque of this URI. # noqa: E501 + :type: bool + """ + + self._opaque = opaque + + @property + def path(self): + """Gets the path of this URI. # noqa: E501 + + + :return: The path of this URI. # noqa: E501 + :rtype: str + """ + return self._path + + @path.setter + def path(self, path): + """Sets the path of this URI. + + + :param path: The path of this URI. # noqa: E501 + :type: str + """ + + self._path = path + + @property + def port(self): + """Gets the port of this URI. # noqa: E501 + + + :return: The port of this URI. # noqa: E501 + :rtype: int + """ + return self._port + + @port.setter + def port(self, port): + """Sets the port of this URI. + + + :param port: The port of this URI. # noqa: E501 + :type: int + """ + + self._port = port + + @property + def query(self): + """Gets the query of this URI. # noqa: E501 + + + :return: The query of this URI. # noqa: E501 + :rtype: str + """ + return self._query + + @query.setter + def query(self, query): + """Sets the query of this URI. + + + :param query: The query of this URI. # noqa: E501 + :type: str + """ + + self._query = query + + @property + def raw_authority(self): + """Gets the raw_authority of this URI. # noqa: E501 + + + :return: The raw_authority of this URI. # noqa: E501 + :rtype: str + """ + return self._raw_authority + + @raw_authority.setter + def raw_authority(self, raw_authority): + """Sets the raw_authority of this URI. + + + :param raw_authority: The raw_authority of this URI. # noqa: E501 + :type: str + """ + + self._raw_authority = raw_authority + + @property + def raw_fragment(self): + """Gets the raw_fragment of this URI. # noqa: E501 + + + :return: The raw_fragment of this URI. # noqa: E501 + :rtype: str + """ + return self._raw_fragment + + @raw_fragment.setter + def raw_fragment(self, raw_fragment): + """Sets the raw_fragment of this URI. + + + :param raw_fragment: The raw_fragment of this URI. # noqa: E501 + :type: str + """ + + self._raw_fragment = raw_fragment + + @property + def raw_path(self): + """Gets the raw_path of this URI. # noqa: E501 + + + :return: The raw_path of this URI. # noqa: E501 + :rtype: str + """ + return self._raw_path + + @raw_path.setter + def raw_path(self, raw_path): + """Sets the raw_path of this URI. + + + :param raw_path: The raw_path of this URI. # noqa: E501 + :type: str + """ + + self._raw_path = raw_path + + @property + def raw_query(self): + """Gets the raw_query of this URI. # noqa: E501 + + + :return: The raw_query of this URI. # noqa: E501 + :rtype: str + """ + return self._raw_query + + @raw_query.setter + def raw_query(self, raw_query): + """Sets the raw_query of this URI. + + + :param raw_query: The raw_query of this URI. # noqa: E501 + :type: str + """ + + self._raw_query = raw_query + + @property + def raw_scheme_specific_part(self): + """Gets the raw_scheme_specific_part of this URI. # noqa: E501 + + + :return: The raw_scheme_specific_part of this URI. # noqa: E501 + :rtype: str + """ + return self._raw_scheme_specific_part + + @raw_scheme_specific_part.setter + def raw_scheme_specific_part(self, raw_scheme_specific_part): + """Sets the raw_scheme_specific_part of this URI. + + + :param raw_scheme_specific_part: The raw_scheme_specific_part of this URI. # noqa: E501 + :type: str + """ + + self._raw_scheme_specific_part = raw_scheme_specific_part + + @property + def raw_user_info(self): + """Gets the raw_user_info of this URI. # noqa: E501 + + + :return: The raw_user_info of this URI. # noqa: E501 + :rtype: str + """ + return self._raw_user_info + + @raw_user_info.setter + def raw_user_info(self, raw_user_info): + """Sets the raw_user_info of this URI. + + + :param raw_user_info: The raw_user_info of this URI. # noqa: E501 + :type: str + """ + + self._raw_user_info = raw_user_info + + @property + def scheme(self): + """Gets the scheme of this URI. # noqa: E501 + + + :return: The scheme of this URI. # noqa: E501 + :rtype: str + """ + return self._scheme + + @scheme.setter + def scheme(self, scheme): + """Sets the scheme of this URI. + + + :param scheme: The scheme of this URI. # noqa: E501 + :type: str + """ + + self._scheme = scheme + + @property + def scheme_specific_part(self): + """Gets the scheme_specific_part of this URI. # noqa: E501 + + + :return: The scheme_specific_part of this URI. # noqa: E501 + :rtype: str + """ + return self._scheme_specific_part + + @scheme_specific_part.setter + def scheme_specific_part(self, scheme_specific_part): + """Sets the scheme_specific_part of this URI. + + + :param scheme_specific_part: The scheme_specific_part of this URI. # noqa: E501 + :type: str + """ + + self._scheme_specific_part = scheme_specific_part + + @property + def user_info(self): + """Gets the user_info of this URI. # noqa: E501 + + + :return: The user_info of this URI. # noqa: E501 + :rtype: str + """ + return self._user_info + + @user_info.setter + def user_info(self, user_info): + """Sets the user_info of this URI. + + + :param user_info: The user_info of this URI. # noqa: E501 + :type: str + """ + + self._user_info = user_info + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(URI, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, URI): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/url.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/url.py new file mode 100644 index 0000000..ae7a8ac --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/url.py @@ -0,0 +1,370 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class URL(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'authority': 'str', + 'content': 'object', + 'default_port': 'int', + 'file': 'str', + 'host': 'str', + 'path': 'str', + 'port': 'int', + 'protocol': 'str', + 'query': 'str', + 'ref': 'str', + 'user_info': 'str' + } + + attribute_map = { + 'authority': 'authority', + 'content': 'content', + 'default_port': 'defaultPort', + 'file': 'file', + 'host': 'host', + 'path': 'path', + 'port': 'port', + 'protocol': 'protocol', + 'query': 'query', + 'ref': 'ref', + 'user_info': 'userInfo' + } + + def __init__(self, authority=None, content=None, default_port=None, file=None, host=None, path=None, port=None, protocol=None, query=None, ref=None, user_info=None): # noqa: E501 + """URL - a model defined in Swagger""" # noqa: E501 + self._authority = None + self._content = None + self._default_port = None + self._file = None + self._host = None + self._path = None + self._port = None + self._protocol = None + self._query = None + self._ref = None + self._user_info = None + self.discriminator = None + if authority is not None: + self.authority = authority + if content is not None: + self.content = content + if default_port is not None: + self.default_port = default_port + if file is not None: + self.file = file + if host is not None: + self.host = host + if path is not None: + self.path = path + if port is not None: + self.port = port + if protocol is not None: + self.protocol = protocol + if query is not None: + self.query = query + if ref is not None: + self.ref = ref + if user_info is not None: + self.user_info = user_info + + @property + def authority(self): + """Gets the authority of this URL. # noqa: E501 + + + :return: The authority of this URL. # noqa: E501 + :rtype: str + """ + return self._authority + + @authority.setter + def authority(self, authority): + """Sets the authority of this URL. + + + :param authority: The authority of this URL. # noqa: E501 + :type: str + """ + + self._authority = authority + + @property + def content(self): + """Gets the content of this URL. # noqa: E501 + + + :return: The content of this URL. # noqa: E501 + :rtype: object + """ + return self._content + + @content.setter + def content(self, content): + """Sets the content of this URL. + + + :param content: The content of this URL. # noqa: E501 + :type: object + """ + + self._content = content + + @property + def default_port(self): + """Gets the default_port of this URL. # noqa: E501 + + + :return: The default_port of this URL. # noqa: E501 + :rtype: int + """ + return self._default_port + + @default_port.setter + def default_port(self, default_port): + """Sets the default_port of this URL. + + + :param default_port: The default_port of this URL. # noqa: E501 + :type: int + """ + + self._default_port = default_port + + @property + def file(self): + """Gets the file of this URL. # noqa: E501 + + + :return: The file of this URL. # noqa: E501 + :rtype: str + """ + return self._file + + @file.setter + def file(self, file): + """Sets the file of this URL. + + + :param file: The file of this URL. # noqa: E501 + :type: str + """ + + self._file = file + + @property + def host(self): + """Gets the host of this URL. # noqa: E501 + + + :return: The host of this URL. # noqa: E501 + :rtype: str + """ + return self._host + + @host.setter + def host(self, host): + """Sets the host of this URL. + + + :param host: The host of this URL. # noqa: E501 + :type: str + """ + + self._host = host + + @property + def path(self): + """Gets the path of this URL. # noqa: E501 + + + :return: The path of this URL. # noqa: E501 + :rtype: str + """ + return self._path + + @path.setter + def path(self, path): + """Sets the path of this URL. + + + :param path: The path of this URL. # noqa: E501 + :type: str + """ + + self._path = path + + @property + def port(self): + """Gets the port of this URL. # noqa: E501 + + + :return: The port of this URL. # noqa: E501 + :rtype: int + """ + return self._port + + @port.setter + def port(self, port): + """Sets the port of this URL. + + + :param port: The port of this URL. # noqa: E501 + :type: int + """ + + self._port = port + + @property + def protocol(self): + """Gets the protocol of this URL. # noqa: E501 + + + :return: The protocol of this URL. # noqa: E501 + :rtype: str + """ + return self._protocol + + @protocol.setter + def protocol(self, protocol): + """Sets the protocol of this URL. + + + :param protocol: The protocol of this URL. # noqa: E501 + :type: str + """ + + self._protocol = protocol + + @property + def query(self): + """Gets the query of this URL. # noqa: E501 + + + :return: The query of this URL. # noqa: E501 + :rtype: str + """ + return self._query + + @query.setter + def query(self, query): + """Sets the query of this URL. + + + :param query: The query of this URL. # noqa: E501 + :type: str + """ + + self._query = query + + @property + def ref(self): + """Gets the ref of this URL. # noqa: E501 + + + :return: The ref of this URL. # noqa: E501 + :rtype: str + """ + return self._ref + + @ref.setter + def ref(self, ref): + """Sets the ref of this URL. + + + :param ref: The ref of this URL. # noqa: E501 + :type: str + """ + + self._ref = ref + + @property + def user_info(self): + """Gets the user_info of this URL. # noqa: E501 + + + :return: The user_info of this URL. # noqa: E501 + :rtype: str + """ + return self._user_info + + @user_info.setter + def user_info(self, user_info): + """Sets the user_info of this URL. + + + :param user_info: The user_info of this URL. # noqa: E501 + :type: str + """ + + self._user_info = user_info + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(URL, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, URL): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/url_stream_handler.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/url_stream_handler.py new file mode 100644 index 0000000..359d394 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/url_stream_handler.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class URLStreamHandler(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + } + + attribute_map = { + } + + def __init__(self): # noqa: E501 + """URLStreamHandler - a model defined in Swagger""" # noqa: E501 + self.discriminator = None + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(URLStreamHandler, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, URLStreamHandler): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/user.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/user.py new file mode 100644 index 0000000..fb40e9f --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/user.py @@ -0,0 +1,350 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class User(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'authority': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'email': 'str', + 'first_name': 'str', + 'id': 'UserId', + 'last_name': 'str', + 'name': 'str', + 'tenant_id': 'TenantId' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'authority': 'authority', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'email': 'email', + 'first_name': 'firstName', + 'id': 'id', + 'last_name': 'lastName', + 'name': 'name', + 'tenant_id': 'tenantId' + } + + def __init__(self, additional_info=None, authority=None, created_time=None, customer_id=None, email=None, first_name=None, id=None, last_name=None, name=None, tenant_id=None): # noqa: E501 + """User - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._authority = None + self._created_time = None + self._customer_id = None + self._email = None + self._first_name = None + self._id = None + self._last_name = None + self._name = None + self._tenant_id = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if authority is not None: + self.authority = authority + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if email is not None: + self.email = email + if first_name is not None: + self.first_name = first_name + if id is not None: + self.id = id + if last_name is not None: + self.last_name = last_name + if name is not None: + self.name = name + if tenant_id is not None: + self.tenant_id = tenant_id + + @property + def additional_info(self): + """Gets the additional_info of this User. # noqa: E501 + + + :return: The additional_info of this User. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this User. + + + :param additional_info: The additional_info of this User. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def authority(self): + """Gets the authority of this User. # noqa: E501 + + + :return: The authority of this User. # noqa: E501 + :rtype: str + """ + return self._authority + + @authority.setter + def authority(self, authority): + """Sets the authority of this User. + + + :param authority: The authority of this User. # noqa: E501 + :type: str + """ + allowed_values = ["SYS_ADMIN", "TENANT_ADMIN", "CUSTOMER_USER", "REFRESH_TOKEN"] # noqa: E501 + if authority not in allowed_values: + raise ValueError( + "Invalid value for `authority` ({0}), must be one of {1}" # noqa: E501 + .format(authority, allowed_values) + ) + + self._authority = authority + + @property + def created_time(self): + """Gets the created_time of this User. # noqa: E501 + + + :return: The created_time of this User. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this User. + + + :param created_time: The created_time of this User. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this User. # noqa: E501 + + + :return: The customer_id of this User. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this User. + + + :param customer_id: The customer_id of this User. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def email(self): + """Gets the email of this User. # noqa: E501 + + + :return: The email of this User. # noqa: E501 + :rtype: str + """ + return self._email + + @email.setter + def email(self, email): + """Sets the email of this User. + + + :param email: The email of this User. # noqa: E501 + :type: str + """ + + self._email = email + + @property + def first_name(self): + """Gets the first_name of this User. # noqa: E501 + + + :return: The first_name of this User. # noqa: E501 + :rtype: str + """ + return self._first_name + + @first_name.setter + def first_name(self, first_name): + """Sets the first_name of this User. + + + :param first_name: The first_name of this User. # noqa: E501 + :type: str + """ + + self._first_name = first_name + + @property + def id(self): + """Gets the id of this User. # noqa: E501 + + + :return: The id of this User. # noqa: E501 + :rtype: UserId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this User. + + + :param id: The id of this User. # noqa: E501 + :type: UserId + """ + + self._id = id + + @property + def last_name(self): + """Gets the last_name of this User. # noqa: E501 + + + :return: The last_name of this User. # noqa: E501 + :rtype: str + """ + return self._last_name + + @last_name.setter + def last_name(self, last_name): + """Sets the last_name of this User. + + + :param last_name: The last_name of this User. # noqa: E501 + :type: str + """ + + self._last_name = last_name + + @property + def name(self): + """Gets the name of this User. # noqa: E501 + + + :return: The name of this User. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this User. + + + :param name: The name of this User. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def tenant_id(self): + """Gets the tenant_id of this User. # noqa: E501 + + + :return: The tenant_id of this User. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this User. + + + :param tenant_id: The tenant_id of this User. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(User, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, User): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/user_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/user_id.py new file mode 100644 index 0000000..794ed4a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/user_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class UserId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """UserId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this UserId. # noqa: E501 + + + :return: The id of this UserId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this UserId. + + + :param id: The id of this UserId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(UserId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, UserId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/user_password_policy.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/user_password_policy.py new file mode 100644 index 0000000..3376ab3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/user_password_policy.py @@ -0,0 +1,266 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class UserPasswordPolicy(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'minimum_digits': 'int', + 'minimum_length': 'int', + 'minimum_lowercase_letters': 'int', + 'minimum_special_characters': 'int', + 'minimum_uppercase_letters': 'int', + 'password_expiration_period_days': 'int', + 'password_reuse_frequency_days': 'int' + } + + attribute_map = { + 'minimum_digits': 'minimumDigits', + 'minimum_length': 'minimumLength', + 'minimum_lowercase_letters': 'minimumLowercaseLetters', + 'minimum_special_characters': 'minimumSpecialCharacters', + 'minimum_uppercase_letters': 'minimumUppercaseLetters', + 'password_expiration_period_days': 'passwordExpirationPeriodDays', + 'password_reuse_frequency_days': 'passwordReuseFrequencyDays' + } + + def __init__(self, minimum_digits=None, minimum_length=None, minimum_lowercase_letters=None, minimum_special_characters=None, minimum_uppercase_letters=None, password_expiration_period_days=None, password_reuse_frequency_days=None): # noqa: E501 + """UserPasswordPolicy - a model defined in Swagger""" # noqa: E501 + self._minimum_digits = None + self._minimum_length = None + self._minimum_lowercase_letters = None + self._minimum_special_characters = None + self._minimum_uppercase_letters = None + self._password_expiration_period_days = None + self._password_reuse_frequency_days = None + self.discriminator = None + if minimum_digits is not None: + self.minimum_digits = minimum_digits + if minimum_length is not None: + self.minimum_length = minimum_length + if minimum_lowercase_letters is not None: + self.minimum_lowercase_letters = minimum_lowercase_letters + if minimum_special_characters is not None: + self.minimum_special_characters = minimum_special_characters + if minimum_uppercase_letters is not None: + self.minimum_uppercase_letters = minimum_uppercase_letters + if password_expiration_period_days is not None: + self.password_expiration_period_days = password_expiration_period_days + if password_reuse_frequency_days is not None: + self.password_reuse_frequency_days = password_reuse_frequency_days + + @property + def minimum_digits(self): + """Gets the minimum_digits of this UserPasswordPolicy. # noqa: E501 + + + :return: The minimum_digits of this UserPasswordPolicy. # noqa: E501 + :rtype: int + """ + return self._minimum_digits + + @minimum_digits.setter + def minimum_digits(self, minimum_digits): + """Sets the minimum_digits of this UserPasswordPolicy. + + + :param minimum_digits: The minimum_digits of this UserPasswordPolicy. # noqa: E501 + :type: int + """ + + self._minimum_digits = minimum_digits + + @property + def minimum_length(self): + """Gets the minimum_length of this UserPasswordPolicy. # noqa: E501 + + + :return: The minimum_length of this UserPasswordPolicy. # noqa: E501 + :rtype: int + """ + return self._minimum_length + + @minimum_length.setter + def minimum_length(self, minimum_length): + """Sets the minimum_length of this UserPasswordPolicy. + + + :param minimum_length: The minimum_length of this UserPasswordPolicy. # noqa: E501 + :type: int + """ + + self._minimum_length = minimum_length + + @property + def minimum_lowercase_letters(self): + """Gets the minimum_lowercase_letters of this UserPasswordPolicy. # noqa: E501 + + + :return: The minimum_lowercase_letters of this UserPasswordPolicy. # noqa: E501 + :rtype: int + """ + return self._minimum_lowercase_letters + + @minimum_lowercase_letters.setter + def minimum_lowercase_letters(self, minimum_lowercase_letters): + """Sets the minimum_lowercase_letters of this UserPasswordPolicy. + + + :param minimum_lowercase_letters: The minimum_lowercase_letters of this UserPasswordPolicy. # noqa: E501 + :type: int + """ + + self._minimum_lowercase_letters = minimum_lowercase_letters + + @property + def minimum_special_characters(self): + """Gets the minimum_special_characters of this UserPasswordPolicy. # noqa: E501 + + + :return: The minimum_special_characters of this UserPasswordPolicy. # noqa: E501 + :rtype: int + """ + return self._minimum_special_characters + + @minimum_special_characters.setter + def minimum_special_characters(self, minimum_special_characters): + """Sets the minimum_special_characters of this UserPasswordPolicy. + + + :param minimum_special_characters: The minimum_special_characters of this UserPasswordPolicy. # noqa: E501 + :type: int + """ + + self._minimum_special_characters = minimum_special_characters + + @property + def minimum_uppercase_letters(self): + """Gets the minimum_uppercase_letters of this UserPasswordPolicy. # noqa: E501 + + + :return: The minimum_uppercase_letters of this UserPasswordPolicy. # noqa: E501 + :rtype: int + """ + return self._minimum_uppercase_letters + + @minimum_uppercase_letters.setter + def minimum_uppercase_letters(self, minimum_uppercase_letters): + """Sets the minimum_uppercase_letters of this UserPasswordPolicy. + + + :param minimum_uppercase_letters: The minimum_uppercase_letters of this UserPasswordPolicy. # noqa: E501 + :type: int + """ + + self._minimum_uppercase_letters = minimum_uppercase_letters + + @property + def password_expiration_period_days(self): + """Gets the password_expiration_period_days of this UserPasswordPolicy. # noqa: E501 + + + :return: The password_expiration_period_days of this UserPasswordPolicy. # noqa: E501 + :rtype: int + """ + return self._password_expiration_period_days + + @password_expiration_period_days.setter + def password_expiration_period_days(self, password_expiration_period_days): + """Sets the password_expiration_period_days of this UserPasswordPolicy. + + + :param password_expiration_period_days: The password_expiration_period_days of this UserPasswordPolicy. # noqa: E501 + :type: int + """ + + self._password_expiration_period_days = password_expiration_period_days + + @property + def password_reuse_frequency_days(self): + """Gets the password_reuse_frequency_days of this UserPasswordPolicy. # noqa: E501 + + + :return: The password_reuse_frequency_days of this UserPasswordPolicy. # noqa: E501 + :rtype: int + """ + return self._password_reuse_frequency_days + + @password_reuse_frequency_days.setter + def password_reuse_frequency_days(self, password_reuse_frequency_days): + """Sets the password_reuse_frequency_days of this UserPasswordPolicy. + + + :param password_reuse_frequency_days: The password_reuse_frequency_days of this UserPasswordPolicy. # noqa: E501 + :type: int + """ + + self._password_reuse_frequency_days = password_reuse_frequency_days + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(UserPasswordPolicy, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, UserPasswordPolicy): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type.py new file mode 100644 index 0000000..8388443 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type.py @@ -0,0 +1,266 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class WidgetType(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'alias': 'str', + 'bundle_alias': 'str', + 'created_time': 'int', + 'descriptor': 'str', + 'id': 'WidgetTypeId', + 'name': 'str', + 'tenant_id': 'TenantId' + } + + attribute_map = { + 'alias': 'alias', + 'bundle_alias': 'bundleAlias', + 'created_time': 'createdTime', + 'descriptor': 'descriptor', + 'id': 'id', + 'name': 'name', + 'tenant_id': 'tenantId' + } + + def __init__(self, alias=None, bundle_alias=None, created_time=None, descriptor=None, id=None, name=None, tenant_id=None): # noqa: E501 + """WidgetType - a model defined in Swagger""" # noqa: E501 + self._alias = None + self._bundle_alias = None + self._created_time = None + self._descriptor = None + self._id = None + self._name = None + self._tenant_id = None + self.discriminator = None + if alias is not None: + self.alias = alias + if bundle_alias is not None: + self.bundle_alias = bundle_alias + if created_time is not None: + self.created_time = created_time + if descriptor is not None: + self.descriptor = descriptor + if id is not None: + self.id = id + if name is not None: + self.name = name + if tenant_id is not None: + self.tenant_id = tenant_id + + @property + def alias(self): + """Gets the alias of this WidgetType. # noqa: E501 + + + :return: The alias of this WidgetType. # noqa: E501 + :rtype: str + """ + return self._alias + + @alias.setter + def alias(self, alias): + """Sets the alias of this WidgetType. + + + :param alias: The alias of this WidgetType. # noqa: E501 + :type: str + """ + + self._alias = alias + + @property + def bundle_alias(self): + """Gets the bundle_alias of this WidgetType. # noqa: E501 + + + :return: The bundle_alias of this WidgetType. # noqa: E501 + :rtype: str + """ + return self._bundle_alias + + @bundle_alias.setter + def bundle_alias(self, bundle_alias): + """Sets the bundle_alias of this WidgetType. + + + :param bundle_alias: The bundle_alias of this WidgetType. # noqa: E501 + :type: str + """ + + self._bundle_alias = bundle_alias + + @property + def created_time(self): + """Gets the created_time of this WidgetType. # noqa: E501 + + + :return: The created_time of this WidgetType. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this WidgetType. + + + :param created_time: The created_time of this WidgetType. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def descriptor(self): + """Gets the descriptor of this WidgetType. # noqa: E501 + + + :return: The descriptor of this WidgetType. # noqa: E501 + :rtype: str + """ + return self._descriptor + + @descriptor.setter + def descriptor(self, descriptor): + """Sets the descriptor of this WidgetType. + + + :param descriptor: The descriptor of this WidgetType. # noqa: E501 + :type: str + """ + + self._descriptor = descriptor + + @property + def id(self): + """Gets the id of this WidgetType. # noqa: E501 + + + :return: The id of this WidgetType. # noqa: E501 + :rtype: WidgetTypeId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this WidgetType. + + + :param id: The id of this WidgetType. # noqa: E501 + :type: WidgetTypeId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this WidgetType. # noqa: E501 + + + :return: The name of this WidgetType. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this WidgetType. + + + :param name: The name of this WidgetType. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def tenant_id(self): + """Gets the tenant_id of this WidgetType. # noqa: E501 + + + :return: The tenant_id of this WidgetType. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this WidgetType. + + + :param tenant_id: The tenant_id of this WidgetType. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(WidgetType, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, WidgetType): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type_details.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type_details.py new file mode 100644 index 0000000..19e197a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type_details.py @@ -0,0 +1,318 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class WidgetTypeDetails(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'alias': 'str', + 'bundle_alias': 'str', + 'created_time': 'int', + 'description': 'str', + 'descriptor': 'str', + 'id': 'WidgetTypeId', + 'image': 'str', + 'name': 'str', + 'tenant_id': 'TenantId' + } + + attribute_map = { + 'alias': 'alias', + 'bundle_alias': 'bundleAlias', + 'created_time': 'createdTime', + 'description': 'description', + 'descriptor': 'descriptor', + 'id': 'id', + 'image': 'image', + 'name': 'name', + 'tenant_id': 'tenantId' + } + + def __init__(self, alias=None, bundle_alias=None, created_time=None, description=None, descriptor=None, id=None, image=None, name=None, tenant_id=None): # noqa: E501 + """WidgetTypeDetails - a model defined in Swagger""" # noqa: E501 + self._alias = None + self._bundle_alias = None + self._created_time = None + self._description = None + self._descriptor = None + self._id = None + self._image = None + self._name = None + self._tenant_id = None + self.discriminator = None + if alias is not None: + self.alias = alias + if bundle_alias is not None: + self.bundle_alias = bundle_alias + if created_time is not None: + self.created_time = created_time + if description is not None: + self.description = description + if descriptor is not None: + self.descriptor = descriptor + if id is not None: + self.id = id + if image is not None: + self.image = image + if name is not None: + self.name = name + if tenant_id is not None: + self.tenant_id = tenant_id + + @property + def alias(self): + """Gets the alias of this WidgetTypeDetails. # noqa: E501 + + + :return: The alias of this WidgetTypeDetails. # noqa: E501 + :rtype: str + """ + return self._alias + + @alias.setter + def alias(self, alias): + """Sets the alias of this WidgetTypeDetails. + + + :param alias: The alias of this WidgetTypeDetails. # noqa: E501 + :type: str + """ + + self._alias = alias + + @property + def bundle_alias(self): + """Gets the bundle_alias of this WidgetTypeDetails. # noqa: E501 + + + :return: The bundle_alias of this WidgetTypeDetails. # noqa: E501 + :rtype: str + """ + return self._bundle_alias + + @bundle_alias.setter + def bundle_alias(self, bundle_alias): + """Sets the bundle_alias of this WidgetTypeDetails. + + + :param bundle_alias: The bundle_alias of this WidgetTypeDetails. # noqa: E501 + :type: str + """ + + self._bundle_alias = bundle_alias + + @property + def created_time(self): + """Gets the created_time of this WidgetTypeDetails. # noqa: E501 + + + :return: The created_time of this WidgetTypeDetails. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this WidgetTypeDetails. + + + :param created_time: The created_time of this WidgetTypeDetails. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def description(self): + """Gets the description of this WidgetTypeDetails. # noqa: E501 + + + :return: The description of this WidgetTypeDetails. # noqa: E501 + :rtype: str + """ + return self._description + + @description.setter + def description(self, description): + """Sets the description of this WidgetTypeDetails. + + + :param description: The description of this WidgetTypeDetails. # noqa: E501 + :type: str + """ + + self._description = description + + @property + def descriptor(self): + """Gets the descriptor of this WidgetTypeDetails. # noqa: E501 + + + :return: The descriptor of this WidgetTypeDetails. # noqa: E501 + :rtype: str + """ + return self._descriptor + + @descriptor.setter + def descriptor(self, descriptor): + """Sets the descriptor of this WidgetTypeDetails. + + + :param descriptor: The descriptor of this WidgetTypeDetails. # noqa: E501 + :type: str + """ + + self._descriptor = descriptor + + @property + def id(self): + """Gets the id of this WidgetTypeDetails. # noqa: E501 + + + :return: The id of this WidgetTypeDetails. # noqa: E501 + :rtype: WidgetTypeId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this WidgetTypeDetails. + + + :param id: The id of this WidgetTypeDetails. # noqa: E501 + :type: WidgetTypeId + """ + + self._id = id + + @property + def image(self): + """Gets the image of this WidgetTypeDetails. # noqa: E501 + + + :return: The image of this WidgetTypeDetails. # noqa: E501 + :rtype: str + """ + return self._image + + @image.setter + def image(self, image): + """Sets the image of this WidgetTypeDetails. + + + :param image: The image of this WidgetTypeDetails. # noqa: E501 + :type: str + """ + + self._image = image + + @property + def name(self): + """Gets the name of this WidgetTypeDetails. # noqa: E501 + + + :return: The name of this WidgetTypeDetails. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this WidgetTypeDetails. + + + :param name: The name of this WidgetTypeDetails. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def tenant_id(self): + """Gets the tenant_id of this WidgetTypeDetails. # noqa: E501 + + + :return: The tenant_id of this WidgetTypeDetails. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this WidgetTypeDetails. + + + :param tenant_id: The tenant_id of this WidgetTypeDetails. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(WidgetTypeDetails, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, WidgetTypeDetails): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type_id.py new file mode 100644 index 0000000..5638d0d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type_id.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class WidgetTypeId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'str' + } + + attribute_map = { + 'id': 'id' + } + + def __init__(self, id=None): # noqa: E501 + """WidgetTypeId - a model defined in Swagger""" # noqa: E501 + self._id = None + self.discriminator = None + if id is not None: + self.id = id + + @property + def id(self): + """Gets the id of this WidgetTypeId. # noqa: E501 + + + :return: The id of this WidgetTypeId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this WidgetTypeId. + + + :param id: The id of this WidgetTypeId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(WidgetTypeId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, WidgetTypeId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type_info.py new file mode 100644 index 0000000..e944427 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widget_type_info.py @@ -0,0 +1,318 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class WidgetTypeInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'alias': 'str', + 'bundle_alias': 'str', + 'created_time': 'int', + 'description': 'str', + 'id': 'WidgetTypeId', + 'image': 'str', + 'name': 'str', + 'tenant_id': 'TenantId', + 'widget_type': 'str' + } + + attribute_map = { + 'alias': 'alias', + 'bundle_alias': 'bundleAlias', + 'created_time': 'createdTime', + 'description': 'description', + 'id': 'id', + 'image': 'image', + 'name': 'name', + 'tenant_id': 'tenantId', + 'widget_type': 'widgetType' + } + + def __init__(self, alias=None, bundle_alias=None, created_time=None, description=None, id=None, image=None, name=None, tenant_id=None, widget_type=None): # noqa: E501 + """WidgetTypeInfo - a model defined in Swagger""" # noqa: E501 + self._alias = None + self._bundle_alias = None + self._created_time = None + self._description = None + self._id = None + self._image = None + self._name = None + self._tenant_id = None + self._widget_type = None + self.discriminator = None + if alias is not None: + self.alias = alias + if bundle_alias is not None: + self.bundle_alias = bundle_alias + if created_time is not None: + self.created_time = created_time + if description is not None: + self.description = description + if id is not None: + self.id = id + if image is not None: + self.image = image + if name is not None: + self.name = name + if tenant_id is not None: + self.tenant_id = tenant_id + if widget_type is not None: + self.widget_type = widget_type + + @property + def alias(self): + """Gets the alias of this WidgetTypeInfo. # noqa: E501 + + + :return: The alias of this WidgetTypeInfo. # noqa: E501 + :rtype: str + """ + return self._alias + + @alias.setter + def alias(self, alias): + """Sets the alias of this WidgetTypeInfo. + + + :param alias: The alias of this WidgetTypeInfo. # noqa: E501 + :type: str + """ + + self._alias = alias + + @property + def bundle_alias(self): + """Gets the bundle_alias of this WidgetTypeInfo. # noqa: E501 + + + :return: The bundle_alias of this WidgetTypeInfo. # noqa: E501 + :rtype: str + """ + return self._bundle_alias + + @bundle_alias.setter + def bundle_alias(self, bundle_alias): + """Sets the bundle_alias of this WidgetTypeInfo. + + + :param bundle_alias: The bundle_alias of this WidgetTypeInfo. # noqa: E501 + :type: str + """ + + self._bundle_alias = bundle_alias + + @property + def created_time(self): + """Gets the created_time of this WidgetTypeInfo. # noqa: E501 + + + :return: The created_time of this WidgetTypeInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this WidgetTypeInfo. + + + :param created_time: The created_time of this WidgetTypeInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def description(self): + """Gets the description of this WidgetTypeInfo. # noqa: E501 + + + :return: The description of this WidgetTypeInfo. # noqa: E501 + :rtype: str + """ + return self._description + + @description.setter + def description(self, description): + """Sets the description of this WidgetTypeInfo. + + + :param description: The description of this WidgetTypeInfo. # noqa: E501 + :type: str + """ + + self._description = description + + @property + def id(self): + """Gets the id of this WidgetTypeInfo. # noqa: E501 + + + :return: The id of this WidgetTypeInfo. # noqa: E501 + :rtype: WidgetTypeId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this WidgetTypeInfo. + + + :param id: The id of this WidgetTypeInfo. # noqa: E501 + :type: WidgetTypeId + """ + + self._id = id + + @property + def image(self): + """Gets the image of this WidgetTypeInfo. # noqa: E501 + + + :return: The image of this WidgetTypeInfo. # noqa: E501 + :rtype: str + """ + return self._image + + @image.setter + def image(self, image): + """Sets the image of this WidgetTypeInfo. + + + :param image: The image of this WidgetTypeInfo. # noqa: E501 + :type: str + """ + + self._image = image + + @property + def name(self): + """Gets the name of this WidgetTypeInfo. # noqa: E501 + + + :return: The name of this WidgetTypeInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this WidgetTypeInfo. + + + :param name: The name of this WidgetTypeInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def tenant_id(self): + """Gets the tenant_id of this WidgetTypeInfo. # noqa: E501 + + + :return: The tenant_id of this WidgetTypeInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this WidgetTypeInfo. + + + :param tenant_id: The tenant_id of this WidgetTypeInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def widget_type(self): + """Gets the widget_type of this WidgetTypeInfo. # noqa: E501 + + + :return: The widget_type of this WidgetTypeInfo. # noqa: E501 + :rtype: str + """ + return self._widget_type + + @widget_type.setter + def widget_type(self, widget_type): + """Sets the widget_type of this WidgetTypeInfo. + + + :param widget_type: The widget_type of this WidgetTypeInfo. # noqa: E501 + :type: str + """ + + self._widget_type = widget_type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(WidgetTypeInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, WidgetTypeInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widgets_bundle.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widgets_bundle.py new file mode 100644 index 0000000..d52637d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widgets_bundle.py @@ -0,0 +1,266 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class WidgetsBundle(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'alias': 'str', + 'created_time': 'int', + 'description': 'str', + 'id': 'WidgetsBundleId', + 'image': 'str', + 'tenant_id': 'TenantId', + 'title': 'str' + } + + attribute_map = { + 'alias': 'alias', + 'created_time': 'createdTime', + 'description': 'description', + 'id': 'id', + 'image': 'image', + 'tenant_id': 'tenantId', + 'title': 'title' + } + + def __init__(self, alias=None, created_time=None, description=None, id=None, image=None, tenant_id=None, title=None): # noqa: E501 + """WidgetsBundle - a model defined in Swagger""" # noqa: E501 + self._alias = None + self._created_time = None + self._description = None + self._id = None + self._image = None + self._tenant_id = None + self._title = None + self.discriminator = None + if alias is not None: + self.alias = alias + if created_time is not None: + self.created_time = created_time + if description is not None: + self.description = description + if id is not None: + self.id = id + if image is not None: + self.image = image + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + + @property + def alias(self): + """Gets the alias of this WidgetsBundle. # noqa: E501 + + + :return: The alias of this WidgetsBundle. # noqa: E501 + :rtype: str + """ + return self._alias + + @alias.setter + def alias(self, alias): + """Sets the alias of this WidgetsBundle. + + + :param alias: The alias of this WidgetsBundle. # noqa: E501 + :type: str + """ + + self._alias = alias + + @property + def created_time(self): + """Gets the created_time of this WidgetsBundle. # noqa: E501 + + + :return: The created_time of this WidgetsBundle. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this WidgetsBundle. + + + :param created_time: The created_time of this WidgetsBundle. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def description(self): + """Gets the description of this WidgetsBundle. # noqa: E501 + + + :return: The description of this WidgetsBundle. # noqa: E501 + :rtype: str + """ + return self._description + + @description.setter + def description(self, description): + """Sets the description of this WidgetsBundle. + + + :param description: The description of this WidgetsBundle. # noqa: E501 + :type: str + """ + + self._description = description + + @property + def id(self): + """Gets the id of this WidgetsBundle. # noqa: E501 + + + :return: The id of this WidgetsBundle. # noqa: E501 + :rtype: WidgetsBundleId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this WidgetsBundle. + + + :param id: The id of this WidgetsBundle. # noqa: E501 + :type: WidgetsBundleId + """ + + self._id = id + + @property + def image(self): + """Gets the image of this WidgetsBundle. # noqa: E501 + + + :return: The image of this WidgetsBundle. # noqa: E501 + :rtype: str + """ + return self._image + + @image.setter + def image(self, image): + """Sets the image of this WidgetsBundle. + + + :param image: The image of this WidgetsBundle. # noqa: E501 + :type: str + """ + + self._image = image + + @property + def tenant_id(self): + """Gets the tenant_id of this WidgetsBundle. # noqa: E501 + + + :return: The tenant_id of this WidgetsBundle. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this WidgetsBundle. + + + :param tenant_id: The tenant_id of this WidgetsBundle. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this WidgetsBundle. # noqa: E501 + + + :return: The title of this WidgetsBundle. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this WidgetsBundle. + + + :param title: The title of this WidgetsBundle. # noqa: E501 + :type: str + """ + + self._title = title + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(WidgetsBundle, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, WidgetsBundle): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widgets_bundle_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widgets_bundle_id.py new file mode 100644 index 0000000..8bc7b5d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_ce/widgets_bundle_id.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class WidgetsBundleId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'str' + } + + attribute_map = { + 'id': 'id' + } + + def __init__(self, id=None): # noqa: E501 + """WidgetsBundleId - a model defined in Swagger""" # noqa: E501 + self._id = None + self.discriminator = None + if id is not None: + self.id = id + + @property + def id(self): + """Gets the id of this WidgetsBundleId. # noqa: E501 + + + :return: The id of this WidgetsBundleId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this WidgetsBundleId. + + + :param id: The id of this WidgetsBundleId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(WidgetsBundleId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, WidgetsBundleId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__init__.py new file mode 100644 index 0000000..de3fb9b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__init__.py @@ -0,0 +1,70 @@ +from .merged_user_permissions import MergedUserPermissions +from .entity_data import EntityData +from .scheduler_event_info import SchedulerEventInfo +from .group_permission import GroupPermission +from .user import User +from .entity_id import EntityId +from .allowed_permissions_info import AllowedPermissionsInfo +from .device_group_ota_package import DeviceGroupOtaPackage +from .login_white_labeling_params import LoginWhiteLabelingParams +from .sign_up_request import SignUpRequest +from .share_group_request import ShareGroupRequest +from .home_dashboard import HomeDashboard +from .dashboard_info import DashboardInfo +from .edge import Edge +from .scheduler_event_with_customer_info import SchedulerEventWithCustomerInfo +from .entity_relation_info import EntityRelationInfo +from .component_descriptor import ComponentDescriptor +from .group_permission_id import GroupPermissionId +from .page_data_converter import PageDataConverter +from .role_id import RoleId +from .asset import Asset +from .page_data_integration import PageDataIntegration +from .device import Device +from .sign_up_self_registration_params import SignUpSelfRegistrationParams +from .report_config import ReportConfig +from .page_data_short_entity_view import PageDataShortEntityView +from .user_id import UserId +from .integration_id import IntegrationId +from .page_data_entity_group_info import PageDataEntityGroupInfo +from .merged_group_permission_info import MergedGroupPermissionInfo +from .page_data_scheduler_event_info import PageDataSchedulerEventInfo +from .entity_view_id import EntityViewId +from .merged_group_type_permission_info import MergedGroupTypePermissionInfo +from .page_data_role import PageDataRole +from .entity_view import EntityView +from .favicon import Favicon +from .converter import Converter +from .entity_group_id import EntityGroupId +from .edge_event import EdgeEvent +from .short_entity_view import ShortEntityView +from .custom_menu_item import CustomMenuItem +from .role import Role +from .entity_group_info import EntityGroupInfo +from .palette import Palette +from .entity_subtype import EntitySubtype +from .integration import Integration +from .palette_settings import PaletteSettings +from .dashboard import Dashboard +from .custom_menu import CustomMenu +from .relations_search_parameters import RelationsSearchParameters +from .o_auth2_basic_mapper_config import OAuth2BasicMapperConfig +from .group_permission_info import GroupPermissionInfo +from .entity_group import EntityGroup +from .custom_translation import CustomTranslation +from .contact_basedobject import ContactBasedobject +from .customer import Customer +from .relation_entity_type_filter import RelationEntityTypeFilter +from .blob_entity_id import BlobEntityId +from .blob_entity_with_customer_info import BlobEntityWithCustomerInfo +from .self_registration_params import SelfRegistrationParams +from .converter_id import ConverterId +from .scheduler_event import SchedulerEvent +from .page_data_blob_entity_with_customer_info import PageDataBlobEntityWithCustomerInfo +from .entity_relation import EntityRelation +from .audit_log import AuditLog +from .scheduler_event_id import SchedulerEventId +from .white_labeling_params import WhiteLabelingParams +from .asset_id import AssetId +from .blob_entity_info import BlobEntityInfo +from .page_data_contact_basedobject import PageDataContactBasedobject diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b1a2310f7a145dff91c063e26ec70431eef6dcc GIT binary patch literal 4231 zcmd5Y=eyP{m$JqCJ{_Dj~QN zy0J&~2#!M%Qz|963(}ZT8NmtY#Xi+1xEuO0tFnT7U;qczpx`77;jkJOoPrS?RilE_ zFoxr5TyO>^a8gYQ?u98lr_KrPgY!78rUm!I3|>$d1ZUwQUQ(9?55Q%-qOJ%YgsV8K zW(5zyHN38_3m%3WIH%?WkH9?UR8H_H+{6X7Ab1RJ;i6g;JPx<z4G!RO#HK2c8upNFUTOg$4k4bO2&EeW21Wn57!f-k@-uBkP_7hxSY z)P~?o@B%m0rr^u)GyFh(AovQr#4WWY_$qve+iF|zEbQP%>LbC|U>EZ$FZepV!q@7x z;2ZEUzEN)k&%w{}6ZMJUc~JPN`c!ZZeu1B<&jjCuU!tWf!3*#!w3RLR78J0kih>uR zgj#9Aw_y*Yd<+V9-;Z;78zN zUDX9YhJ8Fx2ZEo#uklbF3VsT|!7tPof}g=}@k{lk;OFo={7QW#cnN-wU#qVLFT)@3 z8}*Ig75F25tG*Sy3V*`y)OUi{;LrHI`d;ul`~`ndKM>x?$7WyrvyINxY}?V`mNsQw zdhKbmqYXNq=eSjm6y0l8-|-JuZQrI*f4*4Jr8;P{wy&%HW_8acX=cN?^;&ZtiQ3r{ zeRl=ZH%o+vmH^xXU1}P7p@YFyz3&vYxY_pY9lQ9}E^C@H^3p9k)i)K#*DvjY2B%uy zv5k$KSt{?8tFLRj`dwXnJ_-8r725<(n!?lz7xk*`RSK?cIEz$c5C(5wD@m-W<7<24 z_?4Bq=hJi(TJ{Hv+0|hCRGv_pU2(DIR;e7T+AA8T=DWP|z7s`}67=oRy114rZgpQ9 zUux93>w*?_$CBr1UP?By+pPM!Y$P0sJA*nAng|x3*RZ#%%Z}#kL?UHPUmnf4h zu3jD1bhAIgSjos87m6|tdos*FzHU?VxK&alTFaVhO`3N;!5b}oOM}e&g-8e6y``)5 zOMczR&4|f%5f&PuY{8r=^Y@Dm2ZLJvA`*ZlckIH0W-|rO{~A zUS3|?rdW|J)zm3GZ+LsD?pJOt+n!V0vTHSM8atdleJgreQYQy}L9AECu6jWildzwh z_;%4Jx4PsOKG#L=!LF$L36Dfc1>Sg<)*T4iH@OUMA&|>F7VT0*sD__1sz(c_S|uU^LrD`lPwaVJEvsgJRY$Fo^6@q1rEDJT@tdj0>7?rTeX01O@h_qz?5qpFy~qjk}jDr z>l%Kisf z%>ZlShUkaw26@zBGgq4-#)Hi{PLr_BFzY&la+?tzoR3Q95ph%fn#>(lc$CdjM%bGZ zAo@0AEE{je@R-A`aNYaF;%1yJ;?ixD-vp1+EtzoAlP8>n(}OxlyG^mhMA*6S*M~du z9GgtFWO7>Do@b+UOL`oBnuXKHoHJXt^k}egGcvgufopCqurN9`vfzs>iSGr>Z!Xd3 zDAC-m%dE{DUt!5yVQDwFSa8V9RTlKUU(H#T_XfRYAzcR+odq=4NPN^T30;?&#{+PE zZm>zb7F-Qxj;*3Xc)|5x=2_U&vNr91y>*){22bDZJFH8#uF~9PQGb{OJvyRW#N1;= zmbQQ|5{?wzB<4PAx}uY79`LY{bkxPt3wv^p4Q+4leO+uQaZq_0Cu literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/allowed_permissions_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/allowed_permissions_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d5d6d38ab0e8c7343f6ac0e92dc0fe896b09c21 GIT binary patch literal 10397 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/asset.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/asset.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0efb34b6b7cd25883f51705bc3b834fb45767f1 GIT binary patch literal 7655 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 POtd3VS4{Fr2uuG5DwtF# literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/blob_entity_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/blob_entity_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc69ea88436c7c5f1636628f398407e516085dc1 GIT binary patch literal 3216 zcmbVOTW=dT7UobRX*8CdYlEiy!rh|js*6bJ7W*Q&Mw=!L^5QJ&6xa$arlTQck29K? zkd#|%+2!I^X%^@ zX$1kG%slWfGKCwb9HqFHf8G-lP%Re zZj4%z@33Awe&jJ03OvvE(tOuEEMhIi7ms(Ii%d)Ai2!N9s5#b~hnD!NAysI_`@m61mcST;jjECa!pB{WzgM3!19EgP} zRU!_QHdrwff9yYSCVW;vNn(evV^Vx_5r`9bqH?8UtE3no4g~==K)jpUz1g^*6w`tE zF5cZ$+96zxlR~OpmG>bQ{)AAl?VsRH*7K_1ac)z4_*5qJ_xXonM~|7HQw%X<6t7XE z!{p5$*u+>qDsUX$15 z4ZOQQFrSUq5#?J|_hD9ySD5Bz``PoyLyEW&NfsL;FhDd50c+0OAncwJOH&1zx|#(Y zN?q*gc-pUh|ENGXtWXj`r$x2SX`IjEEIaHw2X7}0XLsGvm^?vma}%9q$Lz#gcnf~Y zJ@6T*`Mh@?wYV>0F$IiFNHs}wgeuL&P92u*9xUbBB548AlV%pgybVlc(xNuhVuM+21~nDe9^Wa)TN9)k4w zNBs{U48U=9zl@U?;3Wjd5m6X=Q|vczNX_yUm1;0X1fnI9RQAh5-Gbe}B?oYHH~IXn z^XB$fW+X(Z)k9-ypP?CAzhL_ezVhaOd!mqkSMg?1TT^a@G-a~U%w}Sb#3m{XOkT+Hjjj1_% zsVIUWEL!p7Xy=z~4r_usq-6}o!aM(;omb7=*6RS&Re3T>s8CZHsFBE4J{D`LWBJ zP4+Ud?S(HJkmxV`li-xR#ohn3vV;FWwH>VV>y;{kQ5Vd?y&j23;bHD z>u+X75@%)$gL;Y6`tvC7ouRzTB%+~j0CD54!+qCbp5Q!nsQqnCTRVlCOx4%X0kDsH zF};LY-@@EeG?&d?@6LaGueV+`O!|G*fxM)#zs=cdlCR$yEIB0P)$2dSM zKTD0R8q>JcH)vOKQ{|KMs;1LI(q=Yxg-=uU?X?_ts}>5^EVGsGbb3+MJczTIsv0lU z;bpv}b%b z3#j}OQ;s(qe17XPWXxYdd{&z%{lQ&E+y&OR>CW`6+x=S+=Mv-kqvvTVe)>%yaB`77 zQS{XcMsW2|s3ooxNlGW@x_2-@I(Zi9WZHC)QbAdG`}_r6`1rYm)iWFx6EQCAo+!rq zD!~B~Yb9`*i?h#r4gEGDrJ&HEN<_kOS(m%2iA73Zabpyzmr?W$mN-6#-1oYdU0KUq zvEa;=uFS)N7ra|L^MkX%{~Tg>`ykXcAfo0Qpydiy5H#8M`Ss-mBvDxg z9sfHcJ0#)`N^<;dG(#Z`nD23aBj7&rsS|oZ82l#i1OIxv&g8bHgGRrLuHsthw=fuW k&aNAp_~9haZRIwltxz~?Be$qr8T!lT*ue{U*Sp>LFHmw8ng9R* literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/blob_entity_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/blob_entity_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a25e0f9fede1eded325654cda4c47ff497a6cbc GIT binary patch literal 8231 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 BjQ9Wm literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/client_registration_dto.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/client_registration_dto.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7864c7254ff672947f3b5d1274a71f76ad298888 GIT binary patch literal 11909 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/contact_basedobject.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/contact_basedobject.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64670c82552c1cb00fbdaacb82d7167c8ba528ae GIT binary patch literal 9983 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 G+5ZQ%toL~U literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/custom_menu_item.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/custom_menu_item.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a6eab6b4388e333e693ee6402a05f4354795f5f GIT binary patch literal 7881 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 UV*{TDM2b%=fcmDP8gMrM1N`5?O8@`> literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/custom_translation.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/custom_translation.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bfa51ea57cc255d25be379e3a0ffc691e0b539c GIT binary patch literal 3444 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 dqEL?*N?q2(kbG literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/device.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/device.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0f20d5cce76ff30c1383980717d3899562e8d66 GIT binary patch literal 9691 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/device_group_ota_package.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/device_group_ota_package.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e811d5505dd33fa25301a37e3b0f0f649ccb0dce GIT binary patch literal 6398 zcmb_g&2JmW72jPh$>oZYvAlc|%~W>AxM(l)577mh5~}hr(XI8GzaU@gV9S-w15k==&hFm?V-257ATN&ZY`Sh_hw0YMNyKSn$pb9 zn~yhd-uum)c@s`fx(0rWzkjsy1hr zErVyc{m|gHu(va{EVq`7Qr5p=8ivd8TV4-ZYti>ZUvhSPercIq|6sw@EjL5Sf>xwt zr>=sq6|wd30aGFKJ8C_YL02#-?sr6_BGzsQKN4­umte6}vd>U$T~m1@scDoW3= zLNk~+=(@B6cC z{@a(YBtkB>MGF$Ms4ePjL&yjtX4%{2%X$g#hhS1yvslM!cx|^Jy2CBe64FSO7IIb0+3Pn{xOO>**vqs{20go-DsZjY|I}x1f zrqi_AY>W7Gx~9|SK#!+_rl{pLqXjO>__ZRs^%bzdYs9usErUtz#8di1&0-lGs&yJU z_)*zHdLJp0$hg@vyd=jiM;U-Zp3%9j^K1_-9aGNqs3q4!4^XUUfy(#L6V!!X29(po z2vFso4XV(~YU9w; z4LOZ||NgY{VFXuEX$AGL07uZe^jPK==p-6)HCiHu&CMn?JWV1P5WkGA{MTK#-1F{f7I>j{Y6K| ztQ4vv;cl0|HZx*FzgbBTfMZW@+TlcxO-ZLAK1cA;HcYakL=qgXBYi=;CFks?ron3K z)NSyiG9|4hnnQ1#0r-Et^qi`469=VN)b`=AhB|&BN;*hKRe1v9m#joZdW#U&NA&aq zRB1iAg?-^7j}s%a``HjE0e>M7d0sXe87XkUg{L7gLCZTiT%%sC1_Z(VBdR}ztb1lW zssp|+5ael$gYWyr(ENu=zSr;pPfUL3(2?ymTy$dW^qQ-3Mhljhm{vKu6{zkG)t^Cj zsDb}9G;qp0!CSu&WB)%ahdStcg~j3Fxxmv1DAH2LA%M<>d(@~A@Wyxq?3VCQH2iUh zhTQ`X(bisM>>i$=WOv;mEDuJ^;y7hhC4z{dchJY?h}I-Z~DD16d;sAS4XTID#@&_&`?YSgGXe>iGLv|YH#U^Ka2I!>aukWm!2W^GwG zR;&$EPAf!Xk4&O=tZnmWRHA#FO)**b4`UJb4C_A_W5i%D%ASGk!8l86wdUMhxc$Q) zUB5kFbCwowE>o#{b)mK4H{ec?cLc*7i`^MD>>YOTlgnGBZ?a}5Qfvk2X=wy~a%HPp z%EazRG<06dP{uhhX!=Thp85#}qQhaZC$;j%k1C zW)Jm{e;Et&)YbHbqy2019tAyuo3yK>#g7F&U7UYOjT-cq4hMZo!d=);U!?{o=-q4-{T&SK6ra8LPBk7f$-yvB>#-`&LQ{h~7HMu2Y*hCvs^8;9>1d{;UBmBC2#hUL z8E^*1U2Dg@Vf^&HpTJRUWfa1*p0#al*~;$OD!XmTb1JKH+=Wpvve-c3?At0jjwvZ|ii0bjrcu-e+wida@C8UUOrVx&B6Y>=>pSgpE z9t9^>HO{Nhqw$ZeIKS>kzEV=YiV-C^DT0sV0{TlD6UCGL7ZH#Abrk2<1YX6Ij9omn;cd>x z6IyIHf=I=grr(wfy!8CBODp6$DrXh{>*ic@nrN$g_CRawQ9C_r>K#J< zD%l;6tQ}*AuxED5Y3$+r!OJDyAlq2P@Uc*bvLbn#zyXqLx6w<*`F8*GpjC|XgK-W3 z0n5LlT_b7A>b|nC?C7{hbkeI9oemtp+8|g%=rcFz;L~EHnMoR*00e%NxR!j_Bj^s+-vr)S=^?$K+omDoC&=u&zzgUJF(_cs8URdkl54(|4hp z`Y|KUMMA*?jCnb_Q Oh|CJnT*q|aS^fuJ=W~?+ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/domain_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/domain_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35dfd2be4d3d5d87eb5d76295d9760de79fab166 GIT binary patch literal 3942 zcmbVP&u<&Y72X*x$<>;YWyf)?1VsmJ5r;uc+DY4kpa@PQ+4Z4v8mUD8LIna^B5^D#XmfWF#-k#UrnCNnVjx(KqB9@*4Vi z`KG*%enI{~-avm@)?oU#if}FO$7%KeDjAuLhg<8*oO(YdI`rg_7_CVk-CS$JsFM_4Zp%=S2lR)#Qbr#eG%OOtP!` zN|QtDDw>Uils9>Z=6FBBYkq-7vauJHEqom`AEO^Ky*Q>(WehcAv^3@z`I2p7EyU)d zo3F$cw?r)ZkfSH0+D_!wHQPN8h4s8e7oOIDZA(qIJ5qWoOuwMib$kayByQHl}G&NphH5RxxWd66K zH(qI>HCde?7fc_b=_Q4KQ$sWM_B<$%js9|9A=JsLq#TiNgNC=vY-MNX6o@H(K2WnZsX{P(VV49$z3(z@@mklLNXN(U(d_#^?3r3e`AQJS1zE2*a zrw&H!&W$Ec^T*BqCv#XjzC${Q5eZH^-%rx>f^O(}Kx*<*P8TEOUT1_|!6!pPgmV|# zQa5NLHu~GtiluLVe>;9>erLuDEZJnbP691Zb4E1E2KVVZES%y%X# zrrJ1fZAvG<+S>ZGs8YMxss8%G=j&^upFPN)#=TSuv_mD3NyMY_xJTmMFK-_--xvL% zv7(Eh%v@l8dFNmQn}xq4hIOrTUDUwVkFC>ovr_sK>8rDV%$z?{GIG0{*BRkASZByW zK@c#GzkvBK!|Ewtqj;p(>HnV~QtyCS4;uIO_%U1a{_xT7`2jzu*vi-&^Fw~%TYv1^ z>LJ%ZwpClBg5}5?`-iX&S!u<464?6KmldpNjs54rF~w&2ojB+4{bM@^PQT=Q9v*wM z++%;b{*rCD^`DPDS_L!#&{Pkw57tz1*26Jf6V=f>pSe_3Cc5&Dz!f)8+NKIuBmRX< z6MIT_%9rGSn|RH2G!|J?GT@uTdF&VyW6Gg?qo~_FBK{Y=sPD!mwpQzF;ApafeQ`$j zMX=I~`&}8Y?$O2+;Mcv;PiNxbWV6;vFHhp0Sp`utxIHh%_|6pL5~2b)uK;gl$)R3y zh__KDI?VpY*Cd|XP&?{P3<1~2P1QexSl__h6TF68p~0?y>$B!OF8uV1Vh-yy@t9)% zq?U*%1WZxiQ7HASE<)6gC^%!(g@xZsjV&tuc%Vt6?)<_h)fLrp7pykJuB$LK>84q8 zUR~61We$6`@ZFv)Dyq)2i^^lQe-~!%boIOm&gq(RwTlIcn=%fb^JDLryo`-nvtEXq4K+Bb=>d>W%U*ZCs7H;QS_$?h=89dJ<9o0DV!is7&#bkfj}5Bi!d^Es^KV+jM*N4Ouu0G zOrUBc#dKSAbGs|@?w(3ero>ta{5pwy_mJ# z+OWz)1lL^1CVj9NydC&~->6T*o9cf}cYDFL(r*({D-G^eyzW@!&{FhO%3X$#;Mg!= H0fPO1BILgq literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/edge.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/edge.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06c0396ac9f8102c073d33a05f69dc73e87e1dab GIT binary patch literal 10576 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/edge_event.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/edge_event.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0cd832fbd66830807871331c064cc73551722cc GIT binary patch literal 9223 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 IdvFo|17;U|RR910 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_group.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_group.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c83dc16c51125af9e0800dfc8d6510146e826227 GIT binary patch literal 8392 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 KOf05|H~$0b5e#(z literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_group_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_group_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..307c74bcd1f3e7db7f5da78ae948f89f3786c398 GIT binary patch literal 3231 zcmbVOTaVku6&{W#iQ-C|wc{9Z`!a2ixN>31Y0wv8v&hAc;g@xhb%0iAz)+l#mTQWn zXGV5b(4r4(ATRw9yN~#WQEVbIy0pVbSY_4A=9& z9!(C{82cMNT)ccde1>5*F-bON(vv*%#-6+LF?aXIxFH+T&-{6F-1OK}CY!SLmdTcC z9yZ1;$#+=49Y6LM3k9whyJB zN~=6kSQ+~;F4N)tt+V3=L>6Z??2iNiHb6W}?e1bSNQ(K; zyoqNsr5(bvby7$*Q~3a5;g1Lf+x`*WWPPs+p5!*Q`_E)Te_y;Pc66C3CdCjlM)4Xq zI!xaFflWP%+1t+8SIs(Jhu*lQT6=BTrs&a=3}ojm8wWC!Yq)o0SN3oZ<+^+a_cgg8 zZ{gnkf%$CQLzLgGdNrP>x>%IYrhcb#z*x%m_zcHZ9Fi(?WILGE`p=auop~_#Ii?khP>10^$ zgZB9+gO48#!E*JmjFXpOCIlxDkr;YYoHukx&FL*F6|^}JGYUeK%0aoWTd@2W(}x(&@K&(gxC}Fu33=q~ zqBRX?GSx=#ghgj8`P0sSH9M?%>adnEhzk$>pQc{7bX)fTsn2Ue$+DZQ9pZmyZP>XK zPKqE6XWL(}NZEmBDHqrtKlUE8Z$JGbKi~%q+gPy`Kja6#^;f=a9&-Il+q5kz_HWtB zKjeole>T~xz_wSuY(QeL@{fXJ@)vji)6Ne5|J-)4)30|Pg~#mT?v;Nozh=8m{`V_J zQa}>`P4fVHAk&1-=PSz9=JKPj9f4~8)me%nfqb;7LUF-Q$TYE+Y$qBwFm^D^T}&2a zmLBkRaGrOJ7b~JR->%xWh-m)_uiCq@iLKT89qd4{^}fI2?<&~L;`v0zTVIf3V$NN* zynmTur}_q)S&_t<*}|gU8^M8U%uDxRSlDVUv(g_X^$EAP7AWDWu|J+6uP6;Rfv|0 z9v!2VR(_TmTQ%l!sc+G#VSrutjDo-|6(Cs`)z3 z7OHBzRQp%)lGYK1`4uLg-{GMbdcN24xYzw>=&zqXwRra*VJq}D=$S9yyD(K7BuZ=Z^nQ#JR+}e&~CeN}#?8 z1$r166h(hH!x7xj9cqzlrIJ$0Iqzp!Af-Hulrn88d?Uc*(o9J0G0K{-+?jPZ5G$BO-d*U8{K zp5w6!qX?yKkMr+38F@|yb4ZB-@a>fRm&)g46aG%Vop^=KcMN?B;Pyz z8c9@^LC1fZWrsvu$0XO^!7vomfcYNx*8}b&sXCz-gu%}PKkzr&bvm~-wHy5briyE& r-@{_uL2}SnP%1Ss#7SN_${k8ap?uaxZc)uL^q0?Zf*0_vcc<}h;qo5? literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_group_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_group_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecbcadc3607649ac0e6ef343ba805058c53580a3 GIT binary patch literal 9261 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 F{{Zd#2c-Z2 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8082977b0ea032b5956e402aeca94d43c6ca0e2b GIT binary patch literal 4218 zcmbtX&2!tv6$e0&1R+Y66UT|&PG={bCSe+rb~5QqHHs&+1k0S-q=uyI2Gb4$ zlAwU49Wm6Qk$dZ*haP*ddh@;cXK?K)=iEB2)8AW&4E5oev<10e*stGv`+jd9!o@{f z!_)ZYMdx43n)VNB%s(a?pCiRLk#Wt{xXz89?&_*ETtk%^H?yJf3^$)^+!W?f#?5l0 zrIoV&x~^$9!_(dk20QVc(2qE4I;}RVZq{tob2p4wFodGJ-#B4Ww#$?F+k=zZV zU@TZ9_D3R?F&p-T9}D(0hy%%1eYP8k?a$udm2$XJsYta$hju6jVTFg?xPpEWi9uJO z7Rwv{FsQtLd%8WtkWpU@q)+>@p}!+mEB@^=V?SquaNl2H&ZjqTr63zaF#uu~4@H+f z6;X^CE9~R)O(nuwh()?`1#)bMpPvSz25g9dhl~~w0vrSJP9S$jopLwqSK?>> z&W?x_!fCx5aGf_n>?#( zS$>V@x%FIkb0W_R+8>TLy#imDweq~k7gdifZ1gNmTl^AVey+I-{4#$7Ws$$h zub^DyZ}F=rm-yTK9h8@N4o81Iv7CVn4H?9n>4nK% z!A@jnB>S`%_A!jYoyhN()5BN~aXyj>4lAHZ>6(3iF!Fo7gR;_il7U5)jAQ}l3lyF_ z7>dLQxND~`+Gs~vXszBQB~Blz8%S$N@vo3^eWH134x2~an4lc#(ei{^nF-X5*0qU& zmdW)N#zK5!{EMmh><05$AM*4V7u&%AMi2~GD?RXfDVr3%d5jqkAQyQMccY*m415_z z5wTE#EoBlj7QO8s-n`VJ0($?sU)hRbmX$%!4J()zY=_Z~_@p8RPvd!NRC+B~;>OVLK7sXPV8wAOcjMXJ}JDRz-mgF0WS{^63g?jkMz6`NLlb6 zTF%JnIo(pp*3Iw7m#0c7PseuQ5M~e6DUr6n%ORU+dm6N-kN>hEz;`;_Io+^u8?RtH zvsKShRUJLKo0Uk&Q3Q&%|H~z4GCeC1SIaHB6O*9`jD}a2`Xdz5S1Mm&)@VznApU43KNrH@e7?=$HtNVHPv8%JOdS( z<3G24l#1+>GfJkR4-(C5^#9P$1?su(=GsoZT5r47+E%OGc;GY>bF1Yv-NJgcb?;82 z+FWo# zQFra;)_uoYyH~B%-GZvu8|#jHskL^`Sw~mXa~@(Lcj363eb&B& zo59;^RW}^3)vmU&YWt3dTc)wqgoF!?cGcUguKfo6uIXTVH`Cl)8~?gCc7sL#%@_S?txA(Dj)ezt>a_ zJiP8@-LbeWaKS zp{QT|-qcHr2#A6&lLE#^G$&3LPhu?<8pTO|M<5WEQDP&yMmX*xYEH~v5X&Uf_lMD2 zSWE4nn54KQo34V<@u;IBu!uBM$|<`|a)={FJ(-wlP2Eef$_FKxC*t5NUQ&DqDW*We zG_Dx7j_3hVgrOH-+2+zoD`yn{ZRc!#ncBv9`RoCl(=_=&#RGBzDFv!s#c0@@pau-r#d{!y!h=BtJZHxCHzn_mkvc6Ik*P{mNdJjPa#; zxad2Fmb9nPQg8u#)yQ6f^PRhNGpL;(Gk?HQPa6nFe)&28h|NeA&-=p^f@PeF#?sz% z&XDM%KwL)!^wA~g6Xz+WB?mIm_lzg>WoOJ0G{Wr_Y_m=%cUjok6J11ZeuT(vAMyBI zTu477lq4R7jAT5X_cC>FNfwhtbjBc(oac#s&-){$C>yp7Q!mb|Fzr8wex^d@%7Olg zQB0Ni;q0(qhgN-25aJX}nJ}NeR0!5UcpiOgrLOlhB-bP;xOPCvzZ?jrFd=!~TBh;0jamslqr??A{TBEsV7j!{}Caj z&-3UOWj|n6HPVFAJzXj>No8rKZkUE;=($%$j&eI|*q~Iw){W(~v~24qmT8&A{FKz6 n(mEw%i4lp2tRu;#hpk3jv@QH*D*A2mSTP~Nwzj2Pp!k0PM|=_o literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_relation.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_relation.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9493816977663d171204619c8dd9ff713d43a4bc GIT binary patch literal 5981 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_relation_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/entity_relation_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2adf592b7e85c464d84ee26b654f9da31516a453 GIT binary patch literal 7358 zcmb_hL2Mhx72RDf$>oZYY{z!2*iJT1;+RfMI!Ox@s^dnsWJO3!1(IB}M2q!`Gm=&& zx%BMNi5Ln6YM**&F9jN;MQasB0pD_Huf6x&+g{sCfT9}N1KYHK*=|N3zGKW8=VpG5Q?CW!ZNhL_PWt)elV88yA4tE*8l)HPK} z&1x*g%m*4Xxp_ZTNi$-a-lGpT0uV3vx-ocbsoj0UM&vlyKD!)?lt`;5V6{iv0 z^(LK}?_Pc@7IMDH8<5xuo4o4W<01sdr1N(1vQpuCfJLfu5_+rz@9h>uO_=2kEZR~wZ*`RmC1JN;4H#eLjUuMmU&8!axk_#CVS#uLXLt^F z<{Dtp2$D)Fr!fP7#HWF)`MYezWNDURS!S^uv)PEcmu5va%Elh(l?>0aadzZ^c3-bp z+*;4EqY0H|$Jldf#O5|ejwe)>onR-`$Os?7$ny!6WvAGL8p-oKMqWs$EIZB4sF6`V zijlJkm1Qrom(<7@AH#@~P+9geJEum*`8Y;i=~C=f_Syrja)g~{uj6`@U0?-VkFksF z4P2jNZ?a3c9%p$tWGOl}(~!R0Sl~5<`WygjhvoUDnMrcd(5cqEFm%v?`vnfnpWx=m zHSTO<;}AC8QTT6D1gpZU7h`9c4&Xo1;S63%O!1m^uhH^qwT+_kh$sb*uUN4(bF7e! z#ytiG_?1_4$&aG6yCQ;ml%v*dcy%5bGKjJ=hzV0}G#mBR)vS!|tU!82CUI6Q zYRh03S$Ik%BLhX`h{zH5EHRg>af{GLA6|wwrCL+9Y1L*_ zo9$p$OBXM7XqMH%Y*6Pr2B=&IT%ay>QlRV(xIulVV}cs#U=>i`@1#NHJ6H|WwN3`q zXeX@v@#W>2!h4JW!yJM`_+!OBJ zW!xA7TU}zar(A$wp^3?~t6&&Wmu(zInIBe#U-uiH41}N@D$>+ss38;t8CVbmg7R;{ zip-GLR-Rz$BTXC!$A3GeTOra=so__H5}xF*1Y(uHQ{s(#VQ(rd)%@jBa|5Zg@lNrr z%Ozw^eyQnI?;zV@;<8JL(XG~e-jF3_uyFh0HaS+KV8NU?T9l!R%?;>}t}k8pZO9T9 z(PWH_-uq{P8hqNi`Az%uURxKtYgUoVl7sqmk|#bU`*pN+4XEqwFJ?Jj2^3#_NIJm^ zZX<*TJflCit5~G>)1=_CC6LpXo@zl_ijGM^ZZYW~$dgAr(nTH$;PMIJ><83OFuJf?KM_e zoPrJoBesAMb{E8(8eJFQdq$SG7Q18*b zEU^7d@K)Kf4{y4+j#HdLGZgJVC1@wF&!+RFwF7$=03UXtew2Hi82}$4Z3Y2MyS_irpaS@XfdDI6 zhNApg56VNO9|W~x>f$|gg@ZxwRlh78DA>hYZFBqZrhAXb2v3Cf=R0^~L-h>6KHMrp zkUmO!3__Z=_J5&4h4k}-kcJ>bVgA()%tPcJfH63>0UpA87<6BTQeAY__e&qTbnkDZ z_!FV~=UwQ=pHI&Q<3q1?5Yh!*93!0uAx&HDztf;X`s_YP$Kve5I|U}%)6kbqcoEGi zHtT=XHw|pujeE!<5;dHMI#FB3ef{Uuqwnq%zJAR1)-KN&uI*s|i1~KBWcWHy?kj~{ zC3AiL=FRzXB|Y`w)WXe5ZhC6*{cH163)7YHrFnOzyfnA;V|R98{?Dx`lP778mDc%kIwX_V?x*_q>|V9JDR& z;M3T-P5aJRz1z-(PcLs4-gN4%P&&&n4>xWAY5sCXIYkR;Lp;{ukG}%oh$8Y=u|#H`NG#Wb*TY$ zZQa(N;<}UW7Cvo$CT;&hBznF67>;gJkUDkeRv3Y$`$RdC9|lh zq%fn{F&|o6^dT7EC(a!1PstoO&6x9{y`}YXqYl%ZKO*yL{*O8u&4M%*q)BgL9n4AN zS@RvLz@*#f7u45t{5c+%T~HEhav^<=QX2jp=2zt|-RY~IVqg(xcoL1ow>{G#Uk=aH zw=mG5FMXq|YF@-O3kY;GwjWYc@*aiUsR{QvBXtsf!UXz#P_8R#GM-LGPU z;wX-bhsKt+MP8@3i@jclO$dHrz;6XjXu!KgeYN}NaU~G3ooO~POGeq|c3_hVgVK70 zGO3Ftzrncjp)sR9G1!MNYmcvV3o#*WcHqq#c{3zFb%RoolHs=FH5mFafj7*R{X{{r zjkI#z6g)@?V;TDt(BgT!UNa;Lg_$xVy`vCjxB#w(BDOwQAJQyDmL%dn5}Z1yw+K2~Vz!Qh52xEy-O9Qc8c3 zwVg6IR4p*dgj^!%53U@?nMJwIyQI++HP@)w(M|PK5sBY+34x&3Ew?J4KnI+LWoZz0mut4$kFSnTuL-+u2^JU{Om zc$)usym|4wVf>RCvyY9&yLgi;D7fJp+~iiz^iBP>d`o|Ges0a+Ic`5PxGn65IX};> zwy~5CS53ok8J^Bg)Zb2S#G&M@<+VGkwqAGj$jw-?sGle~?5Zg4Cu}GFn5meBL$wpj zXe5{v_lF`;2^;i8mLL7<+~FV>K0j?0`2s(uM_l1zWO3Rm@@M$7dSp(_VdS|< zi=XGuKQjC>zrZizJI`O>m+)QSm-&nMp5rg^@8P@19Vo`j>Acrhk=knyH`U%ijFLvP z<1LexB&^#DlZ2rH4Tu>yFl8N6JAxguhY@=wqfnuNjJIXDTgl|L8bgGN2@XY}MH$WA zus;lYy}gPSN}7Yx`A$dl!@jEXrCd4(WdNvvAf+Xx2ZD&FHg))JHrk=OlMU9nEP(Tk zE(v1tP~F12f;ag&3T}>#AS+=vs6#|3b7QoIrhINpEqjb!v@VY=wDRMeZoM+jp;h2! z8|%S1YxKqu#<4e9$acYr9^+yw>O;e#K5J*%)L1H}DoVOC+Ku|5 zilrp*GEW5^Y{^dTMD(_fbw4rW97g~3pt_O37OMTI8&^Rg+KT12c&jS<50Y7XtoEYK z>R=D{+<&Wb^-2}yE8ZN0-Fq-OOxz5}I)iR60@kWNO>+1N1_IQyP?AhlDucb$2?A`U zg5V9HNG_l#SOt@Q&h&Ln` zc*x={bU{0hl0NPm%l5!PT|&NztHg-wMNHxRyNw5=6hZ%wKv*c z%P+0g+P7{rYpqp3Uu(C$j$c^y?$lR2G;h~h@A+k~(W!Sn2-aH7jdj1Y(rn!ES{d8-&|1>PMH^5<^cZr%tolK$Kw z={t4reShKo`s$k3X$Lnp8mqTGe=chWoe$PM-)=S0wWu)!>t5@^AE@Y<))?3Y+ zb<9}Euut3P5VwMjc5TfI+MQYlR692U#K7i83n!dwc51b5HmGh*sKGj@*EZ9N@on0tgl5~izr4HkDBci$PuF@1D-^jFUc8b zqnt#HKTM5sy7~-eoHWVlip(IV%`*rb^MX@8Waij8&W46W&WWIwDTR(Yr!eC~%+X%V zE&W%)|L&>a;V-`(${9a2>#GU#w<9n;<|$4Zk}d)NsgkB(vrU6q($5}~G`2re$ntqC zLo)E2r=mR@?I}{lfLa&ZDe@7)U z_Dy9V!Weh019R2*)jJ!QZ1WsuRL1sW=YY&1>!+0^^w(4gEA4FMWB0(AT|Ks^^XF7q&;RAvpjklU08M@$ zbTB86y_#c6%kraFTRO~V=|Yx}AtN0KsUm?)7JrOKU3KK_lyy+NZR6Ehj6&|gP2ekG zKl1lh^LZzg90n3)m)coWaw^Qd@FWlYa;q^yEm>k0eWAxfF z^~&f~uJz(>*h{XXlC9BX&xZLbsAVuOArS!7X8<{ONdv#6L2u#ar(xTTFX)7tpwzWX zXacc~^l$eVX!#Pxev3CDZ77=;zOl`vd8FvkCus@uC9O%)`NQmA=dMXw+!naKDVe&s z65ZZ{mr%b=zAPi^8}n$M_UHnK^5Cy>ORrGi%7w17Nx*i)&kX_`Tr z*P$uR-4lDq@e=pPc$3#r*w%T=HIZ^6{j|*T*RH*A*eY1%uiS!bE>hbXJ%6ecPOzKe zqqYc&XPGrTwhoK~(lv8bnbkEIB5u~WBM$&xOfIuJNfp`60P(mm7+{u4i-W^pOz2PZ zNofI!29m$WxYnEnYjpkuW=uE%c@lpT3T#kcgVYybU${xBgWmol7WO&nSp(@S{Zrvo z6iD#tKtb@Q2@c0PnapQXPB=+2Da|~RK6KSoFsYJmJc82IJ0)8~A61Khwg1-_r+R8lz z7fo2oH5!ejXXwcNa2Fk^8w7A}!yeVkK|tFajugR`xC^=c00jMcvY=>ls6;?^IFG*6 zIdq77`fidI5}{z%PcNI9qtH5W74zlWRQ!aBr|@-6-){)_vv`wb6pmq=mTftdA{M@~ zirLpKSo5&Dl51LvhhI1QI@=aII(}CA}c6TOA7fiRSKCR=ozO$fS=8Hah;r7 OLZSi$*D)PEr86(+gdA5p6x+p_$VKPFD%D2aFNI8GZycAeOc^SX#}Wz%AqOH0!h;Vl~JI8552WO&b{|sfXDU}ptl4lP@qY_Hx#)Pmn*FmbR`b? z=FPl$Z@%|thBNF;Oc)A&SO2oPbY@Ob{z*jgr-L|;%RPyNDRqUZOlzujRo=C_Chxg= z?y|yiOuwrzo$DL9dY)<5l)1cpQB@Sf#BXucX|K4ib!@@RcP?F9G+%xDiXl0#cZBJ* zT~G8Hp3`Z&=4$7*>2*xI=dE^xv(8PyZ}zzBxn{S?ZI_$39M|#81>0N|eEID0RnP0r zSF4_EVToF(IGrl%G~6oqT<~^-{#xc->!%(aGAHc zuszPqrL}pJ6n3HUisP;JmMV=-tLomiS5~-?8b;5J4&y7lT|qJ9OLV_dYfzf}O@KI$ z%l!iV%oV_*5G3{7n8Gvy1XrFFSP@hn&n4W)J}=jGX0UNqW)p0ZO|faVkL_m%*bF-; zxp{V(9b$*?s`UadvLo#1U1dY9mw4&=7<(wDitJ(bh~yaD0O!$|Dze9zDLLbO9Gu5v zs>q&T$0VoB%iug2Q$_X^ds=cP_yjn|W2(rWVRMo*$tS^iHl~W~IrhBdOz|mjPQ+A^ zRajMWruj5DCu6F}PO%pxXCL1O&gqycvKQGI$=T2MgY!~M71{UL_a)~5KLF0lF;!&q z>=ntG;WOYYL=-#A&fQh&2iXtUdE95&tL!!053vjEBJPLTCH6Y*N7yXF2 z?I#Yuz3$eoE?%0afN{-6({^1G4+w^i31^7C$n;jZx#cM)c}m1ZG<8L1McA!M=(-m> z@Mh2C3^7BMLYXbQ-Lsp`wTkr5Acy!1a!%W;8y9-6*J*Kah1E-;T6ik=6$Eu)kvDmZ zdt$AhT`w*2w%zuwu(@(DWivE~7_plc#Y9kU2u}WQc}|N5NgYi^*oZB#0CZo_=yOt_vcJSj@n@nplq(Y>`UuTS<{zkneu%T3OK)uyvl?XF=CZJ(~3I$6b( z$xn3c#tlq!D7a+NjA%8Q4tlIA0dco(R+mGX?8aLdkSg7^pkx6G$Fr;jsNntxNkJ>9 z*?%SEkA4}d{_XmKzJFArmKvDR;vYTJMIrSSVc;v*6}XnVzImBrVL;SSJUuO~30FYZYYiJ;%SAjg?EF_^}p@2g@T6vpil+$4r!@)(iiR1DWw zG+-1;>qisXrVMIOk?2Ry(HQd;IiMU3qIlc9_5ht?gwur7ziVUONcZG-?v=q#sfj0` z^PCp;iHt0A?o`LLktI9E7#r#h;&BqBu74K$L2|IzyAwR16bXOA12B^&Jzzf>cPzG0 z+A8rUUtXj9Cy}flN}!)qU?}wBDOAG%`$-IVvRan)gJ>sfgit4QvSg&fD7HPsIca)L z9G41)ILpB^g)`-C;1W+G*%jsA_fhVzAVyFz;o`|iPfR2u2#M|7it-EbLMaLL0Wu~F zYMM2ENlXd#Y!d3eExRK9yFSwWT3O0x0Nt;!g>ye6OTx}DXINho&%nMYs^u)1LYwkF zr9K!5?N4L06Lb6snhrtx!GxsIPP#P)^BJ-t3uamu{DGJQFelpI73SZ>FehqdnLY?} zqCyCBA|p$}&M+svAvKC%|m2I7L4@P z{tseG7^f02k|MhT`Ed;7Fuez%q>>?+!|Ln|=T4^9#PcvFLRD@_q)?^2f04l>q54rA zk@PmacT`8LoklhFR&<#3&O(v4UH(nX0Tij>T~YinMsb*)gD6tT5XE72c1AI2T1}jQ z@)2reO!}pd@>IOej)vMNF>2A~#om#7010XI2IdPaf{u`JSrF15NSQ2@5GG&mBMo+i z@mDd7QI#yS2ce8ghj2zzR^6Q;9k911DzGZTl`Kr-N_n#*$aV!5i}jL0(wv} zX@rwYJ%D?ZEX)Fz_O>36!9AQ9Ww&XtE5e_}2yd&G)d7PrZ>thwy)7$C%Fci%&98|n zjEt}*gVR`3-g6^k-Cya(yNn|!I0WYh5s}7tachr0Ih{U4=4Am*`P~A&}n9buH2X}No27fS1smp5%`xP^>W!hM9@gA6?kUOI zIFyOXk9%cV{ykrzQqZOZZSr>@2W9eT>#9!&Df#uM-;w*&;f8m3ih{$wE*GA|aY%@N zlQ|7_|9ldqBO^akW%_nfKF4+lD%>OC-g+Dq4JLDB12RR6vf6jyE6_B$NY@xFQ7#`E)u|SI22bE2Xh`3A_#|ORi8>XTQ}|oXq50 z=YwDj~DM#)1UHz=-fd?0|+Q3GEc;4=jqUlRm+({a5Z*Rs3f#i;#2r>+a~ zp%j#MdrR`HRZ!o|733ahP{6TEujvK4l&M-l{+8YB@gRrShqS)b_3x9uw5_IVGn%2| zxCF;5np*zG&?mR3f>!>oQ83hLqP6w?gAfe#wGM$Y7HAp^<6u*}r`#hiQ`aj=FGC38 z%ME;k(S_zb`dC69uJG_6Z!Q-Ux?Pm=f?^k^Q7zjG0XYWYDVu@Ps6;@LGku7MdQWk4N5@ZNG2YZHDKNn8QIQwVtH{4ztJ_%la@F3wKL9j|M?dR@Cg-@RywKovc1I?Lu#$6GZ!OV@b=$5poA zCcbI0o3GF1#97jl45U*wav{sQA0CVZc~s(JpbIUF-?Xfa$de6CSIgVGF)T5lf833< z8-RgMy`h!Ej(j$Te3-uS8v@cfROcE&WHBrTFnZy*UY!Ntq;Pzaq=mdG*}<9-OzIl!#A0f>C8?$Uc~^u)?WLYDh|HFzrAfcO}6l z33>s_5kvJ5d3xxy_a1Vvdh@;cXK?K)=iE9|x8GYxEcI(9(}3E={@(As{odOLh4b^a zhNtn(o6f;iP5UQRW*-xk$4JqAWL$GKu5+WOySjQCuA$x;H?yYk3^!kE+!W?v#?5l0 zrIoV&s;+4^!_(dk20PJm=u6I;POHtT>or^TJP9QW22m_W-8cvb5!(%4u{dP@DBcZa zFcwUTmm?9y5gYb|9|^V>L_y3R`fOKo#sAogirHuQJI!;1f?%-B!aAbjaBG3QtJAEY1~Looni77az0 z?FkuS#uEEQ`MwfiCB!1#cnNZBhmTJKQ3KY*KuA9poOSk>7y*uecqfQ=N1bvv>{p^! z{?3k&3gJn)8*;HD24xJhzlHj>dYAIqCxgmkr06fmgob0$=t$g5LE{E~nXe7kv@6CO>22x7B+eoPHOxLUwo~(bNniQ5APzs z#;@Z&&)?@a@Lu3Q;y3ZW!gDzK+ey(G#6i5j8HiUkK91^*wzEVuh*-DhM-f8-M;tPU zIMoe{cLh6^pOO40z2L}DhC9;lm(v4T4RJ;>6C6ySN$Hw>e=zcUz5TM%dXfRFN=7n= zGX@eb-XDs@2)Jvf4QC&B1$=jS1c(T`o?jmYEpH zO|C<1V_cdQo84nR>qCwn<6=7)fB?aOwbH|`m$FIGo5hy#0B)WKQC9~2VBp80lw^Sl zWGR!Fk?3vzujQ>K3+VmVUS%T!B`brV8&)tc*be26__!hld(o^}RC+Y^o;&pogFjW-l==kLg1y)l^+{1YSW_h@uSe}Q?V$b`CG*v{F zGje)Pw~%ao{Qj&a$|qyH@Ceg~%9Kde-{p`^wC5VssE@y16EJu>*%<|~a2rh^&Z(8p z+N(Ny@;OUV#3KniZT}z3&;s-N3ZFYkhBZ z*{K03*@iwWYF5KPP*)eI>b9F}JN0V4?OH1vt#;#?(@e~bmeX_#tJT)0%Z+Mt)y-C0 zEvN0~R-Mh-ii7IYYV(;}bn5L|`*Uxt+1OZj3oDKKrqgU==3K4bcGjBJcCAr&?dHZ) z$6NWdTC2MSRjxNy9rsFWbP@h-D`io?zm>Nfu==;!CQBl&uXm}ZM%?4<*hdxPih#kkYb(!OtqTe+gZ0}~8>nr15*9LojFW?OMNH7>O+nQm_ z7W?SS`v;|;v;HWGSx2yNfV9oNd~i^Qf3P=cmLp{-lN{#u{a6vTlu3z7zQkRCgA88@ z?x`)Ji`e@cjEfeKS(c?6_*uI7&dy$Hx{_=kM*HWf(L#bBV5{GAwzAL5O*9Wsa-K5s zk~0QMX7-etNW}4#Q|1})Q&ve9I=u^SqoO>&CM~kYsTJZjfE8xO2U9D&OoH>q7x2{P zE}L=2yG><2Z))}N-3!B0*+WDAB+kY; z3Lsx=6Y~)2BxSeJe&|ZxTm}#an-`Gdm?Cgm-9X}Tr z)%f2{G#Ujo7SLo5unxv#u~%b4N0%MnX{x&-y>ikU8vzI6gE$ZfRPe`m(2Y;YPB$01 z?G{pW16hpwi|fEwz<&A>Iwo|R8TBL|haSy;Yb5zyKl0;P%J(p%q$m0pXLO!e4|{&U z!~I7uXknt?4Q+hq6ittpD?jXoUB4GSLLr@^R=phMohiy&L|{W+1>(#th5MGmyp6zJ zp*HK^l7MPKsY=&S1z;0lL;nnBN#aW+#gn3b<3FZennwT@e329|UecT>nLm#0R45iD z`5l4aJC=!!h#sE+J|gwR>;+MrWcvP4UO(ACF-dtzHeCgyqftjie3Ggp@?2h?R)sd2dsfmt-+X$TQ?fa-Jt% zdfuNfMe*4-OucwkmFbvs5=>P|u^?QY{=z7x%Dg*0_{$KhFB(Ff0=h@IPv2bxZ6G}F zuLO;@vd_b!e)ybvX_4d|_9=B z;2hc#>(~?StI#&dMIweptB;b@J18pr3`1pwGWuV^3~nWXii`;`aW^U>voupTOv5tt z+&d#jxt%o%Ff$}$F@0M_>jTTQ%wqn;(0@s5lg%cE6!I1oa_OO~5f^O>f0~N^h`d-t MNU*JK=@!iXzc;)>K>z>% literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/favicon.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/favicon.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05937d95e9dfb2010c08446d0085d852a7aa7958 GIT binary patch literal 3687 zcmbVPO>Y~=8QvW(m&+9;%ZcMeX;Dm?A_>!)v=gKUK@ptBALvC+BNr%$6r1JFNLq>9 zUC#{Vh^0`V5_;-S=s`OA-u{`r_LQ@41)B7EXGvP0L6D{9`<$-htf z!II*|HgJ2cZCQ`mw$`gXc0^5h$Byu%cU0@u1>1Dm_4tA7 zI3dUPbSKTW_3!dn3I657&8PgcFMc1|l}EYaX{L=DB__=?&3E$W+~hnSnVnpvW670# zHj>(CUJPWcCErhVYWP~rca+@v^!*)Uiq&q{*cr%-qk?3i2CoarBnVFdG8+se*ZiWOYm4`QpH9J-alC71Xu&{c4~G;{Z5h(yZU*&y)BhRIO`|5 zklQlrfGqqL;&(O@s?UBk4DO@of1r{M)Z&mzdbOq_7=E>XvYsbAQMbLiSP=~o9J@VV zHbhf|$Ig-43uLg{6btiFL$t)AT?u7~m8IE8+z`vhPH#cn6tAIeiPyy~w2R^maU1QD zcvHNE_J;7G`nSu*qj*0}@@%X(o;-cHN*17bGKjV2=s>$U2X}L^aI+)%lyy$5&sJd` zh03>8JnU4uc#uOqhD!k>piR}8!#EqogTX<^3cRerpxUhT%t0Z`+DHu)nX;;*+DJ%j zvyb`=<#QDMTU5fGI8jx@%F$;Nv?Et7PiRz|K)@KSOc+Lybs}MSunIr8-gRFwJ6@xp%h3MpZTuu2DXH*_x*Tz%6n%bwCeE${nYrWR#}a-`S|pM1d<%V8$LzF=u4r{j;bc`wGg5HDr$2HlZK7{g(M78q z<}p9)g{ue@ngERza#c}mwDSK5otI=KelTv$z|lboP0l{*&rInh?X?CoGmnGKA7nMG zjN4)?VpzMC$WLJKGJhLt5n$S^V$b>k8PWwF*Dz&y44c;~PqpYEcl@`x+F-&zQENY9 zr`6c?N^1}k$Xb_FMqd7y=5L@HFU%B%8?V)uBD01Q@6WY#6~4<#0#&7>tH>{y@0^{h zRP>s?zfuw5zi5Uu_XnE4iRzq!$abmN2=*^@Qs>Y$&IzK`E<1G}IDh{1D|W~ZYo<1F zChUkEdd8c0rhdfKFHPO}l*5mmiFd?~T$n6dbDjmJG4VtV6rG885}cALSM#*9iTTe= z6Fa?X=Sg_#oZUU~=JX4uW$FJkafk|N0-&iM;vCS_ao3Xx#n1Zqy)Ug#SK*+Fp9uVg zR3?>382IBNP0TsoDXP>^Hc|9#R0gp{xWL!MeeNk1CKPGdM%gfVMEhT`vau8E*chc= z$BwpJy5C%ob{VV<;$dIJ>w*p@r@rls-De>gsI2eDgAtPNo;v0E&3kw%bCnA`d; z^p>V0pSAuM`k}i_V>Z5VLH?HnO`*+t0R@H115Vhfb4vE*jyq@V3-KQhQamjSz@EPW zZT^u}@2fJ|~_?C`)X-bOtS!E`gn83Qb7|#_Eu< z0_I!vApY83{56j=fqpe;yXw~}_=5IGOpw51B{?4H@!(OrrhY*ni913?mJ>xU zs@zl7u}P{6)=>IUB%ejmU$Mm+aL7Ejbw+^I@+I(d0oqgx@O!LPiSWa@rmq8QACLsN z!qOqg=W`;V%48J%olwzL;WuFbr!;#nxQ*ugE076;00c*G4tn7=^>qqXnvmeyFmMBS_x}M&W^GCU literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/group_permission.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/group_permission.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d36513424a541c1bfa103aac02c7f4a5cb6153b GIT binary patch literal 9545 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 V@qHIugdYWmpaQj&gqT27`X74$ZGQj& literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/group_permission_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/group_permission_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0f527116dd0df1307749e974ca41c1040993689 GIT binary patch literal 4399 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/home_dashboard.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/home_dashboard.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..728f3c89deab51bfcbffac39f54f364d7114f81c GIT binary patch literal 10238 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 Rr;Mh_7oO_}KJ$?R{slTen@s=! literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/integration.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/integration.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53bc0c2daeecc38ca386efe6b5615ce43132d93c GIT binary patch literal 12347 zcmcgyU2NP|b|yKTAB}!3+wxz2m}HY!*;r#Io6WB3crD4YJ!^ZUXvWEw-Ik%|UP-h^ z!wE?_D=qcVwTmvWMbV}|K)UI|P9KWAF0us*N8J8*jb5<$107QpponSf?w@S$2upb+?3e?(k-vuN1?lV2>Em*zC>1+8hnZ_aDWZ=Amn8oAQqO<1hCEne5|amU4odF{2i^TLHC8%pZl zJp9K>cGlf3_(DFtk<=NNS zo1$f!Pow1lsC_jpp--x6 zOQL0l&!FW>B<0yMyDC~v@Dpgc){)qCR(>GqC)u~z4Sb(sH`y(GpJo-dg6}hImA#Gc zr`SnMz-lmBZhCwZ+yi0v+{#LAd7kE?tJNE(>uNZ`JhL_MEF!4pZE>wlLXAk+X~jfs zIX0AS&xNz%ij9flX`Ep?(x6c1w%Ob<8;#vLLH!_usU4{6w%rIaR@2i*Fl0l+%5XzJE!%+{ydX2;`qv}1Iv(iw*qXM&1JDrk|=i)~wP z@Lgw`Dhi>UW#$}%SgBL5&WFyiph!zN+<7eFO!g%sEV1(A9E%Lfj3`x6W<{A3WnPp8 zQI3eRD9TY$j)`(yloO(y^r3Y}cHZy!`ekS_TOq$57A0%_ULK$`Y(HApvo71B{3 zSA|sdvyhJYxH=@=&p|rw!wN{IpNBN#!x~6iegV=6A67xK{SinfeOL$So?nD?%7>MZ z_We;vr+rup>4856>5LDnA^pf7hxC*W>mhyUPe6LwpA^!M{YgmAFu96&VG1gHXJZ`K z&S|DbBy4Cv(`w?5U^TUBxcXOSpADvrE?q*}KWiMq`w1d!jQHd2Dbi;CD5gq8{o@c) zxIbfbc+^Y&g3)1rh6tTC1po6!djgCZ@fnae+Ebutbmu_U5R+h>S#I62wymb=*^ZL~ zv79^=#CT_f3VIN6MyVL1B89}x5o#dzI!CD>;?7P5s>>T2zebgxO3sVW{NHZrwu?J` zscF^i5-hhiY-f|dUgFJrZv1JZ)Ueh|tzA5=G+&>)aK40x6Mn8`*6-qh0v*>8Ef;G| z!@{FRNnr1`zl;_yVM*+)&vUKapkM%X%QK8cnBe{niky;@2mKY$`sI$Ito~~6Sd5)> zor~8o=c5mu(?P4jF954smT>!wo0W{i*C6hspT*3cdueVet})_A?Avet25(2sXk6zis8*vc+fI&cTL9N$pdpRE){1MR?jM7Sj2oJ(kEiG zk17$H;z(agIA=+by!UrqG7P*=KM6OUSh3(qj4Je466eYc#o(1F5F#XkDYRJqkm|pR zV(*n6o(#0AFKwJxp$WH#f9{fHprX{crEq7Uk~WnF_DQ`^V)90D44Ksv#)>m1JPWBM zR`~?AsP01?&N&o^66+@sv3l-v!U?`|RilFX3qz+?ZAD|ykNfPFsRSZuIr^t;o zoQr7q2Wk{J&%|-=T5u@Je;T3O9hB<(L5#ZtLWH|=s)E7z_PAYfF2J!4z~pH1nThKD zh3ba___G+m2Y+}BV{Kokznr=x=u4e<0A&`RpFs{BotDrs+GhOxRI zSH7&iC<^WSep(o?P@Ewj)5t=Ka1WchF!E=J3183p0{oushac@wEJyfF$MFlVekg)Jj1U}P?m-O0&LN5e1`fut$IXiKW(-Jj zEV+zQ-OA8F{zVta?)KD^p!s-Ol90wZ3q&>YFKs!ccl&yT=!qUgyA~V@>z{XF?T$+I zJ_XzEh&I68ic}SYQI30FalQfnItwlNngp5Z*w7&VQ3P_h=Q50WeV%-VS8xcl&yiPY z(9({L9YNbOS;LDTit6u2s1C69AfRFA5X%7r9|y*7!j}$=Y!hqOC-T06Z7}7Y>`ZycKYA#W^hmic|A5XYX&{4bLv^qF z@YL6*6wJle9_7b;6DmCEu`P0v-!*RHO7M<1zOFITRuF09?q zGqu%ay|{F}ytZ1cEiB#8Cu_G>7Rxu6jq*y(Sh}(rsMl+?Rb9RHcCDu8S8p#G)!U1D ze&O9J^$1U@Z&&qEs<~0FELY1_eWJX0%XoL8R$ZxxUYT00f=kuP`s9Lsdu`cRerLH- zGp<8ZZe?}JxV@m~mTp&TE4TE_?JKM3y0ofiZ!BEBv7nEKBgh=;KfbWKuylRdSiOC- zy0E4f))p2Q%e7l?>$#gNYh;nSw6d_e_gcAm&urjF1j-$*VN+Xsk3#yMcJ}+{_h(<# zws%}lTL)E}g0A1cuwR+Y1jTo#`?BNMPLRW(ZPOE6n$3j!JVYPly3o!NXNJ)2CT9-y z`72P&rC$|=LP1vWSCG|T7PCFOK(rl6hoIMIII*OC*^@vh>5lS9z9RkhTi;domHmu| zoDg5Ruk5Ry>Z@M%zT!OZWj*A9Fy(>dtM@@ZBH=~p{eqWA?nnkb=6v;G;SufFhV?XZ z1oaEv2u7;m$cM#8QhYS>O*;KYy)n`MJHAA{U`+wmWcQ&5eX_XLicgsz*}a$6#Kv~G zMIL5-Ac3ldh4&?78VjmPPHq7mHW?uT70HD3=8ENmuo|QY)Hg~aM*Ug4| z2`AwQp|rn|v_Bdec?z>0h8}^znNz~-Q^Mp8B!dd0)ymJwKcUbOXWt6#Rgp8XoiN#1 zMBCq!wZw%ndFEHDJUfnjGV6Q62>LrT25DdIR5g)k;s*Imj)YF6oE4EJinLM_*`I;h zuv{<5Y@03TGIWXS2P(xb$c9?b+ud0g32Y7pXErBjO}Sn!QpEyQ=#-5hE2tf0kn@$a zmty}J*?Sfzs&Y&z%1E(5dWIs8{j#V|w56Of_P@nkQJx}M+3R@^)JF6`uqh8$%m$h{ z;Y@g_Jdz#}&*Z(iIM1-oAtwz_kdh#l*H{#;&X=an*JQQ$idZ(WaNQxnM z4C7xrRuq(E;!4<|=PpGy&{Pt3&*8{SL1q$;EWIhBRceaTN<*nG7ZEl&(W8GK^2dOo||jLEK3&Bgh#Bf8Q|vtwZLb zqRL~5K!#loI1mN0i0fgslkX~HVJKgTQ1553NX{gqLwkOc%RmAv>5w4yZ^I zb`tdJO6;?+_SgqjMR4uiNXROxL_wZa% z>*@}kt*=?gdaH=?_siAixzi&U2(LU>bG!56<@N@J+{(c?wN_$+a268gT=+q{eJz)^ zO0xC*EBG)q1=LMCmGhq#h=-F}A?mcK(m6@; z9uIpf;1I%*xTC2qMW){JvY8|vWsEIQZ3Bi6sB!=D$`*l51yL=>5-Oav@L6WJ?^vKj<_)p0L z0>fP~zkkKv&bb`}V%2%0IrWdxEh$*A0|syL`Cp!Cq#*e}Q?eLhhNxcEcs+A`WGMSL zjCM1FjCuJ#ET@IkHVip-L!v}nC`1wju<|W84PZ1Y7Xu0!GZBV&(7oaHXuf_GW~K(@ zk@H4#>fYoZVX{D_n?Z|XN}TXN6Kz<6|KNsT{-@pl>V~+Yt;ar1!DD#r|1|xk% z!*q-wV4P_QGReJ6?Y$=_GwXb&^tIgEDRR9B*2aGzscmBlV^(2YTU0J1AKm7+$N1j| zK8hk9i!0fzLFp>hA2xw}@&;ywo_Ik0P7}nfPX}^CNlK0A**Fw^E*7w!aP)%>wJ%P(Qs^M(x%FyfN zNm=vxPzJB`(RIA!{U?O?ml#5EPsBXtA+K}6TmOo~wdGq~wEh{_W4=!BV*Z0$qj1CB z1j=W`8YWdXoQgAcMqK0b&SkElgy9;53(XYZFK!;bnCj~6!J$&0P9f#W#uTYNNnI5a zQhv>>vJPTE<>&b1nX@M5_ikW@zzxV3<<V=*x({0Q*C_jP3dD_hgzY%&V6+H$*0L z8wwnVWKfcPagHOp<*cbhZWLZhDepWgyx=N#NGaQ(VoOD3!4JeMx=M;mNo!E`vZ3r3 zZeJGt13kdGlo~B@O-#q1v;*^ipi)@quqH0y7_Q1*S;Hc2Za6YY^y?(q!xB&FScJTF z!LZQ}mF z!{KE)gtNYmtHu$Vp*+)QpplqSfnk?*P12PtePd%bAvak980EkRBzQvhfjH% zSFy_4DsNaiZC7pS%lu?XKQ*ta2h>LMw!WaAKXL3?*U2j_-hjud+2U384mV7+SWu78 z9}`_T+k}y-wSaysHBWDJM67U;H@Kl&oT-a<7gTcCgvZM@Yh`V5zS>+ZnQ!aM%iIti zddt-&dC}O*_ zSVv(yA^X@a$Q;`ZnP+<-``HtaMYb1mfDJ$nF%@!{?SmX)`yof!0myN75ORV&2|39Q zK~A&7kUQ8@kaO$^dzwAN-0k+UyKJ779!QlO&$DCf*$0{XQl-EPH~ZOfU(2)S*e66y zkrz>O!q@Wblk8KXW`GZ%=F`5GXV0?*Q8UN~QS%vJ%d?a01yM7^hfs6M*YfN|c3RX7 z^I_DyC&a(@mW|WVj=Ay6V*~{#bs2Ss9sCmWL^6azhvZxv7 zmlYA02*L^L|Zm?HH%@m(P&1=4vXRot2M9nmx zM$MbPmS+|A)1qbv-+`LX`&yoTfqhZb%XLYtJYWDCwsA+f_YqHjZOyvo7n;H1s z%S>kBS7mGL4u1Esx7j=R-Or99iLE;`mz&GA#_KCJi(l3kc^#STs&443=DJzFa^w60 zB{x&8)^*cVv4F(YRB_DOB=&8k^-?i3c0C$%-B?i8zQrqx{4 zs;23TFx|MNEj10kY&6#z%uyDb&AKzdnyWetHuP2QjPZuPSm)XbueUVx^p@%5m-IWe zYO_(vUvL+k(RPVeUE$SR=Gv+=?ys-;o1UmQmz!E`6?rvSaV%80!fVSbmXobDEN3`W zPJT~OI)<(4E!S7A+N?JXXSAi)(QoeezA|#vExFzfhcncw>lQk>>UL<lk#BTB2xWp<2 z?2j9?J1TjK$*V@a((mq#v!+=Yrk#OvUwdCvitb)0V<%KbT$?XrA6%wgP#I|l{A@ek zl@W?J)tzZu7ID2qu@2Uukcy(0MW8E#egXM1K@mRV2ly<-w=&X>uh)&rpcg*ZF;9EV zJq1=Ky-1$(0!gNaDQeW=9@OZS)x0`}QcbCvEf`+E?r`XoqY>0NMxkIJCny zA_48M?Fnd4*@y_V@7R;j=Ikk<{i8hv?Ff^uV?QBv%IhaCC!|jGsH&^0$c1&4@ugY= zL!(+lz3vW!%5zUU<638$D{4WC>kksmfEG$}qgph}4Qk;8H{L#A!x^riwT~}n%v%aF z)l8E%TedW<442F=LFD9|)a}0l*4*B2QBpo$-ggA)U5zh4mweed*|a zm6~`TTBffEARS)fY~y9rZ{XCtpjUIU8%2>>=n#yA z@>ftKLRsujDk-RF%wQTTej!-K0d?jp}xg&LAmtLsZwx}oRvMtQnC1L9}BNZdTctW z@Y=dicv`xpUYPg{y6xo)G5&}!L1o{h&~(Mb`#uxFxUpw{6R3C$iz!?@LHg2rNh zN0ow$1Bv+}a4nULKk&&28l^|5lZ~LYOGlumTkD07ljy$3hZveh_@FX}Lev!>U-kKj zTuSupbOI!gYc@&>-Np$IQub0;<4~ay`@c}7K;@}KR3Z+h^72)mmq^R>h;>2}G2xOE zDNMJ!IX)XARyJNhOgw(XRZWB+D*Hagtt)=M9Pks|S?k&3Bz7LdWR#o8*jA+;#$iK) z(2uB6U~@1To4~hJWZnyq30kEGDF&CIc^j3WAl=^Pn1lmVHclY~9wp+kH$n-ODY*3M zj*_qYlyuy3?b+=FRvzDQl$Z_24X%Us5fyRB&>evhiiJQX`BJFE#Z++q(g&xbZF<}~ z@#!$)Lex>5ZhLc-Hbky$ycl9h+&zh~L}jyGvlLwav~Ohf>}>);TQwKu=7Rg=AbgVA zpM(zGM>^=ElYB>@?OQ4^zvBbbb#FQ`X*YG@=-STaNL+{nrEHu=*S!oQZl^`4ptAX{ zsrU;&!?YdtZ)$Ec9$U8?VdMPeL}h2YX6PF}L!D3fdiFaZ$!vpVKO*th)CZF|qC3@P zpQEP}IqGyVm85U_By~1Uk6b59omO0$I?L0oZ=RRJ2VvPb6XHqS*pKi;Wp8xN(_i^K z)jOXK_w0BAP}^ZTg{UW!h@!_HbXUq9_&k$HRE&?QNPWvkDyDUM@H&}_G2=oNQ;}}J z7pmyyws)ozPl_T`QQ2zOR0U5KLXNu+;CgmDovAGvjuM5}9>U|HLrFx9qT(H&sN|t^ zN7qw%3Z5l&v`r7&rZl-B>R{<{Bj=v)!htIr=Rzb=sG^T$sO(E!lk{hC`3aA0)8i4L zKOLj3SdB6iPSqGM9j5-rU5?Qs*q`$mI(#|dsr-D11Gtw8&{yITQdj-jlpa{09wG5Eka$8J$v{;0%UyHxEuWj%r~BK5&-NJi;}SnwdMb$`dWQe&K1K71 z6vcX(3e$Idm}1+fhp>~WSVJyau~q5Y=!LKgA;QG#4-vws?DxAS>~BJZZG2CpXRi}- zQ}q3lp6y1tioBW^KHJSDF-EV5{E5$4@|9iG*;Kr~9m1>E_{EX6(S`@r#?q}v(9Kv$ z0W2FALu`q+Y9ee=+1I;f>rVr=!Y@zu?0ynhk7YDURpgv^B#9(?&**P`k`5(jtFU*e z82xd8QMg@tsA3oj8)yR*E=srAOE!8rM2vU^D?$vF{X^Hp1oxKwSJc|Cl=bX&8Z=wA zo5Ic0N!(1M;-7qOHpxKVzG^#|icWBEsrQ&|LQi}15r7^$YH?$xOCg3ROwqA6m3^;k zhQ1wSo!IxWw~eIju^#1V!ySDLzMr9h#0|c8pyG!0d>*t+zsY@Vz(M6+zXf|z-ubBbS-G%BOF~{Ut7y~opmh=zwc)Z9Els!F6GfjzY&?p@d&ZG-9+gdX zO;PZ~HgJ2ZX*Lz3tr||_Xg-OfSyZS#N6ELDI{KapQt-sKqiy>B-i)LTXTB}i?un(# zA(kjs(Tqf8N4jPyIQKoH^e}ev6>rJSSMhb}TZ!x}Kb-C$D{}7p9Af5WEs9^1G%9;BmNa?~lD>3z-TX2{ zEptz@G7m9b>8AWhI+yvv3!j(o$@j7rCMntSefgeZDYjzu-ItC1R-c85Nlbo_v6cJs zeF?9f%O^9p3sxSJnX*`8-c}wK9?|RQZaKB=NBK)uKUyko%ZJ5BnQ&`Nfb!NKum;8Y zZ`c`H3*HpqP2WA(!8(1|))kwk4fU-bx+dP~ci(e&X9;1NON$#;jbnl({;RB3wL0GZ z&7#ZKsqZupwJ`I5N$?Moryfd=P+`+N1i9?wttMv6RIPVqC%>Ybx@8$g87<}{M|vj` zZKrUuuCHQ>>Zxl8xruLPI-a53|DmB}}OoJy6Qu#b`1k3>sqTitD_BxhSg<|BY*?dy`xzFb1XRj}>Wd2s1`& z?>PNf-=H?8Gt{1+su7Wx^SR71Egq9fiX_|IKeZzDf z&!vLA>9ikr?T+kBho5kYG8ABzEF69&<~I_!H)UJ8Dc_>M3n7ONaAS?DwIvl()K=8y z;!R$~>=xbND*on!UcWGxHQpqzsk`JR!KP{Nx>HA-J~ZM+1Ry7;Y5caPtx{iz`J${y zgPVoeUB9C@eu(M4KBPIQAqr8(h;YFXY9|U8HsA zrpj@jxdRj$n!c@RP7ytCvNcTM)|^32BOlr|d4#W7#jbuG-c*L@P^>MkVJb5n(9faF zDYTR9T``x*$(c0O+W1LK`*RN#0q8Qt>K2JQi6ClX={S|qo}tGxW(C==fOjrsMb1Nh ztjO|@m8|?DMUnqk>68CQ$;lrndHKJUg8W}fzxY}s=p}7#sA;Gg<@e>K`AJMc`t>xDCP{p kkqvIVN((vnP!(&$?IN5tT?$Xp`N%iP6_C*X52@_)JOBUy literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/merged_group_permission_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/merged_group_permission_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc8d0ffa8785f6178de67d0e1033ef9f9acc9f4e GIT binary patch literal 5116 zcmb_g&2!tv6$e0&1R+Y6^WnxxI^DWy5@iz7jwflWaXh9(SmsnBH6&ywNIft_tR&bZ zK`%fjVyH`{Ll3?6+Jn@aubrlc{wcWjlyh#KY0}?YkP>A}Nu~)TEcWB=?t5>4@9ldG zXJ<_XPvgtO&1)|!%D<^G{pe`i!W&&h;VX{ftG?Dz9aVlcN0Z--lUY&xjISRkzRvai zjFa`Xma>rbs;Z)x43E7N^tPj=&=WpuS}mJZ)@!C5xg81?^rBb{+Hnx}BDNEL#^R89 zgLo$t!H_e-9}jpGN37rBUc}jxAPQo3!(%&wZ+-OEP8|0a%jH<^ut__Vg0Sp|?Wl}# zE_koaQH$dDynaxA>*i#829iOS_hOIsWqog(-za-GON{-B^}@&ABC|fYdM#zL(dRvI z%%VPTvnO0cn6b#-FI|-)EQeU69WO$Tt?<@qMkK)s?{VS9+-IA+i;NhK!0~nv?+i9e z?XX*pKJ&J>xsV)A>g~|y+q_o-nfVpeuhiRAPCpqmZsCpojDjmT7KM()$rKb{qXYS? z=IDOb&&gWWf7Lhq!h!1Kc-}YtnFD2CbqsDiEcnIaR^FfW=j4dVO^jTawETJh;(_AK z_%HY`;#>4z@?XYx*1zQc4Bt8b75_567yLYq{F!Y)wPM)(d?F+ZYKW`rX_>+(oLOZU|lXrUr)_~E%KV(&4J zbs=+y`Ftzr0XadBwNjMS7qUswoo0T!jzY zA_^G&&p~-30;bEopdFSmFW3rkbl1zg_avIOt8ypUEcbU|m%ZzyYgfxKL;hahYd?bN zfN;|#D|6eO0KAnY_tE&{_IbH0@!)O~Akdy5!X=|A^>-7)MKy?B_ia+_Jc^u_Q*){z zUsKh;9bP$CVWr9BHayPpLv?!TsJ_mj7%2}Gs9qiZbA`j95Ll-4$igjj0gLBv^Q?1_ z*dhnFD0n;&a0>R1U6WR$XHgI^7a7ocyvu?rNQ|edFz}J5mlov4<-xv>%GU(XoH6|M z`EpE2-6rbEL*ORJOK`t~$~M6IH+2t?9%)Yi=@_2nP^H$9wy*w?Y5=^SfmZe5-&_Bm zR?XCorPO^7hCO{MKcz~~(CDj9&bI26y6qUt8!fxBW;GLiqh&RnLbcMmv(%_Gt4_Ak zYFW0Et6Fz!%NClemFAjLwCZ-v{={8rHa6Cs!g8a2*J|3BIa90K)=INt*BW)lY;LSt z?(&^Vt?m?Lz22x=&V|KQ3Nfl{$Iydf8sBHGNb=7OG<;Eviaj{YTEMi z5JJpSL0)^x?#W=+sEbrGeB*qpKVk7XqbCOu?F+c z_?bgJ&c?ZPJRN;S+1HNL$q4AtnsO0&Ux$mx4!=Bh5hu+2fFpR`L!3-c9mGld2Q2rD z8$VWm>L1R~{)B%fPuKnL^e;uE@-P{#+B8U zb5W9>>bf9_Dz@FMEp6CV%b8DUrh4WiiH+sgEW7!Mb0MWT=_ppJRo8BeJ9IZn(DyZQh2T!f&Ve%0_hAfl1Kv;` z8*zT5`x#J_M*5*~1cMp()64?;D{%oc^>pT;c?2^#nLW~v>1X1ir2lxN5EZyFz)f}! z>wqSUy&5A58?(bVn=;f$!3cUH)4~)Di zSXv5QDyfwmYDdZuVNe~GrZEVyk=-Lt??Vto18G7ngK3^-F}VA4{XVGTB;Oxj{3OX) z*IAMSNU-Dq#wDWWwBdI|a`xGbx;tD|=jK6Z5LKex&1LpO7)YAq+Yl@xE z~;)qO8az!wq+cSmTKrBWrxTtN=UB-UJ-}zGkF;W{=68+GiRrrVk%JD^i>^yMjz{v)R@lbTzJax!Su(z0a}aZvuAmw8 zCC1pV?#k3E$>HjPOOV-g>Ru#bu7gzkhKk=(aUz7Q$;^znryD9Np)eF()pX6!)Z8~( zj!HADnXuD>scQ4-*SKiBX6S}q%uhT8#k_)khD$WT#TBaLQaDJ8v$lnIPDQ^-ZZINF Mu&rsR2K>hV00hBGD*ylh literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/merged_group_type_permission_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/merged_group_type_permission_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7ee9c9c1fa8638e8afa0cca45426623e2aee5a8 GIT binary patch literal 4409 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 F{{wft_zM64 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/o_auth2_basic_mapper_config.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/o_auth2_basic_mapper_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59fc8213653731ffaf5cb5762e7765d001e23534 GIT binary patch literal 10665 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/o_auth2_clients_params.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/o_auth2_clients_params.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77aad6485ee1a0fda4008cc852fc84e0bf2944c0 GIT binary patch literal 4144 zcmb_fO>Y~=8QvW(m#Z};%dz7`cF+z|ASv6LlpUl8K@sfQj?s&hMlMjW2{y}}k+c%I zOV14Lh^5+tgr52j+Jl6id~bh6`wRBkQ_j8xXwv7MC25J4kdJ1;`Tly|cb@m1m-+mB z=-}J<=W)khbe#WC(rjD*Dvy=mA3xlD%(GvTm@A%U+NeQd(md0ACx6CG&f|gE z$yGX(T*)T`sg36Su8g(hPg9*5z8do#CAU6!cgL9iN~>k;2^~72ndU8#C%T1ksbrQ& z)U>%3_tVz9Ym?(SrVM&AGcldZ`|-A1ZN+O%&VRzQ{7JmRAHKhQy9Bw>ml+Uq-Iob} zDwW2H6@I6=Y(==AW0S1Xlw zwp143q@LtLZp*BRY2g=8zq6iDe)_ARaTiJd1(|ekEe>5tyE5kpMi=ro*7ihI__kIR zH$))jj@-5{Ya$evj+{fc9mrsJPSmHZnwS?0b|jP`MlMfUVo_W#L9i#Jd%h&RO&%FCjLtG`)X-MEJvymP;sLdE){Sj9a()ax6MAFdD^G*7y*)*Kbw zbj~5^R7KqENIq5rCpAn)L6yGBx3N{Tyq5<#uF7yJKnPk??%9j8LEP=`H?8uAKkla5 z{QeA_2YD|}vl7&&h1bdRZi5vI!glMZZ_yStnZ=#16p*nTC>N+Iw7s5?@+TkF8Pa_u z{YzxR9XU~%!&XpdBa{PIEsm&F8R44HS{gC5JmGF)F4V?`%V%(w2l87y<~``4%Z1!Z zGw>+Q_-4tO^+vV09L*pPqLmTffy{ zcq>bjyoGh?R<5??do7tg)u*kj)lECC{ywZUd#`zWxdo$?xB79i2SdWdPDC~rCHDSX z7QG%9QD3(5hz$JBczmMrW`Dm3q6mkYDEcWW6JE*jneX~;U{mONUk~3pM@h}evIIV7 z`ca({UCav~*~r;-plEma??)0Yg-CN&cRb%hFKBt*8MD5@5{&%Yijroa;1eGIUmMa^ z^sOkf-)OKp~$ebUn{G%wwYV_!4&!3^ti6(Azp)(YP7~eHZh~iRdiWhhI1E^P1R{5 zclh@y&Bhk_1Mus6>||MWidf|FPP3;*QZ7tIwL)9&kgt10{g;sqZ=T1TF`Nr2qsWHg z+WtBv%C`~VRfddLmDKn)Tg+JNR0ky|&ZuBry=Fm{7f(XZ8WHvVhWf7{J9F)1d6ca4 z{|73mbKn~17><6IowyI2Pe1sC9k7Fnsf?TvJ7fo*@kXAh9y0Z|sT!Yxs3T|O9kN3g zro~pBCxNMrJW;`n=Eyq^PRQiSep)$){(EK)E4^~%ad_gKUOn=r^DmjYo&UR$L$iP; z0GjFn_Q9Mg&e|B!(^DP3^Re||rBf`Q8@#rCsZ1*IO5?{xnwT@PlW(mcZ6fLG$P7HJ zaDi_Q=eZ{s7?Hna>qX7v5v_mDirP-BV`G%MiWLpFa6g~Xb`h+0<6cL^Yl1c==X2c| z-a3zc<6WDp-8_lAdJUCwrQQ5uuswErAOkZ||UM3eWE8Mn&~$ z+#SfGvM2Xv@zNc9f~4ua_1HBQx_D&q*fO{NRp>2@TRyA*H}peyk=pEhPcXiVSCmeU z)LI95n9?$i*@<&PymN=m)4anU0sK=y%-@Fy)8O2`$+C=r5V`pMK4zJs)<{n3`)~YPv?TBRQLqyUX_IpBFo2%xWNc zy2U%W+2MI-S0)I1VkJ5LRmI&88x{2<0!)$;LSk1GJuhFtqKZXQ%`m3$qewo9qCa7Y zC3(m^w|;?Q%c-vjGF7Y%Cm_fktCy<%*^~_z0k;u9fiH123I5qvnh<6(ivCOp>8S8R zbTkd#X}z&X(r0lG?IMgK_`gAy>h&n1v&JJeXedu`k#Aww_B@$a+8G!bk&#|PUlELb z=DrQP3SUbDqqi}4NmI*@Utp@DKh^3sWiR2se0d2sJxZDc3>?p89t)W3f5m*t!zv45 ziF2VlDT6S$8F+zLuT6Zx`?PlhS;3T4#F@e`DPU)ucPu<_Df${YI!)JuW5d7=;2Hi0 DJboWb literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_blob_entity_with_customer_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_blob_entity_with_customer_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20576862f8d3aefcda26f453a634fbc0612dff06 GIT binary patch literal 5850 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_converter.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_converter.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ba8f1e946e74725b19c44eb1721567ae4566717 GIT binary patch literal 5285 zcmbtY&5zs06(=c5qPW`iN1Tn)9ffqILgfRO+_w7v8%=-d4{rU~H!ar_$)Z?kIq2vpi51&Q zK4Usz;XrRCG8zgd#l3-0TCsjtgi5gck%}~13)z+w8}GlprFDO`(a`1%ZF)mJN*X-r zs0P}F6mdr&r}TxeA2r^-oWGu-%b+J>9nyPQKim{+jqq}vvGXiW?uD!D+Itt@$w1!h zix`NR>WdD$FQmeVRrYTEq7mW41e0|1D&*KmuIvY5I@}Pkkf9cwwYOIp0aie~8R@M- zyWUB94fR>LxhbSUnCCkQ7n>rkqnrN~)NeIAlulkn6t3V_|3D%vn8hNKv6cI=iXygLHqAU;Xmc9L|{LKN$o zo4OnbQ*SF&K`b8VbV(;V>;|GMh*c_G$jU@4CCOB+GWs^rwY6xPuI=?~`KCxht7eCK z<`?B1+#ljrzd*w6kriYq)*$jQH`0Ph-4W^rwp<=jU2%jql+KMDlu9G?LFvs=0j2WD zHKhw97bTC|>zEU&cZT&D)w2sMWIgDz%edHxVz4-h*?Pv&JB8TFz#)QL2zktGNx%anLXYQ@x5qPsD#?TICq(B)sBH-4(H5*u;UNg9|d z+DPQ4xYQ8weKqL~8r`Vf=x@WD#Fy&tTx`I3hztF&bC=ZJ(CvVHL(u6)Fj~XNsrDX0 zUo;4@kuT`vT&(xEQ!fbcMjZs-2Nd-xl9E%hv!93Ov)i}buZL%5v|7(6=)gseFUr$R z_I^q#8CiEM*u@_H@rHm0B&L$GS+apVR>17M)9%YKnOyLy6nY@xwr;=hBs83^RjIf8 zVwFuTi}5R-*s=o9cr4;!%#95e(Ud0vw&rAtAj#)x<2ve%HvGzgG>|7~B73+yCP2Q- zzA*`2d?Lew2_ld?oU}e!NWL^jTH^9gsQwg^dCMWka-j7k;uCUEza85=A99EuX6>F2 z%50yP4w+(VJ&iSx*?*q`n(`HcF*CaHXymCTmH^d#OjXNBjx_m~W0UW9r_Yaeg7%ZE z|NotCEc~7yz&{RNV2p7qJEZ&0JL{v4;ZAJCB;_+rd~{R0nC%q$c356$?nzwVIf z4rj%rUYhbWB+os8+2N*0L3Mr7&U2CCPgA6z4N5&f(nA^Xf^!`~hbqZ5j}ElMe@=~t z4(DdKfy@jB&5>OA!xR^elHnjCm~oRVIBKF7p}-2H%_%_APj3cP_e-jup#XUdx=jT5 zS7ajVp{=dQi16+>yY^Mf2+{a;}7wXI|b9`7@0y!|{7bG32XUQ3!o{JluW?<(Lt)g`gDqBQl06tA0Lq0VS zK4oFdkTfU2~^Smh?MM$V1_;ZfMbLK@@dAAvlN=wWrk<5i9W@{`lRi*A*VYF>7m) zmQ~aqXc5rjJdV25+w+v$<_MLRl+al0Q%B~Es)i+(Fi8G@k{?p?Oc0YZXEBn1PAKX+ z63=pN$8|gh>(a4H|9+P9%g%AE$%=0~{`{xsduKh@bF1atOVANd()YsDkwU&snNmg( Z(_I{<8A>y|OIsr8 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_integration.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_integration.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c46a7c32447fc56c7db9f7c640f5ccce6e687a6 GIT binary patch literal 5351 zcmb_g&2!tv6$e0&1R+ZPjN`8)8#_(PPE9&-Gwo;;kJHHZ7$9oiW;hjgaxrGG*H23&K>*|$vF^!FA5O;MB-yQPH1em?x(d%t~n zi)4P@xA435_s8uYy<}NmQDgGwqHztEx{QKbEsNXS>Dn#Z+?|$V?uAz2ro{`~ePnT0 zxLbu*kvl6^tr#xbmgO`2?yN`gn)+!HO3psIzH*1XfBQqca7`>V!mD-0F0weeA1<=%?_Pd819_`2 zVjyO!FFNdjkP0gn**o>iMuiU&2GLoGOKZ!9tbtblke((8kE zy_57B>a%cdO-O?ccDpV})kVEiS z{Jq<9d5M>~$1A2)B~>VX)HJyiBhPwqrs@ zCd@}cv%X9qtXI!`x}3nxnh6dv(V|RdFN_Cax4Tg{jvF59MoND?0ppX@Z6`@LEkv=d zxv9&6GWFI&6~yA9P8W2d!)_qDf|#Y!xvWj(Qj*-&Dr0UFQ(N<9==#pgmT#J*xN3H2 zX8xnPgX;ra>Q^YZJ+gwV#6CnFE=O4~r8`33z?P>*)K?r~46Rp24qBxV=AiY)sDM^^ zPnN0hP}GX4t3-Eo*4PtEE?~+xn~k3{T zMXQNi6IU7{exN2}LZchC8~qK$l=w>h?aK{>5OJv=cJ7hE8@e4(ga|s_2ySZ_J=M-F z=!*s+Hu?o{d(Oyue%A_h*-HyWbAa&#-Jg7tukm9RH|J z7kT|DnPp_%wcs6l_~)Afv5*)`24~4C>evahBu|Gj!)Xe~i&E%;LDm@*man?eLV|UWVv7 zbw6ME&c^YxFkm$4hlmTtp8ums4zoy89tY%_lNp38Fv}`8&~L2bSN0`^JVt`-;UC9z z$T!~qff6qw%5Y+W78E8YnLxghCuV3&?EV?`pF}Zxi{yCrWr9TZLZRyqWB=z%4z$Kz z4&=)+9^|b9g-q?Tu^lol>@q`BzHD%2?l;knqS(ZypuUf(>lBJZo&T4y^LK~Z=fOL% z4JM<)iwhhZU?)BxWKQy6jR`sdNXya%V~L4AF)(RZT9vsXn1w@)v-=fQd)H=bMCA;hSXUbBcn zxxlY!&=BLb{fS`^9m02-a>BdLw!Lh9^4>3GvJF%~eRK5`#>+w|hi`e|ha{qO4vR=U~B$Nsi8xf)q!K7USE&HP`C zESd#09?%pwAqR7cc-E~EWunF5n;)4xB};d*>=Q|RUq~H+$RYk2k2-o!oGd`)6-n2lNo<=+vcTFD>-KzNBQ=JRgT3*f1?-QZQQ$+U77N$w;-5dD*2U zB-n$lPF*9@4$|U-usaZG;hxx-#!Eic9Px zZy%+$Gdy>IFZLLnzHFG?K>;?~8IPT9Ynymy59^b>!?y{1yufFOK2#WgFEDwx$c{v{ zLR#wgF-xcAJ`NzgP-mW*5zW#P=mC*mkbY#K1!s76ALN*}2Y8OVQx?V?^{i2|-^wAG9u$!XYXw#HUdWjaby zuo>BRoqO~#$eGy8av)f=%G!xuXG#06=-@yTO2P1o4QAlv0=@j0*c&os+nnjFlNJkz|DsQ0-xb} zm*DSya}&Z?1i?QDAwA097adKjxlR0P$4UPA*u5 zA-6S88!T!Mvp)Hxz%zWFX&Jx>5F6PNFiUR dN-3j>nK26vqH|`Ps}u|sxe#!C&-M^K{tKJ{NA~~# literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_role.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_role.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fa5906206ea3af0220b1ecc1593ca8c94677595 GIT binary patch literal 5120 zcmbtY&5zs06(=c5qPW`i`ZIQ%q?0&xs-l*h7(t80#&8;cpcmQox~3M(Kh|Pp(IOMtv^!kayZ}oz4v?X z@r{z@W#7Ve{U49ozdvSK|D?wB<)U#3w>po4TP=&*-09ja+dQ3?W1fXp;hMz@+y#6nFbVX~oj62$f*>A{A-292jN z>z$<6P@jccTS6Ly<9a9IVoStzO!L2i`mJV%%IT|!#wFb9YZSr)Ef!JIDpV})5Fz+0 ze(APcUgBl$@rr2``5C^%s}Jo~NtF3AUwLTl+AU9bw=4Y6q*dmt{ID7Eg^!UVlUA7@ z<;Tp(l32pX@ky)9Pw-dFNL5rZa&p|_r}(Q6t=2L>&0oWFg}=_574BUcYr^jZ8?fPB&DFp#t+r7}PV-E7RM8jdaIIcjHmm zS1OY&8TRTqnU@prtC`@iB3hL1*$d--*zNAr4Pyhp8!7!Uz5kQUZ6`@LD@3ubxtYs> zEAzHP6~yAc&Q^4y!)_qDf^11;OL?2jNl7B8RmR*VrnZ*N(3R25mT#IQs%my<=J=wz zgZm@g>enc^J+y+ngy*3Sl2H~+=?>A?x8;c;^%aL0L+kaSgH~yXIcU8-ETB~$x~6q* z=%VFudjoqy;m)8ot#EdZg{%h+b{Q9&Q4F(Zrr0 z0lY`5BcomvhdPl)E3yQ+WSI&NMXi{*N_00DjXk#H3a0$)UgH-EuGfg8PSU_$(PkpI z#D#{4@2P3`Z*-$}Bi%vxh%eONJ>NjI5a-gcbB8qD(CvVNLD1<&;HzQeRHH|biUuJz z@&yv)*VCQM3j(}M2f>ekLcNBftdG}r5D6z2)#)aJpO7Mk z)@=(!*n>Y@69{xpY@!ZppV@LgKpBIjAiE}o?n?xwTQ9SoR?@X5^-e0**i*xw zZ2Z`k6`;gp84troUL2w(nd>_4CuFlFZ*X`9Ey>ZLk?}?Kv2{P8&yTU&u_gX)fe&um2LVWpr!s>X*V!`(_JD#7jJ8msr zJ?9t`k#mM;ByP%A46>YC6N@OuOj$MceN0^^P&}8}KTnvQ4TLWQbjqBkJ@`B9G!c2^ z%lKqXle|RoEFziW@Foo!l26Y#@GOkyQoT2!dUoMrP3$Lpc2!RMY~SLYo=yI=BAW6f zL>>FJ`2@{zPkkw=f<|gJbatHwu6Bp6F77(=EnUUu3)8`uYBb1S<|bLwvFd6>8hFk%b`WHfW`xw;sfl1IYqqd z`jAq);^6E}lN97hMV{3m9ZrSR5v(-CKjTqH?~8B+h`fPYk!Cb96mA1w1@E)>FfgQi z#c5_`odmT0v6E4r8)_}(t5{L9GyDFWwliT@OZic7pO0&OShT7>Em}4DM3~^Cpg@2DRJ#hLSI{p)|GAXacZ{ zM6oxAS-yd>KjBtn3|0HYx2|1V&I&5JpH(nl(i)X5k4_!|eQQ)!-V!)gYMJ>stKx7Q z;tZO(lv!nkUYJTsBF+18oPhGOV!jJztA5*@MG|Gi&-L7Dc^nMrlqKn>xXh74zDbo*ZWw09A~=Y-xpFR2q*KHl L;P{^HAvF9C56I>% literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_scheduler_event_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/page_data_scheduler_event_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..674c8430038dd834a6323897d6c5be2c678154f8 GIT binary patch literal 5584 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/palette.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/palette.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b3984bc046a09c7921c80dd2f20fb15f9a3bcfb GIT binary patch literal 4298 zcmbVP&u<&Y72X{#$>oZY<=Am-r)eflk%U1^+I5Q-gd)U^9iu@(2a#J8M2pRGXC$sf z?$WbE#UiL4D)o|EQS?xt2kGdZ+kc~fz+QXG*|!2|^1WG-rYNa)O=)N6_k8bt@4b1O zEH8T&eh>b6)cMz{W&N8P^FIfTkMN{7Q3$JT30tt9-L}n}wV8Pr+J*a;C8wG#d?VPUz4H^(bkGBupC^ zmrBN=L@m`ff*cQG8!igm-ASOR_AMMD@@*u-mS5w<}_K)+&n?alwpu(!?7r2FGy343b;==WS=RG>#pPz#c)#0bQH!jP|21G`t_Wty9vnCTnd;7Ez0-o2k|iI z_4ew9j?s#ULj4|W?gNgZmKCThWTi0aB`VFz^0Ah&NHa(84WuG1t0EO86s?fj(;w9t zo{#aQpP~@<*z)rdPJ%l4Kv@{0HMG^GF}0jAdeOQ*W@r`11=D(aTtKTN>a1+U!}11MjVAn13N^UiQ1C48#3Na=l!kGi#m!co%Oy7cMFzJZ_8oK? zvAxQ<^r{uw$R2$)BX(l{FUjl+t~R{RQH%I7&!CMqsaM}5D>qb{L%E^&u5 z;^?fGWbH+k&SaW+j*d3HaoWOTEF}7w``y77c}mxF*{)U zj&{b5E*>!T16|a(!2~Dpt7iUh#um*28W(7a``8C_ia6`Rm~PMF=$+3^$j;+^etRNUz=f_O zi5vs}CM2IS(E>!?z+)~TjmtyWz*oU}_Av&=bd|7HR@RA6A^i!<%H1Fhv{s6)teTzK zj~BF^xof?k-x0z3?`dNS(pRj}TQg(IcdD=Tk}&9{>!{?j&4%X#d!EpCnY1H?AkKYr08*0 z!F)w)(rkH>k(o>bY15WOF0EDOAwfq*A0YA0oL-dbtk4ez>MHg!=VuP-Ei2}`V0Jp} zm^@99VrnH5Te1?ehG9=h8_KM(Bli~ZlHPamr0=0{*k$I~$PgSMuytYO`nYcf#Z;Mbph>ynt?*+yjo-v2{%LWsmCf_JweQFC2WU3;=uf zQDM>xnWt`)U=9YDrL*z?nN&Z}IU8q0ovZ{%*z!*#6DehdJ-hkyp;KU|H-AdE4~*3! zV+G8s^o8|>Irs}6!~*raQL|MYQ_qTel!=ijzWAk!GDLSLYO%51#@*Q=mzm0Dgy6a}~ZnWBNR>=9_~6 z=U8qL1g zr8luvdzpMB>I}8?$oy7@UPN0ten5S5?h8}RXm${C*Q8;zV14%Q!P(D{AYB|2PiV8qp}8*BDSV|w5+Hc4?ZV%`1C5LS>;M1& literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/palette_settings.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/palette_settings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65bae46c39033d9b2cabf8aa9428ab1ed68e5f10 GIT binary patch literal 4065 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/relations_search_parameters.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/relations_search_parameters.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29d07c92ff6c6b6e72f4af7c307e305a85351e53 GIT binary patch literal 8764 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 M0jijWY9N^WAE&=4Gynhq literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/role_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/role_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eab556ea2f4922f68b592030de080d1cbbf2118b GIT binary patch literal 4178 zcmbVPL37*26$U_%1R+XR9LI^>PG_f?Ny0QH?PSuKY7~zt36?pvNexNa4W=C!t-U|l1@mlCdoHdw|Ml2Y_G8%Pd5DsFt7d~M!Wd2C* zg;6jTED{GJ5zCkjd%}+edmO}pWUD^gi^R?sAMQyxT&Yx~+Mz=`l!LIs!){!`xQN7{ zE6|GNHGddXKD>FlJ;RhyUks#A`?8_GD^@H1%`#)}vq5;^uQ2EH>o-!6jiDF-F^h+y z%N~m;#)=j8Y5BTRVLgP9u3Uj0JK?QYfv5?aVjv=43eGx*D~tfgK)f5sy-}y!4f~b& ziNCumB8Bj@-3__e6@xOS+26waTD?p4{F6cF7E1gLDxu+6G&&MDQ_#49zs%nZ*W@P8 zs#ca?;dyR7)!m%P^8&Y@YR9^332VQ=7iPUYFY-k-VhbB1OQ$`4fiFMR+y(v?zle8{ zzs)b4!G@Q5H6m=!=m!H| zhEYTeR8UKq#EeC6=jE5@T2#R3f5OUk44147f^JyBx?m@acEx8EF?bx$)1uM~I+fue zXf^n(eB*irEE3m-e)kbP9}_zsk;Lov0${2r)baG?4Z$EBC-9Yrhl%BR*hPBYM`S3( z4J~Kn^qg*~V(aGj;|r+)%BM5C2n4f-+EmES-{nwEw0#YB)5m|^6yP}>>zrL!xPwpd znyJjQ1XV{)L1rZqauk7>?f**vEv08AB0pJS@ST~+k{%Jj=Xzw}rR<$n6gSmTe2T_* z%-mbO3^fsG~?Jc*k-l*Sqnr*CHsMXufX0zI^ zHR`V2+`j90>vyWPx?51~dSkWre}pa+>#Qtrl&&lxpQ|H5<2Un6Z>%pY<=` z9`LqX)lJ81wX1DNZLfK_QySY%Xt>a5SG}$3`foArnhv&iGtI5_@o#E_$9^y14E0Db zFqA!<^OA?`qpzikJ&p{&7Z2Xz-KR_@nC-1K&VG zurCiF(IQn8^5!T=bh<~MNUd>UO2B}>!aL&NEU*)E6|YW%^}&o+=TV-gQ@~Reou7Lq zF3mJLPo8>o5g(qLH?=iu)3$L6I1tcmeiu?nOKs(Z0~AE z&GC_Jd2mi-a&~eVK9wL zhOHw@K(=7$#TT}@H0|Y#;(zU&tuIsG7%xr9JT?D0J5$tC93bka{{PH4(N4&_^l^FK zyKtrB_XmDS41pSPH%<9fBok?ZhA5jG4lzq6`QbFg671Inog@cH5P5`gdyKj3Jm9V8yVdeipEzep3$`_m}^%b3f!(y?;^ zkZ7YITtx%4(IsdT=P6^Qz%kMHjYssW&6p!*gu5!(VVzL!v9Pl*y2#G_2-(>IvhCZr zettn1NjXXi$!$FEc^cM|EEb9Aj4LEL&l3lp_ZKWt-fJ7CUVLf3bo3ndnfX-k2KGlr zF*V@Fvtxb}R`qLv@TO48g!t7h4BKOvm- zvpc#$)l0;xMRrhjr;8*eoh;4N4b!j;J@>-MQEg`p8$>GDy0M(TE!+B;Wm;x2e@f-g mNlpn>VniY$&q#9VL8}?B+ZM4hRsAN#shE&pTient5c>xW1^-+C literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/scheduler_event.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/scheduler_event.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe9a5888faa419404fa60234d147adbe335a3cb2 GIT binary patch literal 8834 zcmb_hO^n;d6(%X_k1MTr{qHzGjPqkFi6tk_UpKbvBzBB#0J+F+i&kjCa5b~Lw6&r< zr0lFfpKPGF9NJ6U6o@xz(fHC+3-sP|uSLOQd&;4w04Y$QO}{r3DT$JHwMn$gA>aJG zdGCGi&5&>0a@kPuyZ)yKYrlJ1QT|E9@J|PE8JBks1ydRdQ<>IM8>+l(4NcxNjm$NL zWte_nVLI3EWg1zgttgeOeMMCi!^CfO(`j#bZ@IQ$=6hFHR?RoRzih~scU)mQZO<3o zrti3I&)jtHn7(V;U4PRRPLG>{-|BMD_smX<+a5P>JD%g47i@D=@b!zQH+{deRIB-N zhBca@>bN!LHoY3!x!~<4$CKxuwL4Dj^rd)u6J5GnyzSdGui3FT_=TE%scM=}nQix$ zy<}c}<=l&rkk>oB4T(*!!<*)9EFy|KZClrVm7x{Pn|b`{->&tZP0-lTH)HwWS}E-!$c zxdK=ef~1itDon#4AYp)l<#6S36@FthbXH^rn`0$bX7lU-TVRXqplr#qOYAT^a$jxa zc%B_)$L=fl)JB09ZWP(^gvzrM>=D^wa04wT6DrRhWsk|0IX;J$#}g{go?xbIDe)3o zo=m7bJH?)oEoELt%hL&!XV0)_Wy?IDN6YDi%Cj@9B3lmd188|Jq4Ml`_JV9#;0tIu zn^1XHWi{Ed$QRLaE}`=5MfQ?xImi#9<$O%Bm)R@#mBu0VDtit0!|ZkT9o&zwCH4mH zN7)5-5%**45M2Gc;rvQ-le2D%i>tTcR6VbLef8=RIlgB$Tejz!cz{#8CO}QR!Spw| z*+<+Y#N$>(MMtH-@!Yc8UAxuVu1Y@(Gl-)wTG}IKXwtdInrl(cjw%h(Ps~F({n}IuA+iqFp%3--!)1P!W%S!GG@5e&AuGZ$G5E4A%=Gu zMNZ49<9`Lz?R^=l{#EbTDB{(4h9-7_p`?+WaMt6!TLv7z6RAV*m;v4AD)AFAR21jp?JZW70+I7uWq zQ3KZ(6y~`?@9~t>Ddn2fE&kDSygGbAD~pWjIHEpV*{6YwXo;43bZo5IY0G{q78*BD zT|5riD_Ue98CB%$DI+mdNh2A>sU9L8BSvcPw~23zED7JtGrkTh=@irbVu93rBGFZ9 zExm#~-KBaHMeos+PmD-1)g#1{7>kwllf(~3#!WNExEG8Ji+o_DY8t0hz$Lbrb3dNrIe=@*-Xs@49&Y>t6UKoZqlNmWB8uwQPywMD=3X7!AB=l)J zxlfHIir&dI`a>%13I4|e@P~#?lYavCL!1LOzqbu)@N4fuUCO5;9wi5-UjASpEoetMDk6*ZbDdXJ>xABeLj`kxNaAB>u2 zjS1in2KBKYR7~TtJMAjK`@;n6>4J}A?63&h>0@?BbX3kEUF+gmC=%l; z--}bYQr(|%&4%mG6I|(~{hJ}X4-RQ;Q*U;MN&ZQ2((Bk?sL@2xJ2YyhDhaSBpg&6h z-A&$cNU3)O>Tct9hjm!Zx;PCTVkAki^zKY`f2I1FcIS^1B;)U{Z-(YRxug+|lL*66 zdW4jj1S@^j{hb<36l0$-u_Sv!`^yB{c*rypjKdp`h#-!sY2$Z?c}(}ZI0MCEtmQXs zDr%|jAGl`2`qv58UO$a8qo7mPP!Nfax)qd3=z=BS4Og*)kKs%k^U$_IvF#~3gb{GLn5pbavF!-!Cp=4 zUl-3o%NTK)jY`Ed)s@H!Ga)|MiRnvjMj@wxJv)aq&cjZPSUx@tV#>T7OCV0~#H7NW z=ni(`-87y6tV{+`T4}d&yTduGW?ei#gd{1Jj$NvIaw3xS1x*)a(!4*SaFn~MuRK5+ z_=dKlUQvE}@h93{?QX_L@;A`#X?JyB4|G3!PZOv7tdE2*)9x#QeowonBGIH>P;M3c zJd(s2^r!~ zr5~s}Xb32)sMW)~?^-nep%&&hZO`_7Azr|UiW;gPq^unlF0|~eHD+IW87B8MbUUi_ z&ZHNSh+*|Y%Wc{%?-CxOL6YxuIqCH|lJf-4!654*WX_zBlAn-Luj6=9%B|NwhX9IX zDCE=GNMs#(->sC?f=)r-Ac4spO6t+CbhT2(p^NiDSVVt8W4y53KhKe=Z!gSma2zq> zT*kn;B@Q}moJWRw%klg$vt@TgHJ(4z$$Vip;)32@cTJx12(nKlCv!Yu4hiUP%MW$Q zQ?7bm$LNRPyLbmS`2%{)4+sAR%ir-NR8 znC~Drzh(OoC=>RcFb7uy%WI?>*=Anr9T^uIJ;r3F-cn}zG=>K&W6OM$zpKElewc@Vkg4J}Y_ zXgBE;T^kBq(dDMIZmzlhrs=NT;7ug*ZNW{PklU?yDjD$_$x2F+aO6&w^)N~ghgl5b zBIP1s&a(I|%eo$WwV~;1Y22JquQ44GbJBMV7C-f-R*DSzTmt_zndNCF$sLJwjU*r4 zT}ik$x2zw=<~1e>Mm;J>)a}GVd+3uNxx+(zDLDCQ~4xw*JMq~ZFwJ} zC@8wB=~_WUu#W!azSQPNYlzByX_U272;icjYR0#7FBpZB1-+n`^6?T>C)wXZ5o&^q g^YoC598va|q!!lt2!cz1QSr!Apq5ck3s{i;57$3=#Q*>R literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/scheduler_event_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/scheduler_event_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8ab219124bf954ca6a1021f6df0285fcd824661 GIT binary patch literal 3267 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/scheduler_event_with_customer_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/scheduler_event_with_customer_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1f09d027e119235d4fd47a5dd92c21e83b4762f GIT binary patch literal 10588 zcmcJVO>Er86~{>~_e0d`!{2s3nK-tycD!plNt4Kq>%?C*imro5L5oEShT0iPv{%dZ zkZVT*-HUx`ue}vTVV_!GdT3gpXix-g(KfdNITGlphax>T$fanT{@+mKQrwkxC95lO zmT!jh=Do+?%y4JuPD~gIKG%QsVE%~{it;xS(jOhd1svWfBur^2Ol4Y2ZK(2FYiRO2 z*T`K}SdQuU6{d6jUapa6+N@H^+m}>DF-&~smYnvY_qJ;bX1;rQcFuh3ooj|Hx#9}b zX?wotHhsr!d*+gR$Mjv(?)pova8|h~_^mGYe9!E(xb1QCw&OXzdCoSM1Ydab*plye zW@u3nfi|27WBK7uFjhFSyFv zT-ZKm=KRWxNd|kcc+v5fy7SehyIk|`*o%u?NDJfhrpx#uZ&z`d@j1e;)SHy1KV=9P zaCkpLoVkMAqR=gA;e zRAkSw=VeKmmr-&!k&5gEc0`s;@ClS0O{5|_#$J>qlY9~-l|(ACK z>?Etol4(ATl3F4a*(r8fmh9rYP;w@bitJ_fiY(d9ccbLhL@KhcvDakD9=-=9ug4O5 zgU#Gm8hhDUb`IbB*qiJ;zW1}QvkUk>z}{kSvNZ9sGE3Zvt@gpi4$}I*8~CyJEp(H%{4wu;v+6aALVq;uJBckNbdr7EcmbLe$p&T0D%BQb`B`n>D58q@0yzQ!7*%WdEB zSLkexx9zrnjaA0ODVw1UbO*a-5&mJhDLA2S`OY#A$D3k#`s$6b7;I_#JXYgbaL*! zBU^4v#5r@+uoy=_64ap@McME*CMHQLMNLAShFEXXCGm&OH5?alc>h4c)IhPK6hkD= z(HoKGWU9+FFVlidi!v?AbWEm(OveM%?yBNMK()&Ov_Lu&XpklXXoK`dkb^WCKr5sR zfevXZfObe%gFK|^0Ifi(2L(vG0<;F{y`TtbcYszQy&sey?FrC2q-HP%X>R~4Al(QI zNc)0uDS5#-r2R~tg@0gLTRpoTku1~ZNz*o$0cp!*e8FjB^mE$gY&6oJxJ>FW_X7xvkcp6&%^@G}b9wwMt+iAKr zSmZ3YVv)aGa8r}F z!CU*XI=mJ~Ls*=~BkK+Zq+TegBUd{sVadXMaeT{~fo0wmBn7RY4*Dx0ceKM$^{-Zs zZH`VgZnuefE&0$n9n{;tpnDW3Hx!Vlu6}xzgw+k*3x6u&VsfBnk8Z>$}r2PDcem!c%G6>IB3}ODgQ8%)e}Pq zOB=c&Ug8C)!hG>b0#&-&sFCX@Dy=2LDV;N_-b~j|;uf)#4qIIum5xL#$@yVG@V-aE zJAz~=Nq_E<)O$$UrrD|PmL9QE^XE1dC-GPttuDq-tt^ex9&&mRPBejjp9&>T$A{t6 zi^EWw{?MbTS8G%!2f)-*vc^&`V^po1qck9Lb#V-_iAN{-u#q8(@_tD18;PjD3?M3g zRNAH!L&17X{aL=~$48p1z2y8LvgoPoCsZiOIz2L3vAsh9`)mMUaph5ixfy4%t}JeG z{-|wiPTjhA*2Rm6Sj?MzuFdd9c|W75j>Oxa`gxO2;oCHQ7;BHCJIh(-scRqkJP0#- zH2R1NC1xi_#Y~zy6tO?{Beo?UH^EEl$)L3*-J4^T4qshV5TKYU`9mo~73KYwf;bXY zA172fY-dT@w!SPq>oK^tZZ6zUjt)YJRv12|LW$CI>vd#*Jy#tz6rZ0b_>AsYKQa!B zFd1FP=4h<g9FNJMKxBWGP~P7u zeiK_#v-YRLL= zi8VyX#L}qxHpiwfR(0_bq7kzr*X1&!3g!KqA~q5`ze(8f)>fUjY4`?DGmoh?%TBr* zVRSh}eh$Kh)+&owJsS<1*vO&Se3W1lR~a>0{n*4BB5Y!5RDGLclMYi|oJ25UV&o!j zh8W7*MZp@0nBOJDBn!*iG;c};9;%m=@4orIc2~Qb^Re?6X!o?cx~~VipTDPx z=l#5o-9Dz>R|5T>c2C7}zIINzRq~72A#T^Q%YSm3t=9hD@{ph|TE^7rw)> zsf~Y=IZeNBeKZG`XUTW^1?6LRhpDg+JCYC7hbRbWuSctgMc=ik{v$0cF4>;#`$C*T zjfxtoA7-K*md>^8<#}eGuOsB1hRgOVtFI3m#G(eO=UQ&lZh7Z%5-E}GY-~3z4@Y(% z!uuDneHVPl9g?0Ll3py}wHWD#UjG~hDN>=3XQv|(0yf1q8*bQjqK2VFCMz-IgEfQm1N#`P+7@%fsAFzLK?65|Dl7m+sIZ4nFc$t7uzM%!`4echq?S&hdgj#gD=`5J@uD@iu z^EY@C+q1UdCf?+-TURPMah7Z+r^#5t&$1pxn{;6wmAJ?t6&B#lEo=+Ny};0PwLCoB zQLR3ol5o??6b4iErdEyuetf78^1T}JBQo)u9~`BP1n7S2bNLX&3^se}yl#scas} zg)fas?Ffd3F+Er86(+f>-PLL(S+XSmCybrg**M;{<2XO6993rqtw$ zEY3KJC-R+r6pRmW8Irn78X#u`^Gexu24$5tCPuG?I_Y1oFNp48Q4 zi!Z)(XxVWZv*ofQ?yx|2C>ds%nN_w&Mn>HOkG%=RY_qR8ZQ~na&w_nHCM{^yZX`+w}gi6>#E8460eugEdL4I zFU?h{?EZ~|IE};pC;ZGMJQj%_NhLKbF{SG-)w)i%&O`5yRnjcOvMk4jS)Prs0vlyx zY@BUl6Ks-gXVhYdy}_p0%pJLs;aRqW?Ytx1mMb})yEe>r1yq*pW_tuD&-38y4X7;J z#~u-!5k3OWqXCs=DtkGtH;Lc`2Z>>=b)haAx=nIH%hbJHuYNBUN^= zSJ_#dcd~QrJkGn=1@;=wyV*tdI?j986o%Lry_tDlTYQr*85lwW$(MCYU$NKhxl32h z&CAWv;dmrxN1YT#U+wWiCNf$sYn|O^gah|_l5uJcuITTo{>T-5Akd{J-K9F6Jr zvIqs*VzXAW(S_H&sW2D!9%1H+4t?r6ZaE1PjYXp>9I0_IYTigAP~Y})jq6K()3JtS z+|;Y9TEnav)m3lGHkRsIv!OZsJx5#NwvB*N85hRRw`{%0Dp?r#8Z500<6>SI>R$@G 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/sign_up_self_registration_params.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/sign_up_self_registration_params.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82147d403bd2b4cc811d0f7edcdd2a88a65fb87b GIT binary patch literal 4368 zcmcIo&2JmW72h2$$<>;YrNnlkG$;m5o0M%$+6fY%f+9Gz9iu2Jr=|=PM2gLFXGE<; za@R9M+hQs7Aff1?e?kw^(f9UWXm7prw%43;_N_pZ{@$!e%amjrsJqmB?YxR;rSbrBS{p;Q_xR``dFYgUAtDK?4C3gp;KZ#>V4CAcF8Qbk4z-q~H@#IOd(-NbASJB>K) zH}#{a+m*_4IO)f!kX<=wfGqe1>UY*-s!u*83~r$4KckWk%;Jzq+NC*1F#Jk?VQo)% zqHKF*u`H^>KXBU>Srv04IB@pewlDqdIdNe+s*0MJw=;nZFtacjiHl)ZY${y?q@C8+q@^c2@GuY{6(aqz8>lIyBoJx z2o{>hy+~`04oseMh&w}X%CbPgyrqV99Y7_>#mBMC*O95oiqGHc}G#Ey` z-fqKMAuoZ6I?EU1C^PX^6aq#v+>yKaB@JG~VHO(s*o1wlHNenbIHqfX>{oKPy+l;^ zvklPvx*%DP$pVvy`V8eJiv9$ZaK}zq)NmN|*%{*i{c$97KELU95Rf13H+~Vh0(`Nm`P9<%n}cve1@Jdv+!wTySX2RINpTekHME- zL{(uGx8nM?1g`hp=tnP7V`H*DMvR(1)Tcr=d|E*@cD5bZ#2x+pjzkEu*qVV4PdD)% z_)o3Gk^v@~ICSGtdD7{Xsy|(==*v`jWl@zit)r!@R zMH_{hJM{h{s?qfqV(lzu&&8XfaDX`auPMsTTK;OfJdL!o_A1bJ*37G&G7}x98a)ef zZ&=|9#E}YTotWPJhTbEibDqN+c|H|;L;V$<#MyI=bBNn$n;p5goZo%=CEH_rB~uzZ zW46!sJmZZ$Q{HFl2c~Q)lOAmGb?k`}C>mq$&_5zSFW%G2IlTYO z%weThtUL^koRh1^-jx1=sag8pjvb-`H$J#2?_nR%lyTPGG2M^l(fjvo$SlHfaTOvR z$fPofL>hrVE|S;vxIO^#&bc!wPDd%(j z{*>!wc5Hs8NL%%aMRHz2MlkG|+_QVSVP1Y1^@cJpAwiqvmyGcxil)2YW0zRq z;=;$p&)nL#fwyoxs<7IBf=b{n(wL2Y_$o#@rG1L&)?X-s6~1!Fj+`SxqC0AwL?Z54 zeC6PKC4(%}4-1N=of>!t9}a7vtl--T_j%^{(i!i&t95n6)R4K zYjQ`c+IP@_JGut$sH>C&Q$QNK+iZuvBiRXuS3}8@P2Ne(7Ee3dGDcDsDarAT81+7{ zm(=%(a}t?YCE$hOlj3^L%UC4U44Cpt7|I7>_y;Vp_z#%p)?TLSV$CUurmD6H4SrRNctE=eT?%U3=uVl zJ?huOkPbbbsX}LI3>&|T?c4L@i%DmQ&m{8b3wW3N$B}l|CX0DROM?huKN|`tTj=}@ zq>BD&psrK(Opa%_KM6ornI=hn$8(v-eCAfZWfiJ}G7I3gbAdZ){lNd8@A+P>Itd&f m)82JdIa5**it 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/subscription_usage.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/subscription_usage.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f35aec17694147554e159379d5135f09be4dee50 GIT binary patch literal 13052 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/tenant_solution_template_details.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/tenant_solution_template_details.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..506dffbeeaa9009a2f5ab0ea1d49a6dd2c8fbd90 GIT binary patch literal 10081 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 O2slv7%IP`yw*Ld4)pKzG literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/tenant_solution_template_info.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/tenant_solution_template_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ac6a0a77f08bdcaca6f0333aca1aca011406147 GIT binary patch literal 9344 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/tenant_solution_template_instructions.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/tenant_solution_template_instructions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecc28ccdeacec9acf052a6422d6d61c998d9febb GIT binary patch literal 5183 zcmcIo&2JmW72jPh$<>OKKjYX=(@YZ}Dczd1>jo_ZMU5LfhJu1FBDE-p7Mmq!B&|j6 zu4jfyL{Pm*J@(K;4+VOVj_$bydhCBtpvOHG$SG&v3MA?8&5{&N$+nEdE6w-JoA=)Q z-kUc}s#V{@cmE#;ZFbSJKBva?=c4gGlDdJ6TP=&*-09ja+muerF=e4uxM%SKclRys z3U{y2DspGlsujaKwq^MY-`ZvrZ>XOqq2%o2yQ^#L_Agg_GxA{~SrjWR`yCx6v0|Ia zr%Wd-?CZ@$Mgzg5c-R+8E0%Ues07=NRHWHb$Tp=|fA5`5t<%LuLz^Aiv_m~g8a(N! z2F8UHaYvx0^z|@}8t*KRw`Z8r?}=E4v@c7;4YAY+m+OqZ#p2{)xXA9ld*f!#t@;A88=lAVaNtAhoSNE+wyX6V*!5m+hw95PpKWj#O;bY|7q*dnU`2{mF zFXl0Faopms@JstvtHNL9mr+*v6@C@v0)LHv2jv<5I{z-pvwRM~VA-2%A`WA{nsoc5 z{WZ}`yHL=|6c7fgd4KKhB0)#7PB&DFp#oSW3~HI^lj%*tMml4pv+*c!mC9s8hP`@z zh<6g4t7d`&J+vsN*$d--*zNAr%}KSYcVivtoqICrrz^ZQedT8Al{OtK!XV+QCdQfARaj_o7 zz-$z=)f}JAS~&vZYs z}bVWJ{u7Npq30cW0+4Sd4 zl5e|T4}S1`E!W4iI&hGakLr}@@E?MSnMTPQ zyn6~!k1MJ}tH&SJ$AFVKU-RMWZ|qa&XrFJ^_O-ChxP*7x7u#y%_BoPcqSEj<}Ol*_4Pd zCwMcLzzp7~@7GB30Can59 zDv`BoYwG~P(*x(wzGMCFz27>!&Tc^?WEwhq&aSK7p{t8~j(k%WHG(Ma>{~;3&)Kta zQ#ec3Lr<57E-zq4edr!|hjfGF{j_op{kQcTR=WAh1OL#PUOjXt^XGNN%>T{MqFLa^ z12@H8(7~J{_PRf$0IoQA`(txW=b=Czr6I;mh18KiY>a=#qmDjiI|Ycmie$nTjkto_ z;BOB5*@qYyQk3B|v$9SCTK~w&%A27IwU&|sotmB5pUr4H^Om|{ug$~d-xFcFOD|c2 zrBfhvv`Kxbn{>jiT1F)&WcGSG?{8y^ocAku-hlsekfU(LNOQ$VvW{1$k;QF(L4lMZ zC{68EG$DqI*swPviM)!jKOiZBNX5SNwQJX^i1wq;vN_C`v_@ss(IX=u7pJoF2EYyl zWj>yxc(#OiW@c_TQaUU2!c<-cEwg{-l1j5;P6e}7zipl#l5|!pnfo^@AxQ0ab>g)Ol&%P$?tHj?^2GS|82_%;Gh1fh;y`O0?}My--l`O+`>_E~B>gVQ*X z(a{_`1Bwoe?a)o1+s%Py=A<^V@ZDLfBKP>QsDy1oA>8zY0 zrtgJ1Kd2KNVO9c5Ao(W}m-MyZ3~Hyt7*-vVV;u1*y3~Pwi_i}VF4M0NpBSD#VPVWs z&l@#c)-m-YA59Mek}?SXJZ8>wP8s~?>yG(qGE<{wLL{JWYnZ7j)9Z~K)zE(6Y|#%Z z&XgmNeZiu2)=u;$OWF@a2M>i%3Wgs|!tRH)g8UxwPl6M}1jQhDlm~rT5sQSJfmc=v z0`V{i{(>dOB7DcSE2mR?zVet{6SbQ_8**(qm0a=HCeV4B9OlVRvgB;uBx#NnM}<@m?R8EgK80(XSufH zI-UbFFMa8h^U^OlRhajjZ#({zrRRIEd9LSH%40|KQ`+Z;$TCL?`8rifIb_U?lURV4 U&vmg(UR2Tffd${QJ-D6!1DZi{VE_OC literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/user.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/user.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f89f2deaaef908095631db3b810a197d1e940b12 GIT binary patch literal 8964 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 QoQg*l0~L*eT7bj(AD9d{KL7v# literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/user_id.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/__pycache__/user_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b48b3bb3fb1242ff1aafcc5b14a627ab2a99f24f GIT binary patch literal 3203 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 ONw9+(vKcvp5$}IgE~{Dq literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/allowed_permissions_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/allowed_permissions_info.py new file mode 100644 index 0000000..7f0772d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/allowed_permissions_info.py @@ -0,0 +1,301 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AllowedPermissionsInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'allowed_for_group_owner_only_group_operations': 'list[str]', + 'allowed_for_group_owner_only_operations': 'list[str]', + 'allowed_for_group_role_operations': 'list[str]', + 'allowed_resources': 'list[str]', + 'operations_by_resource': 'dict(str, list[str])', + 'user_owner_id': 'EntityId', + 'user_permissions': 'MergedUserPermissions' + } + + attribute_map = { + 'allowed_for_group_owner_only_group_operations': 'allowedForGroupOwnerOnlyGroupOperations', + 'allowed_for_group_owner_only_operations': 'allowedForGroupOwnerOnlyOperations', + 'allowed_for_group_role_operations': 'allowedForGroupRoleOperations', + 'allowed_resources': 'allowedResources', + 'operations_by_resource': 'operationsByResource', + 'user_owner_id': 'userOwnerId', + 'user_permissions': 'userPermissions' + } + + def __init__(self, allowed_for_group_owner_only_group_operations=None, allowed_for_group_owner_only_operations=None, allowed_for_group_role_operations=None, allowed_resources=None, operations_by_resource=None, user_owner_id=None, user_permissions=None): # noqa: E501 + """AllowedPermissionsInfo - a model defined in Swagger""" # noqa: E501 + self._allowed_for_group_owner_only_group_operations = None + self._allowed_for_group_owner_only_operations = None + self._allowed_for_group_role_operations = None + self._allowed_resources = None + self._operations_by_resource = None + self._user_owner_id = None + self._user_permissions = None + self.discriminator = None + if allowed_for_group_owner_only_group_operations is not None: + self.allowed_for_group_owner_only_group_operations = allowed_for_group_owner_only_group_operations + if allowed_for_group_owner_only_operations is not None: + self.allowed_for_group_owner_only_operations = allowed_for_group_owner_only_operations + if allowed_for_group_role_operations is not None: + self.allowed_for_group_role_operations = allowed_for_group_role_operations + if allowed_resources is not None: + self.allowed_resources = allowed_resources + if operations_by_resource is not None: + self.operations_by_resource = operations_by_resource + if user_owner_id is not None: + self.user_owner_id = user_owner_id + if user_permissions is not None: + self.user_permissions = user_permissions + + @property + def allowed_for_group_owner_only_group_operations(self): + """Gets the allowed_for_group_owner_only_group_operations of this AllowedPermissionsInfo. # noqa: E501 + + + :return: The allowed_for_group_owner_only_group_operations of this AllowedPermissionsInfo. # noqa: E501 + :rtype: list[str] + """ + return self._allowed_for_group_owner_only_group_operations + + @allowed_for_group_owner_only_group_operations.setter + def allowed_for_group_owner_only_group_operations(self, allowed_for_group_owner_only_group_operations): + """Sets the allowed_for_group_owner_only_group_operations of this AllowedPermissionsInfo. + + + :param allowed_for_group_owner_only_group_operations: The allowed_for_group_owner_only_group_operations of this AllowedPermissionsInfo. # noqa: E501 + :type: list[str] + """ + allowed_values = ["ALL", "CREATE", "READ", "WRITE", "DELETE", "RPC_CALL", "READ_CREDENTIALS", "WRITE_CREDENTIALS", "READ_ATTRIBUTES", "WRITE_ATTRIBUTES", "READ_TELEMETRY", "WRITE_TELEMETRY", "ADD_TO_GROUP", "REMOVE_FROM_GROUP", "CHANGE_OWNER", "IMPERSONATE", "CLAIM_DEVICES", "SHARE_GROUP", "ASSIGN_TO_TENANT"] # noqa: E501 + if not set(allowed_for_group_owner_only_group_operations).issubset(set(allowed_values)): + raise ValueError( + "Invalid values for `allowed_for_group_owner_only_group_operations` [{0}], must be a subset of [{1}]" # noqa: E501 + .format(", ".join(map(str, set(allowed_for_group_owner_only_group_operations) - set(allowed_values))), # noqa: E501 + ", ".join(map(str, allowed_values))) + ) + + self._allowed_for_group_owner_only_group_operations = allowed_for_group_owner_only_group_operations + + @property + def allowed_for_group_owner_only_operations(self): + """Gets the allowed_for_group_owner_only_operations of this AllowedPermissionsInfo. # noqa: E501 + + + :return: The allowed_for_group_owner_only_operations of this AllowedPermissionsInfo. # noqa: E501 + :rtype: list[str] + """ + return self._allowed_for_group_owner_only_operations + + @allowed_for_group_owner_only_operations.setter + def allowed_for_group_owner_only_operations(self, allowed_for_group_owner_only_operations): + """Sets the allowed_for_group_owner_only_operations of this AllowedPermissionsInfo. + + + :param allowed_for_group_owner_only_operations: The allowed_for_group_owner_only_operations of this AllowedPermissionsInfo. # noqa: E501 + :type: list[str] + """ + allowed_values = ["ALL", "CREATE", "READ", "WRITE", "DELETE", "RPC_CALL", "READ_CREDENTIALS", "WRITE_CREDENTIALS", "READ_ATTRIBUTES", "WRITE_ATTRIBUTES", "READ_TELEMETRY", "WRITE_TELEMETRY", "ADD_TO_GROUP", "REMOVE_FROM_GROUP", "CHANGE_OWNER", "IMPERSONATE", "CLAIM_DEVICES", "SHARE_GROUP", "ASSIGN_TO_TENANT"] # noqa: E501 + if not set(allowed_for_group_owner_only_operations).issubset(set(allowed_values)): + raise ValueError( + "Invalid values for `allowed_for_group_owner_only_operations` [{0}], must be a subset of [{1}]" # noqa: E501 + .format(", ".join(map(str, set(allowed_for_group_owner_only_operations) - set(allowed_values))), # noqa: E501 + ", ".join(map(str, allowed_values))) + ) + + self._allowed_for_group_owner_only_operations = allowed_for_group_owner_only_operations + + @property + def allowed_for_group_role_operations(self): + """Gets the allowed_for_group_role_operations of this AllowedPermissionsInfo. # noqa: E501 + + + :return: The allowed_for_group_role_operations of this AllowedPermissionsInfo. # noqa: E501 + :rtype: list[str] + """ + return self._allowed_for_group_role_operations + + @allowed_for_group_role_operations.setter + def allowed_for_group_role_operations(self, allowed_for_group_role_operations): + """Sets the allowed_for_group_role_operations of this AllowedPermissionsInfo. + + + :param allowed_for_group_role_operations: The allowed_for_group_role_operations of this AllowedPermissionsInfo. # noqa: E501 + :type: list[str] + """ + allowed_values = ["ALL", "CREATE", "READ", "WRITE", "DELETE", "RPC_CALL", "READ_CREDENTIALS", "WRITE_CREDENTIALS", "READ_ATTRIBUTES", "WRITE_ATTRIBUTES", "READ_TELEMETRY", "WRITE_TELEMETRY", "ADD_TO_GROUP", "REMOVE_FROM_GROUP", "CHANGE_OWNER", "IMPERSONATE", "CLAIM_DEVICES", "SHARE_GROUP", "ASSIGN_TO_TENANT"] # noqa: E501 + if not set(allowed_for_group_role_operations).issubset(set(allowed_values)): + raise ValueError( + "Invalid values for `allowed_for_group_role_operations` [{0}], must be a subset of [{1}]" # noqa: E501 + .format(", ".join(map(str, set(allowed_for_group_role_operations) - set(allowed_values))), # noqa: E501 + ", ".join(map(str, allowed_values))) + ) + + self._allowed_for_group_role_operations = allowed_for_group_role_operations + + @property + def allowed_resources(self): + """Gets the allowed_resources of this AllowedPermissionsInfo. # noqa: E501 + + + :return: The allowed_resources of this AllowedPermissionsInfo. # noqa: E501 + :rtype: list[str] + """ + return self._allowed_resources + + @allowed_resources.setter + def allowed_resources(self, allowed_resources): + """Sets the allowed_resources of this AllowedPermissionsInfo. + + + :param allowed_resources: The allowed_resources of this AllowedPermissionsInfo. # noqa: E501 + :type: list[str] + """ + allowed_values = ["ALL", "PROFILE", "ADMIN_SETTINGS", "ALARM", "DEVICE", "ASSET", "CUSTOMER", "DASHBOARD", "ENTITY_VIEW", "EDGE", "TENANT", "RULE_CHAIN", "USER", "WIDGETS_BUNDLE", "WIDGET_TYPE", "OAUTH2_CONFIGURATION_INFO", "OAUTH2_CONFIGURATION_TEMPLATE", "TENANT_PROFILE", "DEVICE_PROFILE", "CONVERTER", "INTEGRATION", "SCHEDULER_EVENT", "BLOB_ENTITY", "CUSTOMER_GROUP", "DEVICE_GROUP", "ASSET_GROUP", "USER_GROUP", "ENTITY_VIEW_GROUP", "EDGE_GROUP", "DASHBOARD_GROUP", "ROLE", "GROUP_PERMISSION", "WHITE_LABELING", "AUDIT_LOG", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE"] # noqa: E501 + if not set(allowed_resources).issubset(set(allowed_values)): + raise ValueError( + "Invalid values for `allowed_resources` [{0}], must be a subset of [{1}]" # noqa: E501 + .format(", ".join(map(str, set(allowed_resources) - set(allowed_values))), # noqa: E501 + ", ".join(map(str, allowed_values))) + ) + + self._allowed_resources = allowed_resources + + @property + def operations_by_resource(self): + """Gets the operations_by_resource of this AllowedPermissionsInfo. # noqa: E501 + + + :return: The operations_by_resource of this AllowedPermissionsInfo. # noqa: E501 + :rtype: dict(str, list[str]) + """ + return self._operations_by_resource + + @operations_by_resource.setter + def operations_by_resource(self, operations_by_resource): + """Sets the operations_by_resource of this AllowedPermissionsInfo. + + + :param operations_by_resource: The operations_by_resource of this AllowedPermissionsInfo. # noqa: E501 + :type: dict(str, list[str]) + """ + allowed_values = [ALL, CREATE, READ, WRITE, DELETE, RPC_CALL, READ_CREDENTIALS, WRITE_CREDENTIALS, READ_ATTRIBUTES, WRITE_ATTRIBUTES, READ_TELEMETRY, WRITE_TELEMETRY, ADD_TO_GROUP, REMOVE_FROM_GROUP, CHANGE_OWNER, IMPERSONATE, CLAIM_DEVICES, SHARE_GROUP, ASSIGN_TO_TENANT] # noqa: E501 + if not set(operations_by_resource.keys()).issubset(set(allowed_values)): + raise ValueError( + "Invalid keys in `operations_by_resource` [{0}], must be a subset of [{1}]" # noqa: E501 + .format(", ".join(map(str, set(operations_by_resource.keys()) - set(allowed_values))), # noqa: E501 + ", ".join(map(str, allowed_values))) + ) + + self._operations_by_resource = operations_by_resource + + @property + def user_owner_id(self): + """Gets the user_owner_id of this AllowedPermissionsInfo. # noqa: E501 + + + :return: The user_owner_id of this AllowedPermissionsInfo. # noqa: E501 + :rtype: EntityId + """ + return self._user_owner_id + + @user_owner_id.setter + def user_owner_id(self, user_owner_id): + """Sets the user_owner_id of this AllowedPermissionsInfo. + + + :param user_owner_id: The user_owner_id of this AllowedPermissionsInfo. # noqa: E501 + :type: EntityId + """ + + self._user_owner_id = user_owner_id + + @property + def user_permissions(self): + """Gets the user_permissions of this AllowedPermissionsInfo. # noqa: E501 + + + :return: The user_permissions of this AllowedPermissionsInfo. # noqa: E501 + :rtype: MergedUserPermissions + """ + return self._user_permissions + + @user_permissions.setter + def user_permissions(self, user_permissions): + """Sets the user_permissions of this AllowedPermissionsInfo. + + + :param user_permissions: The user_permissions of this AllowedPermissionsInfo. # noqa: E501 + :type: MergedUserPermissions + """ + + self._user_permissions = user_permissions + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AllowedPermissionsInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AllowedPermissionsInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/asset.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/asset.py new file mode 100644 index 0000000..3874c0d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/asset.py @@ -0,0 +1,318 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Asset(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'id': 'AssetId', + 'label': 'str', + 'name': 'str', + 'owner_id': 'EntityId', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'id': 'id', + 'label': 'label', + 'name': 'name', + 'owner_id': 'ownerId', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, created_time=None, customer_id=None, id=None, label=None, name=None, owner_id=None, tenant_id=None, type=None): # noqa: E501 + """Asset - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._customer_id = None + self._id = None + self._label = None + self._name = None + self._owner_id = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if id is not None: + self.id = id + if label is not None: + self.label = label + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this Asset. # noqa: E501 + + + :return: The additional_info of this Asset. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Asset. + + + :param additional_info: The additional_info of this Asset. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this Asset. # noqa: E501 + + + :return: The created_time of this Asset. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Asset. + + + :param created_time: The created_time of this Asset. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this Asset. # noqa: E501 + + + :return: The customer_id of this Asset. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this Asset. + + + :param customer_id: The customer_id of this Asset. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def id(self): + """Gets the id of this Asset. # noqa: E501 + + + :return: The id of this Asset. # noqa: E501 + :rtype: AssetId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Asset. + + + :param id: The id of this Asset. # noqa: E501 + :type: AssetId + """ + + self._id = id + + @property + def label(self): + """Gets the label of this Asset. # noqa: E501 + + + :return: The label of this Asset. # noqa: E501 + :rtype: str + """ + return self._label + + @label.setter + def label(self, label): + """Sets the label of this Asset. + + + :param label: The label of this Asset. # noqa: E501 + :type: str + """ + + self._label = label + + @property + def name(self): + """Gets the name of this Asset. # noqa: E501 + + + :return: The name of this Asset. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Asset. + + + :param name: The name of this Asset. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this Asset. # noqa: E501 + + + :return: The owner_id of this Asset. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this Asset. + + + :param owner_id: The owner_id of this Asset. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def tenant_id(self): + """Gets the tenant_id of this Asset. # noqa: E501 + + + :return: The tenant_id of this Asset. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Asset. + + + :param tenant_id: The tenant_id of this Asset. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this Asset. # noqa: E501 + + + :return: The type of this Asset. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Asset. + + + :param type: The type of this Asset. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Asset, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Asset): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/asset_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/asset_id.py new file mode 100644 index 0000000..04a3a50 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/asset_id.py @@ -0,0 +1,105 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +from .entity_id import EntityId + + +class AssetId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """AssetId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this AssetId. # noqa: E501 + + + :return: The id of this AssetId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this AssetId. + + + :param id: The id of this AssetId. # noqa: E501 + :type: str + """ + if id is None: + raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AssetId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AssetId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/audit_log.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/audit_log.py new file mode 100644 index 0000000..efa2682 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/audit_log.py @@ -0,0 +1,408 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class AuditLog(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action_data': 'str', + 'action_failure_details': 'str', + 'action_status': 'str', + 'action_type': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'entity_id': 'EntityId', + 'entity_name': 'str', + 'id': 'AuditLogId', + 'tenant_id': 'TenantId', + 'user_id': 'UserId', + 'user_name': 'str' + } + + attribute_map = { + 'action_data': 'actionData', + 'action_failure_details': 'actionFailureDetails', + 'action_status': 'actionStatus', + 'action_type': 'actionType', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'entity_id': 'entityId', + 'entity_name': 'entityName', + 'id': 'id', + 'tenant_id': 'tenantId', + 'user_id': 'userId', + 'user_name': 'userName' + } + + def __init__(self, action_data=None, action_failure_details=None, action_status=None, action_type=None, created_time=None, customer_id=None, entity_id=None, entity_name=None, id=None, tenant_id=None, user_id=None, user_name=None): # noqa: E501 + """AuditLog - a model defined in Swagger""" # noqa: E501 + self._action_data = None + self._action_failure_details = None + self._action_status = None + self._action_type = None + self._created_time = None + self._customer_id = None + self._entity_id = None + self._entity_name = None + self._id = None + self._tenant_id = None + self._user_id = None + self._user_name = None + self.discriminator = None + if action_data is not None: + self.action_data = action_data + if action_failure_details is not None: + self.action_failure_details = action_failure_details + if action_status is not None: + self.action_status = action_status + if action_type is not None: + self.action_type = action_type + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if entity_id is not None: + self.entity_id = entity_id + if entity_name is not None: + self.entity_name = entity_name + if id is not None: + self.id = id + if tenant_id is not None: + self.tenant_id = tenant_id + if user_id is not None: + self.user_id = user_id + if user_name is not None: + self.user_name = user_name + + @property + def action_data(self): + """Gets the action_data of this AuditLog. # noqa: E501 + + + :return: The action_data of this AuditLog. # noqa: E501 + :rtype: str + """ + return self._action_data + + @action_data.setter + def action_data(self, action_data): + """Sets the action_data of this AuditLog. + + + :param action_data: The action_data of this AuditLog. # noqa: E501 + :type: str + """ + + self._action_data = action_data + + @property + def action_failure_details(self): + """Gets the action_failure_details of this AuditLog. # noqa: E501 + + + :return: The action_failure_details of this AuditLog. # noqa: E501 + :rtype: str + """ + return self._action_failure_details + + @action_failure_details.setter + def action_failure_details(self, action_failure_details): + """Sets the action_failure_details of this AuditLog. + + + :param action_failure_details: The action_failure_details of this AuditLog. # noqa: E501 + :type: str + """ + + self._action_failure_details = action_failure_details + + @property + def action_status(self): + """Gets the action_status of this AuditLog. # noqa: E501 + + + :return: The action_status of this AuditLog. # noqa: E501 + :rtype: str + """ + return self._action_status + + @action_status.setter + def action_status(self, action_status): + """Sets the action_status of this AuditLog. + + + :param action_status: The action_status of this AuditLog. # noqa: E501 + :type: str + """ + allowed_values = ["SUCCESS", "FAILURE"] # noqa: E501 + if action_status not in allowed_values: + raise ValueError( + "Invalid value for `action_status` ({0}), must be one of {1}" # noqa: E501 + .format(action_status, allowed_values) + ) + + self._action_status = action_status + + @property + def action_type(self): + """Gets the action_type of this AuditLog. # noqa: E501 + + + :return: The action_type of this AuditLog. # noqa: E501 + :rtype: str + """ + return self._action_type + + @action_type.setter + def action_type(self, action_type): + """Sets the action_type of this AuditLog. + + + :param action_type: The action_type of this AuditLog. # noqa: E501 + :type: str + """ + allowed_values = ["ADDED", "DELETED", "UPDATED", "ATTRIBUTES_UPDATED", "ATTRIBUTES_DELETED", "TIMESERIES_UPDATED", "TIMESERIES_DELETED", "RPC_CALL", "CREDENTIALS_UPDATED", "ASSIGNED_TO_CUSTOMER", "UNASSIGNED_FROM_CUSTOMER", "CHANGE_OWNER", "ACTIVATED", "SUSPENDED", "CREDENTIALS_READ", "ATTRIBUTES_READ", "RELATION_ADD_OR_UPDATE", "RELATION_DELETED", "RELATIONS_DELETED", "ALARM_ACK", "ALARM_CLEAR", "ALARM_DELETE", "ADDED_TO_ENTITY_GROUP", "REMOVED_FROM_ENTITY_GROUP", "REST_API_RULE_ENGINE_CALL", "MADE_PUBLIC", "MADE_PRIVATE", "LOGIN", "LOGOUT", "LOCKOUT", "ASSIGNED_FROM_TENANT", "ASSIGNED_TO_TENANT", "PROVISION_SUCCESS", "PROVISION_FAILURE", "ASSIGNED_TO_EDGE", "UNASSIGNED_FROM_EDGE"] # noqa: E501 + if action_type not in allowed_values: + raise ValueError( + "Invalid value for `action_type` ({0}), must be one of {1}" # noqa: E501 + .format(action_type, allowed_values) + ) + + self._action_type = action_type + + @property + def created_time(self): + """Gets the created_time of this AuditLog. # noqa: E501 + + + :return: The created_time of this AuditLog. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this AuditLog. + + + :param created_time: The created_time of this AuditLog. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this AuditLog. # noqa: E501 + + + :return: The customer_id of this AuditLog. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this AuditLog. + + + :param customer_id: The customer_id of this AuditLog. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def entity_id(self): + """Gets the entity_id of this AuditLog. # noqa: E501 + + + :return: The entity_id of this AuditLog. # noqa: E501 + :rtype: EntityId + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this AuditLog. + + + :param entity_id: The entity_id of this AuditLog. # noqa: E501 + :type: EntityId + """ + + self._entity_id = entity_id + + @property + def entity_name(self): + """Gets the entity_name of this AuditLog. # noqa: E501 + + + :return: The entity_name of this AuditLog. # noqa: E501 + :rtype: str + """ + return self._entity_name + + @entity_name.setter + def entity_name(self, entity_name): + """Sets the entity_name of this AuditLog. + + + :param entity_name: The entity_name of this AuditLog. # noqa: E501 + :type: str + """ + + self._entity_name = entity_name + + @property + def id(self): + """Gets the id of this AuditLog. # noqa: E501 + + + :return: The id of this AuditLog. # noqa: E501 + :rtype: AuditLogId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this AuditLog. + + + :param id: The id of this AuditLog. # noqa: E501 + :type: AuditLogId + """ + + self._id = id + + @property + def tenant_id(self): + """Gets the tenant_id of this AuditLog. # noqa: E501 + + + :return: The tenant_id of this AuditLog. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this AuditLog. + + + :param tenant_id: The tenant_id of this AuditLog. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def user_id(self): + """Gets the user_id of this AuditLog. # noqa: E501 + + + :return: The user_id of this AuditLog. # noqa: E501 + :rtype: UserId + """ + return self._user_id + + @user_id.setter + def user_id(self, user_id): + """Sets the user_id of this AuditLog. + + + :param user_id: The user_id of this AuditLog. # noqa: E501 + :type: UserId + """ + + self._user_id = user_id + + @property + def user_name(self): + """Gets the user_name of this AuditLog. # noqa: E501 + + + :return: The user_name of this AuditLog. # noqa: E501 + :rtype: str + """ + return self._user_name + + @user_name.setter + def user_name(self, user_name): + """Sets the user_name of this AuditLog. + + + :param user_name: The user_name of this AuditLog. # noqa: E501 + :type: str + """ + + self._user_name = user_name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(AuditLog, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, AuditLog): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/blob_entity_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/blob_entity_id.py new file mode 100644 index 0000000..7a65d14 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/blob_entity_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class BlobEntityId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """BlobEntityId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this BlobEntityId. # noqa: E501 + + + :return: The id of this BlobEntityId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this BlobEntityId. + + + :param id: The id of this BlobEntityId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(BlobEntityId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, BlobEntityId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/blob_entity_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/blob_entity_info.py new file mode 100644 index 0000000..cfedf1d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/blob_entity_info.py @@ -0,0 +1,318 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class BlobEntityInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'content_type': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'id': 'BlobEntityId', + 'name': 'str', + 'owner_id': 'EntityId', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'content_type': 'contentType', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'id': 'id', + 'name': 'name', + 'owner_id': 'ownerId', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, content_type=None, created_time=None, customer_id=None, id=None, name=None, owner_id=None, tenant_id=None, type=None): # noqa: E501 + """BlobEntityInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._content_type = None + self._created_time = None + self._customer_id = None + self._id = None + self._name = None + self._owner_id = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if content_type is not None: + self.content_type = content_type + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if id is not None: + self.id = id + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this BlobEntityInfo. # noqa: E501 + + + :return: The additional_info of this BlobEntityInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this BlobEntityInfo. + + + :param additional_info: The additional_info of this BlobEntityInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def content_type(self): + """Gets the content_type of this BlobEntityInfo. # noqa: E501 + + + :return: The content_type of this BlobEntityInfo. # noqa: E501 + :rtype: str + """ + return self._content_type + + @content_type.setter + def content_type(self, content_type): + """Sets the content_type of this BlobEntityInfo. + + + :param content_type: The content_type of this BlobEntityInfo. # noqa: E501 + :type: str + """ + + self._content_type = content_type + + @property + def created_time(self): + """Gets the created_time of this BlobEntityInfo. # noqa: E501 + + + :return: The created_time of this BlobEntityInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this BlobEntityInfo. + + + :param created_time: The created_time of this BlobEntityInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this BlobEntityInfo. # noqa: E501 + + + :return: The customer_id of this BlobEntityInfo. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this BlobEntityInfo. + + + :param customer_id: The customer_id of this BlobEntityInfo. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def id(self): + """Gets the id of this BlobEntityInfo. # noqa: E501 + + + :return: The id of this BlobEntityInfo. # noqa: E501 + :rtype: BlobEntityId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this BlobEntityInfo. + + + :param id: The id of this BlobEntityInfo. # noqa: E501 + :type: BlobEntityId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this BlobEntityInfo. # noqa: E501 + + + :return: The name of this BlobEntityInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this BlobEntityInfo. + + + :param name: The name of this BlobEntityInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this BlobEntityInfo. # noqa: E501 + + + :return: The owner_id of this BlobEntityInfo. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this BlobEntityInfo. + + + :param owner_id: The owner_id of this BlobEntityInfo. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def tenant_id(self): + """Gets the tenant_id of this BlobEntityInfo. # noqa: E501 + + + :return: The tenant_id of this BlobEntityInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this BlobEntityInfo. + + + :param tenant_id: The tenant_id of this BlobEntityInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this BlobEntityInfo. # noqa: E501 + + + :return: The type of this BlobEntityInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this BlobEntityInfo. + + + :param type: The type of this BlobEntityInfo. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(BlobEntityInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, BlobEntityInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/blob_entity_with_customer_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/blob_entity_with_customer_info.py new file mode 100644 index 0000000..1234f38 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/blob_entity_with_customer_info.py @@ -0,0 +1,370 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class BlobEntityWithCustomerInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'content_type': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'customer_is_public': 'bool', + 'customer_title': 'str', + 'id': 'BlobEntityId', + 'name': 'str', + 'owner_id': 'EntityId', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'content_type': 'contentType', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'customer_is_public': 'customerIsPublic', + 'customer_title': 'customerTitle', + 'id': 'id', + 'name': 'name', + 'owner_id': 'ownerId', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, content_type=None, created_time=None, customer_id=None, customer_is_public=None, customer_title=None, id=None, name=None, owner_id=None, tenant_id=None, type=None): # noqa: E501 + """BlobEntityWithCustomerInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._content_type = None + self._created_time = None + self._customer_id = None + self._customer_is_public = None + self._customer_title = None + self._id = None + self._name = None + self._owner_id = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if content_type is not None: + self.content_type = content_type + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if customer_is_public is not None: + self.customer_is_public = customer_is_public + if customer_title is not None: + self.customer_title = customer_title + if id is not None: + self.id = id + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this BlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The additional_info of this BlobEntityWithCustomerInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this BlobEntityWithCustomerInfo. + + + :param additional_info: The additional_info of this BlobEntityWithCustomerInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def content_type(self): + """Gets the content_type of this BlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The content_type of this BlobEntityWithCustomerInfo. # noqa: E501 + :rtype: str + """ + return self._content_type + + @content_type.setter + def content_type(self, content_type): + """Sets the content_type of this BlobEntityWithCustomerInfo. + + + :param content_type: The content_type of this BlobEntityWithCustomerInfo. # noqa: E501 + :type: str + """ + + self._content_type = content_type + + @property + def created_time(self): + """Gets the created_time of this BlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The created_time of this BlobEntityWithCustomerInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this BlobEntityWithCustomerInfo. + + + :param created_time: The created_time of this BlobEntityWithCustomerInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this BlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The customer_id of this BlobEntityWithCustomerInfo. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this BlobEntityWithCustomerInfo. + + + :param customer_id: The customer_id of this BlobEntityWithCustomerInfo. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def customer_is_public(self): + """Gets the customer_is_public of this BlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The customer_is_public of this BlobEntityWithCustomerInfo. # noqa: E501 + :rtype: bool + """ + return self._customer_is_public + + @customer_is_public.setter + def customer_is_public(self, customer_is_public): + """Sets the customer_is_public of this BlobEntityWithCustomerInfo. + + + :param customer_is_public: The customer_is_public of this BlobEntityWithCustomerInfo. # noqa: E501 + :type: bool + """ + + self._customer_is_public = customer_is_public + + @property + def customer_title(self): + """Gets the customer_title of this BlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The customer_title of this BlobEntityWithCustomerInfo. # noqa: E501 + :rtype: str + """ + return self._customer_title + + @customer_title.setter + def customer_title(self, customer_title): + """Sets the customer_title of this BlobEntityWithCustomerInfo. + + + :param customer_title: The customer_title of this BlobEntityWithCustomerInfo. # noqa: E501 + :type: str + """ + + self._customer_title = customer_title + + @property + def id(self): + """Gets the id of this BlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The id of this BlobEntityWithCustomerInfo. # noqa: E501 + :rtype: BlobEntityId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this BlobEntityWithCustomerInfo. + + + :param id: The id of this BlobEntityWithCustomerInfo. # noqa: E501 + :type: BlobEntityId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this BlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The name of this BlobEntityWithCustomerInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this BlobEntityWithCustomerInfo. + + + :param name: The name of this BlobEntityWithCustomerInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this BlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The owner_id of this BlobEntityWithCustomerInfo. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this BlobEntityWithCustomerInfo. + + + :param owner_id: The owner_id of this BlobEntityWithCustomerInfo. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def tenant_id(self): + """Gets the tenant_id of this BlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The tenant_id of this BlobEntityWithCustomerInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this BlobEntityWithCustomerInfo. + + + :param tenant_id: The tenant_id of this BlobEntityWithCustomerInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this BlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The type of this BlobEntityWithCustomerInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this BlobEntityWithCustomerInfo. + + + :param type: The type of this BlobEntityWithCustomerInfo. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(BlobEntityWithCustomerInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, BlobEntityWithCustomerInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/client_registration_dto.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/client_registration_dto.py new file mode 100644 index 0000000..42ccef8 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/client_registration_dto.py @@ -0,0 +1,422 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ClientRegistrationDto(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'access_token_uri': 'str', + 'additional_info': 'str', + 'authorization_uri': 'str', + 'client_authentication_method': 'str', + 'client_id': 'str', + 'client_secret': 'str', + 'jwk_set_uri': 'str', + 'login_button_icon': 'str', + 'login_button_label': 'str', + 'mapper_config': 'OAuth2MapperConfig', + 'scope': 'list[str]', + 'user_info_uri': 'str', + 'user_name_attribute_name': 'str' + } + + attribute_map = { + 'access_token_uri': 'accessTokenUri', + 'additional_info': 'additionalInfo', + 'authorization_uri': 'authorizationUri', + 'client_authentication_method': 'clientAuthenticationMethod', + 'client_id': 'clientId', + 'client_secret': 'clientSecret', + 'jwk_set_uri': 'jwkSetUri', + 'login_button_icon': 'loginButtonIcon', + 'login_button_label': 'loginButtonLabel', + 'mapper_config': 'mapperConfig', + 'scope': 'scope', + 'user_info_uri': 'userInfoUri', + 'user_name_attribute_name': 'userNameAttributeName' + } + + def __init__(self, access_token_uri=None, additional_info=None, authorization_uri=None, client_authentication_method=None, client_id=None, client_secret=None, jwk_set_uri=None, login_button_icon=None, login_button_label=None, mapper_config=None, scope=None, user_info_uri=None, user_name_attribute_name=None): # noqa: E501 + """ClientRegistrationDto - a model defined in Swagger""" # noqa: E501 + self._access_token_uri = None + self._additional_info = None + self._authorization_uri = None + self._client_authentication_method = None + self._client_id = None + self._client_secret = None + self._jwk_set_uri = None + self._login_button_icon = None + self._login_button_label = None + self._mapper_config = None + self._scope = None + self._user_info_uri = None + self._user_name_attribute_name = None + self.discriminator = None + if access_token_uri is not None: + self.access_token_uri = access_token_uri + if additional_info is not None: + self.additional_info = additional_info + if authorization_uri is not None: + self.authorization_uri = authorization_uri + if client_authentication_method is not None: + self.client_authentication_method = client_authentication_method + if client_id is not None: + self.client_id = client_id + if client_secret is not None: + self.client_secret = client_secret + if jwk_set_uri is not None: + self.jwk_set_uri = jwk_set_uri + if login_button_icon is not None: + self.login_button_icon = login_button_icon + if login_button_label is not None: + self.login_button_label = login_button_label + if mapper_config is not None: + self.mapper_config = mapper_config + if scope is not None: + self.scope = scope + if user_info_uri is not None: + self.user_info_uri = user_info_uri + if user_name_attribute_name is not None: + self.user_name_attribute_name = user_name_attribute_name + + @property + def access_token_uri(self): + """Gets the access_token_uri of this ClientRegistrationDto. # noqa: E501 + + + :return: The access_token_uri of this ClientRegistrationDto. # noqa: E501 + :rtype: str + """ + return self._access_token_uri + + @access_token_uri.setter + def access_token_uri(self, access_token_uri): + """Sets the access_token_uri of this ClientRegistrationDto. + + + :param access_token_uri: The access_token_uri of this ClientRegistrationDto. # noqa: E501 + :type: str + """ + + self._access_token_uri = access_token_uri + + @property + def additional_info(self): + """Gets the additional_info of this ClientRegistrationDto. # noqa: E501 + + + :return: The additional_info of this ClientRegistrationDto. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this ClientRegistrationDto. + + + :param additional_info: The additional_info of this ClientRegistrationDto. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def authorization_uri(self): + """Gets the authorization_uri of this ClientRegistrationDto. # noqa: E501 + + + :return: The authorization_uri of this ClientRegistrationDto. # noqa: E501 + :rtype: str + """ + return self._authorization_uri + + @authorization_uri.setter + def authorization_uri(self, authorization_uri): + """Sets the authorization_uri of this ClientRegistrationDto. + + + :param authorization_uri: The authorization_uri of this ClientRegistrationDto. # noqa: E501 + :type: str + """ + + self._authorization_uri = authorization_uri + + @property + def client_authentication_method(self): + """Gets the client_authentication_method of this ClientRegistrationDto. # noqa: E501 + + + :return: The client_authentication_method of this ClientRegistrationDto. # noqa: E501 + :rtype: str + """ + return self._client_authentication_method + + @client_authentication_method.setter + def client_authentication_method(self, client_authentication_method): + """Sets the client_authentication_method of this ClientRegistrationDto. + + + :param client_authentication_method: The client_authentication_method of this ClientRegistrationDto. # noqa: E501 + :type: str + """ + + self._client_authentication_method = client_authentication_method + + @property + def client_id(self): + """Gets the client_id of this ClientRegistrationDto. # noqa: E501 + + + :return: The client_id of this ClientRegistrationDto. # noqa: E501 + :rtype: str + """ + return self._client_id + + @client_id.setter + def client_id(self, client_id): + """Sets the client_id of this ClientRegistrationDto. + + + :param client_id: The client_id of this ClientRegistrationDto. # noqa: E501 + :type: str + """ + + self._client_id = client_id + + @property + def client_secret(self): + """Gets the client_secret of this ClientRegistrationDto. # noqa: E501 + + + :return: The client_secret of this ClientRegistrationDto. # noqa: E501 + :rtype: str + """ + return self._client_secret + + @client_secret.setter + def client_secret(self, client_secret): + """Sets the client_secret of this ClientRegistrationDto. + + + :param client_secret: The client_secret of this ClientRegistrationDto. # noqa: E501 + :type: str + """ + + self._client_secret = client_secret + + @property + def jwk_set_uri(self): + """Gets the jwk_set_uri of this ClientRegistrationDto. # noqa: E501 + + + :return: The jwk_set_uri of this ClientRegistrationDto. # noqa: E501 + :rtype: str + """ + return self._jwk_set_uri + + @jwk_set_uri.setter + def jwk_set_uri(self, jwk_set_uri): + """Sets the jwk_set_uri of this ClientRegistrationDto. + + + :param jwk_set_uri: The jwk_set_uri of this ClientRegistrationDto. # noqa: E501 + :type: str + """ + + self._jwk_set_uri = jwk_set_uri + + @property + def login_button_icon(self): + """Gets the login_button_icon of this ClientRegistrationDto. # noqa: E501 + + + :return: The login_button_icon of this ClientRegistrationDto. # noqa: E501 + :rtype: str + """ + return self._login_button_icon + + @login_button_icon.setter + def login_button_icon(self, login_button_icon): + """Sets the login_button_icon of this ClientRegistrationDto. + + + :param login_button_icon: The login_button_icon of this ClientRegistrationDto. # noqa: E501 + :type: str + """ + + self._login_button_icon = login_button_icon + + @property + def login_button_label(self): + """Gets the login_button_label of this ClientRegistrationDto. # noqa: E501 + + + :return: The login_button_label of this ClientRegistrationDto. # noqa: E501 + :rtype: str + """ + return self._login_button_label + + @login_button_label.setter + def login_button_label(self, login_button_label): + """Sets the login_button_label of this ClientRegistrationDto. + + + :param login_button_label: The login_button_label of this ClientRegistrationDto. # noqa: E501 + :type: str + """ + + self._login_button_label = login_button_label + + @property + def mapper_config(self): + """Gets the mapper_config of this ClientRegistrationDto. # noqa: E501 + + + :return: The mapper_config of this ClientRegistrationDto. # noqa: E501 + :rtype: OAuth2MapperConfig + """ + return self._mapper_config + + @mapper_config.setter + def mapper_config(self, mapper_config): + """Sets the mapper_config of this ClientRegistrationDto. + + + :param mapper_config: The mapper_config of this ClientRegistrationDto. # noqa: E501 + :type: OAuth2MapperConfig + """ + + self._mapper_config = mapper_config + + @property + def scope(self): + """Gets the scope of this ClientRegistrationDto. # noqa: E501 + + + :return: The scope of this ClientRegistrationDto. # noqa: E501 + :rtype: list[str] + """ + return self._scope + + @scope.setter + def scope(self, scope): + """Sets the scope of this ClientRegistrationDto. + + + :param scope: The scope of this ClientRegistrationDto. # noqa: E501 + :type: list[str] + """ + + self._scope = scope + + @property + def user_info_uri(self): + """Gets the user_info_uri of this ClientRegistrationDto. # noqa: E501 + + + :return: The user_info_uri of this ClientRegistrationDto. # noqa: E501 + :rtype: str + """ + return self._user_info_uri + + @user_info_uri.setter + def user_info_uri(self, user_info_uri): + """Sets the user_info_uri of this ClientRegistrationDto. + + + :param user_info_uri: The user_info_uri of this ClientRegistrationDto. # noqa: E501 + :type: str + """ + + self._user_info_uri = user_info_uri + + @property + def user_name_attribute_name(self): + """Gets the user_name_attribute_name of this ClientRegistrationDto. # noqa: E501 + + + :return: The user_name_attribute_name of this ClientRegistrationDto. # noqa: E501 + :rtype: str + """ + return self._user_name_attribute_name + + @user_name_attribute_name.setter + def user_name_attribute_name(self, user_name_attribute_name): + """Sets the user_name_attribute_name of this ClientRegistrationDto. + + + :param user_name_attribute_name: The user_name_attribute_name of this ClientRegistrationDto. # noqa: E501 + :type: str + """ + + self._user_name_attribute_name = user_name_attribute_name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ClientRegistrationDto, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ClientRegistrationDto): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/component_descriptor.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/component_descriptor.py new file mode 100644 index 0000000..26926a6 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/component_descriptor.py @@ -0,0 +1,304 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ComponentDescriptor(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'actions': 'str', + 'clazz': 'str', + 'configuration_descriptor': 'str', + 'created_time': 'int', + 'id': 'ComponentDescriptorId', + 'name': 'str', + 'scope': 'str', + 'type': 'str' + } + + attribute_map = { + 'actions': 'actions', + 'clazz': 'clazz', + 'configuration_descriptor': 'configurationDescriptor', + 'created_time': 'createdTime', + 'id': 'id', + 'name': 'name', + 'scope': 'scope', + 'type': 'type' + } + + def __init__(self, actions=None, clazz=None, configuration_descriptor=None, created_time=None, id=None, name=None, scope=None, type=None): # noqa: E501 + """ComponentDescriptor - a model defined in Swagger""" # noqa: E501 + self._actions = None + self._clazz = None + self._configuration_descriptor = None + self._created_time = None + self._id = None + self._name = None + self._scope = None + self._type = None + self.discriminator = None + if actions is not None: + self.actions = actions + if clazz is not None: + self.clazz = clazz + if configuration_descriptor is not None: + self.configuration_descriptor = configuration_descriptor + if created_time is not None: + self.created_time = created_time + if id is not None: + self.id = id + if name is not None: + self.name = name + if scope is not None: + self.scope = scope + if type is not None: + self.type = type + + @property + def actions(self): + """Gets the actions of this ComponentDescriptor. # noqa: E501 + + + :return: The actions of this ComponentDescriptor. # noqa: E501 + :rtype: str + """ + return self._actions + + @actions.setter + def actions(self, actions): + """Sets the actions of this ComponentDescriptor. + + + :param actions: The actions of this ComponentDescriptor. # noqa: E501 + :type: str + """ + + self._actions = actions + + @property + def clazz(self): + """Gets the clazz of this ComponentDescriptor. # noqa: E501 + + + :return: The clazz of this ComponentDescriptor. # noqa: E501 + :rtype: str + """ + return self._clazz + + @clazz.setter + def clazz(self, clazz): + """Sets the clazz of this ComponentDescriptor. + + + :param clazz: The clazz of this ComponentDescriptor. # noqa: E501 + :type: str + """ + + self._clazz = clazz + + @property + def configuration_descriptor(self): + """Gets the configuration_descriptor of this ComponentDescriptor. # noqa: E501 + + + :return: The configuration_descriptor of this ComponentDescriptor. # noqa: E501 + :rtype: str + """ + return self._configuration_descriptor + + @configuration_descriptor.setter + def configuration_descriptor(self, configuration_descriptor): + """Sets the configuration_descriptor of this ComponentDescriptor. + + + :param configuration_descriptor: The configuration_descriptor of this ComponentDescriptor. # noqa: E501 + :type: str + """ + + self._configuration_descriptor = configuration_descriptor + + @property + def created_time(self): + """Gets the created_time of this ComponentDescriptor. # noqa: E501 + + + :return: The created_time of this ComponentDescriptor. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this ComponentDescriptor. + + + :param created_time: The created_time of this ComponentDescriptor. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def id(self): + """Gets the id of this ComponentDescriptor. # noqa: E501 + + + :return: The id of this ComponentDescriptor. # noqa: E501 + :rtype: ComponentDescriptorId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this ComponentDescriptor. + + + :param id: The id of this ComponentDescriptor. # noqa: E501 + :type: ComponentDescriptorId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this ComponentDescriptor. # noqa: E501 + + + :return: The name of this ComponentDescriptor. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this ComponentDescriptor. + + + :param name: The name of this ComponentDescriptor. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def scope(self): + """Gets the scope of this ComponentDescriptor. # noqa: E501 + + + :return: The scope of this ComponentDescriptor. # noqa: E501 + :rtype: str + """ + return self._scope + + @scope.setter + def scope(self, scope): + """Sets the scope of this ComponentDescriptor. + + + :param scope: The scope of this ComponentDescriptor. # noqa: E501 + :type: str + """ + allowed_values = ["SYSTEM", "TENANT"] # noqa: E501 + if scope not in allowed_values: + raise ValueError( + "Invalid value for `scope` ({0}), must be one of {1}" # noqa: E501 + .format(scope, allowed_values) + ) + + self._scope = scope + + @property + def type(self): + """Gets the type of this ComponentDescriptor. # noqa: E501 + + + :return: The type of this ComponentDescriptor. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this ComponentDescriptor. + + + :param type: The type of this ComponentDescriptor. # noqa: E501 + :type: str + """ + allowed_values = ["ENRICHMENT", "FILTER", "TRANSFORMATION", "ACTION", "ANALYTICS", "EXTERNAL"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ComponentDescriptor, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ComponentDescriptor): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/contact_basedobject.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/contact_basedobject.py new file mode 100644 index 0000000..b736c4d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/contact_basedobject.py @@ -0,0 +1,396 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ContactBasedobject(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'address': 'str', + 'address2': 'str', + 'city': 'str', + 'country': 'str', + 'created_time': 'int', + 'email': 'str', + 'id': 'object', + 'name': 'str', + 'phone': 'str', + 'state': 'str', + 'zip': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'address': 'address', + 'address2': 'address2', + 'city': 'city', + 'country': 'country', + 'created_time': 'createdTime', + 'email': 'email', + 'id': 'id', + 'name': 'name', + 'phone': 'phone', + 'state': 'state', + 'zip': 'zip' + } + + def __init__(self, additional_info=None, address=None, address2=None, city=None, country=None, created_time=None, email=None, id=None, name=None, phone=None, state=None, zip=None): # noqa: E501 + """ContactBasedobject - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._address = None + self._address2 = None + self._city = None + self._country = None + self._created_time = None + self._email = None + self._id = None + self._name = None + self._phone = None + self._state = None + self._zip = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if address is not None: + self.address = address + if address2 is not None: + self.address2 = address2 + if city is not None: + self.city = city + if country is not None: + self.country = country + if created_time is not None: + self.created_time = created_time + if email is not None: + self.email = email + if id is not None: + self.id = id + if name is not None: + self.name = name + if phone is not None: + self.phone = phone + if state is not None: + self.state = state + if zip is not None: + self.zip = zip + + @property + def additional_info(self): + """Gets the additional_info of this ContactBasedobject. # noqa: E501 + + + :return: The additional_info of this ContactBasedobject. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this ContactBasedobject. + + + :param additional_info: The additional_info of this ContactBasedobject. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def address(self): + """Gets the address of this ContactBasedobject. # noqa: E501 + + + :return: The address of this ContactBasedobject. # noqa: E501 + :rtype: str + """ + return self._address + + @address.setter + def address(self, address): + """Sets the address of this ContactBasedobject. + + + :param address: The address of this ContactBasedobject. # noqa: E501 + :type: str + """ + + self._address = address + + @property + def address2(self): + """Gets the address2 of this ContactBasedobject. # noqa: E501 + + + :return: The address2 of this ContactBasedobject. # noqa: E501 + :rtype: str + """ + return self._address2 + + @address2.setter + def address2(self, address2): + """Sets the address2 of this ContactBasedobject. + + + :param address2: The address2 of this ContactBasedobject. # noqa: E501 + :type: str + """ + + self._address2 = address2 + + @property + def city(self): + """Gets the city of this ContactBasedobject. # noqa: E501 + + + :return: The city of this ContactBasedobject. # noqa: E501 + :rtype: str + """ + return self._city + + @city.setter + def city(self, city): + """Sets the city of this ContactBasedobject. + + + :param city: The city of this ContactBasedobject. # noqa: E501 + :type: str + """ + + self._city = city + + @property + def country(self): + """Gets the country of this ContactBasedobject. # noqa: E501 + + + :return: The country of this ContactBasedobject. # noqa: E501 + :rtype: str + """ + return self._country + + @country.setter + def country(self, country): + """Sets the country of this ContactBasedobject. + + + :param country: The country of this ContactBasedobject. # noqa: E501 + :type: str + """ + + self._country = country + + @property + def created_time(self): + """Gets the created_time of this ContactBasedobject. # noqa: E501 + + + :return: The created_time of this ContactBasedobject. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this ContactBasedobject. + + + :param created_time: The created_time of this ContactBasedobject. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def email(self): + """Gets the email of this ContactBasedobject. # noqa: E501 + + + :return: The email of this ContactBasedobject. # noqa: E501 + :rtype: str + """ + return self._email + + @email.setter + def email(self, email): + """Sets the email of this ContactBasedobject. + + + :param email: The email of this ContactBasedobject. # noqa: E501 + :type: str + """ + + self._email = email + + @property + def id(self): + """Gets the id of this ContactBasedobject. # noqa: E501 + + + :return: The id of this ContactBasedobject. # noqa: E501 + :rtype: object + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this ContactBasedobject. + + + :param id: The id of this ContactBasedobject. # noqa: E501 + :type: object + """ + + self._id = id + + @property + def name(self): + """Gets the name of this ContactBasedobject. # noqa: E501 + + + :return: The name of this ContactBasedobject. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this ContactBasedobject. + + + :param name: The name of this ContactBasedobject. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def phone(self): + """Gets the phone of this ContactBasedobject. # noqa: E501 + + + :return: The phone of this ContactBasedobject. # noqa: E501 + :rtype: str + """ + return self._phone + + @phone.setter + def phone(self, phone): + """Sets the phone of this ContactBasedobject. + + + :param phone: The phone of this ContactBasedobject. # noqa: E501 + :type: str + """ + + self._phone = phone + + @property + def state(self): + """Gets the state of this ContactBasedobject. # noqa: E501 + + + :return: The state of this ContactBasedobject. # noqa: E501 + :rtype: str + """ + return self._state + + @state.setter + def state(self, state): + """Sets the state of this ContactBasedobject. + + + :param state: The state of this ContactBasedobject. # noqa: E501 + :type: str + """ + + self._state = state + + @property + def zip(self): + """Gets the zip of this ContactBasedobject. # noqa: E501 + + + :return: The zip of this ContactBasedobject. # noqa: E501 + :rtype: str + """ + return self._zip + + @zip.setter + def zip(self, zip): + """Sets the zip of this ContactBasedobject. + + + :param zip: The zip of this ContactBasedobject. # noqa: E501 + :type: str + """ + + self._zip = zip + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ContactBasedobject, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ContactBasedobject): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/converter.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/converter.py new file mode 100644 index 0000000..6b83f6c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/converter.py @@ -0,0 +1,298 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Converter(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'configuration': 'str', + 'created_time': 'int', + 'debug_mode': 'bool', + 'id': 'ConverterId', + 'name': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'configuration': 'configuration', + 'created_time': 'createdTime', + 'debug_mode': 'debugMode', + 'id': 'id', + 'name': 'name', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, configuration=None, created_time=None, debug_mode=None, id=None, name=None, tenant_id=None, type=None): # noqa: E501 + """Converter - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._configuration = None + self._created_time = None + self._debug_mode = None + self._id = None + self._name = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if configuration is not None: + self.configuration = configuration + if created_time is not None: + self.created_time = created_time + if debug_mode is not None: + self.debug_mode = debug_mode + if id is not None: + self.id = id + if name is not None: + self.name = name + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this Converter. # noqa: E501 + + + :return: The additional_info of this Converter. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Converter. + + + :param additional_info: The additional_info of this Converter. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def configuration(self): + """Gets the configuration of this Converter. # noqa: E501 + + + :return: The configuration of this Converter. # noqa: E501 + :rtype: str + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this Converter. + + + :param configuration: The configuration of this Converter. # noqa: E501 + :type: str + """ + + self._configuration = configuration + + @property + def created_time(self): + """Gets the created_time of this Converter. # noqa: E501 + + + :return: The created_time of this Converter. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Converter. + + + :param created_time: The created_time of this Converter. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def debug_mode(self): + """Gets the debug_mode of this Converter. # noqa: E501 + + + :return: The debug_mode of this Converter. # noqa: E501 + :rtype: bool + """ + return self._debug_mode + + @debug_mode.setter + def debug_mode(self, debug_mode): + """Sets the debug_mode of this Converter. + + + :param debug_mode: The debug_mode of this Converter. # noqa: E501 + :type: bool + """ + + self._debug_mode = debug_mode + + @property + def id(self): + """Gets the id of this Converter. # noqa: E501 + + + :return: The id of this Converter. # noqa: E501 + :rtype: ConverterId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Converter. + + + :param id: The id of this Converter. # noqa: E501 + :type: ConverterId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this Converter. # noqa: E501 + + + :return: The name of this Converter. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Converter. + + + :param name: The name of this Converter. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def tenant_id(self): + """Gets the tenant_id of this Converter. # noqa: E501 + + + :return: The tenant_id of this Converter. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Converter. + + + :param tenant_id: The tenant_id of this Converter. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this Converter. # noqa: E501 + + + :return: The type of this Converter. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Converter. + + + :param type: The type of this Converter. # noqa: E501 + :type: str + """ + allowed_values = ["UPLINK", "DOWNLINK"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Converter, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Converter): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/converter_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/converter_id.py new file mode 100644 index 0000000..7ce7637 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/converter_id.py @@ -0,0 +1,105 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +from .entity_id import EntityId + + +class ConverterId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """ConverterId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this ConverterId. # noqa: E501 + + + :return: The id of this ConverterId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this ConverterId. + + + :param id: The id of this ConverterId. # noqa: E501 + :type: str + """ + if id is None: + raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ConverterId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ConverterId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/custom_menu.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/custom_menu.py new file mode 100644 index 0000000..77d075d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/custom_menu.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class CustomMenu(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'disabled_menu_items': 'list[str]', + 'menu_items': 'list[CustomMenuItem]' + } + + attribute_map = { + 'disabled_menu_items': 'disabledMenuItems', + 'menu_items': 'menuItems' + } + + def __init__(self, disabled_menu_items=None, menu_items=None): # noqa: E501 + """CustomMenu - a model defined in Swagger""" # noqa: E501 + self._disabled_menu_items = None + self._menu_items = None + self.discriminator = None + if disabled_menu_items is not None: + self.disabled_menu_items = disabled_menu_items + if menu_items is not None: + self.menu_items = menu_items + + @property + def disabled_menu_items(self): + """Gets the disabled_menu_items of this CustomMenu. # noqa: E501 + + + :return: The disabled_menu_items of this CustomMenu. # noqa: E501 + :rtype: list[str] + """ + return self._disabled_menu_items + + @disabled_menu_items.setter + def disabled_menu_items(self, disabled_menu_items): + """Sets the disabled_menu_items of this CustomMenu. + + + :param disabled_menu_items: The disabled_menu_items of this CustomMenu. # noqa: E501 + :type: list[str] + """ + + self._disabled_menu_items = disabled_menu_items + + @property + def menu_items(self): + """Gets the menu_items of this CustomMenu. # noqa: E501 + + + :return: The menu_items of this CustomMenu. # noqa: E501 + :rtype: list[CustomMenuItem] + """ + return self._menu_items + + @menu_items.setter + def menu_items(self, menu_items): + """Sets the menu_items of this CustomMenu. + + + :param menu_items: The menu_items of this CustomMenu. # noqa: E501 + :type: list[CustomMenuItem] + """ + + self._menu_items = menu_items + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(CustomMenu, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, CustomMenu): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/custom_menu_item.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/custom_menu_item.py new file mode 100644 index 0000000..00e8b13 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/custom_menu_item.py @@ -0,0 +1,292 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class CustomMenuItem(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'child_menu_items': 'list[CustomMenuItem]', + 'dashboard_id': 'str', + 'hide_dashboard_toolbar': 'bool', + 'icon_url': 'str', + 'iframe_url': 'str', + 'material_icon': 'str', + 'name': 'str', + 'set_access_token': 'bool' + } + + attribute_map = { + 'child_menu_items': 'childMenuItems', + 'dashboard_id': 'dashboardId', + 'hide_dashboard_toolbar': 'hideDashboardToolbar', + 'icon_url': 'iconUrl', + 'iframe_url': 'iframeUrl', + 'material_icon': 'materialIcon', + 'name': 'name', + 'set_access_token': 'setAccessToken' + } + + def __init__(self, child_menu_items=None, dashboard_id=None, hide_dashboard_toolbar=None, icon_url=None, iframe_url=None, material_icon=None, name=None, set_access_token=None): # noqa: E501 + """CustomMenuItem - a model defined in Swagger""" # noqa: E501 + self._child_menu_items = None + self._dashboard_id = None + self._hide_dashboard_toolbar = None + self._icon_url = None + self._iframe_url = None + self._material_icon = None + self._name = None + self._set_access_token = None + self.discriminator = None + if child_menu_items is not None: + self.child_menu_items = child_menu_items + if dashboard_id is not None: + self.dashboard_id = dashboard_id + if hide_dashboard_toolbar is not None: + self.hide_dashboard_toolbar = hide_dashboard_toolbar + if icon_url is not None: + self.icon_url = icon_url + if iframe_url is not None: + self.iframe_url = iframe_url + if material_icon is not None: + self.material_icon = material_icon + if name is not None: + self.name = name + if set_access_token is not None: + self.set_access_token = set_access_token + + @property + def child_menu_items(self): + """Gets the child_menu_items of this CustomMenuItem. # noqa: E501 + + + :return: The child_menu_items of this CustomMenuItem. # noqa: E501 + :rtype: list[CustomMenuItem] + """ + return self._child_menu_items + + @child_menu_items.setter + def child_menu_items(self, child_menu_items): + """Sets the child_menu_items of this CustomMenuItem. + + + :param child_menu_items: The child_menu_items of this CustomMenuItem. # noqa: E501 + :type: list[CustomMenuItem] + """ + + self._child_menu_items = child_menu_items + + @property + def dashboard_id(self): + """Gets the dashboard_id of this CustomMenuItem. # noqa: E501 + + + :return: The dashboard_id of this CustomMenuItem. # noqa: E501 + :rtype: str + """ + return self._dashboard_id + + @dashboard_id.setter + def dashboard_id(self, dashboard_id): + """Sets the dashboard_id of this CustomMenuItem. + + + :param dashboard_id: The dashboard_id of this CustomMenuItem. # noqa: E501 + :type: str + """ + + self._dashboard_id = dashboard_id + + @property + def hide_dashboard_toolbar(self): + """Gets the hide_dashboard_toolbar of this CustomMenuItem. # noqa: E501 + + + :return: The hide_dashboard_toolbar of this CustomMenuItem. # noqa: E501 + :rtype: bool + """ + return self._hide_dashboard_toolbar + + @hide_dashboard_toolbar.setter + def hide_dashboard_toolbar(self, hide_dashboard_toolbar): + """Sets the hide_dashboard_toolbar of this CustomMenuItem. + + + :param hide_dashboard_toolbar: The hide_dashboard_toolbar of this CustomMenuItem. # noqa: E501 + :type: bool + """ + + self._hide_dashboard_toolbar = hide_dashboard_toolbar + + @property + def icon_url(self): + """Gets the icon_url of this CustomMenuItem. # noqa: E501 + + + :return: The icon_url of this CustomMenuItem. # noqa: E501 + :rtype: str + """ + return self._icon_url + + @icon_url.setter + def icon_url(self, icon_url): + """Sets the icon_url of this CustomMenuItem. + + + :param icon_url: The icon_url of this CustomMenuItem. # noqa: E501 + :type: str + """ + + self._icon_url = icon_url + + @property + def iframe_url(self): + """Gets the iframe_url of this CustomMenuItem. # noqa: E501 + + + :return: The iframe_url of this CustomMenuItem. # noqa: E501 + :rtype: str + """ + return self._iframe_url + + @iframe_url.setter + def iframe_url(self, iframe_url): + """Sets the iframe_url of this CustomMenuItem. + + + :param iframe_url: The iframe_url of this CustomMenuItem. # noqa: E501 + :type: str + """ + + self._iframe_url = iframe_url + + @property + def material_icon(self): + """Gets the material_icon of this CustomMenuItem. # noqa: E501 + + + :return: The material_icon of this CustomMenuItem. # noqa: E501 + :rtype: str + """ + return self._material_icon + + @material_icon.setter + def material_icon(self, material_icon): + """Sets the material_icon of this CustomMenuItem. + + + :param material_icon: The material_icon of this CustomMenuItem. # noqa: E501 + :type: str + """ + + self._material_icon = material_icon + + @property + def name(self): + """Gets the name of this CustomMenuItem. # noqa: E501 + + + :return: The name of this CustomMenuItem. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this CustomMenuItem. + + + :param name: The name of this CustomMenuItem. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def set_access_token(self): + """Gets the set_access_token of this CustomMenuItem. # noqa: E501 + + + :return: The set_access_token of this CustomMenuItem. # noqa: E501 + :rtype: bool + """ + return self._set_access_token + + @set_access_token.setter + def set_access_token(self, set_access_token): + """Sets the set_access_token of this CustomMenuItem. + + + :param set_access_token: The set_access_token of this CustomMenuItem. # noqa: E501 + :type: bool + """ + + self._set_access_token = set_access_token + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(CustomMenuItem, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, CustomMenuItem): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/custom_translation.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/custom_translation.py new file mode 100644 index 0000000..ea01fe5 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/custom_translation.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class CustomTranslation(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'translation_map': 'dict(str, str)' + } + + attribute_map = { + 'translation_map': 'translationMap' + } + + def __init__(self, translation_map=None): # noqa: E501 + """CustomTranslation - a model defined in Swagger""" # noqa: E501 + self._translation_map = None + self.discriminator = None + if translation_map is not None: + self.translation_map = translation_map + + @property + def translation_map(self): + """Gets the translation_map of this CustomTranslation. # noqa: E501 + + + :return: The translation_map of this CustomTranslation. # noqa: E501 + :rtype: dict(str, str) + """ + return self._translation_map + + @translation_map.setter + def translation_map(self, translation_map): + """Sets the translation_map of this CustomTranslation. + + + :param translation_map: The translation_map of this CustomTranslation. # noqa: E501 + :type: dict(str, str) + """ + + self._translation_map = translation_map + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(CustomTranslation, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, CustomTranslation): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/customer.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/customer.py new file mode 100644 index 0000000..77d2484 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/customer.py @@ -0,0 +1,526 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Customer(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'address': 'str', + 'address2': 'str', + 'city': 'str', + 'country': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'email': 'str', + 'id': 'CustomerId', + 'name': 'str', + 'owner_id': 'EntityId', + 'parent_customer_id': 'CustomerId', + 'phone': 'str', + 'state': 'str', + 'tenant_id': 'TenantId', + 'title': 'str', + 'zip': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'address': 'address', + 'address2': 'address2', + 'city': 'city', + 'country': 'country', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'email': 'email', + 'id': 'id', + 'name': 'name', + 'owner_id': 'ownerId', + 'parent_customer_id': 'parentCustomerId', + 'phone': 'phone', + 'state': 'state', + 'tenant_id': 'tenantId', + 'title': 'title', + 'zip': 'zip' + } + + def __init__(self, additional_info=None, address=None, address2=None, city=None, country=None, created_time=None, customer_id=None, email=None, id=None, name=None, owner_id=None, parent_customer_id=None, phone=None, state=None, tenant_id=None, title=None, zip=None): # noqa: E501 + """Customer - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._address = None + self._address2 = None + self._city = None + self._country = None + self._created_time = None + self._customer_id = None + self._email = None + self._id = None + self._name = None + self._owner_id = None + self._parent_customer_id = None + self._phone = None + self._state = None + self._tenant_id = None + self._title = None + self._zip = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if address is not None: + self.address = address + if address2 is not None: + self.address2 = address2 + if city is not None: + self.city = city + if country is not None: + self.country = country + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if email is not None: + self.email = email + if id is not None: + self.id = id + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if parent_customer_id is not None: + self.parent_customer_id = parent_customer_id + if phone is not None: + self.phone = phone + if state is not None: + self.state = state + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + if zip is not None: + self.zip = zip + + @property + def additional_info(self): + """Gets the additional_info of this Customer. # noqa: E501 + + + :return: The additional_info of this Customer. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Customer. + + + :param additional_info: The additional_info of this Customer. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def address(self): + """Gets the address of this Customer. # noqa: E501 + + + :return: The address of this Customer. # noqa: E501 + :rtype: str + """ + return self._address + + @address.setter + def address(self, address): + """Sets the address of this Customer. + + + :param address: The address of this Customer. # noqa: E501 + :type: str + """ + + self._address = address + + @property + def address2(self): + """Gets the address2 of this Customer. # noqa: E501 + + + :return: The address2 of this Customer. # noqa: E501 + :rtype: str + """ + return self._address2 + + @address2.setter + def address2(self, address2): + """Sets the address2 of this Customer. + + + :param address2: The address2 of this Customer. # noqa: E501 + :type: str + """ + + self._address2 = address2 + + @property + def city(self): + """Gets the city of this Customer. # noqa: E501 + + + :return: The city of this Customer. # noqa: E501 + :rtype: str + """ + return self._city + + @city.setter + def city(self, city): + """Sets the city of this Customer. + + + :param city: The city of this Customer. # noqa: E501 + :type: str + """ + + self._city = city + + @property + def country(self): + """Gets the country of this Customer. # noqa: E501 + + + :return: The country of this Customer. # noqa: E501 + :rtype: str + """ + return self._country + + @country.setter + def country(self, country): + """Sets the country of this Customer. + + + :param country: The country of this Customer. # noqa: E501 + :type: str + """ + + self._country = country + + @property + def created_time(self): + """Gets the created_time of this Customer. # noqa: E501 + + + :return: The created_time of this Customer. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Customer. + + + :param created_time: The created_time of this Customer. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this Customer. # noqa: E501 + + + :return: The customer_id of this Customer. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this Customer. + + + :param customer_id: The customer_id of this Customer. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def email(self): + """Gets the email of this Customer. # noqa: E501 + + + :return: The email of this Customer. # noqa: E501 + :rtype: str + """ + return self._email + + @email.setter + def email(self, email): + """Sets the email of this Customer. + + + :param email: The email of this Customer. # noqa: E501 + :type: str + """ + + self._email = email + + @property + def id(self): + """Gets the id of this Customer. # noqa: E501 + + + :return: The id of this Customer. # noqa: E501 + :rtype: CustomerId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Customer. + + + :param id: The id of this Customer. # noqa: E501 + :type: CustomerId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this Customer. # noqa: E501 + + + :return: The name of this Customer. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Customer. + + + :param name: The name of this Customer. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this Customer. # noqa: E501 + + + :return: The owner_id of this Customer. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this Customer. + + + :param owner_id: The owner_id of this Customer. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def parent_customer_id(self): + """Gets the parent_customer_id of this Customer. # noqa: E501 + + + :return: The parent_customer_id of this Customer. # noqa: E501 + :rtype: CustomerId + """ + return self._parent_customer_id + + @parent_customer_id.setter + def parent_customer_id(self, parent_customer_id): + """Sets the parent_customer_id of this Customer. + + + :param parent_customer_id: The parent_customer_id of this Customer. # noqa: E501 + :type: CustomerId + """ + + self._parent_customer_id = parent_customer_id + + @property + def phone(self): + """Gets the phone of this Customer. # noqa: E501 + + + :return: The phone of this Customer. # noqa: E501 + :rtype: str + """ + return self._phone + + @phone.setter + def phone(self, phone): + """Sets the phone of this Customer. + + + :param phone: The phone of this Customer. # noqa: E501 + :type: str + """ + + self._phone = phone + + @property + def state(self): + """Gets the state of this Customer. # noqa: E501 + + + :return: The state of this Customer. # noqa: E501 + :rtype: str + """ + return self._state + + @state.setter + def state(self, state): + """Sets the state of this Customer. + + + :param state: The state of this Customer. # noqa: E501 + :type: str + """ + + self._state = state + + @property + def tenant_id(self): + """Gets the tenant_id of this Customer. # noqa: E501 + + + :return: The tenant_id of this Customer. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Customer. + + + :param tenant_id: The tenant_id of this Customer. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this Customer. # noqa: E501 + + + :return: The title of this Customer. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this Customer. + + + :param title: The title of this Customer. # noqa: E501 + :type: str + """ + + self._title = title + + @property + def zip(self): + """Gets the zip of this Customer. # noqa: E501 + + + :return: The zip of this Customer. # noqa: E501 + :rtype: str + """ + return self._zip + + @zip.setter + def zip(self, zip): + """Sets the zip of this Customer. + + + :param zip: The zip of this Customer. # noqa: E501 + :type: str + """ + + self._zip = zip + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Customer, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Customer): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/dashboard.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/dashboard.py new file mode 100644 index 0000000..f8537f7 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/dashboard.py @@ -0,0 +1,396 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Dashboard(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'assigned_customers': 'list[ShortCustomerInfo]', + 'configuration': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'id': 'DashboardId', + 'image': 'str', + 'mobile_hide': 'bool', + 'mobile_order': 'int', + 'name': 'str', + 'owner_id': 'EntityId', + 'tenant_id': 'TenantId', + 'title': 'str' + } + + attribute_map = { + 'assigned_customers': 'assignedCustomers', + 'configuration': 'configuration', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'id': 'id', + 'image': 'image', + 'mobile_hide': 'mobileHide', + 'mobile_order': 'mobileOrder', + 'name': 'name', + 'owner_id': 'ownerId', + 'tenant_id': 'tenantId', + 'title': 'title' + } + + def __init__(self, assigned_customers=None, configuration=None, created_time=None, customer_id=None, id=None, image=None, mobile_hide=None, mobile_order=None, name=None, owner_id=None, tenant_id=None, title=None): # noqa: E501 + """Dashboard - a model defined in Swagger""" # noqa: E501 + self._assigned_customers = None + self._configuration = None + self._created_time = None + self._customer_id = None + self._id = None + self._image = None + self._mobile_hide = None + self._mobile_order = None + self._name = None + self._owner_id = None + self._tenant_id = None + self._title = None + self.discriminator = None + if assigned_customers is not None: + self.assigned_customers = assigned_customers + if configuration is not None: + self.configuration = configuration + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if id is not None: + self.id = id + if image is not None: + self.image = image + if mobile_hide is not None: + self.mobile_hide = mobile_hide + if mobile_order is not None: + self.mobile_order = mobile_order + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + + @property + def assigned_customers(self): + """Gets the assigned_customers of this Dashboard. # noqa: E501 + + + :return: The assigned_customers of this Dashboard. # noqa: E501 + :rtype: list[ShortCustomerInfo] + """ + return self._assigned_customers + + @assigned_customers.setter + def assigned_customers(self, assigned_customers): + """Sets the assigned_customers of this Dashboard. + + + :param assigned_customers: The assigned_customers of this Dashboard. # noqa: E501 + :type: list[ShortCustomerInfo] + """ + + self._assigned_customers = assigned_customers + + @property + def configuration(self): + """Gets the configuration of this Dashboard. # noqa: E501 + + + :return: The configuration of this Dashboard. # noqa: E501 + :rtype: str + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this Dashboard. + + + :param configuration: The configuration of this Dashboard. # noqa: E501 + :type: str + """ + + self._configuration = configuration + + @property + def created_time(self): + """Gets the created_time of this Dashboard. # noqa: E501 + + + :return: The created_time of this Dashboard. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Dashboard. + + + :param created_time: The created_time of this Dashboard. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this Dashboard. # noqa: E501 + + + :return: The customer_id of this Dashboard. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this Dashboard. + + + :param customer_id: The customer_id of this Dashboard. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def id(self): + """Gets the id of this Dashboard. # noqa: E501 + + + :return: The id of this Dashboard. # noqa: E501 + :rtype: DashboardId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Dashboard. + + + :param id: The id of this Dashboard. # noqa: E501 + :type: DashboardId + """ + + self._id = id + + @property + def image(self): + """Gets the image of this Dashboard. # noqa: E501 + + + :return: The image of this Dashboard. # noqa: E501 + :rtype: str + """ + return self._image + + @image.setter + def image(self, image): + """Sets the image of this Dashboard. + + + :param image: The image of this Dashboard. # noqa: E501 + :type: str + """ + + self._image = image + + @property + def mobile_hide(self): + """Gets the mobile_hide of this Dashboard. # noqa: E501 + + + :return: The mobile_hide of this Dashboard. # noqa: E501 + :rtype: bool + """ + return self._mobile_hide + + @mobile_hide.setter + def mobile_hide(self, mobile_hide): + """Sets the mobile_hide of this Dashboard. + + + :param mobile_hide: The mobile_hide of this Dashboard. # noqa: E501 + :type: bool + """ + + self._mobile_hide = mobile_hide + + @property + def mobile_order(self): + """Gets the mobile_order of this Dashboard. # noqa: E501 + + + :return: The mobile_order of this Dashboard. # noqa: E501 + :rtype: int + """ + return self._mobile_order + + @mobile_order.setter + def mobile_order(self, mobile_order): + """Sets the mobile_order of this Dashboard. + + + :param mobile_order: The mobile_order of this Dashboard. # noqa: E501 + :type: int + """ + + self._mobile_order = mobile_order + + @property + def name(self): + """Gets the name of this Dashboard. # noqa: E501 + + + :return: The name of this Dashboard. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Dashboard. + + + :param name: The name of this Dashboard. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this Dashboard. # noqa: E501 + + + :return: The owner_id of this Dashboard. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this Dashboard. + + + :param owner_id: The owner_id of this Dashboard. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def tenant_id(self): + """Gets the tenant_id of this Dashboard. # noqa: E501 + + + :return: The tenant_id of this Dashboard. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Dashboard. + + + :param tenant_id: The tenant_id of this Dashboard. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this Dashboard. # noqa: E501 + + + :return: The title of this Dashboard. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this Dashboard. + + + :param title: The title of this Dashboard. # noqa: E501 + :type: str + """ + + self._title = title + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Dashboard, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Dashboard): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/dashboard_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/dashboard_info.py new file mode 100644 index 0000000..87e2cde --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/dashboard_info.py @@ -0,0 +1,344 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DashboardInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'assigned_customers': 'list[ShortCustomerInfo]', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'image': 'str', + 'mobile_hide': 'bool', + 'mobile_order': 'int', + 'name': 'str', + 'owner_id': 'EntityId', + 'tenant_id': 'TenantId', + 'title': 'str' + } + + attribute_map = { + 'assigned_customers': 'assignedCustomers', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'image': 'image', + 'mobile_hide': 'mobileHide', + 'mobile_order': 'mobileOrder', + 'name': 'name', + 'owner_id': 'ownerId', + 'tenant_id': 'tenantId', + 'title': 'title' + } + + def __init__(self, assigned_customers=None, created_time=None, customer_id=None, image=None, mobile_hide=None, mobile_order=None, name=None, owner_id=None, tenant_id=None, title=None): # noqa: E501 + """DashboardInfo - a model defined in Swagger""" # noqa: E501 + self._assigned_customers = None + self._created_time = None + self._customer_id = None + self._image = None + self._mobile_hide = None + self._mobile_order = None + self._name = None + self._owner_id = None + self._tenant_id = None + self._title = None + self.discriminator = None + if assigned_customers is not None: + self.assigned_customers = assigned_customers + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if image is not None: + self.image = image + if mobile_hide is not None: + self.mobile_hide = mobile_hide + if mobile_order is not None: + self.mobile_order = mobile_order + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + + @property + def assigned_customers(self): + """Gets the assigned_customers of this DashboardInfo. # noqa: E501 + + + :return: The assigned_customers of this DashboardInfo. # noqa: E501 + :rtype: list[ShortCustomerInfo] + """ + return self._assigned_customers + + @assigned_customers.setter + def assigned_customers(self, assigned_customers): + """Sets the assigned_customers of this DashboardInfo. + + + :param assigned_customers: The assigned_customers of this DashboardInfo. # noqa: E501 + :type: list[ShortCustomerInfo] + """ + + self._assigned_customers = assigned_customers + + @property + def created_time(self): + """Gets the created_time of this DashboardInfo. # noqa: E501 + + + :return: The created_time of this DashboardInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this DashboardInfo. + + + :param created_time: The created_time of this DashboardInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this DashboardInfo. # noqa: E501 + + + :return: The customer_id of this DashboardInfo. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this DashboardInfo. + + + :param customer_id: The customer_id of this DashboardInfo. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def image(self): + """Gets the image of this DashboardInfo. # noqa: E501 + + + :return: The image of this DashboardInfo. # noqa: E501 + :rtype: str + """ + return self._image + + @image.setter + def image(self, image): + """Sets the image of this DashboardInfo. + + + :param image: The image of this DashboardInfo. # noqa: E501 + :type: str + """ + + self._image = image + + @property + def mobile_hide(self): + """Gets the mobile_hide of this DashboardInfo. # noqa: E501 + + + :return: The mobile_hide of this DashboardInfo. # noqa: E501 + :rtype: bool + """ + return self._mobile_hide + + @mobile_hide.setter + def mobile_hide(self, mobile_hide): + """Sets the mobile_hide of this DashboardInfo. + + + :param mobile_hide: The mobile_hide of this DashboardInfo. # noqa: E501 + :type: bool + """ + + self._mobile_hide = mobile_hide + + @property + def mobile_order(self): + """Gets the mobile_order of this DashboardInfo. # noqa: E501 + + + :return: The mobile_order of this DashboardInfo. # noqa: E501 + :rtype: int + """ + return self._mobile_order + + @mobile_order.setter + def mobile_order(self, mobile_order): + """Sets the mobile_order of this DashboardInfo. + + + :param mobile_order: The mobile_order of this DashboardInfo. # noqa: E501 + :type: int + """ + + self._mobile_order = mobile_order + + @property + def name(self): + """Gets the name of this DashboardInfo. # noqa: E501 + + + :return: The name of this DashboardInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this DashboardInfo. + + + :param name: The name of this DashboardInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this DashboardInfo. # noqa: E501 + + + :return: The owner_id of this DashboardInfo. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this DashboardInfo. + + + :param owner_id: The owner_id of this DashboardInfo. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def tenant_id(self): + """Gets the tenant_id of this DashboardInfo. # noqa: E501 + + + :return: The tenant_id of this DashboardInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this DashboardInfo. + + + :param tenant_id: The tenant_id of this DashboardInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this DashboardInfo. # noqa: E501 + + + :return: The title of this DashboardInfo. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this DashboardInfo. + + + :param title: The title of this DashboardInfo. # noqa: E501 + :type: str + """ + + self._title = title + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DashboardInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DashboardInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/delete_tenant_request.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/delete_tenant_request.py new file mode 100644 index 0000000..0d639e8 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/delete_tenant_request.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeleteTenantRequest(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_notes': 'str', + 'reason': 'str' + } + + attribute_map = { + 'additional_notes': 'additionalNotes', + 'reason': 'reason' + } + + def __init__(self, additional_notes=None, reason=None): # noqa: E501 + """DeleteTenantRequest - a model defined in Swagger""" # noqa: E501 + self._additional_notes = None + self._reason = None + self.discriminator = None + if additional_notes is not None: + self.additional_notes = additional_notes + if reason is not None: + self.reason = reason + + @property + def additional_notes(self): + """Gets the additional_notes of this DeleteTenantRequest. # noqa: E501 + + + :return: The additional_notes of this DeleteTenantRequest. # noqa: E501 + :rtype: str + """ + return self._additional_notes + + @additional_notes.setter + def additional_notes(self, additional_notes): + """Sets the additional_notes of this DeleteTenantRequest. + + + :param additional_notes: The additional_notes of this DeleteTenantRequest. # noqa: E501 + :type: str + """ + + self._additional_notes = additional_notes + + @property + def reason(self): + """Gets the reason of this DeleteTenantRequest. # noqa: E501 + + + :return: The reason of this DeleteTenantRequest. # noqa: E501 + :rtype: str + """ + return self._reason + + @reason.setter + def reason(self, reason): + """Sets the reason of this DeleteTenantRequest. + + + :param reason: The reason of this DeleteTenantRequest. # noqa: E501 + :type: str + """ + + self._reason = reason + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeleteTenantRequest, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeleteTenantRequest): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/device.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/device.py new file mode 100644 index 0000000..a2b1219 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/device.py @@ -0,0 +1,396 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Device(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'device_data': 'DeviceData', + 'device_profile_id': 'DeviceProfileId', + 'firmware_id': 'OtaPackageId', + 'label': 'str', + 'name': 'str', + 'owner_id': 'EntityId', + 'software_id': 'OtaPackageId', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'device_data': 'deviceData', + 'device_profile_id': 'deviceProfileId', + 'firmware_id': 'firmwareId', + 'label': 'label', + 'name': 'name', + 'owner_id': 'ownerId', + 'software_id': 'softwareId', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, created_time=None, customer_id=None, device_data=None, device_profile_id=None, firmware_id=None, label=None, name=None, owner_id=None, software_id=None, tenant_id=None, type=None): # noqa: E501 + """Device - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._customer_id = None + self._device_data = None + self._device_profile_id = None + self._firmware_id = None + self._label = None + self._name = None + self._owner_id = None + self._software_id = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if device_data is not None: + self.device_data = device_data + if device_profile_id is not None: + self.device_profile_id = device_profile_id + if firmware_id is not None: + self.firmware_id = firmware_id + if label is not None: + self.label = label + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if software_id is not None: + self.software_id = software_id + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this Device. # noqa: E501 + + + :return: The additional_info of this Device. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Device. + + + :param additional_info: The additional_info of this Device. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this Device. # noqa: E501 + + + :return: The created_time of this Device. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Device. + + + :param created_time: The created_time of this Device. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this Device. # noqa: E501 + + + :return: The customer_id of this Device. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this Device. + + + :param customer_id: The customer_id of this Device. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def device_data(self): + """Gets the device_data of this Device. # noqa: E501 + + + :return: The device_data of this Device. # noqa: E501 + :rtype: DeviceData + """ + return self._device_data + + @device_data.setter + def device_data(self, device_data): + """Sets the device_data of this Device. + + + :param device_data: The device_data of this Device. # noqa: E501 + :type: DeviceData + """ + + self._device_data = device_data + + @property + def device_profile_id(self): + """Gets the device_profile_id of this Device. # noqa: E501 + + + :return: The device_profile_id of this Device. # noqa: E501 + :rtype: DeviceProfileId + """ + return self._device_profile_id + + @device_profile_id.setter + def device_profile_id(self, device_profile_id): + """Sets the device_profile_id of this Device. + + + :param device_profile_id: The device_profile_id of this Device. # noqa: E501 + :type: DeviceProfileId + """ + + self._device_profile_id = device_profile_id + + @property + def firmware_id(self): + """Gets the firmware_id of this Device. # noqa: E501 + + + :return: The firmware_id of this Device. # noqa: E501 + :rtype: OtaPackageId + """ + return self._firmware_id + + @firmware_id.setter + def firmware_id(self, firmware_id): + """Sets the firmware_id of this Device. + + + :param firmware_id: The firmware_id of this Device. # noqa: E501 + :type: OtaPackageId + """ + + self._firmware_id = firmware_id + + @property + def label(self): + """Gets the label of this Device. # noqa: E501 + + + :return: The label of this Device. # noqa: E501 + :rtype: str + """ + return self._label + + @label.setter + def label(self, label): + """Sets the label of this Device. + + + :param label: The label of this Device. # noqa: E501 + :type: str + """ + + self._label = label + + @property + def name(self): + """Gets the name of this Device. # noqa: E501 + + + :return: The name of this Device. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Device. + + + :param name: The name of this Device. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this Device. # noqa: E501 + + + :return: The owner_id of this Device. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this Device. + + + :param owner_id: The owner_id of this Device. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def software_id(self): + """Gets the software_id of this Device. # noqa: E501 + + + :return: The software_id of this Device. # noqa: E501 + :rtype: OtaPackageId + """ + return self._software_id + + @software_id.setter + def software_id(self, software_id): + """Sets the software_id of this Device. + + + :param software_id: The software_id of this Device. # noqa: E501 + :type: OtaPackageId + """ + + self._software_id = software_id + + @property + def tenant_id(self): + """Gets the tenant_id of this Device. # noqa: E501 + + + :return: The tenant_id of this Device. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Device. + + + :param tenant_id: The tenant_id of this Device. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this Device. # noqa: E501 + + + :return: The type of this Device. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Device. + + + :param type: The type of this Device. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Device, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Device): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/device_group_ota_package.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/device_group_ota_package.py new file mode 100644 index 0000000..80ded45 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/device_group_ota_package.py @@ -0,0 +1,220 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DeviceGroupOtaPackage(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'group_id': 'EntityGroupId', + 'id': 'str', + 'ota_package_id': 'OtaPackageId', + 'ota_package_type': 'str', + 'ota_package_update_time': 'int' + } + + attribute_map = { + 'group_id': 'groupId', + 'id': 'id', + 'ota_package_id': 'otaPackageId', + 'ota_package_type': 'otaPackageType', + 'ota_package_update_time': 'otaPackageUpdateTime' + } + + def __init__(self, group_id=None, id=None, ota_package_id=None, ota_package_type=None, ota_package_update_time=None): # noqa: E501 + """DeviceGroupOtaPackage - a model defined in Swagger""" # noqa: E501 + self._group_id = None + self._id = None + self._ota_package_id = None + self._ota_package_type = None + self._ota_package_update_time = None + self.discriminator = None + if group_id is not None: + self.group_id = group_id + if id is not None: + self.id = id + if ota_package_id is not None: + self.ota_package_id = ota_package_id + if ota_package_type is not None: + self.ota_package_type = ota_package_type + if ota_package_update_time is not None: + self.ota_package_update_time = ota_package_update_time + + @property + def group_id(self): + """Gets the group_id of this DeviceGroupOtaPackage. # noqa: E501 + + + :return: The group_id of this DeviceGroupOtaPackage. # noqa: E501 + :rtype: EntityGroupId + """ + return self._group_id + + @group_id.setter + def group_id(self, group_id): + """Sets the group_id of this DeviceGroupOtaPackage. + + + :param group_id: The group_id of this DeviceGroupOtaPackage. # noqa: E501 + :type: EntityGroupId + """ + + self._group_id = group_id + + @property + def id(self): + """Gets the id of this DeviceGroupOtaPackage. # noqa: E501 + + + :return: The id of this DeviceGroupOtaPackage. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this DeviceGroupOtaPackage. + + + :param id: The id of this DeviceGroupOtaPackage. # noqa: E501 + :type: str + """ + + self._id = id + + @property + def ota_package_id(self): + """Gets the ota_package_id of this DeviceGroupOtaPackage. # noqa: E501 + + + :return: The ota_package_id of this DeviceGroupOtaPackage. # noqa: E501 + :rtype: OtaPackageId + """ + return self._ota_package_id + + @ota_package_id.setter + def ota_package_id(self, ota_package_id): + """Sets the ota_package_id of this DeviceGroupOtaPackage. + + + :param ota_package_id: The ota_package_id of this DeviceGroupOtaPackage. # noqa: E501 + :type: OtaPackageId + """ + + self._ota_package_id = ota_package_id + + @property + def ota_package_type(self): + """Gets the ota_package_type of this DeviceGroupOtaPackage. # noqa: E501 + + + :return: The ota_package_type of this DeviceGroupOtaPackage. # noqa: E501 + :rtype: str + """ + return self._ota_package_type + + @ota_package_type.setter + def ota_package_type(self, ota_package_type): + """Sets the ota_package_type of this DeviceGroupOtaPackage. + + + :param ota_package_type: The ota_package_type of this DeviceGroupOtaPackage. # noqa: E501 + :type: str + """ + allowed_values = ["FIRMWARE", "SOFTWARE"] # noqa: E501 + if ota_package_type not in allowed_values: + raise ValueError( + "Invalid value for `ota_package_type` ({0}), must be one of {1}" # noqa: E501 + .format(ota_package_type, allowed_values) + ) + + self._ota_package_type = ota_package_type + + @property + def ota_package_update_time(self): + """Gets the ota_package_update_time of this DeviceGroupOtaPackage. # noqa: E501 + + + :return: The ota_package_update_time of this DeviceGroupOtaPackage. # noqa: E501 + :rtype: int + """ + return self._ota_package_update_time + + @ota_package_update_time.setter + def ota_package_update_time(self, ota_package_update_time): + """Sets the ota_package_update_time of this DeviceGroupOtaPackage. + + + :param ota_package_update_time: The ota_package_update_time of this DeviceGroupOtaPackage. # noqa: E501 + :type: int + """ + + self._ota_package_update_time = ota_package_update_time + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DeviceGroupOtaPackage, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DeviceGroupOtaPackage): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/domain_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/domain_info.py new file mode 100644 index 0000000..f971a12 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/domain_info.py @@ -0,0 +1,142 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class DomainInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'name': 'str', + 'scheme': 'str' + } + + attribute_map = { + 'name': 'name', + 'scheme': 'scheme' + } + + def __init__(self, name=None, scheme=None): # noqa: E501 + """DomainInfo - a model defined in Swagger""" # noqa: E501 + self._name = None + self._scheme = None + self.discriminator = None + if name is not None: + self.name = name + if scheme is not None: + self.scheme = scheme + + @property + def name(self): + """Gets the name of this DomainInfo. # noqa: E501 + + + :return: The name of this DomainInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this DomainInfo. + + + :param name: The name of this DomainInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def scheme(self): + """Gets the scheme of this DomainInfo. # noqa: E501 + + + :return: The scheme of this DomainInfo. # noqa: E501 + :rtype: str + """ + return self._scheme + + @scheme.setter + def scheme(self, scheme): + """Sets the scheme of this DomainInfo. + + + :param scheme: The scheme of this DomainInfo. # noqa: E501 + :type: str + """ + allowed_values = ["HTTP", "HTTPS", "MIXED"] # noqa: E501 + if scheme not in allowed_values: + raise ValueError( + "Invalid value for `scheme` ({0}), must be one of {1}" # noqa: E501 + .format(scheme, allowed_values) + ) + + self._scheme = scheme + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(DomainInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, DomainInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/edge.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/edge.py new file mode 100644 index 0000000..acc37fa --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/edge.py @@ -0,0 +1,448 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Edge(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'cloud_endpoint': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'edge_license_key': 'str', + 'id': 'EdgeId', + 'label': 'str', + 'name': 'str', + 'owner_id': 'EntityId', + 'root_rule_chain_id': 'RuleChainId', + 'routing_key': 'str', + 'secret': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'cloud_endpoint': 'cloudEndpoint', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'edge_license_key': 'edgeLicenseKey', + 'id': 'id', + 'label': 'label', + 'name': 'name', + 'owner_id': 'ownerId', + 'root_rule_chain_id': 'rootRuleChainId', + 'routing_key': 'routingKey', + 'secret': 'secret', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, cloud_endpoint=None, created_time=None, customer_id=None, edge_license_key=None, id=None, label=None, name=None, owner_id=None, root_rule_chain_id=None, routing_key=None, secret=None, tenant_id=None, type=None): # noqa: E501 + """Edge - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._cloud_endpoint = None + self._created_time = None + self._customer_id = None + self._edge_license_key = None + self._id = None + self._label = None + self._name = None + self._owner_id = None + self._root_rule_chain_id = None + self._routing_key = None + self._secret = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if cloud_endpoint is not None: + self.cloud_endpoint = cloud_endpoint + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if edge_license_key is not None: + self.edge_license_key = edge_license_key + if id is not None: + self.id = id + if label is not None: + self.label = label + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if root_rule_chain_id is not None: + self.root_rule_chain_id = root_rule_chain_id + if routing_key is not None: + self.routing_key = routing_key + if secret is not None: + self.secret = secret + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this Edge. # noqa: E501 + + + :return: The additional_info of this Edge. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Edge. + + + :param additional_info: The additional_info of this Edge. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def cloud_endpoint(self): + """Gets the cloud_endpoint of this Edge. # noqa: E501 + + + :return: The cloud_endpoint of this Edge. # noqa: E501 + :rtype: str + """ + return self._cloud_endpoint + + @cloud_endpoint.setter + def cloud_endpoint(self, cloud_endpoint): + """Sets the cloud_endpoint of this Edge. + + + :param cloud_endpoint: The cloud_endpoint of this Edge. # noqa: E501 + :type: str + """ + + self._cloud_endpoint = cloud_endpoint + + @property + def created_time(self): + """Gets the created_time of this Edge. # noqa: E501 + + + :return: The created_time of this Edge. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Edge. + + + :param created_time: The created_time of this Edge. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this Edge. # noqa: E501 + + + :return: The customer_id of this Edge. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this Edge. + + + :param customer_id: The customer_id of this Edge. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def edge_license_key(self): + """Gets the edge_license_key of this Edge. # noqa: E501 + + + :return: The edge_license_key of this Edge. # noqa: E501 + :rtype: str + """ + return self._edge_license_key + + @edge_license_key.setter + def edge_license_key(self, edge_license_key): + """Sets the edge_license_key of this Edge. + + + :param edge_license_key: The edge_license_key of this Edge. # noqa: E501 + :type: str + """ + + self._edge_license_key = edge_license_key + + @property + def id(self): + """Gets the id of this Edge. # noqa: E501 + + + :return: The id of this Edge. # noqa: E501 + :rtype: EdgeId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Edge. + + + :param id: The id of this Edge. # noqa: E501 + :type: EdgeId + """ + + self._id = id + + @property + def label(self): + """Gets the label of this Edge. # noqa: E501 + + + :return: The label of this Edge. # noqa: E501 + :rtype: str + """ + return self._label + + @label.setter + def label(self, label): + """Sets the label of this Edge. + + + :param label: The label of this Edge. # noqa: E501 + :type: str + """ + + self._label = label + + @property + def name(self): + """Gets the name of this Edge. # noqa: E501 + + + :return: The name of this Edge. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Edge. + + + :param name: The name of this Edge. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this Edge. # noqa: E501 + + + :return: The owner_id of this Edge. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this Edge. + + + :param owner_id: The owner_id of this Edge. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def root_rule_chain_id(self): + """Gets the root_rule_chain_id of this Edge. # noqa: E501 + + + :return: The root_rule_chain_id of this Edge. # noqa: E501 + :rtype: RuleChainId + """ + return self._root_rule_chain_id + + @root_rule_chain_id.setter + def root_rule_chain_id(self, root_rule_chain_id): + """Sets the root_rule_chain_id of this Edge. + + + :param root_rule_chain_id: The root_rule_chain_id of this Edge. # noqa: E501 + :type: RuleChainId + """ + + self._root_rule_chain_id = root_rule_chain_id + + @property + def routing_key(self): + """Gets the routing_key of this Edge. # noqa: E501 + + + :return: The routing_key of this Edge. # noqa: E501 + :rtype: str + """ + return self._routing_key + + @routing_key.setter + def routing_key(self, routing_key): + """Sets the routing_key of this Edge. + + + :param routing_key: The routing_key of this Edge. # noqa: E501 + :type: str + """ + + self._routing_key = routing_key + + @property + def secret(self): + """Gets the secret of this Edge. # noqa: E501 + + + :return: The secret of this Edge. # noqa: E501 + :rtype: str + """ + return self._secret + + @secret.setter + def secret(self, secret): + """Sets the secret of this Edge. + + + :param secret: The secret of this Edge. # noqa: E501 + :type: str + """ + + self._secret = secret + + @property + def tenant_id(self): + """Gets the tenant_id of this Edge. # noqa: E501 + + + :return: The tenant_id of this Edge. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Edge. + + + :param tenant_id: The tenant_id of this Edge. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this Edge. # noqa: E501 + + + :return: The type of this Edge. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Edge. + + + :param type: The type of this Edge. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Edge, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Edge): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/edge_event.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/edge_event.py new file mode 100644 index 0000000..1efeb0c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/edge_event.py @@ -0,0 +1,356 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EdgeEvent(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'action': 'str', + 'body': 'str', + 'created_time': 'int', + 'edge_id': 'EdgeId', + 'entity_group_id': 'str', + 'entity_id': 'str', + 'id': 'EdgeEventId', + 'tenant_id': 'TenantId', + 'type': 'str', + 'uid': 'str' + } + + attribute_map = { + 'action': 'action', + 'body': 'body', + 'created_time': 'createdTime', + 'edge_id': 'edgeId', + 'entity_group_id': 'entityGroupId', + 'entity_id': 'entityId', + 'id': 'id', + 'tenant_id': 'tenantId', + 'type': 'type', + 'uid': 'uid' + } + + def __init__(self, action=None, body=None, created_time=None, edge_id=None, entity_group_id=None, entity_id=None, id=None, tenant_id=None, type=None, uid=None): # noqa: E501 + """EdgeEvent - a model defined in Swagger""" # noqa: E501 + self._action = None + self._body = None + self._created_time = None + self._edge_id = None + self._entity_group_id = None + self._entity_id = None + self._id = None + self._tenant_id = None + self._type = None + self._uid = None + self.discriminator = None + if action is not None: + self.action = action + if body is not None: + self.body = body + if created_time is not None: + self.created_time = created_time + if edge_id is not None: + self.edge_id = edge_id + if entity_group_id is not None: + self.entity_group_id = entity_group_id + if entity_id is not None: + self.entity_id = entity_id + if id is not None: + self.id = id + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + if uid is not None: + self.uid = uid + + @property + def action(self): + """Gets the action of this EdgeEvent. # noqa: E501 + + + :return: The action of this EdgeEvent. # noqa: E501 + :rtype: str + """ + return self._action + + @action.setter + def action(self, action): + """Sets the action of this EdgeEvent. + + + :param action: The action of this EdgeEvent. # noqa: E501 + :type: str + """ + allowed_values = ["ADDED", "DELETED", "UPDATED", "POST_ATTRIBUTES", "ATTRIBUTES_UPDATED", "ATTRIBUTES_DELETED", "TIMESERIES_UPDATED", "CREDENTIALS_UPDATED", "RELATION_ADD_OR_UPDATE", "RELATION_DELETED", "RPC_CALL", "ALARM_ACK", "ALARM_CLEAR", "ASSIGNED_TO_EDGE", "UNASSIGNED_FROM_EDGE", "CREDENTIALS_REQUEST", "ENTITY_MERGE_REQUEST", "ADDED_TO_ENTITY_GROUP", "REMOVED_FROM_ENTITY_GROUP", "CHANGE_OWNER"] # noqa: E501 + if action not in allowed_values: + raise ValueError( + "Invalid value for `action` ({0}), must be one of {1}" # noqa: E501 + .format(action, allowed_values) + ) + + self._action = action + + @property + def body(self): + """Gets the body of this EdgeEvent. # noqa: E501 + + + :return: The body of this EdgeEvent. # noqa: E501 + :rtype: str + """ + return self._body + + @body.setter + def body(self, body): + """Sets the body of this EdgeEvent. + + + :param body: The body of this EdgeEvent. # noqa: E501 + :type: str + """ + + self._body = body + + @property + def created_time(self): + """Gets the created_time of this EdgeEvent. # noqa: E501 + + + :return: The created_time of this EdgeEvent. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this EdgeEvent. + + + :param created_time: The created_time of this EdgeEvent. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def edge_id(self): + """Gets the edge_id of this EdgeEvent. # noqa: E501 + + + :return: The edge_id of this EdgeEvent. # noqa: E501 + :rtype: EdgeId + """ + return self._edge_id + + @edge_id.setter + def edge_id(self, edge_id): + """Sets the edge_id of this EdgeEvent. + + + :param edge_id: The edge_id of this EdgeEvent. # noqa: E501 + :type: EdgeId + """ + + self._edge_id = edge_id + + @property + def entity_group_id(self): + """Gets the entity_group_id of this EdgeEvent. # noqa: E501 + + + :return: The entity_group_id of this EdgeEvent. # noqa: E501 + :rtype: str + """ + return self._entity_group_id + + @entity_group_id.setter + def entity_group_id(self, entity_group_id): + """Sets the entity_group_id of this EdgeEvent. + + + :param entity_group_id: The entity_group_id of this EdgeEvent. # noqa: E501 + :type: str + """ + + self._entity_group_id = entity_group_id + + @property + def entity_id(self): + """Gets the entity_id of this EdgeEvent. # noqa: E501 + + + :return: The entity_id of this EdgeEvent. # noqa: E501 + :rtype: str + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this EdgeEvent. + + + :param entity_id: The entity_id of this EdgeEvent. # noqa: E501 + :type: str + """ + + self._entity_id = entity_id + + @property + def id(self): + """Gets the id of this EdgeEvent. # noqa: E501 + + + :return: The id of this EdgeEvent. # noqa: E501 + :rtype: EdgeEventId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EdgeEvent. + + + :param id: The id of this EdgeEvent. # noqa: E501 + :type: EdgeEventId + """ + + self._id = id + + @property + def tenant_id(self): + """Gets the tenant_id of this EdgeEvent. # noqa: E501 + + + :return: The tenant_id of this EdgeEvent. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this EdgeEvent. + + + :param tenant_id: The tenant_id of this EdgeEvent. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this EdgeEvent. # noqa: E501 + + + :return: The type of this EdgeEvent. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EdgeEvent. + + + :param type: The type of this EdgeEvent. # noqa: E501 + :type: str + """ + allowed_values = ["DASHBOARD", "ASSET", "DEVICE", "DEVICE_PROFILE", "ENTITY_VIEW", "ALARM", "RULE_CHAIN", "RULE_CHAIN_METADATA", "EDGE", "USER", "CUSTOMER", "RELATION", "TENANT", "WIDGETS_BUNDLE", "WIDGET_TYPE", "ENTITY_GROUP", "SCHEDULER_EVENT", "WHITE_LABELING", "LOGIN_WHITE_LABELING", "CUSTOM_TRANSLATION", "ADMIN_SETTINGS", "ROLE", "GROUP_PERMISSION"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + @property + def uid(self): + """Gets the uid of this EdgeEvent. # noqa: E501 + + + :return: The uid of this EdgeEvent. # noqa: E501 + :rtype: str + """ + return self._uid + + @uid.setter + def uid(self, uid): + """Sets the uid of this EdgeEvent. + + + :param uid: The uid of this EdgeEvent. # noqa: E501 + :type: str + """ + + self._uid = uid + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EdgeEvent, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EdgeEvent): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_data.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_data.py new file mode 100644 index 0000000..1b29f4d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_data.py @@ -0,0 +1,214 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityData(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_id': 'EntityId', + 'latest': 'dict(str, dict(str, TsValue))', + 'read_attrs': 'bool', + 'read_ts': 'bool', + 'timeseries': 'dict(str, list[TsValue])' + } + + attribute_map = { + 'entity_id': 'entityId', + 'latest': 'latest', + 'read_attrs': 'readAttrs', + 'read_ts': 'readTs', + 'timeseries': 'timeseries' + } + + def __init__(self, entity_id=None, latest=None, read_attrs=None, read_ts=None, timeseries=None): # noqa: E501 + """EntityData - a model defined in Swagger""" # noqa: E501 + self._entity_id = None + self._latest = None + self._read_attrs = None + self._read_ts = None + self._timeseries = None + self.discriminator = None + if entity_id is not None: + self.entity_id = entity_id + if latest is not None: + self.latest = latest + if read_attrs is not None: + self.read_attrs = read_attrs + if read_ts is not None: + self.read_ts = read_ts + if timeseries is not None: + self.timeseries = timeseries + + @property + def entity_id(self): + """Gets the entity_id of this EntityData. # noqa: E501 + + + :return: The entity_id of this EntityData. # noqa: E501 + :rtype: EntityId + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this EntityData. + + + :param entity_id: The entity_id of this EntityData. # noqa: E501 + :type: EntityId + """ + + self._entity_id = entity_id + + @property + def latest(self): + """Gets the latest of this EntityData. # noqa: E501 + + + :return: The latest of this EntityData. # noqa: E501 + :rtype: dict(str, dict(str, TsValue)) + """ + return self._latest + + @latest.setter + def latest(self, latest): + """Sets the latest of this EntityData. + + + :param latest: The latest of this EntityData. # noqa: E501 + :type: dict(str, dict(str, TsValue)) + """ + + self._latest = latest + + @property + def read_attrs(self): + """Gets the read_attrs of this EntityData. # noqa: E501 + + + :return: The read_attrs of this EntityData. # noqa: E501 + :rtype: bool + """ + return self._read_attrs + + @read_attrs.setter + def read_attrs(self, read_attrs): + """Sets the read_attrs of this EntityData. + + + :param read_attrs: The read_attrs of this EntityData. # noqa: E501 + :type: bool + """ + + self._read_attrs = read_attrs + + @property + def read_ts(self): + """Gets the read_ts of this EntityData. # noqa: E501 + + + :return: The read_ts of this EntityData. # noqa: E501 + :rtype: bool + """ + return self._read_ts + + @read_ts.setter + def read_ts(self, read_ts): + """Sets the read_ts of this EntityData. + + + :param read_ts: The read_ts of this EntityData. # noqa: E501 + :type: bool + """ + + self._read_ts = read_ts + + @property + def timeseries(self): + """Gets the timeseries of this EntityData. # noqa: E501 + + + :return: The timeseries of this EntityData. # noqa: E501 + :rtype: dict(str, list[TsValue]) + """ + return self._timeseries + + @timeseries.setter + def timeseries(self, timeseries): + """Sets the timeseries of this EntityData. + + + :param timeseries: The timeseries of this EntityData. # noqa: E501 + :type: dict(str, list[TsValue]) + """ + + self._timeseries = timeseries + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityData, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityData): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_group.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_group.py new file mode 100644 index 0000000..791ef1c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_group.py @@ -0,0 +1,326 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityGroup(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'configuration': 'str', + 'created_time': 'int', + 'edge_group_all': 'bool', + 'group_all': 'bool', + 'id': 'EntityGroupId', + 'name': 'str', + 'owner_id': 'EntityId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'configuration': 'configuration', + 'created_time': 'createdTime', + 'edge_group_all': 'edgeGroupAll', + 'group_all': 'groupAll', + 'id': 'id', + 'name': 'name', + 'owner_id': 'ownerId', + 'type': 'type' + } + + def __init__(self, additional_info=None, configuration=None, created_time=None, edge_group_all=None, group_all=None, id=None, name=None, owner_id=None, type=None): # noqa: E501 + """EntityGroup - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._configuration = None + self._created_time = None + self._edge_group_all = None + self._group_all = None + self._id = None + self._name = None + self._owner_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if configuration is not None: + self.configuration = configuration + if created_time is not None: + self.created_time = created_time + if edge_group_all is not None: + self.edge_group_all = edge_group_all + if group_all is not None: + self.group_all = group_all + if id is not None: + self.id = id + self.name = name + if owner_id is not None: + self.owner_id = owner_id + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this EntityGroup. # noqa: E501 + + + :return: The additional_info of this EntityGroup. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this EntityGroup. + + + :param additional_info: The additional_info of this EntityGroup. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def configuration(self): + """Gets the configuration of this EntityGroup. # noqa: E501 + + + :return: The configuration of this EntityGroup. # noqa: E501 + :rtype: str + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this EntityGroup. + + + :param configuration: The configuration of this EntityGroup. # noqa: E501 + :type: str + """ + + self._configuration = configuration + + @property + def created_time(self): + """Gets the created_time of this EntityGroup. # noqa: E501 + + + :return: The created_time of this EntityGroup. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this EntityGroup. + + + :param created_time: The created_time of this EntityGroup. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def edge_group_all(self): + """Gets the edge_group_all of this EntityGroup. # noqa: E501 + + + :return: The edge_group_all of this EntityGroup. # noqa: E501 + :rtype: bool + """ + return self._edge_group_all + + @edge_group_all.setter + def edge_group_all(self, edge_group_all): + """Sets the edge_group_all of this EntityGroup. + + + :param edge_group_all: The edge_group_all of this EntityGroup. # noqa: E501 + :type: bool + """ + + self._edge_group_all = edge_group_all + + @property + def group_all(self): + """Gets the group_all of this EntityGroup. # noqa: E501 + + + :return: The group_all of this EntityGroup. # noqa: E501 + :rtype: bool + """ + return self._group_all + + @group_all.setter + def group_all(self, group_all): + """Sets the group_all of this EntityGroup. + + + :param group_all: The group_all of this EntityGroup. # noqa: E501 + :type: bool + """ + + self._group_all = group_all + + @property + def id(self): + """Gets the id of this EntityGroup. # noqa: E501 + + + :return: The id of this EntityGroup. # noqa: E501 + :rtype: EntityGroupId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EntityGroup. + + + :param id: The id of this EntityGroup. # noqa: E501 + :type: EntityGroupId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this EntityGroup. # noqa: E501 + + + :return: The name of this EntityGroup. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this EntityGroup. + + + :param name: The name of this EntityGroup. # noqa: E501 + :type: str + """ + if name is None: + raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this EntityGroup. # noqa: E501 + + + :return: The owner_id of this EntityGroup. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this EntityGroup. + + + :param owner_id: The owner_id of this EntityGroup. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def type(self): + """Gets the type of this EntityGroup. # noqa: E501 + + + :return: The type of this EntityGroup. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntityGroup. + + + :param type: The type of this EntityGroup. # noqa: E501 + :type: str + """ + if type is None: + raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 + allowed_values = ["CUSTOMER", "ASSET", "DEVICE", "USER", "ENTITY_VIEW", "DASHBOARD", "EDGE"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityGroup, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityGroup): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_group_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_group_id.py new file mode 100644 index 0000000..88f0e63 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_group_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class EntityGroupId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """EntityGroupId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this EntityGroupId. # noqa: E501 + + + :return: The id of this EntityGroupId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EntityGroupId. + + + :param id: The id of this EntityGroupId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityGroupId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityGroupId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_group_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_group_info.py new file mode 100644 index 0000000..ebb7c9d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_group_info.py @@ -0,0 +1,352 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityGroupInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'configuration': 'str', + 'created_time': 'int', + 'edge_group_all': 'bool', + 'group_all': 'bool', + 'id': 'EntityGroupId', + 'name': 'str', + 'owner_id': 'EntityId', + 'owner_ids': 'list[EntityId]', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'configuration': 'configuration', + 'created_time': 'createdTime', + 'edge_group_all': 'edgeGroupAll', + 'group_all': 'groupAll', + 'id': 'id', + 'name': 'name', + 'owner_id': 'ownerId', + 'owner_ids': 'ownerIds', + 'type': 'type' + } + + def __init__(self, additional_info=None, configuration=None, created_time=None, edge_group_all=None, group_all=None, id=None, name=None, owner_id=None, owner_ids=None, type=None): # noqa: E501 + """EntityGroupInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._configuration = None + self._created_time = None + self._edge_group_all = None + self._group_all = None + self._id = None + self._name = None + self._owner_id = None + self._owner_ids = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if configuration is not None: + self.configuration = configuration + if created_time is not None: + self.created_time = created_time + if edge_group_all is not None: + self.edge_group_all = edge_group_all + if group_all is not None: + self.group_all = group_all + if id is not None: + self.id = id + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if owner_ids is not None: + self.owner_ids = owner_ids + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this EntityGroupInfo. # noqa: E501 + + + :return: The additional_info of this EntityGroupInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this EntityGroupInfo. + + + :param additional_info: The additional_info of this EntityGroupInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def configuration(self): + """Gets the configuration of this EntityGroupInfo. # noqa: E501 + + + :return: The configuration of this EntityGroupInfo. # noqa: E501 + :rtype: str + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this EntityGroupInfo. + + + :param configuration: The configuration of this EntityGroupInfo. # noqa: E501 + :type: str + """ + + self._configuration = configuration + + @property + def created_time(self): + """Gets the created_time of this EntityGroupInfo. # noqa: E501 + + + :return: The created_time of this EntityGroupInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this EntityGroupInfo. + + + :param created_time: The created_time of this EntityGroupInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def edge_group_all(self): + """Gets the edge_group_all of this EntityGroupInfo. # noqa: E501 + + + :return: The edge_group_all of this EntityGroupInfo. # noqa: E501 + :rtype: bool + """ + return self._edge_group_all + + @edge_group_all.setter + def edge_group_all(self, edge_group_all): + """Sets the edge_group_all of this EntityGroupInfo. + + + :param edge_group_all: The edge_group_all of this EntityGroupInfo. # noqa: E501 + :type: bool + """ + + self._edge_group_all = edge_group_all + + @property + def group_all(self): + """Gets the group_all of this EntityGroupInfo. # noqa: E501 + + + :return: The group_all of this EntityGroupInfo. # noqa: E501 + :rtype: bool + """ + return self._group_all + + @group_all.setter + def group_all(self, group_all): + """Sets the group_all of this EntityGroupInfo. + + + :param group_all: The group_all of this EntityGroupInfo. # noqa: E501 + :type: bool + """ + + self._group_all = group_all + + @property + def id(self): + """Gets the id of this EntityGroupInfo. # noqa: E501 + + + :return: The id of this EntityGroupInfo. # noqa: E501 + :rtype: EntityGroupId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EntityGroupInfo. + + + :param id: The id of this EntityGroupInfo. # noqa: E501 + :type: EntityGroupId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this EntityGroupInfo. # noqa: E501 + + + :return: The name of this EntityGroupInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this EntityGroupInfo. + + + :param name: The name of this EntityGroupInfo. # noqa: E501 + :type: str + """ + if name is None: + raise ValueError("Invalid value for `name`, must not be `None`") # noqa: E501 + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this EntityGroupInfo. # noqa: E501 + + + :return: The owner_id of this EntityGroupInfo. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this EntityGroupInfo. + + + :param owner_id: The owner_id of this EntityGroupInfo. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def owner_ids(self): + """Gets the owner_ids of this EntityGroupInfo. # noqa: E501 + + + :return: The owner_ids of this EntityGroupInfo. # noqa: E501 + :rtype: list[EntityId] + """ + return self._owner_ids + + @owner_ids.setter + def owner_ids(self, owner_ids): + """Sets the owner_ids of this EntityGroupInfo. + + + :param owner_ids: The owner_ids of this EntityGroupInfo. # noqa: E501 + :type: list[EntityId] + """ + + self._owner_ids = owner_ids + + @property + def type(self): + """Gets the type of this EntityGroupInfo. # noqa: E501 + + + :return: The type of this EntityGroupInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntityGroupInfo. + + + :param type: The type of this EntityGroupInfo. # noqa: E501 + :type: str + """ + if type is None: + raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 + allowed_values = ["CUSTOMER", "ASSET", "DEVICE", "USER", "ENTITY_VIEW", "DASHBOARD", "EDGE"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityGroupInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityGroupInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_id.py new file mode 100644 index 0000000..10dd951 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_id.py @@ -0,0 +1,142 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_type': 'str', + 'id': 'str' + } + + attribute_map = { + 'entity_type': 'entityType', + 'id': 'id' + } + + def __init__(self, entity_type=None, id=None): # noqa: E501 + """EntityId - a model defined in Swagger""" # noqa: E501 + self._entity_type = None + self._id = None + self.discriminator = None + if entity_type is not None: + self.entity_type = entity_type + if id is not None: + self.id = id + + @property + def entity_type(self): + """Gets the entity_type of this EntityId. # noqa: E501 + + + :return: The entity_type of this EntityId. # noqa: E501 + :rtype: str + """ + return self._entity_type + + @entity_type.setter + def entity_type(self, entity_type): + """Sets the entity_type of this EntityId. + + + :param entity_type: The entity_type of this EntityId. # noqa: E501 + :type: str + """ + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "ENTITY_GROUP", "CONVERTER", "INTEGRATION", "RULE_CHAIN", "RULE_NODE", "SCHEDULER_EVENT", "BLOB_ENTITY", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "ROLE", "GROUP_PERMISSION", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if entity_type not in allowed_values: + raise ValueError( + "Invalid value for `entity_type` ({0}), must be one of {1}" # noqa: E501 + .format(entity_type, allowed_values) + ) + + self._entity_type = entity_type + + @property + def id(self): + """Gets the id of this EntityId. # noqa: E501 + + + :return: The id of this EntityId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EntityId. + + + :param id: The id of this EntityId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_relation.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_relation.py new file mode 100644 index 0000000..c6253a6 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_relation.py @@ -0,0 +1,220 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityRelation(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + '_from': 'EntityId', + 'to': 'EntityId', + 'type': 'str', + 'type_group': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + '_from': 'from', + 'to': 'to', + 'type': 'type', + 'type_group': 'typeGroup' + } + + def __init__(self, additional_info=None, _from=None, to=None, type=None, type_group=None): # noqa: E501 + """EntityRelation - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self.__from = None + self._to = None + self._type = None + self._type_group = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if _from is not None: + self._from = _from + if to is not None: + self.to = to + if type is not None: + self.type = type + if type_group is not None: + self.type_group = type_group + + @property + def additional_info(self): + """Gets the additional_info of this EntityRelation. # noqa: E501 + + + :return: The additional_info of this EntityRelation. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this EntityRelation. + + + :param additional_info: The additional_info of this EntityRelation. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def _from(self): + """Gets the _from of this EntityRelation. # noqa: E501 + + + :return: The _from of this EntityRelation. # noqa: E501 + :rtype: EntityId + """ + return self.__from + + @_from.setter + def _from(self, _from): + """Sets the _from of this EntityRelation. + + + :param _from: The _from of this EntityRelation. # noqa: E501 + :type: EntityId + """ + + self.__from = _from + + @property + def to(self): + """Gets the to of this EntityRelation. # noqa: E501 + + + :return: The to of this EntityRelation. # noqa: E501 + :rtype: EntityId + """ + return self._to + + @to.setter + def to(self, to): + """Sets the to of this EntityRelation. + + + :param to: The to of this EntityRelation. # noqa: E501 + :type: EntityId + """ + + self._to = to + + @property + def type(self): + """Gets the type of this EntityRelation. # noqa: E501 + + + :return: The type of this EntityRelation. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntityRelation. + + + :param type: The type of this EntityRelation. # noqa: E501 + :type: str + """ + + self._type = type + + @property + def type_group(self): + """Gets the type_group of this EntityRelation. # noqa: E501 + + + :return: The type_group of this EntityRelation. # noqa: E501 + :rtype: str + """ + return self._type_group + + @type_group.setter + def type_group(self, type_group): + """Sets the type_group of this EntityRelation. + + + :param type_group: The type_group of this EntityRelation. # noqa: E501 + :type: str + """ + allowed_values = ["COMMON", "ALARM", "DASHBOARD", "TO_ENTITY_GROUP", "FROM_ENTITY_GROUP", "RULE_CHAIN", "RULE_NODE", "EDGE", "EDGE_AUTO_ASSIGN_RULE_CHAIN"] # noqa: E501 + if type_group not in allowed_values: + raise ValueError( + "Invalid value for `type_group` ({0}), must be one of {1}" # noqa: E501 + .format(type_group, allowed_values) + ) + + self._type_group = type_group + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityRelation, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityRelation): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_relation_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_relation_info.py new file mode 100644 index 0000000..66b64f4 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_relation_info.py @@ -0,0 +1,272 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityRelationInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + '_from': 'EntityId', + 'from_name': 'str', + 'to': 'EntityId', + 'to_name': 'str', + 'type': 'str', + 'type_group': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + '_from': 'from', + 'from_name': 'fromName', + 'to': 'to', + 'to_name': 'toName', + 'type': 'type', + 'type_group': 'typeGroup' + } + + def __init__(self, additional_info=None, _from=None, from_name=None, to=None, to_name=None, type=None, type_group=None): # noqa: E501 + """EntityRelationInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self.__from = None + self._from_name = None + self._to = None + self._to_name = None + self._type = None + self._type_group = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if _from is not None: + self._from = _from + if from_name is not None: + self.from_name = from_name + if to is not None: + self.to = to + if to_name is not None: + self.to_name = to_name + if type is not None: + self.type = type + if type_group is not None: + self.type_group = type_group + + @property + def additional_info(self): + """Gets the additional_info of this EntityRelationInfo. # noqa: E501 + + + :return: The additional_info of this EntityRelationInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this EntityRelationInfo. + + + :param additional_info: The additional_info of this EntityRelationInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def _from(self): + """Gets the _from of this EntityRelationInfo. # noqa: E501 + + + :return: The _from of this EntityRelationInfo. # noqa: E501 + :rtype: EntityId + """ + return self.__from + + @_from.setter + def _from(self, _from): + """Sets the _from of this EntityRelationInfo. + + + :param _from: The _from of this EntityRelationInfo. # noqa: E501 + :type: EntityId + """ + + self.__from = _from + + @property + def from_name(self): + """Gets the from_name of this EntityRelationInfo. # noqa: E501 + + + :return: The from_name of this EntityRelationInfo. # noqa: E501 + :rtype: str + """ + return self._from_name + + @from_name.setter + def from_name(self, from_name): + """Sets the from_name of this EntityRelationInfo. + + + :param from_name: The from_name of this EntityRelationInfo. # noqa: E501 + :type: str + """ + + self._from_name = from_name + + @property + def to(self): + """Gets the to of this EntityRelationInfo. # noqa: E501 + + + :return: The to of this EntityRelationInfo. # noqa: E501 + :rtype: EntityId + """ + return self._to + + @to.setter + def to(self, to): + """Sets the to of this EntityRelationInfo. + + + :param to: The to of this EntityRelationInfo. # noqa: E501 + :type: EntityId + """ + + self._to = to + + @property + def to_name(self): + """Gets the to_name of this EntityRelationInfo. # noqa: E501 + + + :return: The to_name of this EntityRelationInfo. # noqa: E501 + :rtype: str + """ + return self._to_name + + @to_name.setter + def to_name(self, to_name): + """Sets the to_name of this EntityRelationInfo. + + + :param to_name: The to_name of this EntityRelationInfo. # noqa: E501 + :type: str + """ + + self._to_name = to_name + + @property + def type(self): + """Gets the type of this EntityRelationInfo. # noqa: E501 + + + :return: The type of this EntityRelationInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntityRelationInfo. + + + :param type: The type of this EntityRelationInfo. # noqa: E501 + :type: str + """ + + self._type = type + + @property + def type_group(self): + """Gets the type_group of this EntityRelationInfo. # noqa: E501 + + + :return: The type_group of this EntityRelationInfo. # noqa: E501 + :rtype: str + """ + return self._type_group + + @type_group.setter + def type_group(self, type_group): + """Sets the type_group of this EntityRelationInfo. + + + :param type_group: The type_group of this EntityRelationInfo. # noqa: E501 + :type: str + """ + allowed_values = ["COMMON", "ALARM", "DASHBOARD", "TO_ENTITY_GROUP", "FROM_ENTITY_GROUP", "RULE_CHAIN", "RULE_NODE", "EDGE", "EDGE_AUTO_ASSIGN_RULE_CHAIN"] # noqa: E501 + if type_group not in allowed_values: + raise ValueError( + "Invalid value for `type_group` ({0}), must be one of {1}" # noqa: E501 + .format(type_group, allowed_values) + ) + + self._type_group = type_group + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityRelationInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityRelationInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_subtype.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_subtype.py new file mode 100644 index 0000000..d832ffe --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_subtype.py @@ -0,0 +1,168 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntitySubtype(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_type': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'entity_type': 'entityType', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, entity_type=None, tenant_id=None, type=None): # noqa: E501 + """EntitySubtype - a model defined in Swagger""" # noqa: E501 + self._entity_type = None + self._tenant_id = None + self._type = None + self.discriminator = None + if entity_type is not None: + self.entity_type = entity_type + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def entity_type(self): + """Gets the entity_type of this EntitySubtype. # noqa: E501 + + + :return: The entity_type of this EntitySubtype. # noqa: E501 + :rtype: str + """ + return self._entity_type + + @entity_type.setter + def entity_type(self, entity_type): + """Sets the entity_type of this EntitySubtype. + + + :param entity_type: The entity_type of this EntitySubtype. # noqa: E501 + :type: str + """ + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "ENTITY_GROUP", "CONVERTER", "INTEGRATION", "RULE_CHAIN", "RULE_NODE", "SCHEDULER_EVENT", "BLOB_ENTITY", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "ROLE", "GROUP_PERMISSION", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if entity_type not in allowed_values: + raise ValueError( + "Invalid value for `entity_type` ({0}), must be one of {1}" # noqa: E501 + .format(entity_type, allowed_values) + ) + + self._entity_type = entity_type + + @property + def tenant_id(self): + """Gets the tenant_id of this EntitySubtype. # noqa: E501 + + + :return: The tenant_id of this EntitySubtype. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this EntitySubtype. + + + :param tenant_id: The tenant_id of this EntitySubtype. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this EntitySubtype. # noqa: E501 + + + :return: The type of this EntitySubtype. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntitySubtype. + + + :param type: The type of this EntitySubtype. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntitySubtype, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntitySubtype): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_view.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_view.py new file mode 100644 index 0000000..d42ed0a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_view.py @@ -0,0 +1,396 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityView(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'end_time_ms': 'int', + 'entity_id': 'EntityId', + 'id': 'EntityViewId', + 'keys': 'TelemetryEntityView', + 'name': 'str', + 'owner_id': 'EntityId', + 'start_time_ms': 'int', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'end_time_ms': 'endTimeMs', + 'entity_id': 'entityId', + 'id': 'id', + 'keys': 'keys', + 'name': 'name', + 'owner_id': 'ownerId', + 'start_time_ms': 'startTimeMs', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, created_time=None, customer_id=None, end_time_ms=None, entity_id=None, id=None, keys=None, name=None, owner_id=None, start_time_ms=None, tenant_id=None, type=None): # noqa: E501 + """EntityView - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._customer_id = None + self._end_time_ms = None + self._entity_id = None + self._id = None + self._keys = None + self._name = None + self._owner_id = None + self._start_time_ms = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if end_time_ms is not None: + self.end_time_ms = end_time_ms + if entity_id is not None: + self.entity_id = entity_id + if id is not None: + self.id = id + if keys is not None: + self.keys = keys + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if start_time_ms is not None: + self.start_time_ms = start_time_ms + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this EntityView. # noqa: E501 + + + :return: The additional_info of this EntityView. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this EntityView. + + + :param additional_info: The additional_info of this EntityView. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this EntityView. # noqa: E501 + + + :return: The created_time of this EntityView. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this EntityView. + + + :param created_time: The created_time of this EntityView. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this EntityView. # noqa: E501 + + + :return: The customer_id of this EntityView. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this EntityView. + + + :param customer_id: The customer_id of this EntityView. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def end_time_ms(self): + """Gets the end_time_ms of this EntityView. # noqa: E501 + + + :return: The end_time_ms of this EntityView. # noqa: E501 + :rtype: int + """ + return self._end_time_ms + + @end_time_ms.setter + def end_time_ms(self, end_time_ms): + """Sets the end_time_ms of this EntityView. + + + :param end_time_ms: The end_time_ms of this EntityView. # noqa: E501 + :type: int + """ + + self._end_time_ms = end_time_ms + + @property + def entity_id(self): + """Gets the entity_id of this EntityView. # noqa: E501 + + + :return: The entity_id of this EntityView. # noqa: E501 + :rtype: EntityId + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this EntityView. + + + :param entity_id: The entity_id of this EntityView. # noqa: E501 + :type: EntityId + """ + + self._entity_id = entity_id + + @property + def id(self): + """Gets the id of this EntityView. # noqa: E501 + + + :return: The id of this EntityView. # noqa: E501 + :rtype: EntityViewId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EntityView. + + + :param id: The id of this EntityView. # noqa: E501 + :type: EntityViewId + """ + + self._id = id + + @property + def keys(self): + """Gets the keys of this EntityView. # noqa: E501 + + + :return: The keys of this EntityView. # noqa: E501 + :rtype: TelemetryEntityView + """ + return self._keys + + @keys.setter + def keys(self, keys): + """Sets the keys of this EntityView. + + + :param keys: The keys of this EntityView. # noqa: E501 + :type: TelemetryEntityView + """ + + self._keys = keys + + @property + def name(self): + """Gets the name of this EntityView. # noqa: E501 + + + :return: The name of this EntityView. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this EntityView. + + + :param name: The name of this EntityView. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this EntityView. # noqa: E501 + + + :return: The owner_id of this EntityView. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this EntityView. + + + :param owner_id: The owner_id of this EntityView. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def start_time_ms(self): + """Gets the start_time_ms of this EntityView. # noqa: E501 + + + :return: The start_time_ms of this EntityView. # noqa: E501 + :rtype: int + """ + return self._start_time_ms + + @start_time_ms.setter + def start_time_ms(self, start_time_ms): + """Sets the start_time_ms of this EntityView. + + + :param start_time_ms: The start_time_ms of this EntityView. # noqa: E501 + :type: int + """ + + self._start_time_ms = start_time_ms + + @property + def tenant_id(self): + """Gets the tenant_id of this EntityView. # noqa: E501 + + + :return: The tenant_id of this EntityView. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this EntityView. + + + :param tenant_id: The tenant_id of this EntityView. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this EntityView. # noqa: E501 + + + :return: The type of this EntityView. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this EntityView. + + + :param type: The type of this EntityView. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityView, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityView): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_view_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_view_id.py new file mode 100644 index 0000000..159ec62 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/entity_view_id.py @@ -0,0 +1,143 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class EntityViewId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_type': 'str', + 'id': 'str' + } + + attribute_map = { + 'entity_type': 'entityType', + 'id': 'id' + } + + def __init__(self, entity_type=None, id=None): # noqa: E501 + """EntityViewId - a model defined in Swagger""" # noqa: E501 + self._entity_type = None + self._id = None + self.discriminator = None + if entity_type is not None: + self.entity_type = entity_type + self.id = id + + @property + def entity_type(self): + """Gets the entity_type of this EntityViewId. # noqa: E501 + + + :return: The entity_type of this EntityViewId. # noqa: E501 + :rtype: str + """ + return self._entity_type + + @entity_type.setter + def entity_type(self, entity_type): + """Sets the entity_type of this EntityViewId. + + + :param entity_type: The entity_type of this EntityViewId. # noqa: E501 + :type: str + """ + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "ENTITY_GROUP", "CONVERTER", "INTEGRATION", "RULE_CHAIN", "RULE_NODE", "SCHEDULER_EVENT", "BLOB_ENTITY", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "ROLE", "GROUP_PERMISSION", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if entity_type not in allowed_values: + raise ValueError( + "Invalid value for `entity_type` ({0}), must be one of {1}" # noqa: E501 + .format(entity_type, allowed_values) + ) + + self._entity_type = entity_type + + @property + def id(self): + """Gets the id of this EntityViewId. # noqa: E501 + + + :return: The id of this EntityViewId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this EntityViewId. + + + :param id: The id of this EntityViewId. # noqa: E501 + :type: str + """ + if id is None: + raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(EntityViewId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, EntityViewId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/favicon.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/favicon.py new file mode 100644 index 0000000..dd7b88e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/favicon.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Favicon(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'type': 'str', + 'url': 'str' + } + + attribute_map = { + 'type': 'type', + 'url': 'url' + } + + def __init__(self, type=None, url=None): # noqa: E501 + """Favicon - a model defined in Swagger""" # noqa: E501 + self._type = None + self._url = None + self.discriminator = None + if type is not None: + self.type = type + if url is not None: + self.url = url + + @property + def type(self): + """Gets the type of this Favicon. # noqa: E501 + + + :return: The type of this Favicon. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Favicon. + + + :param type: The type of this Favicon. # noqa: E501 + :type: str + """ + + self._type = type + + @property + def url(self): + """Gets the url of this Favicon. # noqa: E501 + + + :return: The url of this Favicon. # noqa: E501 + :rtype: str + """ + return self._url + + @url.setter + def url(self, url): + """Sets the url of this Favicon. + + + :param url: The url of this Favicon. # noqa: E501 + :type: str + """ + + self._url = url + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Favicon, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Favicon): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/group_permission.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/group_permission.py new file mode 100644 index 0000000..be3a228 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/group_permission.py @@ -0,0 +1,351 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class GroupPermission(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'created_time': 'int', + 'entity_group_id': 'EntityGroupId', + 'entity_group_type': 'str', + 'id': 'GroupPermissionId', + 'name': 'str', + 'public': 'bool', + 'role_id': 'RoleId', + 'tenant_id': 'TenantId', + 'user_group_id': 'EntityGroupId', + 'is_public': 'bool' + } + + attribute_map = { + 'created_time': 'createdTime', + 'entity_group_id': 'entityGroupId', + 'entity_group_type': 'entityGroupType', + 'id': 'id', + 'name': 'name', + 'public': 'public', + 'role_id': 'roleId', + 'tenant_id': 'tenantId', + 'user_group_id': 'userGroupId', + 'is_public': 'isPublic' + } + + def __init__(self, created_time=None, entity_group_id=None, entity_group_type=None, id=None, name=None, public=None, role_id=None, tenant_id=None, user_group_id=None, is_public=None): # noqa: E501 + """GroupPermission - a model defined in Swagger""" # noqa: E501 + self._created_time = None + self._entity_group_id = None + self._entity_group_type = None + self._id = None + self._name = None + self._public = None + self._role_id = None + self._tenant_id = None + self._user_group_id = None + self._is_public = None + self.discriminator = None + if created_time is not None: + self.created_time = created_time + if entity_group_id is not None: + self.entity_group_id = entity_group_id + if entity_group_type is not None: + self.entity_group_type = entity_group_type + if id is not None: + self.id = id + if name is not None: + self.name = name + if public is not None: + self.public = public + if role_id is not None: + self.role_id = role_id + if tenant_id is not None: + self.tenant_id = tenant_id + if user_group_id is not None: + self.user_group_id = user_group_id + self.is_public = is_public + + @property + def created_time(self): + """Gets the created_time of this GroupPermission. # noqa: E501 + + + :return: The created_time of this GroupPermission. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this GroupPermission. + + + :param created_time: The created_time of this GroupPermission. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def entity_group_id(self): + """Gets the entity_group_id of this GroupPermission. # noqa: E501 + + + :return: The entity_group_id of this GroupPermission. # noqa: E501 + :rtype: EntityGroupId + """ + return self._entity_group_id + + @entity_group_id.setter + def entity_group_id(self, entity_group_id): + """Sets the entity_group_id of this GroupPermission. + + + :param entity_group_id: The entity_group_id of this GroupPermission. # noqa: E501 + :type: EntityGroupId + """ + + self._entity_group_id = entity_group_id + + @property + def entity_group_type(self): + """Gets the entity_group_type of this GroupPermission. # noqa: E501 + + + :return: The entity_group_type of this GroupPermission. # noqa: E501 + :rtype: str + """ + return self._entity_group_type + + @entity_group_type.setter + def entity_group_type(self, entity_group_type): + """Sets the entity_group_type of this GroupPermission. + + + :param entity_group_type: The entity_group_type of this GroupPermission. # noqa: E501 + :type: str + """ + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "ENTITY_GROUP", "CONVERTER", "INTEGRATION", "RULE_CHAIN", "RULE_NODE", "SCHEDULER_EVENT", "BLOB_ENTITY", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "ROLE", "GROUP_PERMISSION", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if entity_group_type not in allowed_values: + raise ValueError( + "Invalid value for `entity_group_type` ({0}), must be one of {1}" # noqa: E501 + .format(entity_group_type, allowed_values) + ) + + self._entity_group_type = entity_group_type + + @property + def id(self): + """Gets the id of this GroupPermission. # noqa: E501 + + + :return: The id of this GroupPermission. # noqa: E501 + :rtype: GroupPermissionId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this GroupPermission. + + + :param id: The id of this GroupPermission. # noqa: E501 + :type: GroupPermissionId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this GroupPermission. # noqa: E501 + + + :return: The name of this GroupPermission. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this GroupPermission. + + + :param name: The name of this GroupPermission. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def public(self): + """Gets the public of this GroupPermission. # noqa: E501 + + + :return: The public of this GroupPermission. # noqa: E501 + :rtype: bool + """ + return self._public + + @public.setter + def public(self, public): + """Sets the public of this GroupPermission. + + + :param public: The public of this GroupPermission. # noqa: E501 + :type: bool + """ + + self._public = public + + @property + def role_id(self): + """Gets the role_id of this GroupPermission. # noqa: E501 + + + :return: The role_id of this GroupPermission. # noqa: E501 + :rtype: RoleId + """ + return self._role_id + + @role_id.setter + def role_id(self, role_id): + """Sets the role_id of this GroupPermission. + + + :param role_id: The role_id of this GroupPermission. # noqa: E501 + :type: RoleId + """ + + self._role_id = role_id + + @property + def tenant_id(self): + """Gets the tenant_id of this GroupPermission. # noqa: E501 + + + :return: The tenant_id of this GroupPermission. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this GroupPermission. + + + :param tenant_id: The tenant_id of this GroupPermission. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def user_group_id(self): + """Gets the user_group_id of this GroupPermission. # noqa: E501 + + + :return: The user_group_id of this GroupPermission. # noqa: E501 + :rtype: EntityGroupId + """ + return self._user_group_id + + @user_group_id.setter + def user_group_id(self, user_group_id): + """Sets the user_group_id of this GroupPermission. + + + :param user_group_id: The user_group_id of this GroupPermission. # noqa: E501 + :type: EntityGroupId + """ + + self._user_group_id = user_group_id + + @property + def is_public(self): + """Gets the is_public of this GroupPermission. # noqa: E501 + + + :return: The is_public of this GroupPermission. # noqa: E501 + :rtype: bool + """ + return self._is_public + + @is_public.setter + def is_public(self, is_public): + """Sets the is_public of this GroupPermission. + + + :param is_public: The is_public of this GroupPermission. # noqa: E501 + :type: bool + """ + if is_public is None: + raise ValueError("Invalid value for `is_public`, must not be `None`") # noqa: E501 + + self._is_public = is_public + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(GroupPermission, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, GroupPermission): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/group_permission_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/group_permission_id.py new file mode 100644 index 0000000..9702575 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/group_permission_id.py @@ -0,0 +1,143 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + + +class GroupPermissionId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_type': 'str', + 'id': 'str' + } + + attribute_map = { + 'entity_type': 'entityType', + 'id': 'id' + } + + def __init__(self, entity_type=None, id=None): # noqa: E501 + """GroupPermissionId - a model defined in Swagger""" # noqa: E501 + self._entity_type = None + self._id = None + self.discriminator = None + if entity_type is not None: + self.entity_type = entity_type + if id is not None: + self.id = id + + @property + def entity_type(self): + """Gets the entity_type of this GroupPermissionId. # noqa: E501 + + + :return: The entity_type of this GroupPermissionId. # noqa: E501 + :rtype: str + """ + return self._entity_type + + @entity_type.setter + def entity_type(self, entity_type): + """Sets the entity_type of this GroupPermissionId. + + + :param entity_type: The entity_type of this GroupPermissionId. # noqa: E501 + :type: str + """ + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "ENTITY_GROUP", "CONVERTER", "INTEGRATION", "RULE_CHAIN", "RULE_NODE", "SCHEDULER_EVENT", "BLOB_ENTITY", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "ROLE", "GROUP_PERMISSION", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if entity_type not in allowed_values: + raise ValueError( + "Invalid value for `entity_type` ({0}), must be one of {1}" # noqa: E501 + .format(entity_type, allowed_values) + ) + + self._entity_type = entity_type + + @property + def id(self): + """Gets the id of this GroupPermissionId. # noqa: E501 + + + :return: The id of this GroupPermissionId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this GroupPermissionId. + + + :param id: The id of this GroupPermissionId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(GroupPermissionId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, GroupPermissionId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/group_permission_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/group_permission_info.py new file mode 100644 index 0000000..76ac635 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/group_permission_info.py @@ -0,0 +1,532 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class GroupPermissionInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'created_time': 'int', + 'entity_group_id': 'EntityGroupId', + 'entity_group_name': 'str', + 'entity_group_owner_id': 'EntityId', + 'entity_group_owner_name': 'str', + 'entity_group_type': 'str', + 'id': 'GroupPermissionId', + 'name': 'str', + 'public': 'bool', + 'read_only': 'bool', + 'role': 'Role', + 'role_id': 'RoleId', + 'tenant_id': 'TenantId', + 'user_group_id': 'EntityGroupId', + 'user_group_name': 'str', + 'user_group_owner_id': 'EntityId', + 'user_group_owner_name': 'str' + } + + attribute_map = { + 'created_time': 'createdTime', + 'entity_group_id': 'entityGroupId', + 'entity_group_name': 'entityGroupName', + 'entity_group_owner_id': 'entityGroupOwnerId', + 'entity_group_owner_name': 'entityGroupOwnerName', + 'entity_group_type': 'entityGroupType', + 'id': 'id', + 'name': 'name', + 'public': 'public', + 'read_only': 'readOnly', + 'role': 'role', + 'role_id': 'roleId', + 'tenant_id': 'tenantId', + 'user_group_id': 'userGroupId', + 'user_group_name': 'userGroupName', + 'user_group_owner_id': 'userGroupOwnerId', + 'user_group_owner_name': 'userGroupOwnerName' + } + + def __init__(self, created_time=None, entity_group_id=None, entity_group_name=None, entity_group_owner_id=None, entity_group_owner_name=None, entity_group_type=None, id=None, name=None, public=None, read_only=None, role=None, role_id=None, tenant_id=None, user_group_id=None, user_group_name=None, user_group_owner_id=None, user_group_owner_name=None): # noqa: E501 + """GroupPermissionInfo - a model defined in Swagger""" # noqa: E501 + self._created_time = None + self._entity_group_id = None + self._entity_group_name = None + self._entity_group_owner_id = None + self._entity_group_owner_name = None + self._entity_group_type = None + self._id = None + self._name = None + self._public = None + self._read_only = None + self._role = None + self._role_id = None + self._tenant_id = None + self._user_group_id = None + self._user_group_name = None + self._user_group_owner_id = None + self._user_group_owner_name = None + self.discriminator = None + if created_time is not None: + self.created_time = created_time + if entity_group_id is not None: + self.entity_group_id = entity_group_id + if entity_group_name is not None: + self.entity_group_name = entity_group_name + if entity_group_owner_id is not None: + self.entity_group_owner_id = entity_group_owner_id + if entity_group_owner_name is not None: + self.entity_group_owner_name = entity_group_owner_name + if entity_group_type is not None: + self.entity_group_type = entity_group_type + if id is not None: + self.id = id + if name is not None: + self.name = name + if public is not None: + self.public = public + if read_only is not None: + self.read_only = read_only + if role is not None: + self.role = role + if role_id is not None: + self.role_id = role_id + if tenant_id is not None: + self.tenant_id = tenant_id + if user_group_id is not None: + self.user_group_id = user_group_id + if user_group_name is not None: + self.user_group_name = user_group_name + if user_group_owner_id is not None: + self.user_group_owner_id = user_group_owner_id + if user_group_owner_name is not None: + self.user_group_owner_name = user_group_owner_name + + @property + def created_time(self): + """Gets the created_time of this GroupPermissionInfo. # noqa: E501 + + + :return: The created_time of this GroupPermissionInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this GroupPermissionInfo. + + + :param created_time: The created_time of this GroupPermissionInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def entity_group_id(self): + """Gets the entity_group_id of this GroupPermissionInfo. # noqa: E501 + + + :return: The entity_group_id of this GroupPermissionInfo. # noqa: E501 + :rtype: EntityGroupId + """ + return self._entity_group_id + + @entity_group_id.setter + def entity_group_id(self, entity_group_id): + """Sets the entity_group_id of this GroupPermissionInfo. + + + :param entity_group_id: The entity_group_id of this GroupPermissionInfo. # noqa: E501 + :type: EntityGroupId + """ + + self._entity_group_id = entity_group_id + + @property + def entity_group_name(self): + """Gets the entity_group_name of this GroupPermissionInfo. # noqa: E501 + + + :return: The entity_group_name of this GroupPermissionInfo. # noqa: E501 + :rtype: str + """ + return self._entity_group_name + + @entity_group_name.setter + def entity_group_name(self, entity_group_name): + """Sets the entity_group_name of this GroupPermissionInfo. + + + :param entity_group_name: The entity_group_name of this GroupPermissionInfo. # noqa: E501 + :type: str + """ + + self._entity_group_name = entity_group_name + + @property + def entity_group_owner_id(self): + """Gets the entity_group_owner_id of this GroupPermissionInfo. # noqa: E501 + + + :return: The entity_group_owner_id of this GroupPermissionInfo. # noqa: E501 + :rtype: EntityId + """ + return self._entity_group_owner_id + + @entity_group_owner_id.setter + def entity_group_owner_id(self, entity_group_owner_id): + """Sets the entity_group_owner_id of this GroupPermissionInfo. + + + :param entity_group_owner_id: The entity_group_owner_id of this GroupPermissionInfo. # noqa: E501 + :type: EntityId + """ + + self._entity_group_owner_id = entity_group_owner_id + + @property + def entity_group_owner_name(self): + """Gets the entity_group_owner_name of this GroupPermissionInfo. # noqa: E501 + + + :return: The entity_group_owner_name of this GroupPermissionInfo. # noqa: E501 + :rtype: str + """ + return self._entity_group_owner_name + + @entity_group_owner_name.setter + def entity_group_owner_name(self, entity_group_owner_name): + """Sets the entity_group_owner_name of this GroupPermissionInfo. + + + :param entity_group_owner_name: The entity_group_owner_name of this GroupPermissionInfo. # noqa: E501 + :type: str + """ + + self._entity_group_owner_name = entity_group_owner_name + + @property + def entity_group_type(self): + """Gets the entity_group_type of this GroupPermissionInfo. # noqa: E501 + + + :return: The entity_group_type of this GroupPermissionInfo. # noqa: E501 + :rtype: str + """ + return self._entity_group_type + + @entity_group_type.setter + def entity_group_type(self, entity_group_type): + """Sets the entity_group_type of this GroupPermissionInfo. + + + :param entity_group_type: The entity_group_type of this GroupPermissionInfo. # noqa: E501 + :type: str + """ + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "ENTITY_GROUP", "CONVERTER", "INTEGRATION", "RULE_CHAIN", "RULE_NODE", "SCHEDULER_EVENT", "BLOB_ENTITY", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "ROLE", "GROUP_PERMISSION", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if entity_group_type not in allowed_values: + raise ValueError( + "Invalid value for `entity_group_type` ({0}), must be one of {1}" # noqa: E501 + .format(entity_group_type, allowed_values) + ) + + self._entity_group_type = entity_group_type + + @property + def id(self): + """Gets the id of this GroupPermissionInfo. # noqa: E501 + + + :return: The id of this GroupPermissionInfo. # noqa: E501 + :rtype: GroupPermissionId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this GroupPermissionInfo. + + + :param id: The id of this GroupPermissionInfo. # noqa: E501 + :type: GroupPermissionId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this GroupPermissionInfo. # noqa: E501 + + + :return: The name of this GroupPermissionInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this GroupPermissionInfo. + + + :param name: The name of this GroupPermissionInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def public(self): + """Gets the public of this GroupPermissionInfo. # noqa: E501 + + + :return: The public of this GroupPermissionInfo. # noqa: E501 + :rtype: bool + """ + return self._public + + @public.setter + def public(self, public): + """Sets the public of this GroupPermissionInfo. + + + :param public: The public of this GroupPermissionInfo. # noqa: E501 + :type: bool + """ + + self._public = public + + @property + def read_only(self): + """Gets the read_only of this GroupPermissionInfo. # noqa: E501 + + + :return: The read_only of this GroupPermissionInfo. # noqa: E501 + :rtype: bool + """ + return self._read_only + + @read_only.setter + def read_only(self, read_only): + """Sets the read_only of this GroupPermissionInfo. + + + :param read_only: The read_only of this GroupPermissionInfo. # noqa: E501 + :type: bool + """ + + self._read_only = read_only + + @property + def role(self): + """Gets the role of this GroupPermissionInfo. # noqa: E501 + + + :return: The role of this GroupPermissionInfo. # noqa: E501 + :rtype: Role + """ + return self._role + + @role.setter + def role(self, role): + """Sets the role of this GroupPermissionInfo. + + + :param role: The role of this GroupPermissionInfo. # noqa: E501 + :type: Role + """ + + self._role = role + + @property + def role_id(self): + """Gets the role_id of this GroupPermissionInfo. # noqa: E501 + + + :return: The role_id of this GroupPermissionInfo. # noqa: E501 + :rtype: RoleId + """ + return self._role_id + + @role_id.setter + def role_id(self, role_id): + """Sets the role_id of this GroupPermissionInfo. + + + :param role_id: The role_id of this GroupPermissionInfo. # noqa: E501 + :type: RoleId + """ + + self._role_id = role_id + + @property + def tenant_id(self): + """Gets the tenant_id of this GroupPermissionInfo. # noqa: E501 + + + :return: The tenant_id of this GroupPermissionInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this GroupPermissionInfo. + + + :param tenant_id: The tenant_id of this GroupPermissionInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def user_group_id(self): + """Gets the user_group_id of this GroupPermissionInfo. # noqa: E501 + + + :return: The user_group_id of this GroupPermissionInfo. # noqa: E501 + :rtype: EntityGroupId + """ + return self._user_group_id + + @user_group_id.setter + def user_group_id(self, user_group_id): + """Sets the user_group_id of this GroupPermissionInfo. + + + :param user_group_id: The user_group_id of this GroupPermissionInfo. # noqa: E501 + :type: EntityGroupId + """ + + self._user_group_id = user_group_id + + @property + def user_group_name(self): + """Gets the user_group_name of this GroupPermissionInfo. # noqa: E501 + + + :return: The user_group_name of this GroupPermissionInfo. # noqa: E501 + :rtype: str + """ + return self._user_group_name + + @user_group_name.setter + def user_group_name(self, user_group_name): + """Sets the user_group_name of this GroupPermissionInfo. + + + :param user_group_name: The user_group_name of this GroupPermissionInfo. # noqa: E501 + :type: str + """ + + self._user_group_name = user_group_name + + @property + def user_group_owner_id(self): + """Gets the user_group_owner_id of this GroupPermissionInfo. # noqa: E501 + + + :return: The user_group_owner_id of this GroupPermissionInfo. # noqa: E501 + :rtype: EntityId + """ + return self._user_group_owner_id + + @user_group_owner_id.setter + def user_group_owner_id(self, user_group_owner_id): + """Sets the user_group_owner_id of this GroupPermissionInfo. + + + :param user_group_owner_id: The user_group_owner_id of this GroupPermissionInfo. # noqa: E501 + :type: EntityId + """ + + self._user_group_owner_id = user_group_owner_id + + @property + def user_group_owner_name(self): + """Gets the user_group_owner_name of this GroupPermissionInfo. # noqa: E501 + + + :return: The user_group_owner_name of this GroupPermissionInfo. # noqa: E501 + :rtype: str + """ + return self._user_group_owner_name + + @user_group_owner_name.setter + def user_group_owner_name(self, user_group_owner_name): + """Sets the user_group_owner_name of this GroupPermissionInfo. + + + :param user_group_owner_name: The user_group_owner_name of this GroupPermissionInfo. # noqa: E501 + :type: str + """ + + self._user_group_owner_name = user_group_owner_name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(GroupPermissionInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, GroupPermissionInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/home_dashboard.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/home_dashboard.py new file mode 100644 index 0000000..9e3d9ae --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/home_dashboard.py @@ -0,0 +1,396 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class HomeDashboard(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'assigned_customers': 'list[ShortCustomerInfo]', + 'configuration': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'hide_dashboard_toolbar': 'bool', + 'image': 'str', + 'mobile_hide': 'bool', + 'mobile_order': 'int', + 'name': 'str', + 'owner_id': 'EntityId', + 'tenant_id': 'TenantId', + 'title': 'str' + } + + attribute_map = { + 'assigned_customers': 'assignedCustomers', + 'configuration': 'configuration', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'hide_dashboard_toolbar': 'hideDashboardToolbar', + 'image': 'image', + 'mobile_hide': 'mobileHide', + 'mobile_order': 'mobileOrder', + 'name': 'name', + 'owner_id': 'ownerId', + 'tenant_id': 'tenantId', + 'title': 'title' + } + + def __init__(self, assigned_customers=None, configuration=None, created_time=None, customer_id=None, hide_dashboard_toolbar=None, image=None, mobile_hide=None, mobile_order=None, name=None, owner_id=None, tenant_id=None, title=None): # noqa: E501 + """HomeDashboard - a model defined in Swagger""" # noqa: E501 + self._assigned_customers = None + self._configuration = None + self._created_time = None + self._customer_id = None + self._hide_dashboard_toolbar = None + self._image = None + self._mobile_hide = None + self._mobile_order = None + self._name = None + self._owner_id = None + self._tenant_id = None + self._title = None + self.discriminator = None + if assigned_customers is not None: + self.assigned_customers = assigned_customers + if configuration is not None: + self.configuration = configuration + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if hide_dashboard_toolbar is not None: + self.hide_dashboard_toolbar = hide_dashboard_toolbar + if image is not None: + self.image = image + if mobile_hide is not None: + self.mobile_hide = mobile_hide + if mobile_order is not None: + self.mobile_order = mobile_order + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if tenant_id is not None: + self.tenant_id = tenant_id + if title is not None: + self.title = title + + @property + def assigned_customers(self): + """Gets the assigned_customers of this HomeDashboard. # noqa: E501 + + + :return: The assigned_customers of this HomeDashboard. # noqa: E501 + :rtype: list[ShortCustomerInfo] + """ + return self._assigned_customers + + @assigned_customers.setter + def assigned_customers(self, assigned_customers): + """Sets the assigned_customers of this HomeDashboard. + + + :param assigned_customers: The assigned_customers of this HomeDashboard. # noqa: E501 + :type: list[ShortCustomerInfo] + """ + + self._assigned_customers = assigned_customers + + @property + def configuration(self): + """Gets the configuration of this HomeDashboard. # noqa: E501 + + + :return: The configuration of this HomeDashboard. # noqa: E501 + :rtype: str + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this HomeDashboard. + + + :param configuration: The configuration of this HomeDashboard. # noqa: E501 + :type: str + """ + + self._configuration = configuration + + @property + def created_time(self): + """Gets the created_time of this HomeDashboard. # noqa: E501 + + + :return: The created_time of this HomeDashboard. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this HomeDashboard. + + + :param created_time: The created_time of this HomeDashboard. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this HomeDashboard. # noqa: E501 + + + :return: The customer_id of this HomeDashboard. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this HomeDashboard. + + + :param customer_id: The customer_id of this HomeDashboard. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def hide_dashboard_toolbar(self): + """Gets the hide_dashboard_toolbar of this HomeDashboard. # noqa: E501 + + + :return: The hide_dashboard_toolbar of this HomeDashboard. # noqa: E501 + :rtype: bool + """ + return self._hide_dashboard_toolbar + + @hide_dashboard_toolbar.setter + def hide_dashboard_toolbar(self, hide_dashboard_toolbar): + """Sets the hide_dashboard_toolbar of this HomeDashboard. + + + :param hide_dashboard_toolbar: The hide_dashboard_toolbar of this HomeDashboard. # noqa: E501 + :type: bool + """ + + self._hide_dashboard_toolbar = hide_dashboard_toolbar + + @property + def image(self): + """Gets the image of this HomeDashboard. # noqa: E501 + + + :return: The image of this HomeDashboard. # noqa: E501 + :rtype: str + """ + return self._image + + @image.setter + def image(self, image): + """Sets the image of this HomeDashboard. + + + :param image: The image of this HomeDashboard. # noqa: E501 + :type: str + """ + + self._image = image + + @property + def mobile_hide(self): + """Gets the mobile_hide of this HomeDashboard. # noqa: E501 + + + :return: The mobile_hide of this HomeDashboard. # noqa: E501 + :rtype: bool + """ + return self._mobile_hide + + @mobile_hide.setter + def mobile_hide(self, mobile_hide): + """Sets the mobile_hide of this HomeDashboard. + + + :param mobile_hide: The mobile_hide of this HomeDashboard. # noqa: E501 + :type: bool + """ + + self._mobile_hide = mobile_hide + + @property + def mobile_order(self): + """Gets the mobile_order of this HomeDashboard. # noqa: E501 + + + :return: The mobile_order of this HomeDashboard. # noqa: E501 + :rtype: int + """ + return self._mobile_order + + @mobile_order.setter + def mobile_order(self, mobile_order): + """Sets the mobile_order of this HomeDashboard. + + + :param mobile_order: The mobile_order of this HomeDashboard. # noqa: E501 + :type: int + """ + + self._mobile_order = mobile_order + + @property + def name(self): + """Gets the name of this HomeDashboard. # noqa: E501 + + + :return: The name of this HomeDashboard. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this HomeDashboard. + + + :param name: The name of this HomeDashboard. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this HomeDashboard. # noqa: E501 + + + :return: The owner_id of this HomeDashboard. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this HomeDashboard. + + + :param owner_id: The owner_id of this HomeDashboard. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def tenant_id(self): + """Gets the tenant_id of this HomeDashboard. # noqa: E501 + + + :return: The tenant_id of this HomeDashboard. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this HomeDashboard. + + + :param tenant_id: The tenant_id of this HomeDashboard. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def title(self): + """Gets the title of this HomeDashboard. # noqa: E501 + + + :return: The title of this HomeDashboard. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this HomeDashboard. + + + :param title: The title of this HomeDashboard. # noqa: E501 + :type: str + """ + + self._title = title + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(HomeDashboard, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, HomeDashboard): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/http_routing_key_body.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/http_routing_key_body.py new file mode 100644 index 0000000..a210c00 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/http_routing_key_body.py @@ -0,0 +1,113 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class HttpRoutingKeyBody(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'request_params': 'Object' + } + + attribute_map = { + 'request_params': 'requestParams' + } + + def __init__(self, request_params=None): # noqa: E501 + """HttpRoutingKeyBody - a model defined in Swagger""" # noqa: E501 + self._request_params = None + self.discriminator = None + self.request_params = request_params + + @property + def request_params(self): + """Gets the request_params of this HttpRoutingKeyBody. # noqa: E501 + + requestParams # noqa: E501 + + :return: The request_params of this HttpRoutingKeyBody. # noqa: E501 + :rtype: Object + """ + return self._request_params + + @request_params.setter + def request_params(self, request_params): + """Sets the request_params of this HttpRoutingKeyBody. + + requestParams # noqa: E501 + + :param request_params: The request_params of this HttpRoutingKeyBody. # noqa: E501 + :type: Object + """ + if request_params is None: + raise ValueError("Invalid value for `request_params`, must not be `None`") # noqa: E501 + + self._request_params = request_params + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(HttpRoutingKeyBody, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, HttpRoutingKeyBody): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/integration.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/integration.py new file mode 100644 index 0000000..12212c0 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/integration.py @@ -0,0 +1,480 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Integration(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'allow_create_devices_or_assets': 'bool', + 'configuration': 'str', + 'created_time': 'int', + 'debug_mode': 'bool', + 'default_converter_id': 'ConverterId', + 'downlink_converter_id': 'ConverterId', + 'enabled': 'bool', + 'id': 'IntegrationId', + 'name': 'str', + 'remote': 'bool', + 'routing_key': 'str', + 'secret': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'allow_create_devices_or_assets': 'allowCreateDevicesOrAssets', + 'configuration': 'configuration', + 'created_time': 'createdTime', + 'debug_mode': 'debugMode', + 'default_converter_id': 'defaultConverterId', + 'downlink_converter_id': 'downlinkConverterId', + 'enabled': 'enabled', + 'id': 'id', + 'name': 'name', + 'remote': 'remote', + 'routing_key': 'routingKey', + 'secret': 'secret', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, allow_create_devices_or_assets=None, configuration=None, created_time=None, debug_mode=None, default_converter_id=None, downlink_converter_id=None, enabled=None, id=None, name=None, remote=None, routing_key=None, secret=None, tenant_id=None, type=None): # noqa: E501 + """Integration - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._allow_create_devices_or_assets = None + self._configuration = None + self._created_time = None + self._debug_mode = None + self._default_converter_id = None + self._downlink_converter_id = None + self._enabled = None + self._id = None + self._name = None + self._remote = None + self._routing_key = None + self._secret = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if allow_create_devices_or_assets is not None: + self.allow_create_devices_or_assets = allow_create_devices_or_assets + if configuration is not None: + self.configuration = configuration + if created_time is not None: + self.created_time = created_time + if debug_mode is not None: + self.debug_mode = debug_mode + if default_converter_id is not None: + self.default_converter_id = default_converter_id + if downlink_converter_id is not None: + self.downlink_converter_id = downlink_converter_id + if enabled is not None: + self.enabled = enabled + if id is not None: + self.id = id + if name is not None: + self.name = name + if remote is not None: + self.remote = remote + if routing_key is not None: + self.routing_key = routing_key + if secret is not None: + self.secret = secret + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this Integration. # noqa: E501 + + + :return: The additional_info of this Integration. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Integration. + + + :param additional_info: The additional_info of this Integration. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def allow_create_devices_or_assets(self): + """Gets the allow_create_devices_or_assets of this Integration. # noqa: E501 + + + :return: The allow_create_devices_or_assets of this Integration. # noqa: E501 + :rtype: bool + """ + return self._allow_create_devices_or_assets + + @allow_create_devices_or_assets.setter + def allow_create_devices_or_assets(self, allow_create_devices_or_assets): + """Sets the allow_create_devices_or_assets of this Integration. + + + :param allow_create_devices_or_assets: The allow_create_devices_or_assets of this Integration. # noqa: E501 + :type: bool + """ + + self._allow_create_devices_or_assets = allow_create_devices_or_assets + + @property + def configuration(self): + """Gets the configuration of this Integration. # noqa: E501 + + + :return: The configuration of this Integration. # noqa: E501 + :rtype: str + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this Integration. + + + :param configuration: The configuration of this Integration. # noqa: E501 + :type: str + """ + + self._configuration = configuration + + @property + def created_time(self): + """Gets the created_time of this Integration. # noqa: E501 + + + :return: The created_time of this Integration. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Integration. + + + :param created_time: The created_time of this Integration. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def debug_mode(self): + """Gets the debug_mode of this Integration. # noqa: E501 + + + :return: The debug_mode of this Integration. # noqa: E501 + :rtype: bool + """ + return self._debug_mode + + @debug_mode.setter + def debug_mode(self, debug_mode): + """Sets the debug_mode of this Integration. + + + :param debug_mode: The debug_mode of this Integration. # noqa: E501 + :type: bool + """ + + self._debug_mode = debug_mode + + @property + def default_converter_id(self): + """Gets the default_converter_id of this Integration. # noqa: E501 + + + :return: The default_converter_id of this Integration. # noqa: E501 + :rtype: ConverterId + """ + return self._default_converter_id + + @default_converter_id.setter + def default_converter_id(self, default_converter_id): + """Sets the default_converter_id of this Integration. + + + :param default_converter_id: The default_converter_id of this Integration. # noqa: E501 + :type: ConverterId + """ + + self._default_converter_id = default_converter_id + + @property + def downlink_converter_id(self): + """Gets the downlink_converter_id of this Integration. # noqa: E501 + + + :return: The downlink_converter_id of this Integration. # noqa: E501 + :rtype: ConverterId + """ + return self._downlink_converter_id + + @downlink_converter_id.setter + def downlink_converter_id(self, downlink_converter_id): + """Sets the downlink_converter_id of this Integration. + + + :param downlink_converter_id: The downlink_converter_id of this Integration. # noqa: E501 + :type: ConverterId + """ + + self._downlink_converter_id = downlink_converter_id + + @property + def enabled(self): + """Gets the enabled of this Integration. # noqa: E501 + + + :return: The enabled of this Integration. # noqa: E501 + :rtype: bool + """ + return self._enabled + + @enabled.setter + def enabled(self, enabled): + """Sets the enabled of this Integration. + + + :param enabled: The enabled of this Integration. # noqa: E501 + :type: bool + """ + + self._enabled = enabled + + @property + def id(self): + """Gets the id of this Integration. # noqa: E501 + + + :return: The id of this Integration. # noqa: E501 + :rtype: IntegrationId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Integration. + + + :param id: The id of this Integration. # noqa: E501 + :type: IntegrationId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this Integration. # noqa: E501 + + + :return: The name of this Integration. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Integration. + + + :param name: The name of this Integration. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def remote(self): + """Gets the remote of this Integration. # noqa: E501 + + + :return: The remote of this Integration. # noqa: E501 + :rtype: bool + """ + return self._remote + + @remote.setter + def remote(self, remote): + """Sets the remote of this Integration. + + + :param remote: The remote of this Integration. # noqa: E501 + :type: bool + """ + + self._remote = remote + + @property + def routing_key(self): + """Gets the routing_key of this Integration. # noqa: E501 + + + :return: The routing_key of this Integration. # noqa: E501 + :rtype: str + """ + return self._routing_key + + @routing_key.setter + def routing_key(self, routing_key): + """Sets the routing_key of this Integration. + + + :param routing_key: The routing_key of this Integration. # noqa: E501 + :type: str + """ + + self._routing_key = routing_key + + @property + def secret(self): + """Gets the secret of this Integration. # noqa: E501 + + + :return: The secret of this Integration. # noqa: E501 + :rtype: str + """ + return self._secret + + @secret.setter + def secret(self, secret): + """Sets the secret of this Integration. + + + :param secret: The secret of this Integration. # noqa: E501 + :type: str + """ + + self._secret = secret + + @property + def tenant_id(self): + """Gets the tenant_id of this Integration. # noqa: E501 + + + :return: The tenant_id of this Integration. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Integration. + + + :param tenant_id: The tenant_id of this Integration. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this Integration. # noqa: E501 + + + :return: The type of this Integration. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Integration. + + + :param type: The type of this Integration. # noqa: E501 + :type: str + """ + allowed_values = ["OCEANCONNECT", "SIGFOX", "THINGPARK", "TPE", "CHIRPSTACK", "TMOBILE_IOT_CDP", "HTTP", "MQTT", "PUB_SUB", "AWS_IOT", "AWS_SQS", "AWS_KINESIS", "IBM_WATSON_IOT", "TTN", "TTI", "AZURE_EVENT_HUB", "OPC_UA", "CUSTOM", "UDP", "TCP", "KAFKA", "AZURE_IOT_HUB", "APACHE_PULSAR", "RABBITMQ", "LORIOT", "COAP"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Integration, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Integration): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/integration_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/integration_id.py new file mode 100644 index 0000000..704eef5 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/integration_id.py @@ -0,0 +1,105 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class IntegrationId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """IntegrationId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + # self.entity_type = entity_type + + @property + def id(self): + """Gets the id of this IntegrationId. # noqa: E501 + + + :return: The id of this IntegrationId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this IntegrationId. + + + :param id: The id of this IntegrationId. # noqa: E501 + :type: str + """ + if id is None: + raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(IntegrationId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, IntegrationId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/login_white_labeling_params.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/login_white_labeling_params.py new file mode 100644 index 0000000..cf67da1 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/login_white_labeling_params.py @@ -0,0 +1,630 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class LoginWhiteLabelingParams(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'admin_settings_id': 'str', + 'app_title': 'str', + 'base_url': 'str', + 'custom_css': 'str', + 'dark_foreground': 'bool', + 'domain_name': 'str', + 'enable_help_links': 'bool', + 'favicon': 'Favicon', + 'favicon_checksum': 'str', + 'help_link_base_url': 'str', + 'logo_image_checksum': 'str', + 'logo_image_height': 'int', + 'logo_image_url': 'str', + 'page_background_color': 'str', + 'palette_settings': 'PaletteSettings', + 'platform_name': 'str', + 'platform_version': 'str', + 'prohibit_different_url': 'bool', + 'show_name_bottom': 'bool', + 'show_name_version': 'bool', + 'white_labeling_enabled': 'bool' + } + + attribute_map = { + 'admin_settings_id': 'adminSettingsId', + 'app_title': 'appTitle', + 'base_url': 'baseUrl', + 'custom_css': 'customCss', + 'dark_foreground': 'darkForeground', + 'domain_name': 'domainName', + 'enable_help_links': 'enableHelpLinks', + 'favicon': 'favicon', + 'favicon_checksum': 'faviconChecksum', + 'help_link_base_url': 'helpLinkBaseUrl', + 'logo_image_checksum': 'logoImageChecksum', + 'logo_image_height': 'logoImageHeight', + 'logo_image_url': 'logoImageUrl', + 'page_background_color': 'pageBackgroundColor', + 'palette_settings': 'paletteSettings', + 'platform_name': 'platformName', + 'platform_version': 'platformVersion', + 'prohibit_different_url': 'prohibitDifferentUrl', + 'show_name_bottom': 'showNameBottom', + 'show_name_version': 'showNameVersion', + 'white_labeling_enabled': 'whiteLabelingEnabled' + } + + def __init__(self, admin_settings_id=None, app_title=None, base_url=None, custom_css=None, dark_foreground=None, domain_name=None, enable_help_links=None, favicon=None, favicon_checksum=None, help_link_base_url=None, logo_image_checksum=None, logo_image_height=None, logo_image_url=None, page_background_color=None, palette_settings=None, platform_name=None, platform_version=None, prohibit_different_url=None, show_name_bottom=None, show_name_version=None, white_labeling_enabled=None): # noqa: E501 + """LoginWhiteLabelingParams - a model defined in Swagger""" # noqa: E501 + self._admin_settings_id = None + self._app_title = None + self._base_url = None + self._custom_css = None + self._dark_foreground = None + self._domain_name = None + self._enable_help_links = None + self._favicon = None + self._favicon_checksum = None + self._help_link_base_url = None + self._logo_image_checksum = None + self._logo_image_height = None + self._logo_image_url = None + self._page_background_color = None + self._palette_settings = None + self._platform_name = None + self._platform_version = None + self._prohibit_different_url = None + self._show_name_bottom = None + self._show_name_version = None + self._white_labeling_enabled = None + self.discriminator = None + if admin_settings_id is not None: + self.admin_settings_id = admin_settings_id + if app_title is not None: + self.app_title = app_title + if base_url is not None: + self.base_url = base_url + if custom_css is not None: + self.custom_css = custom_css + if dark_foreground is not None: + self.dark_foreground = dark_foreground + if domain_name is not None: + self.domain_name = domain_name + if enable_help_links is not None: + self.enable_help_links = enable_help_links + if favicon is not None: + self.favicon = favicon + if favicon_checksum is not None: + self.favicon_checksum = favicon_checksum + if help_link_base_url is not None: + self.help_link_base_url = help_link_base_url + if logo_image_checksum is not None: + self.logo_image_checksum = logo_image_checksum + if logo_image_height is not None: + self.logo_image_height = logo_image_height + if logo_image_url is not None: + self.logo_image_url = logo_image_url + if page_background_color is not None: + self.page_background_color = page_background_color + if palette_settings is not None: + self.palette_settings = palette_settings + if platform_name is not None: + self.platform_name = platform_name + if platform_version is not None: + self.platform_version = platform_version + if prohibit_different_url is not None: + self.prohibit_different_url = prohibit_different_url + if show_name_bottom is not None: + self.show_name_bottom = show_name_bottom + if show_name_version is not None: + self.show_name_version = show_name_version + if white_labeling_enabled is not None: + self.white_labeling_enabled = white_labeling_enabled + + @property + def admin_settings_id(self): + """Gets the admin_settings_id of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The admin_settings_id of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._admin_settings_id + + @admin_settings_id.setter + def admin_settings_id(self, admin_settings_id): + """Sets the admin_settings_id of this LoginWhiteLabelingParams. + + + :param admin_settings_id: The admin_settings_id of this LoginWhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._admin_settings_id = admin_settings_id + + @property + def app_title(self): + """Gets the app_title of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The app_title of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._app_title + + @app_title.setter + def app_title(self, app_title): + """Sets the app_title of this LoginWhiteLabelingParams. + + + :param app_title: The app_title of this LoginWhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._app_title = app_title + + @property + def base_url(self): + """Gets the base_url of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The base_url of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._base_url + + @base_url.setter + def base_url(self, base_url): + """Sets the base_url of this LoginWhiteLabelingParams. + + + :param base_url: The base_url of this LoginWhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._base_url = base_url + + @property + def custom_css(self): + """Gets the custom_css of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The custom_css of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._custom_css + + @custom_css.setter + def custom_css(self, custom_css): + """Sets the custom_css of this LoginWhiteLabelingParams. + + + :param custom_css: The custom_css of this LoginWhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._custom_css = custom_css + + @property + def dark_foreground(self): + """Gets the dark_foreground of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The dark_foreground of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: bool + """ + return self._dark_foreground + + @dark_foreground.setter + def dark_foreground(self, dark_foreground): + """Sets the dark_foreground of this LoginWhiteLabelingParams. + + + :param dark_foreground: The dark_foreground of this LoginWhiteLabelingParams. # noqa: E501 + :type: bool + """ + + self._dark_foreground = dark_foreground + + @property + def domain_name(self): + """Gets the domain_name of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The domain_name of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._domain_name + + @domain_name.setter + def domain_name(self, domain_name): + """Sets the domain_name of this LoginWhiteLabelingParams. + + + :param domain_name: The domain_name of this LoginWhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._domain_name = domain_name + + @property + def enable_help_links(self): + """Gets the enable_help_links of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The enable_help_links of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: bool + """ + return self._enable_help_links + + @enable_help_links.setter + def enable_help_links(self, enable_help_links): + """Sets the enable_help_links of this LoginWhiteLabelingParams. + + + :param enable_help_links: The enable_help_links of this LoginWhiteLabelingParams. # noqa: E501 + :type: bool + """ + + self._enable_help_links = enable_help_links + + @property + def favicon(self): + """Gets the favicon of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The favicon of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: Favicon + """ + return self._favicon + + @favicon.setter + def favicon(self, favicon): + """Sets the favicon of this LoginWhiteLabelingParams. + + + :param favicon: The favicon of this LoginWhiteLabelingParams. # noqa: E501 + :type: Favicon + """ + + self._favicon = favicon + + @property + def favicon_checksum(self): + """Gets the favicon_checksum of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The favicon_checksum of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._favicon_checksum + + @favicon_checksum.setter + def favicon_checksum(self, favicon_checksum): + """Sets the favicon_checksum of this LoginWhiteLabelingParams. + + + :param favicon_checksum: The favicon_checksum of this LoginWhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._favicon_checksum = favicon_checksum + + @property + def help_link_base_url(self): + """Gets the help_link_base_url of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The help_link_base_url of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._help_link_base_url + + @help_link_base_url.setter + def help_link_base_url(self, help_link_base_url): + """Sets the help_link_base_url of this LoginWhiteLabelingParams. + + + :param help_link_base_url: The help_link_base_url of this LoginWhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._help_link_base_url = help_link_base_url + + @property + def logo_image_checksum(self): + """Gets the logo_image_checksum of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The logo_image_checksum of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._logo_image_checksum + + @logo_image_checksum.setter + def logo_image_checksum(self, logo_image_checksum): + """Sets the logo_image_checksum of this LoginWhiteLabelingParams. + + + :param logo_image_checksum: The logo_image_checksum of this LoginWhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._logo_image_checksum = logo_image_checksum + + @property + def logo_image_height(self): + """Gets the logo_image_height of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The logo_image_height of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: int + """ + return self._logo_image_height + + @logo_image_height.setter + def logo_image_height(self, logo_image_height): + """Sets the logo_image_height of this LoginWhiteLabelingParams. + + + :param logo_image_height: The logo_image_height of this LoginWhiteLabelingParams. # noqa: E501 + :type: int + """ + + self._logo_image_height = logo_image_height + + @property + def logo_image_url(self): + """Gets the logo_image_url of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The logo_image_url of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._logo_image_url + + @logo_image_url.setter + def logo_image_url(self, logo_image_url): + """Sets the logo_image_url of this LoginWhiteLabelingParams. + + + :param logo_image_url: The logo_image_url of this LoginWhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._logo_image_url = logo_image_url + + @property + def page_background_color(self): + """Gets the page_background_color of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The page_background_color of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._page_background_color + + @page_background_color.setter + def page_background_color(self, page_background_color): + """Sets the page_background_color of this LoginWhiteLabelingParams. + + + :param page_background_color: The page_background_color of this LoginWhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._page_background_color = page_background_color + + @property + def palette_settings(self): + """Gets the palette_settings of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The palette_settings of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: PaletteSettings + """ + return self._palette_settings + + @palette_settings.setter + def palette_settings(self, palette_settings): + """Sets the palette_settings of this LoginWhiteLabelingParams. + + + :param palette_settings: The palette_settings of this LoginWhiteLabelingParams. # noqa: E501 + :type: PaletteSettings + """ + + self._palette_settings = palette_settings + + @property + def platform_name(self): + """Gets the platform_name of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The platform_name of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._platform_name + + @platform_name.setter + def platform_name(self, platform_name): + """Sets the platform_name of this LoginWhiteLabelingParams. + + + :param platform_name: The platform_name of this LoginWhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._platform_name = platform_name + + @property + def platform_version(self): + """Gets the platform_version of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The platform_version of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._platform_version + + @platform_version.setter + def platform_version(self, platform_version): + """Sets the platform_version of this LoginWhiteLabelingParams. + + + :param platform_version: The platform_version of this LoginWhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._platform_version = platform_version + + @property + def prohibit_different_url(self): + """Gets the prohibit_different_url of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The prohibit_different_url of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: bool + """ + return self._prohibit_different_url + + @prohibit_different_url.setter + def prohibit_different_url(self, prohibit_different_url): + """Sets the prohibit_different_url of this LoginWhiteLabelingParams. + + + :param prohibit_different_url: The prohibit_different_url of this LoginWhiteLabelingParams. # noqa: E501 + :type: bool + """ + + self._prohibit_different_url = prohibit_different_url + + @property + def show_name_bottom(self): + """Gets the show_name_bottom of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The show_name_bottom of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: bool + """ + return self._show_name_bottom + + @show_name_bottom.setter + def show_name_bottom(self, show_name_bottom): + """Sets the show_name_bottom of this LoginWhiteLabelingParams. + + + :param show_name_bottom: The show_name_bottom of this LoginWhiteLabelingParams. # noqa: E501 + :type: bool + """ + + self._show_name_bottom = show_name_bottom + + @property + def show_name_version(self): + """Gets the show_name_version of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The show_name_version of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: bool + """ + return self._show_name_version + + @show_name_version.setter + def show_name_version(self, show_name_version): + """Sets the show_name_version of this LoginWhiteLabelingParams. + + + :param show_name_version: The show_name_version of this LoginWhiteLabelingParams. # noqa: E501 + :type: bool + """ + + self._show_name_version = show_name_version + + @property + def white_labeling_enabled(self): + """Gets the white_labeling_enabled of this LoginWhiteLabelingParams. # noqa: E501 + + + :return: The white_labeling_enabled of this LoginWhiteLabelingParams. # noqa: E501 + :rtype: bool + """ + return self._white_labeling_enabled + + @white_labeling_enabled.setter + def white_labeling_enabled(self, white_labeling_enabled): + """Sets the white_labeling_enabled of this LoginWhiteLabelingParams. + + + :param white_labeling_enabled: The white_labeling_enabled of this LoginWhiteLabelingParams. # noqa: E501 + :type: bool + """ + + self._white_labeling_enabled = white_labeling_enabled + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(LoginWhiteLabelingParams, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, LoginWhiteLabelingParams): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/merged_group_permission_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/merged_group_permission_info.py new file mode 100644 index 0000000..a438282 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/merged_group_permission_info.py @@ -0,0 +1,149 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class MergedGroupPermissionInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_type': 'str', + 'operations': 'list[str]' + } + + attribute_map = { + 'entity_type': 'entityType', + 'operations': 'operations' + } + + def __init__(self, entity_type=None, operations=None): # noqa: E501 + """MergedGroupPermissionInfo - a model defined in Swagger""" # noqa: E501 + self._entity_type = None + self._operations = None + self.discriminator = None + if entity_type is not None: + self.entity_type = entity_type + if operations is not None: + self.operations = operations + + @property + def entity_type(self): + """Gets the entity_type of this MergedGroupPermissionInfo. # noqa: E501 + + + :return: The entity_type of this MergedGroupPermissionInfo. # noqa: E501 + :rtype: str + """ + return self._entity_type + + @entity_type.setter + def entity_type(self, entity_type): + """Sets the entity_type of this MergedGroupPermissionInfo. + + + :param entity_type: The entity_type of this MergedGroupPermissionInfo. # noqa: E501 + :type: str + """ + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "ENTITY_GROUP", "CONVERTER", "INTEGRATION", "RULE_CHAIN", "RULE_NODE", "SCHEDULER_EVENT", "BLOB_ENTITY", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "ROLE", "GROUP_PERMISSION", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if entity_type not in allowed_values: + raise ValueError( + "Invalid value for `entity_type` ({0}), must be one of {1}" # noqa: E501 + .format(entity_type, allowed_values) + ) + + self._entity_type = entity_type + + @property + def operations(self): + """Gets the operations of this MergedGroupPermissionInfo. # noqa: E501 + + + :return: The operations of this MergedGroupPermissionInfo. # noqa: E501 + :rtype: list[str] + """ + return self._operations + + @operations.setter + def operations(self, operations): + """Sets the operations of this MergedGroupPermissionInfo. + + + :param operations: The operations of this MergedGroupPermissionInfo. # noqa: E501 + :type: list[str] + """ + allowed_values = ["ALL", "CREATE", "READ", "WRITE", "DELETE", "RPC_CALL", "READ_CREDENTIALS", "WRITE_CREDENTIALS", "READ_ATTRIBUTES", "WRITE_ATTRIBUTES", "READ_TELEMETRY", "WRITE_TELEMETRY", "ADD_TO_GROUP", "REMOVE_FROM_GROUP", "CHANGE_OWNER", "IMPERSONATE", "CLAIM_DEVICES", "SHARE_GROUP", "ASSIGN_TO_TENANT"] # noqa: E501 + if not set(operations).issubset(set(allowed_values)): + raise ValueError( + "Invalid values for `operations` [{0}], must be a subset of [{1}]" # noqa: E501 + .format(", ".join(map(str, set(operations) - set(allowed_values))), # noqa: E501 + ", ".join(map(str, allowed_values))) + ) + + self._operations = operations + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(MergedGroupPermissionInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, MergedGroupPermissionInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/merged_group_type_permission_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/merged_group_type_permission_info.py new file mode 100644 index 0000000..8fa5073 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/merged_group_type_permission_info.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class MergedGroupTypePermissionInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_group_ids': 'list[EntityGroupId]', + 'has_generic_read': 'bool' + } + + attribute_map = { + 'entity_group_ids': 'entityGroupIds', + 'has_generic_read': 'hasGenericRead' + } + + def __init__(self, entity_group_ids=None, has_generic_read=None): # noqa: E501 + """MergedGroupTypePermissionInfo - a model defined in Swagger""" # noqa: E501 + self._entity_group_ids = None + self._has_generic_read = None + self.discriminator = None + if entity_group_ids is not None: + self.entity_group_ids = entity_group_ids + if has_generic_read is not None: + self.has_generic_read = has_generic_read + + @property + def entity_group_ids(self): + """Gets the entity_group_ids of this MergedGroupTypePermissionInfo. # noqa: E501 + + + :return: The entity_group_ids of this MergedGroupTypePermissionInfo. # noqa: E501 + :rtype: list[EntityGroupId] + """ + return self._entity_group_ids + + @entity_group_ids.setter + def entity_group_ids(self, entity_group_ids): + """Sets the entity_group_ids of this MergedGroupTypePermissionInfo. + + + :param entity_group_ids: The entity_group_ids of this MergedGroupTypePermissionInfo. # noqa: E501 + :type: list[EntityGroupId] + """ + + self._entity_group_ids = entity_group_ids + + @property + def has_generic_read(self): + """Gets the has_generic_read of this MergedGroupTypePermissionInfo. # noqa: E501 + + + :return: The has_generic_read of this MergedGroupTypePermissionInfo. # noqa: E501 + :rtype: bool + """ + return self._has_generic_read + + @has_generic_read.setter + def has_generic_read(self, has_generic_read): + """Sets the has_generic_read of this MergedGroupTypePermissionInfo. + + + :param has_generic_read: The has_generic_read of this MergedGroupTypePermissionInfo. # noqa: E501 + :type: bool + """ + + self._has_generic_read = has_generic_read + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(MergedGroupTypePermissionInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, MergedGroupTypePermissionInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/merged_user_permissions.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/merged_user_permissions.py new file mode 100644 index 0000000..d68b886 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/merged_user_permissions.py @@ -0,0 +1,247 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class MergedUserPermissions(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'generic_permissions': 'dict(str, list[str])', + 'group_permissions': 'dict(str, MergedGroupPermissionInfo)', + 'read_attr_permissions': 'dict(str, MergedGroupTypePermissionInfo)', + 'read_entity_permissions': 'dict(str, MergedGroupTypePermissionInfo)', + 'read_group_permissions': 'dict(str, MergedGroupTypePermissionInfo)', + 'read_ts_permissions': 'dict(str, MergedGroupTypePermissionInfo)' + } + + attribute_map = { + 'generic_permissions': 'genericPermissions', + 'group_permissions': 'groupPermissions', + 'read_attr_permissions': 'readAttrPermissions', + 'read_entity_permissions': 'readEntityPermissions', + 'read_group_permissions': 'readGroupPermissions', + 'read_ts_permissions': 'readTsPermissions' + } + + def __init__(self, generic_permissions=None, group_permissions=None, read_attr_permissions=None, read_entity_permissions=None, read_group_permissions=None, read_ts_permissions=None): # noqa: E501 + """MergedUserPermissions - a model defined in Swagger""" # noqa: E501 + self._generic_permissions = None + self._group_permissions = None + self._read_attr_permissions = None + self._read_entity_permissions = None + self._read_group_permissions = None + self._read_ts_permissions = None + self.discriminator = None + if generic_permissions is not None: + self.generic_permissions = generic_permissions + if group_permissions is not None: + self.group_permissions = group_permissions + if read_attr_permissions is not None: + self.read_attr_permissions = read_attr_permissions + if read_entity_permissions is not None: + self.read_entity_permissions = read_entity_permissions + if read_group_permissions is not None: + self.read_group_permissions = read_group_permissions + if read_ts_permissions is not None: + self.read_ts_permissions = read_ts_permissions + + @property + def generic_permissions(self): + """Gets the generic_permissions of this MergedUserPermissions. # noqa: E501 + + + :return: The generic_permissions of this MergedUserPermissions. # noqa: E501 + :rtype: dict(str, list[str]) + """ + return self._generic_permissions + + @generic_permissions.setter + def generic_permissions(self, generic_permissions): + """Sets the generic_permissions of this MergedUserPermissions. + + + :param generic_permissions: The generic_permissions of this MergedUserPermissions. # noqa: E501 + :type: dict(str, list[str]) + """ + allowed_values = [ALL, CREATE, READ, WRITE, DELETE, RPC_CALL, READ_CREDENTIALS, WRITE_CREDENTIALS, READ_ATTRIBUTES, WRITE_ATTRIBUTES, READ_TELEMETRY, WRITE_TELEMETRY, ADD_TO_GROUP, REMOVE_FROM_GROUP, CHANGE_OWNER, IMPERSONATE, CLAIM_DEVICES, SHARE_GROUP, ASSIGN_TO_TENANT] # noqa: E501 + if not set(generic_permissions.keys()).issubset(set(allowed_values)): + raise ValueError( + "Invalid keys in `generic_permissions` [{0}], must be a subset of [{1}]" # noqa: E501 + .format(", ".join(map(str, set(generic_permissions.keys()) - set(allowed_values))), # noqa: E501 + ", ".join(map(str, allowed_values))) + ) + + self._generic_permissions = generic_permissions + + @property + def group_permissions(self): + """Gets the group_permissions of this MergedUserPermissions. # noqa: E501 + + + :return: The group_permissions of this MergedUserPermissions. # noqa: E501 + :rtype: dict(str, MergedGroupPermissionInfo) + """ + return self._group_permissions + + @group_permissions.setter + def group_permissions(self, group_permissions): + """Sets the group_permissions of this MergedUserPermissions. + + + :param group_permissions: The group_permissions of this MergedUserPermissions. # noqa: E501 + :type: dict(str, MergedGroupPermissionInfo) + """ + + self._group_permissions = group_permissions + + @property + def read_attr_permissions(self): + """Gets the read_attr_permissions of this MergedUserPermissions. # noqa: E501 + + + :return: The read_attr_permissions of this MergedUserPermissions. # noqa: E501 + :rtype: dict(str, MergedGroupTypePermissionInfo) + """ + return self._read_attr_permissions + + @read_attr_permissions.setter + def read_attr_permissions(self, read_attr_permissions): + """Sets the read_attr_permissions of this MergedUserPermissions. + + + :param read_attr_permissions: The read_attr_permissions of this MergedUserPermissions. # noqa: E501 + :type: dict(str, MergedGroupTypePermissionInfo) + """ + + self._read_attr_permissions = read_attr_permissions + + @property + def read_entity_permissions(self): + """Gets the read_entity_permissions of this MergedUserPermissions. # noqa: E501 + + + :return: The read_entity_permissions of this MergedUserPermissions. # noqa: E501 + :rtype: dict(str, MergedGroupTypePermissionInfo) + """ + return self._read_entity_permissions + + @read_entity_permissions.setter + def read_entity_permissions(self, read_entity_permissions): + """Sets the read_entity_permissions of this MergedUserPermissions. + + + :param read_entity_permissions: The read_entity_permissions of this MergedUserPermissions. # noqa: E501 + :type: dict(str, MergedGroupTypePermissionInfo) + """ + + self._read_entity_permissions = read_entity_permissions + + @property + def read_group_permissions(self): + """Gets the read_group_permissions of this MergedUserPermissions. # noqa: E501 + + + :return: The read_group_permissions of this MergedUserPermissions. # noqa: E501 + :rtype: dict(str, MergedGroupTypePermissionInfo) + """ + return self._read_group_permissions + + @read_group_permissions.setter + def read_group_permissions(self, read_group_permissions): + """Sets the read_group_permissions of this MergedUserPermissions. + + + :param read_group_permissions: The read_group_permissions of this MergedUserPermissions. # noqa: E501 + :type: dict(str, MergedGroupTypePermissionInfo) + """ + + self._read_group_permissions = read_group_permissions + + @property + def read_ts_permissions(self): + """Gets the read_ts_permissions of this MergedUserPermissions. # noqa: E501 + + + :return: The read_ts_permissions of this MergedUserPermissions. # noqa: E501 + :rtype: dict(str, MergedGroupTypePermissionInfo) + """ + return self._read_ts_permissions + + @read_ts_permissions.setter + def read_ts_permissions(self, read_ts_permissions): + """Sets the read_ts_permissions of this MergedUserPermissions. + + + :param read_ts_permissions: The read_ts_permissions of this MergedUserPermissions. # noqa: E501 + :type: dict(str, MergedGroupTypePermissionInfo) + """ + + self._read_ts_permissions = read_ts_permissions + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(MergedUserPermissions, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, MergedUserPermissions): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/o_auth2_basic_mapper_config.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/o_auth2_basic_mapper_config.py new file mode 100644 index 0000000..e0948ad --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/o_auth2_basic_mapper_config.py @@ -0,0 +1,350 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2BasicMapperConfig(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'always_full_screen': 'bool', + 'customer_name_pattern': 'str', + 'default_dashboard_name': 'str', + 'email_attribute_key': 'str', + 'first_name_attribute_key': 'str', + 'last_name_attribute_key': 'str', + 'parent_customer_name_pattern': 'str', + 'tenant_name_pattern': 'str', + 'tenant_name_strategy': 'str', + 'user_groups_name_pattern': 'list[str]' + } + + attribute_map = { + 'always_full_screen': 'alwaysFullScreen', + 'customer_name_pattern': 'customerNamePattern', + 'default_dashboard_name': 'defaultDashboardName', + 'email_attribute_key': 'emailAttributeKey', + 'first_name_attribute_key': 'firstNameAttributeKey', + 'last_name_attribute_key': 'lastNameAttributeKey', + 'parent_customer_name_pattern': 'parentCustomerNamePattern', + 'tenant_name_pattern': 'tenantNamePattern', + 'tenant_name_strategy': 'tenantNameStrategy', + 'user_groups_name_pattern': 'userGroupsNamePattern' + } + + def __init__(self, always_full_screen=None, customer_name_pattern=None, default_dashboard_name=None, email_attribute_key=None, first_name_attribute_key=None, last_name_attribute_key=None, parent_customer_name_pattern=None, tenant_name_pattern=None, tenant_name_strategy=None, user_groups_name_pattern=None): # noqa: E501 + """OAuth2BasicMapperConfig - a model defined in Swagger""" # noqa: E501 + self._always_full_screen = None + self._customer_name_pattern = None + self._default_dashboard_name = None + self._email_attribute_key = None + self._first_name_attribute_key = None + self._last_name_attribute_key = None + self._parent_customer_name_pattern = None + self._tenant_name_pattern = None + self._tenant_name_strategy = None + self._user_groups_name_pattern = None + self.discriminator = None + if always_full_screen is not None: + self.always_full_screen = always_full_screen + if customer_name_pattern is not None: + self.customer_name_pattern = customer_name_pattern + if default_dashboard_name is not None: + self.default_dashboard_name = default_dashboard_name + if email_attribute_key is not None: + self.email_attribute_key = email_attribute_key + if first_name_attribute_key is not None: + self.first_name_attribute_key = first_name_attribute_key + if last_name_attribute_key is not None: + self.last_name_attribute_key = last_name_attribute_key + if parent_customer_name_pattern is not None: + self.parent_customer_name_pattern = parent_customer_name_pattern + if tenant_name_pattern is not None: + self.tenant_name_pattern = tenant_name_pattern + if tenant_name_strategy is not None: + self.tenant_name_strategy = tenant_name_strategy + if user_groups_name_pattern is not None: + self.user_groups_name_pattern = user_groups_name_pattern + + @property + def always_full_screen(self): + """Gets the always_full_screen of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The always_full_screen of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: bool + """ + return self._always_full_screen + + @always_full_screen.setter + def always_full_screen(self, always_full_screen): + """Sets the always_full_screen of this OAuth2BasicMapperConfig. + + + :param always_full_screen: The always_full_screen of this OAuth2BasicMapperConfig. # noqa: E501 + :type: bool + """ + + self._always_full_screen = always_full_screen + + @property + def customer_name_pattern(self): + """Gets the customer_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The customer_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._customer_name_pattern + + @customer_name_pattern.setter + def customer_name_pattern(self, customer_name_pattern): + """Sets the customer_name_pattern of this OAuth2BasicMapperConfig. + + + :param customer_name_pattern: The customer_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._customer_name_pattern = customer_name_pattern + + @property + def default_dashboard_name(self): + """Gets the default_dashboard_name of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The default_dashboard_name of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._default_dashboard_name + + @default_dashboard_name.setter + def default_dashboard_name(self, default_dashboard_name): + """Sets the default_dashboard_name of this OAuth2BasicMapperConfig. + + + :param default_dashboard_name: The default_dashboard_name of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._default_dashboard_name = default_dashboard_name + + @property + def email_attribute_key(self): + """Gets the email_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The email_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._email_attribute_key + + @email_attribute_key.setter + def email_attribute_key(self, email_attribute_key): + """Sets the email_attribute_key of this OAuth2BasicMapperConfig. + + + :param email_attribute_key: The email_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._email_attribute_key = email_attribute_key + + @property + def first_name_attribute_key(self): + """Gets the first_name_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The first_name_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._first_name_attribute_key + + @first_name_attribute_key.setter + def first_name_attribute_key(self, first_name_attribute_key): + """Sets the first_name_attribute_key of this OAuth2BasicMapperConfig. + + + :param first_name_attribute_key: The first_name_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._first_name_attribute_key = first_name_attribute_key + + @property + def last_name_attribute_key(self): + """Gets the last_name_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The last_name_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._last_name_attribute_key + + @last_name_attribute_key.setter + def last_name_attribute_key(self, last_name_attribute_key): + """Sets the last_name_attribute_key of this OAuth2BasicMapperConfig. + + + :param last_name_attribute_key: The last_name_attribute_key of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._last_name_attribute_key = last_name_attribute_key + + @property + def parent_customer_name_pattern(self): + """Gets the parent_customer_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The parent_customer_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._parent_customer_name_pattern + + @parent_customer_name_pattern.setter + def parent_customer_name_pattern(self, parent_customer_name_pattern): + """Sets the parent_customer_name_pattern of this OAuth2BasicMapperConfig. + + + :param parent_customer_name_pattern: The parent_customer_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._parent_customer_name_pattern = parent_customer_name_pattern + + @property + def tenant_name_pattern(self): + """Gets the tenant_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The tenant_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._tenant_name_pattern + + @tenant_name_pattern.setter + def tenant_name_pattern(self, tenant_name_pattern): + """Sets the tenant_name_pattern of this OAuth2BasicMapperConfig. + + + :param tenant_name_pattern: The tenant_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + + self._tenant_name_pattern = tenant_name_pattern + + @property + def tenant_name_strategy(self): + """Gets the tenant_name_strategy of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The tenant_name_strategy of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: str + """ + return self._tenant_name_strategy + + @tenant_name_strategy.setter + def tenant_name_strategy(self, tenant_name_strategy): + """Sets the tenant_name_strategy of this OAuth2BasicMapperConfig. + + + :param tenant_name_strategy: The tenant_name_strategy of this OAuth2BasicMapperConfig. # noqa: E501 + :type: str + """ + allowed_values = ["DOMAIN", "EMAIL", "CUSTOM"] # noqa: E501 + if tenant_name_strategy not in allowed_values: + raise ValueError( + "Invalid value for `tenant_name_strategy` ({0}), must be one of {1}" # noqa: E501 + .format(tenant_name_strategy, allowed_values) + ) + + self._tenant_name_strategy = tenant_name_strategy + + @property + def user_groups_name_pattern(self): + """Gets the user_groups_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + + + :return: The user_groups_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + :rtype: list[str] + """ + return self._user_groups_name_pattern + + @user_groups_name_pattern.setter + def user_groups_name_pattern(self, user_groups_name_pattern): + """Sets the user_groups_name_pattern of this OAuth2BasicMapperConfig. + + + :param user_groups_name_pattern: The user_groups_name_pattern of this OAuth2BasicMapperConfig. # noqa: E501 + :type: list[str] + """ + + self._user_groups_name_pattern = user_groups_name_pattern + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2BasicMapperConfig, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2BasicMapperConfig): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/o_auth2_clients_domain_params.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/o_auth2_clients_domain_params.py new file mode 100644 index 0000000..c8c4ee8 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/o_auth2_clients_domain_params.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2ClientsDomainParams(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'client_registrations': 'list[ClientRegistrationDto]', + 'domain_infos': 'list[DomainInfo]' + } + + attribute_map = { + 'client_registrations': 'clientRegistrations', + 'domain_infos': 'domainInfos' + } + + def __init__(self, client_registrations=None, domain_infos=None): # noqa: E501 + """OAuth2ClientsDomainParams - a model defined in Swagger""" # noqa: E501 + self._client_registrations = None + self._domain_infos = None + self.discriminator = None + if client_registrations is not None: + self.client_registrations = client_registrations + if domain_infos is not None: + self.domain_infos = domain_infos + + @property + def client_registrations(self): + """Gets the client_registrations of this OAuth2ClientsDomainParams. # noqa: E501 + + + :return: The client_registrations of this OAuth2ClientsDomainParams. # noqa: E501 + :rtype: list[ClientRegistrationDto] + """ + return self._client_registrations + + @client_registrations.setter + def client_registrations(self, client_registrations): + """Sets the client_registrations of this OAuth2ClientsDomainParams. + + + :param client_registrations: The client_registrations of this OAuth2ClientsDomainParams. # noqa: E501 + :type: list[ClientRegistrationDto] + """ + + self._client_registrations = client_registrations + + @property + def domain_infos(self): + """Gets the domain_infos of this OAuth2ClientsDomainParams. # noqa: E501 + + + :return: The domain_infos of this OAuth2ClientsDomainParams. # noqa: E501 + :rtype: list[DomainInfo] + """ + return self._domain_infos + + @domain_infos.setter + def domain_infos(self, domain_infos): + """Sets the domain_infos of this OAuth2ClientsDomainParams. + + + :param domain_infos: The domain_infos of this OAuth2ClientsDomainParams. # noqa: E501 + :type: list[DomainInfo] + """ + + self._domain_infos = domain_infos + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2ClientsDomainParams, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2ClientsDomainParams): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/o_auth2_clients_params.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/o_auth2_clients_params.py new file mode 100644 index 0000000..1b6e289 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/o_auth2_clients_params.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class OAuth2ClientsParams(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'domains_params': 'list[OAuth2ClientsDomainParams]', + 'enabled': 'bool' + } + + attribute_map = { + 'domains_params': 'domainsParams', + 'enabled': 'enabled' + } + + def __init__(self, domains_params=None, enabled=None): # noqa: E501 + """OAuth2ClientsParams - a model defined in Swagger""" # noqa: E501 + self._domains_params = None + self._enabled = None + self.discriminator = None + if domains_params is not None: + self.domains_params = domains_params + if enabled is not None: + self.enabled = enabled + + @property + def domains_params(self): + """Gets the domains_params of this OAuth2ClientsParams. # noqa: E501 + + + :return: The domains_params of this OAuth2ClientsParams. # noqa: E501 + :rtype: list[OAuth2ClientsDomainParams] + """ + return self._domains_params + + @domains_params.setter + def domains_params(self, domains_params): + """Sets the domains_params of this OAuth2ClientsParams. + + + :param domains_params: The domains_params of this OAuth2ClientsParams. # noqa: E501 + :type: list[OAuth2ClientsDomainParams] + """ + + self._domains_params = domains_params + + @property + def enabled(self): + """Gets the enabled of this OAuth2ClientsParams. # noqa: E501 + + + :return: The enabled of this OAuth2ClientsParams. # noqa: E501 + :rtype: bool + """ + return self._enabled + + @enabled.setter + def enabled(self, enabled): + """Sets the enabled of this OAuth2ClientsParams. + + + :param enabled: The enabled of this OAuth2ClientsParams. # noqa: E501 + :type: bool + """ + + self._enabled = enabled + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(OAuth2ClientsParams, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, OAuth2ClientsParams): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_blob_entity_with_customer_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_blob_entity_with_customer_info.py new file mode 100644 index 0000000..00cc274 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_blob_entity_with_customer_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataBlobEntityWithCustomerInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[BlobEntityWithCustomerInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataBlobEntityWithCustomerInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataBlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The data of this PageDataBlobEntityWithCustomerInfo. # noqa: E501 + :rtype: list[BlobEntityWithCustomerInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataBlobEntityWithCustomerInfo. + + + :param data: The data of this PageDataBlobEntityWithCustomerInfo. # noqa: E501 + :type: list[BlobEntityWithCustomerInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataBlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The has_next of this PageDataBlobEntityWithCustomerInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataBlobEntityWithCustomerInfo. + + + :param has_next: The has_next of this PageDataBlobEntityWithCustomerInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataBlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The total_elements of this PageDataBlobEntityWithCustomerInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataBlobEntityWithCustomerInfo. + + + :param total_elements: The total_elements of this PageDataBlobEntityWithCustomerInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataBlobEntityWithCustomerInfo. # noqa: E501 + + + :return: The total_pages of this PageDataBlobEntityWithCustomerInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataBlobEntityWithCustomerInfo. + + + :param total_pages: The total_pages of this PageDataBlobEntityWithCustomerInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataBlobEntityWithCustomerInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataBlobEntityWithCustomerInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_contact_basedobject.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_contact_basedobject.py new file mode 100644 index 0000000..40ff74e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_contact_basedobject.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataContactBasedobject(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[ContactBasedobject]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataContactBasedobject - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataContactBasedobject. # noqa: E501 + + + :return: The data of this PageDataContactBasedobject. # noqa: E501 + :rtype: list[ContactBasedobject] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataContactBasedobject. + + + :param data: The data of this PageDataContactBasedobject. # noqa: E501 + :type: list[ContactBasedobject] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataContactBasedobject. # noqa: E501 + + + :return: The has_next of this PageDataContactBasedobject. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataContactBasedobject. + + + :param has_next: The has_next of this PageDataContactBasedobject. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataContactBasedobject. # noqa: E501 + + + :return: The total_elements of this PageDataContactBasedobject. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataContactBasedobject. + + + :param total_elements: The total_elements of this PageDataContactBasedobject. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataContactBasedobject. # noqa: E501 + + + :return: The total_pages of this PageDataContactBasedobject. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataContactBasedobject. + + + :param total_pages: The total_pages of this PageDataContactBasedobject. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataContactBasedobject, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataContactBasedobject): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_converter.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_converter.py new file mode 100644 index 0000000..37b0fdc --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_converter.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataConverter(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[Converter]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataConverter - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataConverter. # noqa: E501 + + + :return: The data of this PageDataConverter. # noqa: E501 + :rtype: list[Converter] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataConverter. + + + :param data: The data of this PageDataConverter. # noqa: E501 + :type: list[Converter] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataConverter. # noqa: E501 + + + :return: The has_next of this PageDataConverter. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataConverter. + + + :param has_next: The has_next of this PageDataConverter. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataConverter. # noqa: E501 + + + :return: The total_elements of this PageDataConverter. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataConverter. + + + :param total_elements: The total_elements of this PageDataConverter. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataConverter. # noqa: E501 + + + :return: The total_pages of this PageDataConverter. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataConverter. + + + :param total_pages: The total_pages of this PageDataConverter. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataConverter, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataConverter): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_entity_group_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_entity_group_info.py new file mode 100644 index 0000000..4fc975b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_entity_group_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataEntityGroupInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[EntityGroupInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataEntityGroupInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataEntityGroupInfo. # noqa: E501 + + + :return: The data of this PageDataEntityGroupInfo. # noqa: E501 + :rtype: list[EntityGroupInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataEntityGroupInfo. + + + :param data: The data of this PageDataEntityGroupInfo. # noqa: E501 + :type: list[EntityGroupInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataEntityGroupInfo. # noqa: E501 + + + :return: The has_next of this PageDataEntityGroupInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataEntityGroupInfo. + + + :param has_next: The has_next of this PageDataEntityGroupInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataEntityGroupInfo. # noqa: E501 + + + :return: The total_elements of this PageDataEntityGroupInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataEntityGroupInfo. + + + :param total_elements: The total_elements of this PageDataEntityGroupInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataEntityGroupInfo. # noqa: E501 + + + :return: The total_pages of this PageDataEntityGroupInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataEntityGroupInfo. + + + :param total_pages: The total_pages of this PageDataEntityGroupInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataEntityGroupInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataEntityGroupInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_integration.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_integration.py new file mode 100644 index 0000000..318a9ff --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_integration.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataIntegration(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[Integration]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataIntegration - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataIntegration. # noqa: E501 + + + :return: The data of this PageDataIntegration. # noqa: E501 + :rtype: list[Integration] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataIntegration. + + + :param data: The data of this PageDataIntegration. # noqa: E501 + :type: list[Integration] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataIntegration. # noqa: E501 + + + :return: The has_next of this PageDataIntegration. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataIntegration. + + + :param has_next: The has_next of this PageDataIntegration. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataIntegration. # noqa: E501 + + + :return: The total_elements of this PageDataIntegration. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataIntegration. + + + :param total_elements: The total_elements of this PageDataIntegration. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataIntegration. # noqa: E501 + + + :return: The total_pages of this PageDataIntegration. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataIntegration. + + + :param total_pages: The total_pages of this PageDataIntegration. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataIntegration, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataIntegration): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_role.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_role.py new file mode 100644 index 0000000..9471f96 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_role.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataRole(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[Role]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataRole - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataRole. # noqa: E501 + + + :return: The data of this PageDataRole. # noqa: E501 + :rtype: list[Role] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataRole. + + + :param data: The data of this PageDataRole. # noqa: E501 + :type: list[Role] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataRole. # noqa: E501 + + + :return: The has_next of this PageDataRole. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataRole. + + + :param has_next: The has_next of this PageDataRole. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataRole. # noqa: E501 + + + :return: The total_elements of this PageDataRole. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataRole. + + + :param total_elements: The total_elements of this PageDataRole. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataRole. # noqa: E501 + + + :return: The total_pages of this PageDataRole. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataRole. + + + :param total_pages: The total_pages of this PageDataRole. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataRole, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataRole): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_scheduler_event_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_scheduler_event_info.py new file mode 100644 index 0000000..d576023 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_scheduler_event_info.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataSchedulerEventInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[SchedulerEventInfo]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataSchedulerEventInfo - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataSchedulerEventInfo. # noqa: E501 + + + :return: The data of this PageDataSchedulerEventInfo. # noqa: E501 + :rtype: list[SchedulerEventInfo] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataSchedulerEventInfo. + + + :param data: The data of this PageDataSchedulerEventInfo. # noqa: E501 + :type: list[SchedulerEventInfo] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataSchedulerEventInfo. # noqa: E501 + + + :return: The has_next of this PageDataSchedulerEventInfo. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataSchedulerEventInfo. + + + :param has_next: The has_next of this PageDataSchedulerEventInfo. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataSchedulerEventInfo. # noqa: E501 + + + :return: The total_elements of this PageDataSchedulerEventInfo. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataSchedulerEventInfo. + + + :param total_elements: The total_elements of this PageDataSchedulerEventInfo. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataSchedulerEventInfo. # noqa: E501 + + + :return: The total_pages of this PageDataSchedulerEventInfo. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataSchedulerEventInfo. + + + :param total_pages: The total_pages of this PageDataSchedulerEventInfo. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataSchedulerEventInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataSchedulerEventInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_short_entity_view.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_short_entity_view.py new file mode 100644 index 0000000..936c77c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/page_data_short_entity_view.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PageDataShortEntityView(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'data': 'list[ShortEntityView]', + 'has_next': 'bool', + 'total_elements': 'int', + 'total_pages': 'int' + } + + attribute_map = { + 'data': 'data', + 'has_next': 'hasNext', + 'total_elements': 'totalElements', + 'total_pages': 'totalPages' + } + + def __init__(self, data=None, has_next=None, total_elements=None, total_pages=None): # noqa: E501 + """PageDataShortEntityView - a model defined in Swagger""" # noqa: E501 + self._data = None + self._has_next = None + self._total_elements = None + self._total_pages = None + self.discriminator = None + if data is not None: + self.data = data + if has_next is not None: + self.has_next = has_next + if total_elements is not None: + self.total_elements = total_elements + if total_pages is not None: + self.total_pages = total_pages + + @property + def data(self): + """Gets the data of this PageDataShortEntityView. # noqa: E501 + + + :return: The data of this PageDataShortEntityView. # noqa: E501 + :rtype: list[ShortEntityView] + """ + return self._data + + @data.setter + def data(self, data): + """Sets the data of this PageDataShortEntityView. + + + :param data: The data of this PageDataShortEntityView. # noqa: E501 + :type: list[ShortEntityView] + """ + + self._data = data + + @property + def has_next(self): + """Gets the has_next of this PageDataShortEntityView. # noqa: E501 + + + :return: The has_next of this PageDataShortEntityView. # noqa: E501 + :rtype: bool + """ + return self._has_next + + @has_next.setter + def has_next(self, has_next): + """Sets the has_next of this PageDataShortEntityView. + + + :param has_next: The has_next of this PageDataShortEntityView. # noqa: E501 + :type: bool + """ + + self._has_next = has_next + + @property + def total_elements(self): + """Gets the total_elements of this PageDataShortEntityView. # noqa: E501 + + + :return: The total_elements of this PageDataShortEntityView. # noqa: E501 + :rtype: int + """ + return self._total_elements + + @total_elements.setter + def total_elements(self, total_elements): + """Sets the total_elements of this PageDataShortEntityView. + + + :param total_elements: The total_elements of this PageDataShortEntityView. # noqa: E501 + :type: int + """ + + self._total_elements = total_elements + + @property + def total_pages(self): + """Gets the total_pages of this PageDataShortEntityView. # noqa: E501 + + + :return: The total_pages of this PageDataShortEntityView. # noqa: E501 + :rtype: int + """ + return self._total_pages + + @total_pages.setter + def total_pages(self, total_pages): + """Sets the total_pages of this PageDataShortEntityView. + + + :param total_pages: The total_pages of this PageDataShortEntityView. # noqa: E501 + :type: int + """ + + self._total_pages = total_pages + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PageDataShortEntityView, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PageDataShortEntityView): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/palette.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/palette.py new file mode 100644 index 0000000..b78364c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/palette.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Palette(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'colors': 'dict(str, str)', + 'extends': 'str', + 'type': 'str' + } + + attribute_map = { + 'colors': 'colors', + 'extends': 'extends', + 'type': 'type' + } + + def __init__(self, colors=None, extends=None, type=None): # noqa: E501 + """Palette - a model defined in Swagger""" # noqa: E501 + self._colors = None + self._extends = None + self._type = None + self.discriminator = None + if colors is not None: + self.colors = colors + if extends is not None: + self.extends = extends + if type is not None: + self.type = type + + @property + def colors(self): + """Gets the colors of this Palette. # noqa: E501 + + + :return: The colors of this Palette. # noqa: E501 + :rtype: dict(str, str) + """ + return self._colors + + @colors.setter + def colors(self, colors): + """Sets the colors of this Palette. + + + :param colors: The colors of this Palette. # noqa: E501 + :type: dict(str, str) + """ + + self._colors = colors + + @property + def extends(self): + """Gets the extends of this Palette. # noqa: E501 + + + :return: The extends of this Palette. # noqa: E501 + :rtype: str + """ + return self._extends + + @extends.setter + def extends(self, extends): + """Sets the extends of this Palette. + + + :param extends: The extends of this Palette. # noqa: E501 + :type: str + """ + + self._extends = extends + + @property + def type(self): + """Gets the type of this Palette. # noqa: E501 + + + :return: The type of this Palette. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Palette. + + + :param type: The type of this Palette. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Palette, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Palette): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/palette_settings.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/palette_settings.py new file mode 100644 index 0000000..aa5e9dd --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/palette_settings.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class PaletteSettings(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'accent_palette': 'Palette', + 'primary_palette': 'Palette' + } + + attribute_map = { + 'accent_palette': 'accentPalette', + 'primary_palette': 'primaryPalette' + } + + def __init__(self, accent_palette=None, primary_palette=None): # noqa: E501 + """PaletteSettings - a model defined in Swagger""" # noqa: E501 + self._accent_palette = None + self._primary_palette = None + self.discriminator = None + if accent_palette is not None: + self.accent_palette = accent_palette + if primary_palette is not None: + self.primary_palette = primary_palette + + @property + def accent_palette(self): + """Gets the accent_palette of this PaletteSettings. # noqa: E501 + + + :return: The accent_palette of this PaletteSettings. # noqa: E501 + :rtype: Palette + """ + return self._accent_palette + + @accent_palette.setter + def accent_palette(self, accent_palette): + """Sets the accent_palette of this PaletteSettings. + + + :param accent_palette: The accent_palette of this PaletteSettings. # noqa: E501 + :type: Palette + """ + + self._accent_palette = accent_palette + + @property + def primary_palette(self): + """Gets the primary_palette of this PaletteSettings. # noqa: E501 + + + :return: The primary_palette of this PaletteSettings. # noqa: E501 + :rtype: Palette + """ + return self._primary_palette + + @primary_palette.setter + def primary_palette(self, primary_palette): + """Sets the primary_palette of this PaletteSettings. + + + :param primary_palette: The primary_palette of this PaletteSettings. # noqa: E501 + :type: Palette + """ + + self._primary_palette = primary_palette + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(PaletteSettings, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, PaletteSettings): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/relation_entity_type_filter.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/relation_entity_type_filter.py new file mode 100644 index 0000000..02261c5 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/relation_entity_type_filter.py @@ -0,0 +1,145 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RelationEntityTypeFilter(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'relation_type': 'str', + 'entity_types': 'list[str]' + } + + attribute_map = { + 'relation_type': 'relationType', + 'entity_types': 'entityTypes' + } + + def __init__(self, relation_type=None, entity_types=None): # noqa: E501 + """RelationEntityTypeFilter - a model defined in Swagger""" # noqa: E501 + self._relation_type = None + self._entity_types = None + self.discriminator = None + self.relation_type = relation_type + self.entity_types = entity_types + + @property + def relation_type(self): + """Gets the relation_type of this RelationEntityTypeFilter. # noqa: E501 + + + :return: The relation_type of this RelationEntityTypeFilter. # noqa: E501 + :rtype: str + """ + return self._relation_type + + @relation_type.setter + def relation_type(self, relation_type): + """Sets the relation_type of this RelationEntityTypeFilter. + + + :param relation_type: The relation_type of this RelationEntityTypeFilter. # noqa: E501 + :type: str + """ + if relation_type is None: + raise ValueError("Invalid value for `relation_type`, must not be `None`") # noqa: E501 + + self._relation_type = relation_type + + @property + def entity_types(self): + """Gets the entity_types of this RelationEntityTypeFilter. # noqa: E501 + + + :return: The entity_types of this RelationEntityTypeFilter. # noqa: E501 + :rtype: list[str] + """ + return self._entity_types + + @entity_types.setter + def entity_types(self, entity_types): + """Sets the entity_types of this RelationEntityTypeFilter. + + + :param entity_types: The entity_types of this RelationEntityTypeFilter. # noqa: E501 + :type: list[str] + """ + if entity_types is None: + raise ValueError("Invalid value for `entity_types`, must not be `None`") # noqa: E501 + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "ENTITY_GROUP", "CONVERTER", "INTEGRATION", "RULE_CHAIN", "RULE_NODE", "SCHEDULER_EVENT", "BLOB_ENTITY", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "ROLE", "GROUP_PERMISSION", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if not set(entity_types).issubset(set(allowed_values)): + raise ValueError( + "Invalid values for `entity_types` [{0}], must be a subset of [{1}]" # noqa: E501 + .format(", ".join(map(str, set(entity_types) - set(allowed_values))), # noqa: E501 + ", ".join(map(str, allowed_values))) + ) + + self._entity_types = entity_types + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RelationEntityTypeFilter, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RelationEntityTypeFilter): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/relations_search_parameters.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/relations_search_parameters.py new file mode 100644 index 0000000..10bd1a3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/relations_search_parameters.py @@ -0,0 +1,290 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RelationsSearchParameters(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_id': 'EntityId', + 'root_id': 'str', + 'root_type': 'str', + 'direction': 'str', + 'relation_type_group': 'str', + 'max_level': 'int', + 'fetch_last_level_only': 'bool' + } + + attribute_map = { + 'entity_id': 'entityId', + 'root_id': 'rootId', + 'root_type': 'rootType', + 'direction': 'direction', + 'relation_type_group': 'relationTypeGroup', + 'max_level': 'maxLevel', + 'fetch_last_level_only': 'fetchLastLevelOnly' + } + + def __init__(self, entity_id=None, root_id=None, root_type=None, direction=None, relation_type_group=None, max_level=None, fetch_last_level_only=None): # noqa: E501 + """RelationsSearchParameters - a model defined in Swagger""" # noqa: E501 + self._entity_id = None + self._root_id = None + self._root_type = None + self._direction = None + self._relation_type_group = None + self._max_level = None + self._fetch_last_level_only = None + self.discriminator = None + if entity_id is not None: + self.entity_id = entity_id + self.root_id = root_id + self.root_type = root_type + self.direction = direction + self.relation_type_group = relation_type_group + self.max_level = max_level + self.fetch_last_level_only = fetch_last_level_only + + @property + def entity_id(self): + """Gets the entity_id of this RelationsSearchParameters. # noqa: E501 + + + :return: The entity_id of this RelationsSearchParameters. # noqa: E501 + :rtype: EntityId + """ + return self._entity_id + + @entity_id.setter + def entity_id(self, entity_id): + """Sets the entity_id of this RelationsSearchParameters. + + + :param entity_id: The entity_id of this RelationsSearchParameters. # noqa: E501 + :type: EntityId + """ + + self._entity_id = entity_id + + @property + def root_id(self): + """Gets the root_id of this RelationsSearchParameters. # noqa: E501 + + + :return: The root_id of this RelationsSearchParameters. # noqa: E501 + :rtype: str + """ + return self._root_id + + @root_id.setter + def root_id(self, root_id): + """Sets the root_id of this RelationsSearchParameters. + + + :param root_id: The root_id of this RelationsSearchParameters. # noqa: E501 + :type: str + """ + if root_id is None: + raise ValueError("Invalid value for `root_id`, must not be `None`") # noqa: E501 + + self._root_id = root_id + + @property + def root_type(self): + """Gets the root_type of this RelationsSearchParameters. # noqa: E501 + + + :return: The root_type of this RelationsSearchParameters. # noqa: E501 + :rtype: str + """ + return self._root_type + + @root_type.setter + def root_type(self, root_type): + """Sets the root_type of this RelationsSearchParameters. + + + :param root_type: The root_type of this RelationsSearchParameters. # noqa: E501 + :type: str + """ + if root_type is None: + raise ValueError("Invalid value for `root_type`, must not be `None`") # noqa: E501 + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "ENTITY_GROUP", "CONVERTER", "INTEGRATION", "RULE_CHAIN", "RULE_NODE", "SCHEDULER_EVENT", "BLOB_ENTITY", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "ROLE", "GROUP_PERMISSION", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if root_type not in allowed_values: + raise ValueError( + "Invalid value for `root_type` ({0}), must be one of {1}" # noqa: E501 + .format(root_type, allowed_values) + ) + + self._root_type = root_type + + @property + def direction(self): + """Gets the direction of this RelationsSearchParameters. # noqa: E501 + + + :return: The direction of this RelationsSearchParameters. # noqa: E501 + :rtype: str + """ + return self._direction + + @direction.setter + def direction(self, direction): + """Sets the direction of this RelationsSearchParameters. + + + :param direction: The direction of this RelationsSearchParameters. # noqa: E501 + :type: str + """ + if direction is None: + raise ValueError("Invalid value for `direction`, must not be `None`") # noqa: E501 + allowed_values = ["FROM", "TO"] # noqa: E501 + if direction not in allowed_values: + raise ValueError( + "Invalid value for `direction` ({0}), must be one of {1}" # noqa: E501 + .format(direction, allowed_values) + ) + + self._direction = direction + + @property + def relation_type_group(self): + """Gets the relation_type_group of this RelationsSearchParameters. # noqa: E501 + + + :return: The relation_type_group of this RelationsSearchParameters. # noqa: E501 + :rtype: str + """ + return self._relation_type_group + + @relation_type_group.setter + def relation_type_group(self, relation_type_group): + """Sets the relation_type_group of this RelationsSearchParameters. + + + :param relation_type_group: The relation_type_group of this RelationsSearchParameters. # noqa: E501 + :type: str + """ + if relation_type_group is None: + raise ValueError("Invalid value for `relation_type_group`, must not be `None`") # noqa: E501 + allowed_values = ["COMMON", "ALARM", "DASHBOARD", "TO_ENTITY_GROUP", "FROM_ENTITY_GROUP", "RULE_CHAIN", "RULE_NODE", "EDGE", "EDGE_AUTO_ASSIGN_RULE_CHAIN"] # noqa: E501 + if relation_type_group not in allowed_values: + raise ValueError( + "Invalid value for `relation_type_group` ({0}), must be one of {1}" # noqa: E501 + .format(relation_type_group, allowed_values) + ) + + self._relation_type_group = relation_type_group + + @property + def max_level(self): + """Gets the max_level of this RelationsSearchParameters. # noqa: E501 + + + :return: The max_level of this RelationsSearchParameters. # noqa: E501 + :rtype: int + """ + return self._max_level + + @max_level.setter + def max_level(self, max_level): + """Sets the max_level of this RelationsSearchParameters. + + + :param max_level: The max_level of this RelationsSearchParameters. # noqa: E501 + :type: int + """ + if max_level is None: + raise ValueError("Invalid value for `max_level`, must not be `None`") # noqa: E501 + + self._max_level = max_level + + @property + def fetch_last_level_only(self): + """Gets the fetch_last_level_only of this RelationsSearchParameters. # noqa: E501 + + + :return: The fetch_last_level_only of this RelationsSearchParameters. # noqa: E501 + :rtype: bool + """ + return self._fetch_last_level_only + + @fetch_last_level_only.setter + def fetch_last_level_only(self, fetch_last_level_only): + """Sets the fetch_last_level_only of this RelationsSearchParameters. + + + :param fetch_last_level_only: The fetch_last_level_only of this RelationsSearchParameters. # noqa: E501 + :type: bool + """ + if fetch_last_level_only is None: + raise ValueError("Invalid value for `fetch_last_level_only`, must not be `None`") # noqa: E501 + + self._fetch_last_level_only = fetch_last_level_only + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RelationsSearchParameters, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RelationsSearchParameters): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/report_config.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/report_config.py new file mode 100644 index 0000000..3ab58b9 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/report_config.py @@ -0,0 +1,344 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ReportConfig(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'base_url': 'str', + 'dashboard_id': 'str', + 'name_pattern': 'str', + 'state': 'str', + 'timewindow': 'str', + 'timezone': 'str', + 'type': 'str', + 'use_current_user_credentials': 'bool', + 'use_dashboard_timewindow': 'bool', + 'user_id': 'str' + } + + attribute_map = { + 'base_url': 'baseUrl', + 'dashboard_id': 'dashboardId', + 'name_pattern': 'namePattern', + 'state': 'state', + 'timewindow': 'timewindow', + 'timezone': 'timezone', + 'type': 'type', + 'use_current_user_credentials': 'useCurrentUserCredentials', + 'use_dashboard_timewindow': 'useDashboardTimewindow', + 'user_id': 'userId' + } + + def __init__(self, base_url=None, dashboard_id=None, name_pattern=None, state=None, timewindow=None, timezone=None, type=None, use_current_user_credentials=None, use_dashboard_timewindow=None, user_id=None): # noqa: E501 + """ReportConfig - a model defined in Swagger""" # noqa: E501 + self._base_url = None + self._dashboard_id = None + self._name_pattern = None + self._state = None + self._timewindow = None + self._timezone = None + self._type = None + self._use_current_user_credentials = None + self._use_dashboard_timewindow = None + self._user_id = None + self.discriminator = None + if base_url is not None: + self.base_url = base_url + if dashboard_id is not None: + self.dashboard_id = dashboard_id + if name_pattern is not None: + self.name_pattern = name_pattern + if state is not None: + self.state = state + if timewindow is not None: + self.timewindow = timewindow + if timezone is not None: + self.timezone = timezone + if type is not None: + self.type = type + if use_current_user_credentials is not None: + self.use_current_user_credentials = use_current_user_credentials + if use_dashboard_timewindow is not None: + self.use_dashboard_timewindow = use_dashboard_timewindow + if user_id is not None: + self.user_id = user_id + + @property + def base_url(self): + """Gets the base_url of this ReportConfig. # noqa: E501 + + + :return: The base_url of this ReportConfig. # noqa: E501 + :rtype: str + """ + return self._base_url + + @base_url.setter + def base_url(self, base_url): + """Sets the base_url of this ReportConfig. + + + :param base_url: The base_url of this ReportConfig. # noqa: E501 + :type: str + """ + + self._base_url = base_url + + @property + def dashboard_id(self): + """Gets the dashboard_id of this ReportConfig. # noqa: E501 + + + :return: The dashboard_id of this ReportConfig. # noqa: E501 + :rtype: str + """ + return self._dashboard_id + + @dashboard_id.setter + def dashboard_id(self, dashboard_id): + """Sets the dashboard_id of this ReportConfig. + + + :param dashboard_id: The dashboard_id of this ReportConfig. # noqa: E501 + :type: str + """ + + self._dashboard_id = dashboard_id + + @property + def name_pattern(self): + """Gets the name_pattern of this ReportConfig. # noqa: E501 + + + :return: The name_pattern of this ReportConfig. # noqa: E501 + :rtype: str + """ + return self._name_pattern + + @name_pattern.setter + def name_pattern(self, name_pattern): + """Sets the name_pattern of this ReportConfig. + + + :param name_pattern: The name_pattern of this ReportConfig. # noqa: E501 + :type: str + """ + + self._name_pattern = name_pattern + + @property + def state(self): + """Gets the state of this ReportConfig. # noqa: E501 + + + :return: The state of this ReportConfig. # noqa: E501 + :rtype: str + """ + return self._state + + @state.setter + def state(self, state): + """Sets the state of this ReportConfig. + + + :param state: The state of this ReportConfig. # noqa: E501 + :type: str + """ + + self._state = state + + @property + def timewindow(self): + """Gets the timewindow of this ReportConfig. # noqa: E501 + + + :return: The timewindow of this ReportConfig. # noqa: E501 + :rtype: str + """ + return self._timewindow + + @timewindow.setter + def timewindow(self, timewindow): + """Sets the timewindow of this ReportConfig. + + + :param timewindow: The timewindow of this ReportConfig. # noqa: E501 + :type: str + """ + + self._timewindow = timewindow + + @property + def timezone(self): + """Gets the timezone of this ReportConfig. # noqa: E501 + + + :return: The timezone of this ReportConfig. # noqa: E501 + :rtype: str + """ + return self._timezone + + @timezone.setter + def timezone(self, timezone): + """Sets the timezone of this ReportConfig. + + + :param timezone: The timezone of this ReportConfig. # noqa: E501 + :type: str + """ + + self._timezone = timezone + + @property + def type(self): + """Gets the type of this ReportConfig. # noqa: E501 + + + :return: The type of this ReportConfig. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this ReportConfig. + + + :param type: The type of this ReportConfig. # noqa: E501 + :type: str + """ + + self._type = type + + @property + def use_current_user_credentials(self): + """Gets the use_current_user_credentials of this ReportConfig. # noqa: E501 + + + :return: The use_current_user_credentials of this ReportConfig. # noqa: E501 + :rtype: bool + """ + return self._use_current_user_credentials + + @use_current_user_credentials.setter + def use_current_user_credentials(self, use_current_user_credentials): + """Sets the use_current_user_credentials of this ReportConfig. + + + :param use_current_user_credentials: The use_current_user_credentials of this ReportConfig. # noqa: E501 + :type: bool + """ + + self._use_current_user_credentials = use_current_user_credentials + + @property + def use_dashboard_timewindow(self): + """Gets the use_dashboard_timewindow of this ReportConfig. # noqa: E501 + + + :return: The use_dashboard_timewindow of this ReportConfig. # noqa: E501 + :rtype: bool + """ + return self._use_dashboard_timewindow + + @use_dashboard_timewindow.setter + def use_dashboard_timewindow(self, use_dashboard_timewindow): + """Sets the use_dashboard_timewindow of this ReportConfig. + + + :param use_dashboard_timewindow: The use_dashboard_timewindow of this ReportConfig. # noqa: E501 + :type: bool + """ + + self._use_dashboard_timewindow = use_dashboard_timewindow + + @property + def user_id(self): + """Gets the user_id of this ReportConfig. # noqa: E501 + + + :return: The user_id of this ReportConfig. # noqa: E501 + :rtype: str + """ + return self._user_id + + @user_id.setter + def user_id(self, user_id): + """Sets the user_id of this ReportConfig. + + + :param user_id: The user_id of this ReportConfig. # noqa: E501 + :type: str + """ + + self._user_id = user_id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ReportConfig, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ReportConfig): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/role.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/role.py new file mode 100644 index 0000000..2b31a99 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/role.py @@ -0,0 +1,324 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class Role(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'id': 'RoleId', + 'name': 'str', + 'owner_id': 'EntityId', + 'permissions': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'id': 'id', + 'name': 'name', + 'owner_id': 'ownerId', + 'permissions': 'permissions', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, created_time=None, customer_id=None, id=None, name=None, owner_id=None, permissions=None, tenant_id=None, type=None): # noqa: E501 + """Role - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._customer_id = None + self._id = None + self._name = None + self._owner_id = None + self._permissions = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if id is not None: + self.id = id + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if permissions is not None: + self.permissions = permissions + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this Role. # noqa: E501 + + + :return: The additional_info of this Role. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this Role. + + + :param additional_info: The additional_info of this Role. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this Role. # noqa: E501 + + + :return: The created_time of this Role. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this Role. + + + :param created_time: The created_time of this Role. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this Role. # noqa: E501 + + + :return: The customer_id of this Role. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this Role. + + + :param customer_id: The customer_id of this Role. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def id(self): + """Gets the id of this Role. # noqa: E501 + + + :return: The id of this Role. # noqa: E501 + :rtype: RoleId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this Role. + + + :param id: The id of this Role. # noqa: E501 + :type: RoleId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this Role. # noqa: E501 + + + :return: The name of this Role. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this Role. + + + :param name: The name of this Role. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this Role. # noqa: E501 + + + :return: The owner_id of this Role. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this Role. + + + :param owner_id: The owner_id of this Role. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def permissions(self): + """Gets the permissions of this Role. # noqa: E501 + + + :return: The permissions of this Role. # noqa: E501 + :rtype: str + """ + return self._permissions + + @permissions.setter + def permissions(self, permissions): + """Sets the permissions of this Role. + + + :param permissions: The permissions of this Role. # noqa: E501 + :type: str + """ + + self._permissions = permissions + + @property + def tenant_id(self): + """Gets the tenant_id of this Role. # noqa: E501 + + + :return: The tenant_id of this Role. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this Role. + + + :param tenant_id: The tenant_id of this Role. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this Role. # noqa: E501 + + + :return: The type of this Role. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this Role. + + + :param type: The type of this Role. # noqa: E501 + :type: str + """ + allowed_values = ["GENERIC", "GROUP"] # noqa: E501 + if type not in allowed_values: + raise ValueError( + "Invalid value for `type` ({0}), must be one of {1}" # noqa: E501 + .format(type, allowed_values) + ) + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(Role, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, Role): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/role_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/role_id.py new file mode 100644 index 0000000..27ac225 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/role_id.py @@ -0,0 +1,142 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class RoleId(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'entity_type': 'str', + 'id': 'str' + } + + attribute_map = { + 'entity_type': 'entityType', + 'id': 'id' + } + + def __init__(self, entity_type=None, id=None): # noqa: E501 + """RoleId - a model defined in Swagger""" # noqa: E501 + self._entity_type = None + self._id = None + self.discriminator = None + if entity_type is not None: + self.entity_type = entity_type + if id is not None: + self.id = id + + @property + def entity_type(self): + """Gets the entity_type of this RoleId. # noqa: E501 + + + :return: The entity_type of this RoleId. # noqa: E501 + :rtype: str + """ + return self._entity_type + + @entity_type.setter + def entity_type(self, entity_type): + """Sets the entity_type of this RoleId. + + + :param entity_type: The entity_type of this RoleId. # noqa: E501 + :type: str + """ + allowed_values = ["TENANT", "CUSTOMER", "USER", "DASHBOARD", "ASSET", "DEVICE", "ALARM", "ENTITY_GROUP", "CONVERTER", "INTEGRATION", "RULE_CHAIN", "RULE_NODE", "SCHEDULER_EVENT", "BLOB_ENTITY", "ENTITY_VIEW", "WIDGETS_BUNDLE", "WIDGET_TYPE", "ROLE", "GROUP_PERMISSION", "TENANT_PROFILE", "DEVICE_PROFILE", "API_USAGE_STATE", "TB_RESOURCE", "OTA_PACKAGE", "EDGE", "RPC"] # noqa: E501 + if entity_type not in allowed_values: + raise ValueError( + "Invalid value for `entity_type` ({0}), must be one of {1}" # noqa: E501 + .format(entity_type, allowed_values) + ) + + self._entity_type = entity_type + + @property + def id(self): + """Gets the id of this RoleId. # noqa: E501 + + + :return: The id of this RoleId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this RoleId. + + + :param id: The id of this RoleId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(RoleId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, RoleId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event.py new file mode 100644 index 0000000..85080f7 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event.py @@ -0,0 +1,344 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class SchedulerEvent(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'configuration': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'id': 'SchedulerEventId', + 'name': 'str', + 'owner_id': 'EntityId', + 'schedule': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'configuration': 'configuration', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'id': 'id', + 'name': 'name', + 'owner_id': 'ownerId', + 'schedule': 'schedule', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, configuration=None, created_time=None, customer_id=None, id=None, name=None, owner_id=None, schedule=None, tenant_id=None, type=None): # noqa: E501 + """SchedulerEvent - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._configuration = None + self._created_time = None + self._customer_id = None + self._id = None + self._name = None + self._owner_id = None + self._schedule = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if configuration is not None: + self.configuration = configuration + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if id is not None: + self.id = id + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if schedule is not None: + self.schedule = schedule + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this SchedulerEvent. # noqa: E501 + + + :return: The additional_info of this SchedulerEvent. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this SchedulerEvent. + + + :param additional_info: The additional_info of this SchedulerEvent. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def configuration(self): + """Gets the configuration of this SchedulerEvent. # noqa: E501 + + + :return: The configuration of this SchedulerEvent. # noqa: E501 + :rtype: str + """ + return self._configuration + + @configuration.setter + def configuration(self, configuration): + """Sets the configuration of this SchedulerEvent. + + + :param configuration: The configuration of this SchedulerEvent. # noqa: E501 + :type: str + """ + + self._configuration = configuration + + @property + def created_time(self): + """Gets the created_time of this SchedulerEvent. # noqa: E501 + + + :return: The created_time of this SchedulerEvent. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this SchedulerEvent. + + + :param created_time: The created_time of this SchedulerEvent. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this SchedulerEvent. # noqa: E501 + + + :return: The customer_id of this SchedulerEvent. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this SchedulerEvent. + + + :param customer_id: The customer_id of this SchedulerEvent. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def id(self): + """Gets the id of this SchedulerEvent. # noqa: E501 + + + :return: The id of this SchedulerEvent. # noqa: E501 + :rtype: SchedulerEventId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this SchedulerEvent. + + + :param id: The id of this SchedulerEvent. # noqa: E501 + :type: SchedulerEventId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this SchedulerEvent. # noqa: E501 + + + :return: The name of this SchedulerEvent. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this SchedulerEvent. + + + :param name: The name of this SchedulerEvent. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this SchedulerEvent. # noqa: E501 + + + :return: The owner_id of this SchedulerEvent. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this SchedulerEvent. + + + :param owner_id: The owner_id of this SchedulerEvent. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def schedule(self): + """Gets the schedule of this SchedulerEvent. # noqa: E501 + + + :return: The schedule of this SchedulerEvent. # noqa: E501 + :rtype: str + """ + return self._schedule + + @schedule.setter + def schedule(self, schedule): + """Sets the schedule of this SchedulerEvent. + + + :param schedule: The schedule of this SchedulerEvent. # noqa: E501 + :type: str + """ + + self._schedule = schedule + + @property + def tenant_id(self): + """Gets the tenant_id of this SchedulerEvent. # noqa: E501 + + + :return: The tenant_id of this SchedulerEvent. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this SchedulerEvent. + + + :param tenant_id: The tenant_id of this SchedulerEvent. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this SchedulerEvent. # noqa: E501 + + + :return: The type of this SchedulerEvent. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this SchedulerEvent. + + + :param type: The type of this SchedulerEvent. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SchedulerEvent, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SchedulerEvent): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event_id.py new file mode 100644 index 0000000..1d31f19 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event_id.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from . import EntityId + + +class SchedulerEventId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """SchedulerEventId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this SchedulerEventId. # noqa: E501 + + + :return: The id of this SchedulerEventId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this SchedulerEventId. + + + :param id: The id of this SchedulerEventId. # noqa: E501 + :type: str + """ + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SchedulerEventId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SchedulerEventId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event_info.py new file mode 100644 index 0000000..d2b7750 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event_info.py @@ -0,0 +1,318 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class SchedulerEventInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'id': 'SchedulerEventId', + 'name': 'str', + 'owner_id': 'EntityId', + 'schedule': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'id': 'id', + 'name': 'name', + 'owner_id': 'ownerId', + 'schedule': 'schedule', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, created_time=None, customer_id=None, id=None, name=None, owner_id=None, schedule=None, tenant_id=None, type=None): # noqa: E501 + """SchedulerEventInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._customer_id = None + self._id = None + self._name = None + self._owner_id = None + self._schedule = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if id is not None: + self.id = id + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if schedule is not None: + self.schedule = schedule + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this SchedulerEventInfo. # noqa: E501 + + + :return: The additional_info of this SchedulerEventInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this SchedulerEventInfo. + + + :param additional_info: The additional_info of this SchedulerEventInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this SchedulerEventInfo. # noqa: E501 + + + :return: The created_time of this SchedulerEventInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this SchedulerEventInfo. + + + :param created_time: The created_time of this SchedulerEventInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this SchedulerEventInfo. # noqa: E501 + + + :return: The customer_id of this SchedulerEventInfo. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this SchedulerEventInfo. + + + :param customer_id: The customer_id of this SchedulerEventInfo. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def id(self): + """Gets the id of this SchedulerEventInfo. # noqa: E501 + + + :return: The id of this SchedulerEventInfo. # noqa: E501 + :rtype: SchedulerEventId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this SchedulerEventInfo. + + + :param id: The id of this SchedulerEventInfo. # noqa: E501 + :type: SchedulerEventId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this SchedulerEventInfo. # noqa: E501 + + + :return: The name of this SchedulerEventInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this SchedulerEventInfo. + + + :param name: The name of this SchedulerEventInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this SchedulerEventInfo. # noqa: E501 + + + :return: The owner_id of this SchedulerEventInfo. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this SchedulerEventInfo. + + + :param owner_id: The owner_id of this SchedulerEventInfo. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def schedule(self): + """Gets the schedule of this SchedulerEventInfo. # noqa: E501 + + + :return: The schedule of this SchedulerEventInfo. # noqa: E501 + :rtype: str + """ + return self._schedule + + @schedule.setter + def schedule(self, schedule): + """Sets the schedule of this SchedulerEventInfo. + + + :param schedule: The schedule of this SchedulerEventInfo. # noqa: E501 + :type: str + """ + + self._schedule = schedule + + @property + def tenant_id(self): + """Gets the tenant_id of this SchedulerEventInfo. # noqa: E501 + + + :return: The tenant_id of this SchedulerEventInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this SchedulerEventInfo. + + + :param tenant_id: The tenant_id of this SchedulerEventInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this SchedulerEventInfo. # noqa: E501 + + + :return: The type of this SchedulerEventInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this SchedulerEventInfo. + + + :param type: The type of this SchedulerEventInfo. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SchedulerEventInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SchedulerEventInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event_with_customer_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event_with_customer_info.py new file mode 100644 index 0000000..f632eed --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/scheduler_event_with_customer_info.py @@ -0,0 +1,370 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class SchedulerEventWithCustomerInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'customer_is_public': 'bool', + 'customer_title': 'str', + 'id': 'SchedulerEventId', + 'name': 'str', + 'owner_id': 'EntityId', + 'schedule': 'str', + 'tenant_id': 'TenantId', + 'type': 'str' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'customer_is_public': 'customerIsPublic', + 'customer_title': 'customerTitle', + 'id': 'id', + 'name': 'name', + 'owner_id': 'ownerId', + 'schedule': 'schedule', + 'tenant_id': 'tenantId', + 'type': 'type' + } + + def __init__(self, additional_info=None, created_time=None, customer_id=None, customer_is_public=None, customer_title=None, id=None, name=None, owner_id=None, schedule=None, tenant_id=None, type=None): # noqa: E501 + """SchedulerEventWithCustomerInfo - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._created_time = None + self._customer_id = None + self._customer_is_public = None + self._customer_title = None + self._id = None + self._name = None + self._owner_id = None + self._schedule = None + self._tenant_id = None + self._type = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if customer_is_public is not None: + self.customer_is_public = customer_is_public + if customer_title is not None: + self.customer_title = customer_title + if id is not None: + self.id = id + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if schedule is not None: + self.schedule = schedule + if tenant_id is not None: + self.tenant_id = tenant_id + if type is not None: + self.type = type + + @property + def additional_info(self): + """Gets the additional_info of this SchedulerEventWithCustomerInfo. # noqa: E501 + + + :return: The additional_info of this SchedulerEventWithCustomerInfo. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this SchedulerEventWithCustomerInfo. + + + :param additional_info: The additional_info of this SchedulerEventWithCustomerInfo. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def created_time(self): + """Gets the created_time of this SchedulerEventWithCustomerInfo. # noqa: E501 + + + :return: The created_time of this SchedulerEventWithCustomerInfo. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this SchedulerEventWithCustomerInfo. + + + :param created_time: The created_time of this SchedulerEventWithCustomerInfo. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this SchedulerEventWithCustomerInfo. # noqa: E501 + + + :return: The customer_id of this SchedulerEventWithCustomerInfo. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this SchedulerEventWithCustomerInfo. + + + :param customer_id: The customer_id of this SchedulerEventWithCustomerInfo. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def customer_is_public(self): + """Gets the customer_is_public of this SchedulerEventWithCustomerInfo. # noqa: E501 + + + :return: The customer_is_public of this SchedulerEventWithCustomerInfo. # noqa: E501 + :rtype: bool + """ + return self._customer_is_public + + @customer_is_public.setter + def customer_is_public(self, customer_is_public): + """Sets the customer_is_public of this SchedulerEventWithCustomerInfo. + + + :param customer_is_public: The customer_is_public of this SchedulerEventWithCustomerInfo. # noqa: E501 + :type: bool + """ + + self._customer_is_public = customer_is_public + + @property + def customer_title(self): + """Gets the customer_title of this SchedulerEventWithCustomerInfo. # noqa: E501 + + + :return: The customer_title of this SchedulerEventWithCustomerInfo. # noqa: E501 + :rtype: str + """ + return self._customer_title + + @customer_title.setter + def customer_title(self, customer_title): + """Sets the customer_title of this SchedulerEventWithCustomerInfo. + + + :param customer_title: The customer_title of this SchedulerEventWithCustomerInfo. # noqa: E501 + :type: str + """ + + self._customer_title = customer_title + + @property + def id(self): + """Gets the id of this SchedulerEventWithCustomerInfo. # noqa: E501 + + + :return: The id of this SchedulerEventWithCustomerInfo. # noqa: E501 + :rtype: SchedulerEventId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this SchedulerEventWithCustomerInfo. + + + :param id: The id of this SchedulerEventWithCustomerInfo. # noqa: E501 + :type: SchedulerEventId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this SchedulerEventWithCustomerInfo. # noqa: E501 + + + :return: The name of this SchedulerEventWithCustomerInfo. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this SchedulerEventWithCustomerInfo. + + + :param name: The name of this SchedulerEventWithCustomerInfo. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this SchedulerEventWithCustomerInfo. # noqa: E501 + + + :return: The owner_id of this SchedulerEventWithCustomerInfo. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this SchedulerEventWithCustomerInfo. + + + :param owner_id: The owner_id of this SchedulerEventWithCustomerInfo. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def schedule(self): + """Gets the schedule of this SchedulerEventWithCustomerInfo. # noqa: E501 + + + :return: The schedule of this SchedulerEventWithCustomerInfo. # noqa: E501 + :rtype: str + """ + return self._schedule + + @schedule.setter + def schedule(self, schedule): + """Sets the schedule of this SchedulerEventWithCustomerInfo. + + + :param schedule: The schedule of this SchedulerEventWithCustomerInfo. # noqa: E501 + :type: str + """ + + self._schedule = schedule + + @property + def tenant_id(self): + """Gets the tenant_id of this SchedulerEventWithCustomerInfo. # noqa: E501 + + + :return: The tenant_id of this SchedulerEventWithCustomerInfo. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this SchedulerEventWithCustomerInfo. + + + :param tenant_id: The tenant_id of this SchedulerEventWithCustomerInfo. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + @property + def type(self): + """Gets the type of this SchedulerEventWithCustomerInfo. # noqa: E501 + + + :return: The type of this SchedulerEventWithCustomerInfo. # noqa: E501 + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """Sets the type of this SchedulerEventWithCustomerInfo. + + + :param type: The type of this SchedulerEventWithCustomerInfo. # noqa: E501 + :type: str + """ + + self._type = type + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SchedulerEventWithCustomerInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SchedulerEventWithCustomerInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/self_registration_params.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/self_registration_params.py new file mode 100644 index 0000000..2af368c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/self_registration_params.py @@ -0,0 +1,448 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class SelfRegistrationParams(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'admin_settings_id': 'str', + 'app_host': 'str', + 'app_scheme': 'str', + 'app_secret': 'str', + 'captcha_secret_key': 'str', + 'captcha_site_key': 'str', + 'default_dashboard_fullscreen': 'bool', + 'default_dashboard_id': 'str', + 'domain_name': 'str', + 'notification_email': 'str', + 'permissions': 'list[GroupPermission]', + 'pkg_name': 'str', + 'privacy_policy': 'str', + 'sign_up_text_message': 'str' + } + + attribute_map = { + 'admin_settings_id': 'adminSettingsId', + 'app_host': 'appHost', + 'app_scheme': 'appScheme', + 'app_secret': 'appSecret', + 'captcha_secret_key': 'captchaSecretKey', + 'captcha_site_key': 'captchaSiteKey', + 'default_dashboard_fullscreen': 'defaultDashboardFullscreen', + 'default_dashboard_id': 'defaultDashboardId', + 'domain_name': 'domainName', + 'notification_email': 'notificationEmail', + 'permissions': 'permissions', + 'pkg_name': 'pkgName', + 'privacy_policy': 'privacyPolicy', + 'sign_up_text_message': 'signUpTextMessage' + } + + def __init__(self, admin_settings_id=None, app_host=None, app_scheme=None, app_secret=None, captcha_secret_key=None, captcha_site_key=None, default_dashboard_fullscreen=None, default_dashboard_id=None, domain_name=None, notification_email=None, permissions=None, pkg_name=None, privacy_policy=None, sign_up_text_message=None): # noqa: E501 + """SelfRegistrationParams - a model defined in Swagger""" # noqa: E501 + self._admin_settings_id = None + self._app_host = None + self._app_scheme = None + self._app_secret = None + self._captcha_secret_key = None + self._captcha_site_key = None + self._default_dashboard_fullscreen = None + self._default_dashboard_id = None + self._domain_name = None + self._notification_email = None + self._permissions = None + self._pkg_name = None + self._privacy_policy = None + self._sign_up_text_message = None + self.discriminator = None + if admin_settings_id is not None: + self.admin_settings_id = admin_settings_id + if app_host is not None: + self.app_host = app_host + if app_scheme is not None: + self.app_scheme = app_scheme + if app_secret is not None: + self.app_secret = app_secret + if captcha_secret_key is not None: + self.captcha_secret_key = captcha_secret_key + if captcha_site_key is not None: + self.captcha_site_key = captcha_site_key + if default_dashboard_fullscreen is not None: + self.default_dashboard_fullscreen = default_dashboard_fullscreen + if default_dashboard_id is not None: + self.default_dashboard_id = default_dashboard_id + if domain_name is not None: + self.domain_name = domain_name + if notification_email is not None: + self.notification_email = notification_email + if permissions is not None: + self.permissions = permissions + if pkg_name is not None: + self.pkg_name = pkg_name + if privacy_policy is not None: + self.privacy_policy = privacy_policy + if sign_up_text_message is not None: + self.sign_up_text_message = sign_up_text_message + + @property + def admin_settings_id(self): + """Gets the admin_settings_id of this SelfRegistrationParams. # noqa: E501 + + + :return: The admin_settings_id of this SelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._admin_settings_id + + @admin_settings_id.setter + def admin_settings_id(self, admin_settings_id): + """Sets the admin_settings_id of this SelfRegistrationParams. + + + :param admin_settings_id: The admin_settings_id of this SelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._admin_settings_id = admin_settings_id + + @property + def app_host(self): + """Gets the app_host of this SelfRegistrationParams. # noqa: E501 + + + :return: The app_host of this SelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._app_host + + @app_host.setter + def app_host(self, app_host): + """Sets the app_host of this SelfRegistrationParams. + + + :param app_host: The app_host of this SelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._app_host = app_host + + @property + def app_scheme(self): + """Gets the app_scheme of this SelfRegistrationParams. # noqa: E501 + + + :return: The app_scheme of this SelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._app_scheme + + @app_scheme.setter + def app_scheme(self, app_scheme): + """Sets the app_scheme of this SelfRegistrationParams. + + + :param app_scheme: The app_scheme of this SelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._app_scheme = app_scheme + + @property + def app_secret(self): + """Gets the app_secret of this SelfRegistrationParams. # noqa: E501 + + + :return: The app_secret of this SelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._app_secret + + @app_secret.setter + def app_secret(self, app_secret): + """Sets the app_secret of this SelfRegistrationParams. + + + :param app_secret: The app_secret of this SelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._app_secret = app_secret + + @property + def captcha_secret_key(self): + """Gets the captcha_secret_key of this SelfRegistrationParams. # noqa: E501 + + + :return: The captcha_secret_key of this SelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._captcha_secret_key + + @captcha_secret_key.setter + def captcha_secret_key(self, captcha_secret_key): + """Sets the captcha_secret_key of this SelfRegistrationParams. + + + :param captcha_secret_key: The captcha_secret_key of this SelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._captcha_secret_key = captcha_secret_key + + @property + def captcha_site_key(self): + """Gets the captcha_site_key of this SelfRegistrationParams. # noqa: E501 + + + :return: The captcha_site_key of this SelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._captcha_site_key + + @captcha_site_key.setter + def captcha_site_key(self, captcha_site_key): + """Sets the captcha_site_key of this SelfRegistrationParams. + + + :param captcha_site_key: The captcha_site_key of this SelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._captcha_site_key = captcha_site_key + + @property + def default_dashboard_fullscreen(self): + """Gets the default_dashboard_fullscreen of this SelfRegistrationParams. # noqa: E501 + + + :return: The default_dashboard_fullscreen of this SelfRegistrationParams. # noqa: E501 + :rtype: bool + """ + return self._default_dashboard_fullscreen + + @default_dashboard_fullscreen.setter + def default_dashboard_fullscreen(self, default_dashboard_fullscreen): + """Sets the default_dashboard_fullscreen of this SelfRegistrationParams. + + + :param default_dashboard_fullscreen: The default_dashboard_fullscreen of this SelfRegistrationParams. # noqa: E501 + :type: bool + """ + + self._default_dashboard_fullscreen = default_dashboard_fullscreen + + @property + def default_dashboard_id(self): + """Gets the default_dashboard_id of this SelfRegistrationParams. # noqa: E501 + + + :return: The default_dashboard_id of this SelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._default_dashboard_id + + @default_dashboard_id.setter + def default_dashboard_id(self, default_dashboard_id): + """Sets the default_dashboard_id of this SelfRegistrationParams. + + + :param default_dashboard_id: The default_dashboard_id of this SelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._default_dashboard_id = default_dashboard_id + + @property + def domain_name(self): + """Gets the domain_name of this SelfRegistrationParams. # noqa: E501 + + + :return: The domain_name of this SelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._domain_name + + @domain_name.setter + def domain_name(self, domain_name): + """Sets the domain_name of this SelfRegistrationParams. + + + :param domain_name: The domain_name of this SelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._domain_name = domain_name + + @property + def notification_email(self): + """Gets the notification_email of this SelfRegistrationParams. # noqa: E501 + + + :return: The notification_email of this SelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._notification_email + + @notification_email.setter + def notification_email(self, notification_email): + """Sets the notification_email of this SelfRegistrationParams. + + + :param notification_email: The notification_email of this SelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._notification_email = notification_email + + @property + def permissions(self): + """Gets the permissions of this SelfRegistrationParams. # noqa: E501 + + + :return: The permissions of this SelfRegistrationParams. # noqa: E501 + :rtype: list[GroupPermission] + """ + return self._permissions + + @permissions.setter + def permissions(self, permissions): + """Sets the permissions of this SelfRegistrationParams. + + + :param permissions: The permissions of this SelfRegistrationParams. # noqa: E501 + :type: list[GroupPermission] + """ + + self._permissions = permissions + + @property + def pkg_name(self): + """Gets the pkg_name of this SelfRegistrationParams. # noqa: E501 + + + :return: The pkg_name of this SelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._pkg_name + + @pkg_name.setter + def pkg_name(self, pkg_name): + """Sets the pkg_name of this SelfRegistrationParams. + + + :param pkg_name: The pkg_name of this SelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._pkg_name = pkg_name + + @property + def privacy_policy(self): + """Gets the privacy_policy of this SelfRegistrationParams. # noqa: E501 + + + :return: The privacy_policy of this SelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._privacy_policy + + @privacy_policy.setter + def privacy_policy(self, privacy_policy): + """Sets the privacy_policy of this SelfRegistrationParams. + + + :param privacy_policy: The privacy_policy of this SelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._privacy_policy = privacy_policy + + @property + def sign_up_text_message(self): + """Gets the sign_up_text_message of this SelfRegistrationParams. # noqa: E501 + + + :return: The sign_up_text_message of this SelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._sign_up_text_message + + @sign_up_text_message.setter + def sign_up_text_message(self, sign_up_text_message): + """Sets the sign_up_text_message of this SelfRegistrationParams. + + + :param sign_up_text_message: The sign_up_text_message of this SelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._sign_up_text_message = sign_up_text_message + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SelfRegistrationParams, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SelfRegistrationParams): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/share_group_request.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/share_group_request.py new file mode 100644 index 0000000..329aca5 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/share_group_request.py @@ -0,0 +1,245 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ShareGroupRequest(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'all_user_group': 'bool', + 'owner_id': 'EntityId', + 'is_all_user_group': 'bool', + 'user_group_id': 'EntityGroupId', + 'read_else_write': 'bool', + 'role_ids': 'list[RoleId]' + } + + attribute_map = { + 'all_user_group': 'allUserGroup', + 'owner_id': 'ownerId', + 'is_all_user_group': 'isAllUserGroup', + 'user_group_id': 'userGroupId', + 'read_else_write': 'readElseWrite', + 'role_ids': 'roleIds' + } + + def __init__(self, all_user_group=None, owner_id=None, is_all_user_group=None, user_group_id=None, read_else_write=None, role_ids=None): # noqa: E501 + """ShareGroupRequest - a model defined in Swagger""" # noqa: E501 + self._all_user_group = None + self._owner_id = None + self._is_all_user_group = None + self._user_group_id = None + self._read_else_write = None + self._role_ids = None + self.discriminator = None + if all_user_group is not None: + self.all_user_group = all_user_group + self.owner_id = owner_id + self.is_all_user_group = is_all_user_group + self.user_group_id = user_group_id + self.read_else_write = read_else_write + self.role_ids = role_ids + + @property + def all_user_group(self): + """Gets the all_user_group of this ShareGroupRequest. # noqa: E501 + + + :return: The all_user_group of this ShareGroupRequest. # noqa: E501 + :rtype: bool + """ + return self._all_user_group + + @all_user_group.setter + def all_user_group(self, all_user_group): + """Sets the all_user_group of this ShareGroupRequest. + + + :param all_user_group: The all_user_group of this ShareGroupRequest. # noqa: E501 + :type: bool + """ + + self._all_user_group = all_user_group + + @property + def owner_id(self): + """Gets the owner_id of this ShareGroupRequest. # noqa: E501 + + + :return: The owner_id of this ShareGroupRequest. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this ShareGroupRequest. + + + :param owner_id: The owner_id of this ShareGroupRequest. # noqa: E501 + :type: EntityId + """ + if owner_id is None: + raise ValueError("Invalid value for `owner_id`, must not be `None`") # noqa: E501 + + self._owner_id = owner_id + + @property + def is_all_user_group(self): + """Gets the is_all_user_group of this ShareGroupRequest. # noqa: E501 + + + :return: The is_all_user_group of this ShareGroupRequest. # noqa: E501 + :rtype: bool + """ + return self._is_all_user_group + + @is_all_user_group.setter + def is_all_user_group(self, is_all_user_group): + """Sets the is_all_user_group of this ShareGroupRequest. + + + :param is_all_user_group: The is_all_user_group of this ShareGroupRequest. # noqa: E501 + :type: bool + """ + if is_all_user_group is None: + raise ValueError("Invalid value for `is_all_user_group`, must not be `None`") # noqa: E501 + + self._is_all_user_group = is_all_user_group + + @property + def user_group_id(self): + """Gets the user_group_id of this ShareGroupRequest. # noqa: E501 + + + :return: The user_group_id of this ShareGroupRequest. # noqa: E501 + :rtype: EntityGroupId + """ + return self._user_group_id + + @user_group_id.setter + def user_group_id(self, user_group_id): + """Sets the user_group_id of this ShareGroupRequest. + + + :param user_group_id: The user_group_id of this ShareGroupRequest. # noqa: E501 + :type: EntityGroupId + """ + if user_group_id is None: + raise ValueError("Invalid value for `user_group_id`, must not be `None`") # noqa: E501 + + self._user_group_id = user_group_id + + @property + def read_else_write(self): + """Gets the read_else_write of this ShareGroupRequest. # noqa: E501 + + + :return: The read_else_write of this ShareGroupRequest. # noqa: E501 + :rtype: bool + """ + return self._read_else_write + + @read_else_write.setter + def read_else_write(self, read_else_write): + """Sets the read_else_write of this ShareGroupRequest. + + + :param read_else_write: The read_else_write of this ShareGroupRequest. # noqa: E501 + :type: bool + """ + if read_else_write is None: + raise ValueError("Invalid value for `read_else_write`, must not be `None`") # noqa: E501 + + self._read_else_write = read_else_write + + @property + def role_ids(self): + """Gets the role_ids of this ShareGroupRequest. # noqa: E501 + + + :return: The role_ids of this ShareGroupRequest. # noqa: E501 + :rtype: list[RoleId] + """ + return self._role_ids + + @role_ids.setter + def role_ids(self, role_ids): + """Sets the role_ids of this ShareGroupRequest. + + + :param role_ids: The role_ids of this ShareGroupRequest. # noqa: E501 + :type: list[RoleId] + """ + if role_ids is None: + raise ValueError("Invalid value for `role_ids`, must not be `None`") # noqa: E501 + + self._role_ids = role_ids + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ShareGroupRequest, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ShareGroupRequest): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/short_entity_view.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/short_entity_view.py new file mode 100644 index 0000000..5ac1703 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/short_entity_view.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class ShortEntityView(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'EntityId', + 'name': 'str' + } + + attribute_map = { + 'id': 'id', + 'name': 'name' + } + + def __init__(self, id=None, name=None): # noqa: E501 + """ShortEntityView - a model defined in Swagger""" # noqa: E501 + self._id = None + self._name = None + self.discriminator = None + if id is not None: + self.id = id + if name is not None: + self.name = name + + @property + def id(self): + """Gets the id of this ShortEntityView. # noqa: E501 + + + :return: The id of this ShortEntityView. # noqa: E501 + :rtype: EntityId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this ShortEntityView. + + + :param id: The id of this ShortEntityView. # noqa: E501 + :type: EntityId + """ + + self._id = id + + @property + def name(self): + """Gets the name of this ShortEntityView. # noqa: E501 + + + :return: The name of this ShortEntityView. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this ShortEntityView. + + + :param name: The name of this ShortEntityView. # noqa: E501 + :type: str + """ + + self._name = name + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(ShortEntityView, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, ShortEntityView): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/sign_up_request.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/sign_up_request.py new file mode 100644 index 0000000..68eb337 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/sign_up_request.py @@ -0,0 +1,266 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class SignUpRequest(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'app_secret': 'str', + 'email': 'str', + 'first_name': 'str', + 'last_name': 'str', + 'password': 'str', + 'pkg_name': 'str', + 'recaptcha_response': 'str' + } + + attribute_map = { + 'app_secret': 'appSecret', + 'email': 'email', + 'first_name': 'firstName', + 'last_name': 'lastName', + 'password': 'password', + 'pkg_name': 'pkgName', + 'recaptcha_response': 'recaptchaResponse' + } + + def __init__(self, app_secret=None, email=None, first_name=None, last_name=None, password=None, pkg_name=None, recaptcha_response=None): # noqa: E501 + """SignUpRequest - a model defined in Swagger""" # noqa: E501 + self._app_secret = None + self._email = None + self._first_name = None + self._last_name = None + self._password = None + self._pkg_name = None + self._recaptcha_response = None + self.discriminator = None + if app_secret is not None: + self.app_secret = app_secret + if email is not None: + self.email = email + if first_name is not None: + self.first_name = first_name + if last_name is not None: + self.last_name = last_name + if password is not None: + self.password = password + if pkg_name is not None: + self.pkg_name = pkg_name + if recaptcha_response is not None: + self.recaptcha_response = recaptcha_response + + @property + def app_secret(self): + """Gets the app_secret of this SignUpRequest. # noqa: E501 + + + :return: The app_secret of this SignUpRequest. # noqa: E501 + :rtype: str + """ + return self._app_secret + + @app_secret.setter + def app_secret(self, app_secret): + """Sets the app_secret of this SignUpRequest. + + + :param app_secret: The app_secret of this SignUpRequest. # noqa: E501 + :type: str + """ + + self._app_secret = app_secret + + @property + def email(self): + """Gets the email of this SignUpRequest. # noqa: E501 + + + :return: The email of this SignUpRequest. # noqa: E501 + :rtype: str + """ + return self._email + + @email.setter + def email(self, email): + """Sets the email of this SignUpRequest. + + + :param email: The email of this SignUpRequest. # noqa: E501 + :type: str + """ + + self._email = email + + @property + def first_name(self): + """Gets the first_name of this SignUpRequest. # noqa: E501 + + + :return: The first_name of this SignUpRequest. # noqa: E501 + :rtype: str + """ + return self._first_name + + @first_name.setter + def first_name(self, first_name): + """Sets the first_name of this SignUpRequest. + + + :param first_name: The first_name of this SignUpRequest. # noqa: E501 + :type: str + """ + + self._first_name = first_name + + @property + def last_name(self): + """Gets the last_name of this SignUpRequest. # noqa: E501 + + + :return: The last_name of this SignUpRequest. # noqa: E501 + :rtype: str + """ + return self._last_name + + @last_name.setter + def last_name(self, last_name): + """Sets the last_name of this SignUpRequest. + + + :param last_name: The last_name of this SignUpRequest. # noqa: E501 + :type: str + """ + + self._last_name = last_name + + @property + def password(self): + """Gets the password of this SignUpRequest. # noqa: E501 + + + :return: The password of this SignUpRequest. # noqa: E501 + :rtype: str + """ + return self._password + + @password.setter + def password(self, password): + """Sets the password of this SignUpRequest. + + + :param password: The password of this SignUpRequest. # noqa: E501 + :type: str + """ + + self._password = password + + @property + def pkg_name(self): + """Gets the pkg_name of this SignUpRequest. # noqa: E501 + + + :return: The pkg_name of this SignUpRequest. # noqa: E501 + :rtype: str + """ + return self._pkg_name + + @pkg_name.setter + def pkg_name(self, pkg_name): + """Sets the pkg_name of this SignUpRequest. + + + :param pkg_name: The pkg_name of this SignUpRequest. # noqa: E501 + :type: str + """ + + self._pkg_name = pkg_name + + @property + def recaptcha_response(self): + """Gets the recaptcha_response of this SignUpRequest. # noqa: E501 + + + :return: The recaptcha_response of this SignUpRequest. # noqa: E501 + :rtype: str + """ + return self._recaptcha_response + + @recaptcha_response.setter + def recaptcha_response(self, recaptcha_response): + """Sets the recaptcha_response of this SignUpRequest. + + + :param recaptcha_response: The recaptcha_response of this SignUpRequest. # noqa: E501 + :type: str + """ + + self._recaptcha_response = recaptcha_response + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SignUpRequest, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SignUpRequest): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/sign_up_self_registration_params.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/sign_up_self_registration_params.py new file mode 100644 index 0000000..874ba2e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/sign_up_self_registration_params.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class SignUpSelfRegistrationParams(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'captcha_site_key': 'str', + 'sign_up_text_message': 'str' + } + + attribute_map = { + 'captcha_site_key': 'captchaSiteKey', + 'sign_up_text_message': 'signUpTextMessage' + } + + def __init__(self, captcha_site_key=None, sign_up_text_message=None): # noqa: E501 + """SignUpSelfRegistrationParams - a model defined in Swagger""" # noqa: E501 + self._captcha_site_key = None + self._sign_up_text_message = None + self.discriminator = None + if captcha_site_key is not None: + self.captcha_site_key = captcha_site_key + if sign_up_text_message is not None: + self.sign_up_text_message = sign_up_text_message + + @property + def captcha_site_key(self): + """Gets the captcha_site_key of this SignUpSelfRegistrationParams. # noqa: E501 + + + :return: The captcha_site_key of this SignUpSelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._captcha_site_key + + @captcha_site_key.setter + def captcha_site_key(self, captcha_site_key): + """Sets the captcha_site_key of this SignUpSelfRegistrationParams. + + + :param captcha_site_key: The captcha_site_key of this SignUpSelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._captcha_site_key = captcha_site_key + + @property + def sign_up_text_message(self): + """Gets the sign_up_text_message of this SignUpSelfRegistrationParams. # noqa: E501 + + + :return: The sign_up_text_message of this SignUpSelfRegistrationParams. # noqa: E501 + :rtype: str + """ + return self._sign_up_text_message + + @sign_up_text_message.setter + def sign_up_text_message(self, sign_up_text_message): + """Sets the sign_up_text_message of this SignUpSelfRegistrationParams. + + + :param sign_up_text_message: The sign_up_text_message of this SignUpSelfRegistrationParams. # noqa: E501 + :type: str + """ + + self._sign_up_text_message = sign_up_text_message + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SignUpSelfRegistrationParams, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SignUpSelfRegistrationParams): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/solution_install_response.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/solution_install_response.py new file mode 100644 index 0000000..2044d28 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/solution_install_response.py @@ -0,0 +1,188 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class SolutionInstallResponse(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'dashboard_group_id': 'EntityGroupId', + 'dashboard_id': 'DashboardId', + 'details': 'str', + 'success': 'bool' + } + + attribute_map = { + 'dashboard_group_id': 'dashboardGroupId', + 'dashboard_id': 'dashboardId', + 'details': 'details', + 'success': 'success' + } + + def __init__(self, dashboard_group_id=None, dashboard_id=None, details=None, success=None): # noqa: E501 + """SolutionInstallResponse - a model defined in Swagger""" # noqa: E501 + self._dashboard_group_id = None + self._dashboard_id = None + self._details = None + self._success = None + self.discriminator = None + if dashboard_group_id is not None: + self.dashboard_group_id = dashboard_group_id + if dashboard_id is not None: + self.dashboard_id = dashboard_id + if details is not None: + self.details = details + if success is not None: + self.success = success + + @property + def dashboard_group_id(self): + """Gets the dashboard_group_id of this SolutionInstallResponse. # noqa: E501 + + + :return: The dashboard_group_id of this SolutionInstallResponse. # noqa: E501 + :rtype: EntityGroupId + """ + return self._dashboard_group_id + + @dashboard_group_id.setter + def dashboard_group_id(self, dashboard_group_id): + """Sets the dashboard_group_id of this SolutionInstallResponse. + + + :param dashboard_group_id: The dashboard_group_id of this SolutionInstallResponse. # noqa: E501 + :type: EntityGroupId + """ + + self._dashboard_group_id = dashboard_group_id + + @property + def dashboard_id(self): + """Gets the dashboard_id of this SolutionInstallResponse. # noqa: E501 + + + :return: The dashboard_id of this SolutionInstallResponse. # noqa: E501 + :rtype: DashboardId + """ + return self._dashboard_id + + @dashboard_id.setter + def dashboard_id(self, dashboard_id): + """Sets the dashboard_id of this SolutionInstallResponse. + + + :param dashboard_id: The dashboard_id of this SolutionInstallResponse. # noqa: E501 + :type: DashboardId + """ + + self._dashboard_id = dashboard_id + + @property + def details(self): + """Gets the details of this SolutionInstallResponse. # noqa: E501 + + + :return: The details of this SolutionInstallResponse. # noqa: E501 + :rtype: str + """ + return self._details + + @details.setter + def details(self, details): + """Sets the details of this SolutionInstallResponse. + + + :param details: The details of this SolutionInstallResponse. # noqa: E501 + :type: str + """ + + self._details = details + + @property + def success(self): + """Gets the success of this SolutionInstallResponse. # noqa: E501 + + + :return: The success of this SolutionInstallResponse. # noqa: E501 + :rtype: bool + """ + return self._success + + @success.setter + def success(self, success): + """Sets the success of this SolutionInstallResponse. + + + :param success: The success of this SolutionInstallResponse. # noqa: E501 + :type: bool + """ + + self._success = success + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SolutionInstallResponse, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SolutionInstallResponse): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/subscription_usage.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/subscription_usage.py new file mode 100644 index 0000000..6d3e524 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/subscription_usage.py @@ -0,0 +1,500 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class SubscriptionUsage(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'assets': 'int', + 'converters': 'int', + 'customers': 'int', + 'dashboards': 'int', + 'devices': 'int', + 'dp_storage_days': 'int', + 'emails': 'int', + 'integrations': 'int', + 'js_executions': 'int', + 're_executions': 'int', + 'rule_chains': 'int', + 'scheduler_events': 'int', + 'sms': 'int', + 'transport_data_points': 'int', + 'transport_messages': 'int', + 'users': 'int' + } + + attribute_map = { + 'assets': 'assets', + 'converters': 'converters', + 'customers': 'customers', + 'dashboards': 'dashboards', + 'devices': 'devices', + 'dp_storage_days': 'dpStorageDays', + 'emails': 'emails', + 'integrations': 'integrations', + 'js_executions': 'jsExecutions', + 're_executions': 'reExecutions', + 'rule_chains': 'ruleChains', + 'scheduler_events': 'schedulerEvents', + 'sms': 'sms', + 'transport_data_points': 'transportDataPoints', + 'transport_messages': 'transportMessages', + 'users': 'users' + } + + def __init__(self, assets=None, converters=None, customers=None, dashboards=None, devices=None, dp_storage_days=None, emails=None, integrations=None, js_executions=None, re_executions=None, rule_chains=None, scheduler_events=None, sms=None, transport_data_points=None, transport_messages=None, users=None): # noqa: E501 + """SubscriptionUsage - a model defined in Swagger""" # noqa: E501 + self._assets = None + self._converters = None + self._customers = None + self._dashboards = None + self._devices = None + self._dp_storage_days = None + self._emails = None + self._integrations = None + self._js_executions = None + self._re_executions = None + self._rule_chains = None + self._scheduler_events = None + self._sms = None + self._transport_data_points = None + self._transport_messages = None + self._users = None + self.discriminator = None + if assets is not None: + self.assets = assets + if converters is not None: + self.converters = converters + if customers is not None: + self.customers = customers + if dashboards is not None: + self.dashboards = dashboards + if devices is not None: + self.devices = devices + if dp_storage_days is not None: + self.dp_storage_days = dp_storage_days + if emails is not None: + self.emails = emails + if integrations is not None: + self.integrations = integrations + if js_executions is not None: + self.js_executions = js_executions + if re_executions is not None: + self.re_executions = re_executions + if rule_chains is not None: + self.rule_chains = rule_chains + if scheduler_events is not None: + self.scheduler_events = scheduler_events + if sms is not None: + self.sms = sms + if transport_data_points is not None: + self.transport_data_points = transport_data_points + if transport_messages is not None: + self.transport_messages = transport_messages + if users is not None: + self.users = users + + @property + def assets(self): + """Gets the assets of this SubscriptionUsage. # noqa: E501 + + + :return: The assets of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._assets + + @assets.setter + def assets(self, assets): + """Sets the assets of this SubscriptionUsage. + + + :param assets: The assets of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._assets = assets + + @property + def converters(self): + """Gets the converters of this SubscriptionUsage. # noqa: E501 + + + :return: The converters of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._converters + + @converters.setter + def converters(self, converters): + """Sets the converters of this SubscriptionUsage. + + + :param converters: The converters of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._converters = converters + + @property + def customers(self): + """Gets the customers of this SubscriptionUsage. # noqa: E501 + + + :return: The customers of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._customers + + @customers.setter + def customers(self, customers): + """Sets the customers of this SubscriptionUsage. + + + :param customers: The customers of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._customers = customers + + @property + def dashboards(self): + """Gets the dashboards of this SubscriptionUsage. # noqa: E501 + + + :return: The dashboards of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._dashboards + + @dashboards.setter + def dashboards(self, dashboards): + """Sets the dashboards of this SubscriptionUsage. + + + :param dashboards: The dashboards of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._dashboards = dashboards + + @property + def devices(self): + """Gets the devices of this SubscriptionUsage. # noqa: E501 + + + :return: The devices of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._devices + + @devices.setter + def devices(self, devices): + """Sets the devices of this SubscriptionUsage. + + + :param devices: The devices of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._devices = devices + + @property + def dp_storage_days(self): + """Gets the dp_storage_days of this SubscriptionUsage. # noqa: E501 + + + :return: The dp_storage_days of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._dp_storage_days + + @dp_storage_days.setter + def dp_storage_days(self, dp_storage_days): + """Sets the dp_storage_days of this SubscriptionUsage. + + + :param dp_storage_days: The dp_storage_days of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._dp_storage_days = dp_storage_days + + @property + def emails(self): + """Gets the emails of this SubscriptionUsage. # noqa: E501 + + + :return: The emails of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._emails + + @emails.setter + def emails(self, emails): + """Sets the emails of this SubscriptionUsage. + + + :param emails: The emails of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._emails = emails + + @property + def integrations(self): + """Gets the integrations of this SubscriptionUsage. # noqa: E501 + + + :return: The integrations of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._integrations + + @integrations.setter + def integrations(self, integrations): + """Sets the integrations of this SubscriptionUsage. + + + :param integrations: The integrations of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._integrations = integrations + + @property + def js_executions(self): + """Gets the js_executions of this SubscriptionUsage. # noqa: E501 + + + :return: The js_executions of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._js_executions + + @js_executions.setter + def js_executions(self, js_executions): + """Sets the js_executions of this SubscriptionUsage. + + + :param js_executions: The js_executions of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._js_executions = js_executions + + @property + def re_executions(self): + """Gets the re_executions of this SubscriptionUsage. # noqa: E501 + + + :return: The re_executions of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._re_executions + + @re_executions.setter + def re_executions(self, re_executions): + """Sets the re_executions of this SubscriptionUsage. + + + :param re_executions: The re_executions of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._re_executions = re_executions + + @property + def rule_chains(self): + """Gets the rule_chains of this SubscriptionUsage. # noqa: E501 + + + :return: The rule_chains of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._rule_chains + + @rule_chains.setter + def rule_chains(self, rule_chains): + """Sets the rule_chains of this SubscriptionUsage. + + + :param rule_chains: The rule_chains of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._rule_chains = rule_chains + + @property + def scheduler_events(self): + """Gets the scheduler_events of this SubscriptionUsage. # noqa: E501 + + + :return: The scheduler_events of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._scheduler_events + + @scheduler_events.setter + def scheduler_events(self, scheduler_events): + """Sets the scheduler_events of this SubscriptionUsage. + + + :param scheduler_events: The scheduler_events of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._scheduler_events = scheduler_events + + @property + def sms(self): + """Gets the sms of this SubscriptionUsage. # noqa: E501 + + + :return: The sms of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._sms + + @sms.setter + def sms(self, sms): + """Sets the sms of this SubscriptionUsage. + + + :param sms: The sms of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._sms = sms + + @property + def transport_data_points(self): + """Gets the transport_data_points of this SubscriptionUsage. # noqa: E501 + + + :return: The transport_data_points of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._transport_data_points + + @transport_data_points.setter + def transport_data_points(self, transport_data_points): + """Sets the transport_data_points of this SubscriptionUsage. + + + :param transport_data_points: The transport_data_points of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._transport_data_points = transport_data_points + + @property + def transport_messages(self): + """Gets the transport_messages of this SubscriptionUsage. # noqa: E501 + + + :return: The transport_messages of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._transport_messages + + @transport_messages.setter + def transport_messages(self, transport_messages): + """Sets the transport_messages of this SubscriptionUsage. + + + :param transport_messages: The transport_messages of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._transport_messages = transport_messages + + @property + def users(self): + """Gets the users of this SubscriptionUsage. # noqa: E501 + + + :return: The users of this SubscriptionUsage. # noqa: E501 + :rtype: int + """ + return self._users + + @users.setter + def users(self, users): + """Sets the users of this SubscriptionUsage. + + + :param users: The users of this SubscriptionUsage. # noqa: E501 + :type: int + """ + + self._users = users + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(SubscriptionUsage, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, SubscriptionUsage): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/tenant_solution_template_details.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/tenant_solution_template_details.py new file mode 100644 index 0000000..512d090 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/tenant_solution_template_details.py @@ -0,0 +1,350 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TenantSolutionTemplateDetails(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'description': 'str', + 'highlights': 'str', + 'id': 'str', + 'image_urls': 'list[str]', + 'install_timeout_ms': 'int', + 'installed': 'bool', + 'level': 'str', + 'tenant_attribute_keys': 'list[str]', + 'tenant_telemetry_keys': 'list[str]', + 'title': 'str' + } + + attribute_map = { + 'description': 'description', + 'highlights': 'highlights', + 'id': 'id', + 'image_urls': 'imageUrls', + 'install_timeout_ms': 'installTimeoutMs', + 'installed': 'installed', + 'level': 'level', + 'tenant_attribute_keys': 'tenantAttributeKeys', + 'tenant_telemetry_keys': 'tenantTelemetryKeys', + 'title': 'title' + } + + def __init__(self, description=None, highlights=None, id=None, image_urls=None, install_timeout_ms=None, installed=None, level=None, tenant_attribute_keys=None, tenant_telemetry_keys=None, title=None): # noqa: E501 + """TenantSolutionTemplateDetails - a model defined in Swagger""" # noqa: E501 + self._description = None + self._highlights = None + self._id = None + self._image_urls = None + self._install_timeout_ms = None + self._installed = None + self._level = None + self._tenant_attribute_keys = None + self._tenant_telemetry_keys = None + self._title = None + self.discriminator = None + if description is not None: + self.description = description + if highlights is not None: + self.highlights = highlights + if id is not None: + self.id = id + if image_urls is not None: + self.image_urls = image_urls + if install_timeout_ms is not None: + self.install_timeout_ms = install_timeout_ms + if installed is not None: + self.installed = installed + if level is not None: + self.level = level + if tenant_attribute_keys is not None: + self.tenant_attribute_keys = tenant_attribute_keys + if tenant_telemetry_keys is not None: + self.tenant_telemetry_keys = tenant_telemetry_keys + if title is not None: + self.title = title + + @property + def description(self): + """Gets the description of this TenantSolutionTemplateDetails. # noqa: E501 + + + :return: The description of this TenantSolutionTemplateDetails. # noqa: E501 + :rtype: str + """ + return self._description + + @description.setter + def description(self, description): + """Sets the description of this TenantSolutionTemplateDetails. + + + :param description: The description of this TenantSolutionTemplateDetails. # noqa: E501 + :type: str + """ + + self._description = description + + @property + def highlights(self): + """Gets the highlights of this TenantSolutionTemplateDetails. # noqa: E501 + + + :return: The highlights of this TenantSolutionTemplateDetails. # noqa: E501 + :rtype: str + """ + return self._highlights + + @highlights.setter + def highlights(self, highlights): + """Sets the highlights of this TenantSolutionTemplateDetails. + + + :param highlights: The highlights of this TenantSolutionTemplateDetails. # noqa: E501 + :type: str + """ + + self._highlights = highlights + + @property + def id(self): + """Gets the id of this TenantSolutionTemplateDetails. # noqa: E501 + + + :return: The id of this TenantSolutionTemplateDetails. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this TenantSolutionTemplateDetails. + + + :param id: The id of this TenantSolutionTemplateDetails. # noqa: E501 + :type: str + """ + + self._id = id + + @property + def image_urls(self): + """Gets the image_urls of this TenantSolutionTemplateDetails. # noqa: E501 + + + :return: The image_urls of this TenantSolutionTemplateDetails. # noqa: E501 + :rtype: list[str] + """ + return self._image_urls + + @image_urls.setter + def image_urls(self, image_urls): + """Sets the image_urls of this TenantSolutionTemplateDetails. + + + :param image_urls: The image_urls of this TenantSolutionTemplateDetails. # noqa: E501 + :type: list[str] + """ + + self._image_urls = image_urls + + @property + def install_timeout_ms(self): + """Gets the install_timeout_ms of this TenantSolutionTemplateDetails. # noqa: E501 + + + :return: The install_timeout_ms of this TenantSolutionTemplateDetails. # noqa: E501 + :rtype: int + """ + return self._install_timeout_ms + + @install_timeout_ms.setter + def install_timeout_ms(self, install_timeout_ms): + """Sets the install_timeout_ms of this TenantSolutionTemplateDetails. + + + :param install_timeout_ms: The install_timeout_ms of this TenantSolutionTemplateDetails. # noqa: E501 + :type: int + """ + + self._install_timeout_ms = install_timeout_ms + + @property + def installed(self): + """Gets the installed of this TenantSolutionTemplateDetails. # noqa: E501 + + + :return: The installed of this TenantSolutionTemplateDetails. # noqa: E501 + :rtype: bool + """ + return self._installed + + @installed.setter + def installed(self, installed): + """Sets the installed of this TenantSolutionTemplateDetails. + + + :param installed: The installed of this TenantSolutionTemplateDetails. # noqa: E501 + :type: bool + """ + + self._installed = installed + + @property + def level(self): + """Gets the level of this TenantSolutionTemplateDetails. # noqa: E501 + + + :return: The level of this TenantSolutionTemplateDetails. # noqa: E501 + :rtype: str + """ + return self._level + + @level.setter + def level(self, level): + """Sets the level of this TenantSolutionTemplateDetails. + + + :param level: The level of this TenantSolutionTemplateDetails. # noqa: E501 + :type: str + """ + allowed_values = ["MAKER", "PROTOTYPE", "STARTUP"] # noqa: E501 + if level not in allowed_values: + raise ValueError( + "Invalid value for `level` ({0}), must be one of {1}" # noqa: E501 + .format(level, allowed_values) + ) + + self._level = level + + @property + def tenant_attribute_keys(self): + """Gets the tenant_attribute_keys of this TenantSolutionTemplateDetails. # noqa: E501 + + + :return: The tenant_attribute_keys of this TenantSolutionTemplateDetails. # noqa: E501 + :rtype: list[str] + """ + return self._tenant_attribute_keys + + @tenant_attribute_keys.setter + def tenant_attribute_keys(self, tenant_attribute_keys): + """Sets the tenant_attribute_keys of this TenantSolutionTemplateDetails. + + + :param tenant_attribute_keys: The tenant_attribute_keys of this TenantSolutionTemplateDetails. # noqa: E501 + :type: list[str] + """ + + self._tenant_attribute_keys = tenant_attribute_keys + + @property + def tenant_telemetry_keys(self): + """Gets the tenant_telemetry_keys of this TenantSolutionTemplateDetails. # noqa: E501 + + + :return: The tenant_telemetry_keys of this TenantSolutionTemplateDetails. # noqa: E501 + :rtype: list[str] + """ + return self._tenant_telemetry_keys + + @tenant_telemetry_keys.setter + def tenant_telemetry_keys(self, tenant_telemetry_keys): + """Sets the tenant_telemetry_keys of this TenantSolutionTemplateDetails. + + + :param tenant_telemetry_keys: The tenant_telemetry_keys of this TenantSolutionTemplateDetails. # noqa: E501 + :type: list[str] + """ + + self._tenant_telemetry_keys = tenant_telemetry_keys + + @property + def title(self): + """Gets the title of this TenantSolutionTemplateDetails. # noqa: E501 + + + :return: The title of this TenantSolutionTemplateDetails. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this TenantSolutionTemplateDetails. + + + :param title: The title of this TenantSolutionTemplateDetails. # noqa: E501 + :type: str + """ + + self._title = title + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TenantSolutionTemplateDetails, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TenantSolutionTemplateDetails): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/tenant_solution_template_info.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/tenant_solution_template_info.py new file mode 100644 index 0000000..e623d7f --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/tenant_solution_template_info.py @@ -0,0 +1,324 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TenantSolutionTemplateInfo(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'id': 'str', + 'install_timeout_ms': 'int', + 'installed': 'bool', + 'level': 'str', + 'preview_image_url': 'str', + 'short_description': 'str', + 'tenant_attribute_keys': 'list[str]', + 'tenant_telemetry_keys': 'list[str]', + 'title': 'str' + } + + attribute_map = { + 'id': 'id', + 'install_timeout_ms': 'installTimeoutMs', + 'installed': 'installed', + 'level': 'level', + 'preview_image_url': 'previewImageUrl', + 'short_description': 'shortDescription', + 'tenant_attribute_keys': 'tenantAttributeKeys', + 'tenant_telemetry_keys': 'tenantTelemetryKeys', + 'title': 'title' + } + + def __init__(self, id=None, install_timeout_ms=None, installed=None, level=None, preview_image_url=None, short_description=None, tenant_attribute_keys=None, tenant_telemetry_keys=None, title=None): # noqa: E501 + """TenantSolutionTemplateInfo - a model defined in Swagger""" # noqa: E501 + self._id = None + self._install_timeout_ms = None + self._installed = None + self._level = None + self._preview_image_url = None + self._short_description = None + self._tenant_attribute_keys = None + self._tenant_telemetry_keys = None + self._title = None + self.discriminator = None + if id is not None: + self.id = id + if install_timeout_ms is not None: + self.install_timeout_ms = install_timeout_ms + if installed is not None: + self.installed = installed + if level is not None: + self.level = level + if preview_image_url is not None: + self.preview_image_url = preview_image_url + if short_description is not None: + self.short_description = short_description + if tenant_attribute_keys is not None: + self.tenant_attribute_keys = tenant_attribute_keys + if tenant_telemetry_keys is not None: + self.tenant_telemetry_keys = tenant_telemetry_keys + if title is not None: + self.title = title + + @property + def id(self): + """Gets the id of this TenantSolutionTemplateInfo. # noqa: E501 + + + :return: The id of this TenantSolutionTemplateInfo. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this TenantSolutionTemplateInfo. + + + :param id: The id of this TenantSolutionTemplateInfo. # noqa: E501 + :type: str + """ + + self._id = id + + @property + def install_timeout_ms(self): + """Gets the install_timeout_ms of this TenantSolutionTemplateInfo. # noqa: E501 + + + :return: The install_timeout_ms of this TenantSolutionTemplateInfo. # noqa: E501 + :rtype: int + """ + return self._install_timeout_ms + + @install_timeout_ms.setter + def install_timeout_ms(self, install_timeout_ms): + """Sets the install_timeout_ms of this TenantSolutionTemplateInfo. + + + :param install_timeout_ms: The install_timeout_ms of this TenantSolutionTemplateInfo. # noqa: E501 + :type: int + """ + + self._install_timeout_ms = install_timeout_ms + + @property + def installed(self): + """Gets the installed of this TenantSolutionTemplateInfo. # noqa: E501 + + + :return: The installed of this TenantSolutionTemplateInfo. # noqa: E501 + :rtype: bool + """ + return self._installed + + @installed.setter + def installed(self, installed): + """Sets the installed of this TenantSolutionTemplateInfo. + + + :param installed: The installed of this TenantSolutionTemplateInfo. # noqa: E501 + :type: bool + """ + + self._installed = installed + + @property + def level(self): + """Gets the level of this TenantSolutionTemplateInfo. # noqa: E501 + + + :return: The level of this TenantSolutionTemplateInfo. # noqa: E501 + :rtype: str + """ + return self._level + + @level.setter + def level(self, level): + """Sets the level of this TenantSolutionTemplateInfo. + + + :param level: The level of this TenantSolutionTemplateInfo. # noqa: E501 + :type: str + """ + allowed_values = ["MAKER", "PROTOTYPE", "STARTUP"] # noqa: E501 + if level not in allowed_values: + raise ValueError( + "Invalid value for `level` ({0}), must be one of {1}" # noqa: E501 + .format(level, allowed_values) + ) + + self._level = level + + @property + def preview_image_url(self): + """Gets the preview_image_url of this TenantSolutionTemplateInfo. # noqa: E501 + + + :return: The preview_image_url of this TenantSolutionTemplateInfo. # noqa: E501 + :rtype: str + """ + return self._preview_image_url + + @preview_image_url.setter + def preview_image_url(self, preview_image_url): + """Sets the preview_image_url of this TenantSolutionTemplateInfo. + + + :param preview_image_url: The preview_image_url of this TenantSolutionTemplateInfo. # noqa: E501 + :type: str + """ + + self._preview_image_url = preview_image_url + + @property + def short_description(self): + """Gets the short_description of this TenantSolutionTemplateInfo. # noqa: E501 + + + :return: The short_description of this TenantSolutionTemplateInfo. # noqa: E501 + :rtype: str + """ + return self._short_description + + @short_description.setter + def short_description(self, short_description): + """Sets the short_description of this TenantSolutionTemplateInfo. + + + :param short_description: The short_description of this TenantSolutionTemplateInfo. # noqa: E501 + :type: str + """ + + self._short_description = short_description + + @property + def tenant_attribute_keys(self): + """Gets the tenant_attribute_keys of this TenantSolutionTemplateInfo. # noqa: E501 + + + :return: The tenant_attribute_keys of this TenantSolutionTemplateInfo. # noqa: E501 + :rtype: list[str] + """ + return self._tenant_attribute_keys + + @tenant_attribute_keys.setter + def tenant_attribute_keys(self, tenant_attribute_keys): + """Sets the tenant_attribute_keys of this TenantSolutionTemplateInfo. + + + :param tenant_attribute_keys: The tenant_attribute_keys of this TenantSolutionTemplateInfo. # noqa: E501 + :type: list[str] + """ + + self._tenant_attribute_keys = tenant_attribute_keys + + @property + def tenant_telemetry_keys(self): + """Gets the tenant_telemetry_keys of this TenantSolutionTemplateInfo. # noqa: E501 + + + :return: The tenant_telemetry_keys of this TenantSolutionTemplateInfo. # noqa: E501 + :rtype: list[str] + """ + return self._tenant_telemetry_keys + + @tenant_telemetry_keys.setter + def tenant_telemetry_keys(self, tenant_telemetry_keys): + """Sets the tenant_telemetry_keys of this TenantSolutionTemplateInfo. + + + :param tenant_telemetry_keys: The tenant_telemetry_keys of this TenantSolutionTemplateInfo. # noqa: E501 + :type: list[str] + """ + + self._tenant_telemetry_keys = tenant_telemetry_keys + + @property + def title(self): + """Gets the title of this TenantSolutionTemplateInfo. # noqa: E501 + + + :return: The title of this TenantSolutionTemplateInfo. # noqa: E501 + :rtype: str + """ + return self._title + + @title.setter + def title(self, title): + """Sets the title of this TenantSolutionTemplateInfo. + + + :param title: The title of this TenantSolutionTemplateInfo. # noqa: E501 + :type: str + """ + + self._title = title + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TenantSolutionTemplateInfo, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TenantSolutionTemplateInfo): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/tenant_solution_template_instructions.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/tenant_solution_template_instructions.py new file mode 100644 index 0000000..317b5d0 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/tenant_solution_template_instructions.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class TenantSolutionTemplateInstructions(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'dashboard_group_id': 'EntityGroupId', + 'dashboard_id': 'DashboardId', + 'details': 'str' + } + + attribute_map = { + 'dashboard_group_id': 'dashboardGroupId', + 'dashboard_id': 'dashboardId', + 'details': 'details' + } + + def __init__(self, dashboard_group_id=None, dashboard_id=None, details=None): # noqa: E501 + """TenantSolutionTemplateInstructions - a model defined in Swagger""" # noqa: E501 + self._dashboard_group_id = None + self._dashboard_id = None + self._details = None + self.discriminator = None + if dashboard_group_id is not None: + self.dashboard_group_id = dashboard_group_id + if dashboard_id is not None: + self.dashboard_id = dashboard_id + if details is not None: + self.details = details + + @property + def dashboard_group_id(self): + """Gets the dashboard_group_id of this TenantSolutionTemplateInstructions. # noqa: E501 + + + :return: The dashboard_group_id of this TenantSolutionTemplateInstructions. # noqa: E501 + :rtype: EntityGroupId + """ + return self._dashboard_group_id + + @dashboard_group_id.setter + def dashboard_group_id(self, dashboard_group_id): + """Sets the dashboard_group_id of this TenantSolutionTemplateInstructions. + + + :param dashboard_group_id: The dashboard_group_id of this TenantSolutionTemplateInstructions. # noqa: E501 + :type: EntityGroupId + """ + + self._dashboard_group_id = dashboard_group_id + + @property + def dashboard_id(self): + """Gets the dashboard_id of this TenantSolutionTemplateInstructions. # noqa: E501 + + + :return: The dashboard_id of this TenantSolutionTemplateInstructions. # noqa: E501 + :rtype: DashboardId + """ + return self._dashboard_id + + @dashboard_id.setter + def dashboard_id(self, dashboard_id): + """Sets the dashboard_id of this TenantSolutionTemplateInstructions. + + + :param dashboard_id: The dashboard_id of this TenantSolutionTemplateInstructions. # noqa: E501 + :type: DashboardId + """ + + self._dashboard_id = dashboard_id + + @property + def details(self): + """Gets the details of this TenantSolutionTemplateInstructions. # noqa: E501 + + + :return: The details of this TenantSolutionTemplateInstructions. # noqa: E501 + :rtype: str + """ + return self._details + + @details.setter + def details(self, details): + """Sets the details of this TenantSolutionTemplateInstructions. + + + :param details: The details of this TenantSolutionTemplateInstructions. # noqa: E501 + :type: str + """ + + self._details = details + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(TenantSolutionTemplateInstructions, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, TenantSolutionTemplateInstructions): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/user.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/user.py new file mode 100644 index 0000000..f9164a9 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/user.py @@ -0,0 +1,376 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class User(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'additional_info': 'str', + 'authority': 'str', + 'created_time': 'int', + 'customer_id': 'CustomerId', + 'email': 'str', + 'first_name': 'str', + 'id': 'UserId', + 'last_name': 'str', + 'name': 'str', + 'owner_id': 'EntityId', + 'tenant_id': 'TenantId' + } + + attribute_map = { + 'additional_info': 'additionalInfo', + 'authority': 'authority', + 'created_time': 'createdTime', + 'customer_id': 'customerId', + 'email': 'email', + 'first_name': 'firstName', + 'id': 'id', + 'last_name': 'lastName', + 'name': 'name', + 'owner_id': 'ownerId', + 'tenant_id': 'tenantId' + } + + def __init__(self, additional_info=None, authority=None, created_time=None, customer_id=None, email=None, first_name=None, id=None, last_name=None, name=None, owner_id=None, tenant_id=None): # noqa: E501 + """User - a model defined in Swagger""" # noqa: E501 + self._additional_info = None + self._authority = None + self._created_time = None + self._customer_id = None + self._email = None + self._first_name = None + self._id = None + self._last_name = None + self._name = None + self._owner_id = None + self._tenant_id = None + self.discriminator = None + if additional_info is not None: + self.additional_info = additional_info + if authority is not None: + self.authority = authority + if created_time is not None: + self.created_time = created_time + if customer_id is not None: + self.customer_id = customer_id + if email is not None: + self.email = email + if first_name is not None: + self.first_name = first_name + if id is not None: + self.id = id + if last_name is not None: + self.last_name = last_name + if name is not None: + self.name = name + if owner_id is not None: + self.owner_id = owner_id + if tenant_id is not None: + self.tenant_id = tenant_id + + @property + def additional_info(self): + """Gets the additional_info of this User. # noqa: E501 + + + :return: The additional_info of this User. # noqa: E501 + :rtype: str + """ + return self._additional_info + + @additional_info.setter + def additional_info(self, additional_info): + """Sets the additional_info of this User. + + + :param additional_info: The additional_info of this User. # noqa: E501 + :type: str + """ + + self._additional_info = additional_info + + @property + def authority(self): + """Gets the authority of this User. # noqa: E501 + + + :return: The authority of this User. # noqa: E501 + :rtype: str + """ + return self._authority + + @authority.setter + def authority(self, authority): + """Sets the authority of this User. + + + :param authority: The authority of this User. # noqa: E501 + :type: str + """ + allowed_values = ["SYS_ADMIN", "TENANT_ADMIN", "CUSTOMER_USER", "REFRESH_TOKEN"] # noqa: E501 + if authority not in allowed_values: + raise ValueError( + "Invalid value for `authority` ({0}), must be one of {1}" # noqa: E501 + .format(authority, allowed_values) + ) + + self._authority = authority + + @property + def created_time(self): + """Gets the created_time of this User. # noqa: E501 + + + :return: The created_time of this User. # noqa: E501 + :rtype: int + """ + return self._created_time + + @created_time.setter + def created_time(self, created_time): + """Sets the created_time of this User. + + + :param created_time: The created_time of this User. # noqa: E501 + :type: int + """ + + self._created_time = created_time + + @property + def customer_id(self): + """Gets the customer_id of this User. # noqa: E501 + + + :return: The customer_id of this User. # noqa: E501 + :rtype: CustomerId + """ + return self._customer_id + + @customer_id.setter + def customer_id(self, customer_id): + """Sets the customer_id of this User. + + + :param customer_id: The customer_id of this User. # noqa: E501 + :type: CustomerId + """ + + self._customer_id = customer_id + + @property + def email(self): + """Gets the email of this User. # noqa: E501 + + + :return: The email of this User. # noqa: E501 + :rtype: str + """ + return self._email + + @email.setter + def email(self, email): + """Sets the email of this User. + + + :param email: The email of this User. # noqa: E501 + :type: str + """ + + self._email = email + + @property + def first_name(self): + """Gets the first_name of this User. # noqa: E501 + + + :return: The first_name of this User. # noqa: E501 + :rtype: str + """ + return self._first_name + + @first_name.setter + def first_name(self, first_name): + """Sets the first_name of this User. + + + :param first_name: The first_name of this User. # noqa: E501 + :type: str + """ + + self._first_name = first_name + + @property + def id(self): + """Gets the id of this User. # noqa: E501 + + + :return: The id of this User. # noqa: E501 + :rtype: UserId + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this User. + + + :param id: The id of this User. # noqa: E501 + :type: UserId + """ + + self._id = id + + @property + def last_name(self): + """Gets the last_name of this User. # noqa: E501 + + + :return: The last_name of this User. # noqa: E501 + :rtype: str + """ + return self._last_name + + @last_name.setter + def last_name(self, last_name): + """Sets the last_name of this User. + + + :param last_name: The last_name of this User. # noqa: E501 + :type: str + """ + + self._last_name = last_name + + @property + def name(self): + """Gets the name of this User. # noqa: E501 + + + :return: The name of this User. # noqa: E501 + :rtype: str + """ + return self._name + + @name.setter + def name(self, name): + """Sets the name of this User. + + + :param name: The name of this User. # noqa: E501 + :type: str + """ + + self._name = name + + @property + def owner_id(self): + """Gets the owner_id of this User. # noqa: E501 + + + :return: The owner_id of this User. # noqa: E501 + :rtype: EntityId + """ + return self._owner_id + + @owner_id.setter + def owner_id(self, owner_id): + """Sets the owner_id of this User. + + + :param owner_id: The owner_id of this User. # noqa: E501 + :type: EntityId + """ + + self._owner_id = owner_id + + @property + def tenant_id(self): + """Gets the tenant_id of this User. # noqa: E501 + + + :return: The tenant_id of this User. # noqa: E501 + :rtype: TenantId + """ + return self._tenant_id + + @tenant_id.setter + def tenant_id(self, tenant_id): + """Sets the tenant_id of this User. + + + :param tenant_id: The tenant_id of this User. # noqa: E501 + :type: TenantId + """ + + self._tenant_id = tenant_id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(User, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, User): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/user_id.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/user_id.py new file mode 100644 index 0000000..64b7c15 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/user_id.py @@ -0,0 +1,104 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six +from .entity_id import EntityId + + +class UserId(EntityId): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + + def __init__(self, entity_type, id=None): # noqa: E501 + """UserId - a model defined in Swagger""" # noqa: E501 + super().__init__(entity_type, id) + + @property + def id(self): + """Gets the id of this UserId. # noqa: E501 + + + :return: The id of this UserId. # noqa: E501 + :rtype: str + """ + return self._id + + @id.setter + def id(self, id): + """Sets the id of this UserId. + + + :param id: The id of this UserId. # noqa: E501 + :type: str + """ + if id is None: + raise ValueError("Invalid value for `id`, must not be `None`") # noqa: E501 + + self._id = id + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(UserId, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, UserId): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/white_labeling_params.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/white_labeling_params.py new file mode 100644 index 0000000..335186a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/models/models_pe/white_labeling_params.py @@ -0,0 +1,448 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +import pprint +import re # noqa: F401 + +import six + +class WhiteLabelingParams(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + """ + """ + Attributes: + swagger_types (dict): The key is attribute name + and the value is attribute type. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + """ + swagger_types = { + 'app_title': 'str', + 'custom_css': 'str', + 'enable_help_links': 'bool', + 'favicon': 'Favicon', + 'favicon_checksum': 'str', + 'help_link_base_url': 'str', + 'logo_image_checksum': 'str', + 'logo_image_height': 'int', + 'logo_image_url': 'str', + 'palette_settings': 'PaletteSettings', + 'platform_name': 'str', + 'platform_version': 'str', + 'show_name_version': 'bool', + 'white_labeling_enabled': 'bool' + } + + attribute_map = { + 'app_title': 'appTitle', + 'custom_css': 'customCss', + 'enable_help_links': 'enableHelpLinks', + 'favicon': 'favicon', + 'favicon_checksum': 'faviconChecksum', + 'help_link_base_url': 'helpLinkBaseUrl', + 'logo_image_checksum': 'logoImageChecksum', + 'logo_image_height': 'logoImageHeight', + 'logo_image_url': 'logoImageUrl', + 'palette_settings': 'paletteSettings', + 'platform_name': 'platformName', + 'platform_version': 'platformVersion', + 'show_name_version': 'showNameVersion', + 'white_labeling_enabled': 'whiteLabelingEnabled' + } + + def __init__(self, app_title=None, custom_css=None, enable_help_links=None, favicon=None, favicon_checksum=None, help_link_base_url=None, logo_image_checksum=None, logo_image_height=None, logo_image_url=None, palette_settings=None, platform_name=None, platform_version=None, show_name_version=None, white_labeling_enabled=None): # noqa: E501 + """WhiteLabelingParams - a model defined in Swagger""" # noqa: E501 + self._app_title = None + self._custom_css = None + self._enable_help_links = None + self._favicon = None + self._favicon_checksum = None + self._help_link_base_url = None + self._logo_image_checksum = None + self._logo_image_height = None + self._logo_image_url = None + self._palette_settings = None + self._platform_name = None + self._platform_version = None + self._show_name_version = None + self._white_labeling_enabled = None + self.discriminator = None + if app_title is not None: + self.app_title = app_title + if custom_css is not None: + self.custom_css = custom_css + if enable_help_links is not None: + self.enable_help_links = enable_help_links + if favicon is not None: + self.favicon = favicon + if favicon_checksum is not None: + self.favicon_checksum = favicon_checksum + if help_link_base_url is not None: + self.help_link_base_url = help_link_base_url + if logo_image_checksum is not None: + self.logo_image_checksum = logo_image_checksum + if logo_image_height is not None: + self.logo_image_height = logo_image_height + if logo_image_url is not None: + self.logo_image_url = logo_image_url + if palette_settings is not None: + self.palette_settings = palette_settings + if platform_name is not None: + self.platform_name = platform_name + if platform_version is not None: + self.platform_version = platform_version + if show_name_version is not None: + self.show_name_version = show_name_version + if white_labeling_enabled is not None: + self.white_labeling_enabled = white_labeling_enabled + + @property + def app_title(self): + """Gets the app_title of this WhiteLabelingParams. # noqa: E501 + + + :return: The app_title of this WhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._app_title + + @app_title.setter + def app_title(self, app_title): + """Sets the app_title of this WhiteLabelingParams. + + + :param app_title: The app_title of this WhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._app_title = app_title + + @property + def custom_css(self): + """Gets the custom_css of this WhiteLabelingParams. # noqa: E501 + + + :return: The custom_css of this WhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._custom_css + + @custom_css.setter + def custom_css(self, custom_css): + """Sets the custom_css of this WhiteLabelingParams. + + + :param custom_css: The custom_css of this WhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._custom_css = custom_css + + @property + def enable_help_links(self): + """Gets the enable_help_links of this WhiteLabelingParams. # noqa: E501 + + + :return: The enable_help_links of this WhiteLabelingParams. # noqa: E501 + :rtype: bool + """ + return self._enable_help_links + + @enable_help_links.setter + def enable_help_links(self, enable_help_links): + """Sets the enable_help_links of this WhiteLabelingParams. + + + :param enable_help_links: The enable_help_links of this WhiteLabelingParams. # noqa: E501 + :type: bool + """ + + self._enable_help_links = enable_help_links + + @property + def favicon(self): + """Gets the favicon of this WhiteLabelingParams. # noqa: E501 + + + :return: The favicon of this WhiteLabelingParams. # noqa: E501 + :rtype: Favicon + """ + return self._favicon + + @favicon.setter + def favicon(self, favicon): + """Sets the favicon of this WhiteLabelingParams. + + + :param favicon: The favicon of this WhiteLabelingParams. # noqa: E501 + :type: Favicon + """ + + self._favicon = favicon + + @property + def favicon_checksum(self): + """Gets the favicon_checksum of this WhiteLabelingParams. # noqa: E501 + + + :return: The favicon_checksum of this WhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._favicon_checksum + + @favicon_checksum.setter + def favicon_checksum(self, favicon_checksum): + """Sets the favicon_checksum of this WhiteLabelingParams. + + + :param favicon_checksum: The favicon_checksum of this WhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._favicon_checksum = favicon_checksum + + @property + def help_link_base_url(self): + """Gets the help_link_base_url of this WhiteLabelingParams. # noqa: E501 + + + :return: The help_link_base_url of this WhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._help_link_base_url + + @help_link_base_url.setter + def help_link_base_url(self, help_link_base_url): + """Sets the help_link_base_url of this WhiteLabelingParams. + + + :param help_link_base_url: The help_link_base_url of this WhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._help_link_base_url = help_link_base_url + + @property + def logo_image_checksum(self): + """Gets the logo_image_checksum of this WhiteLabelingParams. # noqa: E501 + + + :return: The logo_image_checksum of this WhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._logo_image_checksum + + @logo_image_checksum.setter + def logo_image_checksum(self, logo_image_checksum): + """Sets the logo_image_checksum of this WhiteLabelingParams. + + + :param logo_image_checksum: The logo_image_checksum of this WhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._logo_image_checksum = logo_image_checksum + + @property + def logo_image_height(self): + """Gets the logo_image_height of this WhiteLabelingParams. # noqa: E501 + + + :return: The logo_image_height of this WhiteLabelingParams. # noqa: E501 + :rtype: int + """ + return self._logo_image_height + + @logo_image_height.setter + def logo_image_height(self, logo_image_height): + """Sets the logo_image_height of this WhiteLabelingParams. + + + :param logo_image_height: The logo_image_height of this WhiteLabelingParams. # noqa: E501 + :type: int + """ + + self._logo_image_height = logo_image_height + + @property + def logo_image_url(self): + """Gets the logo_image_url of this WhiteLabelingParams. # noqa: E501 + + + :return: The logo_image_url of this WhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._logo_image_url + + @logo_image_url.setter + def logo_image_url(self, logo_image_url): + """Sets the logo_image_url of this WhiteLabelingParams. + + + :param logo_image_url: The logo_image_url of this WhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._logo_image_url = logo_image_url + + @property + def palette_settings(self): + """Gets the palette_settings of this WhiteLabelingParams. # noqa: E501 + + + :return: The palette_settings of this WhiteLabelingParams. # noqa: E501 + :rtype: PaletteSettings + """ + return self._palette_settings + + @palette_settings.setter + def palette_settings(self, palette_settings): + """Sets the palette_settings of this WhiteLabelingParams. + + + :param palette_settings: The palette_settings of this WhiteLabelingParams. # noqa: E501 + :type: PaletteSettings + """ + + self._palette_settings = palette_settings + + @property + def platform_name(self): + """Gets the platform_name of this WhiteLabelingParams. # noqa: E501 + + + :return: The platform_name of this WhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._platform_name + + @platform_name.setter + def platform_name(self, platform_name): + """Sets the platform_name of this WhiteLabelingParams. + + + :param platform_name: The platform_name of this WhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._platform_name = platform_name + + @property + def platform_version(self): + """Gets the platform_version of this WhiteLabelingParams. # noqa: E501 + + + :return: The platform_version of this WhiteLabelingParams. # noqa: E501 + :rtype: str + """ + return self._platform_version + + @platform_version.setter + def platform_version(self, platform_version): + """Sets the platform_version of this WhiteLabelingParams. + + + :param platform_version: The platform_version of this WhiteLabelingParams. # noqa: E501 + :type: str + """ + + self._platform_version = platform_version + + @property + def show_name_version(self): + """Gets the show_name_version of this WhiteLabelingParams. # noqa: E501 + + + :return: The show_name_version of this WhiteLabelingParams. # noqa: E501 + :rtype: bool + """ + return self._show_name_version + + @show_name_version.setter + def show_name_version(self, show_name_version): + """Sets the show_name_version of this WhiteLabelingParams. + + + :param show_name_version: The show_name_version of this WhiteLabelingParams. # noqa: E501 + :type: bool + """ + + self._show_name_version = show_name_version + + @property + def white_labeling_enabled(self): + """Gets the white_labeling_enabled of this WhiteLabelingParams. # noqa: E501 + + + :return: The white_labeling_enabled of this WhiteLabelingParams. # noqa: E501 + :rtype: bool + """ + return self._white_labeling_enabled + + @white_labeling_enabled.setter + def white_labeling_enabled(self, white_labeling_enabled): + """Sets the white_labeling_enabled of this WhiteLabelingParams. + + + :param white_labeling_enabled: The white_labeling_enabled of this WhiteLabelingParams. # noqa: E501 + :type: bool + """ + + self._white_labeling_enabled = white_labeling_enabled + + def to_dict(self): + """Returns the model properties as a dict""" + result = {} + + for attr, _ in six.iteritems(self.swagger_types): + value = getattr(self, attr) + if isinstance(value, list): + result[attr] = list(map( + lambda x: x.to_dict() if hasattr(x, "to_dict") else x, + value + )) + elif hasattr(value, "to_dict"): + result[attr] = value.to_dict() + elif isinstance(value, dict): + result[attr] = dict(map( + lambda item: (item[0], item[1].to_dict()) + if hasattr(item[1], "to_dict") else item, + value.items() + )) + else: + result[attr] = value + if issubclass(WhiteLabelingParams, dict): + for key, value in self.items(): + result[key] = value + + return result + + def to_str(self): + """Returns the string representation of the model""" + return pprint.pformat(self.to_dict()) + + def __repr__(self): + """For `print` and `pprint`""" + return self.to_str() + + def __eq__(self, other): + """Returns true if both objects are equal""" + if not isinstance(other, WhiteLabelingParams): + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """Returns true if both objects are not equal""" + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest.py new file mode 100644 index 0000000..4b9e35f --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest.py @@ -0,0 +1,326 @@ +# coding: utf-8 +# Copyright 2020. ThingsBoard +# # +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# # +# http://www.apache.org/licenses/LICENSE-2.0 +# # +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import absolute_import + +import io +import json +import logging +import re +import ssl + +import certifi +# python 2 and python 3 compatibility library +import six +from six.moves.urllib.parse import urlencode + +try: + import urllib3 +except ImportError: + raise ImportError('Swagger python client requires urllib3.') + + +logger = logging.getLogger(__name__) + + +class RESTResponse(io.IOBase): + + def __init__(self, resp): + self.urllib3_response = resp + self.status = resp.status + self.reason = resp.reason + self.data = resp.data + + def getheaders(self): + """Returns a dictionary of the response headers.""" + return self.urllib3_response.getheaders() + + def getheader(self, name, default=None): + """Returns a given response header.""" + return self.urllib3_response.getheader(name, default) + + +class RESTClientObject(object): + + def __init__(self, configuration, pools_size=4, maxsize=None): + # urllib3.PoolManager will pass all kw parameters to connectionpool + # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501 + # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501 + # maxsize is the number of requests to host that are allowed in parallel # noqa: E501 + # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501 + + # cert_reqs + if configuration.verify_ssl: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + + # ca_certs + if configuration.ssl_ca_cert: + ca_certs = configuration.ssl_ca_cert + else: + # if not set certificate file, use Mozilla's root certificates. + ca_certs = certifi.where() + + addition_pool_args = {} + if configuration.assert_hostname is not None: + addition_pool_args['assert_hostname'] = configuration.assert_hostname # noqa: E501 + + if maxsize is None: + if configuration.connection_pool_maxsize is not None: + maxsize = configuration.connection_pool_maxsize + else: + maxsize = 4 + + # https pool manager + if configuration.proxy: + self.pool_manager = urllib3.ProxyManager( + num_pools=pools_size, + maxsize=maxsize, + cert_reqs=cert_reqs, + ca_certs=ca_certs, + cert_file=configuration.cert_file, + key_file=configuration.key_file, + proxy_url=configuration.proxy, + **addition_pool_args + ) + else: + self.pool_manager = urllib3.PoolManager( + num_pools=pools_size, + maxsize=maxsize, + cert_reqs=cert_reqs, + ca_certs=ca_certs, + cert_file=configuration.cert_file, + key_file=configuration.key_file, + **addition_pool_args + ) + + def request(self, method, url, query_params=None, headers=None, + body=None, post_params=None, _preload_content=True, + _request_timeout=None): + """Perform requests. + + :param method: http request method + :param url: http request url + :param query_params: query parameters in the url + :param headers: http request headers + :param body: request json body, for `application/json` + :param post_params: request post parameters, + `application/x-www-form-urlencoded` + and `multipart/form-data` + :param _preload_content: if False, the urllib3.HTTPResponse object will + be returned without reading/decoding response + data. Default is True. + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + """ + method = method.upper() + assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', + 'PATCH', 'OPTIONS'] + + if post_params and body: + raise ValueError( + "body parameter cannot be used with post_params parameter." + ) + + post_params = post_params or {} + headers = headers or {} + + timeout = None + if _request_timeout: + if isinstance(_request_timeout, (int, ) if six.PY3 else (int, long)): # noqa: E501,F821 + timeout = urllib3.Timeout(total=_request_timeout) + elif (isinstance(_request_timeout, tuple) and + len(_request_timeout) == 2): + timeout = urllib3.Timeout( + connect=_request_timeout[0], read=_request_timeout[1]) + + if 'Content-Type' not in headers: + headers['Content-Type'] = 'application/json' + + try: + # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` + if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: + if query_params: + url += '?' + urlencode(query_params) + if re.search('json', headers['Content-Type'], re.IGNORECASE): + request_body = '{}' + if body is not None: + request_body = json.dumps(body) + r = self.pool_manager.request( + method, url, + body=request_body, + preload_content=_preload_content, + timeout=timeout, + headers=headers) + elif headers['Content-Type'] == 'application/x-www-form-urlencoded': # noqa: E501 + r = self.pool_manager.request( + method, url, + fields=post_params, + encode_multipart=False, + preload_content=_preload_content, + timeout=timeout, + headers=headers) + elif headers['Content-Type'] == 'multipart/form-data': + # must del headers['Content-Type'], or the correct + # Content-Type which generated by urllib3 will be + # overwritten. + del headers['Content-Type'] + r = self.pool_manager.request( + method, url, + fields=post_params, + encode_multipart=True, + preload_content=_preload_content, + timeout=timeout, + headers=headers) + # Pass a `string` parameter directly in the body to support + # other content types than Json when `body` argument is + # provided in serialized form + elif isinstance(body, str): + request_body = body + r = self.pool_manager.request( + method, url, + body=request_body, + preload_content=_preload_content, + timeout=timeout, + headers=headers) + else: + # Cannot generate the request from given parameters + msg = """Cannot prepare a request message for provided + arguments. Please check that your arguments match + declared content type.""" + raise ApiException(status=0, reason=msg) + # For `GET`, `HEAD` + else: + r = self.pool_manager.request(method, url, + fields=query_params, + preload_content=_preload_content, + timeout=timeout, + headers=headers) + except urllib3.exceptions.SSLError as e: + msg = "{0}\n{1}".format(type(e).__name__, str(e)) + raise ApiException(status=0, reason=msg) + + if _preload_content: + r = RESTResponse(r) + + # In the python 3, the response.data is bytes. + # we need to decode it to string. + if six.PY3: + r.data = r.data.decode('utf8') + + # log response body + logger.debug("response body: %s", r.data) + + if not 200 <= r.status <= 299: + raise ApiException(http_resp=r) + + return r + + def GET(self, url, headers=None, query_params=None, _preload_content=True, + _request_timeout=None): + return self.request("GET", url, + headers=headers, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + query_params=query_params) + + def HEAD(self, url, headers=None, query_params=None, _preload_content=True, + _request_timeout=None): + return self.request("HEAD", url, + headers=headers, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + query_params=query_params) + + def OPTIONS(self, url, headers=None, query_params=None, post_params=None, + body=None, _preload_content=True, _request_timeout=None): + return self.request("OPTIONS", url, + headers=headers, + query_params=query_params, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + + def DELETE(self, url, headers=None, query_params=None, body=None, + _preload_content=True, _request_timeout=None): + return self.request("DELETE", url, + headers=headers, + query_params=query_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + + def POST(self, url, headers=None, query_params=None, post_params=None, + body=None, _preload_content=True, _request_timeout=None): + return self.request("POST", url, + headers=headers, + query_params=query_params, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + + def PUT(self, url, headers=None, query_params=None, post_params=None, + body=None, _preload_content=True, _request_timeout=None): + return self.request("PUT", url, + headers=headers, + query_params=query_params, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + + def PATCH(self, url, headers=None, query_params=None, post_params=None, + body=None, _preload_content=True, _request_timeout=None): + return self.request("PATCH", url, + headers=headers, + query_params=query_params, + post_params=post_params, + _preload_content=_preload_content, + _request_timeout=_request_timeout, + body=body) + + +class ApiException(Exception): + + def __init__(self, status=None, reason=None, http_resp=None): + if http_resp: + self.status = http_resp.status + self.reason = http_resp.reason + self.body = http_resp.data + self.headers = http_resp.getheaders() + else: + self.status = status + self.reason = reason + self.body = None + self.headers = None + + def __str__(self): + """Custom error messages for exception""" + error_message = "({0})\n"\ + "Reason: {1}\n".format(self.status, self.reason) + if self.headers: + error_message += "HTTP response headers: {0}\n".format( + self.headers) + + if self.body: + error_message += "HTTP response body: {0}\n".format(self.body) + + return error_message diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest_client_base.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest_client_base.py new file mode 100644 index 0000000..dcda3ea --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest_client_base.py @@ -0,0 +1,942 @@ +# coding: utf-8 +# Copyright 2020. ThingsBoard +# # +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# # +# http://www.apache.org/licenses/LICENSE-2.0 +# # +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from time import time, sleep +from typing import List + +from requests import post +from threading import Thread +from logging import getLogger + +from tb_rest_client.api.api_ce import * +from tb_rest_client.models.models_ce import * +from tb_rest_client.models.models_pe import * +from tb_rest_client.configuration import Configuration +from tb_rest_client.api_client import ApiClient + +logger = getLogger(__name__) + + +class RestClientBase(Thread): + def __init__(self, base_url): + super().__init__() + if base_url.startswith("http"): + self.base_url = base_url + else: + self.base_url = "http://" + base_url + self.token_info = {"token": "", "refreshToken": 0} + self.api_client = None + self.username = None + self.password = None + self.logged_in = False + self.stopped = True + self.configuration = Configuration() + self.configuration.host = self.base_url + + def run(self): + self.stopped = False + while not self.stopped: + try: + check_time = time() + if check_time >= self.token_info["refreshToken"] and self.logged_in: + if self.username and self.password: + self.login(self.username, self.password) + else: + logger.error("No username or password provided!") + sleep(1) + except Exception as e: + logger.exception(e) + break + except KeyboardInterrupt: + break + + def stop(self): + self.stopped = True + + def __enter__(self): + self.start() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.stop() + + def login(self, username, password): + """Authorization on the host and saving the toke information""" + if self.username is None and self.password is None: + self.username = username + self.password = password + self.logged_in = True + + token_json = post(self.base_url + "/api/auth/login", json={"username": username, "password": password}, + verify=self.configuration.verify_ssl).json() + token = None + if isinstance(token_json, dict) and token_json.get("token") is not None: + token = token_json["token"] + self.configuration.api_key_prefix["X-Authorization"] = "Bearer" + self.configuration.api_key["X-Authorization"] = token + + self.api_client = ApiClient(self.configuration) + self.__load_controllers() + + def get_token(self): + return self.token_info["token"] + + def delete_client_registration_template(self, client_registration_template_id: EntityId): + client_registration_template_id = self.get_id(client_registration_template_id) + return self.o_auth_2_config_template_controller.delete_client_registration_template_using_delete(client_registration_template_id=client_registration_template_id) + + def get_client_registration_templates(self, ): + return self.o_auth_2_config_template_controller.get_client_registration_templates_using_get() + + def save_client_registration_template(self, body: OAuth2ClientRegistrationTemplate): + return self.o_auth_2_config_template_controller.save_client_registration_template_using_post(body=body) + + def get_asset_types(self, ): + return self.asset_controller.get_asset_types_using_get() + + def delete_asset(self, asset_id: AssetId): + asset_id = self.get_id(asset_id) + return self.asset_controller.delete_asset_using_delete(asset_id=asset_id) + + def get_customer_assets(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.asset_controller.get_customer_assets_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_asset(self, asset_name: str): + return self.asset_controller.get_tenant_asset_using_get(asset_name=asset_name) + + def find_by_query(self, body: AssetSearchQuery): + return self.asset_controller.find_by_query_using_post(body=body) + + def get_tenant_assets(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.asset_controller.get_tenant_assets_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_assets_by_ids(self, asset_ids: list): + return self.asset_controller.get_assets_by_ids_using_get(asset_ids=asset_ids) + + def get_asset_by_id(self, asset_id: AssetId): + asset_id = self.get_id(asset_id) + return self.asset_controller.get_asset_by_id_using_get(asset_id=asset_id) + + def assign_rule_chain_to_edge(self, edge_id: EdgeId, rule_chain_id: RuleChainId): + edge_id = self.get_id(edge_id) + rule_chain_id = self.get_id(rule_chain_id) + return self.rule_chain_controller.assign_rule_chain_to_edge_using_post(edge_id=edge_id, rule_chain_id=rule_chain_id) + + def delete_rule_chain(self, rule_chain_id: RuleChainId): + rule_chain_id = self.get_id(rule_chain_id) + return self.rule_chain_controller.delete_rule_chain_using_delete(rule_chain_id=rule_chain_id) + + def export_rule_chains(self, limit: str): + return self.rule_chain_controller.export_rule_chains_using_get(limit=limit) + + def get_auto_assign_to_edge_rule_chains(self, ): + return self.rule_chain_controller.get_auto_assign_to_edge_rule_chains_using_get() + + def get_edge_rule_chains(self, edge_id: EdgeId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + edge_id = self.get_id(edge_id) + return self.rule_chain_controller.get_edge_rule_chains_using_get(edge_id=edge_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_latest_rule_node_debug_input(self, rule_node_id: RuleNodeId): + rule_node_id = self.get_id(rule_node_id) + return self.rule_chain_controller.get_latest_rule_node_debug_input_using_get(rule_node_id=rule_node_id) + + def get_rule_chain_by_id(self, rule_chain_id: RuleChainId): + rule_chain_id = self.get_id(rule_chain_id) + return self.rule_chain_controller.get_rule_chain_by_id_using_get(rule_chain_id=rule_chain_id) + + def get_rule_chain_meta_data(self, rule_chain_id: RuleChainId): + rule_chain_id = self.get_id(rule_chain_id) + return self.rule_chain_controller.get_rule_chain_meta_data_using_get(rule_chain_id=rule_chain_id) + + def get_rule_chains(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.rule_chain_controller.get_rule_chains_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def import_rule_chains(self, body: RuleChainData, overwrite=None): + return self.rule_chain_controller.import_rule_chains_using_post(body=body, overwrite=overwrite) + + def save_rule_chain_meta_data(self, body: RuleChainMetaData): + return self.rule_chain_controller.save_rule_chain_meta_data_using_post(body=body) + + def save_rule_chain(self, body: DefaultRuleChainCreateRequest): + return self.rule_chain_controller.save_rule_chain_using_post(body=body) + + def save_rule_chain_v1(self, body: RuleChain): + return self.rule_chain_controller.save_rule_chain_using_post1(body=body) + + def set_auto_assign_to_edge_rule_chain(self, rule_chain_id: RuleChainId): + rule_chain_id = self.get_id(rule_chain_id) + return self.rule_chain_controller.set_auto_assign_to_edge_rule_chain_using_post(rule_chain_id=rule_chain_id) + + def set_edge_template_root_rule_chain(self, rule_chain_id: RuleChainId): + rule_chain_id = self.get_id(rule_chain_id) + return self.rule_chain_controller.set_edge_template_root_rule_chain_using_post(rule_chain_id=rule_chain_id) + + def set_root_rule_chain_v1(self, rule_chain_id: RuleChainId): + rule_chain_id = self.get_id(rule_chain_id) + return self.rule_chain_controller.set_root_rule_chain_using_post1(rule_chain_id=rule_chain_id) + + def test_script(self, body: str): + return self.rule_chain_controller.test_script_using_post(body=body) + + def unassign_rule_chain_from_edge(self, edge_id: EdgeId, rule_chain_id: RuleChainId): + edge_id = self.get_id(edge_id) + rule_chain_id = self.get_id(rule_chain_id) + return self.rule_chain_controller.unassign_rule_chain_from_edge_using_delete(edge_id=edge_id, rule_chain_id=rule_chain_id) + + def unset_auto_assign_to_edge_rule_chain(self, rule_chain_id: RuleChainId): + rule_chain_id = self.get_id(rule_chain_id) + return self.rule_chain_controller.unset_auto_assign_to_edge_rule_chain_using_delete(rule_chain_id=rule_chain_id) + + def activate_user(self, body: str, send_activation_mail=None): + return self.auth_controller.activate_user_using_post(body=body, send_activation_mail=send_activation_mail) + + def change_password(self, body: str): + return self.auth_controller.change_password_using_post(body=body) + + def check_activate_token(self, activate_token: str): + return self.auth_controller.check_activate_token_using_get(activate_token=activate_token) + + def check_reset_token(self, reset_token: str): + return self.auth_controller.check_reset_token_using_get(reset_token=reset_token) + + def get_user_password_policy(self, ): + return self.auth_controller.get_user_password_policy_using_get() + + def get_user(self, ): + return self.auth_controller.get_user_using_get() + + def logout(self, ): + return self.auth_controller.logout_using_post() + + def request_reset_password_by_email(self, body: str): + return self.auth_controller.request_reset_password_by_email_using_post(body=body) + + def reset_password(self, body: str): + return self.auth_controller.reset_password_using_post(body=body) + + def get_events_get(self, entity_type: str, entity_id: EntityId, event_type: str, tenant_id: TenantId, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None): + entity_id = self.get_id(entity_id) + tenant_id = self.get_id(tenant_id) + return self.event_controller.get_events_using_get(entity_type=entity_type, entity_id=entity_id, event_type=event_type, tenant_id=tenant_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time) + + def get_events_v1_get1(self, entity_type: str, entity_id: EntityId, tenant_id: TenantId, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None): + entity_id = self.get_id(entity_id) + tenant_id = self.get_id(tenant_id) + return self.event_controller.get_events_using_get1(entity_type=entity_type, entity_id=entity_id, tenant_id=tenant_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time) + + def get_events_post(self, body: EventFilter, tenant_id: TenantId, page_size: int, page: int, entity_type: str, entity_id: EntityId, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None): + tenant_id = self.get_id(tenant_id) + entity_id = self.get_id(entity_id) + return self.event_controller.get_events_using_post(body=body, tenant_id=tenant_id, page_size=page_size, page=page, entity_type=entity_type, entity_id=entity_id, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time) + + def delete_entity_attributes(self, device_id: DeviceId, scope: str, keys: str): + device_id = self.get_id(device_id) + return self.telemetry_controller.delete_entity_attributes_using_delete(device_id=device_id, scope=scope, keys=keys) + + def delete_entity_attributes_v1(self, entity_type: str, entity_id: EntityId, scope: str, keys: str): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.delete_entity_attributes_using_delete1(entity_type=entity_type, entity_id=entity_id, scope=scope, keys=keys) + + def delete_entity_timeseries(self, entity_type: str, entity_id: EntityId, keys: str, delete_all_data_for_keys=None, start_ts=None, end_ts=None, rewrite_latest_if_deleted=None): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.delete_entity_timeseries_using_delete(entity_type=entity_type, entity_id=entity_id, keys=keys, delete_all_data_for_keys=delete_all_data_for_keys, start_ts=start_ts, end_ts=end_ts, rewrite_latest_if_deleted=rewrite_latest_if_deleted) + + def get_attribute_keys_by_scope(self, entity_type: str, entity_id: EntityId, scope: str): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.get_attribute_keys_by_scope_using_get(entity_type=entity_type, entity_id=entity_id, scope=scope) + + def get_attribute_keys(self, entity_type: str, entity_id: EntityId): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.get_attribute_keys_using_get(entity_type=entity_type, entity_id=entity_id) + + def get_attributes_by_scope(self, entity_type: str, entity_id: EntityId, scope: str, keys=None): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.get_attributes_by_scope_using_get(entity_type=entity_type, entity_id=entity_id, scope=scope, keys=keys) + + def get_attributes(self, entity_type: str, entity_id: EntityId, keys=None): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.get_attributes_using_get(entity_type=entity_type, entity_id=entity_id, keys=keys) + + def get_latest_timeseries(self, entity_type: str, entity_id: EntityId, keys=None, use_strict_data_types=None): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.get_latest_timeseries_using_get(entity_type=entity_type, entity_id=entity_id, keys=keys, use_strict_data_types=use_strict_data_types) + + def get_timeseries_keys_v1(self, entity_type: str, entity_id: EntityId): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.get_timeseries_keys_using_get1(entity_type=entity_type, entity_id=entity_id) + + def get_timeseries(self, entity_type: str, entity_id: EntityId, keys: str, start_ts: str, end_ts: str, interval=None, limit=None, agg=None, order_by=None, use_strict_data_types=None): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.get_timeseries_using_get(entity_type=entity_type, entity_id=entity_id, keys=keys, start_ts=start_ts, end_ts=end_ts, interval=interval, limit=limit, agg=agg, order_by=order_by, use_strict_data_types=use_strict_data_types) + + def save_device_attributes(self, body: str, device_id: DeviceId, scope: str): + device_id = self.get_id(device_id) + return self.telemetry_controller.save_device_attributes_using_post(body=body, device_id=device_id, scope=scope) + + def save_entity_attributes_v1(self, body: str, entity_type: str, entity_id: EntityId, scope: str): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.save_entity_attributes_v1_using_post(body=body, entity_type=entity_type, entity_id=entity_id, scope=scope) + + def save_entity_attributes_v2(self, body: str, entity_type: str, entity_id: EntityId, scope: str): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.save_entity_attributes_v2_using_post(body=body, entity_type=entity_type, entity_id=entity_id, scope=scope) + + def save_entity_telemetry(self, body: str, entity_type: str, entity_id: EntityId, scope: str): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.save_entity_telemetry_using_post(body=body, entity_type=entity_type, entity_id=entity_id, scope=scope) + + def save_entity_telemetry_with_ttl(self, body: str, entity_type: str, entity_id: EntityId, scope: str, ttl: int): + entity_id = self.get_id(entity_id) + return self.telemetry_controller.save_entity_telemetry_with_ttl_using_post(body=body, entity_type=entity_type, entity_id=entity_id, scope=scope, ttl=ttl) + + def ack_alarm(self, alarm_id: AlarmId): + alarm_id = self.get_id(alarm_id) + return self.alarm_controller.ack_alarm_using_post(alarm_id=alarm_id) + + def clear_alarm(self, alarm_id: AlarmId): + alarm_id = self.get_id(alarm_id) + return self.alarm_controller.clear_alarm_using_post(alarm_id=alarm_id) + + def delete_alarm(self, alarm_id: AlarmId): + alarm_id = self.get_id(alarm_id) + return self.alarm_controller.delete_alarm_using_delete(alarm_id=alarm_id) + + def get_alarm_by_id(self, alarm_id: AlarmId): + alarm_id = self.get_id(alarm_id) + return self.alarm_controller.get_alarm_by_id_using_get(alarm_id=alarm_id) + + def get_alarm_info_by_id(self, alarm_id: AlarmId): + alarm_id = self.get_id(alarm_id) + return self.alarm_controller.get_alarm_info_by_id_using_get(alarm_id=alarm_id) + + def get_alarms(self, entity_type: str, entity_id: EntityId, page_size: int, page: int, search_status=None, status=None, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None, fetch_originator=None): + entity_id = self.get_id(entity_id) + return self.alarm_controller.get_alarms_using_get(entity_type=entity_type, entity_id=entity_id, page_size=page_size, page=page, search_status=search_status, status=status, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time, fetch_originator=fetch_originator) + + def get_all_alarms(self, page_size: int, page: int, search_status=None, status=None, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None, fetch_originator=None): + return self.alarm_controller.get_all_alarms_using_get(page_size=page_size, page=page, search_status=search_status, status=status, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time, fetch_originator=fetch_originator) + + def get_highest_alarm_severity(self, entity_type: str, entity_id: EntityId, search_status=None, status=None): + entity_id = self.get_id(entity_id) + return self.alarm_controller.get_highest_alarm_severity_using_get(entity_type=entity_type, entity_id=entity_id, search_status=search_status, status=status) + + def save_alarm(self, body: Alarm): + return self.alarm_controller.save_alarm_using_post(body=body) + + def sync_edge(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.sync_edge_using_post(edge_id=edge_id) + + def get_customer_edges(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.edge_controller.get_customer_edges_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_edge_types(self, ): + return self.edge_controller.get_edge_types_using_get() + + def get_tenant_edge(self, edge_name: str): + return self.edge_controller.get_tenant_edge_using_get(edge_name=edge_name) + + def check_instance(self, body: object): + return self.edge_controller.check_instance_using_post(body=body) + + def find_by_query_v2(self, body: EdgeSearchQuery): + return self.edge_controller.find_by_query_using_post2(body=body) + + def delete_edge(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.delete_edge_using_delete(edge_id=edge_id) + + def get_edges(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.edge_controller.get_edges_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def is_edges_support_enabled(self, ): + return self.edge_controller.is_edges_support_enabled_using_get() + + def get_edges_by_ids(self, edge_ids: list): + return self.edge_controller.get_edges_by_ids_using_get(edge_ids=edge_ids) + + def find_missing_to_related_rule_chains(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.find_missing_to_related_rule_chains_using_get(edge_id=edge_id) + + def set_root_rule_chain(self, edge_id: EdgeId, rule_chain_id: RuleChainId): + edge_id = self.get_id(edge_id) + rule_chain_id = self.get_id(rule_chain_id) + return self.edge_controller.set_root_rule_chain_using_post(edge_id=edge_id, rule_chain_id=rule_chain_id) + + def get_edge_by_id(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.get_edge_by_id_using_get(edge_id=edge_id) + + def get_tenant_edges(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.edge_controller.get_tenant_edges_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def activate_instance(self, license_secret: str, release_date: str): + return self.edge_controller.activate_instance_using_post(license_secret=license_secret, release_date=release_date) + + def get_persisted_rpc(self, rpc_id: RpcId): + rpc_id = self.get_id(rpc_id) + return self.rpc_v_2_controller.get_persisted_rpc_using_get(rpc_id=rpc_id) + + def handle_two_way_device_rpc_request_v1(self, body: str, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.rpc_v_2_controller.handle_two_way_device_rpc_request_using_post1(body=body, device_id=device_id) + + def delete_resource(self, rpc_id: RpcId): + rpc_id = self.get_id(rpc_id) + return self.rpc_v_2_controller.delete_resource_using_delete(rpc_id=rpc_id) + + def handle_one_way_device_rpc_request_v1(self, body: str, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.rpc_v_2_controller.handle_one_way_device_rpc_request_using_post1(body=body, device_id=device_id) + + def get_persisted_rpc_by_device(self, device_id: DeviceId, page_size: int, page: int, rpc_status: str, text_search=None, sort_property=None, sort_order=None): + device_id = self.get_id(device_id) + return self.rpc_v_2_controller.get_persisted_rpc_by_device_using_get(device_id=device_id, page_size=page_size, page=page, rpc_status=rpc_status, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def delete_customer(self, customer_id: CustomerId): + customer_id = self.get_id(customer_id) + return self.customer_controller.delete_customer_using_delete(customer_id=customer_id) + + def get_customer_by_id(self, customer_id: CustomerId): + customer_id = self.get_id(customer_id) + return self.customer_controller.get_customer_by_id_using_get(customer_id=customer_id) + + def get_short_customer_info_by_id(self, customer_id: CustomerId): + customer_id = self.get_id(customer_id) + return self.customer_controller.get_short_customer_info_by_id_using_get(customer_id=customer_id) + + def get_customers(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.customer_controller.get_customers_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_customer_title_by_id(self, customer_id: CustomerId): + customer_id = self.get_id(customer_id) + return self.customer_controller.get_customer_title_by_id_using_get(customer_id=customer_id) + + def get_tenant_customer(self, customer_title: str): + return self.customer_controller.get_tenant_customer_using_get(customer_title=customer_title) + + def send_activation_email(self, email: str): + return self.user_controller.send_activation_email_using_post(email=email) + + def get_user_by_id(self, user_id: UserId): + user_id = self.get_id(user_id) + return self.user_controller.get_user_by_id_using_get(user_id=user_id) + + def set_user_credentials_enabled(self, user_id: UserId, user_credentials_enabled=None): + user_id = self.get_id(user_id) + return self.user_controller.set_user_credentials_enabled_using_post(user_id=user_id, user_credentials_enabled=user_credentials_enabled) + + def get_tenant_admins(self, tenant_id: TenantId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + tenant_id = self.get_id(tenant_id) + return self.user_controller.get_tenant_admins_using_get(tenant_id=tenant_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_customer_users(self, customer_id: CustomerId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.user_controller.get_customer_users_using_get(customer_id=customer_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_user_token(self, user_id: UserId): + user_id = self.get_id(user_id) + return self.user_controller.get_user_token_using_get(user_id=user_id) + + def get_activation_link(self, user_id: UserId): + user_id = self.get_id(user_id) + return self.user_controller.get_activation_link_using_get(user_id=user_id) + + def delete_user(self, user_id: UserId): + user_id = self.get_id(user_id) + return self.user_controller.delete_user_using_delete(user_id=user_id) + + def is_user_token_access_enabled(self, ): + return self.user_controller.is_user_token_access_enabled_using_get() + + def get_tenant_queues_by_service_type(self, service_type: str): + return self.queue_controller.get_tenant_queues_by_service_type_using_get(service_type=service_type) + + def handle_one_way_device_rpc_request(self, body: str, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.rpc_v_1_controller.handle_one_way_device_rpc_request_using_post(body=body, device_id=device_id) + + def handle_two_way_device_rpc_request(self, body: str, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.rpc_v_1_controller.handle_two_way_device_rpc_request_using_post(body=body, device_id=device_id) + + def get_tenant_devices(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.device_controller.get_tenant_devices_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_device(self, device_name: str): + return self.device_controller.get_tenant_device_using_get(device_name=device_name) + + def delete_device(self, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.device_controller.delete_device_using_delete(device_id=device_id) + + def re_claim_device(self, device_name: str): + return self.device_controller.re_claim_device_using_delete(device_name=device_name) + + def count_by_device_profile_and_empty_ota_package(self, ota_package_type: str, device_profile_id: DeviceProfileId): + device_profile_id = self.get_id(device_profile_id) + return self.device_controller.count_by_device_profile_and_empty_ota_package_using_get(ota_package_type=ota_package_type, device_profile_id=device_profile_id) + + def get_device_credentials_by_device_id(self, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.device_controller.get_device_credentials_by_device_id_using_get(device_id=device_id) + + def find_by_query_v1(self, body: DeviceSearchQuery): + return self.device_controller.find_by_query_using_post1(body=body) + + def assign_device_to_tenant(self, tenant_id: TenantId, device_id: DeviceId): + tenant_id = self.get_id(tenant_id) + device_id = self.get_id(device_id) + return self.device_controller.assign_device_to_tenant_using_post(tenant_id=tenant_id, device_id=device_id) + + def get_device_types(self, ): + return self.device_controller.get_device_types_using_get() + + def get_device_by_id(self, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.device_controller.get_device_by_id_using_get(device_id=device_id) + + def get_devices_by_ids(self, device_ids: list): + return self.device_controller.get_devices_by_ids_using_get(device_ids=device_ids) + + def get_customer_devices(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.device_controller.get_customer_devices_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def save_device_credentials(self, body: DeviceCredentials): + return self.device_controller.save_device_credentials_using_post(body=body) + + def delete_relation(self, from_id: EntityId, from_type: str, relation_type: str, to_id: EntityId, to_type: str, relation_type_group=None): + from_id = self.get_id(from_id) + to_id = self.get_id(to_id) + return self.entity_relation_controller.delete_relation_using_delete(from_id=from_id, from_type=from_type, relation_type=relation_type, to_id=to_id, to_type=to_type, relation_type_group=relation_type_group) + + def delete_relations(self, entity_id: EntityId, entity_type: str, id: str, type: str): + entity_id = self.get_id(entity_id) + return self.entity_relation_controller.delete_relations_using_delete(entity_id=entity_id, entity_type=entity_type, id=id, type=type) + + def find_by_from(self, from_id: EntityId, from_type: str, relation_type: str, relation_type_group=None): + from_id = self.get_id(from_id) + return self.entity_relation_controller.find_by_from_using_get(from_id=from_id, from_type=from_type, relation_type=relation_type, relation_type_group=relation_type_group) + + def find_by_from_v1(self, from_id: EntityId, from_type: str, relation_type_group=None): + from_id = self.get_id(from_id) + return self.entity_relation_controller.find_by_from_using_get1(from_id=from_id, from_type=from_type, relation_type_group=relation_type_group) + + def find_by_query_v3(self, body: EntityRelationsQuery): + return self.entity_relation_controller.find_by_query_using_post3(body=body) + + def find_by_to(self, to_id: EntityId, to_type: str, relation_type: str, relation_type_group=None): + to_id = self.get_id(to_id) + return self.entity_relation_controller.find_by_to_using_get(to_id=to_id, to_type=to_type, relation_type=relation_type, relation_type_group=relation_type_group) + + def find_by_to_v1(self, to_id: EntityId, to_type: str, relation_type_group=None): + to_id = self.get_id(to_id) + return self.entity_relation_controller.find_by_to_using_get1(to_id=to_id, to_type=to_type, relation_type_group=relation_type_group) + + def find_info_by_from(self, from_id: EntityId, from_type: str, relation_type_group=None): + from_id = self.get_id(from_id) + return self.entity_relation_controller.find_info_by_from_using_get(from_id=from_id, from_type=from_type, relation_type_group=relation_type_group) + + def find_info_by_query(self, body: EntityRelationsQuery): + return self.entity_relation_controller.find_info_by_query_using_post(body=body) + + def find_info_by_to(self, to_id: EntityId, to_type: str, relation_type_group=None): + to_id = self.get_id(to_id) + return self.entity_relation_controller.find_info_by_to_using_get(to_id=to_id, to_type=to_type, relation_type_group=relation_type_group) + + def get_relation(self, from_id: EntityId, from_type: str, relation_type: str, to_id: EntityId, to_type: str, relation_type_group=None): + from_id = self.get_id(from_id) + to_id = self.get_id(to_id) + return self.entity_relation_controller.get_relation_using_get(from_id=from_id, from_type=from_type, relation_type=relation_type, to_id=to_id, to_type=to_type, relation_type_group=relation_type_group) + + def save_relation(self, body: EntityRelation): + return self.entity_relation_controller.save_relation_using_post(body=body) + + def delete_entity_view(self, entity_view_id: EntityViewId): + entity_view_id = self.get_id(entity_view_id) + return self.entity_view_controller.delete_entity_view_using_delete(entity_view_id=entity_view_id) + + def get_tenant_entity_view(self, entity_view_name: str): + return self.entity_view_controller.get_tenant_entity_view_using_get(entity_view_name=entity_view_name) + + def get_tenant_entity_views(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.entity_view_controller.get_tenant_entity_views_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_entity_view_types(self, ): + return self.entity_view_controller.get_entity_view_types_using_get() + + def get_customer_entity_views(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.entity_view_controller.get_customer_entity_views_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def find_by_query_v4(self, body: EntityViewSearchQuery): + return self.entity_view_controller.find_by_query_using_post4(body=body) + + def get_entity_view_by_id(self, entity_view_id: EntityViewId): + entity_view_id = self.get_id(entity_view_id) + return self.entity_view_controller.get_entity_view_by_id_using_get(entity_view_id=entity_view_id) + + def check_updates(self, ): + return self.admin_controller.check_updates_using_get() + + def get_security_settings(self, ): + return self.admin_controller.get_security_settings_using_get() + + def save_admin_settings(self, body: AdminSettings): + return self.admin_controller.save_admin_settings_using_post(body=body) + + def send_test_sms(self, body: TestSmsRequest): + return self.admin_controller.send_test_sms_using_post(body=body) + + def send_test_mail(self, body: AdminSettings): + return self.admin_controller.send_test_mail_using_post(body=body) + + def save_security_settings(self, body: SecuritySettings): + return self.admin_controller.save_security_settings_using_post(body=body) + + def sign_up(self, body: SignUpRequest): + return self.sign_up_controller.sign_up_using_post(body=body) + + def privacy_policy_accepted(self, ): + return self.sign_up_controller.privacy_policy_accepted_using_get() + + def get_recaptcha_public_key(self, ): + return self.sign_up_controller.get_recaptcha_public_key_using_get() + + def accept_privacy_policy(self, ): + return self.sign_up_controller.accept_privacy_policy_using_post() + + def delete_tenant_account(self, ): + return self.sign_up_controller.delete_tenant_account_using_delete() + + def delete_resource_v1(self, resource_id: EntityId): + resource_id = self.get_id(resource_id) + return self.tb_resource_controller.delete_resource_using_delete1(resource_id=resource_id) + + def download_resource(self, resource_id: EntityId): + resource_id = self.get_id(resource_id) + return self.tb_resource_controller.download_resource_using_get(resource_id=resource_id) + + def get_lwm2m_list_objects_page(self, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None): + return self.tb_resource_controller.get_lwm2m_list_objects_page_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_lwm2m_list_objects(self, sort_order: str, sort_property: str, object_ids=None): + return self.tb_resource_controller.get_lwm2m_list_objects_using_get(sort_order=sort_order, sort_property=sort_property, object_ids=object_ids) + + def get_resource_by_id(self, resource_id: EntityId): + resource_id = self.get_id(resource_id) + return self.tb_resource_controller.get_resource_by_id_using_get(resource_id=resource_id) + + def get_resource_info_by_id(self, resource_id: EntityId): + resource_id = self.get_id(resource_id) + return self.tb_resource_controller.get_resource_info_by_id_using_get(resource_id=resource_id) + + def get_resources(self, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None): + return self.tb_resource_controller.get_resources_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def save_resource(self, body: TbResource): + return self.tb_resource_controller.save_resource_using_post(body=body) + + def get_current_o_auth2_info(self, ): + return self.o_auth_2_controller.get_current_o_auth2_info_using_get() + + def get_login_processing_url(self, ): + return self.o_auth_2_controller.get_login_processing_url_using_get() + + def get_o_auth2_clients(self, pkg_name=None, platform=None): + return self.o_auth_2_controller.get_o_auth2_clients_using_post(pkg_name=pkg_name, platform=platform) + + def save_o_auth2_info(self, body: OAuth2Info): + return self.o_auth_2_controller.save_o_auth2_info_using_post(body=body) + + def delete_tenant_profile(self, tenant_profile_id: TenantProfileId): + tenant_profile_id = self.get_id(tenant_profile_id) + return self.tenant_profile_controller.delete_tenant_profile_using_delete(tenant_profile_id=tenant_profile_id) + + def get_default_tenant_profile_info(self, ): + return self.tenant_profile_controller.get_default_tenant_profile_info_using_get() + + def get_tenant_profile_by_id(self, tenant_profile_id: TenantProfileId): + tenant_profile_id = self.get_id(tenant_profile_id) + return self.tenant_profile_controller.get_tenant_profile_by_id_using_get(tenant_profile_id=tenant_profile_id) + + def get_tenant_profile_info_by_id(self, tenant_profile_id: TenantProfileId): + tenant_profile_id = self.get_id(tenant_profile_id) + return self.tenant_profile_controller.get_tenant_profile_info_by_id_using_get(tenant_profile_id=tenant_profile_id) + + def get_tenant_profile_infos(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.tenant_profile_controller.get_tenant_profile_infos_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_profiles(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.tenant_profile_controller.get_tenant_profiles_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def save_tenant_profile(self, body: TenantProfile): + return self.tenant_profile_controller.save_tenant_profile_using_post(body=body) + + def set_default_tenant_profile(self, tenant_profile_id: TenantProfileId): + tenant_profile_id = self.get_id(tenant_profile_id) + return self.tenant_profile_controller.set_default_tenant_profile_using_post(tenant_profile_id=tenant_profile_id) + + def delete_widgets_bundle(self, widgets_bundle_id: WidgetsBundleId): + widgets_bundle_id = self.get_id(widgets_bundle_id) + return self.widgets_bundle_controller.delete_widgets_bundle_using_delete(widgets_bundle_id=widgets_bundle_id) + + def get_widgets_bundle_by_id(self, widgets_bundle_id: WidgetsBundleId): + widgets_bundle_id = self.get_id(widgets_bundle_id) + return self.widgets_bundle_controller.get_widgets_bundle_by_id_using_get(widgets_bundle_id=widgets_bundle_id) + + def get_widgets_bundles(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.widgets_bundle_controller.get_widgets_bundles_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_widgets_bundles_v1(self, ): + return self.widgets_bundle_controller.get_widgets_bundles_using_get1() + + def save_widgets_bundle(self, body: WidgetsBundle): + return self.widgets_bundle_controller.save_widgets_bundle_using_post(body=body) + + def delete_device_profile(self, device_profile_id: DeviceProfileId): + device_profile_id = self.get_id(device_profile_id) + return self.device_profile_controller.delete_device_profile_using_delete(device_profile_id=device_profile_id) + + def get_attributes_keys(self, device_profile_id=None): + device_profile_id = self.get_id(device_profile_id) + return self.device_profile_controller.get_attributes_keys_using_get(device_profile_id=device_profile_id) + + def get_default_device_profile_info(self, ): + return self.device_profile_controller.get_default_device_profile_info_using_get() + + def get_device_profile_by_id(self, device_profile_id: DeviceProfileId): + device_profile_id = self.get_id(device_profile_id) + return self.device_profile_controller.get_device_profile_by_id_using_get(device_profile_id=device_profile_id) + + def get_device_profile_info_by_id(self, device_profile_id: DeviceProfileId): + device_profile_id = self.get_id(device_profile_id) + return self.device_profile_controller.get_device_profile_info_by_id_using_get(device_profile_id=device_profile_id) + + def get_device_profile_infos(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None, transport_type=None): + return self.device_profile_controller.get_device_profile_infos_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order, transport_type=transport_type) + + def get_device_profiles(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.device_profile_controller.get_device_profiles_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_timeseries_keys(self, device_profile_id=None): + device_profile_id = self.get_id(device_profile_id) + return self.device_profile_controller.get_timeseries_keys_using_get(device_profile_id=device_profile_id) + + def save_device_profile(self, body: DeviceProfile): + return self.device_profile_controller.save_device_profile_using_post(body=body) + + def set_default_device_profile(self, device_profile_id: DeviceProfileId): + device_profile_id = self.get_id(device_profile_id) + return self.device_profile_controller.set_default_device_profile_using_post(device_profile_id=device_profile_id) + + def get_tenant_dashboards(self, page_size: str, page: str, mobile=None, text_search=None, sort_property=None, sort_order=None): + return self.dashboard_controller.get_tenant_dashboards_using_get(page_size=page_size, page=page, mobile=mobile, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def delete_dashboard(self, dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.delete_dashboard_using_delete(dashboard_id=dashboard_id) + + def get_dashboard_by_id(self, dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.get_dashboard_by_id_using_get(dashboard_id=dashboard_id) + + def set_tenant_home_dashboard_info(self, body: HomeDashboardInfo): + return self.dashboard_controller.set_tenant_home_dashboard_info_using_post(body=body) + + def get_server_time(self, ): + return self.dashboard_controller.get_server_time_using_get() + + def get_home_dashboard_info(self, ): + return self.dashboard_controller.get_home_dashboard_info_using_get() + + def get_max_datapoints_limit(self, ): + return self.dashboard_controller.get_max_datapoints_limit_using_get() + + def get_home_dashboard(self, ): + return self.dashboard_controller.get_home_dashboard_using_get() + + def get_tenant_home_dashboard_info(self, ): + return self.dashboard_controller.get_tenant_home_dashboard_info_using_get() + + def get_dashboard_info_by_id(self, dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.get_dashboard_info_by_id_using_get(dashboard_id=dashboard_id) + + def get_tenant_dashboards_v1(self, tenant_id: TenantId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + tenant_id = self.get_id(tenant_id) + return self.dashboard_controller.get_tenant_dashboards_using_get1(tenant_id=tenant_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def count_entities_by_query(self, body: EntityCountQuery): + return self.entity_query_controller.count_entities_by_query_using_post(body=body) + + def find_alarm_data_by_query(self, body: AlarmDataQuery): + return self.entity_query_controller.find_alarm_data_by_query_using_post(body=body) + + def find_entity_data_by_query(self, body: EntityDataQuery): + return self.entity_query_controller.find_entity_data_by_query_using_post(body=body) + + def find_entity_timeseries_and_attributes_keys_by_query(self, body: EntityDataQuery, timeseries: bool, attributes: bool): + return self.entity_query_controller.find_entity_timeseries_and_attributes_keys_by_query_using_post(body=body, timeseries=timeseries, attributes=attributes) + + def delete_widget_type(self, widget_type_id: WidgetTypeId): + widget_type_id = self.get_id(widget_type_id) + return self.widget_type_controller.delete_widget_type_using_delete(widget_type_id=widget_type_id) + + def get_bundle_widget_types_details(self, is_system: str, bundle_alias: str): + return self.widget_type_controller.get_bundle_widget_types_details_using_get(is_system=is_system, bundle_alias=bundle_alias) + + def get_bundle_widget_types_infos(self, is_system: str, bundle_alias: str): + return self.widget_type_controller.get_bundle_widget_types_infos_using_get(is_system=is_system, bundle_alias=bundle_alias) + + def get_bundle_widget_types(self, is_system: str, bundle_alias: str): + return self.widget_type_controller.get_bundle_widget_types_using_get(is_system=is_system, bundle_alias=bundle_alias) + + def get_widget_type_by_id(self, widget_type_id: WidgetTypeId): + widget_type_id = self.get_id(widget_type_id) + return self.widget_type_controller.get_widget_type_by_id_using_get(widget_type_id=widget_type_id) + + def get_widget_type(self, is_system: str, bundle_alias: str, alias: str): + return self.widget_type_controller.get_widget_type_using_get(is_system=is_system, bundle_alias=bundle_alias, alias=alias) + + def save_widget_type(self, body: WidgetTypeDetails): + return self.widget_type_controller.save_widget_type_using_post(body=body) + + def get_audit_logs_by_customer_id(self, customer_id: CustomerId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None, action_types=None): + customer_id = self.get_id(customer_id) + return self.audit_log_controller.get_audit_logs_by_customer_id_using_get(customer_id=customer_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time, action_types=action_types) + + def get_audit_logs_by_entity_id(self, entity_type: str, entity_id: EntityId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None, action_types=None): + entity_id = self.get_id(entity_id) + return self.audit_log_controller.get_audit_logs_by_entity_id_using_get(entity_type=entity_type, entity_id=entity_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time, action_types=action_types) + + def get_audit_logs_by_user_id(self, user_id: UserId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None, action_types=None): + user_id = self.get_id(user_id) + return self.audit_log_controller.get_audit_logs_by_user_id_using_get(user_id=user_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time, action_types=action_types) + + def get_audit_logs(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None, action_types=None): + return self.audit_log_controller.get_audit_logs_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time, action_types=action_types) + + def get_lwm2m_bootstrap_security_info(self, is_bootstrap_server: bool): + return self.lwm_2m_controller.get_lwm2m_bootstrap_security_info_using_get(is_bootstrap_server=is_bootstrap_server) + + def get_component_descriptor_by_clazz(self, component_descriptor_clazz: str): + return self.component_descriptor_controller.get_component_descriptor_by_clazz_using_get(component_descriptor_clazz=component_descriptor_clazz) + + def get_component_descriptors_by_type(self, component_type: str, rule_chain_type=None): + return self.component_descriptor_controller.get_component_descriptors_by_type_using_get(component_type=component_type, rule_chain_type=rule_chain_type) + + def get_component_descriptors_by_types(self, component_types: str, rule_chain_type=None): + return self.component_descriptor_controller.get_component_descriptors_by_types_using_get(component_types=component_types, rule_chain_type=rule_chain_type) + + def get_tenants(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.tenant_controller.get_tenants_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_info_by_id(self, tenant_id: TenantId): + tenant_id = self.get_id(tenant_id) + return self.tenant_controller.get_tenant_info_by_id_using_get(tenant_id=tenant_id) + + def delete_tenant(self, tenant_id: TenantId): + tenant_id = self.get_id(tenant_id) + return self.tenant_controller.delete_tenant_using_delete(tenant_id=tenant_id) + + def save_tenant(self, body: Tenant): + return self.tenant_controller.save_tenant_using_post(body=body) + + def get_tenant_infos(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.tenant_controller.get_tenant_infos_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_by_id(self, tenant_id: TenantId): + tenant_id = self.get_id(tenant_id) + return self.tenant_controller.get_tenant_by_id_using_get(tenant_id=tenant_id) + + def save_ota_package_data(self, file: str, checksum_algorithm: str, ota_package_id: OtaPackageId, checksum=None): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.save_ota_package_data_using_post(file=file, checksum_algorithm=checksum_algorithm, ota_package_id=ota_package_id, checksum=checksum) + + def save_ota_package_info(self, body: SaveOtaPackageInfoRequest): + return self.ota_package_controller.save_ota_package_info_using_post(body=body) + + def download_ota_package(self, ota_package_id: OtaPackageId): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.download_ota_package_using_get(ota_package_id=ota_package_id) + + def get_ota_package_info_by_id(self, ota_package_id: OtaPackageId): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.get_ota_package_info_by_id_using_get(ota_package_id=ota_package_id) + + def delete_ota_package(self, ota_package_id: OtaPackageId): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.delete_ota_package_using_delete(ota_package_id=ota_package_id) + + def get_ota_package_by_id(self, ota_package_id: OtaPackageId): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.get_ota_package_by_id_using_get(ota_package_id=ota_package_id) + + def get_ota_packages(self, device_profile_id: DeviceProfileId, type: str, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None): + device_profile_id = self.get_id(device_profile_id) + return self.ota_package_controller.get_ota_packages_using_get(device_profile_id=device_profile_id, type=type, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_ota_packages_v1(self, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None): + return self.ota_package_controller.get_ota_packages_using_get1(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + + def __load_controllers(self): + self.audit_log_controller = AuditLogControllerApi(self.api_client) + self.o_auth2_config_template_controller = OAuth2ConfigTemplateControllerApi(self.api_client) + self.entity_view_controller = EntityViewControllerApi(self.api_client) + self.entity_query_controller = EntityQueryControllerApi(self.api_client) + self.o_auth2_controller = OAuth2ControllerApi(self.api_client) + self.entity_relation_controller = EntityRelationControllerApi(self.api_client) + self.rpc_v2_controller = RpcV2ControllerApi(self.api_client) + self.edge_controller = EdgeControllerApi(self.api_client) + self.admin_controller = AdminControllerApi(self.api_client) + self.user_controller = UserControllerApi(self.api_client) + self.asset_controller = AssetControllerApi(self.api_client) + self.widgets_bundle_controller = WidgetsBundleControllerApi(self.api_client) + self.tenant_profile_controller = TenantProfileControllerApi(self.api_client) + self.event_controller = EventControllerApi(self.api_client) + self.lwm2m_controller = Lwm2mControllerApi(self.api_client) + self.dashboard_controller = DashboardControllerApi(self.api_client) + self.component_descriptor_controller = ComponentDescriptorControllerApi(self.api_client) + self.device_profile_controller = DeviceProfileControllerApi(self.api_client) + self.customer_controller = CustomerControllerApi(self.api_client) + self.telemetry_controller = TelemetryControllerApi(self.api_client) + self.tenant_controller = TenantControllerApi(self.api_client) + self.rpc_v1_controller = RpcV1ControllerApi(self.api_client) + self.widget_type_controller = WidgetTypeControllerApi(self.api_client) + self.device_controller = DeviceControllerApi(self.api_client) + self.rule_chain_controller = RuleChainControllerApi(self.api_client) + self.tb_resource_controller = TbResourceControllerApi(self.api_client) + self.auth_controller = AuthControllerApi(self.api_client) + self.queue_controller = QueueControllerApi(self.api_client) + self.ota_package_controller = OtaPackageControllerApi(self.api_client) + self.alarm_controller = AlarmControllerApi(self.api_client) + self.edge_event_controller = EdgeEventControllerApi(self.api_client) + self.sign_up_controller = SignUpControllerApi(self.api_client) + + @staticmethod + def get_type(type): + return type.entity_type if hasattr(type, "entity_type") else type + + + @staticmethod + def get_id(id): + return id.id if hasattr(id, "id") else id diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest_client_ce.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest_client_ce.py new file mode 100644 index 0000000..e6f29e3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest_client_ce.py @@ -0,0 +1,611 @@ +# coding: utf-8 +# Copyright 2020. ThingsBoard +# # +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# # +# http://www.apache.org/licenses/LICENSE-2.0 +# # +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from typing import List +from tb_rest_client.rest_client_base import * + +logger = getLogger(__name__) + + +class RestClientCE(RestClientBase): + def __init__(self, base_url): + super().__init__(base_url) + + def get_asset_types(self, ): + return self.asset_controller.get_asset_types_using_get() + + def get_edge_assets(self, edge_id: EdgeId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None): + edge_id = self.get_id(edge_id) + return self.asset_controller.get_edge_assets_using_get(edge_id=edge_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time) + + def get_asset_info_by_id(self, asset_id: AssetId): + asset_id = self.get_id(asset_id) + return self.asset_controller.get_asset_info_by_id_using_get(asset_id=asset_id) + + def assign_asset_to_public_customer(self, asset_id: AssetId): + asset_id = self.get_id(asset_id) + return self.asset_controller.assign_asset_to_public_customer_using_post(asset_id=asset_id) + + def find_by_query(self, body: AssetSearchQuery): + return self.asset_controller.find_by_query_using_post(body=body) + + def get_tenant_assets(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.asset_controller.get_tenant_assets_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def save_asset(self, body: Asset): + return self.asset_controller.save_asset_using_post(body=body) + + def get_assets_by_ids(self, asset_ids: list): + return self.asset_controller.get_assets_by_ids_using_get(asset_ids=asset_ids) + + def get_customer_asset_infos(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.asset_controller.get_customer_asset_infos_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_asset_by_id(self, asset_id: AssetId): + asset_id = self.get_id(asset_id) + return self.asset_controller.get_asset_by_id_using_get(asset_id=asset_id) + + def get_tenant_asset_infos(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.asset_controller.get_tenant_asset_infos_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def assign_asset_to_edge(self, edge_id: EdgeId, asset_id: AssetId): + edge_id = self.get_id(edge_id) + asset_id = self.get_id(asset_id) + return self.asset_controller.assign_asset_to_edge_using_post(edge_id=edge_id, asset_id=asset_id) + + def unassign_asset_from_customer(self, asset_id: AssetId): + asset_id = self.get_id(asset_id) + return self.asset_controller.unassign_asset_from_customer_using_delete(asset_id=asset_id) + + def unassign_asset_from_edge(self, edge_id: EdgeId, asset_id: AssetId): + edge_id = self.get_id(edge_id) + asset_id = self.get_id(asset_id) + return self.asset_controller.unassign_asset_from_edge_using_delete(edge_id=edge_id, asset_id=asset_id) + + def delete_asset(self, asset_id: AssetId): + asset_id = self.get_id(asset_id) + return self.asset_controller.delete_asset_using_delete(asset_id=asset_id) + + def get_customer_assets(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.asset_controller.get_customer_assets_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_asset(self, asset_name: str): + return self.asset_controller.get_tenant_asset_using_get(asset_name=asset_name) + + def assign_asset_to_customer(self, customer_id: CustomerId, asset_id: AssetId): + customer_id = self.get_id(customer_id) + asset_id = self.get_id(asset_id) + return self.asset_controller.assign_asset_to_customer_using_post(customer_id=customer_id, asset_id=asset_id) + + def sync_edge(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.sync_edge_using_post(edge_id=edge_id) + + def get_edge_types(self, ): + return self.edge_controller.get_edge_types_using_get() + + def save_edge(self, body: Edge): + return self.edge_controller.save_edge_using_post(body=body) + + def unassign_edge_from_customer(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.unassign_edge_from_customer_using_delete(edge_id=edge_id) + + def get_customer_edges(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.edge_controller.get_customer_edges_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_customer_edge_infos(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.edge_controller.get_customer_edge_infos_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def check_instance(self, body: object): + return self.edge_controller.check_instance_using_post(body=body) + + def is_edges_support_enabled(self, ): + return self.edge_controller.is_edges_support_enabled_using_get() + + def get_edges_by_ids(self, edge_ids: list): + return self.edge_controller.get_edges_by_ids_using_get(edge_ids=edge_ids) + + def find_missing_to_related_rule_chains(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.find_missing_to_related_rule_chains_using_get(edge_id=edge_id) + + def get_tenant_edges(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.edge_controller.get_tenant_edges_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def delete_edge(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.delete_edge_using_delete(edge_id=edge_id) + + def find_by_query_v2(self, body: EdgeSearchQuery): + return self.edge_controller.find_by_query_using_post2(body=body) + + def set_root_rule_chain(self, edge_id: EdgeId, rule_chain_id: RuleChainId): + edge_id = self.get_id(edge_id) + rule_chain_id = self.get_id(rule_chain_id) + return self.edge_controller.set_root_rule_chain_using_post(edge_id=edge_id, rule_chain_id=rule_chain_id) + + def assign_edge_to_public_customer(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.assign_edge_to_public_customer_using_post(edge_id=edge_id) + + def get_tenant_edge_infos(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.edge_controller.get_tenant_edge_infos_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_edge_by_id(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.get_edge_by_id_using_get(edge_id=edge_id) + + def get_tenant_edge(self, edge_name: str): + return self.edge_controller.get_tenant_edge_using_get(edge_name=edge_name) + + def get_edge_info_by_id(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.get_edge_info_by_id_using_get(edge_id=edge_id) + + def get_edges(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.edge_controller.get_edges_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def assign_edge_to_customer(self, customer_id: CustomerId, edge_id: EdgeId): + customer_id = self.get_id(customer_id) + edge_id = self.get_id(edge_id) + return self.edge_controller.assign_edge_to_customer_using_post(customer_id=customer_id, edge_id=edge_id) + + def activate_instance(self, license_secret: str, release_date: str): + return self.edge_controller.activate_instance_using_post(license_secret=license_secret, release_date=release_date) + + def get_persisted_rpc(self, rpc_id: RpcId): + rpc_id = self.get_id(rpc_id) + return self.rpc_v_2_controller.get_persisted_rpc_using_get(rpc_id=rpc_id) + + def handle_two_way_device_rpc_request_v1(self, body: str, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.rpc_v_2_controller.handle_two_way_device_rpc_request_using_post1(body=body, device_id=device_id) + + def handle_one_way_device_rpc_request_v1(self, body: str, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.rpc_v_2_controller.handle_one_way_device_rpc_request_using_post1(body=body, device_id=device_id) + + def delete_resource(self, rpc_id: RpcId): + rpc_id = self.get_id(rpc_id) + return self.rpc_v_2_controller.delete_resource_using_delete(rpc_id=rpc_id) + + def get_persisted_rpc_by_device(self, device_id: DeviceId, page_size: int, page: int, rpc_status: str, text_search=None, sort_property=None, sort_order=None): + device_id = self.get_id(device_id) + return self.rpc_v_2_controller.get_persisted_rpc_by_device_using_get(device_id=device_id, page_size=page_size, page=page, rpc_status=rpc_status, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_edge_events(self, edge_id: EdgeId, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None): + edge_id = self.get_id(edge_id) + return self.edge_event_controller.get_edge_events_using_get(edge_id=edge_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time) + + def delete_customer(self, customer_id: CustomerId): + customer_id = self.get_id(customer_id) + return self.customer_controller.delete_customer_using_delete(customer_id=customer_id) + + def get_short_customer_info_by_id(self, customer_id: CustomerId): + customer_id = self.get_id(customer_id) + return self.customer_controller.get_short_customer_info_by_id_using_get(customer_id=customer_id) + + def get_tenant_customer(self, customer_title: str): + return self.customer_controller.get_tenant_customer_using_get(customer_title=customer_title) + + def get_customers(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.customer_controller.get_customers_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_customer_title_by_id(self, customer_id: CustomerId): + customer_id = self.get_id(customer_id) + return self.customer_controller.get_customer_title_by_id_using_get(customer_id=customer_id) + + def get_customer_by_id(self, customer_id: CustomerId): + customer_id = self.get_id(customer_id) + return self.customer_controller.get_customer_by_id_using_get(customer_id=customer_id) + + def save_customer(self, body: Customer): + return self.customer_controller.save_customer_using_post(body=body) + + def get_user_by_id(self, user_id: UserId): + user_id = self.get_id(user_id) + return self.user_controller.get_user_by_id_using_get(user_id=user_id) + + def send_activation_email(self, email: str): + return self.user_controller.send_activation_email_using_post(email=email) + + def set_user_credentials_enabled(self, user_id: UserId, user_credentials_enabled=None): + user_id = self.get_id(user_id) + return self.user_controller.set_user_credentials_enabled_using_post(user_id=user_id, user_credentials_enabled=user_credentials_enabled) + + def get_customer_users(self, customer_id: CustomerId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.user_controller.get_customer_users_using_get(customer_id=customer_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_admins(self, tenant_id: TenantId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + tenant_id = self.get_id(tenant_id) + return self.user_controller.get_tenant_admins_using_get(tenant_id=tenant_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_user_token(self, user_id: UserId): + user_id = self.get_id(user_id) + return self.user_controller.get_user_token_using_get(user_id=user_id) + + def get_activation_link(self, user_id: UserId): + user_id = self.get_id(user_id) + return self.user_controller.get_activation_link_using_get(user_id=user_id) + + def delete_user(self, user_id: UserId): + user_id = self.get_id(user_id) + return self.user_controller.delete_user_using_delete(user_id=user_id) + + def save_user(self, body: User, send_activation_mail=None): + return self.user_controller.save_user_using_post(body=body, send_activation_mail=send_activation_mail) + + def is_user_token_access_enabled(self, ): + return self.user_controller.is_user_token_access_enabled_using_get() + + def get_users(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.user_controller.get_users_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def delete_device(self, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.device_controller.delete_device_using_delete(device_id=device_id) + + def claim_device(self, device_name: str, body=None): + return self.device_controller.claim_device_using_post(device_name=device_name, body=body) + + def count_by_device_profile_and_empty_ota_package(self, ota_package_type: str, device_profile_id: DeviceProfileId): + device_profile_id = self.get_id(device_profile_id) + return self.device_controller.count_by_device_profile_and_empty_ota_package_using_get(ota_package_type=ota_package_type, device_profile_id=device_profile_id) + + def assign_device_to_tenant(self, tenant_id: TenantId, device_id: DeviceId): + tenant_id = self.get_id(tenant_id) + device_id = self.get_id(device_id) + return self.device_controller.assign_device_to_tenant_using_post(tenant_id=tenant_id, device_id=device_id) + + def get_edge_devices(self, edge_id: EdgeId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None): + edge_id = self.get_id(edge_id) + return self.device_controller.get_edge_devices_using_get(edge_id=edge_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time) + + def unassign_device_from_edge(self, edge_id: EdgeId, device_id: DeviceId): + edge_id = self.get_id(edge_id) + device_id = self.get_id(device_id) + return self.device_controller.unassign_device_from_edge_using_delete(edge_id=edge_id, device_id=device_id) + + def get_tenant_devices(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.device_controller.get_tenant_devices_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def re_claim_device(self, device_name: str): + return self.device_controller.re_claim_device_using_delete(device_name=device_name) + + def assign_device_to_edge(self, edge_id: EdgeId, device_id: DeviceId): + edge_id = self.get_id(edge_id) + device_id = self.get_id(device_id) + return self.device_controller.assign_device_to_edge_using_post(edge_id=edge_id, device_id=device_id) + + def get_device_credentials_by_device_id(self, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.device_controller.get_device_credentials_by_device_id_using_get(device_id=device_id) + + def get_device_info_by_id(self, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.device_controller.get_device_info_by_id_using_get(device_id=device_id) + + def get_device_by_id(self, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.device_controller.get_device_by_id_using_get(device_id=device_id) + + def get_customer_device_infos(self, customer_id: CustomerId, page_size: str, page: str, type=None, device_profile_id=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + device_profile_id = self.get_id(device_profile_id) + return self.device_controller.get_customer_device_infos_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, device_profile_id=device_profile_id, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def assign_device_to_customer(self, customer_id: CustomerId, device_id: DeviceId): + customer_id = self.get_id(customer_id) + device_id = self.get_id(device_id) + return self.device_controller.assign_device_to_customer_using_post(customer_id=customer_id, device_id=device_id) + + def find_by_query_v1(self, body: DeviceSearchQuery): + return self.device_controller.find_by_query_using_post1(body=body) + + def get_tenant_device_infos(self, page_size: str, page: str, type=None, device_profile_id=None, text_search=None, sort_property=None, sort_order=None): + device_profile_id = self.get_id(device_profile_id) + return self.device_controller.get_tenant_device_infos_using_get(page_size=page_size, page=page, type=type, device_profile_id=device_profile_id, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_device(self, device_name: str): + return self.device_controller.get_tenant_device_using_get(device_name=device_name) + + def save_device(self, body: Device, access_token=None): + return self.device_controller.save_device_using_post(body=body, access_token=access_token) + + def assign_device_to_public_customer(self, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.device_controller.assign_device_to_public_customer_using_post(device_id=device_id) + + def get_device_types(self, ): + return self.device_controller.get_device_types_using_get() + + def unassign_device_from_customer(self, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.device_controller.unassign_device_from_customer_using_delete(device_id=device_id) + + def get_devices_by_ids(self, device_ids: list): + return self.device_controller.get_devices_by_ids_using_get(device_ids=device_ids) + + def get_customer_devices(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.device_controller.get_customer_devices_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def save_device_credentials(self, body: DeviceCredentials): + return self.device_controller.save_device_credentials_using_post(body=body) + + def get_tenant_entity_views(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.entity_view_controller.get_tenant_entity_views_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def find_by_query_v4(self, body: EntityViewSearchQuery): + return self.entity_view_controller.find_by_query_using_post4(body=body) + + def assign_entity_view_to_customer(self, customer_id: CustomerId, entity_view_id: EntityViewId): + customer_id = self.get_id(customer_id) + entity_view_id = self.get_id(entity_view_id) + return self.entity_view_controller.assign_entity_view_to_customer_using_post(customer_id=customer_id, entity_view_id=entity_view_id) + + def unassign_entity_view_from_edge(self, edge_id: EdgeId, entity_view_id: EntityViewId): + edge_id = self.get_id(edge_id) + entity_view_id = self.get_id(entity_view_id) + return self.entity_view_controller.unassign_entity_view_from_edge_using_delete(edge_id=edge_id, entity_view_id=entity_view_id) + + def get_entity_view_types(self, ): + return self.entity_view_controller.get_entity_view_types_using_get() + + def get_entity_view_by_id(self, entity_view_id: EntityViewId): + entity_view_id = self.get_id(entity_view_id) + return self.entity_view_controller.get_entity_view_by_id_using_get(entity_view_id=entity_view_id) + + def get_customer_entity_view_infos(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.entity_view_controller.get_customer_entity_view_infos_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def delete_entity_view(self, entity_view_id: EntityViewId): + entity_view_id = self.get_id(entity_view_id) + return self.entity_view_controller.delete_entity_view_using_delete(entity_view_id=entity_view_id) + + def save_entity_view(self, body: EntityView): + return self.entity_view_controller.save_entity_view_using_post(body=body) + + def get_tenant_entity_view(self, entity_view_name: str): + return self.entity_view_controller.get_tenant_entity_view_using_get(entity_view_name=entity_view_name) + + def get_customer_entity_views(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.entity_view_controller.get_customer_entity_views_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def assign_entity_view_to_public_customer(self, entity_view_id: EntityViewId): + entity_view_id = self.get_id(entity_view_id) + return self.entity_view_controller.assign_entity_view_to_public_customer_using_post(entity_view_id=entity_view_id) + + def get_edge_entity_views(self, edge_id: EdgeId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None): + edge_id = self.get_id(edge_id) + return self.entity_view_controller.get_edge_entity_views_using_get(edge_id=edge_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time) + + def unassign_entity_view_from_customer(self, entity_view_id: EntityViewId): + entity_view_id = self.get_id(entity_view_id) + return self.entity_view_controller.unassign_entity_view_from_customer_using_delete(entity_view_id=entity_view_id) + + def assign_entity_view_to_edge(self, edge_id: EdgeId, entity_view_id: EntityViewId): + edge_id = self.get_id(edge_id) + entity_view_id = self.get_id(entity_view_id) + return self.entity_view_controller.assign_entity_view_to_edge_using_post(edge_id=edge_id, entity_view_id=entity_view_id) + + def get_entity_view_info_by_id(self, entity_view_id: EntityViewId): + entity_view_id = self.get_id(entity_view_id) + return self.entity_view_controller.get_entity_view_info_by_id_using_get(entity_view_id=entity_view_id) + + def get_tenant_entity_view_infos(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.entity_view_controller.get_tenant_entity_view_infos_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def check_updates(self, ): + return self.admin_controller.check_updates_using_get() + + def get_security_settings(self, ): + return self.admin_controller.get_security_settings_using_get() + + def save_admin_settings(self, body: AdminSettings): + return self.admin_controller.save_admin_settings_using_post(body=body) + + def send_test_sms(self, body: TestSmsRequest): + return self.admin_controller.send_test_sms_using_post(body=body) + + def send_test_mail(self, body: AdminSettings): + return self.admin_controller.send_test_mail_using_post(body=body) + + def save_security_settings(self, body: SecuritySettings): + return self.admin_controller.save_security_settings_using_post(body=body) + + def get_admin_settings(self, key: str): + return self.admin_controller.get_admin_settings_using_get(key=key) + + def sign_up(self, body: SignUpRequest): + return self.sign_up_controller.sign_up_using_post(body=body) + + def resend_email_activation(self, email: str): + return self.sign_up_controller.resend_email_activation_using_post(email=email) + + def activate_email(self, email_code: str): + return self.sign_up_controller.activate_email_using_get(email_code=email_code) + + def privacy_policy_accepted(self, ): + return self.sign_up_controller.privacy_policy_accepted_using_get() + + def activate_user_by_email_code(self, email_code: str): + return self.sign_up_controller.activate_user_by_email_code_using_post(email_code=email_code) + + def get_recaptcha_public_key(self, ): + return self.sign_up_controller.get_recaptcha_public_key_using_get() + + def accept_privacy_policy(self, ): + return self.sign_up_controller.accept_privacy_policy_using_post() + + def delete_tenant_account(self, ): + return self.sign_up_controller.delete_tenant_account_using_delete() + + def unassign_dashboard_from_public_customer(self, dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.unassign_dashboard_from_public_customer_using_delete(dashboard_id=dashboard_id) + + def get_dashboard_by_id(self, dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.get_dashboard_by_id_using_get(dashboard_id=dashboard_id) + + def get_edge_dashboards(self, edge_id: EdgeId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None): + edge_id = self.get_id(edge_id) + return self.dashboard_controller.get_edge_dashboards_using_get(edge_id=edge_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time) + + def set_tenant_home_dashboard_info(self, body: HomeDashboardInfo): + return self.dashboard_controller.set_tenant_home_dashboard_info_using_post(body=body) + + def get_home_dashboard(self, ): + return self.dashboard_controller.get_home_dashboard_using_get() + + def add_dashboard_customers(self, body: List[str], dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.add_dashboard_customers_using_post(body=body, dashboard_id=dashboard_id) + + def get_tenant_dashboards_v1(self, tenant_id: TenantId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + tenant_id = self.get_id(tenant_id) + return self.dashboard_controller.get_tenant_dashboards_using_get1(tenant_id=tenant_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def assign_dashboard_to_customer(self, customer_id: CustomerId, dashboard_id: DashboardId): + customer_id = self.get_id(customer_id) + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.assign_dashboard_to_customer_using_post(customer_id=customer_id, dashboard_id=dashboard_id) + + def get_tenant_dashboards(self, page_size: str, page: str, mobile=None, text_search=None, sort_property=None, sort_order=None): + return self.dashboard_controller.get_tenant_dashboards_using_get(page_size=page_size, page=page, mobile=mobile, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def save_dashboard(self, body: Dashboard): + return self.dashboard_controller.save_dashboard_using_post(body=body) + + def get_home_dashboard_info(self, ): + return self.dashboard_controller.get_home_dashboard_info_using_get() + + def get_max_datapoints_limit(self, ): + return self.dashboard_controller.get_max_datapoints_limit_using_get() + + def update_dashboard_customers(self, dashboard_id: DashboardId, body=None): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.update_dashboard_customers_using_post(dashboard_id=dashboard_id, body=body) + + def get_dashboard_info_by_id(self, dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.get_dashboard_info_by_id_using_get(dashboard_id=dashboard_id) + + def delete_dashboard(self, dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.delete_dashboard_using_delete(dashboard_id=dashboard_id) + + def get_customer_dashboards(self, customer_id: CustomerId, page_size: str, page: str, mobile=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.dashboard_controller.get_customer_dashboards_using_get(customer_id=customer_id, page_size=page_size, page=page, mobile=mobile, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def remove_dashboard_customers(self, body: List[str], dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.remove_dashboard_customers_using_post(body=body, dashboard_id=dashboard_id) + + def unassign_dashboard_from_edge(self, edge_id: EdgeId, dashboard_id: DashboardId): + edge_id = self.get_id(edge_id) + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.unassign_dashboard_from_edge_using_delete(edge_id=edge_id, dashboard_id=dashboard_id) + + def assign_dashboard_to_edge(self, edge_id: EdgeId, dashboard_id: DashboardId): + edge_id = self.get_id(edge_id) + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.assign_dashboard_to_edge_using_post(edge_id=edge_id, dashboard_id=dashboard_id) + + def assign_dashboard_to_public_customer(self, dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.assign_dashboard_to_public_customer_using_post(dashboard_id=dashboard_id) + + def get_server_time(self, ): + return self.dashboard_controller.get_server_time_using_get() + + def get_tenant_home_dashboard_info(self, ): + return self.dashboard_controller.get_tenant_home_dashboard_info_using_get() + + def unassign_dashboard_from_customer(self, customer_id: CustomerId, dashboard_id: DashboardId): + customer_id = self.get_id(customer_id) + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.unassign_dashboard_from_customer_using_delete(customer_id=customer_id, dashboard_id=dashboard_id) + + def get_lwm2m_bootstrap_security_info(self, is_bootstrap_server: bool): + return self.lwm_2m_controller.get_lwm2m_bootstrap_security_info_using_get(is_bootstrap_server=is_bootstrap_server) + + def save_device_with_credentials(self, object=None): + return self.lwm_2m_controller.save_device_with_credentials_using_post(object=object) + + def get_tenants(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.tenant_controller.get_tenants_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_info_by_id(self, tenant_id: TenantId): + tenant_id = self.get_id(tenant_id) + return self.tenant_controller.get_tenant_info_by_id_using_get(tenant_id=tenant_id) + + def delete_tenant(self, tenant_id: TenantId): + tenant_id = self.get_id(tenant_id) + return self.tenant_controller.delete_tenant_using_delete(tenant_id=tenant_id) + + def save_tenant(self, body: Tenant): + return self.tenant_controller.save_tenant_using_post(body=body) + + def get_tenant_infos(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.tenant_controller.get_tenant_infos_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_by_id(self, tenant_id: TenantId): + tenant_id = self.get_id(tenant_id) + return self.tenant_controller.get_tenant_by_id_using_get(tenant_id=tenant_id) + + def save_ota_package_data(self, file: str, checksum_algorithm: str, ota_package_id: OtaPackageId, checksum=None): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.save_ota_package_data_using_post(file=file, checksum_algorithm=checksum_algorithm, ota_package_id=ota_package_id, checksum=checksum) + + def save_ota_package_info(self, body: SaveOtaPackageInfoRequest): + return self.ota_package_controller.save_ota_package_info_using_post(body=body) + + def download_ota_package(self, ota_package_id: OtaPackageId): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.download_ota_package_using_get(ota_package_id=ota_package_id) + + def get_ota_package_info_by_id(self, ota_package_id: OtaPackageId): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.get_ota_package_info_by_id_using_get(ota_package_id=ota_package_id) + + def delete_ota_package(self, ota_package_id: OtaPackageId): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.delete_ota_package_using_delete(ota_package_id=ota_package_id) + + def get_ota_package_by_id(self, ota_package_id: OtaPackageId): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.get_ota_package_by_id_using_get(ota_package_id=ota_package_id) + + def get_ota_packages(self, device_profile_id: DeviceProfileId, type: str, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None): + device_profile_id = self.get_id(device_profile_id) + return self.ota_package_controller.get_ota_packages_using_get(device_profile_id=device_profile_id, type=type, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_ota_packages_v1(self, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None): + return self.ota_package_controller.get_ota_packages_using_get1(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + + diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest_client_pe.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest_client_pe.py new file mode 100644 index 0000000..11bef2f --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/rest_client_pe.py @@ -0,0 +1,1082 @@ +# coding: utf-8 +# Copyright 2020. ThingsBoard +# # +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# # +# http://www.apache.org/licenses/LICENSE-2.0 +# # +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from typing import List + +from tb_rest_client.rest_client_base import * + +from tb_rest_client.api.api_ce import * +from tb_rest_client.api.api_pe import * +from tb_rest_client.models.models_pe import * + +logger = getLogger(__name__) + + +class RestClientPE(RestClientBase): + def __init__(self, base_url): + super().__init__(base_url) + + def login(self, username, password): + super(RestClientPE, self).login(username=username, password=password) + self.__load_controllers() + + def get_privacy_policy(self, ): + return self.self_registration_controller.get_privacy_policy_using_get() + + def get_self_registration_params(self, ): + return self.self_registration_controller.get_self_registration_params_using_get() + + def get_sign_up_self_registration_params(self, pkg_name=None): + return self.self_registration_controller.get_sign_up_self_registration_params_using_get(pkg_name=pkg_name) + + def save_self_registration_params(self, body: SelfRegistrationParams): + return self.self_registration_controller.save_self_registration_params_using_post(body=body) + + def http_check_status_get(self, routing_key: str, request_params: dict, request_headers: dict): + return self.http_integration_controller.check_status_using_get(routing_key=routing_key, request_params=request_params, request_headers=request_headers) + + def http_process_request_v1_post1(self, routing_key: str, suffix: str): + return self.http_integration_controller.process_request_using_post1(routing_key=routing_key, suffix=suffix) + + def http_process_request_v2_post2(self, routing_key: str, suffix: str): + return self.http_integration_controller.process_request_using_post2(routing_key=routing_key, suffix=suffix) + + def get_asset_types(self, ): + return self.asset_controller.get_asset_types_using_get() + + def find_by_query(self, body: AssetSearchQuery): + return self.asset_controller.find_by_query_using_post(body=body) + + def get_tenant_assets(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.asset_controller.get_tenant_assets_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def save_asset(self, body: Asset, entity_group_id=None): + entity_group_id = self.get_id(entity_group_id) + return self.asset_controller.save_asset_using_post(body=body, entity_group_id=entity_group_id) + + def get_assets_by_entity_group_id(self, entity_group_id: EntityGroupId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + entity_group_id = self.get_id(entity_group_id) + return self.asset_controller.get_assets_by_entity_group_id_using_get(entity_group_id=entity_group_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_assets_by_ids(self, asset_ids: list): + return self.asset_controller.get_assets_by_ids_using_get(asset_ids=asset_ids) + + def get_asset_by_id(self, asset_id: AssetId): + asset_id = self.get_id(asset_id) + return self.asset_controller.get_asset_by_id_using_get(asset_id=asset_id) + + def delete_asset(self, asset_id: AssetId): + asset_id = self.get_id(asset_id) + return self.asset_controller.delete_asset_using_delete(asset_id=asset_id) + + def get_customer_assets(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.asset_controller.get_customer_assets_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_asset(self, asset_name: str): + return self.asset_controller.get_tenant_asset_using_get(asset_name=asset_name) + + def get_user_assets(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.asset_controller.get_user_assets_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def delete_device_group_ota_package(self, id: str): + return self.device_group_ota_package_controller.delete_device_group_ota_package_using_delete(id=id) + + def get_firmware_by_id(self, group_id: EntityGroupId, firmware_type: str): + group_id = self.get_id(group_id) + return self.device_group_ota_package_controller.get_firmware_by_id_using_get(group_id=group_id, firmware_type=firmware_type) + + def save_device_group_ota_package(self, body: DeviceGroupOtaPackage): + return self.device_group_ota_package_controller.save_device_group_ota_package_using_post(body=body) + + def sync_edge(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.sync_edge_using_post(edge_id=edge_id) + + def get_edge_types(self, ): + return self.edge_controller.get_edge_types_using_get() + + def save_edge(self, body: Edge, entity_group_id=None): + entity_group_id = self.get_id(entity_group_id) + return self.edge_controller.save_edge_using_post(body=body, entity_group_id=entity_group_id) + + def get_customer_edges(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.edge_controller.get_customer_edges_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def check_instance(self, body: object): + return self.edge_controller.check_instance_using_post(body=body) + + def is_edges_support_enabled(self, ): + return self.edge_controller.is_edges_support_enabled_using_get() + + def get_edges_by_ids(self, edge_ids: list): + return self.edge_controller.get_edges_by_ids_using_get(edge_ids=edge_ids) + + def find_missing_to_related_rule_chains(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.find_missing_to_related_rule_chains_using_get(edge_id=edge_id) + + def get_tenant_edges(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.edge_controller.get_tenant_edges_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def delete_edge(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.delete_edge_using_delete(edge_id=edge_id) + + def find_by_query_v2(self, body: EdgeSearchQuery): + return self.edge_controller.find_by_query_using_post2(body=body) + + def get_edges_by_entity_group_id(self, entity_group_id: EntityGroupId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + entity_group_id = self.get_id(entity_group_id) + return self.edge_controller.get_edges_by_entity_group_id_using_get(entity_group_id=entity_group_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def set_root_rule_chain(self, edge_id: EdgeId, rule_chain_id: RuleChainId): + edge_id = self.get_id(edge_id) + rule_chain_id = self.get_id(rule_chain_id) + return self.edge_controller.set_root_rule_chain_using_post(edge_id=edge_id, rule_chain_id=rule_chain_id) + + def get_edge_by_id(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.edge_controller.get_edge_by_id_using_get(edge_id=edge_id) + + def get_user_edges(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.edge_controller.get_user_edges_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_edge(self, edge_name: str): + return self.edge_controller.get_tenant_edge_using_get(edge_name=edge_name) + + def get_edges(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.edge_controller.get_edges_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def activate_instance(self, license_secret: str, release_date: str): + return self.edge_controller.activate_instance_using_post(license_secret=license_secret, release_date=release_date) + + def ocean_connect_process_request_v2_delete2(self, body: str, request_headers: dict, routing_key: str): + return self.ocean_connect_integration_controller.process_request_using_delete2(body=body, request_headers=request_headers, routing_key=routing_key) + + def ocean_connect_process_request_v2_get2(self, body: str, request_headers: dict, routing_key: str): + return self.ocean_connect_integration_controller.process_request_using_get2(body=body, request_headers=request_headers, routing_key=routing_key) + + def ocean_connect_process_request_v2_head2(self, body: str, request_headers: dict, routing_key: str): + return self.ocean_connect_integration_controller.process_request_using_head2(body=body, request_headers=request_headers, routing_key=routing_key) + + def ocean_connect_process_request_v2_options2(self, body: str, request_headers: dict, routing_key: str): + return self.ocean_connect_integration_controller.process_request_using_options2(body=body, request_headers=request_headers, routing_key=routing_key) + + def ocean_connect_process_request_v2_patch2(self, body: str, request_headers: dict, routing_key: str): + return self.ocean_connect_integration_controller.process_request_using_patch2(body=body, request_headers=request_headers, routing_key=routing_key) + + def ocean_connect_process_request_v10_post10(self, body: str, request_headers: dict, routing_key: str): + return self.ocean_connect_integration_controller.process_request_using_post10(body=body, request_headers=request_headers, routing_key=routing_key) + + def ocean_connect_process_request_v2_put2(self, body: str, request_headers: dict, routing_key: str): + return self.ocean_connect_integration_controller.process_request_using_put2(body=body, request_headers=request_headers, routing_key=routing_key) + + def get_allowed_permissions(self, ): + return self.user_permissions_controller.get_allowed_permissions_using_get() + + def change_owner_to_customer(self, owner_id: UserId, entity_type: str, entity_id: EntityId): + owner_id = self.get_id(owner_id) + entity_id = self.get_id(entity_id) + return self.owner_controller.change_owner_to_customer_using_post(owner_id=owner_id, entity_type=entity_type, entity_id=entity_id) + + def change_owner_to_tenant(self, owner_id: UserId, entity_type: str, entity_id: EntityId): + owner_id = self.get_id(owner_id) + entity_id = self.get_id(entity_id) + return self.owner_controller.change_owner_to_tenant_using_post(owner_id=owner_id, entity_type=entity_type, entity_id=entity_id) + + def get_persisted_rpc(self, rpc_id: RpcId): + rpc_id = self.get_id(rpc_id) + return self.rpc_v_2_controller.get_persisted_rpc_using_get(rpc_id=rpc_id) + + def handle_two_way_device_rpc_request_v1(self, body: str, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.rpc_v_2_controller.handle_two_way_device_rpc_request_using_post1(body=body, device_id=device_id) + + def handle_one_way_device_rpc_request_v1(self, body: str, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.rpc_v_2_controller.handle_one_way_device_rpc_request_using_post1(body=body, device_id=device_id) + + def delete_resource(self, rpc_id: RpcId): + rpc_id = self.get_id(rpc_id) + return self.rpc_v_2_controller.delete_resource_using_delete(rpc_id=rpc_id) + + def get_persisted_rpc_by_device(self, device_id: DeviceId, page_size: int, page: int, rpc_status: str, text_search=None, sort_property=None, sort_order=None): + device_id = self.get_id(device_id) + return self.rpc_v_2_controller.get_persisted_rpc_by_device_using_get(device_id=device_id, page_size=page_size, page=page, rpc_status=rpc_status, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_edge_events(self, edge_id: EdgeId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None): + edge_id = self.get_id(edge_id) + return self.edge_event_controller.get_edge_events_using_get(edge_id=edge_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time) + + def delete_customer(self, customer_id: CustomerId): + customer_id = self.get_id(customer_id) + return self.customer_controller.delete_customer_using_delete(customer_id=customer_id) + + def get_customers_by_ids(self, customer_ids: list): + return self.customer_controller.get_customers_by_ids_using_get(customer_ids=customer_ids) + + def get_short_customer_info_by_id(self, customer_id: CustomerId): + customer_id = self.get_id(customer_id) + return self.customer_controller.get_short_customer_info_by_id_using_get(customer_id=customer_id) + + def get_tenant_customer(self, customer_title: str): + return self.customer_controller.get_tenant_customer_using_get(customer_title=customer_title) + + def get_customers(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.customer_controller.get_customers_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_customer_title_by_id(self, customer_id: CustomerId): + customer_id = self.get_id(customer_id) + return self.customer_controller.get_customer_title_by_id_using_get(customer_id=customer_id) + + def get_customers_by_entity_group_id(self, entity_group_id: EntityGroupId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + entity_group_id = self.get_id(entity_group_id) + return self.customer_controller.get_customers_by_entity_group_id_using_get(entity_group_id=entity_group_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_customer_by_id(self, customer_id: CustomerId): + customer_id = self.get_id(customer_id) + return self.customer_controller.get_customer_by_id_using_get(customer_id=customer_id) + + def get_user_customers(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.customer_controller.get_user_customers_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def save_customer(self, body: Customer, entity_group_id=None): + entity_group_id = self.get_id(entity_group_id) + return self.customer_controller.save_customer_using_post(body=body, entity_group_id=entity_group_id) + + def get_all_customer_users(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.user_controller.get_all_customer_users_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_users_by_ids(self, user_ids: list): + return self.user_controller.get_users_by_ids_using_get(user_ids=user_ids) + + def get_user_by_id(self, user_id: UserId): + user_id = self.get_id(user_id) + return self.user_controller.get_user_by_id_using_get(user_id=user_id) + + def send_activation_email(self, email: str): + return self.user_controller.send_activation_email_using_post(email=email) + + def set_user_credentials_enabled(self, user_id: UserId, user_credentials_enabled=None): + user_id = self.get_id(user_id) + return self.user_controller.set_user_credentials_enabled_using_post(user_id=user_id, user_credentials_enabled=user_credentials_enabled) + + def get_customer_users(self, customer_id: CustomerId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.user_controller.get_customer_users_using_get(customer_id=customer_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_admins(self, tenant_id: TenantId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + tenant_id = self.get_id(tenant_id) + return self.user_controller.get_tenant_admins_using_get(tenant_id=tenant_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_user_token(self, user_id: UserId): + user_id = self.get_id(user_id) + return self.user_controller.get_user_token_using_get(user_id=user_id) + + def get_activation_link(self, user_id: UserId): + user_id = self.get_id(user_id) + return self.user_controller.get_activation_link_using_get(user_id=user_id) + + def get_user_users(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.user_controller.get_user_users_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_users_by_entity_group_id(self, entity_group_id: EntityGroupId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + entity_group_id = self.get_id(entity_group_id) + return self.user_controller.get_users_by_entity_group_id_using_get(entity_group_id=entity_group_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def delete_user(self, user_id: UserId): + user_id = self.get_id(user_id) + return self.user_controller.delete_user_using_delete(user_id=user_id) + + def save_user(self, body: User, send_activation_mail=None, entity_group_id=None): + entity_group_id = self.get_id(entity_group_id) + return self.user_controller.save_user_using_post(body=body, send_activation_mail=send_activation_mail, entity_group_id=entity_group_id) + + def is_user_token_access_enabled(self, ): + return self.user_controller.is_user_token_access_enabled_using_get() + + def delete_group_permission(self, group_permission_id: GroupPermissionId): + group_permission_id = self.get_id(group_permission_id) + return self.group_permission_controller.delete_group_permission_using_delete(group_permission_id=group_permission_id) + + def get_entity_group_permissions(self, entity_group_id: EntityGroupId): + entity_group_id = self.get_id(entity_group_id) + return self.group_permission_controller.get_entity_group_permissions_using_get(entity_group_id=entity_group_id) + + def get_group_permission_by_id(self, group_permission_id: GroupPermissionId): + group_permission_id = self.get_id(group_permission_id) + return self.group_permission_controller.get_group_permission_by_id_using_get(group_permission_id=group_permission_id) + + def get_group_permission_info_by_id(self, group_permission_id: GroupPermissionId, is_user_group: bool): + group_permission_id = self.get_id(group_permission_id) + return self.group_permission_controller.get_group_permission_info_by_id_using_get(group_permission_id=group_permission_id, is_user_group=is_user_group) + + def get_user_group_permissions(self, user_group_id: EntityId): + user_group_id = self.get_id(user_group_id) + return self.group_permission_controller.get_user_group_permissions_using_get(user_group_id=user_group_id) + + def load_user_group_permission_infos(self, body: List[GroupPermission]): + return self.group_permission_controller.load_user_group_permission_infos_using_post(body=body) + + def save_group_permission(self, body: GroupPermission): + return self.group_permission_controller.save_group_permission_using_post(body=body) + + def delete_device(self, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.device_controller.delete_device_using_delete(device_id=device_id) + + def claim_device(self, device_name: str, body=None, sub_customer_id=None): + sub_customer_id = self.get_id(sub_customer_id) + return self.device_controller.claim_device_using_post(device_name=device_name, body=body, sub_customer_id=sub_customer_id) + + def count_by_device_profile_and_empty_ota_package(self, ota_package_type: str, device_profile_id: DeviceProfileId): + device_profile_id = self.get_id(device_profile_id) + return self.device_controller.count_by_device_profile_and_empty_ota_package_using_get(ota_package_type=ota_package_type, device_profile_id=device_profile_id) + + def assign_device_to_tenant(self, tenant_id: TenantId, device_id: DeviceId): + tenant_id = self.get_id(tenant_id) + device_id = self.get_id(device_id) + return self.device_controller.assign_device_to_tenant_using_post(tenant_id=tenant_id, device_id=device_id) + + def get_tenant_devices(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.device_controller.get_tenant_devices_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_user_devices(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.device_controller.get_user_devices_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def re_claim_device(self, device_name: str): + return self.device_controller.re_claim_device_using_delete(device_name=device_name) + + def get_device_credentials_by_device_id(self, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.device_controller.get_device_credentials_by_device_id_using_get(device_id=device_id) + + def get_device_by_id(self, device_id: DeviceId): + device_id = self.get_id(device_id) + return self.device_controller.get_device_by_id_using_get(device_id=device_id) + + def count_by_device_group_and_empty_ota_package(self, ota_package_type: str, ota_package_id: OtaPackageId, entity_group_id: EntityGroupId): + ota_package_id = self.get_id(ota_package_id) + entity_group_id = self.get_id(entity_group_id) + return self.device_controller.count_by_device_group_and_empty_ota_package_using_get(ota_package_type=ota_package_type, ota_package_id=ota_package_id, entity_group_id=entity_group_id) + + def find_by_query_v1(self, body: DeviceSearchQuery): + return self.device_controller.find_by_query_using_post1(body=body) + + def get_devices_by_entity_group_id(self, entity_group_id: EntityGroupId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + entity_group_id = self.get_id(entity_group_id) + return self.device_controller.get_devices_by_entity_group_id_using_get(entity_group_id=entity_group_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_device(self, device_name: str): + return self.device_controller.get_tenant_device_using_get(device_name=device_name) + + def save_device(self, body: Device, access_token=None, entity_group_id=None): + entity_group_id = self.get_id(entity_group_id) + return self.device_controller.save_device_using_post(body=body, access_token=access_token, entity_group_id=entity_group_id) + + def get_device_types(self, ): + return self.device_controller.get_device_types_using_get() + + def get_devices_by_ids(self, device_ids: list): + return self.device_controller.get_devices_by_ids_using_get(device_ids=device_ids) + + def get_customer_devices(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.device_controller.get_customer_devices_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def save_device_credentials(self, body: DeviceCredentials): + return self.device_controller.save_device_credentials_using_post(body=body) + + def delete_converter(self, converter_id: ConverterId): + converter_id = self.get_id(converter_id) + return self.converter_controller.delete_converter_using_delete(converter_id=converter_id) + + def get_converter_by_id(self, converter_id: ConverterId): + converter_id = self.get_id(converter_id) + return self.converter_controller.get_converter_by_id_using_get(converter_id=converter_id) + + def get_converters_by_ids(self, converter_ids: list): + return self.converter_controller.get_converters_by_ids_using_get(converter_ids=converter_ids) + + def get_converters(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.converter_controller.get_converters_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_latest_converter_debug_input(self, converter_id: ConverterId): + converter_id = self.get_id(converter_id) + return self.converter_controller.get_latest_converter_debug_input_using_get(converter_id=converter_id) + + def save_converter(self, body: Converter): + return self.converter_controller.save_converter_using_post(body=body) + + def test_down_link_converter(self, body: str): + return self.converter_controller.test_down_link_converter_using_post(body=body) + + def test_up_link_converter(self, body: str): + return self.converter_controller.test_up_link_converter_using_post(body=body) + + def get_tenant_entity_views(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.entity_view_controller.get_tenant_entity_views_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def find_by_query_v4(self, body: EntityViewSearchQuery): + return self.entity_view_controller.find_by_query_using_post4(body=body) + + def get_entity_views_by_entity_group_id(self, entity_group_id: EntityGroupId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + entity_group_id = self.get_id(entity_group_id) + return self.entity_view_controller.get_entity_views_by_entity_group_id_using_get(entity_group_id=entity_group_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_entity_view_types(self, ): + return self.entity_view_controller.get_entity_view_types_using_get() + + def get_entity_view_by_id(self, entity_view_id: EntityViewId): + entity_view_id = self.get_id(entity_view_id) + return self.entity_view_controller.get_entity_view_by_id_using_get(entity_view_id=entity_view_id) + + def get_entity_views_by_ids(self, entity_view_ids: list): + return self.entity_view_controller.get_entity_views_by_ids_using_get(entity_view_ids=entity_view_ids) + + def delete_entity_view(self, entity_view_id: EntityViewId): + entity_view_id = self.get_id(entity_view_id) + return self.entity_view_controller.delete_entity_view_using_delete(entity_view_id=entity_view_id) + + def save_entity_view(self, body: EntityView, entity_group_id=None): + entity_group_id = self.get_id(entity_group_id) + return self.entity_view_controller.save_entity_view_using_post(body=body, entity_group_id=entity_group_id) + + def get_tenant_entity_view(self, entity_view_name: str): + return self.entity_view_controller.get_tenant_entity_view_using_get(entity_view_name=entity_view_name) + + def get_customer_entity_views(self, customer_id: CustomerId, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + customer_id = self.get_id(customer_id) + return self.entity_view_controller.get_customer_entity_views_using_get(customer_id=customer_id, page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_user_entity_views(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.entity_view_controller.get_user_entity_views_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def handle_rule_engine_request(self, body: str): + return self.rule_engine_controller.handle_rule_engine_request_using_post(body=body) + + def handle_rule_engine_request_v1(self, body: str, entity_type: str, entity_id: EntityId, timeout: int): + entity_id = self.get_id(entity_id) + return self.rule_engine_controller.handle_rule_engine_request_using_post1(body=body, entity_type=entity_type, entity_id=entity_id, timeout=timeout) + + def handle_rule_engine_request_v2(self, body: str, entity_type: str, entity_id: EntityId): + entity_id = self.get_id(entity_id) + return self.rule_engine_controller.handle_rule_engine_request_using_post2(body=body, entity_type=entity_type, entity_id=entity_id) + + def check_updates(self, ): + return self.admin_controller.check_updates_using_get() + + def get_security_settings(self, ): + return self.admin_controller.get_security_settings_using_get() + + def save_admin_settings(self, body: AdminSettings): + return self.admin_controller.save_admin_settings_using_post(body=body) + + def send_test_sms(self, body: TestSmsRequest): + return self.admin_controller.send_test_sms_using_post(body=body) + + def send_test_mail(self, body: AdminSettings): + return self.admin_controller.send_test_mail_using_post(body=body) + + def save_security_settings(self, body: SecuritySettings): + return self.admin_controller.save_security_settings_using_post(body=body) + + def get_admin_settings(self, key: str, system_by_default=None): + return self.admin_controller.get_admin_settings_using_get(key=key, system_by_default=system_by_default) + + def t_mobile_iot_cdp_process_request_v4_delete4(self, body: str, request_headers: dict, routing_key: str): + return self.t_mobile_iot_cdp_integration_controller.process_request_using_delete4(body=body, request_headers=request_headers, routing_key=routing_key) + + def t_mobile_iot_cdp_process_request_v4_get4(self, body: str, request_headers: dict, routing_key: str): + return self.t_mobile_iot_cdp_integration_controller.process_request_using_get4(body=body, request_headers=request_headers, routing_key=routing_key) + + def t_mobile_iot_cdp_process_request_v4_head4(self, body: str, request_headers: dict, routing_key: str): + return self.t_mobile_iot_cdp_integration_controller.process_request_using_head4(body=body, request_headers=request_headers, routing_key=routing_key) + + def t_mobile_iot_cdp_process_request_v4_options4(self, body: str, request_headers: dict, routing_key: str): + return self.t_mobile_iot_cdp_integration_controller.process_request_using_options4(body=body, request_headers=request_headers, routing_key=routing_key) + + def t_mobile_iot_cdp_process_request_v4_patch4(self, body: str, request_headers: dict, routing_key: str): + return self.t_mobile_iot_cdp_integration_controller.process_request_using_patch4(body=body, request_headers=request_headers, routing_key=routing_key) + + def t_mobile_iot_cdp_process_request_v12_post12(self, body: str, request_headers: dict, routing_key: str): + return self.t_mobile_iot_cdp_integration_controller.process_request_using_post12(body=body, request_headers=request_headers, routing_key=routing_key) + + def t_mobile_iot_cdp_process_request_v4_put4(self, body: str, request_headers: dict, routing_key: str): + return self.t_mobile_iot_cdp_integration_controller.process_request_using_put4(body=body, request_headers=request_headers, routing_key=routing_key) + + def sign_up(self, body: SignUpRequest): + return self.sign_up_controller.sign_up_using_post(body=body) + + def resend_email_activation(self, email: str, pkg_name=None): + return self.sign_up_controller.resend_email_activation_using_post(email=email, pkg_name=pkg_name) + + def activate_email(self, email_code: str, pkg_name=None): + return self.sign_up_controller.activate_email_using_get(email_code=email_code, pkg_name=pkg_name) + + def privacy_policy_accepted(self, ): + return self.sign_up_controller.privacy_policy_accepted_using_get() + + def set_not_display_welcome(self, ): + return self.sign_up_controller.set_not_display_welcome_using_post() + + def activate_user_by_email_code(self, email_code: str, pkg_name=None): + return self.sign_up_controller.activate_user_by_email_code_using_post(email_code=email_code, pkg_name=pkg_name) + + def get_recaptcha_public_key(self, ): + return self.sign_up_controller.get_recaptcha_public_key_using_get() + + def accept_privacy_policy(self, ): + return self.sign_up_controller.accept_privacy_policy_using_post() + + def is_display_welcome(self, ): + return self.sign_up_controller.is_display_welcome_using_get() + + def delete_tenant_account(self, ): + return self.sign_up_controller.delete_tenant_account_using_delete() + + def mobile_login(self, pkg_name: str): + return self.sign_up_controller.mobile_login_using_get(pkg_name=pkg_name) + + def delete_device_v1(self, ): + return self.trail_controller.delete_device_using_delete1() + + def thing_park_process_request_tpe_delete(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_tpe_using_delete(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_tpe_get(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_tpe_using_get(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_tpe_head(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_tpe_using_head(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_tpe_options(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_tpe_using_options(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_tpe_patch(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_tpe_using_patch(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_tpe_post(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_tpe_using_post(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_tpe_put(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_tpe_using_put(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_v5_delete5(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_using_delete5(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_v5_get5(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_using_get5(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_v5_head5(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_using_head5(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_v5_options5(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_using_options5(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_v5_patch5(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_using_patch5(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_v13_post13(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_using_post13(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def thing_park_process_request_v5_put5(self, body: str, request_headers: dict, all_request_params: dict, routing_key: str): + return self.thing_park_integration_controller.process_request_using_put5(body=body, request_headers=request_headers, all_request_params=all_request_params, routing_key=routing_key) + + def sig_fox_process_request_v3_delete3(self, body: str, request_headers: dict, routing_key: str): + return self.sig_fox_integration_controller.process_request_using_delete3(body=body, request_headers=request_headers, routing_key=routing_key) + + def sig_fox_process_request_v3_get3(self, body: str, request_headers: dict, routing_key: str): + return self.sig_fox_integration_controller.process_request_using_get3(body=body, request_headers=request_headers, routing_key=routing_key) + + def sig_fox_process_request_v3_head3(self, body: str, request_headers: dict, routing_key: str): + return self.sig_fox_integration_controller.process_request_using_head3(body=body, request_headers=request_headers, routing_key=routing_key) + + def sig_fox_process_request_v3_options3(self, body: str, request_headers: dict, routing_key: str): + return self.sig_fox_integration_controller.process_request_using_options3(body=body, request_headers=request_headers, routing_key=routing_key) + + def sig_fox_process_request_v3_patch3(self, body: str, request_headers: dict, routing_key: str): + return self.sig_fox_integration_controller.process_request_using_patch3(body=body, request_headers=request_headers, routing_key=routing_key) + + def sig_fox_process_request_v11_post11(self, body: str, request_headers: dict, routing_key: str): + return self.sig_fox_integration_controller.process_request_using_post11(body=body, request_headers=request_headers, routing_key=routing_key) + + def sig_fox_process_request_v3_put3(self, body: str, request_headers: dict, routing_key: str): + return self.sig_fox_integration_controller.process_request_using_put3(body=body, request_headers=request_headers, routing_key=routing_key) + + def assign_scheduler_event_to_edge(self, edge_id: EdgeId, scheduler_event_id: SchedulerEventId): + edge_id = self.get_id(edge_id) + scheduler_event_id = self.get_id(scheduler_event_id) + return self.scheduler_event_controller.assign_scheduler_event_to_edge_using_post(edge_id=edge_id, scheduler_event_id=scheduler_event_id) + + def delete_scheduler_event(self, scheduler_event_id: SchedulerEventId): + scheduler_event_id = self.get_id(scheduler_event_id) + return self.scheduler_event_controller.delete_scheduler_event_using_delete(scheduler_event_id=scheduler_event_id) + + def get_all_scheduler_events(self, edge_id: EdgeId): + edge_id = self.get_id(edge_id) + return self.scheduler_event_controller.get_all_scheduler_events_using_get(edge_id=edge_id) + + def get_edge_scheduler_events(self, edge_id: EdgeId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + edge_id = self.get_id(edge_id) + return self.scheduler_event_controller.get_edge_scheduler_events_using_get(edge_id=edge_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_scheduler_event_by_id(self, scheduler_event_id: SchedulerEventId): + scheduler_event_id = self.get_id(scheduler_event_id) + return self.scheduler_event_controller.get_scheduler_event_by_id_using_get(scheduler_event_id=scheduler_event_id) + + def get_scheduler_event_info_by_id(self, scheduler_event_id: SchedulerEventId): + scheduler_event_id = self.get_id(scheduler_event_id) + return self.scheduler_event_controller.get_scheduler_event_info_by_id_using_get(scheduler_event_id=scheduler_event_id) + + def get_scheduler_events_by_ids(self, scheduler_event_ids: list): + return self.scheduler_event_controller.get_scheduler_events_by_ids_using_get(scheduler_event_ids=scheduler_event_ids) + + def get_scheduler_events(self, type=None): + return self.scheduler_event_controller.get_scheduler_events_using_get(type=type) + + def save_scheduler_event(self, body: SchedulerEvent): + return self.scheduler_event_controller.save_scheduler_event_using_post(body=body) + + def unassign_scheduler_event_from_edge(self, edge_id: EdgeId, scheduler_event_id: SchedulerEventId): + edge_id = self.get_id(edge_id) + scheduler_event_id = self.get_id(scheduler_event_id) + return self.scheduler_event_controller.unassign_scheduler_event_from_edge_using_delete(edge_id=edge_id, scheduler_event_id=scheduler_event_id) + + def download_dashboard_report(self, body: str, dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.report_controller.download_dashboard_report_using_post(body=body, dashboard_id=dashboard_id) + + def download_test_report(self, body: ReportConfig, reports_server_endpoint_url=None): + return self.report_controller.download_test_report_using_post(body=body, reports_server_endpoint_url=reports_server_endpoint_url) + + def get_dashboard_by_id(self, dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.get_dashboard_by_id_using_get(dashboard_id=dashboard_id) + + def set_tenant_home_dashboard_info(self, body: HomeDashboardInfo): + return self.dashboard_controller.set_tenant_home_dashboard_info_using_post(body=body) + + def get_home_dashboard(self, ): + return self.dashboard_controller.get_home_dashboard_using_get() + + def get_tenant_dashboards_v1(self, tenant_id: TenantId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + tenant_id = self.get_id(tenant_id) + return self.dashboard_controller.get_tenant_dashboards_using_get1(tenant_id=tenant_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_dashboards(self, page_size: str, page: str, mobile=None, text_search=None, sort_property=None, sort_order=None): + return self.dashboard_controller.get_tenant_dashboards_using_get(page_size=page_size, page=page, mobile=mobile, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def save_dashboard(self, body: Dashboard, entity_group_id=None): + entity_group_id = self.get_id(entity_group_id) + return self.dashboard_controller.save_dashboard_using_post(body=body, entity_group_id=entity_group_id) + + def get_home_dashboard_info(self, ): + return self.dashboard_controller.get_home_dashboard_info_using_get() + + def get_max_datapoints_limit(self, ): + return self.dashboard_controller.get_max_datapoints_limit_using_get() + + def get_dashboard_info_by_id(self, dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.get_dashboard_info_by_id_using_get(dashboard_id=dashboard_id) + + def delete_dashboard(self, dashboard_id: DashboardId): + dashboard_id = self.get_id(dashboard_id) + return self.dashboard_controller.delete_dashboard_using_delete(dashboard_id=dashboard_id) + + def get_customer_home_dashboard_info(self, ): + return self.dashboard_controller.get_customer_home_dashboard_info_using_get() + + def set_customer_home_dashboard_info(self, body: HomeDashboardInfo): + return self.dashboard_controller.set_customer_home_dashboard_info_using_post(body=body) + + def get_dashboards_by_ids(self, dashboard_ids: list): + return self.dashboard_controller.get_dashboards_by_ids_using_get(dashboard_ids=dashboard_ids) + + def get_group_dashboards(self, entity_group_id: EntityGroupId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + entity_group_id = self.get_id(entity_group_id) + return self.dashboard_controller.get_group_dashboards_using_get(entity_group_id=entity_group_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def import_group_dashboards(self, body: List[Dashboard], entity_group_id: EntityGroupId, overwrite=None): + entity_group_id = self.get_id(entity_group_id) + return self.dashboard_controller.import_group_dashboards_using_post(body=body, entity_group_id=entity_group_id, overwrite=overwrite) + + def get_user_dashboards(self, page_size: str, page: str, mobile=None, text_search=None, sort_property=None, sort_order=None, operation=None, user_id=None): + user_id = self.get_id(user_id) + return self.dashboard_controller.get_user_dashboards_using_get(page_size=page_size, page=page, mobile=mobile, text_search=text_search, sort_property=sort_property, sort_order=sort_order, operation=operation, user_id=user_id) + + def get_server_time(self, ): + return self.dashboard_controller.get_server_time_using_get() + + def export_group_dashboards(self, entity_group_id: EntityGroupId, limit: str): + entity_group_id = self.get_id(entity_group_id) + return self.dashboard_controller.export_group_dashboards_using_get(entity_group_id=entity_group_id, limit=limit) + + def get_dashboards_by_entity_group_id(self, entity_group_id: EntityGroupId, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None): + entity_group_id = self.get_id(entity_group_id) + return self.dashboard_controller.get_dashboards_by_entity_group_id_using_get(entity_group_id=entity_group_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_home_dashboard_info(self, ): + return self.dashboard_controller.get_tenant_home_dashboard_info_using_get() + + def check_integration_connection_post(self, body: Integration): + return self.integration_controller.check_integration_connection_using_post(body=body) + + def delete_integration_delete(self, integration_id: IntegrationId): + integration_id = self.get_id(integration_id) + return self.integration_controller.delete_integration_using_delete(integration_id=integration_id) + + def get_integration_by_id_get(self, integration_id: IntegrationId): + integration_id = self.get_id(integration_id) + return self.integration_controller.get_integration_by_id_using_get(integration_id=integration_id) + + def get_integration_by_routing_key_get(self, routing_key: str): + return self.integration_controller.get_integration_by_routing_key_using_get(routing_key=routing_key) + + def get_integrations_by_ids_get(self, integration_ids: list): + return self.integration_controller.get_integrations_by_ids_using_get(integration_ids=integration_ids) + + def get_integrations_get(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.integration_controller.get_integrations_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def save_integration_post(self, body: Integration): + return self.integration_controller.save_integration_using_post(body=body) + + def get_current_custom_menu(self, ): + return self.custom_menu_controller.get_current_custom_menu_using_get() + + def get_custom_menu(self, ): + return self.custom_menu_controller.get_custom_menu_using_get() + + def save_custom_menu(self, body=None): + return self.custom_menu_controller.save_custom_menu_using_post(body=body) + + def get_lwm2m_bootstrap_security_info(self, is_bootstrap_server: bool): + return self.lwm_2m_controller.get_lwm2m_bootstrap_security_info_using_get(is_bootstrap_server=is_bootstrap_server) + + def save_device_with_credentials(self, entity_group_id=None, object=None): + entity_group_id = self.get_id(entity_group_id) + return self.lwm_2m_controller.save_device_with_credentials_using_post(entity_group_id=entity_group_id, object=object) + + def get_current_custom_translation(self, ): + return self.custom_translation_controller.get_current_custom_translation_using_get() + + def get_custom_translation(self, ): + return self.custom_translation_controller.get_custom_translation_using_get() + + def save_custom_translation(self, body: CustomTranslation): + return self.custom_translation_controller.save_custom_translation_using_post(body=body) + + def delete_role(self, role_id: RoleId): + role_id = self.get_id(role_id) + return self.role_controller.delete_role_using_delete(role_id=role_id) + + def get_role_by_id(self, role_id: RoleId): + role_id = self.get_id(role_id) + return self.role_controller.get_role_by_id_using_get(role_id=role_id) + + def get_roles_by_ids(self, role_ids: list): + return self.role_controller.get_roles_by_ids_using_get(role_ids=role_ids) + + def get_roles(self, page_size: str, page: str, type=None, text_search=None, sort_property=None, sort_order=None): + return self.role_controller.get_roles_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def save_role(self, body: Role): + return self.role_controller.save_role_using_post(body=body) + + def delete_blob_entity(self, blob_entity_id: BlobEntityId): + blob_entity_id = self.get_id(blob_entity_id) + return self.blob_entity_controller.delete_blob_entity_using_delete(blob_entity_id=blob_entity_id) + + def download_blob_entity(self, blob_entity_id: BlobEntityId): + blob_entity_id = self.get_id(blob_entity_id) + return self.blob_entity_controller.download_blob_entity_using_get(blob_entity_id=blob_entity_id) + + def get_blob_entities_by_ids(self, blob_entity_ids: list): + return self.blob_entity_controller.get_blob_entities_by_ids_using_get(blob_entity_ids=blob_entity_ids) + + def get_blob_entities(self, page_size: int, page: int, type=None, text_search=None, sort_property=None, sort_order=None, start_time=None, end_time=None): + return self.blob_entity_controller.get_blob_entities_using_get(page_size=page_size, page=page, type=type, text_search=text_search, sort_property=sort_property, sort_order=sort_order, start_time=start_time, end_time=end_time) + + def get_blob_entity_info_by_id(self, blob_entity_id: BlobEntityId): + blob_entity_id = self.get_id(blob_entity_id) + return self.blob_entity_controller.get_blob_entity_info_by_id_using_get(blob_entity_id=blob_entity_id) + + def loriot_process_request_v1_delete1(self, body: str, request_headers: dict, routing_key: str): + return self.loriot_integration_controller.process_request_using_delete1(body=body, request_headers=request_headers, routing_key=routing_key) + + def loriot_process_request_v1_get1(self, body: str, request_headers: dict, routing_key: str): + return self.loriot_integration_controller.process_request_using_get1(body=body, request_headers=request_headers, routing_key=routing_key) + + def loriot_process_request_v1_head1(self, body: str, request_headers: dict, routing_key: str): + return self.loriot_integration_controller.process_request_using_head1(body=body, request_headers=request_headers, routing_key=routing_key) + + def loriot_process_request_v1_options1(self, body: str, request_headers: dict, routing_key: str): + return self.loriot_integration_controller.process_request_using_options1(body=body, request_headers=request_headers, routing_key=routing_key) + + def loriot_process_request_v1_patch1(self, body: str, request_headers: dict, routing_key: str): + return self.loriot_integration_controller.process_request_using_patch1(body=body, request_headers=request_headers, routing_key=routing_key) + + def loriot_process_request_v9_post9(self, body: str, request_headers: dict, routing_key: str): + return self.loriot_integration_controller.process_request_using_post9(body=body, request_headers=request_headers, routing_key=routing_key) + + def loriot_process_request_v1_put1(self, body: str, request_headers: dict, routing_key: str): + return self.loriot_integration_controller.process_request_using_put1(body=body, request_headers=request_headers, routing_key=routing_key) + + def get_tenants(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.tenant_controller.get_tenants_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_info_by_id(self, tenant_id: TenantId): + tenant_id = self.get_id(tenant_id) + return self.tenant_controller.get_tenant_info_by_id_using_get(tenant_id=tenant_id) + + def delete_tenant(self, tenant_id: TenantId): + tenant_id = self.get_id(tenant_id) + return self.tenant_controller.delete_tenant_using_delete(tenant_id=tenant_id) + + def save_tenant(self, body: Tenant): + return self.tenant_controller.save_tenant_using_post(body=body) + + def get_tenants_by_ids(self, tenant_ids: list): + return self.tenant_controller.get_tenants_by_ids_using_get(tenant_ids=tenant_ids) + + def get_tenant_infos(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.tenant_controller.get_tenant_infos_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_tenant_by_id(self, tenant_id: TenantId): + tenant_id = self.get_id(tenant_id) + return self.tenant_controller.get_tenant_by_id_using_get(tenant_id=tenant_id) + + def chirp_stack_process_request_delete(self, body: str, request_headers: dict, routing_key: str): + return self.chirp_stack_integration_controller.process_request_using_delete(body=body, request_headers=request_headers, routing_key=routing_key) + + def chirp_stack_process_request_get(self, body: str, request_headers: dict, routing_key: str): + return self.chirp_stack_integration_controller.process_request_using_get(body=body, request_headers=request_headers, routing_key=routing_key) + + def chirp_stack_process_request_head(self, body: str, request_headers: dict, routing_key: str): + return self.chirp_stack_integration_controller.process_request_using_head(body=body, request_headers=request_headers, routing_key=routing_key) + + def chirp_stack_process_request_options(self, body: str, request_headers: dict, routing_key: str): + return self.chirp_stack_integration_controller.process_request_using_options(body=body, request_headers=request_headers, routing_key=routing_key) + + def chirp_stack_process_request_patch(self, body: str, request_headers: dict, routing_key: str): + return self.chirp_stack_integration_controller.process_request_using_patch(body=body, request_headers=request_headers, routing_key=routing_key) + + def chirp_stack_process_request_post(self, body: str, request_headers: dict, routing_key: str): + return self.chirp_stack_integration_controller.process_request_using_post(body=body, request_headers=request_headers, routing_key=routing_key) + + def chirp_stack_process_request_put(self, body: str, request_headers: dict, routing_key: str): + return self.chirp_stack_integration_controller.process_request_using_put(body=body, request_headers=request_headers, routing_key=routing_key) + + def get_app_theme_css(self, body: PaletteSettings): + return self.white_labeling_controller.get_app_theme_css_using_post(body=body) + + def get_current_login_white_label_params(self, ): + return self.white_labeling_controller.get_current_login_white_label_params_using_get() + + def get_current_white_label_params(self, ): + return self.white_labeling_controller.get_current_white_label_params_using_get() + + def get_login_theme_css(self, body: PaletteSettings, dark_foreground=None): + return self.white_labeling_controller.get_login_theme_css_using_post(body=body, dark_foreground=dark_foreground) + + def get_login_white_label_params(self, logo_image_checksum=None, favicon_checksum=None): + return self.white_labeling_controller.get_login_white_label_params_using_get(logo_image_checksum=logo_image_checksum, favicon_checksum=favicon_checksum) + + def get_white_label_params(self, logo_image_checksum=None, favicon_checksum=None): + return self.white_labeling_controller.get_white_label_params_using_get(logo_image_checksum=logo_image_checksum, favicon_checksum=favicon_checksum) + + def is_customer_white_labeling_allowed(self, ): + return self.white_labeling_controller.is_customer_white_labeling_allowed_using_get() + + def is_white_labeling_allowed(self, ): + return self.white_labeling_controller.is_white_labeling_allowed_using_get() + + def preview_white_label_params(self, body: WhiteLabelingParams): + return self.white_labeling_controller.preview_white_label_params_using_post(body=body) + + def save_login_white_label_params(self, body: LoginWhiteLabelingParams): + return self.white_labeling_controller.save_login_white_label_params_using_post(body=body) + + def save_white_label_params(self, body: WhiteLabelingParams): + return self.white_labeling_controller.save_white_label_params_using_post(body=body) + + def save_ota_package_data(self, file: str, checksum_algorithm: str, ota_package_id: OtaPackageId, checksum=None): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.save_ota_package_data_using_post(file=file, checksum_algorithm=checksum_algorithm, ota_package_id=ota_package_id, checksum=checksum) + + def save_ota_package_info(self, body: SaveOtaPackageInfoRequest): + return self.ota_package_controller.save_ota_package_info_using_post(body=body) + + def download_ota_package(self, ota_package_id: OtaPackageId): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.download_ota_package_using_get(ota_package_id=ota_package_id) + + def get_ota_package_info_by_id(self, ota_package_id: OtaPackageId): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.get_ota_package_info_by_id_using_get(ota_package_id=ota_package_id) + + def delete_ota_package(self, ota_package_id: OtaPackageId): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.delete_ota_package_using_delete(ota_package_id=ota_package_id) + + def get_ota_package_by_id(self, ota_package_id: OtaPackageId): + ota_package_id = self.get_id(ota_package_id) + return self.ota_package_controller.get_ota_package_by_id_using_get(ota_package_id=ota_package_id) + + def get_group_ota_packages(self, group_id: EntityGroupId, type: str, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None): + group_id = self.get_id(group_id) + return self.ota_package_controller.get_group_ota_packages_using_get(group_id=group_id, type=type, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_ota_packages(self, device_profile_id: DeviceProfileId, type: str, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None): + device_profile_id = self.get_id(device_profile_id) + return self.ota_package_controller.get_ota_packages_using_get(device_profile_id=device_profile_id, type=type, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_ota_packages_v1(self, page_size: int, page: int, text_search=None, sort_property=None, sort_order=None): + return self.ota_package_controller.get_ota_packages_using_get1(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def add_entities_to_entity_group(self, body: List[str], entity_group_id: EntityGroupId): + entity_group_id = self.get_id(entity_group_id) + return self.entity_group_controller.add_entities_to_entity_group_using_post(body=body, entity_group_id=entity_group_id) + + def assign_entity_group_to_edge(self, edge_id: EdgeId, group_type: str, entity_group_id: EntityGroupId): + edge_id = self.get_id(edge_id) + entity_group_id = self.get_id(entity_group_id) + return self.entity_group_controller.assign_entity_group_to_edge_using_post(edge_id=edge_id, group_type=group_type, entity_group_id=entity_group_id) + + def delete_entity_group(self, entity_group_id: EntityGroupId): + entity_group_id = self.get_id(entity_group_id) + return self.entity_group_controller.delete_entity_group_using_delete(entity_group_id=entity_group_id) + + def get_all_edge_entity_groups(self, edge_id: EdgeId, group_type: str): + edge_id = self.get_id(edge_id) + return self.entity_group_controller.get_all_edge_entity_groups_using_get(edge_id=edge_id, group_type=group_type) + + def get_edge_entity_groups(self, edge_id: EdgeId, group_type: str, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + edge_id = self.get_id(edge_id) + return self.entity_group_controller.get_edge_entity_groups_using_get(edge_id=edge_id, group_type=group_type, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_entities(self, entity_group_id: EntityGroupId, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + entity_group_id = self.get_id(entity_group_id) + return self.entity_group_controller.get_entities_using_get(entity_group_id=entity_group_id, page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def get_entity_group_all_by_owner_and_type(self, owner_type: str, owner_id: UserId, group_type: str): + owner_id = self.get_id(owner_id) + return self.entity_group_controller.get_entity_group_all_by_owner_and_type_using_get(owner_type=owner_type, owner_id=owner_id, group_type=group_type) + + def get_entity_group_by_id(self, entity_group_id: EntityGroupId): + entity_group_id = self.get_id(entity_group_id) + return self.entity_group_controller.get_entity_group_by_id_using_get(entity_group_id=entity_group_id) + + def get_entity_group_by_owner_and_name_and_type(self, owner_type: str, owner_id: UserId, group_type: str, group_name: str): + owner_id = self.get_id(owner_id) + return self.entity_group_controller.get_entity_group_by_owner_and_name_and_type_using_get(owner_type=owner_type, owner_id=owner_id, group_type=group_type, group_name=group_name) + + def get_entity_groups_by_ids(self, entity_group_ids: list): + return self.entity_group_controller.get_entity_groups_by_ids_using_get(entity_group_ids=entity_group_ids) + + def get_entity_groups_by_owner_and_type(self, owner_type: str, owner_id: UserId, group_type: str): + owner_id = self.get_id(owner_id) + return self.entity_group_controller.get_entity_groups_by_owner_and_type_using_get(owner_type=owner_type, owner_id=owner_id, group_type=group_type) + + def get_entity_groups_by_type(self, group_type: str): + return self.entity_group_controller.get_entity_groups_by_type_using_get(group_type=group_type) + + def get_entity_groups_for_entity(self, entity_type: str, entity_id: EntityId): + entity_id = self.get_id(entity_id) + return self.entity_group_controller.get_entity_groups_for_entity_using_get(entity_type=entity_type, entity_id=entity_id) + + def get_group_entity(self, entity_group_id: EntityGroupId, entity_id: EntityId): + entity_group_id = self.get_id(entity_group_id) + entity_id = self.get_id(entity_id) + return self.entity_group_controller.get_group_entity_using_get(entity_group_id=entity_group_id, entity_id=entity_id) + + def get_owners(self, page_size: str, page: str, text_search=None, sort_property=None, sort_order=None): + return self.entity_group_controller.get_owners_using_get(page_size=page_size, page=page, text_search=text_search, sort_property=sort_property, sort_order=sort_order) + + def make_entity_group_private(self, entity_group_id: EntityGroupId): + entity_group_id = self.get_id(entity_group_id) + return self.entity_group_controller.make_entity_group_private_using_post(entity_group_id=entity_group_id) + + def make_entity_group_public(self, entity_group_id: EntityGroupId): + entity_group_id = self.get_id(entity_group_id) + return self.entity_group_controller.make_entity_group_public_using_post(entity_group_id=entity_group_id) + + def remove_entities_from_entity_group(self, body: List[str], entity_group_id: EntityGroupId): + entity_group_id = self.get_id(entity_group_id) + return self.entity_group_controller.remove_entities_from_entity_group_using_post(body=body, entity_group_id=entity_group_id) + + def save_entity_group(self, body: EntityGroup): + return self.entity_group_controller.save_entity_group_using_post(body=body) + + def share_entity_group_to_child_owner_user_group(self, entity_group_id: EntityGroupId, user_group_id: EntityId, role_id: RoleId): + entity_group_id = self.get_id(entity_group_id) + user_group_id = self.get_id(user_group_id) + role_id = self.get_id(role_id) + return self.entity_group_controller.share_entity_group_to_child_owner_user_group_using_post(entity_group_id=entity_group_id, user_group_id=user_group_id, role_id=role_id) + + def share_entity_group(self, body: ShareGroupRequest, entity_group_id: EntityGroupId): + entity_group_id = self.get_id(entity_group_id) + return self.entity_group_controller.share_entity_group_using_post(body=body, entity_group_id=entity_group_id) + + def unassign_entity_group_from_edge(self, edge_id: EdgeId, group_type: str, entity_group_id: EntityGroupId): + edge_id = self.get_id(edge_id) + entity_group_id = self.get_id(entity_group_id) + return self.entity_group_controller.unassign_entity_group_from_edge_using_delete(edge_id=edge_id, group_type=group_type, entity_group_id=entity_group_id) + + + def __load_controllers(self): + self.http_integration_controller = HttpIntegrationControllerApi(self.api_client) + self.user_permissions_controller = UserPermissionsControllerApi(self.api_client) + self.device_group_ota_package_controller = DeviceGroupOtaPackageControllerApi(self.api_client) + self.converter_controller = ConverterControllerApi(self.api_client) + self.t_mobile_iot_cdp_integration_controller = TMobileIotCdpIntegrationControllerApi(self.api_client) + self.customer_controller = CustomerControllerApi(self.api_client) + self.role_controller = RoleControllerApi(self.api_client) + self.entity_group_controller = EntityGroupControllerApi(self.api_client) + self.admin_controller = AdminControllerApi(self.api_client) + self.edge_controller = EdgeControllerApi(self.api_client) + self.tenant_controller = TenantControllerApi(self.api_client) + self.trail_controller = TrailControllerApi(self.api_client) + self.report_controller = ReportControllerApi(self.api_client) + self.dashboard_controller = DashboardControllerApi(self.api_client) + self.loriot_integration_controller = LoriotIntegrationControllerApi(self.api_client) + self.entity_view_controller = EntityViewControllerApi(self.api_client) + self.rpc_v2_controller = RpcV2ControllerApi(self.api_client) + self.lwm2m_controller = Lwm2mControllerApi(self.api_client) + self.scheduler_event_controller = SchedulerEventControllerApi(self.api_client) + self.custom_menu_controller = CustomMenuControllerApi(self.api_client) + self.thing_park_integration_controller = ThingParkIntegrationControllerApi(self.api_client) + self.rule_engine_controller = RuleEngineControllerApi(self.api_client) + self.ocean_connect_integration_controller = OceanConnectIntegrationControllerApi(self.api_client) + self.integration_controller = IntegrationControllerApi(self.api_client) + self.custom_translation_controller = CustomTranslationControllerApi(self.api_client) + self.ota_package_controller = OtaPackageControllerApi(self.api_client) + self.edge_event_controller = EdgeEventControllerApi(self.api_client) + self.device_controller = DeviceControllerApi(self.api_client) + self.group_permission_controller = GroupPermissionControllerApi(self.api_client) + self.chirp_stack_integration_controller = ChirpStackIntegrationControllerApi(self.api_client) + self.user_controller = UserControllerApi(self.api_client) + self.white_labeling_controller = WhiteLabelingControllerApi(self.api_client) + self.sign_up_controller = SignUpControllerApi(self.api_client) + self.blob_entity_controller = BlobEntityControllerApi(self.api_client) + self.owner_controller = OwnerControllerApi(self.api_client) + self.self_registration_controller = SelfRegistrationControllerApi(self.api_client) + self.sig_fox_integration_controller = SigFoxIntegrationControllerApi(self.api_client) + self.asset_controller = AssetControllerApi(self.api_client) + diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__init__.py new file mode 100644 index 0000000..fe86b59 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__init__.py @@ -0,0 +1,85 @@ +""" +Python HTTP library with thread-safe connection pooling, file post support, user friendly, and more +""" +from __future__ import absolute_import + +# Set default logging handler to avoid "No handler found" warnings. +import logging +import warnings +from logging import NullHandler + +from . import exceptions +from ._version import __version__ +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util.request import make_headers +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host + +__author__ = "Andrey Petrov (andrey.petrov@shazow.net)" +__license__ = "MIT" +__version__ = __version__ + +__all__ = ( + "HTTPConnectionPool", + "HTTPSConnectionPool", + "PoolManager", + "ProxyManager", + "HTTPResponse", + "Retry", + "Timeout", + "add_stderr_logger", + "connection_from_url", + "disable_warnings", + "encode_multipart_formdata", + "get_host", + "make_headers", + "proxy_from_url", +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s")) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug("Added a stderr logging handler to logger: %s", __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter("always", exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter("default", exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter("default", exceptions.InsecurePlatformWarning, append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter("default", exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter("ignore", category) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..660369402e16d5d6a8bb03c499df16875c05e3f0 GIT binary patch literal 2179 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 Ta`RJ4b5iX<&MOAl$iWBzDdRP? literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/connection.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/connection.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2a6a7522c7e76734fab853acecd49cd06955c75 GIT binary patch literal 13638 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/exceptions.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a44a42342e43f43c3ee42822568afd3bf8477fc5 GIT binary patch literal 10984 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/poolmanager.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/__pycache__/poolmanager.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8448fc8bf2f1a06c6f851ad9d194d1a7ea90a89 GIT binary patch literal 15209 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 self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self.lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError( + "Iteration over this class is unlikely to be threadsafe." + ) + + def clear(self): + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(itervalues(self._container)) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self.lock: + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = OrderedDict() + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = [key, val] + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ", ".join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, "keys"): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return dict((k.lower(), v) for k, v in self.itermerged()) == dict( + (k.lower(), v) for k, v in other.itermerged() + ) + + def __ne__(self, other): + return not self.__eq__(other) + + if six.PY2: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + """D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + """ + # Using the MutableMapping function directly fails due to the private marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = [key, val] + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + vals.append(val) + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError( + "extend() takes at most 1 positional " + "arguments ({0} given)".format(len(args)) + ) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key, default=__marker): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + if default is self.__marker: + return [] + return default + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + # Backwards compatibility for http.cookiejar + get_all = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ", ".join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + obs_fold_continued_leaders = (" ", "\t") + headers = [] + + for line in message.headers: + if line.startswith(obs_fold_continued_leaders): + if not headers: + # We received a header line that starts with OWS as described + # in RFC-7230 S3.2.4. This indicates a multiline header, but + # there exists no previous header to which we can attach it. + raise InvalidHeader( + "Header continuation with no previous header: %s" % line + ) + else: + key, value = headers[-1] + headers[-1] = (key, value + " " + line.strip()) + continue + + key, value = line.split(":", 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/_version.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/_version.py new file mode 100644 index 0000000..d905b69 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/_version.py @@ -0,0 +1,2 @@ +# This file is protected via CODEOWNERS +__version__ = "1.26.9" diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/connection.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/connection.py new file mode 100644 index 0000000..7bf395b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/connection.py @@ -0,0 +1,567 @@ +from __future__ import absolute_import + +import datetime +import logging +import os +import re +import socket +import warnings +from socket import error as SocketError +from socket import timeout as SocketTimeout + +from .packages import six +from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection +from .packages.six.moves.http_client import HTTPException # noqa: F401 +from .util.proxy import create_proxy_ssl_context + +try: # Compiled with SSL? + import ssl + + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. + ssl = None + + class BaseSSLError(BaseException): + pass + + +try: + # Python 3: not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: + # Python 2 + class ConnectionError(Exception): + pass + + +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + BrokenPipeError = BrokenPipeError +except NameError: # Python 2: + + class BrokenPipeError(Exception): + pass + + +from ._collections import HTTPHeaderDict # noqa (historical, removed in v2) +from ._version import __version__ +from .exceptions import ( + ConnectTimeoutError, + NewConnectionError, + SubjectAltNameWarning, + SystemTimeWarning, +) +from .util import SKIP_HEADER, SKIPPABLE_HEADERS, connection +from .util.ssl_ import ( + assert_fingerprint, + create_urllib3_context, + is_ipaddress, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .util.ssl_match_hostname import CertificateError, match_hostname + +log = logging.getLogger(__name__) + +port_by_scheme = {"http": 80, "https": 443} + +# When it comes time to update this value as a part of regular maintenance +# (ie test_recent_date is failing) update it to ~6 months before the current date. +RECENT_DATE = datetime.date(2020, 7, 1) + +_CONTAINS_CONTROL_CHAR_RE = re.compile(r"[^-!#$%&'*+.^_`|~0-9a-zA-Z]") + + +class HTTPConnection(_HTTPConnection, object): + """ + Based on :class:`http.client.HTTPConnection` but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass: + + .. code-block:: python + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port = port_by_scheme["http"] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False + + #: Whether this proxy connection (if used) verifies the proxy host's + #: certificate. + proxy_is_verified = None + + def __init__(self, *args, **kw): + if not six.PY2: + kw.pop("strict", None) + + # Pre-set source_address. + self.source_address = kw.get("source_address") + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop("socket_options", self.default_socket_options) + + # Proxy options provided by the user. + self.proxy = kw.pop("proxy", None) + self.proxy_config = kw.pop("proxy_config", None) + + _HTTPConnection.__init__(self, *args, **kw) + + @property + def host(self): + """ + Getter method to remove any trailing dots that indicate the hostname is an FQDN. + + In general, SSL certificates don't include the trailing dot indicating a + fully-qualified domain name, and thus, they don't validate properly when + checked against a domain name that includes the dot. In addition, some + servers may not expect to receive the trailing dot when provided. + + However, the hostname with trailing dot is critical to DNS resolution; doing a + lookup with the trailing dot will properly only resolve the appropriate FQDN, + whereas a lookup without a trailing dot will search the system's search domain + list. Thus, it's important to keep the original host around for use only in + those cases where it's appropriate (i.e., when doing DNS lookup to establish the + actual TCP connection across which we're going to send HTTP requests). + """ + return self._dns_host.rstrip(".") + + @host.setter + def host(self, value): + """ + Setter for the `host` property. + + We assume that only urllib3 uses the _dns_host attribute; httplib itself + only uses `host`, and it seems reasonable that other libraries follow suit. + """ + self._dns_host = value + + def _new_conn(self): + """Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + extra_kw = {} + if self.source_address: + extra_kw["source_address"] = self.source_address + + if self.socket_options: + extra_kw["socket_options"] = self.socket_options + + try: + conn = connection.create_connection( + (self._dns_host, self.port), self.timeout, **extra_kw + ) + + except SocketTimeout: + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" + % (self.host, self.timeout), + ) + + except SocketError as e: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e + ) + + return conn + + def _is_using_tunnel(self): + # Google App Engine's httplib does not define _tunnel_host + return getattr(self, "_tunnel_host", None) + + def _prepare_conn(self, conn): + self.sock = conn + if self._is_using_tunnel(): + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + def putrequest(self, method, url, *args, **kwargs): + """ """ + # Empty docstring because the indentation of CPython's implementation + # is broken but we don't want this method in our documentation. + match = _CONTAINS_CONTROL_CHAR_RE.search(method) + if match: + raise ValueError( + "Method cannot contain non-token characters %r (found at least %r)" + % (method, match.group()) + ) + + return _HTTPConnection.putrequest(self, method, url, *args, **kwargs) + + def putheader(self, header, *values): + """ """ + if not any(isinstance(v, str) and v == SKIP_HEADER for v in values): + _HTTPConnection.putheader(self, header, *values) + elif six.ensure_str(header.lower()) not in SKIPPABLE_HEADERS: + raise ValueError( + "urllib3.util.SKIP_HEADER only supports '%s'" + % ("', '".join(map(str.title, sorted(SKIPPABLE_HEADERS))),) + ) + + def request(self, method, url, body=None, headers=None): + if headers is None: + headers = {} + else: + # Avoid modifying the headers passed into .request() + headers = headers.copy() + if "user-agent" not in (six.ensure_str(k.lower()) for k in headers): + headers["User-Agent"] = _get_default_user_agent() + super(HTTPConnection, self).request(method, url, body=body, headers=headers) + + def request_chunked(self, method, url, body=None, headers=None): + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + headers = headers or {} + header_keys = set([six.ensure_str(k.lower()) for k in headers]) + skip_accept_encoding = "accept-encoding" in header_keys + skip_host = "host" in header_keys + self.putrequest( + method, url, skip_accept_encoding=skip_accept_encoding, skip_host=skip_host + ) + if "user-agent" not in header_keys: + self.putheader("User-Agent", _get_default_user_agent()) + for header, value in headers.items(): + self.putheader(header, value) + if "transfer-encoding" not in header_keys: + self.putheader("Transfer-Encoding", "chunked") + self.endheaders() + + if body is not None: + stringish_types = six.string_types + (bytes,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, bytes): + chunk = chunk.encode("utf8") + len_str = hex(len(chunk))[2:] + to_send = bytearray(len_str.encode()) + to_send += b"\r\n" + to_send += chunk + to_send += b"\r\n" + self.send(to_send) + + # After the if clause, to always have a closed body + self.send(b"0\r\n\r\n") + + +class HTTPSConnection(HTTPConnection): + """ + Many of the parameters to this constructor are passed to the underlying SSL + socket by means of :py:func:`urllib3.util.ssl_wrap_socket`. + """ + + default_port = port_by_scheme["https"] + + cert_reqs = None + ca_certs = None + ca_cert_dir = None + ca_cert_data = None + ssl_version = None + assert_fingerprint = None + tls_in_tls_required = False + + def __init__( + self, + host, + port=None, + key_file=None, + cert_file=None, + key_password=None, + strict=None, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + ssl_context=None, + server_hostname=None, + **kw + ): + + HTTPConnection.__init__(self, host, port, strict=strict, timeout=timeout, **kw) + + self.key_file = key_file + self.cert_file = cert_file + self.key_password = key_password + self.ssl_context = ssl_context + self.server_hostname = server_hostname + + # Required property for Google AppEngine 1.9.0 which otherwise causes + # HTTPS requests to go out as HTTP. (See Issue #356) + self._protocol = "https" + + def set_cert( + self, + key_file=None, + cert_file=None, + cert_reqs=None, + key_password=None, + ca_certs=None, + assert_hostname=None, + assert_fingerprint=None, + ca_cert_dir=None, + ca_cert_data=None, + ): + """ + This method should only be called once, before the connection is used. + """ + # If cert_reqs is not provided we'll assume CERT_REQUIRED unless we also + # have an SSLContext object in which case we'll use its verify_mode. + if cert_reqs is None: + if self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + else: + cert_reqs = resolve_cert_reqs(None) + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.key_password = key_password + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + self.ca_cert_data = ca_cert_data + + def connect(self): + # Add certificate verification + self.sock = conn = self._new_conn() + hostname = self.host + tls_in_tls = False + + if self._is_using_tunnel(): + if self.tls_in_tls_required: + self.sock = conn = self._connect_tls_proxy(hostname, conn) + tls_in_tls = True + + # Calls self._set_hostport(), so self.host is + # self._tunnel_host below. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + # Override the host with the one we're requesting data from. + hostname = self._tunnel_host + + server_hostname = hostname + if self.server_hostname is not None: + server_hostname = self.server_hostname + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn( + ( + "System time is way off (before {0}). This will probably " + "lead to SSL verification errors" + ).format(RECENT_DATE), + SystemTimeWarning, + ) + + # Wrap socket using verification with the root certs in + # trusted_root_certs + default_ssl_context = False + if self.ssl_context is None: + default_ssl_context = True + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(self.ssl_version), + cert_reqs=resolve_cert_reqs(self.cert_reqs), + ) + + context = self.ssl_context + context.verify_mode = resolve_cert_reqs(self.cert_reqs) + + # Try to load OS default certs if none are given. + # Works well on Windows (requires Python3.4+) + if ( + not self.ca_certs + and not self.ca_cert_dir + and not self.ca_cert_data + and default_ssl_context + and hasattr(context, "load_default_certs") + ): + context.load_default_certs() + + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + key_password=self.key_password, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + ca_cert_data=self.ca_cert_data, + server_hostname=server_hostname, + ssl_context=context, + tls_in_tls=tls_in_tls, + ) + + # If we're using all defaults and the connection + # is TLSv1 or TLSv1.1 we throw a DeprecationWarning + # for the host. + if ( + default_ssl_context + and self.ssl_version is None + and hasattr(self.sock, "version") + and self.sock.version() in {"TLSv1", "TLSv1.1"} + ): + warnings.warn( + "Negotiating TLSv1/TLSv1.1 by default is deprecated " + "and will be disabled in urllib3 v2.0.0. Connecting to " + "'%s' with '%s' can be enabled by explicitly opting-in " + "with 'ssl_version'" % (self.host, self.sock.version()), + DeprecationWarning, + ) + + if self.assert_fingerprint: + assert_fingerprint( + self.sock.getpeercert(binary_form=True), self.assert_fingerprint + ) + elif ( + context.verify_mode != ssl.CERT_NONE + and not getattr(context, "check_hostname", False) + and self.assert_hostname is not False + ): + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = self.sock.getpeercert() + if not cert.get("subjectAltName", ()): + warnings.warn( + ( + "Certificate for {0} has no `subjectAltName`, falling back to check for a " + "`commonName` for now. This feature is being removed by major browsers and " + "deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 " + "for details.)".format(hostname) + ), + SubjectAltNameWarning, + ) + _match_hostname(cert, self.assert_hostname or server_hostname) + + self.is_verified = ( + context.verify_mode == ssl.CERT_REQUIRED + or self.assert_fingerprint is not None + ) + + def _connect_tls_proxy(self, hostname, conn): + """ + Establish a TLS connection to the proxy using the provided SSL context. + """ + proxy_config = self.proxy_config + ssl_context = proxy_config.ssl_context + if ssl_context: + # If the user provided a proxy context, we assume CA and client + # certificates have already been set + return ssl_wrap_socket( + sock=conn, + server_hostname=hostname, + ssl_context=ssl_context, + ) + + ssl_context = create_proxy_ssl_context( + self.ssl_version, + self.cert_reqs, + self.ca_certs, + self.ca_cert_dir, + self.ca_cert_data, + ) + + # If no cert was provided, use only the default options for server + # certificate validation + socket = ssl_wrap_socket( + sock=conn, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + ca_cert_data=self.ca_cert_data, + server_hostname=hostname, + ssl_context=ssl_context, + ) + + if ssl_context.verify_mode != ssl.CERT_NONE and not getattr( + ssl_context, "check_hostname", False + ): + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = socket.getpeercert() + if not cert.get("subjectAltName", ()): + warnings.warn( + ( + "Certificate for {0} has no `subjectAltName`, falling back to check for a " + "`commonName` for now. This feature is being removed by major browsers and " + "deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 " + "for details.)".format(hostname) + ), + SubjectAltNameWarning, + ) + _match_hostname(cert, hostname) + + self.proxy_is_verified = ssl_context.verify_mode == ssl.CERT_REQUIRED + return socket + + +def _match_hostname(cert, asserted_hostname): + # Our upstream implementation of ssl.match_hostname() + # only applies this normalization to IP addresses so it doesn't + # match DNS SANs so we do the same thing! + stripped_hostname = asserted_hostname.strip("u[]") + if is_ipaddress(stripped_hostname): + asserted_hostname = stripped_hostname + + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.warning( + "Certificate did not match expected hostname: %s. Certificate: %s", + asserted_hostname, + cert, + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise + + +def _get_default_user_agent(): + return "python-urllib3/%s" % __version__ + + +class DummyConnection(object): + """Used to detect a failed ConnectionCls import.""" + + pass + + +if not ssl: + HTTPSConnection = DummyConnection # noqa: F811 + + +VerifiedHTTPSConnection = HTTPSConnection diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/connectionpool.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/connectionpool.py new file mode 100644 index 0000000..15bffcb --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/connectionpool.py @@ -0,0 +1,1108 @@ +from __future__ import absolute_import + +import errno +import logging +import re +import socket +import sys +import warnings +from socket import error as SocketError +from socket import timeout as SocketTimeout + +from .connection import ( + BaseSSLError, + BrokenPipeError, + DummyConnection, + HTTPConnection, + HTTPException, + HTTPSConnection, + VerifiedHTTPSConnection, + port_by_scheme, +) +from .exceptions import ( + ClosedPoolError, + EmptyPoolError, + HeaderParsingError, + HostChangedError, + InsecureRequestWarning, + LocationValueError, + MaxRetryError, + NewConnectionError, + ProtocolError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, +) +from .packages import six +from .packages.six.moves import queue +from .request import RequestMethods +from .response import HTTPResponse +from .util.connection import is_connection_dropped +from .util.proxy import connection_requires_http_tunnel +from .util.queue import LifoQueue +from .util.request import set_file_position +from .util.response import assert_header_parsing +from .util.retry import Retry +from .util.ssl_match_hostname import CertificateError +from .util.timeout import Timeout +from .util.url import Url, _encode_target +from .util.url import _normalize_host as normalize_host +from .util.url import get_host, parse_url + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + + +# Pool objects +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + + .. note:: + ConnectionPool.urlopen() does not normalize or percent-encode target URIs + which is useful if your target server doesn't support percent-encoded + target URIs. + """ + + scheme = None + QueueCls = LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _normalize_host(host, scheme=self.scheme) + self._proxy_host = host.lower() + self.port = port + + def __str__(self): + return "%s(host=%r, port=%r)" % (type(self).__name__, self.host, self.port) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + pass + + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`http.client.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`http.client.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`http.client.HTTPConnection`. + + .. note:: + Only works in Python 2. This parameter is ignored in Python 3. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to False, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.ProxyManager` + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.ProxyManager` + + :param \\**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = "http" + ConnectionCls = HTTPConnection + ResponseCls = HTTPResponse + + def __init__( + self, + host, + port=None, + strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, + maxsize=1, + block=False, + headers=None, + retries=None, + _proxy=None, + _proxy_headers=None, + _proxy_config=None, + **conn_kw + ): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + self.proxy_config = _proxy_config + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault("socket_options", []) + + self.conn_kw["proxy"] = self.proxy + self.conn_kw["proxy_config"] = self.proxy_config + + def _new_conn(self): + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.debug( + "Starting new HTTP connection (%d): %s:%s", + self.num_connections, + self.host, + self.port or "80", + ) + + conn = self.ConnectionCls( + host=self.host, + port=self.port, + timeout=self.timeout.connect_timeout, + strict=self.strict, + **self.conn_kw + ) + return conn + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except queue.Empty: + if self.block: + raise EmptyPoolError( + self, + "Pool reached maximum size and no more connections are allowed.", + ) + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.debug("Resetting dropped connection: %s", self.host) + conn.close() + if getattr(conn, "auto_open", 1) == 0: + # This is a proxied connection that has been mutated by + # http.client._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except queue.Full: + # This should never happen if self.block == True + log.warning( + "Connection pool is full, discarding connection: %s. Connection pool size: %s", + self.host, + self.pool.qsize(), + ) + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _prepare_proxy(self, conn): + # Nothing to do for HTTP connections. + pass + + def _get_timeout(self, timeout): + """Helper that always returns a :class:`urllib3.util.Timeout`""" + if timeout is _Default: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % timeout_value + ) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, "errno") and err.errno in _blocking_errnos: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % timeout_value + ) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if "timed out" in str(err) or "did not complete (read)" in str( + err + ): # Python < 2.7.4 + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % timeout_value + ) + + def _make_request( + self, conn, method, url, timeout=_Default, chunked=False, **httplib_request_kw + ): + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param timeout: + Socket timeout in seconds for the request. This can be a + float or integer, which will set the same timeout value for + the socket connect and the socket read, or an instance of + :class:`urllib3.util.Timeout`, which gives you more fine-grained + control over your timeouts. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls http.client.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + try: + if chunked: + conn.request_chunked(method, url, **httplib_request_kw) + else: + conn.request(method, url, **httplib_request_kw) + + # We are swallowing BrokenPipeError (errno.EPIPE) since the server is + # legitimately able to close the connection after sending a valid response. + # With this behaviour, the received response is still readable. + except BrokenPipeError: + # Python 3 + pass + except IOError as e: + # Python 2 and macOS/Linux + # EPIPE and ESHUTDOWN are BrokenPipeError on Python 2, and EPROTOTYPE is needed on macOS + # https://erickt.github.io/blog/2014/11/19/adventures-in-debugging-a-potential-osx-kernel-bug/ + if e.errno not in { + errno.EPIPE, + errno.ESHUTDOWN, + errno.EPROTOTYPE, + }: + raise + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + # App Engine doesn't have a sock attr + if getattr(conn, "sock", None): + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % read_timeout + ) + if read_timeout is Timeout.DEFAULT_TIMEOUT: + conn.sock.settimeout(socket.getdefaulttimeout()) + else: # None or a value + conn.sock.settimeout(read_timeout) + + # Receive the response from the server + try: + try: + # Python 2.7, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: + # Python 3 + try: + httplib_response = conn.getresponse() + except BaseException as e: + # Remove the TypeError from the exception chain in + # Python 3 (including for exceptions like SystemExit). + # Otherwise it looks like a bug in the code. + six.raise_from(e, None) + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, "_http_vsn_str", "HTTP/?") + log.debug( + '%s://%s:%s "%s %s %s" %s %s', + self.scheme, + self.host, + self.port, + method, + url, + http_version, + httplib_response.status, + httplib_response.length, + ) + + try: + assert_header_parsing(httplib_response.msg) + except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 + log.warning( + "Failed to parse headers (url=%s): %s", + self._absolute_url(url), + hpe, + exc_info=True, + ) + + return httplib_response + + def _absolute_url(self, path): + return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + if self.pool is None: + return + # Disable access to the pool + old_pool, self.pool = self.pool, None + + try: + while True: + conn = old_pool.get(block=False) + if conn: + conn.close() + + except queue.Empty: + pass # Done. + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith("/"): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + if host is not None: + host = _normalize_host(host, scheme=scheme) + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen( + self, + method, + url, + body=None, + headers=None, + retries=None, + redirect=True, + assert_same_host=True, + timeout=_Default, + pool_timeout=None, + release_conn=None, + chunked=False, + body_pos=None, + **response_kw + ): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param url: + The URL to perform the request on. + + :param body: + Data to send in the request body, either :class:`str`, :class:`bytes`, + an iterable of :class:`str`/:class:`bytes`, or a file-like object. + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When ``False``, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param int body_pos: + Position to seek to in file-like body in the event of a retry or + redirect. Typically this won't need to be set because urllib3 will + auto-populate the value when needed. + + :param \\**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + + parsed_url = parse_url(url) + destination_scheme = parsed_url.scheme + + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = response_kw.get("preload_content", True) + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + # Ensure that the URL we're connecting to is properly encoded + if url.startswith("/"): + url = six.ensure_str(_encode_target(url)) + else: + url = six.ensure_str(parsed_url.url) + + conn = None + + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] + release_this_conn = release_conn + + http_tunnel_required = connection_requires_http_tunnel( + self.proxy, self.proxy_config, destination_scheme + ) + + # Merge the proxy headers. Only done when not using HTTP CONNECT. We + # have to copy the headers dict so we can safely change it without those + # changes being reflected in anyone else's copy. + if not http_tunnel_required: + headers = headers.copy() + headers.update(self.proxy_headers) + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + + # Rewind body position, if needed. Record current position + # for future rewinds in the event of a redirect/retry. + body_pos = set_file_position(body, body_pos) + + try: + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) + conn = self._get_conn(timeout=pool_timeout) + + conn.timeout = timeout_obj.connect_timeout + + is_new_proxy_conn = self.proxy is not None and not getattr( + conn, "sock", None + ) + if is_new_proxy_conn and http_tunnel_required: + self._prepare_proxy(conn) + + # Make the request on the httplib connection object. + httplib_response = self._make_request( + conn, + method, + url, + timeout=timeout_obj, + body=body, + headers=headers, + chunked=chunked, + ) + + # If we're going to release the connection in ``finally:``, then + # the response doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = conn if not release_conn else None + + # Pass method to Response for length checking + response_kw["request_method"] = method + + # Import httplib's response into our own wrapper object + response = self.ResponseCls.from_httplib( + httplib_response, + pool=self, + connection=response_conn, + retries=retries, + **response_kw + ) + + # Everything went great! + clean_exit = True + + except EmptyPoolError: + # Didn't get a connection from the pool, no need to clean up + clean_exit = True + release_this_conn = False + raise + + except ( + TimeoutError, + HTTPException, + SocketError, + ProtocolError, + BaseSSLError, + SSLError, + CertificateError, + ) as e: + # Discard the connection for these exceptions. It will be + # replaced during the next _get_conn() call. + clean_exit = False + + def _is_ssl_error_message_from_http_proxy(ssl_error): + # We're trying to detect the message 'WRONG_VERSION_NUMBER' but + # SSLErrors are kinda all over the place when it comes to the message, + # so we try to cover our bases here! + message = " ".join(re.split("[^a-z]", str(ssl_error).lower())) + return ( + "wrong version number" in message or "unknown protocol" in message + ) + + # Try to detect a common user error with proxies which is to + # set an HTTP proxy to be HTTPS when it should be 'http://' + # (ie {'http': 'http://proxy', 'https': 'https://proxy'}) + # Instead we add a nice error message and point to a URL. + if ( + isinstance(e, BaseSSLError) + and self.proxy + and _is_ssl_error_message_from_http_proxy(e) + ): + e = ProxyError( + "Your proxy appears to only use HTTP and not HTTPS, " + "try changing your proxy URL to be HTTP. See: " + "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" + "#https-proxy-error-http-proxy", + SSLError(e), + ) + elif isinstance(e, (BaseSSLError, CertificateError)): + e = SSLError(e) + elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + e = ProxyError("Cannot connect to proxy.", e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError("Connection aborted.", e) + + retries = retries.increment( + method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2] + ) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + conn = conn and conn.close() + release_this_conn = True + + if release_this_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning( + "Retrying (%r) after connection broken by '%r': %s", retries, err, url + ) + return self.urlopen( + method, + url, + body, + headers, + retries, + redirect, + assert_same_host, + timeout=timeout, + pool_timeout=pool_timeout, + release_conn=release_conn, + chunked=chunked, + body_pos=body_pos, + **response_kw + ) + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + method = "GET" + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + response.drain_conn() + raise + return response + + response.drain_conn() + retries.sleep_for_retry(response) + log.debug("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, + redirect_location, + body, + headers, + retries=retries, + redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, + pool_timeout=pool_timeout, + release_conn=release_conn, + chunked=chunked, + body_pos=body_pos, + **response_kw + ) + + # Check if we should retry the HTTP response. + has_retry_after = bool(response.getheader("Retry-After")) + if retries.is_retry(method, response.status, has_retry_after): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + response.drain_conn() + raise + return response + + response.drain_conn() + retries.sleep(response) + log.debug("Retry: %s", url) + return self.urlopen( + method, + url, + body, + headers, + retries=retries, + redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, + pool_timeout=pool_timeout, + release_conn=release_conn, + chunked=chunked, + body_pos=body_pos, + **response_kw + ) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + :class:`.HTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, ``ssl_version``, ``key_password`` are only used if :mod:`ssl` + is available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. + """ + + scheme = "https" + ConnectionCls = HTTPSConnection + + def __init__( + self, + host, + port=None, + strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, + maxsize=1, + block=False, + headers=None, + retries=None, + _proxy=None, + _proxy_headers=None, + key_file=None, + cert_file=None, + cert_reqs=None, + key_password=None, + ca_certs=None, + ssl_version=None, + assert_hostname=None, + assert_fingerprint=None, + ca_cert_dir=None, + **conn_kw + ): + + HTTPConnectionPool.__init__( + self, + host, + port, + strict, + timeout, + maxsize, + block, + headers, + retries, + _proxy, + _proxy_headers, + **conn_kw + ) + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.key_password = key_password + self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_conn(self, conn): + """ + Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` + and establish the tunnel if proxy is used. + """ + + if isinstance(conn, VerifiedHTTPSConnection): + conn.set_cert( + key_file=self.key_file, + key_password=self.key_password, + cert_file=self.cert_file, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint, + ) + conn.ssl_version = self.ssl_version + return conn + + def _prepare_proxy(self, conn): + """ + Establishes a tunnel connection through HTTP CONNECT. + + Tunnel connection is established early because otherwise httplib would + improperly set Host: header to proxy's IP:port. + """ + + conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) + + if self.proxy.scheme == "https": + conn.tls_in_tls_required = True + + conn.connect() + + def _new_conn(self): + """ + Return a fresh :class:`http.client.HTTPSConnection`. + """ + self.num_connections += 1 + log.debug( + "Starting new HTTPS connection (%d): %s:%s", + self.num_connections, + self.host, + self.port or "443", + ) + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: + raise SSLError( + "Can't connect to HTTPS URL because the SSL module is not available." + ) + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + conn = self.ConnectionCls( + host=actual_host, + port=actual_port, + timeout=self.timeout.connect_timeout, + strict=self.strict, + cert_file=self.cert_file, + key_file=self.key_file, + key_password=self.key_password, + **self.conn_kw + ) + + return self._prepare_conn(conn) + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, "sock", None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn( + ( + "Unverified HTTPS request is being made to host '%s'. " + "Adding certificate verification is strongly advised. See: " + "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" + "#ssl-warnings" % conn.host + ), + InsecureRequestWarning, + ) + + if getattr(conn, "proxy_is_verified", None) is False: + warnings.warn( + ( + "Unverified HTTPS connection done to an HTTPS proxy. " + "Adding certificate verification is strongly advised. See: " + "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" + "#ssl-warnings" + ), + InsecureRequestWarning, + ) + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \\**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + port = port or port_by_scheme.get(scheme, 80) + if scheme == "https": + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) + + +def _normalize_host(host, scheme): + """ + Normalize hosts for comparisons and use with sockets. + """ + + host = normalize_host(host, scheme) + + # httplib doesn't like it when we include brackets in IPv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. See http://bugs.python.org/issue28539 + if host.startswith("[") and host.endswith("]"): + host = host[1:-1] + return host diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd2875b7043cb5f2f2aa65133b7c08d91e1f1a35 GIT binary patch literal 189 zcmd1j<>g`k0{^WGl0fuh5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;x_QerR!OQL%nr zW^%rMZf0I)T7FS_sFHD@PG|A(nD8QR7=kN?6@bjZ1qAU2hAAW7K4FlRRDN@CTLW(V= z2e8Z#jbSzua$x!@(VXR?&x&1}DY@K!aGx1r;a-uXJIMeH8|fVHmszT$)%ft-S$q;! zyVxyT2;~e|!-e4(Zw0!B)1_G5osV?^7cN#cWrOXI2iFM?cO27EavKThL7}uYRBU-h z(E&yB^+-wtPlfcSTS6O42OvQwRwzkLB6(kZZa140+d4{N0MYZwH)z9(Au5+>peR{} zBqe#iON|wI?o21AcJ9*t$WmdwHK+Y3&1en=fq+3uQY*%Aml}0q-&xsJBWf}=%DKE_ zsRZCIInoT$9f~TTwYE2B0BB}yVV*FS=4!;-1EmHzv{N-?XM8fQQp1eJxSU+4*u8~v zZsq;^PWSbjZYS<-bl2a!?UapUF&{o!iah^is7zTuQR_TGj#pKbpj?=gFFqmAC8C#c zp{}QKeMv@_YEH(VH*w&BCELN6s4H$h2zkh(!|(vh>o7n;t6g2kSLN(lr}v@Li`U-0 zTK~Ax>y%`#wF+a%RpH8m9aZ!czSFLp%V+?$Y+~S;1fPV>{)Jt;WLm`j(|vL^s087k zS{VNJ=l_MQU2vzM^bBtF6&&{FUwi&1ikInGcY9V==d9@nFK)QYc{jM-C4XmC?Y`%Z zh;VOu6$%Y$Vu80`T{P_dcuf{BRd+lb56vw!SaBSF+<|`m^oK*UN6sp ghvgq$^yHm1o*w_oo;je#QBWa`N+ZJFY}8t{zlOL?%>V!Z literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/appengine.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/appengine.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71db607c8b8a86f779904ddf54abb8c7c11bc479 GIT binary patch literal 8161 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 M%)qxy6@T&n0}VZq4FCWD literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/securetransport.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/securetransport.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24d1ad24aa75f2b96cc9113a1eb89a3f731278fc GIT binary patch literal 21892 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/socks.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/__pycache__/socks.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48cc2a66a46af6e5a3c27c4b9be0143a15da69cf GIT binary patch literal 5591 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 Pw3M`7>{V~P@6i7M#Yms& literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ba72974ce28625843eed1f7a6722ee68b8c4091 GIT binary patch literal 9089 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 + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +""" +from __future__ import absolute_import + +import platform +from ctypes import ( + CDLL, + CFUNCTYPE, + POINTER, + c_bool, + c_byte, + c_char_p, + c_int32, + c_long, + c_size_t, + c_uint32, + c_ulong, + c_void_p, +) +from ctypes.util import find_library + +from ...packages.six import raise_from + +if platform.system() != "Darwin": + raise ImportError("Only macOS is supported") + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split("."))) +if version_info < (10, 8): + raise OSError( + "Only OS X 10.8 and newer are supported, not %s.%s" + % (version_info[0], version_info[1]) + ) + + +def load_cdll(name, macos10_16_path): + """Loads a CDLL by name, falling back to known path on 10.16+""" + try: + # Big Sur is technically 11 but we use 10.16 due to the Big Sur + # beta being labeled as 10.16. + if version_info >= (10, 16): + path = macos10_16_path + else: + path = find_library(name) + if not path: + raise OSError # Caught and reraised as 'ImportError' + return CDLL(path, use_errno=True) + except OSError: + raise_from(ImportError("The library %s failed to load" % name), None) + + +Security = load_cdll( + "Security", "/System/Library/Frameworks/Security.framework/Security" +) +CoreFoundation = load_cdll( + "CoreFoundation", + "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", +) + + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [CFAllocatorRef, CFDataRef] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [SecCertificateRef] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef), + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef), + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [SecKeychainRef] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef), + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE( + OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t) + ) + + Security.SSLSetIOFuncs.argtypes = [SSLContextRef, SSLReadFunc, SSLWriteFunc] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [SSLContextRef, c_char_p, c_size_t] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [SSLContextRef, CFArrayRef] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [SSLContextRef, CFTypeRef, Boolean] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [SSLContextRef, SSLConnectionRef] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [SSLContextRef, c_char_p, c_size_t] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [SSLContextRef] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [SSLContextRef, c_char_p, c_size_t, POINTER(c_size_t)] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [SSLContextRef, c_char_p, c_size_t, POINTER(c_size_t)] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [SSLContextRef] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [SSLContextRef, POINTER(c_size_t)] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t), + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t, + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [SSLContextRef, POINTER(c_size_t)] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t), + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [SSLContextRef, POINTER(SSLCipherSuite)] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol), + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [SSLContextRef, POINTER(SecTrustRef)] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [SecTrustRef, CFArrayRef] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [SecTrustRef, Boolean] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [SecTrustRef, POINTER(SecTrustResultType)] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [SecTrustRef] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [SecTrustRef, CFIndex] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType, + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [SSLContextRef, SSLSessionOption, Boolean] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [SSLContextRef, SSLProtocol] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [SSLContextRef, SSLProtocol] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + try: + Security.SSLSetALPNProtocols.argtypes = [SSLContextRef, CFArrayRef] + Security.SSLSetALPNProtocols.restype = OSStatus + except AttributeError: + # Supported only in 10.12+ + pass + + Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, "kSecImportExportPassphrase" + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, "kSecImportItemIdentity" + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [CFTypeRef] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [CFTypeRef] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [CFTypeRef] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding, + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [CFStringRef, CFStringEncoding] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding, + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [CFAllocatorRef, c_char_p, CFIndex] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [CFDataRef] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [CFDataRef] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks, + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [CFDictionaryRef, CFTypeRef] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [CFMutableArrayRef, c_void_p] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [CFArrayRef] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [CFArrayRef, CFIndex] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, "kCFAllocatorDefault" + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll( + CoreFoundation, "kCFTypeArrayCallBacks" + ) + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, "kCFTypeDictionaryKeyCallBacks" + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, "kCFTypeDictionaryValueCallBacks" + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError("Error initializing ctypes") + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + # SecureTransport does not support TLS 1.3 even if there's a constant for it + kTLSProtocol13 = 10 + kTLSProtocolMaxSupported = 999 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + # Source: https://developer.apple.com/documentation/security/1550981-ssl_cipher_suite_values + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA9 + TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA8 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_AES_128_CCM_8_SHA256 = 0x1305 + TLS_AES_128_CCM_SHA256 = 0x1304 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/_securetransport/low_level.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 0000000..fa0b245 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,397 @@ +""" +Low-level helpers for the SecureTransport bindings. + +These are Python functions that are not directly related to the high-level APIs +but are necessary to get them to work. They include a whole bunch of low-level +CoreFoundation messing about and memory management. The concerns in this module +are almost entirely about trying to avoid memory leaks and providing +appropriate and useful assistance to the higher-level code. +""" +import base64 +import ctypes +import itertools +import os +import re +import ssl +import struct +import tempfile + +from .bindings import CFConst, CoreFoundation, Security + +# This regular expression is used to grab PEM data out of a PEM bundle. +_PEM_CERTS_RE = re.compile( + b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL +) + + +def _cf_data_from_bytes(bytestring): + """ + Given a bytestring, create a CFData object from it. This CFData object must + be CFReleased by the caller. + """ + return CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) + ) + + +def _cf_dictionary_from_tuples(tuples): + """ + Given a list of Python tuples, create an associated CFDictionary. + """ + dictionary_size = len(tuples) + + # We need to get the dictionary keys and values out in the same order. + keys = (t[0] for t in tuples) + values = (t[1] for t in tuples) + cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) + cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) + + return CoreFoundation.CFDictionaryCreate( + CoreFoundation.kCFAllocatorDefault, + cf_keys, + cf_values, + dictionary_size, + CoreFoundation.kCFTypeDictionaryKeyCallBacks, + CoreFoundation.kCFTypeDictionaryValueCallBacks, + ) + + +def _cfstr(py_bstr): + """ + Given a Python binary data, create a CFString. + The string must be CFReleased by the caller. + """ + c_str = ctypes.c_char_p(py_bstr) + cf_str = CoreFoundation.CFStringCreateWithCString( + CoreFoundation.kCFAllocatorDefault, + c_str, + CFConst.kCFStringEncodingUTF8, + ) + return cf_str + + +def _create_cfstring_array(lst): + """ + Given a list of Python binary data, create an associated CFMutableArray. + The array must be CFReleased by the caller. + + Raises an ssl.SSLError on failure. + """ + cf_arr = None + try: + cf_arr = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + if not cf_arr: + raise MemoryError("Unable to allocate memory!") + for item in lst: + cf_str = _cfstr(item) + if not cf_str: + raise MemoryError("Unable to allocate memory!") + try: + CoreFoundation.CFArrayAppendValue(cf_arr, cf_str) + finally: + CoreFoundation.CFRelease(cf_str) + except BaseException as e: + if cf_arr: + CoreFoundation.CFRelease(cf_arr) + raise ssl.SSLError("Unable to allocate array: %s" % (e,)) + return cf_arr + + +def _cf_string_to_unicode(value): + """ + Creates a Unicode string from a CFString object. Used entirely for error + reporting. + + Yes, it annoys me quite a lot that this function is this complex. + """ + value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) + + string = CoreFoundation.CFStringGetCStringPtr( + value_as_void_p, CFConst.kCFStringEncodingUTF8 + ) + if string is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + value_as_void_p, buffer, 1024, CFConst.kCFStringEncodingUTF8 + ) + if not result: + raise OSError("Error copying C string from CFStringRef") + string = buffer.value + if string is not None: + string = string.decode("utf-8") + return string + + +def _assert_no_error(error, exception_class=None): + """ + Checks the return code and throws an exception if there is an error to + report + """ + if error == 0: + return + + cf_error_string = Security.SecCopyErrorMessageString(error, None) + output = _cf_string_to_unicode(cf_error_string) + CoreFoundation.CFRelease(cf_error_string) + + if output is None or output == u"": + output = u"OSStatus %s" % error + + if exception_class is None: + exception_class = ssl.SSLError + + raise exception_class(output) + + +def _cert_array_from_pem(pem_bundle): + """ + Given a bundle of certs in PEM format, turns them into a CFArray of certs + that can be used to validate a cert chain. + """ + # Normalize the PEM bundle's line endings. + pem_bundle = pem_bundle.replace(b"\r\n", b"\n") + + der_certs = [ + base64.b64decode(match.group(1)) for match in _PEM_CERTS_RE.finditer(pem_bundle) + ] + if not der_certs: + raise ssl.SSLError("No root certificates specified") + + cert_array = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + if not cert_array: + raise ssl.SSLError("Unable to allocate memory!") + + try: + for der_bytes in der_certs: + certdata = _cf_data_from_bytes(der_bytes) + if not certdata: + raise ssl.SSLError("Unable to allocate memory!") + cert = Security.SecCertificateCreateWithData( + CoreFoundation.kCFAllocatorDefault, certdata + ) + CoreFoundation.CFRelease(certdata) + if not cert: + raise ssl.SSLError("Unable to build cert object!") + + CoreFoundation.CFArrayAppendValue(cert_array, cert) + CoreFoundation.CFRelease(cert) + except Exception: + # We need to free the array before the exception bubbles further. + # We only want to do that if an error occurs: otherwise, the caller + # should free. + CoreFoundation.CFRelease(cert_array) + raise + + return cert_array + + +def _is_cert(item): + """ + Returns True if a given CFTypeRef is a certificate. + """ + expected = Security.SecCertificateGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _is_identity(item): + """ + Returns True if a given CFTypeRef is an identity. + """ + expected = Security.SecIdentityGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _temporary_keychain(): + """ + This function creates a temporary Mac keychain that we can use to work with + credentials. This keychain uses a one-time password and a temporary file to + store the data. We expect to have one keychain per socket. The returned + SecKeychainRef must be freed by the caller, including calling + SecKeychainDelete. + + Returns a tuple of the SecKeychainRef and the path to the temporary + directory that contains it. + """ + # Unfortunately, SecKeychainCreate requires a path to a keychain. This + # means we cannot use mkstemp to use a generic temporary file. Instead, + # we're going to create a temporary directory and a filename to use there. + # This filename will be 8 random bytes expanded into base64. We also need + # some random bytes to password-protect the keychain we're creating, so we + # ask for 40 random bytes. + random_bytes = os.urandom(40) + filename = base64.b16encode(random_bytes[:8]).decode("utf-8") + password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 + tempdirectory = tempfile.mkdtemp() + + keychain_path = os.path.join(tempdirectory, filename).encode("utf-8") + + # We now want to create the keychain itself. + keychain = Security.SecKeychainRef() + status = Security.SecKeychainCreate( + keychain_path, len(password), password, False, None, ctypes.byref(keychain) + ) + _assert_no_error(status) + + # Having created the keychain, we want to pass it off to the caller. + return keychain, tempdirectory + + +def _load_items_from_file(keychain, path): + """ + Given a single file, loads all the trust objects from it into arrays and + the keychain. + Returns a tuple of lists: the first list is a list of identities, the + second a list of certs. + """ + certificates = [] + identities = [] + result_array = None + + with open(path, "rb") as f: + raw_filedata = f.read() + + try: + filedata = CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, raw_filedata, len(raw_filedata) + ) + result_array = CoreFoundation.CFArrayRef() + result = Security.SecItemImport( + filedata, # cert data + None, # Filename, leaving it out for now + None, # What the type of the file is, we don't care + None, # what's in the file, we don't care + 0, # import flags + None, # key params, can include passphrase in the future + keychain, # The keychain to insert into + ctypes.byref(result_array), # Results + ) + _assert_no_error(result) + + # A CFArray is not very useful to us as an intermediary + # representation, so we are going to extract the objects we want + # and then free the array. We don't need to keep hold of keys: the + # keychain already has them! + result_count = CoreFoundation.CFArrayGetCount(result_array) + for index in range(result_count): + item = CoreFoundation.CFArrayGetValueAtIndex(result_array, index) + item = ctypes.cast(item, CoreFoundation.CFTypeRef) + + if _is_cert(item): + CoreFoundation.CFRetain(item) + certificates.append(item) + elif _is_identity(item): + CoreFoundation.CFRetain(item) + identities.append(item) + finally: + if result_array: + CoreFoundation.CFRelease(result_array) + + CoreFoundation.CFRelease(filedata) + + return (identities, certificates) + + +def _load_client_cert_chain(keychain, *paths): + """ + Load certificates and maybe keys from a number of files. Has the end goal + of returning a CFArray containing one SecIdentityRef, and then zero or more + SecCertificateRef objects, suitable for use as a client certificate trust + chain. + """ + # Ok, the strategy. + # + # This relies on knowing that macOS will not give you a SecIdentityRef + # unless you have imported a key into a keychain. This is a somewhat + # artificial limitation of macOS (for example, it doesn't necessarily + # affect iOS), but there is nothing inside Security.framework that lets you + # get a SecIdentityRef without having a key in a keychain. + # + # So the policy here is we take all the files and iterate them in order. + # Each one will use SecItemImport to have one or more objects loaded from + # it. We will also point at a keychain that macOS can use to work with the + # private key. + # + # Once we have all the objects, we'll check what we actually have. If we + # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, + # we'll take the first certificate (which we assume to be our leaf) and + # ask the keychain to give us a SecIdentityRef with that cert's associated + # key. + # + # We'll then return a CFArray containing the trust chain: one + # SecIdentityRef and then zero-or-more SecCertificateRef objects. The + # responsibility for freeing this CFArray will be with the caller. This + # CFArray must remain alive for the entire connection, so in practice it + # will be stored with a single SSLSocket, along with the reference to the + # keychain. + certificates = [] + identities = [] + + # Filter out bad paths. + paths = (path for path in paths if path) + + try: + for file_path in paths: + new_identities, new_certs = _load_items_from_file(keychain, file_path) + identities.extend(new_identities) + certificates.extend(new_certs) + + # Ok, we have everything. The question is: do we have an identity? If + # not, we want to grab one from the first cert we have. + if not identities: + new_identity = Security.SecIdentityRef() + status = Security.SecIdentityCreateWithCertificate( + keychain, certificates[0], ctypes.byref(new_identity) + ) + _assert_no_error(status) + identities.append(new_identity) + + # We now want to release the original certificate, as we no longer + # need it. + CoreFoundation.CFRelease(certificates.pop(0)) + + # We now need to build a new CFArray that holds the trust chain. + trust_chain = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + for item in itertools.chain(identities, certificates): + # ArrayAppendValue does a CFRetain on the item. That's fine, + # because the finally block will release our other refs to them. + CoreFoundation.CFArrayAppendValue(trust_chain, item) + + return trust_chain + finally: + for obj in itertools.chain(identities, certificates): + CoreFoundation.CFRelease(obj) + + +TLS_PROTOCOL_VERSIONS = { + "SSLv2": (0, 2), + "SSLv3": (3, 0), + "TLSv1": (3, 1), + "TLSv1.1": (3, 2), + "TLSv1.2": (3, 3), +} + + +def _build_tls_unknown_ca_alert(version): + """ + Builds a TLS alert record for an unknown CA. + """ + ver_maj, ver_min = TLS_PROTOCOL_VERSIONS[version] + severity_fatal = 0x02 + description_unknown_ca = 0x30 + msg = struct.pack(">BB", severity_fatal, description_unknown_ca) + msg_len = len(msg) + record_type_alert = 0x15 + record = struct.pack(">BBBH", record_type_alert, ver_maj, ver_min, msg_len) + msg + return record diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/appengine.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/appengine.py new file mode 100644 index 0000000..f91bdd6 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/appengine.py @@ -0,0 +1,314 @@ +""" +This module provides a pool manager that uses Google App Engine's +`URLFetch Service `_. + +Example usage:: + + from urllib3 import PoolManager + from urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox + + if is_appengine_sandbox(): + # AppEngineManager uses AppEngine's URLFetch API behind the scenes + http = AppEngineManager() + else: + # PoolManager uses a socket-level API behind the scenes + http = PoolManager() + + r = http.request('GET', 'https://google.com/') + +There are `limitations `_ to the URLFetch service and it may not be +the best choice for your application. There are three options for using +urllib3 on Google App Engine: + +1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is + cost-effective in many circumstances as long as your usage is within the + limitations. +2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. + Sockets also have `limitations and restrictions + `_ and have a lower free quota than URLFetch. + To use sockets, be sure to specify the following in your ``app.yaml``:: + + env_variables: + GAE_USE_SOCKETS_HTTPLIB : 'true' + +3. If you are using `App Engine Flexible +`_, you can use the standard +:class:`PoolManager` without any configuration or special environment variables. +""" + +from __future__ import absolute_import + +import io +import logging +import warnings + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + SSLError, + TimeoutError, +) +from ..packages.six.moves.urllib.parse import urljoin +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.retry import Retry +from ..util.timeout import Timeout +from . import _appengine_environ + +try: + from google.appengine.api import urlfetch +except ImportError: + urlfetch = None + + +log = logging.getLogger(__name__) + + +class AppEnginePlatformWarning(HTTPWarning): + pass + + +class AppEnginePlatformError(HTTPError): + pass + + +class AppEngineManager(RequestMethods): + """ + Connection manager for Google App Engine sandbox applications. + + This manager uses the URLFetch service directly instead of using the + emulated httplib, and is subject to URLFetch limitations as described in + the App Engine documentation `here + `_. + + Notably it will raise an :class:`AppEnginePlatformError` if: + * URLFetch is not available. + * If you attempt to use this on App Engine Flexible, as full socket + support is available. + * If a request size is more than 10 megabytes. + * If a response size is more than 32 megabytes. + * If you use an unsupported request method such as OPTIONS. + + Beyond those cases, it will raise normal urllib3 errors. + """ + + def __init__( + self, + headers=None, + retries=None, + validate_certificate=True, + urlfetch_retries=True, + ): + if not urlfetch: + raise AppEnginePlatformError( + "URLFetch is not available in this environment." + ) + + warnings.warn( + "urllib3 is using URLFetch on Google App Engine sandbox instead " + "of sockets. To use sockets directly instead of URLFetch see " + "https://urllib3.readthedocs.io/en/1.26.x/reference/urllib3.contrib.html.", + AppEnginePlatformWarning, + ) + + RequestMethods.__init__(self, headers) + self.validate_certificate = validate_certificate + self.urlfetch_retries = urlfetch_retries + + self.retries = retries or Retry.DEFAULT + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Return False to re-raise any potential exceptions + return False + + def urlopen( + self, + method, + url, + body=None, + headers=None, + retries=None, + redirect=True, + timeout=Timeout.DEFAULT_TIMEOUT, + **response_kw + ): + + retries = self._get_retries(retries, redirect) + + try: + follow_redirects = redirect and retries.redirect != 0 and retries.total + response = urlfetch.fetch( + url, + payload=body, + method=method, + headers=headers or {}, + allow_truncated=False, + follow_redirects=self.urlfetch_retries and follow_redirects, + deadline=self._get_absolute_timeout(timeout), + validate_certificate=self.validate_certificate, + ) + except urlfetch.DeadlineExceededError as e: + raise TimeoutError(self, e) + + except urlfetch.InvalidURLError as e: + if "too large" in str(e): + raise AppEnginePlatformError( + "URLFetch request too large, URLFetch only " + "supports requests up to 10mb in size.", + e, + ) + raise ProtocolError(e) + + except urlfetch.DownloadError as e: + if "Too many redirects" in str(e): + raise MaxRetryError(self, url, reason=e) + raise ProtocolError(e) + + except urlfetch.ResponseTooLargeError as e: + raise AppEnginePlatformError( + "URLFetch response too large, URLFetch only supports" + "responses up to 32mb in size.", + e, + ) + + except urlfetch.SSLCertificateError as e: + raise SSLError(e) + + except urlfetch.InvalidMethodError as e: + raise AppEnginePlatformError( + "URLFetch does not support method: %s" % method, e + ) + + http_response = self._urlfetch_response_to_http_response( + response, retries=retries, **response_kw + ) + + # Handle redirect? + redirect_location = redirect and http_response.get_redirect_location() + if redirect_location: + # Check for redirect response + if self.urlfetch_retries and retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + else: + if http_response.status == 303: + method = "GET" + + try: + retries = retries.increment( + method, url, response=http_response, _pool=self + ) + except MaxRetryError: + if retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + return http_response + + retries.sleep_for_retry(http_response) + log.debug("Redirecting %s -> %s", url, redirect_location) + redirect_url = urljoin(url, redirect_location) + return self.urlopen( + method, + redirect_url, + body, + headers, + retries=retries, + redirect=redirect, + timeout=timeout, + **response_kw + ) + + # Check if we should retry the HTTP response. + has_retry_after = bool(http_response.getheader("Retry-After")) + if retries.is_retry(method, http_response.status, has_retry_after): + retries = retries.increment(method, url, response=http_response, _pool=self) + log.debug("Retry: %s", url) + retries.sleep(http_response) + return self.urlopen( + method, + url, + body=body, + headers=headers, + retries=retries, + redirect=redirect, + timeout=timeout, + **response_kw + ) + + return http_response + + def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): + + if is_prod_appengine(): + # Production GAE handles deflate encoding automatically, but does + # not remove the encoding header. + content_encoding = urlfetch_resp.headers.get("content-encoding") + + if content_encoding == "deflate": + del urlfetch_resp.headers["content-encoding"] + + transfer_encoding = urlfetch_resp.headers.get("transfer-encoding") + # We have a full response's content, + # so let's make sure we don't report ourselves as chunked data. + if transfer_encoding == "chunked": + encodings = transfer_encoding.split(",") + encodings.remove("chunked") + urlfetch_resp.headers["transfer-encoding"] = ",".join(encodings) + + original_response = HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=io.BytesIO(urlfetch_resp.content), + msg=urlfetch_resp.header_msg, + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + return HTTPResponse( + body=io.BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + original_response=original_response, + **response_kw + ) + + def _get_absolute_timeout(self, timeout): + if timeout is Timeout.DEFAULT_TIMEOUT: + return None # Defer to URLFetch's default. + if isinstance(timeout, Timeout): + if timeout._read is not None or timeout._connect is not None: + warnings.warn( + "URLFetch does not support granular timeout settings, " + "reverting to total or default URLFetch timeout.", + AppEnginePlatformWarning, + ) + return timeout.total + return timeout + + def _get_retries(self, retries, redirect): + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if retries.connect or retries.read or retries.redirect: + warnings.warn( + "URLFetch only supports total retries and does not " + "recognize connect, read, or redirect retry parameters.", + AppEnginePlatformWarning, + ) + + return retries + + +# Alias methods from _appengine_environ to maintain public API interface. + +is_appengine = _appengine_environ.is_appengine +is_appengine_sandbox = _appengine_environ.is_appengine_sandbox +is_local_appengine = _appengine_environ.is_local_appengine +is_prod_appengine = _appengine_environ.is_prod_appengine +is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/ntlmpool.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..41a8fd1 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/ntlmpool.py @@ -0,0 +1,130 @@ +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" +from __future__ import absolute_import + +import warnings +from logging import getLogger + +from ntlm import ntlm + +from .. import HTTPSConnectionPool +from ..packages.six.moves.http_client import HTTPSConnection + +warnings.warn( + "The 'urllib3.contrib.ntlmpool' module is deprecated and will be removed " + "in urllib3 v2.0 release, urllib3 is not able to support it properly due " + "to reasons listed in issue: https://github.com/urllib3/urllib3/issues/2282. " + "If you are a user of this module please comment in the mentioned issue.", + DeprecationWarning, +) + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = "https" + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split("\\", 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug( + "Starting NTLM HTTPS connection no. %d: https://%s%s", + self.num_connections, + self.host, + self.authurl, + ) + + headers = {"Connection": "Keep-Alive"} + req_header = "Authorization" + resp_header = "www-authenticate" + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = "NTLM %s" % ntlm.create_NTLM_NEGOTIATE_MESSAGE( + self.rawuser + ) + log.debug("Request headers: %s", headers) + conn.request("GET", self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug("Response status: %s %s", res.status, res.reason) + log.debug("Response headers: %s", reshdr) + log.debug("Response data: %s [...]", res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(", ") + auth_header_value = None + for s in auth_header_values: + if s[:5] == "NTLM ": + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception( + "Unexpected %s response header: %s" % (resp_header, reshdr[resp_header]) + ) + + # Send authentication message + ServerChallenge, NegotiateFlags = ntlm.parse_NTLM_CHALLENGE_MESSAGE( + auth_header_value + ) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE( + ServerChallenge, self.user, self.domain, self.pw, NegotiateFlags + ) + headers[req_header] = "NTLM %s" % auth_msg + log.debug("Request headers: %s", headers) + conn.request("GET", self.authurl, None, headers) + res = conn.getresponse() + log.debug("Response status: %s %s", res.status, res.reason) + log.debug("Response headers: %s", dict(res.getheaders())) + log.debug("Response data: %s [...]", res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception("Server rejected request: wrong username or password") + raise Exception("Wrong server response: %s %s" % (res.status, res.reason)) + + res.fp = None + log.debug("Connection established") + return conn + + def urlopen( + self, + method, + url, + body=None, + headers=None, + retries=3, + redirect=True, + assert_same_host=True, + ): + if headers is None: + headers = {} + headers["Connection"] = "Keep-Alive" + return super(NTLMConnectionPool, self).urlopen( + method, url, body, headers, retries, redirect, assert_same_host + ) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/pyopenssl.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..def83af --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/pyopenssl.py @@ -0,0 +1,511 @@ +""" +TLS with SNI_-support for Python 2. Follow these instructions if you would +like to verify TLS certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. + +This needs the following packages installed: + +* `pyOpenSSL`_ (tested with 16.0.0) +* `cryptography`_ (minimum 1.3.4, from pyopenssl) +* `idna`_ (minimum 2.0, from cryptography) + +However, pyopenssl depends on cryptography, which depends on idna, so while we +use all three directly here we end up having relatively few packages required. + +You can install them with the following command: + +.. code-block:: bash + + $ python -m pip install pyopenssl cryptography idna + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this: + +.. code-block:: python + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. + +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) +.. _pyopenssl: https://www.pyopenssl.org +.. _cryptography: https://cryptography.io +.. _idna: https://github.com/kjd/idna +""" +from __future__ import absolute_import + +import OpenSSL.SSL +from cryptography import x509 +from cryptography.hazmat.backends.openssl import backend as openssl_backend +from cryptography.hazmat.backends.openssl.x509 import _Certificate + +try: + from cryptography.x509 import UnsupportedExtension +except ImportError: + # UnsupportedExtension is gone in cryptography >= 2.1.0 + class UnsupportedExtension(Exception): + pass + + +from io import BytesIO +from socket import error as SocketError +from socket import timeout + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +import logging +import ssl +import sys + +from .. import util +from ..packages import six +from ..util.ssl_ import PROTOCOL_TLS_CLIENT + +__all__ = ["inject_into_urllib3", "extract_from_urllib3"] + +# SNI always works. +HAS_SNI = True + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + util.PROTOCOL_TLS: OpenSSL.SSL.SSLv23_METHOD, + PROTOCOL_TLS_CLIENT: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +if hasattr(ssl, "PROTOCOL_SSLv3") and hasattr(OpenSSL.SSL, "SSLv3_METHOD"): + _openssl_versions[ssl.PROTOCOL_SSLv3] = OpenSSL.SSL.SSLv3_METHOD + +if hasattr(ssl, "PROTOCOL_TLSv1_1") and hasattr(OpenSSL.SSL, "TLSv1_1_METHOD"): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, "PROTOCOL_TLSv1_2") and hasattr(OpenSSL.SSL, "TLSv1_2_METHOD"): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + + +_stdlib_to_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER + + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} +_openssl_to_stdlib_verify = dict((v, k) for k, v in _stdlib_to_openssl_verify.items()) + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + + +log = logging.getLogger(__name__) + + +def inject_into_urllib3(): + "Monkey-patch urllib3 with PyOpenSSL-backed SSL-support." + + _validate_dependencies_met() + + util.SSLContext = PyOpenSSLContext + util.ssl_.SSLContext = PyOpenSSLContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_PYOPENSSL = True + util.ssl_.IS_PYOPENSSL = True + + +def extract_from_urllib3(): + "Undo monkey-patching by :func:`inject_into_urllib3`." + + util.SSLContext = orig_util_SSLContext + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_PYOPENSSL = False + util.ssl_.IS_PYOPENSSL = False + + +def _validate_dependencies_met(): + """ + Verifies that PyOpenSSL's package-level dependencies have been met. + Throws `ImportError` if they are not met. + """ + # Method added in `cryptography==1.1`; not available in older versions + from cryptography.x509.extensions import Extensions + + if getattr(Extensions, "get_extension_for_class", None) is None: + raise ImportError( + "'cryptography' module missing required functionality. " + "Try upgrading to v1.3.4 or newer." + ) + + # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 + # attribute is only present on those versions. + from OpenSSL.crypto import X509 + + x509 = X509() + if getattr(x509, "_x509", None) is None: + raise ImportError( + "'pyOpenSSL' module missing required functionality. " + "Try upgrading to v0.14 or newer." + ) + + +def _dnsname_to_stdlib(name): + """ + Converts a dNSName SubjectAlternativeName field to the form used by the + standard library on the given Python version. + + Cryptography produces a dNSName as a unicode string that was idna-decoded + from ASCII bytes. We need to idna-encode that string to get it back, and + then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib + uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + + If the name cannot be idna-encoded then we return None signalling that + the name given should be skipped. + """ + + def idna_encode(name): + """ + Borrowed wholesale from the Python Cryptography Project. It turns out + that we can't just safely call `idna.encode`: it can explode for + wildcard names. This avoids that problem. + """ + import idna + + try: + for prefix in [u"*.", u"."]: + if name.startswith(prefix): + name = name[len(prefix) :] + return prefix.encode("ascii") + idna.encode(name) + return idna.encode(name) + except idna.core.IDNAError: + return None + + # Don't send IPv6 addresses through the IDNA encoder. + if ":" in name: + return name + + name = idna_encode(name) + if name is None: + return None + elif sys.version_info >= (3, 0): + name = name.decode("utf-8") + return name + + +def get_subj_alt_name(peer_cert): + """ + Given an PyOpenSSL certificate, provides all the subject alternative names. + """ + # Pass the cert to cryptography, which has much better APIs for this. + if hasattr(peer_cert, "to_cryptography"): + cert = peer_cert.to_cryptography() + else: + # This is technically using private APIs, but should work across all + # relevant versions before PyOpenSSL got a proper API for this. + cert = _Certificate(openssl_backend, peer_cert._x509) + + # We want to find the SAN extension. Ask Cryptography to locate it (it's + # faster than looping in Python) + try: + ext = cert.extensions.get_extension_for_class(x509.SubjectAlternativeName).value + except x509.ExtensionNotFound: + # No such extension, return the empty list. + return [] + except ( + x509.DuplicateExtension, + UnsupportedExtension, + x509.UnsupportedGeneralNameType, + UnicodeError, + ) as e: + # A problem has been found with the quality of the certificate. Assume + # no SAN field is present. + log.warning( + "A problem was encountered with the certificate that prevented " + "urllib3 from finding the SubjectAlternativeName field. This can " + "affect certificate validation. The error was %s", + e, + ) + return [] + + # We want to return dNSName and iPAddress fields. We need to cast the IPs + # back to strings because the match_hostname function wants them as + # strings. + # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 + # decoded. This is pretty frustrating, but that's what the standard library + # does with certificates, and so we need to attempt to do the same. + # We also want to skip over names which cannot be idna encoded. + names = [ + ("DNS", name) + for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) + if name is not None + ] + names.extend( + ("IP Address", str(name)) for name in ext.get_values_for_type(x509.IPAddress) + ) + + return names + + +class WrappedSocket(object): + """API-compatibility wrapper for Python OpenSSL's Connection-class. + + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + """ + + def __init__(self, connection, socket, suppress_ragged_eofs=True): + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + self._closed = False + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, "Unexpected EOF"): + return b"" + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b"" + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout("The read operation timed out") + else: + return self.recv(*args, **kwargs) + + # TLS 1.3 post-handshake authentication + except OpenSSL.SSL.Error as e: + raise ssl.SSLError("read error: %r" % e) + else: + return data + + def recv_into(self, *args, **kwargs): + try: + return self.connection.recv_into(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, "Unexpected EOF"): + return 0 + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout("The read operation timed out") + else: + return self.recv_into(*args, **kwargs) + + # TLS 1.3 post-handshake authentication + except OpenSSL.SSL.Error as e: + raise ssl.SSLError("read error: %r" % e) + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + if not util.wait_for_write(self.socket, self.socket.gettimeout()): + raise timeout() + continue + except OpenSSL.SSL.SysCallError as e: + raise SocketError(str(e)) + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done( + data[total_sent : total_sent + SSL_WRITE_BLOCKSIZE] + ) + total_sent += sent + + def shutdown(self): + # FIXME rethrow compatible exceptions should we ever use this + self.connection.shutdown() + + def close(self): + if self._makefile_refs < 1: + try: + self._closed = True + return self.connection.close() + except OpenSSL.SSL.Error: + return + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 + + if binary_form: + return OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1, x509) + + return { + "subject": ((("commonName", x509.get_subject().CN),),), + "subjectAltName": get_subj_alt_name(x509), + } + + def version(self): + return self.connection.get_protocol_version_name() + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) + + +else: # Platform-specific: Python 3 + makefile = backport_makefile + +WrappedSocket.makefile = makefile + + +class PyOpenSSLContext(object): + """ + I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible + for translating the interface of the standard library ``SSLContext`` object + to calls into PyOpenSSL. + """ + + def __init__(self, protocol): + self.protocol = _openssl_versions[protocol] + self._ctx = OpenSSL.SSL.Context(self.protocol) + self._options = 0 + self.check_hostname = False + + @property + def options(self): + return self._options + + @options.setter + def options(self, value): + self._options = value + self._ctx.set_options(value) + + @property + def verify_mode(self): + return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] + + @verify_mode.setter + def verify_mode(self, value): + self._ctx.set_verify(_stdlib_to_openssl_verify[value], _verify_callback) + + def set_default_verify_paths(self): + self._ctx.set_default_verify_paths() + + def set_ciphers(self, ciphers): + if isinstance(ciphers, six.text_type): + ciphers = ciphers.encode("utf-8") + self._ctx.set_cipher_list(ciphers) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + if cafile is not None: + cafile = cafile.encode("utf-8") + if capath is not None: + capath = capath.encode("utf-8") + try: + self._ctx.load_verify_locations(cafile, capath) + if cadata is not None: + self._ctx.load_verify_locations(BytesIO(cadata)) + except OpenSSL.SSL.Error as e: + raise ssl.SSLError("unable to load trusted certificates: %r" % e) + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._ctx.use_certificate_chain_file(certfile) + if password is not None: + if not isinstance(password, six.binary_type): + password = password.encode("utf-8") + self._ctx.set_passwd_cb(lambda *_: password) + self._ctx.use_privatekey_file(keyfile or certfile) + + def set_alpn_protocols(self, protocols): + protocols = [six.ensure_binary(p) for p in protocols] + return self._ctx.set_alpn_protos(protocols) + + def wrap_socket( + self, + sock, + server_side=False, + do_handshake_on_connect=True, + suppress_ragged_eofs=True, + server_hostname=None, + ): + cnx = OpenSSL.SSL.Connection(self._ctx, sock) + + if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 + server_hostname = server_hostname.encode("utf-8") + + if server_hostname is not None: + cnx.set_tlsext_host_name(server_hostname) + + cnx.set_connect_state() + + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(sock, sock.gettimeout()): + raise timeout("select timed out") + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError("bad handshake: %r" % e) + break + + return WrappedSocket(cnx, sock) + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/securetransport.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/securetransport.py new file mode 100644 index 0000000..554c015 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/securetransport.py @@ -0,0 +1,922 @@ +""" +SecureTranport support for urllib3 via ctypes. + +This makes platform-native TLS available to urllib3 users on macOS without the +use of a compiler. This is an important feature because the Python Package +Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL +that ships with macOS is not capable of doing TLSv1.2. The only way to resolve +this is to give macOS users an alternative solution to the problem, and that +solution is to use SecureTransport. + +We use ctypes here because this solution must not require a compiler. That's +because pip is not allowed to require a compiler either. + +This is not intended to be a seriously long-term solution to this problem. +The hope is that PEP 543 will eventually solve this issue for us, at which +point we can retire this contrib module. But in the short term, we need to +solve the impending tire fire that is Python on Mac without this kind of +contrib module. So...here we are. + +To use this module, simply import and inject it:: + + import urllib3.contrib.securetransport + urllib3.contrib.securetransport.inject_into_urllib3() + +Happy TLSing! + +This code is a bastardised version of the code found in Will Bond's oscrypto +library. An enormous debt is owed to him for blazing this trail for us. For +that reason, this code should be considered to be covered both by urllib3's +license and by oscrypto's: + +.. code-block:: + + Copyright (c) 2015-2016 Will Bond + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +""" +from __future__ import absolute_import + +import contextlib +import ctypes +import errno +import os.path +import shutil +import socket +import ssl +import struct +import threading +import weakref + +import six + +from .. import util +from ..util.ssl_ import PROTOCOL_TLS_CLIENT +from ._securetransport.bindings import CoreFoundation, Security, SecurityConst +from ._securetransport.low_level import ( + _assert_no_error, + _build_tls_unknown_ca_alert, + _cert_array_from_pem, + _create_cfstring_array, + _load_client_cert_chain, + _temporary_keychain, +) + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +__all__ = ["inject_into_urllib3", "extract_from_urllib3"] + +# SNI always works +HAS_SNI = True + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + +# This dictionary is used by the read callback to obtain a handle to the +# calling wrapped socket. This is a pretty silly approach, but for now it'll +# do. I feel like I should be able to smuggle a handle to the wrapped socket +# directly in the SSLConnectionRef, but for now this approach will work I +# guess. +# +# We need to lock around this structure for inserts, but we don't do it for +# reads/writes in the callbacks. The reasoning here goes as follows: +# +# 1. It is not possible to call into the callbacks before the dictionary is +# populated, so once in the callback the id must be in the dictionary. +# 2. The callbacks don't mutate the dictionary, they only read from it, and +# so cannot conflict with any of the insertions. +# +# This is good: if we had to lock in the callbacks we'd drastically slow down +# the performance of this code. +_connection_refs = weakref.WeakValueDictionary() +_connection_ref_lock = threading.Lock() + +# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over +# for no better reason than we need *a* limit, and this one is right there. +SSL_WRITE_BLOCKSIZE = 16384 + +# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to +# individual cipher suites. We need to do this because this is how +# SecureTransport wants them. +CIPHER_SUITES = [ + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_AES_256_GCM_SHA384, + SecurityConst.TLS_AES_128_GCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_AES_128_CCM_8_SHA256, + SecurityConst.TLS_AES_128_CCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, +] + +# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of +# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. +# TLSv1 to 1.2 are supported on macOS 10.8+ +_protocol_to_min_max = { + util.PROTOCOL_TLS: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), + PROTOCOL_TLS_CLIENT: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), +} + +if hasattr(ssl, "PROTOCOL_SSLv2"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( + SecurityConst.kSSLProtocol2, + SecurityConst.kSSLProtocol2, + ) +if hasattr(ssl, "PROTOCOL_SSLv3"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( + SecurityConst.kSSLProtocol3, + SecurityConst.kSSLProtocol3, + ) +if hasattr(ssl, "PROTOCOL_TLSv1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( + SecurityConst.kTLSProtocol1, + SecurityConst.kTLSProtocol1, + ) +if hasattr(ssl, "PROTOCOL_TLSv1_1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( + SecurityConst.kTLSProtocol11, + SecurityConst.kTLSProtocol11, + ) +if hasattr(ssl, "PROTOCOL_TLSv1_2"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( + SecurityConst.kTLSProtocol12, + SecurityConst.kTLSProtocol12, + ) + + +def inject_into_urllib3(): + """ + Monkey-patch urllib3 with SecureTransport-backed SSL-support. + """ + util.SSLContext = SecureTransportContext + util.ssl_.SSLContext = SecureTransportContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_SECURETRANSPORT = True + util.ssl_.IS_SECURETRANSPORT = True + + +def extract_from_urllib3(): + """ + Undo monkey-patching by :func:`inject_into_urllib3`. + """ + util.SSLContext = orig_util_SSLContext + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_SECURETRANSPORT = False + util.ssl_.IS_SECURETRANSPORT = False + + +def _read_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport read callback. This is called by ST to request that data + be returned from the socket. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + requested_length = data_length_pointer[0] + + timeout = wrapped_socket.gettimeout() + error = None + read_count = 0 + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + if not util.wait_for_read(base_socket, timeout): + raise socket.error(errno.EAGAIN, "timed out") + + remaining = requested_length - read_count + buffer = (ctypes.c_char * remaining).from_address( + data_buffer + read_count + ) + chunk_size = base_socket.recv_into(buffer, remaining) + read_count += chunk_size + if not chunk_size: + if not read_count: + return SecurityConst.errSSLClosedGraceful + break + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = read_count + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = read_count + + if read_count != requested_length: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +def _write_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport write callback. This is called by ST to request that data + actually be sent on the network. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + bytes_to_write = data_length_pointer[0] + data = ctypes.string_at(data_buffer, bytes_to_write) + + timeout = wrapped_socket.gettimeout() + error = None + sent = 0 + + try: + while sent < bytes_to_write: + if timeout is None or timeout >= 0: + if not util.wait_for_write(base_socket, timeout): + raise socket.error(errno.EAGAIN, "timed out") + chunk_sent = base_socket.send(data) + sent += chunk_sent + + # This has some needless copying here, but I'm not sure there's + # much value in optimising this data path. + data = data[chunk_sent:] + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = sent + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = sent + + if sent != bytes_to_write: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +# We need to keep these two objects references alive: if they get GC'd while +# in use then SecureTransport could attempt to call a function that is in freed +# memory. That would be...uh...bad. Yeah, that's the word. Bad. +_read_callback_pointer = Security.SSLReadFunc(_read_callback) +_write_callback_pointer = Security.SSLWriteFunc(_write_callback) + + +class WrappedSocket(object): + """ + API-compatibility wrapper for Python's OpenSSL wrapped socket object. + + Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage + collector of PyPy. + """ + + def __init__(self, socket): + self.socket = socket + self.context = None + self._makefile_refs = 0 + self._closed = False + self._exception = None + self._keychain = None + self._keychain_dir = None + self._client_cert_chain = None + + # We save off the previously-configured timeout and then set it to + # zero. This is done because we use select and friends to handle the + # timeouts, but if we leave the timeout set on the lower socket then + # Python will "kindly" call select on that socket again for us. Avoid + # that by forcing the timeout to zero. + self._timeout = self.socket.gettimeout() + self.socket.settimeout(0) + + @contextlib.contextmanager + def _raise_on_error(self): + """ + A context manager that can be used to wrap calls that do I/O from + SecureTransport. If any of the I/O callbacks hit an exception, this + context manager will correctly propagate the exception after the fact. + This avoids silently swallowing those exceptions. + + It also correctly forces the socket closed. + """ + self._exception = None + + # We explicitly don't catch around this yield because in the unlikely + # event that an exception was hit in the block we don't want to swallow + # it. + yield + if self._exception is not None: + exception, self._exception = self._exception, None + self.close() + raise exception + + def _set_ciphers(self): + """ + Sets up the allowed ciphers. By default this matches the set in + util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done + custom and doesn't allow changing at this time, mostly because parsing + OpenSSL cipher strings is going to be a freaking nightmare. + """ + ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) + result = Security.SSLSetEnabledCiphers( + self.context, ciphers, len(CIPHER_SUITES) + ) + _assert_no_error(result) + + def _set_alpn_protocols(self, protocols): + """ + Sets up the ALPN protocols on the context. + """ + if not protocols: + return + protocols_arr = _create_cfstring_array(protocols) + try: + result = Security.SSLSetALPNProtocols(self.context, protocols_arr) + _assert_no_error(result) + finally: + CoreFoundation.CFRelease(protocols_arr) + + def _custom_validate(self, verify, trust_bundle): + """ + Called when we have set custom validation. We do this in two cases: + first, when cert validation is entirely disabled; and second, when + using a custom trust DB. + Raises an SSLError if the connection is not trusted. + """ + # If we disabled cert validation, just say: cool. + if not verify: + return + + successes = ( + SecurityConst.kSecTrustResultUnspecified, + SecurityConst.kSecTrustResultProceed, + ) + try: + trust_result = self._evaluate_trust(trust_bundle) + if trust_result in successes: + return + reason = "error code: %d" % (trust_result,) + except Exception as e: + # Do not trust on error + reason = "exception: %r" % (e,) + + # SecureTransport does not send an alert nor shuts down the connection. + rec = _build_tls_unknown_ca_alert(self.version()) + self.socket.sendall(rec) + # close the connection immediately + # l_onoff = 1, activate linger + # l_linger = 0, linger for 0 seoncds + opts = struct.pack("ii", 1, 0) + self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, opts) + self.close() + raise ssl.SSLError("certificate verify failed, %s" % reason) + + def _evaluate_trust(self, trust_bundle): + # We want data in memory, so load it up. + if os.path.isfile(trust_bundle): + with open(trust_bundle, "rb") as f: + trust_bundle = f.read() + + cert_array = None + trust = Security.SecTrustRef() + + try: + # Get a CFArray that contains the certs we want. + cert_array = _cert_array_from_pem(trust_bundle) + + # Ok, now the hard part. We want to get the SecTrustRef that ST has + # created for this connection, shove our CAs into it, tell ST to + # ignore everything else it knows, and then ask if it can build a + # chain. This is a buuuunch of code. + result = Security.SSLCopyPeerTrust(self.context, ctypes.byref(trust)) + _assert_no_error(result) + if not trust: + raise ssl.SSLError("Failed to copy trust reference") + + result = Security.SecTrustSetAnchorCertificates(trust, cert_array) + _assert_no_error(result) + + result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) + _assert_no_error(result) + + trust_result = Security.SecTrustResultType() + result = Security.SecTrustEvaluate(trust, ctypes.byref(trust_result)) + _assert_no_error(result) + finally: + if trust: + CoreFoundation.CFRelease(trust) + + if cert_array is not None: + CoreFoundation.CFRelease(cert_array) + + return trust_result.value + + def handshake( + self, + server_hostname, + verify, + trust_bundle, + min_version, + max_version, + client_cert, + client_key, + client_key_passphrase, + alpn_protocols, + ): + """ + Actually performs the TLS handshake. This is run automatically by + wrapped socket, and shouldn't be needed in user code. + """ + # First, we do the initial bits of connection setup. We need to create + # a context, set its I/O funcs, and set the connection reference. + self.context = Security.SSLCreateContext( + None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType + ) + result = Security.SSLSetIOFuncs( + self.context, _read_callback_pointer, _write_callback_pointer + ) + _assert_no_error(result) + + # Here we need to compute the handle to use. We do this by taking the + # id of self modulo 2**31 - 1. If this is already in the dictionary, we + # just keep incrementing by one until we find a free space. + with _connection_ref_lock: + handle = id(self) % 2147483647 + while handle in _connection_refs: + handle = (handle + 1) % 2147483647 + _connection_refs[handle] = self + + result = Security.SSLSetConnection(self.context, handle) + _assert_no_error(result) + + # If we have a server hostname, we should set that too. + if server_hostname: + if not isinstance(server_hostname, bytes): + server_hostname = server_hostname.encode("utf-8") + + result = Security.SSLSetPeerDomainName( + self.context, server_hostname, len(server_hostname) + ) + _assert_no_error(result) + + # Setup the ciphers. + self._set_ciphers() + + # Setup the ALPN protocols. + self._set_alpn_protocols(alpn_protocols) + + # Set the minimum and maximum TLS versions. + result = Security.SSLSetProtocolVersionMin(self.context, min_version) + _assert_no_error(result) + + result = Security.SSLSetProtocolVersionMax(self.context, max_version) + _assert_no_error(result) + + # If there's a trust DB, we need to use it. We do that by telling + # SecureTransport to break on server auth. We also do that if we don't + # want to validate the certs at all: we just won't actually do any + # authing in that case. + if not verify or trust_bundle is not None: + result = Security.SSLSetSessionOption( + self.context, SecurityConst.kSSLSessionOptionBreakOnServerAuth, True + ) + _assert_no_error(result) + + # If there's a client cert, we need to use it. + if client_cert: + self._keychain, self._keychain_dir = _temporary_keychain() + self._client_cert_chain = _load_client_cert_chain( + self._keychain, client_cert, client_key + ) + result = Security.SSLSetCertificate(self.context, self._client_cert_chain) + _assert_no_error(result) + + while True: + with self._raise_on_error(): + result = Security.SSLHandshake(self.context) + + if result == SecurityConst.errSSLWouldBlock: + raise socket.timeout("handshake timed out") + elif result == SecurityConst.errSSLServerAuthCompleted: + self._custom_validate(verify, trust_bundle) + continue + else: + _assert_no_error(result) + break + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, bufsiz): + buffer = ctypes.create_string_buffer(bufsiz) + bytes_read = self.recv_into(buffer, bufsiz) + data = buffer[:bytes_read] + return data + + def recv_into(self, buffer, nbytes=None): + # Read short on EOF. + if self._closed: + return 0 + + if nbytes is None: + nbytes = len(buffer) + + buffer = (ctypes.c_char * nbytes).from_buffer(buffer) + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLRead( + self.context, buffer, nbytes, ctypes.byref(processed_bytes) + ) + + # There are some result codes that we want to treat as "not always + # errors". Specifically, those are errSSLWouldBlock, + # errSSLClosedGraceful, and errSSLClosedNoNotify. + if result == SecurityConst.errSSLWouldBlock: + # If we didn't process any bytes, then this was just a time out. + # However, we can get errSSLWouldBlock in situations when we *did* + # read some data, and in those cases we should just read "short" + # and return. + if processed_bytes.value == 0: + # Timed out, no data read. + raise socket.timeout("recv timed out") + elif result in ( + SecurityConst.errSSLClosedGraceful, + SecurityConst.errSSLClosedNoNotify, + ): + # The remote peer has closed this connection. We should do so as + # well. Note that we don't actually return here because in + # principle this could actually be fired along with return data. + # It's unlikely though. + self.close() + else: + _assert_no_error(result) + + # Ok, we read and probably succeeded. We should return whatever data + # was actually read. + return processed_bytes.value + + def settimeout(self, timeout): + self._timeout = timeout + + def gettimeout(self): + return self._timeout + + def send(self, data): + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLWrite( + self.context, data, len(data), ctypes.byref(processed_bytes) + ) + + if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: + # Timed out + raise socket.timeout("send timed out") + else: + _assert_no_error(result) + + # We sent, and probably succeeded. Tell them how much we sent. + return processed_bytes.value + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self.send(data[total_sent : total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + with self._raise_on_error(): + Security.SSLClose(self.context) + + def close(self): + # TODO: should I do clean shutdown here? Do I have to? + if self._makefile_refs < 1: + self._closed = True + if self.context: + CoreFoundation.CFRelease(self.context) + self.context = None + if self._client_cert_chain: + CoreFoundation.CFRelease(self._client_cert_chain) + self._client_cert_chain = None + if self._keychain: + Security.SecKeychainDelete(self._keychain) + CoreFoundation.CFRelease(self._keychain) + shutil.rmtree(self._keychain_dir) + self._keychain = self._keychain_dir = None + return self.socket.close() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + # Urgh, annoying. + # + # Here's how we do this: + # + # 1. Call SSLCopyPeerTrust to get hold of the trust object for this + # connection. + # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. + # 3. To get the CN, call SecCertificateCopyCommonName and process that + # string so that it's of the appropriate type. + # 4. To get the SAN, we need to do something a bit more complex: + # a. Call SecCertificateCopyValues to get the data, requesting + # kSecOIDSubjectAltName. + # b. Mess about with this dictionary to try to get the SANs out. + # + # This is gross. Really gross. It's going to be a few hundred LoC extra + # just to repeat something that SecureTransport can *already do*. So my + # operating assumption at this time is that what we want to do is + # instead to just flag to urllib3 that it shouldn't do its own hostname + # validation when using SecureTransport. + if not binary_form: + raise ValueError("SecureTransport only supports dumping binary certs") + trust = Security.SecTrustRef() + certdata = None + der_bytes = None + + try: + # Grab the trust store. + result = Security.SSLCopyPeerTrust(self.context, ctypes.byref(trust)) + _assert_no_error(result) + if not trust: + # Probably we haven't done the handshake yet. No biggie. + return None + + cert_count = Security.SecTrustGetCertificateCount(trust) + if not cert_count: + # Also a case that might happen if we haven't handshaked. + # Handshook? Handshaken? + return None + + leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) + assert leaf + + # Ok, now we want the DER bytes. + certdata = Security.SecCertificateCopyData(leaf) + assert certdata + + data_length = CoreFoundation.CFDataGetLength(certdata) + data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) + der_bytes = ctypes.string_at(data_buffer, data_length) + finally: + if certdata: + CoreFoundation.CFRelease(certdata) + if trust: + CoreFoundation.CFRelease(trust) + + return der_bytes + + def version(self): + protocol = Security.SSLProtocol() + result = Security.SSLGetNegotiatedProtocolVersion( + self.context, ctypes.byref(protocol) + ) + _assert_no_error(result) + if protocol.value == SecurityConst.kTLSProtocol13: + raise ssl.SSLError("SecureTransport does not support TLS 1.3") + elif protocol.value == SecurityConst.kTLSProtocol12: + return "TLSv1.2" + elif protocol.value == SecurityConst.kTLSProtocol11: + return "TLSv1.1" + elif protocol.value == SecurityConst.kTLSProtocol1: + return "TLSv1" + elif protocol.value == SecurityConst.kSSLProtocol3: + return "SSLv3" + elif protocol.value == SecurityConst.kSSLProtocol2: + return "SSLv2" + else: + raise ssl.SSLError("Unknown TLS version: %r" % protocol) + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) + + +else: # Platform-specific: Python 3 + + def makefile(self, mode="r", buffering=None, *args, **kwargs): + # We disable buffering with SecureTransport because it conflicts with + # the buffering that ST does internally (see issue #1153 for more). + buffering = 0 + return backport_makefile(self, mode, buffering, *args, **kwargs) + + +WrappedSocket.makefile = makefile + + +class SecureTransportContext(object): + """ + I am a wrapper class for the SecureTransport library, to translate the + interface of the standard library ``SSLContext`` object to calls into + SecureTransport. + """ + + def __init__(self, protocol): + self._min_version, self._max_version = _protocol_to_min_max[protocol] + self._options = 0 + self._verify = False + self._trust_bundle = None + self._client_cert = None + self._client_key = None + self._client_key_passphrase = None + self._alpn_protocols = None + + @property + def check_hostname(self): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + return True + + @check_hostname.setter + def check_hostname(self, value): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + pass + + @property + def options(self): + # TODO: Well, crap. + # + # So this is the bit of the code that is the most likely to cause us + # trouble. Essentially we need to enumerate all of the SSL options that + # users might want to use and try to see if we can sensibly translate + # them, or whether we should just ignore them. + return self._options + + @options.setter + def options(self, value): + # TODO: Update in line with above. + self._options = value + + @property + def verify_mode(self): + return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE + + @verify_mode.setter + def verify_mode(self, value): + self._verify = True if value == ssl.CERT_REQUIRED else False + + def set_default_verify_paths(self): + # So, this has to do something a bit weird. Specifically, what it does + # is nothing. + # + # This means that, if we had previously had load_verify_locations + # called, this does not undo that. We need to do that because it turns + # out that the rest of the urllib3 code will attempt to load the + # default verify paths if it hasn't been told about any paths, even if + # the context itself was sometime earlier. We resolve that by just + # ignoring it. + pass + + def load_default_certs(self): + return self.set_default_verify_paths() + + def set_ciphers(self, ciphers): + # For now, we just require the default cipher string. + if ciphers != util.ssl_.DEFAULT_CIPHERS: + raise ValueError("SecureTransport doesn't support custom cipher strings") + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + # OK, we only really support cadata and cafile. + if capath is not None: + raise ValueError("SecureTransport does not support cert directories") + + # Raise if cafile does not exist. + if cafile is not None: + with open(cafile): + pass + + self._trust_bundle = cafile or cadata + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._client_cert = certfile + self._client_key = keyfile + self._client_cert_passphrase = password + + def set_alpn_protocols(self, protocols): + """ + Sets the ALPN protocols that will later be set on the context. + + Raises a NotImplementedError if ALPN is not supported. + """ + if not hasattr(Security, "SSLSetALPNProtocols"): + raise NotImplementedError( + "SecureTransport supports ALPN only in macOS 10.12+" + ) + self._alpn_protocols = [six.ensure_binary(p) for p in protocols] + + def wrap_socket( + self, + sock, + server_side=False, + do_handshake_on_connect=True, + suppress_ragged_eofs=True, + server_hostname=None, + ): + # So, what do we do here? Firstly, we assert some properties. This is a + # stripped down shim, so there is some functionality we don't support. + # See PEP 543 for the real deal. + assert not server_side + assert do_handshake_on_connect + assert suppress_ragged_eofs + + # Ok, we're good to go. Now we want to create the wrapped socket object + # and store it in the appropriate place. + wrapped_socket = WrappedSocket(sock) + + # Now we can handshake + wrapped_socket.handshake( + server_hostname, + self._verify, + self._trust_bundle, + self._min_version, + self._max_version, + self._client_cert, + self._client_key, + self._client_key_passphrase, + self._alpn_protocols, + ) + return wrapped_socket diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/socks.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/socks.py new file mode 100644 index 0000000..c326e80 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/contrib/socks.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- +""" +This module contains provisional support for SOCKS proxies from within +urllib3. This module supports SOCKS4, SOCKS4A (an extension of SOCKS4), and +SOCKS5. To enable its functionality, either install PySocks or install this +module with the ``socks`` extra. + +The SOCKS implementation supports the full range of urllib3 features. It also +supports the following SOCKS features: + +- SOCKS4A (``proxy_url='socks4a://...``) +- SOCKS4 (``proxy_url='socks4://...``) +- SOCKS5 with remote DNS (``proxy_url='socks5h://...``) +- SOCKS5 with local DNS (``proxy_url='socks5://...``) +- Usernames and passwords for the SOCKS proxy + +.. note:: + It is recommended to use ``socks5h://`` or ``socks4a://`` schemes in + your ``proxy_url`` to ensure that DNS resolution is done from the remote + server instead of client-side when connecting to a domain name. + +SOCKS4 supports IPv4 and domain names with the SOCKS4A extension. SOCKS5 +supports IPv4, IPv6, and domain names. + +When connecting to a SOCKS4 proxy the ``username`` portion of the ``proxy_url`` +will be sent as the ``userid`` section of the SOCKS request: + +.. code-block:: python + + proxy_url="socks4a://@proxy-host" + +When connecting to a SOCKS5 proxy the ``username`` and ``password`` portion +of the ``proxy_url`` will be sent as the username/password to authenticate +with the proxy: + +.. code-block:: python + + proxy_url="socks5h://:@proxy-host" + +""" +from __future__ import absolute_import + +try: + import socks +except ImportError: + import warnings + + from ..exceptions import DependencyWarning + + warnings.warn( + ( + "SOCKS support in urllib3 requires the installation of optional " + "dependencies: specifically, PySocks. For more information, see " + "https://urllib3.readthedocs.io/en/1.26.x/contrib.html#socks-proxies" + ), + DependencyWarning, + ) + raise + +from socket import error as SocketError +from socket import timeout as SocketTimeout + +from ..connection import HTTPConnection, HTTPSConnection +from ..connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from ..exceptions import ConnectTimeoutError, NewConnectionError +from ..poolmanager import PoolManager +from ..util.url import parse_url + +try: + import ssl +except ImportError: + ssl = None + + +class SOCKSConnection(HTTPConnection): + """ + A plain-text HTTP connection that connects via a SOCKS proxy. + """ + + def __init__(self, *args, **kwargs): + self._socks_options = kwargs.pop("_socks_options") + super(SOCKSConnection, self).__init__(*args, **kwargs) + + def _new_conn(self): + """ + Establish a new connection via the SOCKS proxy. + """ + extra_kw = {} + if self.source_address: + extra_kw["source_address"] = self.source_address + + if self.socket_options: + extra_kw["socket_options"] = self.socket_options + + try: + conn = socks.create_connection( + (self.host, self.port), + proxy_type=self._socks_options["socks_version"], + proxy_addr=self._socks_options["proxy_host"], + proxy_port=self._socks_options["proxy_port"], + proxy_username=self._socks_options["username"], + proxy_password=self._socks_options["password"], + proxy_rdns=self._socks_options["rdns"], + timeout=self.timeout, + **extra_kw + ) + + except SocketTimeout: + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" + % (self.host, self.timeout), + ) + + except socks.ProxyError as e: + # This is fragile as hell, but it seems to be the only way to raise + # useful errors here. + if e.socket_err: + error = e.socket_err + if isinstance(error, SocketTimeout): + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" + % (self.host, self.timeout), + ) + else: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % error + ) + else: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e + ) + + except SocketError as e: # Defensive: PySocks should catch all these. + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e + ) + + return conn + + +# We don't need to duplicate the Verified/Unverified distinction from +# urllib3/connection.py here because the HTTPSConnection will already have been +# correctly set to either the Verified or Unverified form by that module. This +# means the SOCKSHTTPSConnection will automatically be the correct type. +class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): + pass + + +class SOCKSHTTPConnectionPool(HTTPConnectionPool): + ConnectionCls = SOCKSConnection + + +class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): + ConnectionCls = SOCKSHTTPSConnection + + +class SOCKSProxyManager(PoolManager): + """ + A version of the urllib3 ProxyManager that routes connections via the + defined SOCKS proxy. + """ + + pool_classes_by_scheme = { + "http": SOCKSHTTPConnectionPool, + "https": SOCKSHTTPSConnectionPool, + } + + def __init__( + self, + proxy_url, + username=None, + password=None, + num_pools=10, + headers=None, + **connection_pool_kw + ): + parsed = parse_url(proxy_url) + + if username is None and password is None and parsed.auth is not None: + split = parsed.auth.split(":") + if len(split) == 2: + username, password = split + if parsed.scheme == "socks5": + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = False + elif parsed.scheme == "socks5h": + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = True + elif parsed.scheme == "socks4": + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = False + elif parsed.scheme == "socks4a": + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = True + else: + raise ValueError("Unable to determine SOCKS version from %s" % proxy_url) + + self.proxy_url = proxy_url + + socks_options = { + "socks_version": socks_version, + "proxy_host": parsed.host, + "proxy_port": parsed.port, + "username": username, + "password": password, + "rdns": rdns, + } + connection_pool_kw["_socks_options"] = socks_options + + super(SOCKSProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw + ) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/exceptions.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/exceptions.py new file mode 100644 index 0000000..cba6f3f --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/exceptions.py @@ -0,0 +1,323 @@ +from __future__ import absolute_import + +from .packages.six.moves.http_client import IncompleteRead as httplib_IncompleteRead + +# Base Exceptions + + +class HTTPError(Exception): + """Base exception used by this module.""" + + pass + + +class HTTPWarning(Warning): + """Base warning used by this module.""" + + pass + + +class PoolError(HTTPError): + """Base exception for errors caused within a pool.""" + + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, None) + + +class RequestError(PoolError): + """Base exception for PoolErrors that have associated URLs.""" + + def __init__(self, pool, url, message): + self.url = url + PoolError.__init__(self, pool, message) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url, None) + + +class SSLError(HTTPError): + """Raised when SSL certificate fails in an HTTPS connection.""" + + pass + + +class ProxyError(HTTPError): + """Raised when the connection to a proxy fails.""" + + def __init__(self, message, error, *args): + super(ProxyError, self).__init__(message, error, *args) + self.original_error = error + + +class DecodeError(HTTPError): + """Raised when automatic decoding based on Content-Type fails.""" + + pass + + +class ProtocolError(HTTPError): + """Raised when something unexpected happens mid-request/response.""" + + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions + + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s (Caused by %r)" % (url, reason) + + RequestError.__init__(self, pool, url, message) + + +class HostChangedError(RequestError): + """Raised when an existing pool gets a request for a foreign host.""" + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + RequestError.__init__(self, pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """Raised when passing an invalid state to a timeout""" + + pass + + +class TimeoutError(HTTPError): + """Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + ` and :exc:`ConnectTimeoutErrors `. + """ + + pass + + +class ReadTimeoutError(TimeoutError, RequestError): + """Raised when a socket timeout occurs while receiving data from a server""" + + pass + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + """Raised when a socket timeout occurs while connecting to a server""" + + pass + + +class NewConnectionError(ConnectTimeoutError, PoolError): + """Raised when we fail to establish a new connection. Usually ECONNREFUSED.""" + + pass + + +class EmptyPoolError(PoolError): + """Raised when a pool runs out of connections and no more are allowed.""" + + pass + + +class ClosedPoolError(PoolError): + """Raised when a request enters a pool after the pool has been closed.""" + + pass + + +class LocationValueError(ValueError, HTTPError): + """Raised when there is something wrong with a given URL input.""" + + pass + + +class LocationParseError(LocationValueError): + """Raised when get_host or similar fails to parse the URL input.""" + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location + + +class URLSchemeUnknown(LocationValueError): + """Raised when a URL input has an unsupported scheme.""" + + def __init__(self, scheme): + message = "Not supported URL scheme %s" % scheme + super(URLSchemeUnknown, self).__init__(message) + + self.scheme = scheme + + +class ResponseError(HTTPError): + """Used as a container for an error reason supplied in a MaxRetryError.""" + + GENERIC_ERROR = "too many error responses" + SPECIFIC_ERROR = "too many {status_code} error responses" + + +class SecurityWarning(HTTPWarning): + """Warned when performing security reducing actions""" + + pass + + +class SubjectAltNameWarning(SecurityWarning): + """Warned when connecting to a host with a certificate missing a SAN.""" + + pass + + +class InsecureRequestWarning(SecurityWarning): + """Warned when making an unverified HTTPS request.""" + + pass + + +class SystemTimeWarning(SecurityWarning): + """Warned when system time is suspected to be wrong""" + + pass + + +class InsecurePlatformWarning(SecurityWarning): + """Warned when certain TLS/SSL configuration is not available on a platform.""" + + pass + + +class SNIMissingWarning(HTTPWarning): + """Warned when making a HTTPS request without SNI available.""" + + pass + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + + pass + + +class ResponseNotChunked(ProtocolError, ValueError): + """Response needs to be chunked in order to read it as chunks.""" + + pass + + +class BodyNotHttplibCompatible(HTTPError): + """ + Body should be :class:`http.client.HTTPResponse` like + (have an fp attribute which returns raw chunks) for read_chunked(). + """ + + pass + + +class IncompleteRead(HTTPError, httplib_IncompleteRead): + """ + Response length doesn't match expected Content-Length + + Subclass of :class:`http.client.IncompleteRead` to allow int value + for ``partial`` to avoid creating large objects on streamed reads. + """ + + def __init__(self, partial, expected): + super(IncompleteRead, self).__init__(partial, expected) + + def __repr__(self): + return "IncompleteRead(%i bytes read, %i more expected)" % ( + self.partial, + self.expected, + ) + + +class InvalidChunkLength(HTTPError, httplib_IncompleteRead): + """Invalid chunk length in a chunked response.""" + + def __init__(self, response, length): + super(InvalidChunkLength, self).__init__( + response.tell(), response.length_remaining + ) + self.response = response + self.length = length + + def __repr__(self): + return "InvalidChunkLength(got length %r, %i bytes read)" % ( + self.length, + self.partial, + ) + + +class InvalidHeader(HTTPError): + """The header provided was somehow invalid.""" + + pass + + +class ProxySchemeUnknown(AssertionError, URLSchemeUnknown): + """ProxyManager does not support the supplied scheme""" + + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme): + # 'localhost' is here because our URL parser parses + # localhost:8080 -> scheme=localhost, remove if we fix this. + if scheme == "localhost": + scheme = None + if scheme is None: + message = "Proxy URL had no scheme, should start with http:// or https://" + else: + message = ( + "Proxy URL had unsupported scheme %s, should use http:// or https://" + % scheme + ) + super(ProxySchemeUnknown, self).__init__(message) + + +class ProxySchemeUnsupported(ValueError): + """Fetching HTTPS resources through HTTPS proxies is unsupported""" + + pass + + +class HeaderParsingError(HTTPError): + """Raised by assert_header_parsing, but we convert it to a log.warning statement.""" + + def __init__(self, defects, unparsed_data): + message = "%s, unparsed data: %r" % (defects or "Unknown", unparsed_data) + super(HeaderParsingError, self).__init__(message) + + +class UnrewindableBodyError(HTTPError): + """urllib3 encountered an error when trying to rewind a body""" + + pass diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/fields.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/fields.py new file mode 100644 index 0000000..9d630f4 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/fields.py @@ -0,0 +1,274 @@ +from __future__ import absolute_import + +import email.utils +import mimetypes +import re + +from .packages import six + + +def guess_content_type(filename, default="application/octet-stream"): + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param_rfc2231(name, value): + """ + Helper function to format and quote a single header parameter using the + strategy defined in RFC 2231. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows + `RFC 2388 Section 4.4 `_. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as ``bytes`` or `str``. + :ret: + An RFC-2231-formatted unicode string. + """ + if isinstance(value, six.binary_type): + value = value.decode("utf-8") + + if not any(ch in value for ch in '"\\\r\n'): + result = u'%s="%s"' % (name, value) + try: + result.encode("ascii") + except (UnicodeEncodeError, UnicodeDecodeError): + pass + else: + return result + + if six.PY2: # Python 2: + value = value.encode("utf-8") + + # encode_rfc2231 accepts an encoded string and returns an ascii-encoded + # string in Python 2 but accepts and returns unicode strings in Python 3 + value = email.utils.encode_rfc2231(value, "utf-8") + value = "%s*=%s" % (name, value) + + if six.PY2: # Python 2: + value = value.decode("utf-8") + + return value + + +_HTML5_REPLACEMENTS = { + u"\u0022": u"%22", + # Replace "\" with "\\". + u"\u005C": u"\u005C\u005C", +} + +# All control characters from 0x00 to 0x1F *except* 0x1B. +_HTML5_REPLACEMENTS.update( + { + six.unichr(cc): u"%{:02X}".format(cc) + for cc in range(0x00, 0x1F + 1) + if cc not in (0x1B,) + } +) + + +def _replace_multiple(value, needles_and_replacements): + def replacer(match): + return needles_and_replacements[match.group(0)] + + pattern = re.compile( + r"|".join([re.escape(needle) for needle in needles_and_replacements.keys()]) + ) + + result = pattern.sub(replacer, value) + + return result + + +def format_header_param_html5(name, value): + """ + Helper function to format and quote a single header parameter using the + HTML5 strategy. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows the `HTML5 Working Draft + Section 4.10.22.7`_ and matches the behavior of curl and modern browsers. + + .. _HTML5 Working Draft Section 4.10.22.7: + https://w3c.github.io/html/sec-forms.html#multipart-form-data + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as ``bytes`` or `str``. + :ret: + A unicode string, stripped of troublesome characters. + """ + if isinstance(value, six.binary_type): + value = value.decode("utf-8") + + value = _replace_multiple(value, _HTML5_REPLACEMENTS) + + return u'%s="%s"' % (name, value) + + +# For backwards-compatibility. +format_header_param = format_header_param_html5 + + +class RequestField(object): + """ + A data container for request body parameters. + + :param name: + The name of this request field. Must be unicode. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. Must be unicode. + :param headers: + An optional dict-like object of headers to initially use for the field. + :param header_formatter: + An optional callable that is used to encode and format the headers. By + default, this is :func:`format_header_param_html5`. + """ + + def __init__( + self, + name, + data, + filename=None, + headers=None, + header_formatter=format_header_param_html5, + ): + self._name = name + self._filename = filename + self.data = data + self.headers = {} + if headers: + self.headers = dict(headers) + self.header_formatter = header_formatter + + @classmethod + def from_tuples(cls, fieldname, value, header_formatter=format_header_param_html5): + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls( + fieldname, data, filename=filename, header_formatter=header_formatter + ) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name, value): + """ + Overridable helper function to format a single header parameter. By + default, this calls ``self.header_formatter``. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + + return self.header_formatter(name, value) + + def _render_parts(self, header_parts): + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + parts = [] + iterable = header_parts + if isinstance(header_parts, dict): + iterable = header_parts.items() + + for name, value in iterable: + if value is not None: + parts.append(self._render_part(name, value)) + + return u"; ".join(parts) + + def render_headers(self): + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ["Content-Disposition", "Content-Type", "Content-Location"] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append(u"%s: %s" % (sort_key, self.headers[sort_key])) + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append(u"%s: %s" % (header_name, header_value)) + + lines.append(u"\r\n") + return u"\r\n".join(lines) + + def make_multipart( + self, content_disposition=None, content_type=None, content_location=None + ): + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + self.headers["Content-Disposition"] = content_disposition or u"form-data" + self.headers["Content-Disposition"] += u"; ".join( + [ + u"", + self._render_parts( + ((u"name", self._name), (u"filename", self._filename)) + ), + ] + ) + self.headers["Content-Type"] = content_type + self.headers["Content-Location"] = content_location diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/filepost.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/filepost.py new file mode 100644 index 0000000..36c9252 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/filepost.py @@ -0,0 +1,98 @@ +from __future__ import absolute_import + +import binascii +import codecs +import os +from io import BytesIO + +from .fields import RequestField +from .packages import six +from .packages.six import b + +writer = codecs.lookup("utf-8")[3] + + +def choose_boundary(): + """ + Our embarrassingly-simple replacement for mimetools.choose_boundary. + """ + boundary = binascii.hexlify(os.urandom(16)) + if not six.PY2: + boundary = boundary.decode("ascii") + return boundary + + +def iter_field_objects(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts, and lists of + :class:`~urllib3.fields.RequestField`. + + """ + if isinstance(fields, dict): + i = six.iteritems(fields) + else: + i = iter(fields) + + for field in i: + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) + + +def iter_fields(fields): + """ + .. deprecated:: 1.6 + + Iterate over fields. + + The addition of :class:`~urllib3.fields.RequestField` makes this function + obsolete. Instead, use :func:`iter_field_objects`, which returns + :class:`~urllib3.fields.RequestField` objects. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k, v) for k, v in fields) + + +def encode_multipart_formdata(fields, boundary=None): + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`urllib3.filepost.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for field in iter_field_objects(fields): + body.write(b("--%s\r\n" % (boundary))) + + writer(body).write(field.render_headers()) + data = field.data + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b"\r\n") + + body.write(b("--%s--\r\n" % (boundary))) + + content_type = str("multipart/form-data; boundary=%s" % boundary) + + return body.getvalue(), content_type diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a71860b78b5a44aad693122208e7d1e76900b878 GIT binary patch literal 190 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 SSVBiT@y!fUCZ6E-<9`7+j+Gt& literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca6e8bb2ccaa450d21b06bb4c60f982b4f2a1d23 GIT binary patch literal 200 zcmd1j<>g`k0{^WGl0fuh5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;x_^erR!OQL%nr zW^%rMZf0I)T7FS_sDb|mV2O3%uAFo$Xd5gm)H$SB`C)Ez*h+-xn H!NLFlf(bPu literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5551b108d3bfb1e5d819c44ae978040ce3ce79fb GIT binary patch literal 1300 zcmZuxPjBNy6rZsj+j0KT)k;WQU|0#Xk-9NZp_LF?EoED&fZEk&OQl>~+cR$6IG$)` z($HwafpXzPAnl41AAm12S5Ey3T$VRZQ&oazW#+x#yuUN=h4*?90y_HZP4-(0p}(zg zpIi{0!%sejg`zQ{m^u|6W7yrwnYv>aqqai>+M@oicTr#pK)j3IPuqf*@ zuufI9NNXjD;v^R=Rg9$MQ31gpk+n0zvkR81VRQq|G*P0-&1f88W;F|bd7(3yU_R&t$ga)efEL&yJ!{YKoads@*M(= zR-+M8f7RB3*w$_8Jw?F#;tSwi%PU7C-M)5KkwzZ6aB1)qIVf?pL&G@|FKBz^03S_| z_+EJzty{?vCpwhJkWt6xqN5Rl2swDpmG{Qi5q!>Dch#vM0$u?YG>8L81o_Quet?D> zREJ`zJ0k>GTX(dpJ>7cit-2cPZW8G(yl{8ktE@`` zAYE9m#s$XsYj4I=5cf|cK7HN+7hYtFyjExH9~fIHnra|`>h3j$6Ct)_Vnfd(xTBnjntl86o*8Gk+M&6_sL gP5t+lkE~YsHQd*{V$W>XNc$HE0fR1fy#Bj?0XyVxYybcN literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/makefile.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/makefile.py new file mode 100644 index 0000000..b8fb215 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/backports/makefile.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +""" +backports.makefile +~~~~~~~~~~~~~~~~~~ + +Backports the Python 3 ``socket.makefile`` method for use with anything that +wants to create a "fake" socket object. +""" +import io +from socket import SocketIO + + +def backport_makefile( + self, mode="r", buffering=None, encoding=None, errors=None, newline=None +): + """ + Backport of ``socket.makefile`` from Python 3.5. + """ + if not set(mode) <= {"r", "w", "b"}: + raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,)) + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = SocketIO(self, rawmode) + self._makefile_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/six.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/six.py new file mode 100644 index 0000000..ba50acb --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/packages/six.py @@ -0,0 +1,1077 @@ +# Copyright (c) 2010-2020 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""Utilities for writing code that runs on Python 2 and 3""" + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.16.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = (str,) + integer_types = (int,) + class_types = (type,) + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = (basestring,) + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + def __len__(self): + return 1 << 31 + + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + +if PY34: + from importlib.util import spec_from_loader +else: + spec_from_loader = None + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def find_spec(self, fullname, path, target=None): + if fullname in self.known_modules: + return spec_from_loader(fullname, self) + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + + get_source = get_code # same as get_code + + def create_module(self, spec): + return self.load_module(spec.name) + + def exec_module(self, module): + pass + + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute( + "filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse" + ), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute( + "reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload" + ), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute( + "zip_longest", "itertools", "itertools", "izip_longest", "zip_longest" + ), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule( + "collections_abc", + "collections", + "collections.abc" if sys.version_info >= (3, 3) else "collections", + ), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"), + MovedModule( + "_dummy_thread", + "dummy_thread", + "_dummy_thread" if sys.version_info < (3, 9) else "_thread", + ), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule( + "email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart" + ), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute( + "unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes" + ), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module( + Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", + "moves.urllib.parse", +) + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module( + Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", + "moves.urllib.error", +) + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module( + Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", + "moves.urllib.request", +) + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module( + Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", + "moves.urllib.response", +) + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = ( + _urllib_robotparser_moved_attributes +) + +_importer._add_module( + Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", + "moves.urllib.robotparser", +) + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ["parse", "error", "request", "response", "robotparser"] + + +_importer._add_module( + Module_six_moves_urllib(__name__ + ".moves.urllib"), "moves.urllib" +) + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + + def advance_iterator(it): + return it.next() + + +next = advance_iterator + + +try: + callable = callable +except NameError: + + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc( + get_unbound_function, """Get the function out of a possibly unbound function""" +) + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc( + iterlists, "Return an iterator over the (key, [values]) pairs of a dictionary." +) + + +if PY3: + + def b(s): + return s.encode("latin-1") + + def u(s): + return s + + unichr = chr + import struct + + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + + StringIO = io.StringIO + BytesIO = io.BytesIO + del io + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + _assertNotRegex = "assertNotRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" + _assertNotRegex = "assertNotRegex" +else: + + def b(s): + return s + + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r"\\", r"\\\\"), "unicode_escape") + + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + _assertNotRegex = "assertNotRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +def assertNotRegex(self, *args, **kwargs): + return getattr(self, _assertNotRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + + +else: + + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec ("""exec _code_ in _globs_, _locs_""") + + exec_( + """def reraise(tp, value, tb=None): + try: + raise tp, value, tb + finally: + tb = None +""" + ) + + +if sys.version_info[:2] > (3,): + exec_( + """def raise_from(value, from_value): + try: + raise value from from_value + finally: + value = None +""" + ) +else: + + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if ( + isinstance(fp, file) + and isinstance(data, unicode) + and fp.encoding is not None + ): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) + + +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + # This does exactly the same what the :func:`py3:functools.update_wrapper` + # function does on Python versions after 3.2. It sets the ``__wrapped__`` + # attribute on ``wrapper`` object and it doesn't raise an error if any of + # the attributes mentioned in ``assigned`` and ``updated`` are missing on + # ``wrapped`` object. + def _update_wrapper( + wrapper, + wrapped, + assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES, + ): + for attr in assigned: + try: + value = getattr(wrapped, attr) + except AttributeError: + continue + else: + setattr(wrapper, attr, value) + for attr in updated: + getattr(wrapper, attr).update(getattr(wrapped, attr, {})) + wrapper.__wrapped__ = wrapped + return wrapper + + _update_wrapper.__doc__ = functools.update_wrapper.__doc__ + + def wraps( + wrapped, + assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES, + ): + return functools.partial( + _update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated + ) + + wraps.__doc__ = functools.wraps.__doc__ + +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(type): + def __new__(cls, name, this_bases, d): + if sys.version_info[:2] >= (3, 7): + # This version introduced PEP 560 that requires a bit + # of extra care (we mimic what is done by __build_class__). + resolved_bases = types.resolve_bases(bases) + if resolved_bases is not bases: + d["__orig_bases__"] = bases + else: + resolved_bases = bases + return meta(name, resolved_bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + + return type.__new__(metaclass, "temporary_class", (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get("__slots__") + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop("__dict__", None) + orig_vars.pop("__weakref__", None) + if hasattr(cls, "__qualname__"): + orig_vars["__qualname__"] = cls.__qualname__ + return metaclass(cls.__name__, cls.__bases__, orig_vars) + + return wrapper + + +def ensure_binary(s, encoding="utf-8", errors="strict"): + """Coerce **s** to six.binary_type. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> encoded to `bytes` + - `bytes` -> `bytes` + """ + if isinstance(s, binary_type): + return s + if isinstance(s, text_type): + return s.encode(encoding, errors) + raise TypeError("not expecting type '%s'" % type(s)) + + +def ensure_str(s, encoding="utf-8", errors="strict"): + """Coerce *s* to `str`. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + # Optimization: Fast return for the common case. + if type(s) is str: + return s + if PY2 and isinstance(s, text_type): + return s.encode(encoding, errors) + elif PY3 and isinstance(s, binary_type): + return s.decode(encoding, errors) + elif not isinstance(s, (text_type, binary_type)): + raise TypeError("not expecting type '%s'" % type(s)) + return s + + +def ensure_text(s, encoding="utf-8", errors="strict"): + """Coerce *s* to six.text_type. + + For Python 2: + - `unicode` -> `unicode` + - `str` -> `unicode` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if isinstance(s, binary_type): + return s.decode(encoding, errors) + elif isinstance(s, text_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + +def python_2_unicode_compatible(klass): + """ + A class decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if "__str__" not in klass.__dict__: + raise ValueError( + "@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % klass.__name__ + ) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode("utf-8") + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if ( + type(importer).__name__ == "_SixMetaPathImporter" + and importer.name == __name__ + ): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/poolmanager.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/poolmanager.py new file mode 100644 index 0000000..ca4ec34 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/poolmanager.py @@ -0,0 +1,537 @@ +from __future__ import absolute_import + +import collections +import functools +import logging + +from ._collections import RecentlyUsedContainer +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, port_by_scheme +from .exceptions import ( + LocationValueError, + MaxRetryError, + ProxySchemeUnknown, + ProxySchemeUnsupported, + URLSchemeUnknown, +) +from .packages import six +from .packages.six.moves.urllib.parse import urljoin +from .request import RequestMethods +from .util.proxy import connection_requires_http_tunnel +from .util.retry import Retry +from .util.url import parse_url + +__all__ = ["PoolManager", "ProxyManager", "proxy_from_url"] + + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ( + "key_file", + "cert_file", + "cert_reqs", + "ca_certs", + "ssl_version", + "ca_cert_dir", + "ssl_context", + "key_password", + "server_hostname", +) + +# All known keyword arguments that could be provided to the pool manager, its +# pools, or the underlying connections. This is used to construct a pool key. +_key_fields = ( + "key_scheme", # str + "key_host", # str + "key_port", # int + "key_timeout", # int or float or Timeout + "key_retries", # int or Retry + "key_strict", # bool + "key_block", # bool + "key_source_address", # str + "key_key_file", # str + "key_key_password", # str + "key_cert_file", # str + "key_cert_reqs", # str + "key_ca_certs", # str + "key_ssl_version", # str + "key_ca_cert_dir", # str + "key_ssl_context", # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext + "key_maxsize", # int + "key_headers", # dict + "key__proxy", # parsed proxy url + "key__proxy_headers", # dict + "key__proxy_config", # class + "key_socket_options", # list of (level (int), optname (int), value (int or str)) tuples + "key__socks_options", # dict + "key_assert_hostname", # bool or string + "key_assert_fingerprint", # str + "key_server_hostname", # str +) + +#: The namedtuple class used to construct keys for the connection pool. +#: All custom key schemes should include the fields in this key at a minimum. +PoolKey = collections.namedtuple("PoolKey", _key_fields) + +_proxy_config_fields = ("ssl_context", "use_forwarding_for_https") +ProxyConfig = collections.namedtuple("ProxyConfig", _proxy_config_fields) + + +def _default_key_normalizer(key_class, request_context): + """ + Create a pool key out of a request context dictionary. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + :type key_class: namedtuple + :param request_context: + A dictionary-like object that contain the context for a request. + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey + """ + # Since we mutate the dictionary, make a copy first + context = request_context.copy() + context["scheme"] = context["scheme"].lower() + context["host"] = context["host"].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ("headers", "_proxy_headers", "_socks_options"): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get("socket_options") + if socket_opts is not None: + context["socket_options"] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context["key_" + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + + return key_class(**context) + + +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. +key_fn_by_scheme = { + "http": functools.partial(_default_key_normalizer, PoolKey), + "https": functools.partial(_default_key_normalizer, PoolKey), +} + +pool_classes_by_scheme = {"http": HTTPConnectionPool, "https": HTTPSConnectionPool} + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \\**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example:: + + >>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + proxy = None + proxy_config = None + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, dispose_func=lambda p: p.close()) + + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.clear() + # Return False to re-raise any potential exceptions + return False + + def _new_pool(self, scheme, host, port, request_context=None): + """ + Create a new :class:`urllib3.connectionpool.ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. + + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. This method is used to actually create the + connection pools handed out by :meth:`connection_from_url` and + companion methods. It is intended to be overridden for customization. + """ + pool_cls = self.pool_classes_by_scheme[scheme] + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ("scheme", "host", "port"): + request_context.pop(key, None) + + if scheme == "http": + for kw in SSL_KEYWORDS: + request_context.pop(kw, None) + + return pool_cls(host, port, **request_context) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme="http", pool_kwargs=None): + """ + Get a :class:`urllib3.connectionpool.ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. + """ + + if not host: + raise LocationValueError("No host specified.") + + request_context = self._merge_pool_kwargs(pool_kwargs) + request_context["scheme"] = scheme or "http" + if not port: + port = port_by_scheme.get(request_context["scheme"].lower(), 80) + request_context["port"] = port + request_context["host"] = host + + return self.connection_from_context(request_context) + + def connection_from_context(self, request_context): + """ + Get a :class:`urllib3.connectionpool.ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + scheme = request_context["scheme"].lower() + pool_key_constructor = self.key_fn_by_scheme.get(scheme) + if not pool_key_constructor: + raise URLSchemeUnknown(scheme) + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key, request_context=request_context) + + def connection_from_pool_key(self, pool_key, request_context=None): + """ + Get a :class:`urllib3.connectionpool.ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + scheme = request_context["scheme"] + host = request_context["host"] + port = request_context["port"] + pool = self._new_pool(scheme, host, port, request_context=request_context) + self.pools[pool_key] = pool + + return pool + + def connection_from_url(self, url, pool_kwargs=None): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. + """ + u = parse_url(url) + return self.connection_from_host( + u.host, port=u.port, scheme=u.scheme, pool_kwargs=pool_kwargs + ) + + def _merge_pool_kwargs(self, override): + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs + + def _proxy_requires_url_absolute_form(self, parsed_url): + """ + Indicates if the proxy requires the complete destination URL in the + request. Normally this is only needed when not using an HTTP CONNECT + tunnel. + """ + if self.proxy is None: + return False + + return not connection_requires_http_tunnel( + self.proxy, self.proxy_config, parsed_url.scheme + ) + + def _validate_proxy_scheme_url_selection(self, url_scheme): + """ + Validates that were not attempting to do TLS in TLS connections on + Python2 or with unsupported SSL implementations. + """ + if self.proxy is None or url_scheme != "https": + return + + if self.proxy.scheme != "https": + return + + if six.PY2 and not self.proxy_config.use_forwarding_for_https: + raise ProxySchemeUnsupported( + "Contacting HTTPS destinations through HTTPS proxies " + "'via CONNECT tunnels' is not supported in Python 2" + ) + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + self._validate_proxy_scheme_url_selection(u.scheme) + + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw["assert_same_host"] = False + kw["redirect"] = False + + if "headers" not in kw: + kw["headers"] = self.headers.copy() + + if self._proxy_requires_url_absolute_form(u): + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + # RFC 7231, Section 6.4.4 + if response.status == 303: + method = "GET" + + retries = kw.get("retries") + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + # Strip headers marked as unsafe to forward to the redirected location. + # Check remove_headers_on_redirect to avoid a potential network call within + # conn.is_same_host() which may use socket.gethostbyname() in the future. + if retries.remove_headers_on_redirect and not conn.is_same_host( + redirect_location + ): + headers = list(six.iterkeys(kw["headers"])) + for header in headers: + if header.lower() in retries.remove_headers_on_redirect: + kw["headers"].pop(header, None) + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + response.drain_conn() + raise + return response + + kw["retries"] = retries + kw["redirect"] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) + + response.drain_conn() + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary containing headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + :param proxy_ssl_context: + The proxy SSL context is used to establish the TLS connection to the + proxy when using HTTPS proxies. + + :param use_forwarding_for_https: + (Defaults to False) If set to True will forward requests to the HTTPS + proxy to be made on behalf of the client instead of creating a TLS + tunnel via the CONNECT method. **Enabling this flag means that request + and response headers and content will be visible from the HTTPS proxy** + whereas tunneling keeps request and response headers and content + private. IP address, target hostname, SNI, and port are always visible + to an HTTPS proxy even when this flag is disabled. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__( + self, + proxy_url, + num_pools=10, + headers=None, + proxy_headers=None, + proxy_ssl_context=None, + use_forwarding_for_https=False, + **connection_pool_kw + ): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = "%s://%s:%i" % ( + proxy_url.scheme, + proxy_url.host, + proxy_url.port, + ) + proxy = parse_url(proxy_url) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + self.proxy_ssl_context = proxy_ssl_context + self.proxy_config = ProxyConfig(proxy_ssl_context, use_forwarding_for_https) + + connection_pool_kw["_proxy"] = self.proxy + connection_pool_kw["_proxy_headers"] = self.proxy_headers + connection_pool_kw["_proxy_config"] = self.proxy_config + + super(ProxyManager, self).__init__(num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme="http", pool_kwargs=None): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs + ) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs + ) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {"Accept": "*/*"} + + netloc = parse_url(url).netloc + if netloc: + headers_["Host"] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + if not connection_requires_http_tunnel(self.proxy, self.proxy_config, u.scheme): + # For connections using HTTP CONNECT, httplib sets the necessary + # headers on the CONNECT to the proxy. If we're not using CONNECT, + # we'll definitely need to set 'Host' at the very least. + headers = kw.get("headers", self.headers) + kw["headers"] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/request.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/request.py new file mode 100644 index 0000000..398386a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/request.py @@ -0,0 +1,170 @@ +from __future__ import absolute_import + +from .filepost import encode_multipart_formdata +from .packages.six.moves.urllib.parse import urlencode + +__all__ = ["RequestMethods"] + + +class RequestMethods(object): + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`urllib3.HTTPConnectionPool` and + :class:`urllib3.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-form-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = {"DELETE", "GET", "HEAD", "OPTIONS"} + + def __init__(self, headers=None): + self.headers = headers or {} + + def urlopen( + self, + method, + url, + body=None, + headers=None, + encode_multipart=True, + multipart_boundary=None, + **kw + ): # Abstract + raise NotImplementedError( + "Classes extending RequestMethods must implement " + "their own ``urlopen`` method." + ) + + def request(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + """ + method = method.upper() + + urlopen_kw["request_url"] = url + + if method in self._encode_url_methods: + return self.request_encode_url( + method, url, fields=fields, headers=headers, **urlopen_kw + ) + else: + return self.request_encode_body( + method, url, fields=fields, headers=headers, **urlopen_kw + ) + + def request_encode_url(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + """ + if headers is None: + headers = self.headers + + extra_kw = {"headers": headers} + extra_kw.update(urlopen_kw) + + if fields: + url += "?" + urlencode(fields) + + return self.urlopen(method, url, **extra_kw) + + def request_encode_body( + self, + method, + url, + fields=None, + headers=None, + encode_multipart=True, + multipart_boundary=None, + **urlopen_kw + ): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :func:`urllib3.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise + :func:`urllib.parse.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request + signing, such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example:: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimic behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if headers is None: + headers = self.headers + + extra_kw = {"headers": {}} + + if fields: + if "body" in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one." + ) + + if encode_multipart: + body, content_type = encode_multipart_formdata( + fields, boundary=multipart_boundary + ) + else: + body, content_type = ( + urlencode(fields), + "application/x-www-form-urlencoded", + ) + + extra_kw["body"] = body + extra_kw["headers"] = {"Content-Type": content_type} + + extra_kw["headers"].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/response.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/response.py new file mode 100644 index 0000000..fdb50dd --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/response.py @@ -0,0 +1,824 @@ +from __future__ import absolute_import + +import io +import logging +import zlib +from contextlib import contextmanager +from socket import error as SocketError +from socket import timeout as SocketTimeout + +try: + try: + import brotlicffi as brotli + except ImportError: + import brotli +except ImportError: + brotli = None + +from ._collections import HTTPHeaderDict +from .connection import BaseSSLError, HTTPException +from .exceptions import ( + BodyNotHttplibCompatible, + DecodeError, + HTTPError, + IncompleteRead, + InvalidChunkLength, + InvalidHeader, + ProtocolError, + ReadTimeoutError, + ResponseNotChunked, + SSLError, +) +from .packages import six +from .util.response import is_fp_closed, is_response_to_head + +log = logging.getLogger(__name__) + + +class DeflateDecoder(object): + def __init__(self): + self._first_try = True + self._data = b"" + self._obj = zlib.decompressobj() + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None + return decompressed + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None + + +class GzipDecoderState(object): + + FIRST_MEMBER = 0 + OTHER_MEMBERS = 1 + SWALLOW_DATA = 2 + + +class GzipDecoder(object): + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + self._state = GzipDecoderState.FIRST_MEMBER + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + ret = bytearray() + if self._state == GzipDecoderState.SWALLOW_DATA or not data: + return bytes(ret) + while True: + try: + ret += self._obj.decompress(data) + except zlib.error: + previous_state = self._state + # Ignore data after the first error + self._state = GzipDecoderState.SWALLOW_DATA + if previous_state == GzipDecoderState.OTHER_MEMBERS: + # Allow trailing garbage acceptable in other gzip clients + return bytes(ret) + raise + data = self._obj.unused_data + if not data: + return bytes(ret) + self._state = GzipDecoderState.OTHER_MEMBERS + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + +if brotli is not None: + + class BrotliDecoder(object): + # Supports both 'brotlipy' and 'Brotli' packages + # since they share an import name. The top branches + # are for 'brotlipy' and bottom branches for 'Brotli' + def __init__(self): + self._obj = brotli.Decompressor() + if hasattr(self._obj, "decompress"): + self.decompress = self._obj.decompress + else: + self.decompress = self._obj.process + + def flush(self): + if hasattr(self._obj, "flush"): + return self._obj.flush() + return b"" + + +class MultiDecoder(object): + """ + From RFC7231: + If one or more encodings have been applied to a representation, the + sender that applied the encodings MUST generate a Content-Encoding + header field that lists the content codings in the order in which + they were applied. + """ + + def __init__(self, modes): + self._decoders = [_get_decoder(m.strip()) for m in modes.split(",")] + + def flush(self): + return self._decoders[0].flush() + + def decompress(self, data): + for d in reversed(self._decoders): + data = d.decompress(data) + return data + + +def _get_decoder(mode): + if "," in mode: + return MultiDecoder(mode) + + if mode == "gzip": + return GzipDecoder() + + if brotli is not None and mode == "br": + return BrotliDecoder() + + return DeflateDecoder() + + +class HTTPResponse(io.IOBase): + """ + HTTP Response container. + + Backwards-compatible with :class:`http.client.HTTPResponse` but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in :class:`http.client.HTTPResponse`: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param original_response: + When this HTTPResponse wrapper is generated from an :class:`http.client.HTTPResponse` + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + + :param retries: + The retries contains the last :class:`~urllib3.util.retry.Retry` that + was used during the request. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + + CONTENT_DECODERS = ["gzip", "deflate"] + if brotli is not None: + CONTENT_DECODERS += ["br"] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + def __init__( + self, + body="", + headers=None, + status=0, + version=0, + reason=None, + strict=0, + preload_content=True, + decode_content=True, + original_response=None, + pool=None, + connection=None, + msg=None, + retries=None, + enforce_content_length=False, + request_method=None, + request_url=None, + auto_close=True, + ): + + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) + self.status = status + self.version = version + self.reason = reason + self.strict = strict + self.decode_content = decode_content + self.retries = retries + self.enforce_content_length = enforce_content_length + self.auto_close = auto_close + + self._decoder = None + self._body = None + self._fp = None + self._original_response = original_response + self._fp_bytes_read = 0 + self.msg = msg + self._request_url = request_url + + if body and isinstance(body, (six.string_types, bytes)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, "read"): + self._fp = body + + # Are we using the chunked-style of transfer encoding? + self.chunked = False + self.chunk_left = None + tr_enc = self.headers.get("transfer-encoding", "").lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + # Determine length of response + self.length_remaining = self._init_length(request_method) + + # If requested, preload the body. + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get("location") + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + def drain_conn(self): + """ + Read and discard any remaining HTTP response data in the response connection. + + Unread data in the HTTPResponse connection blocks the connection from being released back to the pool. + """ + try: + self.read() + except (HTTPError, SocketError, BaseSSLError, HTTPException): + pass + + @property + def data(self): + # For backwards-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + @property + def connection(self): + return self._connection + + def isclosed(self): + return is_fp_closed(self._fp) + + def tell(self): + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``urllib3.response.HTTPResponse.read`` + if bytes are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def _init_length(self, request_method): + """ + Set initial length value for Response content if available. + """ + length = self.headers.get("content-length") + + if length is not None: + if self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning( + "Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked." + ) + return None + + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = set([int(val) for val in length.split(",")]) + if len(lengths) > 1: + raise InvalidHeader( + "Content-Length contained multiple " + "unmatching values (%s)" % length + ) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + # Convert status to int for comparison + # In some cases, httplib returns a status of "_UNKNOWN" + try: + status = int(self.status) + except ValueError: + status = 0 + + # Check for responses that shouldn't include a body + if status in (204, 304) or 100 <= status < 200 or request_method == "HEAD": + length = 0 + + return length + + def _init_decoder(self): + """ + Set-up the _decoder attribute if necessary. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get("content-encoding", "").lower() + if self._decoder is None: + if content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + elif "," in content_encoding: + encodings = [ + e.strip() + for e in content_encoding.split(",") + if e.strip() in self.CONTENT_DECODERS + ] + if len(encodings): + self._decoder = _get_decoder(content_encoding) + + DECODER_ERROR_CLASSES = (IOError, zlib.error) + if brotli is not None: + DECODER_ERROR_CLASSES += (brotli.error,) + + def _decode(self, data, decode_content, flush_decoder): + """ + Decode the data passed in and potentially flush the decoder. + """ + if not decode_content: + return data + + try: + if self._decoder: + data = self._decoder.decompress(data) + except self.DECODER_ERROR_CLASSES as e: + content_encoding = self.headers.get("content-encoding", "").lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, + e, + ) + if flush_decoder: + data += self._flush_decoder() + + return data + + def _flush_decoder(self): + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + buf = self._decoder.decompress(b"") + return buf + self._decoder.flush() + + return b"" + + @contextmanager + def _error_catcher(self): + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, "Read timed out.") + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if "read operation timed out" not in str(e): + # SSL errors related to framing/MAC get wrapped and reraised here + raise SSLError(e) + + raise ReadTimeoutError(self._pool, None, "Read timed out.") + + except (HTTPException, SocketError) as e: + # This includes IncompleteRead. + raise ProtocolError("Connection broken: %r" % e, e) + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`http.client.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + self._init_decoder() + if decode_content is None: + decode_content = self.decode_content + + if self._fp is None: + return + + flush_decoder = False + fp_closed = getattr(self._fp, "closed", False) + + with self._error_catcher(): + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() if not fp_closed else b"" + flush_decoder = True + else: + cache_content = False + data = self._fp.read(amt) if not fp_closed else b"" + if ( + amt != 0 and not data + ): # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + if self.enforce_content_length and self.length_remaining not in ( + 0, + None, + ): + # This is an edge case that httplib failed to cover due + # to concerns of backward compatibility. We're + # addressing it here to make sure IncompleteRead is + # raised during streaming, so all calls with incorrect + # Content-Length are caught. + raise IncompleteRead(self._fp_bytes_read, self.length_remaining) + + if data: + self._fp_bytes_read += len(data) + if self.length_remaining is not None: + self.length_remaining -= len(data) + + data = self._decode(data, decode_content, flush_decoder) + + if cache_content: + self._body = data + + return data + + def stream(self, amt=2 ** 16, decode_content=None): + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if self.chunked and self.supports_chunked_reads(): + for line in self.read_chunked(amt, decode_content=decode_content): + yield line + else: + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`http.client.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + headers = r.msg + + if not isinstance(headers, HTTPHeaderDict): + if six.PY2: + # Python 2.7 + headers = HTTPHeaderDict.from_httplib(headers) + else: + headers = HTTPHeaderDict(headers.items()) + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, "strict", 0) + resp = ResponseCls( + body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw + ) + return resp + + # Backwards-compatibility methods for http.client.HTTPResponse + def getheaders(self): + return self.headers + + def getheader(self, name, default=None): + return self.headers.get(name, default) + + # Backwards compatibility for http.cookiejar + def info(self): + return self.headers + + # Overrides from io.IOBase + def close(self): + if not self.closed: + self._fp.close() + + if self._connection: + self._connection.close() + + if not self.auto_close: + io.IOBase.close(self) + + @property + def closed(self): + if not self.auto_close: + return io.IOBase.closed.__get__(self) + elif self._fp is None: + return True + elif hasattr(self._fp, "isclosed"): + return self._fp.isclosed() + elif hasattr(self._fp, "closed"): + return self._fp.closed + else: + return True + + def fileno(self): + if self._fp is None: + raise IOError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise IOError( + "The file-like object this HTTPResponse is wrapped " + "around has no file descriptor" + ) + + def flush(self): + if ( + self._fp is not None + and hasattr(self._fp, "flush") + and not getattr(self._fp, "closed", False) + ): + return self._fp.flush() + + def readable(self): + # This method is required for `io` module compatibility. + return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[: len(temp)] = temp + return len(temp) + + def supports_chunked_reads(self): + """ + Checks if the underlying file-like object looks like a + :class:`http.client.HTTPResponse` object. We do this by testing for + the fp attribute. If it is present we assume it returns raw chunks as + processed by read_chunked(). + """ + return hasattr(self._fp, "fp") + + def _update_chunk_length(self): + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return + line = self._fp.fp.readline() + line = line.split(b";", 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + # Invalid chunked protocol response, abort. + self.close() + raise InvalidChunkLength(self, line) + + def _handle_chunk(self, amt): + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) + returned_chunk = chunk + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif amt < self.chunk_left: + value = self._fp._safe_read(amt) + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk + + def read_chunked(self, amt=None, decode_content=None): + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing." + ) + if not self.supports_chunked_reads(): + raise BodyNotHttplibCompatible( + "Body should be http.client.HTTPResponse like. " + "It should have have an fp attribute which returns raw chunks." + ) + + with self._error_catcher(): + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + # If a response is already read and closed + # then return immediately. + if self._fp.fp is None: + return + + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode( + chunk, decode_content=decode_content, flush_decoder=False + ) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while True: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b"\r\n": + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() + + def geturl(self): + """ + Returns the URL that was the source of this response. + If the request that generated this response redirected, this method + will return the final redirect location. + """ + if self.retries is not None and len(self.retries.history): + return self.retries.history[-1].redirect_location + else: + return self._request_url + + def __iter__(self): + buffer = [] + for chunk in self.stream(decode_content=True): + if b"\n" in chunk: + chunk = chunk.split(b"\n") + yield b"".join(buffer) + chunk[0] + b"\n" + for x in chunk[1:-1]: + yield x + b"\n" + if chunk[-1]: + buffer = [chunk[-1]] + else: + buffer = [] + else: + buffer.append(chunk) + if buffer: + yield b"".join(buffer) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__init__.py new file mode 100644 index 0000000..4547fc5 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__init__.py @@ -0,0 +1,49 @@ +from __future__ import absolute_import + +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import SKIP_HEADER, SKIPPABLE_HEADERS, make_headers +from .response import is_fp_closed +from .retry import Retry +from .ssl_ import ( + ALPN_PROTOCOLS, + HAS_SNI, + IS_PYOPENSSL, + IS_SECURETRANSPORT, + PROTOCOL_TLS, + SSLContext, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import Timeout, current_time +from .url import Url, get_host, parse_url, split_first +from .wait import wait_for_read, wait_for_write + +__all__ = ( + "HAS_SNI", + "IS_PYOPENSSL", + "IS_SECURETRANSPORT", + "SSLContext", + "PROTOCOL_TLS", + "ALPN_PROTOCOLS", + "Retry", + "Timeout", + "Url", + "assert_fingerprint", + "current_time", + "is_connection_dropped", + "is_fp_closed", + "get_host", + "parse_url", + "make_headers", + "resolve_cert_reqs", + "resolve_ssl_version", + "split_first", + "ssl_wrap_socket", + "wait_for_read", + "wait_for_write", + "SKIP_HEADER", + "SKIPPABLE_HEADERS", +) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40999040e7a988303a14158b5339928f8230283c GIT binary patch literal 1099 zcmZ9LTW`}a6vvZZmR{29E_94L5>g*nhW3gOWmIBfYOAJuz!I{u#@nLVaj>0@J@Z9) zxfoY?MN~;utdTY05wFNqc}>(wy%?|YhG>#zG4{AGTBIe~q%At6 zBf6w3dZZ`%q%YRVy4WBaVv}r&EwWX-U*osLfDFVo*)HNbzb$sij<`eah`Z#jxJT|4 z`3Ao)9*_s(A$bUKlRS$3&>6OVfO2Q(+D>$$CC?3`iO8ffKir%AW}@j*rYT#RM5Z)W zGRs&zEZb)I_Hahuj7P7>bKApUHhOh5{+$V}FQN-Z&sh{RrQrY{HagAdl1mNiU0aFnKfHlBpxk?lhijt`FKYN&z4uwu){ird;5GxS_)W9wO@G^05rn>ynO z3Q!t%XkA4ZNd*T-v2FhiuT)~#aG;t{Z{;Iehz_ESz$>Wghz-ORqKnu>z_oN#4RH%G zKzN8AqL0`{tRrqCb`Vv>8elSfY#WrG<|bE+QiWIAHdY-k4zM0nD`(oQ))j}?8q_b7 zDU=!|*s8*w7GiA$t9T>+KWl}n!e3!yB@{JU4=W3$zHy5lZ5ir$<9p>1P1y=oaplT- zlt!FW`o&RCV7|c5_rWpf(?OanWgwC?fhL@>{eY#HIxy#OLG+1?R2=Z+B*?DKxlH$W zpX~)2`tmf3mKV_((*a0;`TZa_2@fcRZ49Nm*|n`b7c$N{dx0N}#uoXGU*2$i`0cq} Kf8ciATIm<7z$9D% literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/connection.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/connection.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3cfd520ebd468dc15d5d7424010a87c9090661f GIT binary patch literal 3427 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/request.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/request.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa2c4cb714d026c803cf44688982a5d9587010b7 GIT binary patch literal 3516 zcmbtXTW=f372a7cmlu(`rFM&^mxm;zoO6 zXJ$>4rO-CYujrHAxBh^>_jl}Tfdcslg#uJPXOlnM?=4n3HtL(- zz%7hAN!Q$-jDtjR#}9|GP%u^MJ-E*!FJ}B3Gh1})c_jGAkC@vF_>-88J3_>wZlMVB@h5vn&c~gdr=3sXtDd`9b3Km_RZ~m#qm$Gc#8O?96Ujx> zJ>ij>R8A)Tu)%mga1}q8Y3>~0d0k+I zH{^!~aErjTL}$jeZg5M$&5KW18CI?UZG&+u?h2?{rtlmOz@}cJB<;t7!cDnw6e5~u2i%PsH1MTrP*7JY0jjpHRG6Pnm2e}8 zKuM}%T3d#$wphLoa_Gnp0=T!LU&emK8SRa!7l)y{Saz&W$rgel;1i6xk`6`u(r27q zzXp1YqdjJEgP8!qhk{G+B{Z)ZXh}2gqT@KBBR7I;$;2Cg_^Uf@4aaH_N6kb8f#18= zzT0}Rbq$N2D}B##6E#?zxElwsMRG(-fx4(wZ;ZFc~L`n;! ztyZgcr39|{PSn5%ug1>zS3%2Zeh)>MFEREV&-DiX$0>0|6I@e?IM}99+|+w+cxC66 z8x8}$y`9+_9sJRwM>KR#xibri_ZCs`A^Lqon>hpj!>uQ-3f-vve(Ua5{mPENUkZuZ zHm#wASx_`+ZINw|w-8V}yAtqUI@|~wt;q6uHxe5Pz7`Fc=nK*iSU&`om`Qn|R$5-f z@Wg(Cu0|*MMD?2w)9N+2CU1QQhLhslypyW7^4#wAVp{g4A4%m#9#3-+$*F~Lomv=& z>DtcjZs+Kk(>d5Ze7bk=8<9ipFyE#&*$oJxQ=tn*z$`gLC&7+sHtp*UxvKPC8wIMv) zS+L$~y??hYeZ`wY*E@x5AlvisO_U$BXSuaC9H*6KkNPQ`CtEOBzp_Y~nDADJWfqs- z9|LU>o0yljS^T$UAy42w4@=?vLAnI5E=HdLF(r&7M65so0{Yw}FdiF!2cM>GcrOpcwfQVrRr_kceHScsNwJRshV9sFvhnh3Y3N5ju5d z5)M*J@gS(%=}OiCI6Wx;X#p}i$P(gbaQU>bcc>eJv~YNw5i8C|JA3<`r_Vb3`_Lv> zdQ%Q=pfS&epWxOF$(4iZJM-&tn3g|+p_nfdtF-(*4GwhP zD>w%5fiN(_%=6rtIW?IH(A)tqh{E3B4!~dnNQ6LB#mr-9D`qgfJBNWm5AYQikFM~`40|N}&=r0# z&I%sde%=xY&U`=zdIlE+2@ds<-)Im}`l1|t1omqN{wb$%?@QR2`GHJ^*w9HTIX}H# zMZrN(orQ#>xo?5SxEwVHl@XXs-PFSAgUQZLL^(EpH1@nifU0yf;1Otvw_a{+v;nef zW!HhQRAStkeEK}XQnKWO+I{Ev>zesL#IXb$60qsqM01(<@icTH8Ya+mKpPSFDK?~V z3*DVIfRGA$E$Ty00`0{wWUF2h6r4q@;(-07cn60q9P&843qxA|%ncHrxwVBN>p5`; z8O8aT&@kiaXrLSJEq)FQNAOAtLuF+Xa?UDQhtVX~rFmJjW)!;mrCwdP5A;*Not7OZ z3rEKhm~m1Y@+^OFUnlFd%wJ(o4GBSNZM&6uGHglzmCoh*Qt8T4JD!&MBA)OFqAuOQ z`J@ek?ZOly12vViovazwdW%IY|U%lR06`5(v_am9FgR{}nQ$*t1DHb3Sb~ zoicTx>Psz|1#`a8pyH&k%V4maZJOF> N$c4;sQT({F`5#8L=%@ey literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/response.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/response.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd831dd897beadc88789d714a4ebba12bb622cd8 GIT binary patch literal 2347 zcmZuyPjB2r6!(n1UT3pON-6{r2!?`GR#0zIB!sG{B5i}xL(`~9i&&{Fv-a%nG`7c` z8K>E>ximd+;lMXYj(h<4Furo?2jGHK%A4^ze_Fhn*_rod-g|!U_j?u#3oQqp`+pn{ z{#Qq)7ptZ{-5)b)Mi; z-G>)+KIq&S6=!$5wO)HMK0?pILdQMOEdtN&F^hH;c{XNx%p{>?#P?W6hCE@{628lb z7(9WOCR~vy5sJlO%ig;IDWa*--mrUPYiG>fzNiI>jE~SB+dSwz%;+Ft1mrQ(Or|_z zr|yUOIY*sF8E{p3Ef?3cmV5xUvdJv{nH&%Evh|22MJ0zMyAadwj$DK+{`0u|P%){x z8IMF4Jn^BBBev3I*`Dg^F_cCP1eI|&;e&2I(PNRVgkN3nDz4eJoJPBJ#8kJC3Fue4 zh2}|DGL?%=u`r*MZLa!5Q&5wbIa50V6AoH#8+i!7#%_S?RU2d&1sK1Qm*CKa@;5+W zhAsauu+YvFiv9#2VYQ^8n8%(5KpdeHWXh+Z#4(QDBloacdv*i2rP)QOpwkTI*O!pWWFaVA!qKGLqERtkG03#ML1{~}ATG9yavn&F>K;>CX zm?4HDLn%@M_#=>9pdS%Kdlkx4dzhi_eg;;b2?>Z58QHQ0BP$mnX*d>E91AygcDC+8 zI8esg(hX8kQyB#AG0BIM`o5%GF-2zO4%vRha>IKSzRl({)ZaY|cJ?|{0uM}2s4#zU zh3)6SA$VUC8$c!ei)X`*ftlnSe$@;Ffe@f=-9S>!n|LwPdNLB~X^F z)r2b@i8R0Y0QSlN)^{)l{2Elh!pMJp(4iI({R#sRv2AtXY9b<;smyN+hGgZ1u zOKFk>&7(O(r*$ruK`7s|4rj@I^R3_g-xvBEuBa<8wU?Gr+t3+%C~$qW2>%}P+Zg-* z1_8)l%TM9hTO~8;w#5Dn7SNj=C>Rh<8#=b9C`P+btSLHnPk_{B4ZZnq%eXgsb48G+ z1yhzG)Ud_2BA}nD*hk66`r4gqlG#%g{5EJ7Cje`6{b|81cZOsw&)2gN^xhi$RX=}| zJP&FYwXZYWpQ`E(Px#O}5t4&p_+kQmXOWzKA`0jS=C0(OHsoYJ2iGVT5xf-gg7uFv$fups>rjwth$^;<0favRAn zV6)j-C|mvhu+W8M{k}9T>$O=*c@kE9wuG_NDO+bf!J@3UTz@1&#rMNh>@g*qU_rib oCc_&G3hU_{-fXm%YQbtM;v!+D%{t1++s-9ya2B}1$L+8G19zc^bN~PV literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/retry.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/retry.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2db7ebf245d6657b304d858b2a556f87ea96d378 GIT binary patch literal 16132 zcmcIr+jAS&ea2pJAxMH3Q5V~?vvK5*a3qknnlxo4JG4YvN+il9X*)sUfJ^Lx1O;H3 zvkOs#!6p+amubhDCX<=IG&5A17fmNGo#{-cPyH8qdD_>$)K8sG9@=D*s^53c?&3l! zZpJAvID7W&IcLxL-7g2;_;@~r&z-+J+WOD8Q>lOBP5&p2n=jz!|1%0Fv}^k>+))p4S6-oro5)hX?e|*Gq@U!Y%^ER$uVYQq?s@0QBOOW#%Ob_Jk}g9k2eeD zLUW=#(VQ$#HmAx{&FS*A?2~PrYR;5rw3KTcop#SW(#mJuoRiy5IU_&S9_ZzB?lTWk z{DS*}Q+S}cFH}C^=%PUvmR-5IucMc!5{-8tOKW+xyX@$u*1^ zoNCSW_q>+x%FbAV;n(kng*EpZZPyQO)cwE{2gP)lX}ZCV=Y®{Uqimyz)UJ81ji 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95282c397be60e1eb14a02e64769794706bc111d GIT binary patch literal 3251 zcmZ`*-*42&9rujwUGHWSLPWXJqw0tX%BEo#Na0SXtuBIaqIZ{Y1gM(hYB`?S#Kdcx znOR_0PE{RLYE|`b=;pCced<3muYKaRk0-VCGj=u?P;1NM`SG3ke&;*i@8>i5{CwNN zv-ywd&hO4T&OdGA7-HB+->*QPB!N`!W(}`9Q$&* z?f%Be$P0(N+y18x_qhMs;l60Ra<`lO6mRn2HQ5e$i??4p+burFJNUQxJYT?nj?*ot zyEysP!#%-T#-zF0yV1MayB6E#$%mlv2|m?9AslSd*`}Pp3~Cl{3#pSq5=UCB zOPR}!u4{rYwDyFdX@}u3=cCltJ7M^26s7gZ-yGS%YE|*=ZvT-IQuVVW&ilh8O9r{z z6{~%bJy(6b2RqeH9!cI$lbwE1ZECf5?P^~oT3jijct6?|sy~t`##j3zouqxG((qmH z^op^hQ29N(6Awk;c%cMPC}xj6d~4oqeCl5)cAW#abQBJC%PE~H4)Ks2c%{eP zbIyT}KMwH^6!k{wPYG{ev{^Pwy6?$Ln)0T`>{sLieBY3=sjgxT@6aiUE%$MtrOzAt zRNgAxsn3H$LY(YJSgFBVheX|hTvd}_*m2#Q2Bm*UDyh!No+(0x&mF=x;*^a$&e!dO z;CLLX+Wu!>VSbx;`22LPbPr(@U--b$&8MA1deACc)A#8OEMOJ7j5j$#ul@|bc;>=uYTM6 z`ll1`Wp?Gtgg#lWJC;#h!`H*N-CZ!gD$+z7Kh8&)u1?-~QWVnoY5qb;(};>fWZbls zj-*yE61``r6s93m92LSeA)H1rDset6l2jP)X`W=Jeecta%?InZ*S6M;Uj<#aZ79!7 zFw0CcKa5_6$2&1z5ou-o!m2SrDh7Ip95yW}hEbAn*wQ*7Jdn|@aWUn)l#xw1$}EID zQ&m1yTF;?Rt)TFHk9ef*1*AjTG$7P(6Ys6(FOtCTxM#?c|9v-bm&keACh`I%#Mb$< z$JTv(Rq$UzMI+=jc}3-EO`p1)>^rD=C6a)<-201rfN=zjztJUcY!(?mQgM=)hSD;L zHBcfDS)AMWfiEpcsIG6?2>=M5&friNk|@T?be;nU0AOK~4RX^QSxDfbON^WEJbi!v zbD_?|BauxgRyJqPkOhjw?x7mne4jnmGMo0*wtj$$cBVvAo0n7f&_Tx1l9t3~W0y?+ zxc)MVbq%mK?(+e=cb`R^OADi_S4aCS6_|L5(25hCjv3E|%6_657lR}dEXr7v?&cD~ zG-SXv20T+$s$8C>&$Zr1z3c1>yRbRZR?$|R7ve&Da+s0{Vf*1A4YX{$n{R{|>oMNlKT`pM$@S#^?Bg^=$W4)P=Jj3z-bY2$)E- zWs7{v>@qNr3!4($1{2brMT$wGM>0d#&bW#hkos00?+e}A6}k{Y+R2x@-8!6w!jgh5 z&%kN9$0|&}{_(Ys5w83g;H$MH$Xl^U3g}BMPVyDDgE&2z4b^a#!H?P02Nk)32)ah_@MQiE>v9up{pWVhEJJPbGQKfJfOvG%zYtU4a7 zfBER%gY`QbWx8eCKpy22*s|G(@-S&`@D7uY-~Oy-45a2>;zX6mf%@7l@+iAdoJ@SZ){ zQO3KcO#5+^j_PZi?888L)fN^>P3KXK#MK?oEUamu4#J=oHZJ0omjwRZew&}N>rd?%; z(6`>(j&}z0?V9o~6m&^-LFsl(GYokihoL-;Zno7BSZ&>6~*It?n!x@`}@|Kmc yd{q0%I<@jsweX1@S_-S#J@|Qjb^fI#WOW{e=LA03{AepM&|P%F@;8HKr}JMF$ZA*s literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/ssltransport.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/ssltransport.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee8b42e177ea45ecfcb4967c48bcb4c61c2fac0c GIT binary patch literal 7389 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 b-q0L-69LMRB)Da#;w}5jUfEyu&zAlJBLg}* literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/url.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/__pycache__/url.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3a5861c2c85879360ad250bab8617565edd6b83 GIT binary patch literal 10650 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/connection.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/connection.py new file mode 100644 index 0000000..6af1138 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/connection.py @@ -0,0 +1,149 @@ +from __future__ import absolute_import + +import socket + +from ..contrib import _appengine_environ +from ..exceptions import LocationParseError +from ..packages import six +from .wait import NoWayToWaitForSocketError, wait_for_read + + +def is_connection_dropped(conn): # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`http.client.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, "sock", False) + if sock is False: # Platform-specific: AppEngine + return False + if sock is None: # Connection already closed (such as by httplib). + return True + try: + # Returns True if readable, which here means it's been dropped + return wait_for_read(sock, timeout=0.0) + except NoWayToWaitForSocketError: # Platform-specific: AppEngine + return False + + +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +# One additional modification is that we avoid binding to IPv6 servers +# discovered in DNS if the system doesn't have IPv6 functionality. +def create_connection( + address, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, + socket_options=None, +): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`socket.getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + if host.startswith("["): + host = host.strip("[]") + err = None + + # Using the value from allowed_gai_family() in the context of getaddrinfo lets + # us select whether to work with IPv4 DNS records, IPv6 records, or both. + # The original create_connection function always returns all records. + family = allowed_gai_family() + + try: + host.encode("idna") + except UnicodeError: + return six.raise_from( + LocationParseError(u"'%s', label empty or too long" % host), None + ) + + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + _set_socket_options(sock, socket_options) + + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error as e: + err = e + if sock is not None: + sock.close() + sock = None + + if err is not None: + raise err + + raise socket.error("getaddrinfo returns an empty list") + + +def _set_socket_options(sock, options): + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) + + +def allowed_gai_family(): + """This function is designed to work in the context of + getaddrinfo, where family=socket.AF_UNSPEC is the default and + will perform a DNS search for both IPv6 and IPv4 records.""" + + family = socket.AF_INET + if HAS_IPV6: + family = socket.AF_UNSPEC + return family + + +def _has_ipv6(host): + """Returns True if the system can bind an IPv6 address.""" + sock = None + has_ipv6 = False + + # App Engine doesn't support IPV6 sockets and actually has a quota on the + # number of sockets that can be used, so just early out here instead of + # creating a socket needlessly. + # See https://github.com/urllib3/urllib3/issues/1446 + if _appengine_environ.is_appengine_sandbox(): + return False + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/urllib3/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + + +HAS_IPV6 = _has_ipv6("::1") diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/proxy.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/proxy.py new file mode 100644 index 0000000..2199cc7 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/proxy.py @@ -0,0 +1,57 @@ +from .ssl_ import create_urllib3_context, resolve_cert_reqs, resolve_ssl_version + + +def connection_requires_http_tunnel( + proxy_url=None, proxy_config=None, destination_scheme=None +): + """ + Returns True if the connection requires an HTTP CONNECT through the proxy. + + :param URL proxy_url: + URL of the proxy. + :param ProxyConfig proxy_config: + Proxy configuration from poolmanager.py + :param str destination_scheme: + The scheme of the destination. (i.e https, http, etc) + """ + # If we're not using a proxy, no way to use a tunnel. + if proxy_url is None: + return False + + # HTTP destinations never require tunneling, we always forward. + if destination_scheme == "http": + return False + + # Support for forwarding with HTTPS proxies and HTTPS destinations. + if ( + proxy_url.scheme == "https" + and proxy_config + and proxy_config.use_forwarding_for_https + ): + return False + + # Otherwise always use a tunnel. + return True + + +def create_proxy_ssl_context( + ssl_version, cert_reqs, ca_certs=None, ca_cert_dir=None, ca_cert_data=None +): + """ + Generates a default proxy ssl context if one hasn't been provided by the + user. + """ + ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(ssl_version), + cert_reqs=resolve_cert_reqs(cert_reqs), + ) + + if ( + not ca_certs + and not ca_cert_dir + and not ca_cert_data + and hasattr(ssl_context, "load_default_certs") + ): + ssl_context.load_default_certs() + + return ssl_context diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/queue.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/queue.py new file mode 100644 index 0000000..4178410 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/queue.py @@ -0,0 +1,22 @@ +import collections + +from ..packages import six +from ..packages.six.moves import queue + +if six.PY2: + # Queue is imported for side effects on MS Windows. See issue #229. + import Queue as _unused_module_Queue # noqa: F401 + + +class LifoQueue(queue.Queue): + def _init(self, _): + self.queue = collections.deque() + + def _qsize(self, len=len): + return len(self.queue) + + def _put(self, item): + self.queue.append(item) + + def _get(self): + return self.queue.pop() diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/request.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/request.py new file mode 100644 index 0000000..b574b08 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/request.py @@ -0,0 +1,146 @@ +from __future__ import absolute_import + +from base64 import b64encode + +from ..exceptions import UnrewindableBodyError +from ..packages.six import b, integer_types + +# Pass as a value within ``headers`` to skip +# emitting some HTTP headers that are added automatically. +# The only headers that are supported are ``Accept-Encoding``, +# ``Host``, and ``User-Agent``. +SKIP_HEADER = "@@@SKIP_HEADER@@@" +SKIPPABLE_HEADERS = frozenset(["accept-encoding", "host", "user-agent"]) + +ACCEPT_ENCODING = "gzip,deflate" +try: + try: + import brotlicffi as _unused_module_brotli # noqa: F401 + except ImportError: + import brotli as _unused_module_brotli # noqa: F401 +except ImportError: + pass +else: + ACCEPT_ENCODING += ",br" + +_FAILEDTELL = object() + + +def make_headers( + keep_alive=None, + accept_encoding=None, + user_agent=None, + basic_auth=None, + proxy_basic_auth=None, + disable_cache=None, +): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ",".join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers["accept-encoding"] = accept_encoding + + if user_agent: + headers["user-agent"] = user_agent + + if keep_alive: + headers["connection"] = "keep-alive" + + if basic_auth: + headers["authorization"] = "Basic " + b64encode(b(basic_auth)).decode("utf-8") + + if proxy_basic_auth: + headers["proxy-authorization"] = "Basic " + b64encode( + b(proxy_basic_auth) + ).decode("utf-8") + + if disable_cache: + headers["cache-control"] = "no-cache" + + return headers + + +def set_file_position(body, pos): + """ + If a position is provided, move file to that point. + Otherwise, we'll attempt to record a position for future use. + """ + if pos is not None: + rewind_body(body, pos) + elif getattr(body, "tell", None) is not None: + try: + pos = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body. + pos = _FAILEDTELL + + return pos + + +def rewind_body(body, body_pos): + """ + Attempt to rewind body to a certain position. + Primarily used for request redirects and retries. + + :param body: + File-like object that supports seek. + + :param int pos: + Position to seek to in file. + """ + body_seek = getattr(body, "seek", None) + if body_seek is not None and isinstance(body_pos, integer_types): + try: + body_seek(body_pos) + except (IOError, OSError): + raise UnrewindableBodyError( + "An error occurred when rewinding request body for redirect/retry." + ) + elif body_pos is _FAILEDTELL: + raise UnrewindableBodyError( + "Unable to record file position for rewinding " + "request body during a redirect/retry." + ) + else: + raise ValueError( + "body_pos must be of type integer, instead it was %s." % type(body_pos) + ) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/response.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/response.py new file mode 100644 index 0000000..5ea609c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/response.py @@ -0,0 +1,107 @@ +from __future__ import absolute_import + +from email.errors import MultipartInvariantViolationDefect, StartBoundaryNotFoundDefect + +from ..exceptions import HeaderParsingError +from ..packages.six.moves import http_client as httplib + + +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check `isclosed()` first, in case Python3 doesn't set `closed`. + # GH Issue #928 + return obj.isclosed() + except AttributeError: + pass + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers): + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param http.client.HTTPMessage headers: Headers to verify. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError("expected httplib.Message, got {0}.".format(type(headers))) + + defects = getattr(headers, "defects", None) + get_payload = getattr(headers, "get_payload", None) + + unparsed_data = None + if get_payload: + # get_payload is actually email.message.Message.get_payload; + # we're only interested in the result if it's not a multipart message + if not headers.is_multipart(): + payload = get_payload() + + if isinstance(payload, (bytes, str)): + unparsed_data = payload + if defects: + # httplib is assuming a response body is available + # when parsing headers even when httplib only sends + # header data to parse_headers() This results in + # defects on multipart responses in particular. + # See: https://github.com/urllib3/urllib3/issues/800 + + # So we ignore the following defects: + # - StartBoundaryNotFoundDefect: + # The claimed start boundary was never found. + # - MultipartInvariantViolationDefect: + # A message claimed to be a multipart but no subparts were found. + defects = [ + defect + for defect in defects + if not isinstance( + defect, (StartBoundaryNotFoundDefect, MultipartInvariantViolationDefect) + ) + ] + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param http.client.HTTPResponse response: + Response to check if the originating request + used 'HEAD' as a method. + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == "HEAD" diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/retry.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/retry.py new file mode 100644 index 0000000..3398323 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/retry.py @@ -0,0 +1,620 @@ +from __future__ import absolute_import + +import email +import logging +import re +import time +import warnings +from collections import namedtuple +from itertools import takewhile + +from ..exceptions import ( + ConnectTimeoutError, + InvalidHeader, + MaxRetryError, + ProtocolError, + ProxyError, + ReadTimeoutError, + ResponseError, +) +from ..packages import six + +log = logging.getLogger(__name__) + + +# Data structure for representing the metadata of requests that result in a retry. +RequestHistory = namedtuple( + "RequestHistory", ["method", "url", "error", "status", "redirect_location"] +) + + +# TODO: In v2 we can remove this sentinel and metaclass with deprecated options. +_Default = object() + + +class _RetryMeta(type): + @property + def DEFAULT_METHOD_WHITELIST(cls): + warnings.warn( + "Using 'Retry.DEFAULT_METHOD_WHITELIST' is deprecated and " + "will be removed in v2.0. Use 'Retry.DEFAULT_ALLOWED_METHODS' instead", + DeprecationWarning, + ) + return cls.DEFAULT_ALLOWED_METHODS + + @DEFAULT_METHOD_WHITELIST.setter + def DEFAULT_METHOD_WHITELIST(cls, value): + warnings.warn( + "Using 'Retry.DEFAULT_METHOD_WHITELIST' is deprecated and " + "will be removed in v2.0. Use 'Retry.DEFAULT_ALLOWED_METHODS' instead", + DeprecationWarning, + ) + cls.DEFAULT_ALLOWED_METHODS = value + + @property + def DEFAULT_REDIRECT_HEADERS_BLACKLIST(cls): + warnings.warn( + "Using 'Retry.DEFAULT_REDIRECT_HEADERS_BLACKLIST' is deprecated and " + "will be removed in v2.0. Use 'Retry.DEFAULT_REMOVE_HEADERS_ON_REDIRECT' instead", + DeprecationWarning, + ) + return cls.DEFAULT_REMOVE_HEADERS_ON_REDIRECT + + @DEFAULT_REDIRECT_HEADERS_BLACKLIST.setter + def DEFAULT_REDIRECT_HEADERS_BLACKLIST(cls, value): + warnings.warn( + "Using 'Retry.DEFAULT_REDIRECT_HEADERS_BLACKLIST' is deprecated and " + "will be removed in v2.0. Use 'Retry.DEFAULT_REMOVE_HEADERS_ON_REDIRECT' instead", + DeprecationWarning, + ) + cls.DEFAULT_REMOVE_HEADERS_ON_REDIRECT = value + + @property + def BACKOFF_MAX(cls): + warnings.warn( + "Using 'Retry.BACKOFF_MAX' is deprecated and " + "will be removed in v2.0. Use 'Retry.DEFAULT_BACKOFF_MAX' instead", + DeprecationWarning, + ) + return cls.DEFAULT_BACKOFF_MAX + + @BACKOFF_MAX.setter + def BACKOFF_MAX(cls, value): + warnings.warn( + "Using 'Retry.BACKOFF_MAX' is deprecated and " + "will be removed in v2.0. Use 'Retry.DEFAULT_BACKOFF_MAX' instead", + DeprecationWarning, + ) + cls.DEFAULT_BACKOFF_MAX = value + + +@six.add_metaclass(_RetryMeta) +class Retry(object): + """Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int status: + How many times to retry on bad status codes. + + These are retries made on responses, where status code matches + ``status_forcelist``. + + Set to ``0`` to fail on the first retry of this type. + + :param int other: + How many times to retry on other errors. + + Other errors are errors that are not connect, read, redirect or status errors. + These errors might be raised after the request was sent to the server, so the + request might have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + If ``total`` is not set, it's a good idea to set this to 0 to account + for unexpected edge cases and avoid infinite retry loops. + + :param iterable allowed_methods: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + idempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_ALLOWED_METHODS`. + + Set to a ``False`` value to retry on any verb. + + .. warning:: + + Previously this parameter was named ``method_whitelist``, that + usage is deprecated in v1.26.0 and will be removed in v2.0. + + :param iterable status_forcelist: + A set of integer HTTP status codes that we should force a retry on. + A retry is initiated if the request method is in ``allowed_methods`` + and the response status code is in ``status_forcelist``. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts after the second try + (most errors are resolved immediately by a second try without a + delay). urllib3 will sleep for:: + + {backoff factor} * (2 ** ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.DEFAULT_BACKOFF_MAX`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + + :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: + whether we should raise an exception, or return a response, + if status falls in ``status_forcelist`` range and retries have + been exhausted. + + :param tuple history: The history of the request encountered during + each call to :meth:`~Retry.increment`. The list is in the order + the requests occurred. Each list item is of class :class:`RequestHistory`. + + :param bool respect_retry_after_header: + Whether to respect Retry-After header on status codes defined as + :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. + + :param iterable remove_headers_on_redirect: + Sequence of headers to remove from the request when a response + indicating a redirect is returned before firing off the redirected + request. + """ + + #: Default methods to be used for ``allowed_methods`` + DEFAULT_ALLOWED_METHODS = frozenset( + ["HEAD", "GET", "PUT", "DELETE", "OPTIONS", "TRACE"] + ) + + #: Default status codes to be used for ``status_forcelist`` + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + #: Default headers to be used for ``remove_headers_on_redirect`` + DEFAULT_REMOVE_HEADERS_ON_REDIRECT = frozenset(["Authorization"]) + + #: Maximum backoff time. + DEFAULT_BACKOFF_MAX = 120 + + def __init__( + self, + total=10, + connect=None, + read=None, + redirect=None, + status=None, + other=None, + allowed_methods=_Default, + status_forcelist=None, + backoff_factor=0, + raise_on_redirect=True, + raise_on_status=True, + history=None, + respect_retry_after_header=True, + remove_headers_on_redirect=_Default, + # TODO: Deprecated, remove in v2.0 + method_whitelist=_Default, + ): + + if method_whitelist is not _Default: + if allowed_methods is not _Default: + raise ValueError( + "Using both 'allowed_methods' and " + "'method_whitelist' together is not allowed. " + "Instead only use 'allowed_methods'" + ) + warnings.warn( + "Using 'method_whitelist' with Retry is deprecated and " + "will be removed in v2.0. Use 'allowed_methods' instead", + DeprecationWarning, + stacklevel=2, + ) + allowed_methods = method_whitelist + if allowed_methods is _Default: + allowed_methods = self.DEFAULT_ALLOWED_METHODS + if remove_headers_on_redirect is _Default: + remove_headers_on_redirect = self.DEFAULT_REMOVE_HEADERS_ON_REDIRECT + + self.total = total + self.connect = connect + self.read = read + self.status = status + self.other = other + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.allowed_methods = allowed_methods + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self.raise_on_status = raise_on_status + self.history = history or tuple() + self.respect_retry_after_header = respect_retry_after_header + self.remove_headers_on_redirect = frozenset( + [h.lower() for h in remove_headers_on_redirect] + ) + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, + read=self.read, + redirect=self.redirect, + status=self.status, + other=self.other, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + raise_on_status=self.raise_on_status, + history=self.history, + remove_headers_on_redirect=self.remove_headers_on_redirect, + respect_retry_after_header=self.respect_retry_after_header, + ) + + # TODO: If already given in **kw we use what's given to us + # If not given we need to figure out what to pass. We decide + # based on whether our class has the 'method_whitelist' property + # and if so we pass the deprecated 'method_whitelist' otherwise + # we use 'allowed_methods'. Remove in v2.0 + if "method_whitelist" not in kw and "allowed_methods" not in kw: + if "method_whitelist" in self.__dict__: + warnings.warn( + "Using 'method_whitelist' with Retry is deprecated and " + "will be removed in v2.0. Use 'allowed_methods' instead", + DeprecationWarning, + ) + params["method_whitelist"] = self.allowed_methods + else: + params["allowed_methods"] = self.allowed_methods + + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self): + """Formula for computing the current backoff + + :rtype: float + """ + # We want to consider only the last consecutive errors sequence (Ignore redirects). + consecutive_errors_len = len( + list( + takewhile(lambda x: x.redirect_location is None, reversed(self.history)) + ) + ) + if consecutive_errors_len <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) + return min(self.DEFAULT_BACKOFF_MAX, backoff_value) + + def parse_retry_after(self, retry_after): + # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 + if re.match(r"^\s*[0-9]+\s*$", retry_after): + seconds = int(retry_after) + else: + retry_date_tuple = email.utils.parsedate_tz(retry_after) + if retry_date_tuple is None: + raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) + if retry_date_tuple[9] is None: # Python 2 + # Assume UTC if no timezone was specified + # On Python2.7, parsedate_tz returns None for a timezone offset + # instead of 0 if no timezone is given, where mktime_tz treats + # a None timezone offset as local time. + retry_date_tuple = retry_date_tuple[:9] + (0,) + retry_date_tuple[10:] + + retry_date = email.utils.mktime_tz(retry_date_tuple) + seconds = retry_date - time.time() + + if seconds < 0: + seconds = 0 + + return seconds + + def get_retry_after(self, response): + """Get the value of Retry-After in seconds.""" + + retry_after = response.getheader("Retry-After") + + if retry_after is None: + return None + + return self.parse_retry_after(retry_after) + + def sleep_for_retry(self, response=None): + retry_after = self.get_retry_after(response) + if retry_after: + time.sleep(retry_after) + return True + + return False + + def _sleep_backoff(self): + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def sleep(self, response=None): + """Sleep between retry attempts. + + This method will respect a server's ``Retry-After`` response header + and sleep the duration of the time requested. If that is not present, it + will use an exponential backoff. By default, the backoff factor is 0 and + this method will return immediately. + """ + + if self.respect_retry_after_header and response: + slept = self.sleep_for_retry(response) + if slept: + return + + self._sleep_backoff() + + def _is_connection_error(self, err): + """Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + if isinstance(err, ProxyError): + err = err.original_error + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def _is_method_retryable(self, method): + """Checks if a given HTTP method should be retried upon, depending if + it is included in the allowed_methods + """ + # TODO: For now favor if the Retry implementation sets its own method_whitelist + # property outside of our constructor to avoid breaking custom implementations. + if "method_whitelist" in self.__dict__: + warnings.warn( + "Using 'method_whitelist' with Retry is deprecated and " + "will be removed in v2.0. Use 'allowed_methods' instead", + DeprecationWarning, + ) + allowed_methods = self.method_whitelist + else: + allowed_methods = self.allowed_methods + + if allowed_methods and method.upper() not in allowed_methods: + return False + return True + + def is_retry(self, method, status_code, has_retry_after=False): + """Is this method/status code retryable? (Based on allowlists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + if not self._is_method_retryable(method): + return False + + if self.status_forcelist and status_code in self.status_forcelist: + return True + + return ( + self.total + and self.respect_retry_after_header + and has_retry_after + and (status_code in self.RETRY_AFTER_STATUS_CODES) + ) + + def is_exhausted(self): + """Are we out of retries?""" + retry_counts = ( + self.total, + self.connect, + self.read, + self.redirect, + self.status, + self.other, + ) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment( + self, + method=None, + url=None, + response=None, + error=None, + _pool=None, + _stacktrace=None, + ): + """Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + connect = self.connect + read = self.read + redirect = self.redirect + status_count = self.status + other = self.other + cause = "unknown" + status = None + redirect_location = None + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False or not self._is_method_retryable(method): + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + + elif error: + # Other retry? + if other is not None: + other -= 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = "too many redirects" + redirect_location = response.get_redirect_location() + status = response.status + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and the given method is in the allowed_methods + cause = ResponseError.GENERIC_ERROR + if response and response.status: + if status_count is not None: + status_count -= 1 + cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status) + status = response.status + + history = self.history + ( + RequestHistory(method, url, error, status, redirect_location), + ) + + new_retry = self.new( + total=total, + connect=connect, + read=read, + redirect=redirect, + status=status_count, + other=other, + history=history, + ) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self): + return ( + "{cls.__name__}(total={self.total}, connect={self.connect}, " + "read={self.read}, redirect={self.redirect}, status={self.status})" + ).format(cls=type(self), self=self) + + def __getattr__(self, item): + if item == "method_whitelist": + # TODO: Remove this deprecated alias in v2.0 + warnings.warn( + "Using 'method_whitelist' with Retry is deprecated and " + "will be removed in v2.0. Use 'allowed_methods' instead", + DeprecationWarning, + ) + return self.allowed_methods + try: + return getattr(super(Retry, self), item) + except AttributeError: + return getattr(Retry, item) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/ssl_.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/ssl_.py new file mode 100644 index 0000000..8f86781 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/ssl_.py @@ -0,0 +1,495 @@ +from __future__ import absolute_import + +import hmac +import os +import sys +import warnings +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import ( + InsecurePlatformWarning, + ProxySchemeUnsupported, + SNIMissingWarning, + SSLError, +) +from ..packages import six +from .url import BRACELESS_IPV6_ADDRZ_RE, IPV4_RE + +SSLContext = None +SSLTransport = None +HAS_SNI = False +IS_PYOPENSSL = False +IS_SECURETRANSPORT = False +ALPN_PROTOCOLS = ["http/1.1"] + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = {32: md5, 40: sha1, 64: sha256} + + +def _const_compare_digest_backport(a, b): + """ + Compare two digests of equal length in constant time. + + The digests must be of type str/bytes. + Returns True if the digests match, and False otherwise. + """ + result = abs(len(a) - len(b)) + for left, right in zip(bytearray(a), bytearray(b)): + result |= left ^ right + return result == 0 + + +_const_compare_digest = getattr(hmac, "compare_digest", _const_compare_digest_backport) + +try: # Test for SSL features + import ssl + from ssl import CERT_REQUIRED, wrap_socket +except ImportError: + pass + +try: + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + +try: + from .ssltransport import SSLTransport +except ImportError: + pass + + +try: # Platform-specific: Python 3.6 + from ssl import PROTOCOL_TLS + + PROTOCOL_SSLv23 = PROTOCOL_TLS +except ImportError: + try: + from ssl import PROTOCOL_SSLv23 as PROTOCOL_TLS + + PROTOCOL_SSLv23 = PROTOCOL_TLS + except ImportError: + PROTOCOL_SSLv23 = PROTOCOL_TLS = 2 + +try: + from ssl import PROTOCOL_TLS_CLIENT +except ImportError: + PROTOCOL_TLS_CLIENT = PROTOCOL_TLS + + +try: + from ssl import OP_NO_COMPRESSION, OP_NO_SSLv2, OP_NO_SSLv3 +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + + +try: # OP_NO_TICKET was added in Python 3.6 + from ssl import OP_NO_TICKET +except ImportError: + OP_NO_TICKET = 0x4000 + + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and +# security, +# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, +# - disable NULL authentication, MD5 MACs, DSS, and other +# insecure ciphers for security reasons. +# - NOTE: TLS 1.3 cipher suites are managed through a different interface +# not exposed by CPython (yet!) and are enabled by default if they're available. +DEFAULT_CIPHERS = ":".join( + [ + "ECDHE+AESGCM", + "ECDHE+CHACHA20", + "DHE+AESGCM", + "DHE+CHACHA20", + "ECDH+AESGCM", + "DH+AESGCM", + "ECDH+AES", + "DH+AES", + "RSA+AESGCM", + "RSA+AES", + "!aNULL", + "!eNULL", + "!MD5", + "!DSS", + ] +) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + + class SSLContext(object): # Platform-specific: Python 2 + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + self.ca_certs = cafile + + if capath is not None: + raise SSLError("CA directories not supported in older Pythons") + + if cadata is not None: + raise SSLError("CA data not supported in older Pythons") + + def set_ciphers(self, cipher_suite): + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None, server_side=False): + warnings.warn( + "A true SSLContext object is not available. This prevents " + "urllib3 from configuring SSL appropriately and may cause " + "certain SSL connections to fail. You can upgrade to a newer " + "version of Python to solve this. For more information, see " + "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" + "#ssl-warnings", + InsecurePlatformWarning, + ) + kwargs = { + "keyfile": self.keyfile, + "certfile": self.certfile, + "ca_certs": self.ca_certs, + "cert_reqs": self.verify_mode, + "ssl_version": self.protocol, + "server_side": server_side, + } + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + fingerprint = fingerprint.replace(":", "").lower() + digest_length = len(fingerprint) + hashfunc = HASHFUNC_MAP.get(digest_length) + if not hashfunc: + raise SSLError("Fingerprint of invalid length: {0}".format(fingerprint)) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not _const_compare_digest(cert_digest, fingerprint_bytes): + raise SSLError( + 'Fingerprints did not match. Expected "{0}", got "{1}".'.format( + fingerprint, hexlify(cert_digest) + ) + ) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_REQUIRED`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbreviation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_REQUIRED + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, "CERT_" + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_TLS + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, "PROTOCOL_" + candidate) + return res + + return candidate + + +def create_urllib3_context( + ssl_version=None, cert_reqs=None, options=None, ciphers=None +): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``, and ``ssl.OP_NO_TICKET``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + # PROTOCOL_TLS is deprecated in Python 3.10 + if not ssl_version or ssl_version == PROTOCOL_TLS: + ssl_version = PROTOCOL_TLS_CLIENT + + context = SSLContext(ssl_version) + + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + # TLSv1.2 only. Unless set explicitly, do not request tickets. + # This may save some bandwidth on wire, and although the ticket is encrypted, + # there is a risk associated with it being on wire, + # if the server is not rotating its ticketing keys properly. + options |= OP_NO_TICKET + + context.options |= options + + # Enable post-handshake authentication for TLS 1.3, see GH #1634. PHA is + # necessary for conditional client cert authentication with TLS 1.3. + # The attribute is None for OpenSSL <= 1.1.0 or does not exist in older + # versions of Python. We only enable on Python 3.7.4+ or if certificate + # verification is enabled to work around Python issue #37428 + # See: https://bugs.python.org/issue37428 + if (cert_reqs == ssl.CERT_REQUIRED or sys.version_info >= (3, 7, 4)) and getattr( + context, "post_handshake_auth", None + ) is not None: + context.post_handshake_auth = True + + def disable_check_hostname(): + if ( + getattr(context, "check_hostname", None) is not None + ): # Platform-specific: Python 3.2 + # We do our own verification, including fingerprints and alternative + # hostnames. So disable it here + context.check_hostname = False + + # The order of the below lines setting verify_mode and check_hostname + # matter due to safe-guards SSLContext has to prevent an SSLContext with + # check_hostname=True, verify_mode=NONE/OPTIONAL. This is made even more + # complex because we don't know whether PROTOCOL_TLS_CLIENT will be used + # or not so we don't know the initial state of the freshly created SSLContext. + if cert_reqs == ssl.CERT_REQUIRED: + context.verify_mode = cert_reqs + disable_check_hostname() + else: + disable_check_hostname() + context.verify_mode = cert_reqs + + # Enable logging of TLS session keys via defacto standard environment variable + # 'SSLKEYLOGFILE', if the feature is available (Python 3.8+). Skip empty values. + if hasattr(context, "keylog_filename"): + sslkeylogfile = os.environ.get("SSLKEYLOGFILE") + if sslkeylogfile: + context.keylog_filename = sslkeylogfile + + return context + + +def ssl_wrap_socket( + sock, + keyfile=None, + certfile=None, + cert_reqs=None, + ca_certs=None, + server_hostname=None, + ssl_version=None, + ciphers=None, + ssl_context=None, + ca_cert_dir=None, + key_password=None, + ca_cert_data=None, + tls_in_tls=False, +): + """ + All arguments except for server_hostname, ssl_context, and ca_cert_dir have + the same meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + :param key_password: + Optional password if the keyfile is encrypted. + :param ca_cert_data: + Optional string containing CA certificates in PEM format suitable for + passing as the cadata parameter to SSLContext.load_verify_locations() + :param tls_in_tls: + Use SSLTransport to wrap the existing socket. + """ + context = ssl_context + if context is None: + # Note: This branch of code and all the variables in it are no longer + # used by urllib3 itself. We should consider deprecating and removing + # this code. + context = create_urllib3_context(ssl_version, cert_reqs, ciphers=ciphers) + + if ca_certs or ca_cert_dir or ca_cert_data: + try: + context.load_verify_locations(ca_certs, ca_cert_dir, ca_cert_data) + except (IOError, OSError) as e: + raise SSLError(e) + + elif ssl_context is None and hasattr(context, "load_default_certs"): + # try to load OS default certs; works well on Windows (require Python3.4+) + context.load_default_certs() + + # Attempt to detect if we get the goofy behavior of the + # keyfile being encrypted and OpenSSL asking for the + # passphrase via the terminal and instead error out. + if keyfile and key_password is None and _is_key_file_encrypted(keyfile): + raise SSLError("Client private key is encrypted, password is required") + + if certfile: + if key_password is None: + context.load_cert_chain(certfile, keyfile) + else: + context.load_cert_chain(certfile, keyfile, key_password) + + try: + if hasattr(context, "set_alpn_protocols"): + context.set_alpn_protocols(ALPN_PROTOCOLS) + except NotImplementedError: # Defensive: in CI, we always have set_alpn_protocols + pass + + # If we detect server_hostname is an IP address then the SNI + # extension should not be used according to RFC3546 Section 3.1 + use_sni_hostname = server_hostname and not is_ipaddress(server_hostname) + # SecureTransport uses server_hostname in certificate verification. + send_sni = (use_sni_hostname and HAS_SNI) or ( + IS_SECURETRANSPORT and server_hostname + ) + # Do not warn the user if server_hostname is an invalid SNI hostname. + if not HAS_SNI and use_sni_hostname: + warnings.warn( + "An HTTPS request has been made, but the SNI (Server Name " + "Indication) extension to TLS is not available on this platform. " + "This may cause the server to present an incorrect TLS " + "certificate, which can cause validation failures. You can upgrade to " + "a newer version of Python to solve this. For more information, see " + "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" + "#ssl-warnings", + SNIMissingWarning, + ) + + if send_sni: + ssl_sock = _ssl_wrap_socket_impl( + sock, context, tls_in_tls, server_hostname=server_hostname + ) + else: + ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls) + return ssl_sock + + +def is_ipaddress(hostname): + """Detects whether the hostname given is an IPv4 or IPv6 address. + Also detects IPv6 addresses with Zone IDs. + + :param str hostname: Hostname to examine. + :return: True if the hostname is an IP address, False otherwise. + """ + if not six.PY2 and isinstance(hostname, bytes): + # IDN A-label bytes are ASCII compatible. + hostname = hostname.decode("ascii") + return bool(IPV4_RE.match(hostname) or BRACELESS_IPV6_ADDRZ_RE.match(hostname)) + + +def _is_key_file_encrypted(key_file): + """Detects if a key file is encrypted or not.""" + with open(key_file, "r") as f: + for line in f: + # Look for Proc-Type: 4,ENCRYPTED + if "ENCRYPTED" in line: + return True + + return False + + +def _ssl_wrap_socket_impl(sock, ssl_context, tls_in_tls, server_hostname=None): + if tls_in_tls: + if not SSLTransport: + # Import error, ssl is not available. + raise ProxySchemeUnsupported( + "TLS in TLS requires support for the 'ssl' module" + ) + + SSLTransport._validate_ssl_context_for_tls_in_tls(ssl_context) + return SSLTransport(sock, ssl_context, server_hostname) + + if server_hostname: + return ssl_context.wrap_socket(sock, server_hostname=server_hostname) + else: + return ssl_context.wrap_socket(sock) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/ssl_match_hostname.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/ssl_match_hostname.py new file mode 100644 index 0000000..1dd950c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/ssl_match_hostname.py @@ -0,0 +1,159 @@ +"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" + +# Note: This file is under the PSF license as the code comes from the python +# stdlib. http://docs.python.org/3/license.html + +import re +import sys + +# ipaddress has been backported to 2.6+ in pypi. If it is installed on the +# system, use it to handle IPAddress ServerAltnames (this was added in +# python-3.5) otherwise only do DNS matching. This allows +# util.ssl_match_hostname to continue to be used in Python 2.7. +try: + import ipaddress +except ImportError: + ipaddress = None + +__version__ = "3.5.0.1" + + +class CertificateError(ValueError): + pass + + +def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r".") + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count("*") + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn) + ) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == "*": + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append("[^.]+") + elif leftmost.startswith("xn--") or hostname.startswith("xn--"): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r"\*", "[^.]*")) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r"\A" + r"\.".join(pats) + r"\Z", re.IGNORECASE) + return pat.match(hostname) + + +def _to_unicode(obj): + if isinstance(obj, str) and sys.version_info < (3,): + # ignored flake8 # F821 to support python 2.7 function + obj = unicode(obj, encoding="ascii", errors="strict") # noqa: F821 + return obj + + +def _ipaddress_match(ipname, host_ip): + """Exact matching of IP addresses. + + RFC 6125 explicitly doesn't define an algorithm for this + (section 1.7.2 - "Out of Scope"). + """ + # OpenSSL may add a trailing newline to a subjectAltName's IP address + # Divergence from upstream: ipaddress can't handle byte str + ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) + return ip == host_ip + + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError( + "empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED" + ) + try: + # Divergence from upstream: ipaddress can't handle byte str + host_ip = ipaddress.ip_address(_to_unicode(hostname)) + except (UnicodeError, ValueError): + # ValueError: Not an IP address (common case) + # UnicodeError: Divergence from upstream: Have to deal with ipaddress not taking + # byte strings. addresses should be all ascii, so we consider it not + # an ipaddress in this case + host_ip = None + except AttributeError: + # Divergence from upstream: Make ipaddress library optional + if ipaddress is None: + host_ip = None + else: # Defensive + raise + dnsnames = [] + san = cert.get("subjectAltName", ()) + for key, value in san: + if key == "DNS": + if host_ip is None and _dnsname_match(value, hostname): + return + dnsnames.append(value) + elif key == "IP Address": + if host_ip is not None and _ipaddress_match(value, host_ip): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get("subject", ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == "commonName": + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError( + "hostname %r " + "doesn't match either of %s" % (hostname, ", ".join(map(repr, dnsnames))) + ) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r doesn't match %r" % (hostname, dnsnames[0])) + else: + raise CertificateError( + "no appropriate commonName or subjectAltName fields were found" + ) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/ssltransport.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/ssltransport.py new file mode 100644 index 0000000..4a7105d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/ssltransport.py @@ -0,0 +1,221 @@ +import io +import socket +import ssl + +from ..exceptions import ProxySchemeUnsupported +from ..packages import six + +SSL_BLOCKSIZE = 16384 + + +class SSLTransport: + """ + The SSLTransport wraps an existing socket and establishes an SSL connection. + + Contrary to Python's implementation of SSLSocket, it allows you to chain + multiple TLS connections together. It's particularly useful if you need to + implement TLS within TLS. + + The class supports most of the socket API operations. + """ + + @staticmethod + def _validate_ssl_context_for_tls_in_tls(ssl_context): + """ + Raises a ProxySchemeUnsupported if the provided ssl_context can't be used + for TLS in TLS. + + The only requirement is that the ssl_context provides the 'wrap_bio' + methods. + """ + + if not hasattr(ssl_context, "wrap_bio"): + if six.PY2: + raise ProxySchemeUnsupported( + "TLS in TLS requires SSLContext.wrap_bio() which isn't " + "supported on Python 2" + ) + else: + raise ProxySchemeUnsupported( + "TLS in TLS requires SSLContext.wrap_bio() which isn't " + "available on non-native SSLContext" + ) + + def __init__( + self, socket, ssl_context, server_hostname=None, suppress_ragged_eofs=True + ): + """ + Create an SSLTransport around socket using the provided ssl_context. + """ + self.incoming = ssl.MemoryBIO() + self.outgoing = ssl.MemoryBIO() + + self.suppress_ragged_eofs = suppress_ragged_eofs + self.socket = socket + + self.sslobj = ssl_context.wrap_bio( + self.incoming, self.outgoing, server_hostname=server_hostname + ) + + # Perform initial handshake. + self._ssl_io_loop(self.sslobj.do_handshake) + + def __enter__(self): + return self + + def __exit__(self, *_): + self.close() + + def fileno(self): + return self.socket.fileno() + + def read(self, len=1024, buffer=None): + return self._wrap_ssl_read(len, buffer) + + def recv(self, len=1024, flags=0): + if flags != 0: + raise ValueError("non-zero flags not allowed in calls to recv") + return self._wrap_ssl_read(len) + + def recv_into(self, buffer, nbytes=None, flags=0): + if flags != 0: + raise ValueError("non-zero flags not allowed in calls to recv_into") + if buffer and (nbytes is None): + nbytes = len(buffer) + elif nbytes is None: + nbytes = 1024 + return self.read(nbytes, buffer) + + def sendall(self, data, flags=0): + if flags != 0: + raise ValueError("non-zero flags not allowed in calls to sendall") + count = 0 + with memoryview(data) as view, view.cast("B") as byte_view: + amount = len(byte_view) + while count < amount: + v = self.send(byte_view[count:]) + count += v + + def send(self, data, flags=0): + if flags != 0: + raise ValueError("non-zero flags not allowed in calls to send") + response = self._ssl_io_loop(self.sslobj.write, data) + return response + + def makefile( + self, mode="r", buffering=None, encoding=None, errors=None, newline=None + ): + """ + Python's httpclient uses makefile and buffered io when reading HTTP + messages and we need to support it. + + This is unfortunately a copy and paste of socket.py makefile with small + changes to point to the socket directly. + """ + if not set(mode) <= {"r", "w", "b"}: + raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,)) + + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = socket.SocketIO(self, rawmode) + self.socket._io_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text + + def unwrap(self): + self._ssl_io_loop(self.sslobj.unwrap) + + def close(self): + self.socket.close() + + def getpeercert(self, binary_form=False): + return self.sslobj.getpeercert(binary_form) + + def version(self): + return self.sslobj.version() + + def cipher(self): + return self.sslobj.cipher() + + def selected_alpn_protocol(self): + return self.sslobj.selected_alpn_protocol() + + def selected_npn_protocol(self): + return self.sslobj.selected_npn_protocol() + + def shared_ciphers(self): + return self.sslobj.shared_ciphers() + + def compression(self): + return self.sslobj.compression() + + def settimeout(self, value): + self.socket.settimeout(value) + + def gettimeout(self): + return self.socket.gettimeout() + + def _decref_socketios(self): + self.socket._decref_socketios() + + def _wrap_ssl_read(self, len, buffer=None): + try: + return self._ssl_io_loop(self.sslobj.read, len, buffer) + except ssl.SSLError as e: + if e.errno == ssl.SSL_ERROR_EOF and self.suppress_ragged_eofs: + return 0 # eof, return 0. + else: + raise + + def _ssl_io_loop(self, func, *args): + """Performs an I/O loop between incoming/outgoing and the socket.""" + should_loop = True + ret = None + + while should_loop: + errno = None + try: + ret = func(*args) + except ssl.SSLError as e: + if e.errno not in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE): + # WANT_READ, and WANT_WRITE are expected, others are not. + raise e + errno = e.errno + + buf = self.outgoing.read() + self.socket.sendall(buf) + + if errno is None: + should_loop = False + elif errno == ssl.SSL_ERROR_WANT_READ: + buf = self.socket.recv(SSL_BLOCKSIZE) + if buf: + self.incoming.write(buf) + else: + self.incoming.write_eof() + return ret diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/timeout.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/timeout.py new file mode 100644 index 0000000..ff69593 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/timeout.py @@ -0,0 +1,268 @@ +from __future__ import absolute_import + +import time + +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + + +# Use time.monotonic if available. +current_time = getattr(time, "monotonic", time.time) + + +class Timeout(object): + """Timeout configuration. + + Timeouts can be defined as a default for a pool: + + .. code-block:: python + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool): + + .. code-block:: python + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``: + + .. code-block:: python + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: int, float, or None + + :param connect: + The maximum amount of time (in seconds) to wait for a connection + attempt to a server to succeed. Omitting the parameter will default the + connect timeout to the system default, probably `the global default + timeout in socket.py + `_. + None will set an infinite timeout for connection attempts. + + :type connect: int, float, or None + + :param read: + The maximum amount of time (in seconds) to wait between consecutive + read operations for a response from the server. Omitting the parameter + will default the read timeout to the system default, probably `the + global default timeout in socket.py + `_. + None will set an infinite timeout. + + :type read: int, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, "connect") + self._read = self._validate_timeout(read, "read") + self.total = self._validate_timeout(total, "total") + self._start_connect = None + + def __repr__(self): + return "%s(connect=%r, read=%r, total=%r)" % ( + type(self).__name__, + self._connect, + self._read, + self.total, + ) + + # __str__ provided for backwards compatibility + __str__ = __repr__ + + @classmethod + def _validate_timeout(cls, value, name): + """Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError( + "Timeout cannot be a boolean value. It must " + "be an int, float or None." + ) + try: + float(value) + except (TypeError, ValueError): + raise ValueError( + "Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value) + ) + + try: + if value <= 0: + raise ValueError( + "Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value) + ) + except TypeError: + # Python 3 + raise ValueError( + "Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value) + ) + + return value + + @classmethod + def from_float(cls, timeout): + """Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, total=self.total) + + def start_connect(self): + """Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time in seconds. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError( + "Can't get connect duration for timer that has not started." + ) + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if ( + self.total is not None + and self.total is not self.DEFAULT_TIMEOUT + and self._read is not None + and self._read is not self.DEFAULT_TIMEOUT + ): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/url.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/url.py new file mode 100644 index 0000000..81a03da --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/url.py @@ -0,0 +1,432 @@ +from __future__ import absolute_import + +import re +from collections import namedtuple + +from ..exceptions import LocationParseError +from ..packages import six + +url_attrs = ["scheme", "auth", "host", "port", "path", "query", "fragment"] + +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +NORMALIZABLE_SCHEMES = ("http", "https", None) + +# Almost all of these patterns were derived from the +# 'rfc3986' module: https://github.com/python-hyper/rfc3986 +PERCENT_RE = re.compile(r"%[a-fA-F0-9]{2}") +SCHEME_RE = re.compile(r"^(?:[a-zA-Z][a-zA-Z0-9+-]*:|/)") +URI_RE = re.compile( + r"^(?:([a-zA-Z][a-zA-Z0-9+.-]*):)?" + r"(?://([^\\/?#]*))?" + r"([^?#]*)" + r"(?:\?([^#]*))?" + r"(?:#(.*))?$", + re.UNICODE | re.DOTALL, +) + +IPV4_PAT = r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}" +HEX_PAT = "[0-9A-Fa-f]{1,4}" +LS32_PAT = "(?:{hex}:{hex}|{ipv4})".format(hex=HEX_PAT, ipv4=IPV4_PAT) +_subs = {"hex": HEX_PAT, "ls32": LS32_PAT} +_variations = [ + # 6( h16 ":" ) ls32 + "(?:%(hex)s:){6}%(ls32)s", + # "::" 5( h16 ":" ) ls32 + "::(?:%(hex)s:){5}%(ls32)s", + # [ h16 ] "::" 4( h16 ":" ) ls32 + "(?:%(hex)s)?::(?:%(hex)s:){4}%(ls32)s", + # [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + "(?:(?:%(hex)s:)?%(hex)s)?::(?:%(hex)s:){3}%(ls32)s", + # [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + "(?:(?:%(hex)s:){0,2}%(hex)s)?::(?:%(hex)s:){2}%(ls32)s", + # [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + "(?:(?:%(hex)s:){0,3}%(hex)s)?::%(hex)s:%(ls32)s", + # [ *4( h16 ":" ) h16 ] "::" ls32 + "(?:(?:%(hex)s:){0,4}%(hex)s)?::%(ls32)s", + # [ *5( h16 ":" ) h16 ] "::" h16 + "(?:(?:%(hex)s:){0,5}%(hex)s)?::%(hex)s", + # [ *6( h16 ":" ) h16 ] "::" + "(?:(?:%(hex)s:){0,6}%(hex)s)?::", +] + +UNRESERVED_PAT = r"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._!\-~" +IPV6_PAT = "(?:" + "|".join([x % _subs for x in _variations]) + ")" +ZONE_ID_PAT = "(?:%25|%)(?:[" + UNRESERVED_PAT + "]|%[a-fA-F0-9]{2})+" +IPV6_ADDRZ_PAT = r"\[" + IPV6_PAT + r"(?:" + ZONE_ID_PAT + r")?\]" +REG_NAME_PAT = r"(?:[^\[\]%:/?#]|%[a-fA-F0-9]{2})*" +TARGET_RE = re.compile(r"^(/[^?#]*)(?:\?([^#]*))?(?:#.*)?$") + +IPV4_RE = re.compile("^" + IPV4_PAT + "$") +IPV6_RE = re.compile("^" + IPV6_PAT + "$") +IPV6_ADDRZ_RE = re.compile("^" + IPV6_ADDRZ_PAT + "$") +BRACELESS_IPV6_ADDRZ_RE = re.compile("^" + IPV6_ADDRZ_PAT[2:-2] + "$") +ZONE_ID_RE = re.compile("(" + ZONE_ID_PAT + r")\]$") + +_HOST_PORT_PAT = ("^(%s|%s|%s)(?::([0-9]{0,5}))?$") % ( + REG_NAME_PAT, + IPV4_PAT, + IPV6_ADDRZ_PAT, +) +_HOST_PORT_RE = re.compile(_HOST_PORT_PAT, re.UNICODE | re.DOTALL) + +UNRESERVED_CHARS = set( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-~" +) +SUB_DELIM_CHARS = set("!$&'()*+,;=") +USERINFO_CHARS = UNRESERVED_CHARS | SUB_DELIM_CHARS | {":"} +PATH_CHARS = USERINFO_CHARS | {"@", "/"} +QUERY_CHARS = FRAGMENT_CHARS = PATH_CHARS | {"?"} + + +class Url(namedtuple("Url", url_attrs)): + """ + Data structure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. Both the scheme and host are normalized as they are + both case-insensitive according to RFC 3986. + """ + + __slots__ = () + + def __new__( + cls, + scheme=None, + auth=None, + host=None, + port=None, + path=None, + query=None, + fragment=None, + ): + if path and not path.startswith("/"): + path = "/" + path + if scheme is not None: + scheme = scheme.lower() + return super(Url, cls).__new__( + cls, scheme, auth, host, port, path, query, fragment + ) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or "/" + + if self.query is not None: + uri += "?" + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return "%s:%d" % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = u"" + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + u"://" + if auth is not None: + url += auth + u"@" + if host is not None: + url += host + if port is not None: + url += u":" + str(port) + if path is not None: + url += path + if query is not None: + url += u"?" + query + if fragment is not None: + url += u"#" + fragment + + return url + + def __str__(self): + return self.url + + +def split_first(s, delims): + """ + .. deprecated:: 1.25 + + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, "", None + + return s[:min_idx], s[min_idx + 1 :], min_delim + + +def _encode_invalid_chars(component, allowed_chars, encoding="utf-8"): + """Percent-encodes a URI component without reapplying + onto an already percent-encoded component. + """ + if component is None: + return component + + component = six.ensure_text(component) + + # Normalize existing percent-encoded bytes. + # Try to see if the component we're encoding is already percent-encoded + # so we can skip all '%' characters but still encode all others. + component, percent_encodings = PERCENT_RE.subn( + lambda match: match.group(0).upper(), component + ) + + uri_bytes = component.encode("utf-8", "surrogatepass") + is_percent_encoded = percent_encodings == uri_bytes.count(b"%") + encoded_component = bytearray() + + for i in range(0, len(uri_bytes)): + # Will return a single character bytestring on both Python 2 & 3 + byte = uri_bytes[i : i + 1] + byte_ord = ord(byte) + if (is_percent_encoded and byte == b"%") or ( + byte_ord < 128 and byte.decode() in allowed_chars + ): + encoded_component += byte + continue + encoded_component.extend(b"%" + (hex(byte_ord)[2:].encode().zfill(2).upper())) + + return encoded_component.decode(encoding) + + +def _remove_path_dot_segments(path): + # See http://tools.ietf.org/html/rfc3986#section-5.2.4 for pseudo-code + segments = path.split("/") # Turn the path into a list of segments + output = [] # Initialize the variable to use to store output + + for segment in segments: + # '.' is the current directory, so ignore it, it is superfluous + if segment == ".": + continue + # Anything other than '..', should be appended to the output + elif segment != "..": + output.append(segment) + # In this case segment == '..', if we can, we should pop the last + # element + elif output: + output.pop() + + # If the path starts with '/' and the output is empty or the first string + # is non-empty + if path.startswith("/") and (not output or output[0]): + output.insert(0, "") + + # If the path starts with '/.' or '/..' ensure we add one more empty + # string to add a trailing '/' + if path.endswith(("/.", "/..")): + output.append("") + + return "/".join(output) + + +def _normalize_host(host, scheme): + if host: + if isinstance(host, six.binary_type): + host = six.ensure_str(host) + + if scheme in NORMALIZABLE_SCHEMES: + is_ipv6 = IPV6_ADDRZ_RE.match(host) + if is_ipv6: + match = ZONE_ID_RE.search(host) + if match: + start, end = match.span(1) + zone_id = host[start:end] + + if zone_id.startswith("%25") and zone_id != "%25": + zone_id = zone_id[3:] + else: + zone_id = zone_id[1:] + zone_id = "%" + _encode_invalid_chars(zone_id, UNRESERVED_CHARS) + return host[:start].lower() + zone_id + host[end:] + else: + return host.lower() + elif not IPV4_RE.match(host): + return six.ensure_str( + b".".join([_idna_encode(label) for label in host.split(".")]) + ) + return host + + +def _idna_encode(name): + if name and any([ord(x) > 128 for x in name]): + try: + import idna + except ImportError: + six.raise_from( + LocationParseError("Unable to parse URL without the 'idna' module"), + None, + ) + try: + return idna.encode(name.lower(), strict=True, std3_rules=True) + except idna.IDNAError: + six.raise_from( + LocationParseError(u"Name '%s' is not a valid IDNA label" % name), None + ) + return name.lower().encode("ascii") + + +def _encode_target(target): + """Percent-encodes a request target so that there are no invalid characters""" + path, query = TARGET_RE.match(target).groups() + target = _encode_invalid_chars(path, PATH_CHARS) + query = _encode_invalid_chars(query, QUERY_CHARS) + if query is not None: + target += "?" + query + return target + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + This parser is RFC 3986 compliant. + + The parser logic and helper functions are based heavily on + work done in the ``rfc3986`` module. + + :param str url: URL to parse into a :class:`.Url` namedtuple. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + if not url: + # Empty + return Url() + + source_url = url + if not SCHEME_RE.search(url): + url = "//" + url + + try: + scheme, authority, path, query, fragment = URI_RE.match(url).groups() + normalize_uri = scheme is None or scheme.lower() in NORMALIZABLE_SCHEMES + + if scheme: + scheme = scheme.lower() + + if authority: + auth, _, host_port = authority.rpartition("@") + auth = auth or None + host, port = _HOST_PORT_RE.match(host_port).groups() + if auth and normalize_uri: + auth = _encode_invalid_chars(auth, USERINFO_CHARS) + if port == "": + port = None + else: + auth, host, port = None, None, None + + if port is not None: + port = int(port) + if not (0 <= port <= 65535): + raise LocationParseError(url) + + host = _normalize_host(host, scheme) + + if normalize_uri and path: + path = _remove_path_dot_segments(path) + path = _encode_invalid_chars(path, PATH_CHARS) + if normalize_uri and query: + query = _encode_invalid_chars(query, QUERY_CHARS) + if normalize_uri and fragment: + fragment = _encode_invalid_chars(fragment, FRAGMENT_CHARS) + + except (ValueError, AttributeError): + return six.raise_from(LocationParseError(source_url), None) + + # For the sake of backwards compatibility we put empty + # string values for path if there are any defined values + # beyond the path in the URL. + # TODO: Remove this when we break backwards compatibility. + if not path: + if query is not None or fragment is not None: + path = "" + else: + path = None + + # Ensure that each part of the URL is a `str` for + # backwards compatibility. + if isinstance(url, six.text_type): + ensure_func = six.ensure_text + else: + ensure_func = six.ensure_str + + def ensure_type(x): + return x if x is None else ensure_func(x) + + return Url( + scheme=ensure_type(scheme), + auth=ensure_type(auth), + host=ensure_type(host), + port=port, + path=ensure_type(path), + query=ensure_type(query), + fragment=ensure_type(fragment), + ) + + +def get_host(url): + """ + Deprecated. Use :func:`parse_url` instead. + """ + p = parse_url(url) + return p.scheme or "http", p.hostname, p.port diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/wait.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/wait.py new file mode 100644 index 0000000..c280646 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/urllib3/util/wait.py @@ -0,0 +1,153 @@ +import errno +import select +import sys +from functools import partial + +try: + from time import monotonic +except ImportError: + from time import time as monotonic + +__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] + + +class NoWayToWaitForSocketError(Exception): + pass + + +# How should we wait on sockets? +# +# There are two types of APIs you can use for waiting on sockets: the fancy +# modern stateful APIs like epoll/kqueue, and the older stateless APIs like +# select/poll. The stateful APIs are more efficient when you have a lots of +# sockets to keep track of, because you can set them up once and then use them +# lots of times. But we only ever want to wait on a single socket at a time +# and don't want to keep track of state, so the stateless APIs are actually +# more efficient. So we want to use select() or poll(). +# +# Now, how do we choose between select() and poll()? On traditional Unixes, +# select() has a strange calling convention that makes it slow, or fail +# altogether, for high-numbered file descriptors. The point of poll() is to fix +# that, so on Unixes, we prefer poll(). +# +# On Windows, there is no poll() (or at least Python doesn't provide a wrapper +# for it), but that's OK, because on Windows, select() doesn't have this +# strange calling convention; plain select() works fine. +# +# So: on Windows we use select(), and everywhere else we use poll(). We also +# fall back to select() in case poll() is somehow broken or missing. + +if sys.version_info >= (3, 5): + # Modern Python, that retries syscalls by default + def _retry_on_intr(fn, timeout): + return fn(timeout) + + +else: + # Old and broken Pythons. + def _retry_on_intr(fn, timeout): + if timeout is None: + deadline = float("inf") + else: + deadline = monotonic() + timeout + + while True: + try: + return fn(timeout) + # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 + except (OSError, select.error) as e: + # 'e.args[0]' incantation works for both OSError and select.error + if e.args[0] != errno.EINTR: + raise + else: + timeout = deadline - monotonic() + if timeout < 0: + timeout = 0 + if timeout == float("inf"): + timeout = None + continue + + +def select_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + rcheck = [] + wcheck = [] + if read: + rcheck.append(sock) + if write: + wcheck.append(sock) + # When doing a non-blocking connect, most systems signal success by + # marking the socket writable. Windows, though, signals success by marked + # it as "exceptional". We paper over the difference by checking the write + # sockets for both conditions. (The stdlib selectors module does the same + # thing.) + fn = partial(select.select, rcheck, wcheck, wcheck) + rready, wready, xready = _retry_on_intr(fn, timeout) + return bool(rready or wready or xready) + + +def poll_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + mask = 0 + if read: + mask |= select.POLLIN + if write: + mask |= select.POLLOUT + poll_obj = select.poll() + poll_obj.register(sock, mask) + + # For some reason, poll() takes timeout in milliseconds + def do_poll(t): + if t is not None: + t *= 1000 + return poll_obj.poll(t) + + return bool(_retry_on_intr(do_poll, timeout)) + + +def null_wait_for_socket(*args, **kwargs): + raise NoWayToWaitForSocketError("no select-equivalent available") + + +def _have_working_poll(): + # Apparently some systems have a select.poll that fails as soon as you try + # to use it, either due to strange configuration or broken monkeypatching + # from libraries like eventlet/greenlet. + try: + poll_obj = select.poll() + _retry_on_intr(poll_obj.poll, 0) + except (AttributeError, OSError): + return False + else: + return True + + +def wait_for_socket(*args, **kwargs): + # We delay choosing which implementation to use until the first time we're + # called. We could do it at import time, but then we might make the wrong + # decision if someone goes wild with monkeypatching select.poll after + # we're imported. + global wait_for_socket + if _have_working_poll(): + wait_for_socket = poll_wait_for_socket + elif hasattr(select, "select"): + wait_for_socket = select_wait_for_socket + else: # Platform-specific: Appengine. + wait_for_socket = null_wait_for_socket + return wait_for_socket(*args, **kwargs) + + +def wait_for_read(sock, timeout=None): + """Waits for reading to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, read=True, timeout=timeout) + + +def wait_for_write(sock, timeout=None): + """Waits for writing to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/AWS Lambda Layer/tb-rest-client-3-9.zip b/AWS Lambda Layer/tb-rest-client-3-9.zip new file mode 100644 index 0000000000000000000000000000000000000000..c6a7a45aa5dfe422518a7e9eaaa82314eb131466 GIT binary patch literal 2896070 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%0Dgi343_^$_0Ft!K6?^8$>Np+@1MbYE58 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

gc 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

v2p&D9K`cn#PtmQNsFue#CEpV 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

$`RP9CyO8vNcJR$D} zoyRADol0_|7XwDT)lbO#^Et+ZCr|8a+1`s$bNxx4uIWGMG5#+vZ*wPtii7pysK`00uYcayg&#HEByzx@^b2uf`k@y_k4|I~ z`!@+4;iseO{F5bw;iJHO$7LD(3oKS-NA_~Zcp3VUNW+d)XaOJa3jL7gL!S#AtVYB^ zas+);Of&jJI+-8zNMwH0kna~JKeWOJ5q@@*sv|qT`%5gw&ma1Z=}(%JzlxOp0rWV6 zzX0mS^xsg=xwXgNHFJqc=d@|Zu5oCzXYo@_+($^T1D$M)c4H`SO!k#|XwbzUPyS91 zeW!`%)59f67;GV z7i>Ij20#f~Nuc#PXo=+B+L>psDm_|OYB}zh)gEgaQq_s9Tfb+uUIK=`o@bE3O%q*1 zem((?wtCh@dU*q6yx&Zzz@_QPlpsCw7RDpr=y}`Sm%OYP;utj-P$zoM-BzCtc~NjN zpn8T#y$(3?)VILsh_rg4=gLoOMSK-V($2_}88~l4v8z~H(6vA>vb=zcH20e#PB?JQ znIX`t5<;TT0%bkmjjgfIMBmY5cDvUy9wVkoz^h_F@|D0xGblTkzCbzu3foZ!gpSb@ z!7iVR9MNotK>gwxU_p$-c`>1vFDmzOSzd4$oCubzDBd|;%7xgz;TPb~0L)J_UO#j} zyD-3nAF0Rz4Bw8u5)H}t*x{xs5=D{#?>sZo(g!3&T{q}eYy z%**ZM9NI}S@Kbnio=QxoaD~QD*C`a9_SiX=(bBo{C-Dlvk}JCS{jJz`zWQ}!%m!~%yqw@uY0HVCVNy~)s`I7e)q580VX)syO z6bqTM=UuS_C=Ytj<_XSSBS)9W%7SFsnHd-^LJy!}8!WvYN?e}t08+M)u4gS6xtO9lUw;%AaXoscygXR3E=YF$=e}3MNwKymNp+7Z=*@uS;|BwS`M@A%05A#CN2PFm# zeWDH@8Vof1PImuClSq9OQIdmK4<(L_35tH?zdvWw$x+cme7dl93s-zp(D35mqAH+Y z>2}jc^=yoN>Soh}^nN$U1oBA}eORn;?96?9}7nQ(=f78kYl21H?IRXOgkvTa8MNRKZzmWN0570J@qzAUX6!$aV^u8Z;o{4Jhm4l)2&`_pQroKX-`gS$xK8$!0K9$^hrQ( zF;a>}(_~G0t5-%{gHY#b6OtxaHiBLyugk`Avi*EPxZ8o3*j^m`>L$2gC}>R%2!1pK8ZZK1KKyM=CG)!V^2vshoz zYABc`3BO=8r%L(9TSJ^ay$3fSljt>f@kR^3 zylr1wS$OXTA8()=1ctA8=lRP^=CAr!baQOeSAX4KWrO{EsgHWD^HDiAcpLov^*#1E z2wc0|!dt#0TF8$oeg`!sk|19TyzWb%qV{YPEc@U=$+{dJY7C*RG@7C5bmd^^3oyf{ zYiPeCR2cvbvB&HSms*h?(-i63=eGb;TeuG#Zc6d_Ex7nCz5i!<9`L<0M+QS=dxg#=R=vpxAc~=8*T5PE?lwy?Fe8GV)MuaOJ z2RjHkjR-?_mZi$MlE+4U>#jv>OT25;G6-odCel3wJkXPml3c_*mv@W|gW@{t;}T9v z@M`g!)=?w)a*Nm2NX-qIy(?rCAN0lNXhYi33WO#B;!;^W^APZ>wLM#^W)CvoOhSFsTiWB#ri75CG*;! zm1;|j`jE|iUmaNF{oNMRR+Dz*XH``ssCZIf676*+q9H8Y8a3YPc4#tyie?45J{oK5@Me+1_(Jm zBtI{h-5tr4KFsprOX43z8R%$#*==XB`=KA&5Cl1@BzC`;_%u8x^oOGt{Z&FCKL{~* zyG?xhXsC}I8$}!@dOvfY8$=%sHTfrT0DV}u_RH*mVfRj*UN? z+TWcS@T;l)dS?Gb%~R=?ig)Iz22ow*%y&2o8;RF%rK8KfaPzY7fc91@bj6yjt8DjZ zH!LpNvBi8%R~5bWCG+NI`lX5kNMCWqpGHbw8st%eYEoKUrb7VgS#UJU)#h|PSyh%N z))Q8d7hW8K%UBYVZbw&^yy>J0*I{Pz+UeR#gV!RI`#2F-;Awlhm@j3_CnG0MD4l>F zd5M-1+oaTUWv?opFKlvd&T_G1tTtc_r7H9axsahDtpoHVe(xU-LVcmK^pY#l;y|-P z@C}}p_)S2AAC-^ykeev~Zt#k}$>xO`!gm#Nqv|FUAeS~Mt9-;$qgx^hMLtHay>fj( zXwS$FBhW_$<@9sSE*gE7XwOA1=sH1%%44dnzkXs zw0?WhTK)DVhjtj^Bd-ResJ?GxJ|^6TgyZx2vC={G`KGXAmR4G7ZY&U{a;Ik$`7wtRqapc~Zj zCJPnS_OBOBQC@p_4-cmm&v!hdhNqs8)&oJU1gd?#xxR5!(jRIpNM0&ar6B^GJ4so% z6(Q1wj4@7#dR@=WXz%WL6pSD$Su}6M+>|#CNy)7PLpt5lCJUW-#Ur~ISo&Oo&Ki#k z%6NM5^;N)3Wy%56pbo)*t?mY(j^*KPbZJgRV0x4!#k%_;}YJB~$`ELf$+2 zpyDICeQ2gqN5>BIm*n_jd>9+}d$wO;6m?&Hr@0=)+s}>k`MV_qzA!}_+8-3Mx%4hV z`%@$z#HA z>>$Enq=m2hzfxiPxAS2Z&cC9&&=#4r37pU^q&=sIM&5{w~1Abg2_m-?_TlJBeGzQWj$0qf!>#HEgx zVNNXa2@a0|Vrn7^oQ}Fl;4`FqeQO~899t1|bG@KXG>@4X@wODwfS!Q`S?{k*UwU$T z;JJ8*$K7=$9rl_w_N&Cih>Dr`-pr>=n;Mfc6dEkr(1I{Gj1xA=0oyAf;_;@Syc9%9 z810Z47Bn+gSoA@da3yvSF87jz`F7kI(pK zA}-ixos#3pu3A_nR-;5;)2$|W^OAJaWL!t&y3w%$*hM5Xk4LXw;Fno#T^2%IYLnY+ z=JdLBS$E;q`F<_OmmrWscduUe_}Xv}e38e}_j#Z`UAs$uW7$fg(G+BuhHh=SN*$O# z-@<!*}DTRZ?AFHQK&{<SCa3po^>wot%X=y@wy7&=(w@+`|0seoK4FYmcHw=b8aZLe_i4K=cUcxj zlrqJPY2zKW0G<0D+2SfW#5T?r@0*}Dko`4jSi_Xth#*M*-M*&Fd65XJF{Mm$gO#gb zbb;V$JflFlRi4R5urF$-v9S}Xq zs5tu|xPzkNn;N{Ozb8!W9%k;n0qYFcPB(nxLScQg`ew|BfV% z0?7Obrejd9(k5kF`D4&G!Pb{Q3>L~ZGNO43e zX!wXI;2#migKjlFWQ7Q9M`FM3969(xprgYi|L~P(ABdCW2eyLgqbhQTT08E^$d8Qh zr=Al*4xG0GAow$Fw+%D!yYfoW|E3-EAxZUT z)6-FX%f7IZebEm3zD*a-i*RFX;9F#bJ7~?|t84phyki;r>xwOK^DO(q_+^$i!T8FD zaFlNf$2K7NW8ytHQrmwU@g%@Ao=%bf3|}i4Ui%&jY5v;2QET`0@8m)i&Sr6rY8Cep zE5^Xf#Bk{iM|@9Iso(C82$09xLY$Zqgc1oY_BP;b9C9`a6V_#&+hr;QHhs8rk&Q;F zqZEXk6wr7g{6lk{=<)z0q<&cW4RWNFex#blkc4hkI#U_6>gxRMT)rNJmv@q|E}RYB zf{qfrtO+Z&ZdapcfL69%TZxAjW3pxssgEGz<9G>^@NVbk<_m9R`&NU6B+G-)h`^1XWPF*_Y*_)CoCs*&VG;f(}Bij zrfyFvVR>9T0g!qQ=s;IeXFEBLDd6=r2TkrQGcQVf#gBB3F-kH8=E+N!X~!N0J-?nN zujH@Gg6A^O5QS7f9$SkrsK67Ub;o)!iz}X%&Kj#03Gr-}Mtj+@c58jhV|GXM_8LfP z)sf|dkpQL&EeqAJHEN;LTwA4fV%mGSk<+5Z8j{tzz6=n*5c&x*wJF67@dTSebVoM= zwsaG?qZbF)dRMDj5Gq3BQgzf+CI|?t4;OC)w7B8pd9)u8Ue^UDE7p^@2T2A;e^lK* z2GX!^;&C_9l5Xq^nnFiV(VUxAJXM=b-rP%XN>P?nnf-d^mn%{W^g_&b3zvPI_f`u` z{t(&>xQwq3Mw?TLY35)qyZ3Q+R2w0#XPxO&`^8+pA)ftpUXRe_kj{l2odI=@4hjx= z|E&wD$G&ypcZ_2j^OJywc#F{JAR2sM@9h9wFJhBi+DU^Bs+y|L?)0YpJ}Gi>-swuO z(WND#i*d_t!W5wjq_foLLcrH6u~lV!zfyu2Tgu^8gcyi+54ImG7d*Ejy&JlvT?2;* z5KK=N_Y(caVyCzF3pB@miE-_CFVfkV5e-!yO{*~0+yjE*dLbTiYYeL{-$43ctnVlGpVf=DG(S(@1WXfZJt9|^P z_v7}zg1`XwypJSC`-sfr*l?ZMmXR$jBe!3#@Hj@!7WZXR>l1;PVhSX8wWi&WV~>cA!s!@C(J=_ZLb-miCIYTOu8NlJpcJyW_qeJnG_y zyCIWj$J~DlvwP4S3bEu!Kc?TDAFH5_><|7bau(y3sRY@(9p!z%d9be>C z+J6_QQpI8anS~zE%{4qvUt)hh_cg*Vud*Nr{El$#<#VDfeg6gihqVU2`xr{PF#V}J z`9|mNRuAXyGU?Bc>&RI~)*DfhsV#)S2+o(Ri?^Dt$m%x&A76CvCjK&--FT`^)J1 zh9A+ddeizl?$bivzOV5^c-h9GOf2kPWc6szhIA zGQ#MNdog@g($`6+_yi4FajUUs3QM!i&^J21&frjIoq5bgciYFb16r3RYF+c?`3^J^N1&5`P=2)c>P?*9*Ig2a#DDL5cOk)&E z%6PiZ*HirlTwqrx@Wz(oWy6pR%7v4-yJR+*%Dm!fxDGyAXT#w&C_g9UjlQq=A+ zN)yG(=~hsiw{k?M+JYa54D?oTv6uL&S#A@&Y-o}MbWN40WT&zvWa<*3y-*|$4~>B# zM9&(F$bY6}^ray8cO6xKSG(x%p7?`W(T^wn-WNd;;-{Th#fRsQ%n!l4{E*W-dcH~Y zYx5KR(NI6+{EDM)mi|TJG(Ezi7Ly+d-oIFhD2rv6QQ&VurP!^vO9Wv!Hjj@SM}#r?xD(wxC{~rD?y8K%^laT7{;~OR3ZtBJCh{t}daGihG_w>~fxiN@-OK0PD#`Mkj zy(6+1o{s|`eq>SjgRY>nuUF?;_$DhjxBl*wgtm{3HY6;^>ivzZ7+~SAl0*9rnP=kf zu~^s%55heMS>DlI9KK5vLBbEt3Gf%*$;@W&Gl6YF@_1Avh8vwMs4}d~tBAH>0}&5Tg~o zbq!ufWUe49M;!IiZw>6<9*^==k>U_VlcZgo_2O)A<|;JE7@b1TLW4prxC+qO`T0=l zyO^NU$!QSER2>^T5$hP)3e@T(jj~h}%y;Vbe2P7Pk`O6Dt=@nx{l4zYz;>=+`85vg z8%*L23rR_Orr{>Zv4*;N6O7(=d0b>zC{i(5P+CaH{rxC7HQAT_I!OVHP#?|ZQOvz4 z*5cOQwQA`d|GI_?ETqev3DkIB5XZ6Li>mVAgk7Jj)u$YMOP6LufK?r8B-E|GaAM}s zoID(>%ZaEnQGZ&2-o*|)+-~RL$}sl`5fJZbNaIG+!-@>am8*d^*36B5a`>D=(lzNP zPI{^#aW^%>RQ*SF?V4hsOqjbAIXv33^VXlp6x9a8Yh@Byz=JvUs}h{v@Wo-nmt{F2 zlhBy5gC`!|>|_(TmeT6vN?)SJo4QJ_1Lf(&oK?OuZAWY@zZDbfnuG!Nx69HsH$9uR z!X*{${4Vb&jcdeYR$ko%Qt$OiT`1PRLE@Z7`RXO906Zi2ra!@nybobbs>|uVRn2)l zKb7pf4VAH;bZLY4du-H2u5eVth!XG5Ci|Yn^LV}km?t`gr=|Q?cIL;b&u8z;kL5q4 z1-}4t?@K|mzrXYX3!JuJcUpy;%VraJk+ZNJvxbW>`!dHwnTk?JLyK&rr3S!jN!Ou# zeclX~sO%)+cI+iBoD>p891NvBf;BY0ghI)*Tf#r~_k8Lvjc~W0ZvPxQK&yJAOh5sa znf&D!;K_exI>@h6>WCaCsK~wTQ}k@SZywm5r*U2|7$#Jn1bu8FE+QZkZ_6;}lWJi) z737jPv;nW1=^dkJCJ)udoFmu42YZdij}S+vzkEGXR0HmM9JL7=PKoTfx4Voy0zPOBDP zP#dZ}{B*^ahm)0JTejAM-Om)&!18D-jEo}AP0>d)wJ#L_<91y0+H&sf`t`ir5mxCv ziMufq_96}E)|6xZu4yDDOhkFD7DJaRwY%od3&Nx6asi0Vxe5Eb)E3f6f~T|;t25zG z7;(Q0M6ohs5}uvnKFrtCb;|p?K9d6FPrUF%?=|LKfNs!Uzjur z4h}Cq6QEjdc?z$cEa8ELnrl2-Gk=|)_jPx~6Pwkcf6!@_w{`43y8IP?hcfRYl={0J ze?&ij@09Pj=ckANkfx?-2!m;YATb!CAs8ZQ0^2ts6p6qjNf8tTZ`7!NJrPy7=8 zL^pBbNLwSsR|JzHM;G|l<|+K&*w6daG4#MZ$$_3evK9DI0Y)bW1tOLo9EmjY;r02b zM55TI=A1l2z38t(vxkTkeH4`!`4J>8sG}B~B##jh^oSY9A3>|*D{?4k><9|^z^_B` zDnIaEOdfY}$S0$pDs|+@qaOmz=)bAI7RxY?kiyD+Lq`syTtM;3qgs(JImyGZrOzgveA#f#e?e>5h7EZC?(m=)y@?4X)u+g~7PtTHGS#I1c ze`I1>Vq`kQ9GekB_$H!{Gr54k=@wRGz>-goGo(ycZuhDS6N+k=%A3}2APO{t!<<_0aLDfSe4>p-}(o24diHdD=^ko+~xQ*NcHBnBx z!xOHO#Q+Sg;I^>dUq){hDn9jQl@$8(I~wg%>>CuHCDcXs*;;`kv3cjy4pW_3QrP z7v2b8U^hKQu=IrAb#4Ja2w3ij=sh{LPLZ%@y_f9ud77`}khu63> zOtJR`fTXe0H12`zw`FW0Qi)575j2-uM7P?oO_Yd`y{`_58Q#*pPJDY+vXzb$BC#UoM@*WqqyFZ~LJ{P?8T$$XoJY^5&&a6?7@d-lLtcNYxY_NF- zL`a#(;KqAVj0qd_4*kg3pKBly{gr>U>CL{LU!g09R6*&xM=5}se71=kV=)6uSrV|Z zi@ijBwA_6)7mIbNb&JWG(xovA#8okK`!vPiG2fk?b;8A0dDWQR<_|$@Be&-nFxQrM zS|U_o&-4+{aHsqNzUYN-RIRX}$HQRH>kctXeSyCRVD3#pwoFMmHK7hH+Yt7XV{_)c{=$87%9qV-jgY* z_sGqp{B&o9w3cuwM>*P)7t^oL4d=iC8;{%D!(zv2%woDtT0h%*+5xh55`xwuA|$k_ zWj4ik@T%I%kPNTkBckns$wB3)@pn&6eZQ|GzQXX7*hpSp>m^tKS4B`_tgf};+V3Ua zko-PeE~3A(E3po;iX~0yohhQh?(IWgPtfTK_wwbE1kv9IM8bc0Q@KNxU#n6dNBln% z1jEICn7~T^V(Yd(HsD2l|Cg6H-J^Znb~ya1|MkxQCD+?MA3xui|Mod7|LB5#yO8_k zLQOoZ`-SxU)#O|KM~$@qQzrFY@$Anh^m}wi9=Hx85r`lm6u~hR$A5<8l8=nVQR;^t z1@=jHASCkBA5O)G?!=DK(D)-KM(=>{=PiBkkyt+zEIw*wJA5MYBhW;D>h$sS!;hGK zl+VylV_tDIz~eiT`xQOoF_Yqegvh5)F#A+2?sMBm+_&S|kz`LlU54=oz@^Zq!2$aS zr0pOPJ=8k#_|uq3f9SyRqy1q&vN*^a{|d=T?vZ5Ye`C~+?1e~+791!mSY`M~X;<7s! z8>a+W-toO1cBt2%ryi&mPd-LX?UP-GSXSeA_F{L z&ER=P3MY$O`FW? zDV;9_u@Nn)iG7bcdR@`2^VmkhYS)RlKn%xAb~tMnZ_DLHKoXOeyEk+d9>5a@OQAi_ z>2f!3;Esd{jh~>`OjK0xG_iJ59SLNInk048CLe>M-9$~?eA%k9tA_GG17nYVqdF?W za%k;sHZ}qzeRpPHF?WT~14-4C7mpSZOyPQ*UmGPTo1z=q+PJ<`87Mex_f?qGqDNlQ zFQ=->@BwX78h$|nxC|hFsxJ;0kj)vKV&tJe0;Po#(A^~KGE5_o328xG07F2$zaZ+&?{&^F?~c^?jQ>Vg{w{HDZ*XlbV3eY=PNk7)X9s={hjhMC(}%p7Pgs zJ3J;{aDpX$5uvT#Q2N^3#OKD?&wjLfSv;NIjn6!9Pf;>&QiMA)1#H@=1UsajGPb(k z={7MFe%)}`EeNXzRb{ypVdqDlcM}nFb+@h(+v+)<$OZL5ZR>!S*r(%elS45ygT$`W zU`)6ZZ=ot%UCn0?Bc&PVfW$|~+P5{dK0ylwl2?6*2E-AP+S;^3Jb|>yXrqFtH>YLQPQG0l; z{ZC23#ofPtL0*!HSQEg?8ALKzd&ovl3L||YV(<=B zCC&k4kI5#;uML-14dVoxv5S~N&uuUuRw81Gr zk_P8c5E(eSG%#Iqx>$($DAoIg2C)=Ne54n4l;&{qL|tIDKG_j!3T$@O*$`FV1mccD>U3gb zG>Ji!AS-WkeM&Ljom@GYOrMd|5YUj^kf1yF$h7~9Ib1E}Fy6JzxmHq~G6Y`hTO-D*LIdZl+cJ!|h z>Cu}4K?e~N9RE8_59~;ipB9$l-$eX#Q2UVqMzT-dlsd{r54Q09$eWV+5lP&EEQ%Z* zJ3G`&i{nE^eaORq$vF-m%$Pe8C8-aq1$Fe%<{v%Y)g~VWVfe$U31Oe$>xbh4+0iZX|6l5+^B<|3Ae|SW|Ibi2o&OPa(=((WNeEV3 zlZSC=xi#JtErnD;#P}J&Jl*XMcboipz6}+n_*A>PY&XTxNjY0{^(@mXnXu_g3gr-l zxI!K&&3Rv@*PWTGnghg#M_gabd1>uinR~|MHz&HGCj%-UCUX+sQ}#$L2yY?OUGUoR z)tBIC`mOLPJUYO{NDO}2!>}UTEsA7Z;5*^G`X9g2`p}A zoAfSE@g8xG-%sGysij4Dxh}rnRRcfUVB{UOv_)rYnV=BwmV9UH+IiNzIKukf_sx}C zq~K!8438#PU_QfCSr}`o;O|rQG?9RUmzVN3P5K&;P>p{sXja-UG;W38t z|0?RH6L4`Egpuz%5Kvw>BV40Q#Wa25+&`gi(rvSj?4igG0aRnSj-Zd^V68r|NW5$m zLU!Qu)i@3IB6>>n(QSO1Mqjul-MD=ZmQ@==AhSdH+G03hdN0)(jJEs667hDea{?01 zm=j%dEm5&orvy40wMOwa9&A+K>%Ptw{Pw7eL43>CUnAewwYH7&k(!|8`VpgIS3MLlPLoF!1Jx_>n;12oET$TFLdiOD5=;-~% ztu}eeB(IFeCZGMHO8JVmnY-FL-O#IZH2Fd7s_MkjF-@z+l81 zHdia@3EKwy)XyFBN>%M0flU2+R@-vg^c}=G+F&&Xz}T72;rwgG9QPW$DK! zeVu}OZ2z`H;*WRzrA6XS%Q3$C17&&D;&+6pIM}bU^8)4=1}}N!?6Q? zNJs3af`6!2h#b|yIQ!Jn(Bt^%(=r+($F*U|;o_)IuLOyIoxHZYJMtq{fqZC8M;Y&< zQF!=j^3YSv(Zh{LyKhJT)aj*%(`!!uZI@t;Yfvuvxc#n9^~vNIESIUw{7bupXZi;P z`l}%qy!uPU>+4L>Z`veMf%@I-_5GrLX_G*Xnw-YEsJbz~W+(0cz7B6^=S8gO{R!V{y|} zPc$U^1b)3;AjaXR-D=BT9*-Uij{;NQ{J!629f@c7v{u+V6|c`{ML!c*IRSRa7rS#j zv3K=J!H+vaOCIZ?Ui99o`zSz52-TO{THV6CD3eLtlv9z4{AivM4s=H!sNX)kj=B4t2O0hU!bMD%aSFb7VImw$PkUi#K+(+&(#5W$H z>&-o4Q35&839C6Z^DxYWaNA=zD3aXCf*R;Pp6{BIi+}RZ%Jb?I)+ec=>mDjZTnTV zui_TXYo5RyX>5A{d&X)5V0(T@t+BQ%7`s}?ELLi>mm*#|j>1n?)N9vxNe}^P zne!{x3`@Sg0cA)6mNGUjl>0|r^o_u3kbi&_Q6?ecz!|gdQb~{hAJ^{HOkl4-U=* zSpMw4+>9^s>k}LW_g!go0%?r;n8Mf%!{1jXj)sESW`FAu%o_ZajKIU;cpi$Oun3RA znB3CGw+0Mv=En{F+^y&E-miB0FSqrs+Ki}fzp!tQIoit}vLG639sUgjzTK#D_itp2 zWbIdy3ktU|R(hju!Oc3RZmK|ZgZjhmsusGN(4Tb~ykGD1%Txx5Ds{oT-J z_3GA`yMT%8PFIi;Q3-W z8|8B{*xkEojW5b>0_{fupvH_n8zaj7-Iw1R=gosWqn--;ak{1tNqgj#y(|`T!)Ta6 zh1j^qxZ7aW5(V`6>GyzJO!gE?SaMh8V1Reu5x)8fZ05VxBDuU=8n@{ z!K2)q-^{l|Q;U9j08u=nEpFG%#Fuc}(R3KSR?@OG{h>bJWKr$E9=qAP7N5D{z(LLv@Vf{f4<3JAR)f6VPfw`}rZwVB zF>@U2qMN0B769cH`&9VcZVdWXrCJgoyPU#%MbHHz%3d1mn4=7r{82xx_C*%Yy1reM zk_znmvikM}6nPvjv2X=5*HmjLFIO5jxH?x+FJ#mA_2PT%9&i&8!c(Mn<{S|b9xEX= zes@i9MF*T3tWOY8GgoXC@SwZ8P1O2>@6+{tLQd|>Juj@aWF;rXT%31x`pRO%dLrm7 zw6s0}+ogKzyMho;Bcbl1?HZyk>9%rCyM&< zh*#n@iJexn20J1#PUXzlnSy!hag*wobp!KgUd}b3*^EOr&W?ixw!dFX+1b~3q{;7e z(`}&3qN0?25-}k#Qz(+njT3i>ZmOzfBj{!7L$Yx^;}3g=ZIu42map)z0 zpE;iKXKKPR>WVlr-TS%sb@vnRATdo3`YxCq#1iz=F|}i^7(H+qMDF+aw^5bFC!ox~ zm@*t8a>P+(o8o?r=hVLc|ADH?-=iv>buo35e~YSq-uOR8Rnp%^RmD)=R@$l(551qQ z*Bcv7*Fi$WvYq%MEcqOGKFQ9_yqB=V?$w9Pk=Ky7f5!t|uJ`beEc*9Nc;M4{A-$Zs zd17(BVuj5ys+enodILIisMhoq>|iQTm*io+*KW;Od(u4Z;>+?WS40%=qCDcMh>&nO zY9_a~$I}&iov5`15==0IC}8;uyJBcol?psPr0v|_$Hp!Fj=ziEO5CBlxmNm_Ezo?4 z`~;_y8-m)=cmj0di9#sNoN#}*5eDzK^iz#4Z|!uy>;37Wmh=8D)+vbLx*soUs}sD? z76ifTEpC|*@Sx7xUEW=%F(#BDob92)p19UWqd$>Z>nko5L`5yJ`yzcKs@NTa}KE0G_ z793~pS+u^DO`+QK`B4bs(-4(5Jy{oEc$Ae168g*k~)tAUv z=QBzeoF!Gtty8b?4Q_AQN~;rC~6$16CF}`o2(cSZDoWQ>+vXo&gj!d9{raf7Li>Se?0uKSPInIe%p5$#ZUGhQB3 zomhf+=MQTzPukpSQwpT9q}|Mn=WP{(-eUf=0|Tlnam0g?a#ZBj@0W$VaDnmOXDV<* zNt3~Q-%06cXgBQ+D3@zBhBtN#ZY^Sy1_q~gJdE$c-ypj)y2T;rx6SR~?MzOyCezJZ zlC!w<*b2&mOa(+wUyq=PsVebmROl!wnw)uv`!-pTD_fU8NfOJv$cM~6H`p)q9dNHA zIDZ$+b9jT^pwDs)PvPgGQ|2e8c{u!$J z@nJtiRmeA}Y6nap1rj&}5#SD|j?@&6P&>ZDU{1a!b5@-sOCM1G=(L%j3DUj2Um6M3MnFQnETUPa`mcJranX2eej_?d$7 zNn>T7-ti>=v@K=(nSX?;$YTK1F+D0f6gu}^_p={>2s^&tFD56CY#IR{oZKTxmLI2w z@{geQN6z!m%0fOmozzkGNy#H;hEqoi6pH_CRCRsdV!A9l7#Yq`r1!)CvJaKCqvH35 z@c#o;wf+uO9YX@(Z&B4R8~?|sO8wiYYFlU23{m3A%UP$E55=p(bHr`p2$Q(9*cNbJ znsc8#M`F<6&L8@6c@5Df#;5z_ILevttsXO^UOnSmE~l6d2hw^0oot<6>Y!*ZfPbh& z-&$Ao(Gh$Rp!sWJ(MbdCQ7$i?svvH=d6Y6=9=9}cw(LQ^Y4xo#y3Me{=39VE=nFC4 zoG6e^{NO&UrL6KxJN$X5UmKk2BT9o8j;X&4P3Xk`Q{NLS$lm5CkBMx14(d}rCR_m(n7VI@{^SI zqe;AHv<~spBMI^akEJ1j?&`HGBb=KM*JIm3eySVZ-59t;G#1>WW114*e3--$#`1K3 zal*S)jP4F$uwJ=e8?Pd6<&|V_Dx638Xm=BBaX6S0SW{xuyv;zizLxy~=x2~Aug)Yz z>0B9HHDq&xJ#R?#WG}&nGAoUi?G21xN!O4US}no|M^I~RfYE-IYKpatk<+POEXbj| zn5;LsP_9Mj`NDG=Qgh-Ai+dR2R7@wu2*Gnhu!|ZY5J)^ys=4F+LkgS@nDroy2 zN%eONUy+P(xff5nm;A(@Bz=UiMHrBIvA~>b?&MMD zU>ZygV`c|W1BQBojY(u@c@gIXN0}2$#3o`HCtywW1R@mw`8U)${}5FzMQ*;8>Pgqe zD$G&n+b>hPc1OzM4^S0r6|fgU+#~gz6s|Of7hbq2Cc}~kx9g+N$E&sj*J&_tC4|oO z`&O?}=}bt!0E*BW$%(gXZSdaJ&`e19^d5A9KuC)_&kS=2_|bNva(~VOmnV|QQ0`Mb z-TaMtjhzJWE>o=C^_D1`J)P+UlY*X9iFYIz=44+K{w75EBMK(9yQJ^8`l{&Lrf9{| znGSY)zk$c%Kj|~-l(18Sq-f)kL)a;2I)2mQ_&`w-xQHF?4(XPKi?&-7uXtbcu=dkM z2>3hjIy1p;C6miJGo;4tW^QC+=M}Q4nYOUjT`Bg(CVl&sEu()T(^i2V&w0hc8NaX?_$*KRD@uW`9C_}Rhfu~+fiv>{v14R@ndu-0 z5QTMKUeux3eacZiMbLTZSVdQRXQrLGRCED^l{zR;D*Rq8XHvp;f z7B|vY@orWuZ#T|`k{5TdrWU)iw>KG~FJ2aGq%`qCcGK8UsgoTeB5n=>{7z2*TO<+) zmOdy7Hc6A1QSCNKL;|u@UN5)fYCg9?OIcX ziZ5Ymg>}f^Qd?wFjKH!NfA3O#Vweid^(m`S%CSqSKkZ=2s9|B?r!%nbkL&Hm1~=j6 zRjy-E2z8Qo$T2)vhyhpF=$FNlYtBAH!6~f3zdoL%yq8BS(0}NC+mNOIk=QS=NBE*! z{`FO=*TFc;32Pr<_9Fpzz^;M50Ov`Ih4(@^d}_$0s7hj;SQgU#1;PO zQb!IY9x^#-H~W#t38~;<4!Z6*2mwA5k&c~ipPgO-OiikN$Z-9PgC;JzrM-Ey+FTeWK{P07 zy;|ZL?w9s;Yx_#&bkte@P&tn_b^2@T`h7lxc7EAbG0nGJo4_+Nz>mFXFNlOVO`$ngTRd!9JX(o z(v9Gnuk}+nB$H%uW3?F%UO-UkyG@l5iyykX`5=4Hd}ZKaG*bY}y9HXZ!COqXBraR7#K^cj3&t>>>VZMwhl=Jeh{M6*R5^al*h z_33$)Zb*Q6!+IG{Auc1yq6*(&j|driPopp@>$ZOB!W!qMH97)|>ErG|JoV=vy&L_

gpGskM1Ysd@owNo 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�WE26f_;cPePR?K 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 z zO}x#sofy0pVg>ygEDA#tVg;!T2Zm^e_NKYU-d5VK0C5JFL*8tZ_xd*<*d2!Q1$>;~ zkoUlqXocJhBpD*k+KKye%hbW2;866?lxRiVcP1GUfJCio**@ZY*zc6H1T%yB{bBAB zvohE|emu(@l5wzF1SUPx9g?w;DGGfA>?W|MJw}4544wr~{sIPgiuSo z@qXBK8SL{XL6UGl3z)+(iNm@7K{-w$m<~ZX7K3vqhZgwk`V)+1E(Xt02>pMWKX3Un z`k%%TlpA<>j!bBs(GaGCr2m{XW-~vMHfs3j1Q|7RG&&Tk%g61dyUwjMNG=+S3_P31 z5P{y`p7DD;1c{IJl(}+ z9Yy80xb0WC-(V_L43s_$2l3+G6lQ@G8h(0aYJi}{n3Ar%U`!bw0rQ@DOEq0{BYyHl zZtBwQPv>vWujYN{YXbC0_w2~JV1qs!URWvzI?rCtLR7x6)k3xTn8_rbuYjOoQctO7 zOe=LFkKtx^D}AD)cOAd}ta+MezsY=8G;8?WuvPKR$+fvjii;#SZNYQmnFPMdG6Bxj zIL@jGQw@`&Uo&1t^9ef+m%j^1coVO3L9gAa?W~)4-zk;~i2k4+O8UoiP?$~P^T-eX zc+O>yxytmJ#plIoVxz{#`nx6T)|c7;80=HeV^7RgCaPc;t8Bt=Ue*hjJ}``FOfMSo zo%_xRdMu6|nMvNS0e__TO9J#^i0%xZE%CscT4XzAnvxK?U%O_?&-3idoZ8Dw)kUXe zP2<2%zCGP**}$eT-obiKOePCchnkGaI*+?G+!&JmK-g^5ute1Bt-cK^%Oj?vM7ZCi$c zR{wS*ezkXY>-*f@>H&eVy#epLEq8duCZ{?bzL%pwLnGgRd2UCnp`+bqFM)BW)wq*& zXXCtKRlX_)iEt0C3cV$gd!1bxH$;{Tl{#fJ)Lf%FomE=xaZ*eJ?$A|md{u@w+7=UT zKLf|=)QOH=nDne>__CGe(5gpQHH{yp6`sxv=Xe+bLDj?g&#TVdWhJ}5<1-Fb7LA%V zj)sp_AqSb%MyLxNK5N|$tCHVlX(q|LQ$EO1VTCZhia#YLg3|)QV7;o0pSez(wkb^S zbQkcJ1Btf_|H`^TJoGHnkQcKMUG1qDf?dZR?NgG+^bX-Qx=z&Wn)?*yLJpmBfZT2d zy$(K#xEAB+gsqMp$^GMnf7fk26Jz<~oglaF_AM_DVJI*pC@`QaXdL7N*<}cJ6NpQ` znGmhH>An5Nw_HvZ>&UXPg0`R~+P9wDWhT47X@e4Pbu;;oZ9d>iy~Jb38*lQ?5FSq; zG{tL$_T_xvBt?q+*3RfE<kAC~{ONbxlV zIm>iRBjZ9uD{&dWKWE6*(e(*TVDLaWzkl{X`G7uM#O|+pibhd|LzGC$7uUzROjY|> zlUh`S;&zIrLQ&F39aAnPi>PAEV>lyI9AYdgbcTF8+Y%H!~#p zcIy-0J!VDM&)|h4R7`^K6u!V|aW!6m>kIDgSWQf<7|xZyO5aIMLn-%#I1~v7XN5iC zvYR1nnfObGQpClWAGiJne~ikfbwnrx`Rt<8@Q+hV|LI`1&&22J5>QfVBhRl($n8lJ{)~ z#)x7qA7!LJ8nr?gM`;7A=dN$Z8Hz&~LkWM+f7s*nv5q!P$(ZzshKZS)uipfnvORuO zq7aUg`y{{pV2FYxi=AM~J7a1ETemJe0Q8c2U0B40_@NxSaxHcXhOh6lXR}mrh!ssL zgW<(PYB2W=C_Dot%EVIn9lq<(wP&GKCtvin(2B3gPJ43k4colZs#+^k@hO`XD8i4l z&K!LR72O;2LFUda+mw7NJp33thO>^!E$ih~Bp!6i!EOgW6xDl+d)M^_@MVUDqhs+r zTn)RwVjK^=))<9HP2W|)d{Bf^tcTO`O&+{VC#|dheAk~UYg4rBwSz>s)gbVHkP&BTo1y$=t1v9=iF^0x;H+? z>zw0HVuGv^WOYNIX?)D0^=n)Kuw%8|Y?TZT-D_Y-37r zeW;tDiCy~D8EakC4OPAk%pn9Pm~|xR=J>gW$C8V#wgy<|IfN|OoduYDUaUCt zBApgE~^g7sp*+br$@uUCXK2O2+L;V8sv%_c=woDUfouJ=qJd8e2WjUK)T#;Pd zi>@ws^?e|oG#PS&rybxwZ-Wv>rxfR&y-3}Wo%}v(r1(p@!Ox^2j8!LIXwtqOBcBUb z3f63f?n8!>3{7rid*sEA{txp|;CRO?`*$KxIo&F#68He6`%d(QTm%JgmC7;y@aBQ6 zNO)h)8|^LttF9Gh^P%p$P)ajcNPFM#bD=xT^$nK=YHBJat9<)LmL)bRHtp%1!-yI7 zmr?kLG40;PvoWH8=!6xx*ac42{zfDbaXCxggrJ)h^Xd`M2Ik?zNpBdfxW+dAVAMJA zsdh!W-C+zbu8+&yOWnbK>0@uhxK^0mX-rq>%D1zhngt=6Q6%WYvx7V^3D5! zKE$*ICb3HbU)GkxFU;&|m=uLIfEz`BIKmmbmBvMZEMnl%{3Fl#hp6=QT^C{^tLyrF z)1;OkJ#mLm=YSKR#M1^RR}Qzt;CJng^PqyZwQ$s_ogAzFq8ux7ACZ3Hyz#)nhMsY1 z$;?RpvOtj|Dv<{{FMGPcfj>sq$yzh7Zvi`pC*e`MC1Ss46z^u7hO;mVKMr+f5u}q( z3lKDmzE-6@jj5Mi=JM$hNs-6@8r*wON6MJVIM-i}s+eD;2Bv9?c6N z=xV!6h3}MAzIMD5w%Zx};4$v(DTRewjSP@~Ngp`W7IwaP4rZ#RD&0<7L--oM@Lw?N z2~|V&t&d&zwYIA;N+E7EW^YF+p`{{xD=gZkF)4?h(MGeq9xV1;Rmcmf$HYVB@6&~O zr(BV}iZVk3T3e4TTJ3CU*`~^_$W>-;1YNB&eKr!4LA!it{1N3a+a}2R$VsTGRml`| z7`Q)TP_?Hm5RH6pwh1cyWtY5JHrK$>)6>qQ99v*fwP||oDTZRp34Fd;OFL7aFth69 z9gY^iRbHH)B8Ov{q4w|gpN4vd5n{>SVV0(_LPVPSsp344X~A9|b7n-`Yis))PHf|F z3S)0yR-Y^FCd52c^~H!@B4zJvwVNj0dD-F{eGR=d#zH_&BWFAcn#CLuW6@OJOLmnB zze^oW;r@0VhDduL6T${T0_Dk3-hUru`t2V!P|w29uToWoui{xX_f1Cs!+G>ORKbmzHdMM zw;&%|Zlu2*R3Lg+g5xUL+A?fhS-F!XVg;QOK0desSQ2kXjdmUWvF&|gr?>|86oP?W zkdaz8AYDQDI}&%3FLPRjuo(sFd{^!rE+NBi&3O@nF+ZiIEc z(&}IS?n#_E$NQj()?JTT?R@uG3+h>ib~t(U-1$gk;uk5V8fV4%$~d#f@0(jP0wtW@ znW%POs21hn%m1zHUc?{A43`*H^jYQTs2XrC*GWq*TcEra8TYF#+HTndf1if;Dr0wA zh4QgNkWJw*Lni^(CjjVxiMMRi(D#5(rDJ*qiz_5PVAeptH2*Ak0f2Yt@ObW2u5aC3 z-3^&%OI@+E)JTL~`={~sT5q{=`COpdWCu~*Nq-wgEJX|oAukGD+KOoZu2WSpKrjJb z@AU7S>>w2|nZoGObh@KT@-b&j%M5$pgBfn)U-+$^%6FTMI^D&yl0KOtgXg!br>he@ zy{(hW8~#B@nf!GGg#^}fR=~Y-X4Dt_<5v6#mL!0tQ_>RhwxbXJO^#ix{-(3E77I&{ zPs6%E6P}M&9(MbmFWZeQT^g1GDy@!2Y|rYKte1h_PsAkFp7Tq-2mZWL7ekVfm`$Cc z9zV$gKVxW)U@bjfHfVc%gxziW>+OX-HSxyOQ^Ria#GD4m7u<#!_rHw)gSB(&5e3+` zb=$UWthR02wr%%n+qP}nwr$&X-?i^~-7hCONu}xsR4Q}kt1-t&B(ZL@HiFJaM{3w2 zGtaPKc|ja*r1Tvb3qMcSy;_E3D_h2fRg%l%^|d)7L)nzhnI|+FC=eE)5d-c_r*Dg_ zM|US!tS2hJ7f88Ws2I#lix(7VmK5uQVoe|YO7R6{jbbm<^)Ck+uDsyLLDK0)uxndu zGH71jRjz@*LBbUAygDFvePsK6j9&TFYjB<}Xc~LziZ(s`t+TC^bd@B!Xsd|vG2|L# z14mQ!r{~GNvW^xk`$)kvi(I2kQoP%C#N%zkysJWR#gOxZI<>sm(th_B@Gd?>(TQRd zkG@phYt1a-_a^n$Gw#s*#&iS7eqevXfs~Wv}*&cr#Pf8^n zb$2x_aJ;KoK|ET86(6ri=?wtR_V0CN@Ve>bH8X+BGL_Y|>iVn^)pE$OD^v?R+ zYBTH2k- zs)z0S@gbvh03(nY_NyviC%8IQw&Xk+^0>*i=hd9YML)NWgWBWO)MMNE-oUzLG|6J0sSKKKEQSSNO${Qa$JVmuEAr6^V)B>(BdbIM67;O6llGW5s_&~-c zPEfbl4YpH^+@8r=ihAU}+zq?xxFQ?0xgW#9u4)ap@{Y^sFkF&g;uQ*$QS&!-OdqU- zQ~?cDVI$eiLSU}p}twPOx z3=;<3XL~;TVq)UIWQ2-rkbpTTS*HKba#BC6?DZ9`lnYI zTi)!eL{~8-op#_sKMFpYqr`Sc|3h*uc|#p>1~`5mMMh(M$%0kug7Gft2mH}4z;-q& z@kinr@$XHI(oV<8Y29(mS`+BRvb3E zGYZ7o4PC{Xn`|uLWF%AL4D|`d*UI4v@@~P9MNKR5J22j1cMJaYT6%?_B$hWxSRVCV za&{!m9^y9W@I4p@t&hWaS5}0r*yHc4xL1tZ0cUh{ zk2J(LF(fUbzvv`heUl=J6ZKkp3RgEw#<_>m2$+i`K9VL-z;f2;AKsqUsh}8DrY~bX zb*tuoGsb*tyIPs9VVwEVht~O_6b)RpivD6i8k-9;55a~{gIEY{D4a=>{DdZEPx<6$ z!#jnfp_PCTqn_BAk_V**CE2S&IEHi;f_MzHEux$Llcx~=ghqT86bW)3AH1?M7E;mmHRfOqrS}ns%UiEXoPlVS>&NV)4q8tIe+_l z+JTyYA0AF|E}cGU$6pWPfpJ`>_pKmal)x(tNTz+9PF{omWOZ5Q94C7`zt@3_*VeAP zi1Y>~JPIU*scJxOlNfzLMM{W$aHK z2SmwP`^hzVM49cZ_hPGzBDR)J{1thcBwj(|OI^J3Y9eO5A|T8y871Vd(b4KwR?N8( zcKwD!_d89M7}WODc8(9|0E5zZo*Fo-N~C-mvyb=UC59jBSwziOW;rnKN!?V^tTj3R zf;d+0yNqq)-!F!$^&uGzs{{^y>Arqk2tns?HnhzTjKK6o!9{0i;_^5jh)kmZC)C>? z=l!I$e7)_I)mJO81$b;9vSM++rdahcNrjlcy=%4{iz?r{CpI8>h2E|JzS4tc+i722t`E1};6jDq7md$pCWFgXuLl7z!8;j)? z%kze4n~gj1p*nuZh3J*Tx46EXO)B{t$PxOYxm}yfaCiRu53z$o%tfBS&7lDR{0FT6 zcjT@O4FI72e}detP0S38JpQ-TJzI6!4p|IkH(jT8HO58|0;NJSTM)VpG!w0YC@4<_ zX&%oK0l&H_RP!>szT22@>WaO;+{uFdmF^6%NcRogv&{1%mti%hP359mg>NU*MbHm~ zispLr^<=uI*5j6K=Hj^mw3msG=SrtaYsGHGsTYbncOdZ>CP*u5C?(boD>3MUx!#A% z!8=ra>qJ&tQhQfs!k6RTo38u~wNW>say*OA%$==<)TK9v`3r2!#KF%iAi~1{8vLxE zm&X*hG42IdcYhf?rq_P@z^Ut{?|?;Nx8YleVATWoD8$^a3*rHg7yhA39ps&U4E!Bv z3|f?TV4Swn;|$Vt(PCpmBSx^e`;r*d!~)@RAsZ!)9ArsGOzo3Vs-rs`sr?Uj58ndn zU=$F`QZjR*1cDfLfy7gM@ho3wdzWKpr}Ov8bg~v(ja!NurxdkJg_YDG|B0XvW|@5% zb|)$QRsOeaO_6J{yit0HvD&y)qZ#Dn4>W>_46O*t^&)M?EOlmLXbhE1HSI%~b^NV( z{%*lTT0vWf1tt0}{A6sE3?pe)OgJ|OsarS7n+&H`I{-DRZS4jqIH%cS&UwuPQk6=q z<_WY}i>Hxfd#B{S%*_mD`BymTOIbxV;`?$^NlS&y{$0t-(*6!SD@xD5k;`!v%rC(* zAoPe~LxdpY6bP27ws{(8Qo-RRdHVPe%-99M$q!LHVJjjNb$T#RV3A0le0AQb5e74! z{sbDe`=I9ldl%fPT-ZhsII4@`0u$+4>rJUZ;ksvv7>$6@z7*4W<4a1d)c66OOQHA( z7Q%IkNhhPg>>J}cav!YJdM4S&d-Eg-Qi3qZNaaQLPM#>o75q}d7c}6U$aoY3zs-Q8 zTPUxr!GsBQBv_KNbrS4Awe;;_&M<=5gK=037Xyv|n~FqGYz<6DYEm z9S;BH=^%oDvo_|0Bf*<9QuRz?z6p@UG5U>xr*{nX@U*VaA9I~sLb0r@8mxo_2=5sY%(RMhq_i$09L#uOJ}Gj=cwWzgWN`BAe%xtu#U`DEO!WqD z37I8kO(%T8XCWAPfNb@)q>lsAM^$ik4WN%(@_-4QyEZg)>+IOLCd0%Z9b4_#_Btf^ z!(4*X2_fVNG{)h43UE&onwE@S(9n7tKiOG;1YnZI3sCleySER<;0^hPTIzSUaRbJDs+qL8dEd4A#^SHt*REM-|AoL@*80sHHh&9^_`qHw z@$9eBH_VbX9^>uC_xEg4?BuECN%Hd9=5n3d+6ez|qY-xT3HAv@6SRE{vOhQ}q9h4k zYD=JkGD`WEbg?(Qoow5mBmwt-5y|1~sZMQx1`2pAxrcmpihMIbCV5K)spV-BQ^Iv> zc^jSD07t0OEPBkzdL&{N(Nl?uFJI*zWL zG91@9%r=e~j(3SEPa31@A!B1(*`!;ge48Zn%Afm6ptRdY1&*UwF}c^ErX0t4qF;rh zPStVe5)(!MX(O%T+~Vo--1nQ;_qJQr$(^0FfA^iwhStYHGT}#R<25zt)X2SSG=jv% znM&b663v5zB}65B{L&5q@;BVUFn+ce%meF3kw&CTMJl-U%F<`8Hjm6I;D+jT0 z4%n3VBqQKu25?Pl3AK^lQ{Q?n=hxW?Z2Fs&gVfjvY+icK74UKcuz~5RIyVEGXL8;d z;OYx-jl)A{j_$`gOvVIcc!j&*Y1fV%2)8V{|vloY-tpK;gdz=P9q?3>JUfL z63mC6FIdM`Q8A?tespifX0 zUi6_j{e4~VT=v-4c3+nxjp9hMUGjZD5d0B3@_k*h-M&|TiWbC<_J|t(Wb%06+OP-d zuM)*HnyF)C@Vlb@kwG~?;roPOjWfAk&D7LxuMWkrSzxPYkfX0@4|As08+Vpsd+P7k z{MP`DcRRZqaLcd8zHg2CIBMkMeuDc!$9M9nvwB=r&DvJYN7TO_z&Devq6mK6*d4~* z6k!@I|D43zBGS3ororDmMUhlbmk;G&{S?U(Fi!d=fu%gTSn^4=uobQQ`7FDS?QEK2 z+C?!ID$;G53%Y&wL4l9$(Vk&fBJxMtw?&@jgp>GS)tWF>Z!8u1c*b0umS&2(i%)Ip zm*&H{UOsD@Pc0zdbx@#MezO(0*f zW>=Q)3FEco{`0(J(cV&~XR1cJaU_H7x|TiK#ID@JiSwFMYO&hoZ}EB?qs#e0)9Krl z;ABnB#^h9{=)UJvEptW}T+6C~cgHnX4coFNyeLksp<1Orm(8Zx6NcoPaQq}OiHtMR zuRg`vMZ=e*+EHo;)vw0t5$+F}^hO~G1Y^R6(gF%|C)EWK-8v|u+jxpJWYk#CL8VT5 z0F#o5(vEPef)v-#QQJWz1G8>4zCb;UQr($nC8QWoKS;)^BQBqO1vR&PR!FW&&{LJN z9af=#$iPbw$lytlI)rvn`$)lJPo%ctm-IN5f`sJE*jM(qm|~&PGj2Jx&49l*`&bJz zwNLtw;7%M{-$2Ji#?WYI0}PsaN)84Pb!jt(>@W~r3GFbmB-r3{OQVkwJ5@(Z4=bT z3LtdGJjjnk(7H>CdF#5%4k!NtX>9tKXUn znD=enul%EakL4KX3K)hwt{DENDAnqm)-5!19jC>0G|2krf$#U_6W7rxG)oVL09rX9 z=+FZJB8?s?h8J%b+t&x+)FO%0%HQKnX6L#-WUvE7KS{VKJsf(BzR_e-SQq^Ns8BtZr9z7=JR zNk(49+dT)r?jGCxZc76gyu8Wa*K|_SkSwtECm4ab&l6ZTWj z{t1vZ_h;<+_886S^=J24jj&ZC`1u#1w)gIEW%X9D<*n}RV|l(;4WM-62LG^mlF!!0 z<=(dD?jyM$i~1+x`pc^8k0I{tjULWtw{l-5LdgqtIhd&Eu~~?mDIljXSYZ;F<{9eO z6$LXN_~;v>|I54ELdFwj)h9?@EzLa_PfwrPQF)|*VRAKJa2;$ud8Zr(TdGE&&+)gl1ZqiwlG56~33_^Eelg4-;ps@ImtL zgcv#NW?E```-618Js`tCkwLvl0F6xTaE0u&!4gV2$c!@<(S9Yz*5mXDXw^~|Me-p! z$^P$TTw>!X$OF7I3wQj_O&l~}x$&aFgg-3Lu4ujG!6iX^+YZ!X0>6VspjBCeg0__Z z1Hqh73=nOA){N$#0KN=DzDTf?Jw5$jDf222ifW+BJ#KhQiP?#v(y}L6#Hc4vRE1Ws z!FxOKFP~mH89y2-aJ6?i$_N`u)Ifr-cq3t-al@9mE%t3O zq|Mzq!3~#o+XEw>Ku_YI#n*vcB@s!o3$#o%G_ogbHZ#0#A<)kQq=Q|UKg6< z9C?bgJHUWqJEdrHZbct!wRa?5)gMZFcKopLruwYtRCG3hzq#ZO?eQnN_1UjfFJv}G zYOU0_-*I$e;PWfOey#bKpG(^lI)s?f>byU??Qr3v5)S*U1OuDIP@9SSOg9f@$N+ebv@AOGZ4d})2X zWD1C4n`Md4nh%#twFXV(7!Drt^ABNtu5%nzGjIN>c9)lH`B0Zkgh+xNVB2rTAgQ2@ zcLd>_ss8ZFQ&0Yod@fj$+H4UP2R;kh@|HrJ<3L(&Me<`Xhi#ZQ(ji^Y>X3S))GMAy z34v>s=po&vr#ohK>;jPipU{y$mhQE9&_$);hMZdFetaHDubRQl`o_q_D19Sg-Igz$ zt^0+x*0#O?21!Jr8U~Jyr$7}^mJl1DtIX9+9BO(c-Z^#8c!G%7lpud%Y1Y(Ua zq+zxVQ_vqPkjC&T*pCLwU7G|HV@IUDHuUGZcm$Jy~h&dg!@C_#J2&>q+ zvAbEj*6lyUJZs4$p>cmH zB+p^PBAgFffIX!5H?I`ti59eeW~s0fBzrpEj|LIG8DgyJFyI%Kb&j@KSRP;#-q1!b zcyzH4`s;}2IpV;aW^B3=1gL6*#@h!-Uv|Zf+nD z88fS9Z=3Kp^m|tvVnv~?X03CZRLX?{M!(Y-cSmLwP?9jboOKhHk06HSiVd)uI{qG~ zO}xB-X$2P@3jOal&INQWYn|=H7-nA>%9;x<(mV7HC_4hkYZl{x&cHll{!qlRH$S`j(U6{R)Ik58%^77F z!T z0kkW0A>9dHGuQ7wLG?DZtzM9=>P5BxYe9#wC2QLfr1IEaNEipS*_@L43HJ6ch zOmH`3qzirr5d3gSf`geeYeo^dfzz4d)4)1@rM5ILfsLVO#Q}vA;uxW4XK=&fF1RX%hZOey1 z0rrg+mSgm0tjNFpx!|#Imn|C^cX&8)Cv#HH#>l})XQwGu8GBetWhDEv@fXlDAq!r3-<#wP!JdXTNDV~;cHu#>&L`T0+C$qq!q zueg-(K`2KA7{P3^UP6&bKsukmFF{iMW@ysbh6wy5jtMxvvA@a^h|}N{}5oAe5-xM+o;E-&Y{kw%t2g5SJ6FPZb#+q=#LdnNGViq zKq;lWr?7M+@xiR3?V)ArrDc-d1D7rZiK@+N zJuo8wGQ`R?(`inyW{jJrjrBsnj3f`f1$uY2c<&YSV3|E?Pot2Y=tre2!0hTq{-IY3 z_OY$=MopL_8;`rMUU2yZO@>a7>!9cNbmb)5A6?Jqi06-CY_^)Nb{rKu?M_pjj*kSF z?+I+SS{gbX|8_}QL=d#7>o*r#D$W)&t(;tYQjhDJo=R4-#uOj#kbmQ=lQg?>v`R~g z!70GrF`6a&8lk5iz6he#q;jEe2JRc9dMB}W#PXT>w|CQpTSd2~93$xDCy6yCiTGq_ z#Trt~-Y_jak~EpkIVSl;X-%a8)xrXtzBDX(G88@>esG#`u=AdfzY>=|*7z?=-#jdR zvh= z4E5Opfz^1=Kkd9fZmyKF3%Qw1pV^tgYD{ueO^_rH*jNZYpp*RRuj>I2$w6~c&mJ~x zK!Hcm0LRDIh;9ca2o@o%ArJ`38-WWO1iAxi5Nv~UXu$e&DF*9N4MXmkX-3UFK zr3;fKpJll@Eu+0>$duA^{N4cST2Fms2(5Yw27OJdp9XpulEM<~C{Phq&=14%Zgl^P zbUE`vJump7lJqE~FKR4~=vuUD?1MDg5ij`#ghDvRt?Z^zM`x_vT^jt+(h}Iz~5Ov{zWW5E5y?~F21l$PAj$5K+|a9m4lx_J>cB6`BSo2a+`j8lh!i2 zZh)l*T;4mJy}aD^*QlhG%d49B=p^8UH_*B^f6F-ztFl7HCL~$q&B)6*^gGis_i9Pl zmxODpLmM_3VaZJmG+Fc~fD>Qw1T1RlZ!Z7^zf&-|!;N_2OE$P=SB?PEacN##lu%(0 zj`6k_*cqnjM5q!P)vIz|%r^KM`augY7RTnWOtDLEu7tIP4l|npIZLob?RtzEl9NGX zdbk0b(7mkt0?IA32p4ld0I2C%(~!ht4026oCGILqCND({`pXgkjrv!Ig&TrWc2sX5 zZq(*$OPrSJ-iMnfKFw$TB1$gvuA@Ht8Ij0jFRT+VrWv}d*>=b5XaT$*bL^%gbd?>z z5E#F;Rz!&m6!gp9%$UQ`V_9T-nf+)A9@c{RsHSpfmN#rs4{C41A_aU>>emwlHa$~B zOltfy#N0EtQ0Coa#10Q9LBE1tbgH3?cm#LKwyKCqgSE;u7 z%hb{}V4~o>Fd9eY$?);)_s13A?xq=i7b^U3e7jr{t)8R2XB3aL z@=1Z0*V}Zx+-|cQ_4Pdb_;Nm_X-|i=;xoTv<%&K9xR#8#1O*=RPFeNXZ7m~KFbcGH z?xy>c+jgzN1qxH+bso&KiXVGX@XYqV{9qcZ_m(~|Q1nR%TCOM>0*CE@?)E~57d4`1 z2s`obLG*BARw4Rdv1Xn35NNS6N?BdOX_F1!SrF^;hAe)}+v$XZve~@er-14LieX)! zkSHEU-oNZ8_ik=6ndY&9$hS93bbhwEqLMR)_w^1WKyL{I8j}}&i{KPV6&>K_!#pnp zl~H}CNqE+ABErjiFQrC7!Eir45oJ*Jjh4p+q&v+0wuMgo<*fuQ5(4%#IKt(yaf4_gpuNd~gi*?ZYZ z`z!+rock1m03}oK^u@oKJPAt3Bi{NX6D~R)d4E=y>oWueH)KflVT86(P~fDCUZnuG zpE7`0fvm@T>^JOY|K?oR;YK&5`!k!iDxhIGey0djLoDJItEMy+=qPmFnxO4TGFFGL z11+WuY(0H(?J>6kBzR~oc`santdYKy`Hmi+bl7j6WV`IA``4Ku8-XD2)p$HFSj}d0 zq4zor9QvPg0;VVSX?x=CJkg+7Gel1T@3*T5rsj*=s~Ii00`C$T(r|?>$riPQ7Hi6+ zo05j7)fOczJE=5-KvaVKy^`wS46+L8#irJI=R~vP2YfqUYlAHj;C_|y_C$`bbCVfqshAXUCzSBfbp42<3fLgE^$%H^ga#bG}Yln!Z30z0*;0Hg-u2J4aK+Q0arp zgp_cTC}MhKX?S*AQ?_HfSYiX@`EOjL{Tg74%MqMST#Wp@Xcj(x{_Mlk07GVe2sJ*i zFC)M{?>=yLJF8)^3Ok208OUIHG#ufcQkVD^`Q!qmnFvvuL&3dru!7Mp@Njdib2cXiLDzRDaoY)LH&wP7a=*LdRPfJGYOnK0L2stw^b1aZich;*Qao27cmvwZI zelP8gEF)uu!Y@E5zhxvNQ)93kVivpa=9=$s?06`OelN4>mT;E8>Hw*hr{Kxbgne7( zX-%GeDacX+pH5#_CKKmmOkY+V(rf;K{0+UU;;F)&Amri&C@N@%;+R|)?Aw7gSabN$ zEX+rHJ>{UkABJgL4`PoV5XWxIYyU)&vdK*M3D|9nxH4;X^nCEcz0~JFN>CN|_G9Pk zwqD!1i2LHDt)Yz7xed=#*itRkzJ+2M2a!e{O9ll62OeqJBfoOiUf3#mKh)upy?~pa zX$c|KqFH`X&LkYs>ZOWqNk`|e|3n|Zz@*c&Wbf98`&qUynPpX%Acv$r`s68^NQqPc#9!moJ0h-lsomA`5xZ~R%+5=qWwN#xNJq@_=%T5cb(#U zJo@xseX*^)Z@tad6V6Y;yhK?TrO*)5q&Ik*;buFnohrhI-N$GE;{u zqC3IB+C2`3m1dvay%7sc{Ka4dQrMw!)-tq88o}7(O3rPd2&a#&*!;p;tk^(rC$~i2 zix8z36L}Vsyq|@uPJ+;9WA<7QZ{7G`CFT7>(zEhc`Y>Q|nTNVZwDQ;yyJXVAjxK$I zAHdu`0)@}{gG8w>+~EK`9zQ10XS2LgU=+dky)sz*Wc4|Lx#0p=ka0rN;cYg~iRLQ6jYW1Tnm>eoomLBiCC_HA0ukUu#&Y#oM z6r_R^7>x9z&DWhQKvh6ki2CxlyPF1A6VJq!CH z3n(NFfo_5NH@7Ngq`ZN4lJ?6%zVG1TchZ7Np}6;PiE!rx6pq^ZF`q`bgggtOZc9C) zMN1-SqBZrPb&M^p3Imhd%NX5T*1xS5-bi<$ZAO8S1;{l6WNX0|`jVKKC^wNeQFGEr zooP(12)@9ig0Ux21?D!D(E%aaW=iO79=6DFq??6qJK7f{zSzmEvYz5t>209ebU1O$ z;|XPm02tN7NCJ39xS#>-a{7W`U$(TC6^nBhBwa zRI^Jx3NCbi{!s1lb+Ti;g{FEJP9w~~;q@bUI}(QOmwQFY7`(`Hbvb9nZDr2d&uExS z%j{cZ`{3%`SyXBvbwBO5qxLN(-)+0CBy~@k_hw)2W-CJOK>tM`mwKs099tnCe%=-F z6zJ{1vWVi?e$+VLf5-rlJ^+Y1i)b?Fitw4Egp8~;vG0L){v>4Ia)D#smft{^yu1(0 z7w7A!$;vgun*gM*-^1o47I3a}+>SS>z0SoJb_+}b)FCTYQPQ^T&_}a3Q~Jp(JZzWa z+X??M!qLZvQMeSOP*Y*?A+T!T5?F_(8Vor6c8p@q@tOoO)3akn<}rH6I*0bzl4y#I zi&sNxOYg9U{2UyAulASB+6?CzqH#yu%}4;Bn*eMg+^n8BE8bm};@0qKuVq6YD{!f%GknIokJ5twrmydXQ=QmV!&9f@skb%*2>;oOEx zJ9eLm=+u10wV%hx_t5p$)ER-;JYe*3y+@b^H+c~{lU-KX6$si|%A0$h=GCE~DykL$;!o2$$jpGC|~Cix6DA^OA~v8IJB>wolcIKi@zBg=On8e9yMdRVQBLLx-Fq10 ziFPBfS75MWA^iWPu{P#A0d@6PJ^ni=c`Y^?@`YIS&vzVdmXehcv*W zpNZ8lDmJ`_;xSoQd|3c^YNtX~X6< zobniEvC6{f`U~|&Wm=Ze%EM{L<}Ge{p1G_tS!Q@ucvkYt#A%^rq3OZp!Rhh~6eV5N zpg#|8sPVf;%f#}G!hn*Xr(-3WJW$6482%3s$*}?+%25IyQ4{b2?Ia`l+_J}q@_!zs`!1KN1Cg6oU6mbF`2&r;|9t;>jk144#55fvLVsTW4=8rt4IGXb!Lx=7= zHJ=qi!;ug6?HU6pa}Z+LW5bkYEbhykpfs~}>4z-t*S5FFDtXE9a+Rp$YzghCX{eZu zH!IegMM?*VuUXh2hz~ufoqc9)tr@Hb3lEuAYjrw#t)_L_yvIA}*_@s$Se%XrqM@1C z=(f`$Wp^^VIi0=_NUd%brk>X$(QUnlI~)vNj-^&AQ+pmxp0UxX4;98?X*yM%y6S8~ zW5Qr)z*$zKC*msC{f(;E7Mf47Ws8ia7aW;^#VRTpaZ$v@hu9W;U7IO;ND?sLC$$Nbk?Y!~4v=Tx7(FM{?fAL0; z>_p3G4#5R6<+2ZI-;-*D)JqTG4b;e_{h&`Pfv01}8mHC+J89N(Vv{+QJ#!yu+COF0 zf-Qw)V!OPFI24fEFQ7}1D-^VuAGycDJYRs^T&TRqv(?8VH39R@C9o1azN{Kp=@r&H z#FrIe)tP134mJ*|l44SS+JrTj;W`1D8hkEkoV}?(+pEIYl?itmBBk{4fCpi*$AW%< zh;osOC*ODY&1Px^5(6`{-=67{|3hDNlf`rBPTikwKmUBu-(@G|P_jRhYf;_*)YZ6{ z>v1E!7c$dG+u35hn!N|3h{~S-4_8~TZMlf$SVWxvONM5LZM_Nb=8Z}m!nE4>5aLR; z;Iv`mN)ma%u-N%vYxLOBcAhG^_AGhYBy^;FipQP7EnNwb$h=P39jyEFx5ktHcn)U& zF+|VJs*l@g8P+ON8Fk1; zT0u|F=pBXRQVeWPLgt0!DbTtLvv(cn2U%jQu`daN{G=-y3S6q8!#wmPV>gAYVQ)O5 z-5lI>kDZ6eyBas>JaYU2vct6PXLD$3`8-ul@(9WMh__mk9~>wkXZxE zJoqds_V(ce1#^0JlxT>FhwEZ}RhhYlj9wFV8h&%trcGyj*SJ>7omHHIe}#DF>vxDZ z$fyrW;;6lSA?Y{T*p_CJmie121^%wAfoMrq0LU{Fg@7RiR_2(@*)aDiIc7I@M0sx4 zd}KLk(}iEM{v@CnCLy(^v9M|dB97%86>&q#7~bgE1cb)?e-1#6QR2svTfN5aW{!d1 z%ZKNhOZQdB%z1_gTtj@IR`>tx7cmAGgvN0@WxVm7b^i(f>^bzQWLY*bI|qg&&WBn5b58$WT#ILW~2-)a7Ux?=*FB1{CT zvqX$*n9v_2)aZ;*5>6zib$YN5ou(|>)0BRZTg1CGJHO4<4GQPZtpS%Q8W@jJCWoY?{hO~Q^+_H^@d}3& zY^8RDMO}fl$V+SWnNEgwgnYN(t?*9rqS}8%DXrUggejdP!%_&{;)s>Vbp8gcfHvJ% zONlvwwjRWgk4EkeCy%xZE20s81^RCUb?$HeW%eyJI3MNfB%F9OcWmR)kcD42UM!zz zv;ROKx4I(IY`pMkyaDqya?;T$!#is53tOI-Ya!?!2TTO_6oKds%m`CYo4~YX~nsG9?Y4#dQEVCNFFs z$C8wF*JfgDYv}|IsJc5!{ABUwRBA}UyF^mlLKVlf|g%Aw*VJPPeZHm zsg~Iqp1E3#_IQ{rHf?3;kybMuUI&-Xv?M#|3d6T)(sY<7t1{7Xq~Dbb zr0OY8lob;bGSZGFU)Sr^8=05B0a{#Rgu{|*Dar}4OAL2KIVVV%z5u^?m&X@m>z)U> z%$hnaXsIx{OZwCe7$66quDv7=7JxxyuW{_|Zb%1>lw-3i$d<;3)L+V1Qv?)IAB`w9 z%EWiokOpHSluv*qHbY;ugO7lV^}L|8L9hGWyewzO+g;}zt!j4R{sqybMz|Ex9a(UToj)(=f?})$+B2?|(K~lBCrK zyuGirO_8d`Or|>AJ6o;ziFjFAm0j7lDQqRNCgwtOXz+Rq;-2_fKO4n4 z(v-IAl5ff;f~lGXvKbHD7}=w7aDwQR{tT{~DMYGpTkBU6!aReUY0?wyrALj*^x$0?^t zHIBUuQ4q>Ee4|s*--z|_q`84dM#XC5F7gjZ?S*f)a-{gTiVncUwO*KGQLCsdoS+w( zzFU>!CMdzh-XAKNs}+;zR<`)J7Ys-UaYkv8!@B_DhY?|U7&cRJ&M5n# zNiGonGQQsDm#6N+c6}&pF%{tP0tYKhx*Q99zxBia@%uD_f*3v-&gaW~TjK3RW^Th> zt0x0yIOI>AmR`&d#5NQTPJz$Z;bS65!vS+4z6PKm5D62K4=c=mvEl2+XSCwG(lIxy8kfY6 zV=2uCAgC*uBhnEOSzMC$06}J)5n~*5M@*h-O9qoFvay!F0e~L3r)&_kAQw4Ka>}UL ze-xcz5Q0u4Y&KM79BDTA`t0DCFhJEX?1ya=gh}HjZTXrx>=ljm z-&4TIV#3u~NAqnt-&%sE8HsJM;^L+=(mX6xvPa66N#T{)OJyeJ7!%P0k zw+pHu2QVp#q5`Cl3POa2*a9wqd^Swli!+uU>)|WX%JN7#Wo$=p5`$-^OW!z*Lu!%s z2~5My=AhNZy#xrCoS{P|KC$J*(EGQZ&@#54Rb%!JRav9N3Yrc&cd;8`_5j1GcN*#D zup~oqu@6SeM|}Yr3BS4*tpy~_8FV)U8p2dW=)V9Nj&RN@mWXlgoSZVTXy1ti_ z*}}7dDAhz|)nTCjsh8`LJ_PO@$OpyQ^lwJsKRYh_tQa#|YZ}bz=!Jl}Gw*s4>gXZ2 zAZ4fFCqdW;zre7H%)DLF?7-=Kkaq(dhMPH0*BZlCfzD1q+z#tF8gcub2Ye35{a*%< zT^NC!-18&iO<7a)&e|5llN&`EcyT+mJP9D#+y=pEi?oMUj?#w>=FoKmGX1Q$*dDGheko& zaLInnGB_b9bfYND)8m^CMN9&eGOhUIJiAc&{?sv7qDt&Y2x7{AM{`C!A5$vD*}uA+ zm(vBh-YiTb;&uC4@KuE(xb(~tQszM+5;8h|I*L7jQ!9DB#M6k;?CB2AMo z;d$Sm4P^_rze@>fWj?9nm{l(-P>>bWC!nPaQ zAl^ULS|7&qIkL8tj$4H(=>+!d5
pDwBv8e|u~xGo%c@kW5gLmg7)AZ97Ts)G6u} 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

B&?W~TOE=iMT` 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

X5Fe^2Mh>*@ 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
F4R*RyK-aHfsj$6e}04{Y^;TAnXgcP>5{ecgR zjVT_HP&n)MNeCa) z5tz=^$!3vFTz`cLIc$C!JcN2NdJx7mNBP5>2-RvZLOLdkT6Y@^WO|7h4X60wz&Z*f zA&$!pCm>aV<_2LO3Al%9^r|bc0|*geQEQc9KJ=ROtUoUWRl9^gTzq51tNvz!Y!e@6 z_XSg!G5;VaDqAc-)vWlhP|p{`v_iPNyYt-JY|H6E2(p!b zTzCl}qLHSY(sF#J(u7fyU;+Lzqzq+yry*dKdttQdy#Y__Myt1(!QgW=<}V1~Fc*Eq zD*c!Qu>*PX7nBw({ng?zJ-}gGWvlz!^1M$k{|DcWn*3h3uYqJm`qA}o;&VVe%qiBH z30?VgzX|50pAB4bzkpE$V-L|LSr7(1#>e05&)ITF^tcUAD zYW=>}(h^0RyIJQWP|Yu}HJ-^oZcofM@E}AiUl#?D^KPEY*4606#|8f;=4058_)uj7 zqp0O#qu2|@ggp{rEWO9sHI&H^c@<0fZk!U-vnm4pBjsvr;@4Kz8x+$GXWn^NjN;DK zi|GkJvZ$7ly=^q3|K_GgR0D&Uw&HXB%s1qBM`*Dml?3DPX*tZpdm-RS^ih@CJMma| zrZfZa#%eYk8>S&?fMmHZuzf9hWK>~!RBe34)?qj|<;!|4b!A||N4imIt#qcVNwY;E zM)t)sp}?;x<34mMZ9c2}RWQ;cQI{S2rscU0 zqK&2E0;FmdfG5@ZTtzLd+-I|)*OT+uNLJZx%KidL)06@d(NRe-kL7JDGd}Y#dnM#E z5Wq9Ym3WtX>%XM6dB6z)>6j|E#h8Yv+?eC>eg?<0(5ZRWVR3ROASVUad_27GbUiez?WagWlU+3ayAXj<(4xgu+PKrkc|~H4`>d|LS?R{MNK|-XemTl zrb1Za@KdZV5dTS8kj1L!}6V%g9k~-$eR!vCo~grID3ACfU`&s zbF8WNDIOleAkFN70|ZqK+Z+1<;43yIF`6$NI5j|pZP5WsMMmxU8@p16DF&!}Xb5j3 zWx<#Q0aM~E7u!xT%x`m7y#y8rVu5+-r=>`>&@){_4elATU3#PfTTOe2HO5@Pf{hKkyoHXf)Op<)t!0*=LwX3^Pj;-_^k=cfEpI+LOE zBHI~FWp!AGY{ywug+-&3*MoH^={1n>7DHl{9O_2ShKg(CdqFbqo4tVqswkpIuX1oK zZ5)WVDPP=izgxFJAZD+`M&X$orD(UZfQGC^Kvf&tVI|i`u62&|3D>*N8c`~dK^{yU zSKLN^Dbc~_^ve$2jC$5c>2$k&j#%9v98V^;nnWflrrPSX^Ze6V$TdlOFyJzPUY=7+ zW~H1L^522vp0x~dLi_oa{u@A#_}PE331Wx$;nyWHtbtCJ**{vvN*B`|H3s+xy}+DK zQYw9JrpMS_z&Jy66D?bWPI8;#-IC*0I#YaO%7A#iHt7JQ;LLzKLT<{CnB3`YFSq+# zS0+AJH4;f-zv{bM31HxQ{;E1}c0Y@PIrtx`x|-PN$CLGG-PN zY!!uNijw~vQ;(nI|M6AQg}}uuZ#>QaL+o^h^S2u5o^ZGl1nBaBjZHetvuQw>EXo=BMuXRew#b{sSCtc^dMnowFU z=Dcneyc1bMTHT^gHzH@Oo@qyub+Bp6Xdr-8rzEEGWQGI#jw#U0g7_Y}jDj;-i9 z@`kq=*5JFBCZ5OM2kxb0j#=__qffdO-P~F;^_8@D%F$-Uyh`6s7@!r@zaJ$q_dk+ZhT@cB5BU8S>zizCL5XOW@H%l54N8Vd}F7r*l!T!yL zk3QE)A##4=C4{o^Vw;8=_|Hp(bw1s5XiX>?1o-U%p4_rhD@|;ET+;$VsF>56r+E}R zlcF?|<4^{7Ss^Q5{xCeefd!rXdQ&+V z1lz;eN(I4im@QfXwX4tixD|p@o}uhX14~>+2>OPmHkh2NBIz;CLisoo_ttKuNKX)a|unWkAV}b%4i;`JB=T*4!NfNlS|ER)l0>!$%6Gn7Ns zu%$n5b-Sy^8BxXwhHL0w3qq3Tl0ImOH+R{1Tbb^^fu3JEzQ1FU^I)_rpdFAoJ(Q_x z&G-(NdIC-Gt|*fs8c1jtmwCKTfj@eA|Hkk`$)Q&w^?tP*JK}3=o;gT6+Ut6xTPZW1iqcCw5~;mhvYTgpxDY zf7&@X#!5shjaVh2)k)8yk&*48f48|`@N7)H&$+&tnv!``z1z1XCc?maBLPUs)q^O% zFN!;3HjPAI6V6X*K_SL{9BAg9KW-6J;V49~{)6i$a!(W)9&ERibLYA37H1>+TS?8; zW=cp-a)xK#54-h8*a&%2*>VGv*q4Pomw17&XbGdzoD$D}?wDDeHXvCVPUp0c{@V7A6?v@`+v|K&fl6`=6uz`0V^Eod0#K6&`yEE$5x$2!2ge!p2vO+!CQa`lu7dQ0e z4z@3lE<(A(15ZKkvFgOTl?BOY?V;#qKbPnvX$8@*!WYO+{Y(vbJ#$YIIW z(weO_s+|rtPwE@V3ES==`C8) zf`d0b5{C`0V3&kEkk2NO)D@_O4+afEVaotB^I)<45+Y%#$6_nh39u+nz7tk0UOT}U zP1$fRf~nnnaIj*uCSh)}miY&*_|>E>p`$c>+CSXoF9{T|Z|QG$AsPwKO3v+6D?zO3%bMDrkDHGQ4JW4~=&$EpUf!1ONxC01?5DyvUZ~&x z#u9zMeRRD)_frh(B2s}^aeq2igP4rqHSr_YAlZjl%tWvJgu}Aug4bXo5mNgUhK%O| z+ps+lV*OCULl{%9i5hEl@s!rbzE(OL<1A-4Rz@p~oMpo=)`Loa~x z8_Nq*3%D0T3azx`0>m}I@Dc(<8Op{-00Kv-qzh*QSqx*Oi+uA*6Wjv95;EUNF#xs+%Cuo=m2bnaSvRzjY<#jAWZGMy7TL9)Av8d5 zuRff@#Bm0x({oxvG*qQ$ZSq5DpZzmgKOs{*@SUKXRAAL!poQ9V%xRoO32C0)>wIaf z0?(n(tjAA-tim?a*7RkOE`Gz2gED#DioI&g-#5x-LLbAm;2`IQF2SP$BcBom(YGB3 zwHwdKj@#f6H+wvj?lOTAYrT~=ss4tAi`(MXPH1E%-qJV`Kxa008RS*C|OV*^t;|ZX<4>t$d;Huk0m&~yu@zU z(e<{PyW+W}ErFdNaKkVhuL6}a;;yZwU=*$AT4~UpfPExTmLc;~7@?YjOFIQexu}^G zvDHhza*WRDQk=RDNN{?9gIQv9a6{3fq48iWj#J05gP33`M+KV6BDQjLr97PDvRR3= ziCXH>Y#y+&>m{nCeDZ$IR4%x-1+wEq3lU1E#lG~q`Kj4~7|CZBud_YZff)kMf#}e!f~zTF8qBAI^2D51h@dl?QRd%@s|Z z_Wm?!$(m^~DY!Aoz5bw2~w2bn@8&W!Nq|+jBWF8fgyTuSqL|!Aj#bDXEkCOXt zg7m$bk=hFVZ-$rq_3FZ*o@Pp(jPbr2l4sRec~(%SPH1*U;rE_QgAIZnLR_C1IH5Te zczTi1k~=hofH62TN@`2q;M^1cs_)+YQ6|LlAT~-{&xQpEN=D{@axLO^0c|$D|MtdX zeQCg=-QVGu(RGr$T(Mz?SMcyw7tS!=7`Qp}Cw;fFn2P+74~@=piR3p6_G+Ob_es5& z6+&al9w6CQXL8(aAe#@WCok2-GSEs7<;2jxgHhgQKYMpo4xfl_inxVx*6{v5O0!kw zSXZh=pjjaSwyvZ)PVOz0X|w^zB5#I7w2t!2jNyc0ucog>^=_>l^4v}dF! zI(sNkFaJ+LO(6M~zmcq=?~15yAK^u%gSXu55fM~P=aqO%y@ux!Heij%Z0T6_iO;zh#_Bq}C-f za9=wRaibJxpncib%Oo&yfm{;5|Jwt-3E`zf6x1t4+g4T}cn`)HN89?r8TFK;-9dTI9e~cfCY?p-f9N(7VH)%6v50R)$R}aI*jvkF z+uzn#85TreGB;l{K~}98PzmnkO656@WT_KzOQ?Am zr95edf=7HS|LO!;&VArex51}AqpR+jj>-HXp&@BZpPy%bd!~2Dm7pAl6Dgss9VMo} z+Ldp^hGHap+d>IucxAUKN5rC_^JO3ly7+?`1tBWXe`pvy0i9FyBj>ZNN6;4=<{xn= zqc;s4?4d}`WJ;-<9SF%`n=YeIMAkkOv5x#IA?9)%+{#PJLz+GWjg#3zmb9#L^lp<;2s zMWn_ZM`h1;fzy>~(qPyG-CQ)&&rrCA6;^etwR@ySD#QWmTx!I0A5d&4ZjI!qtn~~| zbX$=jB}q~sB|^s()d-2HOZt(;g9l5t`FKzLz*LX8*a?g~97EKT@sYL#K?XskjoPpc zt#Xz@=5aRUjd`259AZP}osP!yS{=rvU{R4bIRTTfPHECtY{|GKliI21ef~py% zd-}j@8WThi0An38NyMm z6UaLhcfwbC4UumF>N^m3##aumppR%Qac^a@lKr3cqL@%7|aKn|ae zj4Tmv;rEd`2cM6`;}K~SpN|ySIHMDedqxeZ>^#8((KcUB9%=mO`S=mN2c&yajs$Lg zX*}M1bUNO`;yBzH$%D5CsCyc0V(3}=5x)oOJ1%#oSE>yO+??Z>>skBJ<`dTgwFl2T zNw=R@ppMv0DO!B(V&wSh8F6~;3C(1J*6J_dfAQDw;5t$p5&+=8ko!N!UkhXa0EPcU z{55tnG`4g4|H1WVt4TUyjUw!T@Bsw9`Mo6w$sfge+z~*=35(iiDN#kF7?e|O2rI~- zBtW*UVIWFUyX>!PD+tloC>2rcK44{4XeqUyf*qM&F_Y#xP7=R+ybxq0@$Rf1B`uy*n?R1L3c}#1(XesKo1El)z&{ZX5O2thc>f5+&Bn%1TdMTPo0-Q0K}?cR<+-US_a z?9OnriKww{k5PTUnU*bXSZv{1v3J*lGUC$bULnH=7*o#SMhl5ELCcZrd62t-U6=ar-fD zmw(ftG>ZnDDu!1v1cgIoNybfSifhKqXma z!M4$y;o)=vQrCYQ;;A6lyC`KtJ?ND`c=rrT+=8=E{bGI{{SyBXvb>N;B!!W?0haZr zIhAb+%woMQgqiIfBd@|ML-py$W1H7Gf{h^U2)_R*`4t|$nV84+e8po=vBhXvM!LFk zT8}?&UAK{PK~p>l>Y_mvxMFB^#+RycRFiSa)F-#;(t>={Zl#P&^QYnuDsI`w=%F11 zq&ydK1~)VF%mYu^W=xonk4b(^{?4?RnLzZCd>@f8AmFexR~Smy7W^P)RDU z!Hc4~ZRidQIy(NW9G0&okJsN?b^4<@E`8Z8Y09l6`Hp5z6Elx6ZK7t*Qdl?gDA)LI zt+#fcsn9sC-MFsgGO+KaQBr4pHj`MJlsBAeNHiw-cPNxgeg*PFi2r;i%$l1={8yVB zY11P6QU5vKF--ZSNp$JvOuCx!j}*LwU`xw;1^zgYL%i$xOj)+eU-M>E}WFEY+y%y8kIhro)GJig_4_M_X3jtHyNv zGSnq(Vc=o3dhaIkb7y?UgfSgTj7?iiV7EVbxEFWhj7}v_-wX7RgoP(b5Y}6F?;)LxjKYcF zIL1M+P(-r|+dM@?=7Q#@T`6NbbEtj8pmQGuJ^31^Og}PtUf?QJV)20V6PM4AniNSL>)m4nnRSaYp zUPOmzN7*s=&{+#wyP+W2MzM;hQ0i(*u3E1U*mcBgR|GJxBl-T)Z$cy;J}k8YRwXR8 zCiU!JLl0a-3oYxYIEAXE&iU@1K_Hrl&EJ@opFXJsGH0urB)LunI^Sbjfol@uT9ZN~ zGG_GYx>*E)bKFgAr~!Y_jG+xiBRJsO`}h$SoQrpVojPFer6n#sP&Ja%P|KcbNV60e zl-N9MM4Pq?gJgI=lUy*%zp?NRQfTY^gRYjt1T?u7^FR-NPa44QLz5;AP-zP3(URlG z2%v^YCd7E{p;pL%0*S*^CiKXm0>h(S_PCI~{Qm(v>CubJXJzon{t%;Et1()P3vDGe z|8bsrQ#vQjFT{L4Y=f>(bOJ@_CaZ&=obxc;2a%h<;+ zu1^Rad268!o(IIB<@*z^Rux}r;0f*Qk_4_ma)E19h{ao?Qenue!Ag*ov@%WAM4_2v zNXU}P`e)Xalj2%!z_6v$Hr+~=y&`s58L@nMnM#E;mqP(t9hOz2rS0}1t&eu`NlZQf z`7fD6R8aw^1=OihN3;kZsF}W>k4-y>eHvm{a`2wnz)@?6lU^;W_pTgNL7YZKkudM1 z(s_1Kie)+#Z%}70K0eZ9?CLu1G6piVjVfDHZgyG1D79EsMRXEJ3=|toD~kolS_8Hq zE~6&fr%xx|BF9j!Ldi3gRN`jFYdZjS3^At++pb`~g>wNgfW)}vi1z+`a#3M~PzCwW zBMk$&#(v#hnOkZ|<8EtF8_Yd}v4ol9dqsyJ^T;3bLzNDf3L_=72)i^D+V4;iHKuKu z)w|_xlB_Mcy(wPSfrY}_rN9o@3eVIIys`vsl!b~UrQ?(eOC|OE2QRhv5C;CGOo!?T zD~j$iM{S(yiz@|EQMNY6t!T}~l;{^EVRN;J?{Y#??7&=k7j&lDBVq3Q{!J~E6kn9> zL|hp&_DPGm^^_) z0H1(M?9M*VuTZR7?0WioYI}P73W&SWwe6S+1fgMgEuT8|2dee2+HNIXp|7nQK&uD>qOZQKG6;p^bDxTWm${vC zUrDe$D?QJ9_N19#lwaq)=QnrR#(_9Pg<(~6Lq?}9a8$251 z%T+K-D@rj-D@(E9RPk)G%5%)Q6ugV>&7S2ccyInK)Sl}{4wpxRqpjK8Ec1= zPj&^fGAJkI<&U&oaAreJfn*wCsaG&@Xzeypp)4e+SL&+!0#ez>?y@yP-HoX!w4CaW zh(|Q2Fgs7wUb;5zG_w6pqq>GP_$zlF-VTSLsyk5Hs!t@ClNN)8}hK4lT|FIL!-FSsCL^Ip0Z1BL2o)7=c~cgZr0!5Q+aIOZN9xo z)yOO7b2z;AI4V&qsq0k=O$6J`yw)KszJ#qoI4=20_uIQMOa<;65RU5@=mXHScU?0l zS1&1L1|uF+GcHq3H)wS|2{O9s7R+ndUxRo z9e60H2a`UUiB}ynR0j7ATLIXxap`>J0THTD_KZ5_^>aOx8q2FO9luzdV0Z2-3gyk5 zr`N0a;Vg45!RCQQfni0*ENb56`(gHWUbi|9N4eFWHK#R5)gm0|rqveAMLYqso}1q^ zF`KZgQbY+41CHHS3QmRA(W+grz)}w#58ET*?T!+1ijLaQA2x}rO1pR*JC0bF2=DT!t0k;uu&xJ%}TZ&SDYAGEw7yEgnmXpCdsKQdsvix5Nn21c7eRQ8mR|(RhI^1az?nf z2)Mtg40392PXs;SV0`2`m-52G*Rv1T1)%&>??G#rjJi_XPL}SZ=0+4X%*gO9#z%k` z>X(a!hTCVjB>Dd|N&{$4TBk6^pK$IVev+Z4Y+9k#Tu~9-NV>lH716+PUYE7nbACt6qbm{4>6l&2Bp z91ztn>_kCdAs;*{f|rtuF;Ul^MUYrB^q$=7p6@gw4N=~&Zt~d<<^6IHfxqy2NO#uY)OFqxES!|kWxm?0&Y&IekuRVG!dGj28=32a6(!c+Z#F^b>%C<(a zs$!FNd+{D+p~j;S9I$9X-y%@<(@4CS$%5vvp1r3$QC9Pv0@fMEK9avHpTrvNIvP9z za;!&6L)CNw0+pgFhwBk{9x{jt_ZoCut^0uPx9 zQ?ci6j2ow#rM9^Kts181FY2B%*}I>zU-g5g1AeIAsGn#dpaInpzzBt3s)J`Olp53; zWZM>x*el}xDSMwmb*eut<6E&W;vH5P)>bwwqu+2k9Z<2%)012)bKk*gUXje3504*L znW(5#h!%|FdZb@}NcKLul(F-eH}g`f1EDIKoA=2`yj(zs^%;K)So16N+wobZmt5ZR zn~dBLihM<1Ja({W^zN&J^k4LTh3j0H#%`~&S4cTW z0>2)xVq$c>O-QJ214rx;%{myjA25A=%cmG%clEJ(4#ZDUR@6EvI#iQEgETltmm8dF zR>YX9m{5HBUO`}YO01YUH`IV|cs*Ees%Mcw1-6c$2A%#7PdagLjjpu@)@fo5#c*&J zNa4D~CKF(ouSF`YqaWUtjBk3?tKY$A4mcpRW#%er$NBTbz{7fYMnRxI`7KFVK;G0&Q$3=kXw}rkPwtGE?VE9D#??be&p6lDL>3kc0f7V7>EUPaecZi;zVKtBem*_}S3DE9T8!gx+N} zbV4TsuF`{e5Q;rmO7yZ)>@$Xs*J7?{4q{=Q2Gx2zFN&E)qP(VJK+l%@$7Rq9t4 zD*=Rf)5Hp62$1jWdM&O403s!U#4e0bGOeg^KqP#KhuZAcHaiX*! zn}=Or9S51bK%9z69h8luA~veVcb>xJrSp*|7eN0?NU=Xco)njzehznmZuJ5eKd33t zkPExvDmo>AL#z8g7#5%kp5uPUJEd^Yg9TvOA!ik8P*1E{XuSt~8dSR!8oD1u1G)h= z*wl^l#QY`y6A7`!Q5BS&GF@{3zTFQNj&X--dqBSSD>Bt|+Y>{Hig+9wH2k*7YT4%+1uN0r~A zdd`!z04;5bgX(|Yn%x0KW-^ex&0S!VbQv0EUQkEXDNk?ufuuph-9m(h?t%NaK!0PB>@^#Qfp_3I)>VsGIQw>GN-7e#7J>;hB33D zsWngyM|$joyvoy-2ToqeyU zv)W&V=Jg(Muwnk_IskBkyZR#&9d*P9*)2LrIXAH;4YjwYduCI|5iQXcT_10KKmyE2 z97dAx;Fvu%J|ym1+DSkl*3BGcJm9|?>?Y*I7>|OUmbjtHBcpJ`h8Xb1SwZNjV3>QD z5V;je0AbIG`}j3@JHPJ&f2#ExNidtl_+ds^taU2B)Bs zzO#nwMhm9s#Kf~u8$2b5wvy5)gyR+Y)a!FyrG0Fc47Zr`HD>f0sr^ zl7I#i&kFU9U~9r+gUMy%FM?`^lQx82_I=?XArok1RPw7$6B7)IYWU+h@ptHIJu~g< z>DrXOJ$U>yVWgf1vAz9{d+2cveZeVES?EmnX5bSmZ-3m+Tc5NMz6J2$n{&_IFm zeiY~dWrxy0pf~V_GE-=T9Ja{j+$sQZ^lNptn{v@^&%x&O1`xMi<2qCgV})al%eP&+ zi*n>G=tLyz7gwyJat$VJT{+oATO*iVJGfmdI9)5)U2D1@&cv-5U@cA*irl5`lS1PN zXobIYJa+J!joese(Kc@oz>E?eSt&<6%05tnz4ucnXWf`(a@fqNteA{)WhYj5vl9~R zLvfQ}_9r1tVu7IT-08FTr?=U_l_>{yKGyZoaa@<3lL$h1U1Qp2S^s2bpei>ib3>j6 zlHh$+q2SG|!2vue7cL4&ICj)DEUAw$p*bD73uX{<>gIh}B}d`7%(V7xq?dXcg== zOlO3;YEXD0mcHDr9ua84U$WriPKiLquqma)-h~S{7puL!lEuE_2}~8FCtce|@kJYb z)o;{wdq3XI><&YhjF!Vr=zTtBc1g*z^sh$)gRTJUsHh!pa79U!=f&@~o4EnJvdP-K zCHE}isD})@%Jf_w$B(AHxXuMd2kP~)88-^W3b_h}h!>@D;vm7xtW_9%i6fF|WS zl$HQ@h|UNJ=A<8sYt#=#P3adTPAX}wZny~p^FNV&zRIf5#I;VZaQ@`_NP$s!w@4$t z(gK-JDaZ-*_(aqUOSfcBwcxBNO~oN0ZHs=ymij+260#V2qY-2U45~n zoJeWc*pJYxvN@*m`z0PO$B|ZWbrCT=eK9(v)Vb2Bi|2g{OZixY*8ebz=?KNi?g`*G z9x?%J!PjKo9NnGOhXd|L5f*24oPiP&AZK^@4bm-y`yG{1g9xi?ywgGYZ;OJ~Wg6N` zn1V8?yrY-eyQRaLX;xJg)mfV{`GO><+B1PtUv_bYm;8gq=EbO?Z=TTCLvs`4KbcD6 zP8qodMe2=3?8>(wKdHVHsg5z0_ot~YPX}(vAe-5aV=1sRj@B7G%sBt~ogW?3iqTc^(^t$Hn03y<0&(Qigp_=x$T1U@qGN5gqA zsuv#Fn!ElXCNzDsp?5wwxS1KjB+m*|BO@r~#i}N9oN_~*3aZ&Oua~c8y_$`7X`}TT z+e};dMKRCu7%%mXXKGH_)EDRh*$;r~z#H+{_`7y3SO*pVX|sMX>sz7BMtWnIlYxCc zGU@fXj_e^KF15Hz7pjqv7Rnv;_`7lr-W~MlnC!NdpYq6^-J#L+PkL6EFF3qBS%tvH zMkI-}(|$cKB+QGoC-75GJh8FF1%@;+w*N*+fOj6PK&&;)&T)!9v={DSIz?(nsEcNm z*-KcHOx@Ga=L6LqRT#PBb|m3bXcUQUR!{1)$#i?lx#61puB{5auEScy^2_wJ3YZEv zxGsqg+`kFHM! zcSt1|nm()JlM=i`k$-GfDv}OU z5@Qj%6 zPq2k3L<3$pB8KFYhE3kFmPXP|hoBMiO@z%0Z^pe?=Bu0lo)*66CfDbv)jy)ZwWpIf8r>GNL5+u zapOX?SHx~wXMSB=0EO8n&B#~MGaWnXBc7WxjStHC7nDmhIugcRNd6aN+!u#HdI1`M z2mrSqSl{JmpIYn{DA;^*M@oP&jdVnBPpLn{i= zEkEobQouoiizd0mq?ks7e#$rW5}Sa~u3wA99BSNwo|X9a7cyztT*y6noP%GULH1$3 z2^L?Od+siPLY1}jR=@i;&~EI&YhwQnv2i2i*gf*}JFa}-01w(#qoYt1%*$f`&m3R6 z!LwgBFC}ws9h8%9(C0smDka}X2|sM=Eg9ENAv;Lhqw^Sdm;=XC$OuT`4@I;S@Yu;J ze1-Hd4WLzVwIJ6J)l}VXlW6^obNV+4=3-uQeIp{q>J7mb<}L0vOzRk`w7DB)Jc)zM?m<4VHtb@5C@@3{;2%E5??|Ha@Gl*_6goGo$eW1rI zwfAR=dw5@)1P6DUhSjJwB#s31n7iE2@m313cb&Aw$)>$fhSU~`MCiYN8(p?-+qTt(F57mOZQHi(s_F0Cnfc+y znTWY@R>Y3yA6W6M+_`dRF5lvdt}#gK&;~OgwXD&REUGp3R|t~tu6hY3sJWNQl#Rjs z9n=%HKwsrcLKHNxW#@SFDn^TZ?VVi;B)5IMShPyqwj5Z27m8zm>m#%$Yc`N%X~i71 z!Q2&qh>Qf}iUwGFn#ANa08W>ZxJ#^dw(#8RhqoLtEXmbX)f5q@lMyS~S#+fOyyu%$ z1M-73erebhESRXu8(V2M!&;bd+&c1%ISf+S8fcuejy((ob8%|M#im$<>TB#yH;0B| z?u0NSKVE%H#fBe-XPS0WPVFI-DM@9Tu#cw zKEuvH3xD{x-Mu8Je^`-&-Jf4@WaX9cPHvTFio7^~A1yMLvj-o}+htHAGw~&pa?+X$GeX$27 z_RNVqWs%ms>jRvek;)VzjkMiL`B|TBt%c%O`awh;*Uy<1W1}%CiW0JsiwYFD2=k}z z!sv?*KzQ=Fv0epfQ^y`K;=^sEad;HwdZ5RgqZoTJu}t)5f4tp(yHZJ>mfp!QTaSqf zPM{3jQTSt_+_xn(hHlbZv=av-h%}75(x})-UXy>1Q!UI4%@$8zot6n{uY)ohAL5^u zF_HgNnGJUurg#85X#b30Qq3x2aC6`JWU!p|ZKPcr-x=;j$L}C-kyCNq z>m7rJh$F(~?DuU9egN0yP;wolay*%`ZRdu5Y0`$d9@))tv+Dce++3iiYs(GrUe5=6 z@xEkv?s}e^nOKrCueDu&p(}s>dS>#-2~t8>MNlgDb@1P$U-C*6@&eqOT_&e+ z*s5PDC%Dh@+X}$0h&=lS2*rzvU&5W%4QeOc58meeF=5$rEhNi|3#RXdJd4#&^)myYbZ|#(^%$6Kvmv)Pfank)|Z?`=ac^ zAz|p`cF(8^J92#PSZ%x$?JbLrRaGomcCiD$#Nqrasv4_eX6vxfcVl>O&-CUFB~+k@ zJz5RY3bapE(sBTX{^9ErJFva<>mEyIy6guU;jfj+V@yrIK#^y&#bNWc2XAdh$KnxY zRM|>cy>@tOv&e#CjhYBm_L9|&0R-i_;i|h$$tnk_o4W$sFI=fMym9L{ zIU9-ZVmxdJB8WC3*aI2I4KYuHgwLzEvLJz-kV9Kb)q7V-A^eY^CQ)xK0sCGSu-JJM z`wMS$KMM)sfDX*n43U03K~q9b>DDC%8jchb(#zZfF+&d02Ht%9MF=uDQh)SNHkI+| zFCX3%%W`cwIIs|79X7e@ROlnwZs4dNh$hi}GVq5WxVL7lit1cRY}yi<&j#WkU?9yy zsp1az5i^K33?m7nCm|7a$^%g16J(xvgRu}wrpn%Shgz^JtYM13>PV74e<#*)pL}z^ zh#-{X!S|hG>#HJ1mCwP}99LJ|1;H>Aa$TMLBfysHUk_v}6;h2*c@-Kk z_tZ})5xTv&=Ye0xOBe3J$CW*5eZ9ZfRWwbctD`Y_W592VU8)1!^x50pA^Nf$hbI$pLyxe4(+eXJK9smyk{zuKw|sS2eDyNx5P>H8o$^O$zM#tcK0 z^%q#)(*3fd0C(-GzU0+#6s&v}B_JjZRO1j@@oc>~TD?a1FQa}3zrWx2_%zJ+Q!@9@ zug+9*mU6OO>bj34ft0Wf$ncE{XaQTQu$={-f!Zb6+s>=Huq9Cwu*X5gk5_WL&i-za z#AZq?LT^wBM!9i!y0_Jh81kg>q6;2)KL)$l9koXsCQSJ9tpQ6$8;18nOIywB>5-5D z=I|-Z`ZJKD`#}S#k0g}C^4b6=mIeJ;00%%Ftj(_p2WX}4uRw%EUgcJz3FxcY3zjH| zSpbqGp=ANyGa$FQvMf>4_L2)3DIao*^zN8Ek2($*0Rtcfz6#Pi>fFH_ri066;B`&h zn11n!ro;-6k(csO)(dccsNNE1!Ee=x*8Vo*ZDMNX$%eJnW(wmyy$|?>7HaY~XR6NEM21$>AvT?{l8hbLwY{D9`*&I0y3E-)jUHZI}l8U{-oyP}t97 z+a{QT7lm`vvKp3r@%&A%vO0=jow6P}5h%XJxg^^!sF*!zLL2WkA@csQ~ipreaxxc*4nLuZdD$w@t*l1o){AQ%&eTb1Q|z(WiB9k<37$DOxxH!W zOl^w9OhfC}^GO2{6@nXW)*v`1yEp1}y`_{xt@F<0m}I@d?6Df4^wCW2Tlv9|>;Yn& z5kQM)kDc=xZH4fsfgl8{P0FH+a{EKF4QOOwrA6Qd&$EW|lZMc;3elWaI0G; zAP&g#6BBFwS+XA{fVKBuRoe7;s!0mr-2~*Z3%AjL}!36V8+(!G(f?)I(obz&?$E{7I|TmGNt3JG*ka#bFB1$Y1zyBDQ_q2*_u7nA69o? z*}6R_-7jPMbPyetQE0cflEH33ll>HzkgxjLUX3VY-&fI z|1%sQmyE=e#)frOYr#NSY{$f3?`y>`1cy$N4=aiFRqd~PqTCs|TI>d@!5KV$yP-BJ z%yOzMqr4{t*WMfofId)@x-K2p6{9iQ1-HBT5YoHhUp053s_&@X7R znNLW^iKt=(We}2m_76;0KF(o_F;=k&MSOBx9}e~_7*l{@`3PVMq2@s~3z(<~P~aw1 z1}9NUps5=X*-}H0beI}^c^yC@hnKX5KHd}0$yrt@qsvYeW}ign=JzCFSoh*zW7YLb~Oh7ztPXGkh$u>Pe9XFB);TQ-LjQhM#d`qz8+fJ6sS5c#xU{7Dto)Gm{ z(r7?AD+mlCGVW+eD`IVCgq#jACv>`Fe2-%j38w6wkR6=`4Lp-HZ&{_q@=wo6C{DZa zwgy@tnu1-K6DYua(!encFw5l3hC$0#8hIx=$*_>4-Xj>Rq&NxWWAoFv!?DG0$MFSQ zNbJ}rFC*h%h)YChXh!0RcxIx3gytIef1O)L3506O? z-_7#^KHQCkG0pU-d9h^r zy$sgsfz^fd&TB71U+5PW0`7TK$5+_BYbo8-GLb6j6zq<);_pStJ(UIRi1Tg4&7R}4t zw%vpYLc{zj)Gyu}Oaud6cHj&Z{ZM(oT{K4+rO{q_hF=dyx;avpP>;N+LK!jDAlZnb z`Qlf95WphuXhij>ah>ghby`aLlGg?Nr_=(jRQ?tV7H);!r^Y1?$TYyLez_kp^h@Wt zCT#IyZ7eg=BB;SK*xS%#Z1`ZAFr%3?)DzC+z(ME#)go1exe?!05864kMKfV5F6}Na zs8Unw5Qu5E&C-A+=b_r4L7udsE2fPv($t=sLiLKS9<9yxxEfps2S1wrqrTCEw+6!G z(;m!ZVAQeJ58R^AH+6$49zc2aLgABYqc$dP-m|}1#iNp}kHtOifX?J?fOogrlPUsB zU(S4-kFEfMUoVSydLfl7c&~*oLxc*pyBR(vaAX6+Gx35T8}SRIJg)9*^z9Z^5P!at zfuF>=Y(TLkaD1Zyr5w(mOX*4t537uTN5Tc3dpo}NTCkYuc}jg~INp*ZH=o7g7PPJ- z%4UCXWw6ohr+IBq;| zRlVtTD`Ptbi%WOGokf!5vt$V%@<|Vsck$oO57XjhAiAdpTIQGHf(l%*7xy@5(XtXS zZiN|+vJC7_4{bVjJZT}y>|~A5L@K=0B^B|z`UY=*TBS$$t)ju16;8^6GNm*_q0p0c z-RIThpFy+CC|b4$O8F`?51Yj#Zm@F|XK1q6qDL|wm}32cd9Dpidbq|XtArs)S{@0c z5l>#cs*hQ=?vi~#;GxGnSP-`+^2HOpaUMBJ*OB3e=Zbx{&wgaQ&*R|$y|_@vPH2($ zVYDLv|f|E@xsr-jW z?jH%V&1MA>IfdZj!5-W{?yxYP>S(3U7FLSG!J1Kd&6Mu0uGq)^S{a1($RVR3Q0TCk zlkU8*5s3S9>C?`n3bO?LE-g{(UtiX7C%bR?^@&nhS61_p za6!JULK~Io>WcdaO7lE+-5Rpq%%U2YenFWg8Lg3@sBN{)^@t9E zpM$v6Fvm~d^M+ECUkK@t z7~FKb2lvlX1HwJ|&;lVf(R^^6Vqc-yBPa>w4L&n*b21)+KnRBKzENET1*GGNf03jq8_s{G%Jm<3<}0NMY6h}pu_#)010!PCXU-j0riiILvH(^ypn4gf*h zl4tb)99It*01)UC5C8!BPfZPQRnvFg5JgOr^S7mOOKPE_`%#g`;Z0smku8;lNQbvI zoX?jku{4;C7Jt??;%Xq3J1K&nRv_=}r#Kb)7{%DFWGqzAd7oA`w^-#Hv-=Ztw9%n^ z^{>9%T*oG5RReeC3FLX=aiZ?ioX*WfI>6{iDhd>al*^>0ir^z4fHAETk1ZQk_;jDc z%tyB$W!JQG{zU{fmdnMKF_(FYeEtlRdm5c4$tM&m-nuPs@J;~a zQTe+pm&$M*%B?-P2XH60J_HnyRJ4`w#f7hklCqMuwl)BdD@=KH>6Mu+M{T&+B%D{d zuV1syASe_^Ig>3xgRq_LH=-3mg|TVX{5T5mT^YE4zaKs$(_uYM8|x*sy8tSm`eS+r z6LJ@++kg;uJy5WNAz+iR#IF58t@*s)KA6Ir$kdL4iek7gK#I>qT9;$(+rMyL)_s%< zvLJCHoC#lc;){BZ-WxUVItixHF0E0(a?3*3UF4B1YWH&1*YaRQOvn4Kq(h^Ep1wW0 z7=rRQ3I>AA2*GpzWOi0nNAB&`)S+nMKaQ<^ciy2unAP{B^pkz5VY{>-#@=-bZOVhJ7i0qw{p$u~X7gE+&@y8R zqiwDz5%5`Z%P>mpP-Yx~bq87oJjQm|V8Crc%Sq%;m7Ah92k`KhG@3Hs&c-}3!IbJw zjSkGU-A+ucE&E%XYw?++D@=ddRl(~tr>@43-`Z8IK57X_i)4uCOAoc!$M4%+QsPR^ zkcT&<>|lfZ`txB93NG$R-8rK*5`fl>6>DCS5wpv3wT$*${fu7RLwn$$o{cKIeg_ue zg>MzX9g8@)hgUagcBVCpAvpYYO$u0WLv>pZZKbKUCTML`s5@dky$0u@wRV0UK!m5X zHWsreF6?x)DotZ5tTl?PUMs3tzfFJbbYaCC89A)4&hM-^FOq)k$a~ka?Cs}cp@L%w zz+H^mS0JTP%}o%Yjd0aPT0a%mM1IZ5GM>cSpneQc8ChmIL+^`ZlRNJR5 z)4dcjB>*;^niY4H^~YcW5v`k=+BaECu<~m?NNH4P1&L*`WH=F=MRshZw37_`Yd!y0 zGZSiY{y0|i@H6nM7@UW8A2Ul$gr*OLf(RClG4t}s`YNurfi?Xg^PvG2ciTH#G!_D= z8TfwXC`^c(Ljiv)0G^ysx=zUMx4|C#VBAVz)gAP*8F5CZ;_?9$Km6!#30!N(g*~_| zC!pqvP&NY8u3<(Hm)8a9>n>Huzg+?5vad|gBA@iD&w96zi zMo)IK5_oj^rNtTsf}1$TpAv?J?BoTPvlw{25XL@EQ=9+#r8!G_hQR#*p#Dw^h&pLn zrCfMpbJy2(JG#Sxf4905*wob2zFBL(^mKj@wz^^Vsyg_AQ4s48ku*l&aQ?}zx{*iO z%*-HdlU2T%EZ0dEF5PtO%l3C}E!M({52}y*syoraE>P z+7|k8McwXuyt`GFku|DVN{f?&49vmJG)qk5J|<)>KpK_T4fh%3WqUN1Sc(7jMLQQC zDWpQolAh(!yIB9mVV^y%`Q=Jr>B4(TViwC#=r*QVz5N$Sl)(Zz@7Quqg)U#d@TA+x>^F%eh1i6w9j zaO7_)+%$^xN$W}w*;(MGw4<}%l$LwHqQmhbxwb`#`zRCXx^g+g2ykw9d)STr*%MY; z7;c|`ZzZ-;OEgE)Az*q#$ZaVKl_VJ#bYV~RORCqCCi~lfxUhXBeYM*HNaOz30Azoy zv@-_>0RA)P{`&#g{x9`b;eRjy9Sn`F4bA`0oq2SVW~?_DQAcuZ)ZO+6>55rXt`sm) znOi(ac)}X`+%SW6TbQjdhwJrFisP;%$Az7!4?BN|LUo@JF5~B18CQE4#WOCy4OE2Z z7rf;Ox@r~X>^SZ}6L*0Ww%xduyD?F{+ zOBCs4j|!PL4AGjggxmTyLuCoeq4%Czzxtpmx+K;>d07i`18fLo|5zItWsgb_oVAnb z=l59t`?*8VM|!B6=J^Ab#(5uk7z5U#*N~E=c%Z*Yc*~#yiD0dT9YiQ^kbzkk4tzGIW#{g(t7f9s|*o|gqF{DoN*!{tJ>@@kRH&W>K2?e89cyt zq`I9DPrTOE;!WR+CU0A*@7lyEjp=0+os2=6%6Fg*A$IVrr^--Ov@U;dSZYE(iAM-S zcHDbJiyj{Pl?SurP@%eezl0TMI!;~~J62h$6-kjdCp(rmdFv)GwlKLUSBO%!?^;!L zaZV>wsZqo@hmflqWROw$LCi5>tSsa%+=>(Zw)dB|Y7J;V?Pb3^m3Q^II*t^*8^mAim}%0@6X%?Hr#`J%gOb+0 zjN#YQSJ9ky6?YDAWtLsp8+#NR~L)_PhiIXe}l9C z4VW!)S;ym!I4(S_udR(-b;VOCVb2!~x?T$@kq$AEl0_AXiOnaq@rd7%kDJ(a+}K^4 znWyqK@@|_g1Nku9kR=#`fWv}9)( z(zuE(TIr%StF4Guueg?>F|4qjgC~|rvoY+jUYIp1FtA2H6$G5=m21|diSeAoveG<7 zS>SA2I9Kt5U-|fE{dt1Y${S)RdOr+DrklIRK&ERf*DdCU`$EzR^b7qZ;t&2_=mPt0 zYy3IW1UPFS8TA%*(haRxll*eZLB+S_6E8B zpNHZ@bp0Yr**d|b`07)-38Qc`B|(PD4VsZh2laYwpwiK0knTo%ln5)H-N&B+a^x)# zp+^Rn$48T#LTH`JROAIXp1>i3t}_6x;9s$IDtRY{h<%h`8f4&sSB%4%bIPRb>z`) z@50s;SoP|T3+&H|rt$^sQ$mJ+s1qY=dLJN2%*R(*AozwzOKgx;a|qvMRF7)=LWYGp zXwBW;-e6H>fxT(->HeWUWiXo}X;lR{Iwl3QfTt?wGZ4pT{9C~ER3t5g2?SN+rWwpM zH0_^VM++d1zF`e(UW;oMXs2h$LIcP`K_R>z`3k3MXQk6k@KsvIKUa*xhBg3bh(myw zXD7NS0URQeSK32>z;6^blWi^GHqP*-bhLSc4bF`g0dbRvCBp2vJ~MQ1duw?%+^7-j zjY!Ll@~$wqxfX(EJO=ONMq6xFo6KCSg0=XB+@O7YX4KHR1Qn$euuF~U@RRr>-le?d zGC603i^V+8GUvq*6e`kUZyFke5awMw?whTs-eVb0D-`orR zpo8S;B!rTHEe4lo-cy+|W~b;Px2Y!6a>S z!a^kZozb9YQJ4UZ@I#4K+vm}iALzuwvhgBdfv@=N$l#)bI^&^FE-wj>2b(c51A?Dt z#EBu2HZV!wgqEJ6$Tnbyb3|@j2gqz@K@OHf6yAIKTX2Sr3qinWoQ{lin{@A19AZpq zxueHWHEG&AfXM#<5=mmM6$vKi08}xab40eX0^A?PJZos5j&^$(_!mY`$WTY{Q`}-P zHR_9^K~x4kRzp6vmm-pV+!CcBL7y2EoM&$^1&^?Z-Q^16-999oW87T)fydMjZhhbp zHU`b~%>nHX46Y+C%1XT>NK{Ioh>|{2g8v2Q_GZd#eAsZi(2WPo!#_;r!yGsSR2U4$TqhtsBjpm+B%1!GkwhcP2#b)Nb&GpWO7mLwX6JwgMeI32`Z+?x z!@SH3l}{tOz>}E0PG=EXRjm52QB3t*({dwsI8J|Q#S$`FVl^o;27C{Y)mcctgKxki z@!!FaXwHT&z-Mj|A+^KnhF?lqEZl0#Jam82VQc1d@dHMPN~mfQ_63NzxspxQ&})F= zu8LR{ohgT)BKzpBI_Y`zbS4C+^Wmc}MHIXEj0W1bhInur)vAl|Ikl#CSj(Rl?_Oqy zt!6_6JWt=%g}k)F_cWy{WxXu4B$=ztlGW3~BD==NQKSRx|rOhvy8|f|R?7-|pqs`X(5?QG& zMK55|&IWQ3?@I|KUTEtW5kBxI(X4w?1eZ@>?TRML`89VTA)5vDGunQeiO&sX*Pg3@s2pt8rKLB|%?t^1{ zgBg}PP6f8uCX(WM^ly6lp@TXYwwzww%keF&AC;;(j$Pbu$(@MiZP4cT!}>>*ewjzs zn9P_`ApZIipdkteHy`22q{OtdoGV_wWJl>(n!6ZG9-I?{*w%f`_i9d#(9f(`*8p1J z!zqm!Lel^pu+g=)EFso_P4H3e2rNrcN?)FwY~fIz6)sb)wH>xN#Xhze&9FLAkiO?X zk*QXh_mmc7o+H6+E& zH3w^@vC&?d`2T7-U4<^kEg#pax#|hK4wZ$*%k2Mg>xYXVLoSwLpm>9O4uKB!kw(5h zOh5oPw$V5}moJ{=3k3wGNS(|B{nE4Tz;9mo-C)w&?`p_CkO>nkhHUz_U2Xg_JU4T& z$}P(3A2C?A7v>!3ANJM5-;arPtCjc074!`rWiNhY;6(wUGOgd~b0lA?65ebOcwk9a z1OnRakC*gu%|Ys3CoFw;1cUM8jyeFWFV6&v`1*Y%U*b{MPc#F$)qmI51(X_8M1|3W z(*NO;pAA==4F@Kq%0*--OetxDAF5f^rjA(SE$953n_#Kaxb5=X~u!J@*#Pf?tH-M^j9aa=3|MRHu|TJ@MP!4jvhZV>%0NW>T}C(!|yf ztHCX^V*tqz26+Ebtd!NfIFy^Q;9 za)}#9jY4?^Kr$;D$Vf4_PS=*wPTjKTR1hl)vgl(jU-gVf%fD%_xj1UuAZi^U4NgG3 zavUcgT!P5-&4o^>ABo<=%Tdvt3a;pt9QY!GQar`?4F&&>8jX#9I_B&mM%0aeoxXzf z?ym94hhF)r_x%cgY)rf>Y}90v_^0SI(Zlrum=^=(2%j~tE&cFw*mxwEPEkm3JdHG* z7vn+9e+euca-p!?q8jeV`V(^PO#-#~MnrKj%7EZ5JU<*>9;}m4SB${IzPw@=Z;V0mYPu}6|MJ9DLj!Iix(|@jq5=m z`aM5{=2`47NIWL7K;(%cL?{Y%aD331T(PpQ5m9uNZ%sa#j>IsX!y;E9Jwz?94x+SD zCACx^+!YY#@5UZcwCSLqg`gkp4S0P71g)$@)^@(EFa7!6sW7@q2A*1i)#JdukCuor zfN$LpivgCQGpH`H*gA2i;1L}a?gLaJbG-I&9)>m|aHVa({D6h4^2Hfd6#@xR(ghYO zaDMluDkUdQmyf;|?VUfmv5A9M13RbQZYuPMOx)xY@RW#V(XqOddaQK)U(FJ)Duqz= zZY4M6lK9?pw81%?D;eOlbsP{3)#zT!^{ifg-sBGG&IK=JNEBA7E=!A0>o#ZdxOt7 z#B|gZ7T!HM`YR39Bn#`DMtmcYQPQ5Uq-Sm&T|~7e5$!{(aN<#c{$eLAw!AZ-t-ch( zjs2B7S3=s~7&a_9qqtQfBo-|?@npvm1k2Y9TV1}^Z}k82H?UgNl`k>|?AZiq5O=|d zf<34$u5Pp1QowgqkVAPk#w4Rz>J)7NM*^Z*@^!07$M9rA=l4Dx=`ef7y(6#(Z-FUMX|28 zDo)TB0{_AnzH7FW@&k*m{UsiSy5%YA@MHm+9#N$lJwox$kDn84u+IPiyO9jUOWpT` zkBUFO9>Oa7eHLa}h4qKYTo%=p2^be45b6Q-(_AA&=@{bSrJfSTw!iXcy!f#rE^hor zw4Y3x51()0Ma4TbDt?t-FQoe*P~zMx|CJteI>iD;#_|67YkhocJ*w+|3&Q>CW>f!t z(XZ`sY-|1M!~J?&s^q2X>v4~QhF}fBj;=aFlqMvKc#n)9HbSRFayJqVZwTf#XyFEl zg9#oou_v#ioev5Ni|sGvBMxS<$}x5O_+iN1&VTkWX}Uebst5qUe=ha^Jq=~~kB0j7 zKcJzEO`Tl+kG*7cm6&Q484+C@I^JmpO80=38!RG)dc+_@{uSk}$X(`WBt_&?vLhys zAa=-OZ7+~TJAh*sSzCAr&7yZK3|Rb6BHul4&xyIa7qwW-*UHRLt7rtlevhOvf6STv zh|ypuW2DqZkqpDU=fS?wQTL6Y7%6lAJ>T;3vZ-D(%n=5|7(>fyq@1HMG>!k zRrqv9zL)_lNOJfr;bROMb0JXhZ~S#YJV76*A&vHVfC8+E*5q!dka(RQx0QrL$nDob zDVC9z`sH8G#u(w+2^n2u@}mW4agKnvg^`kCY&}|=mjKP|t9&O|>>N$(?cjR;I=V0e zyuQsFRxw(V#BD9NMWWCzSS_odhB=i3AI}tnG5iy14-Tg8=HOlQA*3la8r9(wSJAhfjwFi^H+{GuShDWB-N5;#;v>_UDuP zi)OE*#4ciO?jSyt3*2nemuqT!kZny!ucs9)Hto!( z14Hj0i=$wZcgBStt=by>jS`NeryGI)^ij6kHB0qB+UP&s^56H7Hq!shZPD4q$<^4! z)#?A7&h;o0_yY zOPd>y65DNjn~A>esR;QD*ZIJ_{b2h%6v4!_L=n$GpY2{=rZnVc0q(MIiuEhkEjVlq z`K|GWW@xI%y|Q8IQNxIm^Gh$#JeiJ<9M1YNgX}e$D6QURTm!btgR-sZ+v~wt6Jcw$ zxm4KA=WzI$ko&0rn|H;~H&_sdwcL*!6C;c7vFjBl>c>**NZFn7c0f<*!v(WrE5Lka z+g0LebB-Q1tBH!Ul4*T;E%Wr4W}RK>WW9K?+%1ES38n^3&2++nZ4J7z&o#1ZSZ&X$ zeq{|?r}7fL18&9i8C*O30(yZE);&r4qvkMPcueGMz~ zF?(8Vm%y3loc}~`vxydmKmI*9;KdVDW&;kmW9FbRqR)5q(xNvM=R=Y5>Qn*Bo%_M? z)Wt@9y%ZO{AI)}=4AOIMw`#$1-8(R5@o!*+oX@Z$eeWrc-{c3fs1mGq-FJF!plYA( zcN$RM!DJjs$HYJJizNFMg@n%^X>GupdVn@@=b4 zfo}V-I!b>V$dsre1LHaOCKfX?VEH`~#HG2;Sw2WQ2tQu18=2)VymLk%9KWz6SBUfj zZ^~_2awaINW}^Rod=UKHK}DgDtv_!(qc9yNvjs97c-Peh-m`=`agn`dN(wUT9%6vs zM|3FY-CN@Mf_K~A%|>IsYWst;DgmM5I^oDMd+mdZ{8qw9U3qCVB{-QdKwEqSoQ_?o zypey-IfKEp$&x@@#}_DzMXL0}Z}GRv2UaECdiz192!N=GDLi}f6~O{0P^}RM?q&`E zIUC2J3fAhuZuQ2`2v!IYT*gtMZvQV9(JP0B=x@4z+j zsRN*5hQ$!P69EsDgUEL*+tsyx18Gn5Fb*DO#YBpX%zA{0YVdnXjU2YKmxM1;7+(=Q z-k@^Rd&<_F3W;Ep(Ngh@KNV$pt<0i`-0w0n?T-B#A1SRl9it&u6MXHF*VdOD)u(yv zDqDIH`C&xn^XnNJKv|25uaoRR0{v% zKGmmb#0_r|g9qW8NDfQRRxY%1b~*wkYk$0-qlcK{yI2oDkRI180@n|4$9PP-ECWP9 z%j#MJSCf+c28V>aHjacJla`KhA3t*`+f!L`%!@Tx;+ba0?uD$mC~S?|`(<)6Ut&s$ z*3Tx&+1CQ3eE^=@Y$mC7a9wK)pGmB;oMQsE{XsCpXc-2$67RIF1G zHt3E}^^@rH?w=2pE~F9h#T*u*3;1Ab>s=loJVYHD8rV~Enrcu?AYHr2Tp+TChw&2* zoww4bysL;I@W~&znxUy20ut-BnynQDC6i`AR{dl4oRenqW&U4!dmTpP7G6_8=X|#o zMd30qcYo?G=TtV~{ifhGJ4Gc9*4+4bRA+&uc&#RjGhEL&i>Ei!!|&Z#NGnflx+Qo* zFVusQ&G6(H{96SgBzv^gT2A;$o@u)rk?1%-6&t-Vy2;#Cg+P2ZfxhJ7N%3||_i(1B zw^zw*7L~PfT{+u$4khcu^5%y{wTHzxqH3H&g$bpY%~_Q(ToX-ncU8&XP_oWg;1SV6gj45o&3_rDPT4sm#DVIeP zwx#VQOnl*LNFpxNXENAU_221(!|6IH^!Z-9aV72}TGJ6uMsLglkWea=h>A))5&L5q z2`sBHfS58G0z+>B7@;mJfDs4q{{W{4CY;u}Lv5A~GN20uc%l0M zOy9x2L$53q*-DMd&#`L;P@)b zoOf7vBwHEztmLjVB(!5{xUG7z%;y%%!wWbhZH4|E#g_d%$B8%?U zK?QbGAs!bl&4eH>AzAl^HYry7qXjlGz7ZKGsHKx-Fr3R%d6%8x zT61jNxXvkrV3n1pc429Alfd-(TSNXjd&v1l*2siM-5ome2;!{oySt+2rcWh`U>{*D8yq1s;85jM)1=l71hQKpC$>K|~?i=%V{Bspw$_7ii=_|!*f|u}8&_PFbHgd25 z#U@2QkIli#SV$G!OWH@M2Vff-;*a=RdS>YumV*TEI;iQzzDEH3O`45*a@ua< z!}+S@Bi1ARelRN_KSS|F(wCB6vQQvQvk%;ra2p4%AC1LLLO&l}AYEA?Zf%r09mT~> zaeUUf!K9r*tLx8&vcSyo(6^G^kC=K1%E_rQMviQ6zoj z#$!vH$W27YV@;dHO(LsI>KStrMUbgu?l#0v+Kc*Yu)E0*QBRL~Cy58KyqyOOE@a8tOD>W}-{WIizU|MHj2Aih7JStXwwF^ba8Vj9P`i;$&%B2dBX(PN?b1eg}sjO5A(5- z8N)gboMPbSlAaT)`Hh|$57yMAyJ>J(fFWs-6Jd6G3A9`EkQ&)21sB8h>Wu~u>j1j)N4R&{;l1JopW=VY!vI)_At2fR*- zDMTdU(sA9kT6L%yw_Gol0ah5h6Md~Qqg{{{e~0-O4|y73_{`WP7nF`DhT}z(Yw9J^ zmspRO5|}jMFB+^rr`Ma^oI5;iU90(kS<_}e@#|?>GB31fcUYHb&(DrE@-x)c8~y5~ z7LDd98rI0pwkHjW1u{{7lI_?R!TdOSERSF(ERfsBE=%%#7NuZ|CN)_8mVA1zd2$9_Kq3# zd*t4*NKz|)rZ9aX8K10ImR*J5CZQukF8u92k{W8p5kB$=>;b8wJQD5)kON9Ufy{sV zWT{v8uGFL5GSYj{O{T5}1;vD`b=N+ilY0~+#Rp>jjt$?Aey8_7^3@C6vkpoHt@V?*(J})IdYZ2(6=V@YoX@eYP%Cc z6mALcR&KLlb`?pG^HYK%%Tbug^%?g){tdFfb^4dcy3%$Y2?MoB+P~jem)p#dZ(lSr zdD3#hCdcHKBiXb6UN*53`&(BY$o|x6JBF+{p6h7?rGw3}N4E@EnNm)Jbq8_6)RK)T z96%lyec^zPqfrsjgN10yj}%{_QmJGOr(BdPDDfVUD=@8W+3>}DjI zAM6))SYNN7A3y~7iB!vhYSyR#f`fDSjCF2t>Og7__lZ`Py5ZX{h6`&Z+A3rOs2~kc zbunUGbt9RiOgYy5dJV?ibZg-}sq+PvZ=8WR;cx*vuv@wqa;~6+ZSEAkHc(-DD5a8F z_SS-Krzu{RdiDE8;FpePVCvP7i-UzTWcGbaLk;E9RP<&~h}yTq5zg8UNJCtm!ADH6 zaZ6SgZM`17Z1K^G`^mt@QBjqw71ovz)xGZF6{~j|CEW-xj*eRxyuhjhJ6#@8jr^EM z@zoM@t$M4TeONIUT0z^xa;aWO>Q=? zeBt_&LOU{HgGPTSp*IRle?WYYsmC*WfkrIB#2C-0-~ePi*l?I6m-O0s5+;qDh5ydm zm9#qUh)Up>)p??n8Lg=`KEN4|nOJ1+vs(j9dGSFme=w;@YM!JVo)R66h$wF@- zbBdIgdxpaFAl$y!6TpPmo&idSfS#BoTXj{9?_dm#mV(yF3(|cCfsI?XdyJ9b6KeuK zCPu1C%0}8KdF)V5bW-mR^#KMXflKL$#igF0^GhdyBcU^F;6f5n_6QhRmc|ohj5tY~ zQfItDYK-h~OK$4pHeD6@M`XbRLk&sN2d=TJdJhsIwS5hxwCRMIM9zN-K z(eodY=)8a)?&_a&^?w1b|5sZi^J`S)pZ5B{Di90+koo^dHvWfKv^2A1(AWPb>^3yE zFxA&*Ft&Fx{clm2d~=>reRrPGf4={lw8&Ov!VZT6m5eKE&f>8N7s5d;xB!Q)Kgs1T1P_#vlH;TceI#)nOzaLJoi&)Z|Q+%MRV2<**@Q6tK;5s_2yHc|$RD|$? zL;rAV)vKkr#J0YLx4x&h?t`s**hXG9+*048)O*|3c=rpV_6bol=4*j6#)f7hnq zrD|t3q6L3AI2?J=PlBZoE@c@*SI(ifL$8=G&$v}lSw~&4Gz_VlFQ-j|Pz_8oh|8;g4V)GDR z)R?cE<#QW+ol<+oxpzu6r$?v)%(1H-*G!&Oox4($sxhN%P@@9G@Bbq09fL#L+O5IZ zwry+2ws&mXwr$(CZQHiFV>{VNI_KVMd{yUmef{?OwW`*?Ip%uicreB!KU{|AWJZ?9 zJ@rPa@&f1P%h=cR{h`zb^NFscMsH9 z@m+D`ArPy5=3lY+eJlyja&b8#Xbf*${zp62c42N1Y_tv(L2XyNy4mwWy&K{UH}BtF ziU)WYRSK=)Wi^_|P4hSF8ad4Bf7(0tvojAlR#^j}W;ENaT@d}Uif>!kW z(P%G~;Xo}L;nd!AJ9^=Gok1F8t7 zTtFK!02%;EP*9zS?Mp@*iK{_du9L|zl*s{r?l3t#JsPr9iQumIJ7?$Ndp2d+EQvr@ z)pm2e^u+bCR&e*EM`qujI0jqkQ5tJ2A)rYBQ4hq7%S}K8VxQ>%5dSt#Y_=QUCUhs3 zPzT8y1e`x-4ta$47|b2@Z@Ja${H{wnBD$)iM%+rz7q3>d+QP1%&^eqwf;!4jJSc7z9zPJ{tY z51VA^tZQVX;lzjLTOI)PiPhA#dlOFNyl%U_ulVpe>sB#xOWP-&FDN(Y@8n3{$X7E& zAV_Y)$TqjaSOM__L}wC-VNDVuF0m2IY%%o#L0Q;W#m{s`wSi3wbUdu#Zd~P)9VN%0 z)pX|0nnr}je{2b=05|MGAVvW^&9j-X_JG%)64Y)V#_+Vf7^>U!6BjH@t>{~&&$|tM z;MD+|E-*&w=y@N|L<33Iu3eAb0=fk|8uaM z-r2$G=QA_Cvy-_My}h%sv+<9}>c2Er|E#;yzyDU&a??NSj_{MKf;}&QLTYri)v5lb zrtn1gUCfeb%rIS)EjnDvCehhc=Fk871^MJZ3d!jL*BQPRso-*i*92$%vZEvCXA(WP zYAZ=D{qnayA|wnknJDx4{jHjpLfjObJ{_O~YToadF&qX+BeMf^ZEz7&XB_(r1=e)R zL!w4oo9{HCv1v-bnjhI4g+*qTjMK`5yV)IY1DJbfcZaf=b2XwboCdvz3ftNJ=ENP0 zmgUI20wlZJ-=zOxJd6&F-R4^YTiUEy)pCH~Fv=Kg zvlrP38^}WuwSUB;fBn7H<`5QVVGI8s1Z07qbN~Jz@XtE`I|4UYKeB-T00BowD<=ni z8%H}^2dDoHAg0x=Z4cWJzpi!r-|f^oPZo_^Lkrle{B53*wB{a>NOr)i-f`)9AEM35tG)1|@$hXQCO11{ecig=CQ&mR zTYEpJZ+h^fMMcJ|jqN%ZwA72f^@sMD@nX+*hgC>QFZEt$m}=78QdT6IArl4*QIS{f zj47{F5Fi;E1gS}(Q24MB55%go_J1xxGh92qa5Yp0B@YBA7Gm9ByO4OtK5 z5MVh>&=u&US$=DYfE&FJixy?0{$o35zh5(gfPZb9wgV|tu~zkq-21It1T_*WXp!2Z z0m(Au#+_1iD;x(WHxN&jyVI*$=2|jSD)?Kvps?Ik;gaGnx1IU?JuqMZR$&%b;fn)k zFR`$S-P1^YG5Au4na z>l0{2=l~q?q*zh@hF~P;3hS*?tO~WU!wmyxY{|4Lbd2HIA}XigE=QxWFA6H_m{c~` zM03ef%hvf%CrbU?n6agY*Qj|*Cfkn5^>W&$`q*=kgz^{1NFbs zZOp3s!)AajP~a@2DqX^4LyzNFS^w{X;}{g5J1 zPYS#P3{jfgXly(w;gFMTC)$i(Ek%7B12ow%bz{yrD$)-RmBe*G%^K{55?v(B)aN3* zU~YiLS}m{Z|HzjFyposoBJINaX1ZW-@3A?y{Eq(OYj8`jn(IK}pYD~Tg%{=A7r833 z0CrHQ3CM_ey69q5^&tIY$ZQjUFyT9<2so{e`YBwTfunLDCwa{EEM?uU4c;nbCkBHF|Aw>ACLA&%g z1pD#E9uWQ|uWBEBJm`GGZ*MA(v5W2Wt$eP(zrEPrA|s`mmjUq5=lf}n+1PcAh;Gve-^ z7#Vgb;z$Zb@zzeB&|#Qe#OD-dSmY#S(b|@OJO`T;m70iLkGxj4Fi&mb0e$!CCRL0F zZa;61Mih8nz~Yj?pQX#gy~T5+>bj~l4Zf@T$bwG)2-*V!5TX7-ASJHrc898dt7VQc zYN^~OI6FO3a%kdq$8TF^+tX<{2K+gR3o?~3%@uRAk;+`QZ0<6d(8{B!ol4z-B5Col zK=~sNG27#jQEAE&mM+)mZ>Y*n0N?iR07%Yq!&R(O<#?PbXNT;AVU^(dc-%h``LcW3 zAH}@jaPw$W*OKY1dwq)#=`tHZ1`i|x6ud5bok|-~eM-R#Kv1X8$Q2PjsbbWeGe|<< z&tuD!Ka}g0D*YoF8KPU_@635V#HYQ&HI68Ygs@aKW6=InMv$|tq_Zj#K}gtnCiyO1 z)YkYsUA@UT^3K_X?H<6rcsAJu03mxXGVOFK{Qlt{;1CT6FD>6cy|I57$G>wCkspcT zf5Has9Bkd(|DPnp`QO=~w~|b3CIdqE1GVU5ov@&mhbCod*|thWL*@2k6b?oJslj5s z1nYN?;i2C{vzFhTSJ#Wl2<#aT%7_!`n0M{Cpa=y`3b1qbmJdC3HI2^(4n*`doSKSw z3&~$olSF7f0?cyd1d?B@eezJ$lVB&D;?FdimLCgnUUSBfw~L8i-0gys%_?c3zHrt@ zbZHhWDpdQ(=@r8~?}0{lm&`@x=esv%;0j=@ECgd_Pzfd#ff7V3n&+@1quj zK1HG07oXlwM0amFo&pB&zPsO31fvnx_9ojy0`gOtjaA&C(1MO_FMji!aVKEWmO{18 zt>}`MaS>lA$xRt8A=Z^l zkn-9B3>L;mNh84z_67Q}QkfZE&Rj=d!-iLnblTsXl1vt^TJ#C0t|r_yN0add+Kl0( z_>iJnxI)c7sP}JxkX3&DO=&K&jI2Aj-ss5_)Bz}Eq23D1Z!AQrAp=2>HIE5a!FV## zk1Wet6j)Ikd_F4KCO0fl(khBg>$~soW_@8OXzy~YH=chX$}J${Nnv|2Wc3F97IEO> zuvwoG)R7i;+9UDy8adFxX^_!QD9T22#$>^(ERMWzk06TB{HE!HKSbsr|L=Q% zp=Pzfb$+JO{@Ka@zQ=J;0e(#9{=a8DuKMQx3(x)^w)nD|rY-g;s?SMnngV=*R)mTr z2%uJ@KQwz;yb_ZYs1F2;L7QhvmV=8aGjk=X|JSRRDcvNg2*JAv zrBCbgRw7^aUtCwPK47F?X|}_h8#E-URjKPydSz{=P1}1%@sE93o)aluQ1(k48L#dx zDwtf1B~rxr9#z~keA1=Kf>UO~P4!J~0`ewUROS27j`TVazFE5MG#Ael9!W6N(?r|) z&VACf{EmF2&;|~BZ=!EMQnDD5-9Glakv$i~1z8ImNeJWts^{O2uUlg{GoaU#{AbPP#2jSi?DD`>9#5tIXx7D%m(kc+--cF5 zqDElRztjE_II8yY6BWdstzb|=QE?-75w5;fLF2-i9?pOo-!PWJbx)~6(}t#no+uE- zzJ=UFva{>d4D)r$skX%GMt|hDA`=hnZ0IhwtIH@M35|P2PxBvsEjFk7>~kj3U-E#P z(W^sNtVcB3=L*tb`Ch|=z8e>=71L57z;bpW-IH#)ytF_J*jssYtQV%@1#Z7u7gu~xm#Fb~p-jx-q2E4lhln_jvn&IafskZWRzCw=9GuP!L~6+) zG%PSb%Y=|XjWpS0(#)0>r22{*WLL$yWmQJC7O}Rt4CPWifx60~yPj@D+!7@zc)cJ= z5Hwfy9MR27lYzuWcA=rBx;P@H8gQAnvV?_)!b==}kA*C7h5!a+l_VP-|Jet+Zz0Z* zyk&*EETORWr{g*f6ceoa1=YXuMlf8A?8=90FdJ2a9hC|wMDtPYV6|>4^TsxBQ7)Qu z9=-kJHX^5VmgvsY5&DD|Dl{b?v+a%lNE*E;oJ2#+D@1(-Lml)noB@n7f?G566pVAa zZZxwrB+%Sq63P&OX>rVsik28&(I!c6R~-14dRa;IuQ#Ph?Vp2ArD3|EUIU(R)|^qd zA8S6rA-~M4y&;cS_A;YV@4W%jdV_*bsyz>`$~5#d6VBYcH_!~YJ!R%eQ;PH|x1LWp z<;1Imp;(2sVPDtCiu+irc+JJReHx%~q!|*H2ubWSQ^hm`k6&{*Ae@7YkJxJ;vu`=$ z{M)u164%zQ0Su2lcNb9{BclwXrE^w-?7c{~DFxe(^`68!v^|sloq7Hw*>uCY=)3rY z#WkE#ZlhJITcT&>PUr^-XbU!5wQRa{h!$nb6v0};3Ppz_&3Bsuk}g{quaHDI%mfj9 zw1@2VZZBWYUx$kqf&N7fk4H!4zF^ekt@QACop_#?G>a5kJ7Jj*eWQD9zCn%LF;%wx zM+`htArXOqdBjFgru;0o7HMh*zL|HMTDRPde-TN6uc)J#-lRHA$6HD43Ft17)B;Xk zrS>q3sWWxGF0o8v4QHFK<@~j!f-9aw6JXSA0QY_1zPxyRWz&r#Y4g4G**}naUdVTq zjqtbeAkefHGMOmck|BQ|UFPO@A>_J8QNXI&K*DBTG>@259l^qIh`F^fbbD0D?=OXL zRbE5{aD92?+F6(bt71SL2=_CMHJ1#x*{9nyW|O0^1waBQk+C@G6m2ElLr^}kEWN7~ zctQ?JOra-N2xgMth5I2mO)-H0lQeOg!@fZ*A4K`V@kAQpIOt~!f=6eDj>LF!VCg7H ztYE@=!%q`!)LQK2u=LC-n2ff%-_LNb^Y)UfHWI(!0N;Hwb^%{dA9FE{1hkF3Gei<> z^}p{cf^v z z1@x>BNLre$GAxyld3u{9?stoOdNwpJDBhv|OS6_Yi@m#xA$75x?8r>Vm;H}=vuK-3l8{f%yeC8R}r*)zH>^7Il&3b?JTEl zY19`Bhv7MN)-{#f?24E_lVNypdRL12^te28V;@ji0Wx_b�-*N)OX}*+|Brp>8vj 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 z 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 z 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

t;sriXh6O_-cDIQ9sPU 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 z

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

Xh4%TM{#S3+aGtV;6%5WsEX^63b6$) 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%0A){xxq(+kr#(JjtU> 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ͳJf_?2z`G3MX?Ce#oYyoMK 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�bBS)hMJpJ^(VD;bs1$>7r{SH~|9>niuuC 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

^ldOy>FI(?kg)->!+ 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%0AV|9z7ks{MIj@%+VZp(GZJi4_6Im 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%0D4} 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

A!y;@Z`P;wa!;3 z1@Y6gb@`F~`0~Q}s7West*}=r0OdOgLMdW99+$QFdk?<@!i8oc2zBh0)}S)!q8P`L z>Qus^8(!<&|C)Jb2!e6Mg@hE@Tce}uXe6vzd%s$nBlA6s?mXxGN>99s%_Qc4_ArGx zd4i@R{|@9KBD47i1N&J;q#3cGwL2?(E>POm0^^e4mLkXH$sechzgK1@aa4SeEXU0_TjDP?ofk(nW&wrBYj%XrpcV6$?q|BDO2|QG4#y@gt-p;}!@21#8yzDBXlbopxzj9d-SL+i zk+z}`;N0sB4r`5=E}gXqSVP#r3XV%?9IBh=7xrV?!@9`DdBT}SYMX-Eivu>dzpYbH zcWv(xd6^X?hF5R#tuY=#TjlmLA3u%`(LT?k$^E=yA-Cb8ZV&uU%RBpHBjEk#1k@U6 zE5gI}7nWNPM5XnJg3#2$Qe1Gig?yLjM_oEBszx)&ww2om>qN+4{hC^FutDELc0ai7 zAy|vVS@Bw4bBKXFA4=meq<);`(4b57t|;1fKM6^*sVX|Zq782nskm-La&|NGn z?acKZ44th1Q@#Ko)WtA{zMe|4IR17;EH-Hy5UZ>`4qMqY;o|=2&>(`c(8AHQp-MO; ztzjE=-{u}*XHBw*O*xbb7XbN@HImKjJ`Lv&RbXy&Hcfl%H(KEExmPPLJ~A>Q9#u0I zbOrI{AnQN;J9=Aw^<`=)-sdjyoOuFTh(9AN1E42Re5~=hD7_9OqnaWx3p-o6u9u;NO)^ z-eRH!B;G87M=aXx4MJRIRax?kEa z56#liG6TfX##f)+coDQWVceVS!hFW=mBgsPkZ8Bv==24hpNqN(L6G;KId4q;56skK z*X;|XMoPnl?br0_hLeSickPCZ)~D@$qm!Mz&4qEew@-zI2ft?S1NHRd(3fGUZF-zxVrNxODea;Y?(}$D0=$QM5Z?NOl%d z3OscSlf`5=s8NJ6-jT;ws{P=F-nHps1l4^v0fcy;c^pfT+RoXME8cRW@)zxW%nTtn zwPlkdB{N^CXFc9GmZ-#ljeF*lNM^5dE*|XMwkpnVG? z$>Ti-#PKM~1Ylwfeo?dgVra7=Sj=|!ag_PL+Z&fOJ4U0x+0B!-SwJ?Xt-L6xrJj7) zVMIUVv#fahKTrD}u7ej0O^1pU6Zj;duJ_z1*o~L=q}~HdLY0N4E!_AVGh8sLvQGQm z@!4Tk4^5mBhpA8khRwy?R?Sh>Q%Xao*O|^~a*7f5evrit4I+u7^6zP0s@Li%mOPUQ z(^~siM#-bs;q_WlgJ@Z>@cbk~DE6NjdN&shYv}6&&k$Lu;Ukw%PUJS3*vZL`(4fto zk*hqcIYg;KFi88|7S&^KZ{XW2?8uP*j_YYI{EcKYh;QIwV#cSq>d^U4&}kRe@b2Lx zJ1Oe(j|JwgF(n!EH@a`0x>Lo7WaSh(VM1ie)D+R(T-vo*?wF(NmLwF3%9GC*&RraQ z4^eFe#BjrD>G_szG2LgrMeTHl_%A{_qSLMnnd`qT*YNg^j9^z&GKN9hH8&eqGjg)Z z*OY2CPd5>0Fx*JQyrhgTRII8*qrSoH3`{D=ow0YeG9A#WKvv$B-uk7M}Ad z%?jLyz0lK#s$F+Y`gC9$bRU0CyyZEgssoROsDK0pQfvQHpOCiXJLo-prOuPSH-1+0~I+QaQwdEiLQf zzFfw&XWoawsGV*x3Oq_zTjz93G4-r`MKP_H0auELnj$*a&&Xdz|K&qxhwidE{s-1e z38{?4pkk_SFGCYForVAYSyilBL$-{C&0lqOoUh&5?P^Mb1 zWpzne!Qy^pwdT*Yx%ki{Qp35ehR6>O39@tX$dcG;Oxpl7LmnJ1dfOX;7&a zhDWM#*9lxz!~F5qFb+RAZ@z3NhAvgu*L+O=6d08VwcKCIOq4=cCA1oR+CC?|ggm8d zm5F62u3Pl*J_{|JthEJnxO zGj#2;F?DyDN?}>oP|~;BYyHAU?NZse=o5qhF~nIY_(0^sYwwxbfs>c zI|A0D#tsAu-UHDyZOy*7LIMv|_XylFiwyRLjHaesHz2m!vDWegr%i`M#P+Y;Mu`3# zKEH#Yad!&TYZtE8P@*lvx$RL4Y`j`<$D_EsAqS}GHx58-a*wumn{PJb06T;JD|a|&{cV|= zn(beZr_=OtSIZLY#cM9WN`;bEM(Dt1KxPdg*HDKk>1)2jTUKe{j~OU-ralf+_-zy? zEgisVR3~gFZhD=_TPZOhE!8tE#c@O%u|$m>Kk?aCmZw|0OV?Rp0xg68m3x%sc9y)J zevpMZW`vu!NM;Fvg&5`(6mp18bx07iWtSk%7&>x~MU{IDdNfZ@Py?>*W234{T&j znhphr3sn+#rE9o4_XXN-$1ob?6b=2y%f&(3w)Nk&xd;2NYqP(CeDg?u;|k{WLFH9l zyb?HI-L13X?^Znzd4lt=I;>A#)#J|JLE1kF6VE+@i$J+;Yx$d|js5@)CV_)_0(*`* zeaH_j7k6FIw0tTD(NeWyYuiU5sFj;18!Vqe>|_}%8!UTX!cPMFWet|)O_#~B`>I-< zR&-BYBPPAf+gnN}y(0PkzUXgNe?JFzmG<(r5~^Vs?unu_?mfQ%>9PX{Bmohv$Pa&4 z;_b!kO{JaV4yYDYa?8|g#Woadr0CT`$GK1(APB4g+z)ht6@eA^>)MLVjHnJ)ymE9b zU`2LNTC77{IzrW%rryz|OM3yb!T-uVLAD2bUtjeYv)ARDfz|=+=tJV1G%cY4tbugO zDZao0)3?s45^ebUJS|j?>L_@Oa^v{k1;DpT>s{zw@Vu<{(CUDGZX(D{ApucfKd9=k z!l%z)o^I?GTVy>8Pz?T8?g@(eF*6K6<&Cg$9q1C5UQDWe<+*T%OyIzJKza=(*FY6= zsEr#<9hX$F>#V@buDgBotd}UOT3bMysH-@uT(#Zk+NEJ2PSxTy%J{&wxFoCiP;PDS zUYKhwD^Q(!L<%OxNG;yiO~>2c!;Xl)HVZVP4<;F3TeP@g+#it-U)7+~0-at$;X zv(T^s)wzWQ+rbLFdbVSbsKo~DQEdlQ1MLCtk-hR8rq-AnxMNv(rT!<-3jA7Si%xiC z^&_)wZN6(ZkHGSORkp}7`*Gq*D$w#8xWN`eU5Tat3$MgvqNGd};VkT|bjq17&@vMp zH$s(mbbX#SsX;Xy0$aIhBGBJkA_Hg{2yjbW_G+y|2Q*XErO<$Auou^KIN>waEl)Rn zKrFM~0cn8#D|b{4{hkqj^KAW{rOTT$sGi2MKtq!EX_7MO6%E(L$8Aj;=KdhFXpUwQ zmes;A-XO(F+yLz$z`!3jw=(~Gy=)oj`?QfWUp3`2@Pg$O?S?&DH5#M|&cEu&G9t6<7{dZ~d-!ED`0jQ7Bf4XP^kTm*c_8$M~ip3gmw15`Y z^QMkO4YL+#{nP*)tOz-w)e7CgDtP|4F)ZHn|9JQU8p9Ggw4IjP+c`Kvv?TT}Zw@)d z5AKQm1a#OQgI)qeoc^4os#)9H*NX1oFzi%6M|1i}{f_<}JGOi3D4p76l;sf^$KzBy z0wRcUksu+KB|(q%^jRFTAdif$6gOKMlXuXMnnN~&->~Dt)`X!H7VM{ghD>1GkCn)%ZYC z0(40vWRV;*3D)8}k-T@T>nSWmcAFE>eOkSKWY`Hzt))Oa>1mRT8t6YFdNVQ7V%~YJ zfq_2zB?~}AI{}DjPI#}sM0AE@3t0`{d=kxCnZl7cq(yp1?Stp}!*tRQA0?h=gINKB{ zcwxU`KLFXC?Y~IDJg=wp>t{v+i=1mr)s!5M-jak5*)rdSb=R;h;tgW#<%bIc@6ZKh zyxV~J4NP)S<3_>B>m|mwERAcOB^qA6qk-5NJ72u@vrOF|3{^~h9<+?t( z@Kz_QUxs5UX4XJsxGA!21%EWxO`vA>nE(MS|8;*y9hjnuB%2SNjVB{Ai*95$CEygQ zmnHL>Pz0jTqxZ)IkHmm^6!RAIB|m7|9EZrNZ;^FffV-CLtlb2ODye=-Q=V5dPapq*FXQS!B{bY&$O@$Mr^su2+odI>ouS0Yw6Xw^{Df0DYw2n){k@)%Gt zo7u}PIhCkF@J_1ejzdKPMhQ#HA!-xS(NG4}iqHaguZA0csP?QF5NPV+o$XhyoYR1)ZoyD)5i${XKiv;i z_wIabxs&A|wSx^uyiDEf)81xlCHd7PTRB_+8hWR;3bBp`{D0HXrv)0>M*l@aKM=g3 z{G*}qaX6K6oLPy*eHEo}Y*~vDWRA?>#;E}`bXw^6Um7~+|DmCEIcc2nwp;(v(CGjg zx?_+Ax=7#jFAaV9rumnK_C0Tk8)j3jluXFn2+4Y#OkbzJxG;dcn?jzd_JBnTp@!=KQ&2n6!fX2l9g4eh}E=y_`;qm^WP{c*#;mm3!MAciPih&xavxO3ATxo&QvOq z!{A@6P9>7ZfB8%uvp*Y^N+L)(oh2TNyp%%I;TE2i?D+p{?M~I&pd^C8767^me&K~>qlrEzHa?9JXhnNx3`->z#772 z9QIz+ujrRWGsNLHR>p6i;~OXyt?XG4)3nbAZ#k9u@?V5~LD6o6Vo2q6h|G_wR|q2Ba458Y83KYraDG5=}*B8P3S zwPN_=^zdfE)6n7iU5j>fM5mQct-~6DW75;mk`}_z7$&U!gi3Ax`*+$QiF%k=_I@wL z@Z}O+00`|j1zX8N%YzO%i9mAur_N`YUaj_b3dZ{KrH(Xy@}G(!`f=Q~8Vbj-;=2$SmdWDS*YB2J{o$gF>SN1W#0U$K*$yG(wnB`o^hU#As z+K>dmD!+ODW0l8u#B^HmYXBg0rS<4p3;MZSaEFy++&poyu#`I?_15_u7P77vaX}}B z2mpk})-5cokB31V=yb;dyg9-=0EFgEx*DGxE1v^fQ2h%+TQUhLw7#`N3*rZLoSld% zwc?ipK8bGgP299N`e;woVccS6Ihxsx06`Hlx6EqA)6n9y}<EX3}ve?jP&!H{>mr+c(J?gRH`;20=-?vT`z2(((_ zp*Q59Ez3A{2BZca6VK7RE7A#WPC(*hmv1ZwLpRc~F6=ZYrZXngJx+GIarI3^m$&%A z!RL`ej$_US=v~cpP8NYIqh2#{S{x1~nTSVcZZ6U;aepPWJ($M^Fi#=LUT4^|op<{c zOIKwgB!D637IA+<-pVG3(Z?fhlV$*OUje-`Sj*+GJXwdscNOU&KG;q4+ST^yuywD$;_VQ!TW7PZk>J87}(xuTmH zkXWTf#4TO==?STYSJg1J#V^`Qo{_u@{yfUEldivFE3QO?#KvdhGI4oInEUtV}uw zgqgR#r+kq^km%9X$5LLjo3RQ1ob2q}++09Az1hvTw@?n3D8Fleyu5QncJqbw?hE&-?oKLH>K> z`Wp@I?i1)eA5v=<(X%&EAQJa2@4k!LMbE;RENP;ia0ag zI*_Q>VVj>O_%NoLKyo_oJ4 zTNr}$W#e6-hYTh-ua-gE4-tV`Wmd>LL?I})mIXT{0F{P3P0?%{QspV6cax*vs1|jO z{IAp1i~oVgM0DjnS2nYX827sTD25zAQT4UsMz`^5Mxz4M#FE|M$lS-^NESXSQ;4vK zCN;0*s|wVK2~`=fv2&y5S&Fkby^`Dc2DRwUFwpM|WUQEyRX7aw(k}ccF{9+3_5;@O zW`v$D_uI3%Jf-Dx6K*10tnpVQ{ijC? zoxr}()t_=V15Mf8TR2Pv4LoZ0vk3~T)o7t%!BbsTVB{}vmRvwt%^uH3D3~BaGwl4e zvY73J*0X)hbnY9XRG3j{P`6@ra*ncjEq47;3wU$!uoRl$*k4rDWOTN}r;5^>MeduF zT7w&&Y{omqGS--Bg{*HwY4m*#!w|I*$ywioO32|hrC z;-mSO(ERj#AcgkhP7DT1G1Q<Y5Ud-A8U@T?_Laoh%22OMQ%hF$-dl5U zfbnl@BBH5cX}pFDno~9(H6p9;6C7Y$DV&#Ck}%wyu|h}i>_=T97Mjr4OF|-nWpp@6 z11WHoWlL`o0njVWCqWjP}CCw+8clzbY+z^UXehet;wL8NYD;zX>(xpni8u1ZQ|L1uxN66w_XE%p z&;t^zQIF&=J=bEE0mj}~)f%_`x20aJocT|>6ixw`_lHOq}aswmoP5Z+|l;?=l<@|iR zx1J~P&jO+XLAnrc+csDpZPFvzqtE=LzeS##G*56|H-IQpYXf7yVE?oHW9 zCGi=P57wR*r;@bD4{X%2N>zsr?lZLHHFyQtE6i;tYY_7>AH2R zNt#O)TMM-VPy1*6=eUiu_Z*iiU(U8io!UvaPomBpjb`Wcj_eK6Y{sZXv+RB5kRSA@ zgS!To8>*ZSuGpO>s5*!8dwfrEQv$)$;gOg_c}cs7dRso>h#q@uiI7-B_Q#!qF1m_I zkYH4vu|I|0)8PvIT+94xx9n1WjAKiUU7UEt6fMdJa3mW-JpImz<&Ye&q#Ft$ zy-p{M9JF1~*02u4R!G){S#vlX{tk@#cIjnLGx8*qdtX$zu1s)2&l)<9!Frb?mR8HpL zjf)X98|qF8EBchq%&z!VK$LC~&r#=yGzf9P@u9EdPXA{I-LD+F#q1EHletlZ*D#m@^JvzI%XiN-?ekU_$F zi6v@R;zRc#OPm~FqeuIAy*+FiufSD~96B%eg=QS8D2J!_vW+-MfVkS}D9d@Z-+;^v zvoS{~qNCjzgj~~!mg$o?Ikkct2O)jcV54W5Zwgo9@)GFc2=sF9fQ02)>h%4c^gP4% za|YT{mD6u<)HJ7UgeL~*U}R^lW|HbOS9W$iC%d3~xyt?6eH{-x|380gMmviPC;4-( ztgc@`|Ex$)aZ@e$paB5>8R-B0sINi-0HE^Uj{1%!_I8f{$%Oy^;FkZ2acsK$1Gj9h zlZeG|BvknM(%6&qP zXV>qZ9if{H+P#XGBm>-nihDLCXIGE8g+%lyqI9USdvV2Ns77Ne;$Qu3+KjT_q+toq z9EgfPTt0OKXED&EA6Ax>>@l((g$Y{Jh@w?01uU=0L8^!$jB~#PCZapi9f+Cp->l?w z#M(ouc*)9#d>FdX1qR+nL{32puNYwGuY-f@sJI%YcuK^$IEXDoT7E))xsQ?bx2QhC zIGElTj`txJVWv)Eiaqssj44(?MKI`EcY!0uoL5AxKSP*wXhBxc6K4GJ)Z*vB86kCS zC)UCJ_SqAe3G~9wNer}z*^tSH@j=I3D^%T1ie7j7;74PK<;>M_?q*!wfq=P=~iXc^b340EQ?esM1$`t6OzV$K*M)H=&x9NF-{IcEX6}g? z2=HjYj4qNmY%t7U_J5Zy&OCCFgz;xY( z{b!KkFdT&;(^%BlrySy~y{DW+j-O$LEUFZc5;%kdij_n5_+yQE1zE5Y)Tl{C zMu#QwMQX;*&F08hq5=(u3Y}lz)IJq6P#Rp)>9Io@(4?~b5g1VY>Cs~o4TgiLC$s9@ znFLwz{)nBvyli3K2V;Q!!6dH&_?AMQk&-~(Z_cMU$L%GHHD?&y#qpmdtdl4pF{79O zeY4^0qK4KE{?*y*LFmJ5l8%SeqzUZ?89hE7TPAPC`jf~t9(Pid$jQzYWg9?cTBS)aeW5!VV3MeI4r4|SwP`W_HhoQDm%tJrF0U2F&D(i+~mfu#C-8aba zvoVzK(HX3A%;bmnhkMdy5y#iDXxQ@w!%597LBjM;$bEBTSV2_@Qd;_{;Z7{UNi}9# zM`Jz@N~R6e0WdyMeYBpxS%?0kUn+^(PwX%{Z+x%?&@F47*B=!&yiu|H7-E~2b|lSk ziTq^`+tp{TR@KFVRi1xV`YS$6v<^OzOz38>V%^}i=3%GCf*F?mA@?LClTRhFYyWh6LXDh7JTm23)=>*6_4l@1at z9#emF8>L!Q(rAjrMdyS#r|DmK)*}kRXC%}?N{J_PMyMae5Fws!Cx-qAtUc{Zh zI~qBuQC=J5IG*N+nm(2_g-)dW0qD!8!1&8c86@P9b0XXe;lQ1{%jOkP!wty%Xc;X^ z?z9ms?DPTy6!kShqHk%Kq?Xb@i!(_x-ZMjfQaXpASD!m&@(|8zE)~fgA{QhQE})dl z8$Pq0mu{DAIl=v9ovPy6(Or2Ki4Q^o#&qxW@+x2==k|p$Jp?GnP*N%lczkQYFk0d& zQ~Y)ImOvVUD9lLhntg(&gv$fU;Ep)Uf*pHU6)D?`g(MGp{WwyW$qkN$k^#1|dpO5? znWTjj#f%MTN^#DabWr767HZ2hI8+Lc*!t39EoKVBj2;_T^G#->m`%fJlc8=9hUyUd zQ>U(-R@d&{Fqe(cYatXf(%*avpA8H685Zyj5j-S`y}YXol)7HEeZJPlg9W%JN`TcE306$Kp>UAJOX zQ+$6WkW@0hjxN}g>=sqB+XM$Dli}qMMMj!takMD@PU$AuMoPw4a{#M&d5hV=$pvND1A-k6W4NLkDcMG8xJ& zM2tclgInJ3jo%k)kHkrq@;hquublML`yIbO8x+CG!J_GWkjia|Pn`F#!z1K6VuV9f z_&w}XZ3QuUnMCt4j=3pT5bc;RJMn)C2$8$zm=s?>RBCkA8*)EuKlI(G;ma29Dh~ur z_-sN=Ywd*Lx(q4?zaQTdaCGsimA>d!C@w`jTP50_WhA*`;XRpZ4^nOO8XIgoq8FYb zO!{CttCzvH@`BvW5-?mjeOqPNH%YyjS|H1v`Mx%j{^r1~K!sWb(>Yh&{ENCY`h6&! z1ooqhKkE4Jb@PrN@V{>bH8yZEH?%WwH2zPPV?PgyqG+F2dJOjRqi`r?7H%IwP6OQXI&3CNYn8=AO8VI9D535V>om`0kuihoWrRTDj;sBJ76CA&2z??&lJ)7qRp=Q2FD9htE`^Fy_^2YMYtkj*AT z?6caP8H()(JIRjcF`u%7w~)!}(-(rx?tYKWcNX-(Oql@-;>HEv4`Ihm_RoiO^9r!Su^eX=Ww?FgZ!%;~Py==738p9}(MyY*!7%NQJ!*4$zOTAs;gCqg-#p!u zeDjZy7-J3hr3lwXxrq^S`vfwjG6LwN1UJJG{+yU!D}C$-k;{d0xO`vUcI|F|y$gTN zEf}QNYH%f(ri6j0z%waImq2#Eqy-{^s?ZP8E~qn6iF$POdf=zhq)@=DtF7($t8o-? z7a1)lCd*ghKYQb)R8WAsJ{%n`tId_)*BZ?5JyX(=@k#`EX(CQ{7xNJ5Qezdx8^9vmZRH8j#1^sLk{g1D4 zYBf%Eg)0i5fiJR(SB@Q=a@pFzoFsqmUXo&RsC7dY!-2LLfjj3{%tFoihtu-z1J<+X zh0$aPW;nM0Nroo_cbLGQ*k`trlHqYBq9l|M(pPd zB4jO^{*sSIY+g;e&zc3OF>KyfzS(q0$vd24x~p4S5vAN**``RP}z(5UJ0u_0^Dm<1Ca7(S8Au?^Li}OPa*;5mc1U=UIEL# z8q?Zt6jCr~`$hoh#j8fnvxaU*S6A=pO@mN@ZWN$G4aIv&3cCavlDdix96Qf|~G~>I;25ZQa^i4KA}4m!N!T!46k)tMWZ^Io4H7 zA!F8#%?ELYbR>V%^g+S=8NbPK{)R4IFKgtMU=!R=6U(i-L37wP1oU@^+ZlN9CTXXO zeDu#NFiT6P<6hp*2$n8O1mYSXSon~-N#3GpROurRR5wDc8AybK3Bz>UHyK-TBhB%a zu;NGQY4(eA1T~tZb_rOpX+439wGBQJ5M^8?H_!uC(Wj`!ULKZ3c9G@%NnLU(9OE*u zS!J+ltJZS)g$|{I3<~9x&SU!HoLZGhRv%h_wsBn%!#yk$YT2%$g|{G94K(VUF0A_E z;Az6TO28sjwqD+&gbn4?-y?6Gn~ zhrZ2+j|m`69y)*%d|RSY{fL0_$j&n!T;7m0Ga2uh_+Rm?uy`m-Z@6TftFtX}p(ldX zgiE)_ckNCd(b;GKkMw7AhVy};n+K@(nH;5qFkdN1mD~Vw#(d+osN|oN=J!8^Hu0CJ z%+j-nCoGzQJbFx4Wtu`i$A(}$g{!sV_!qO}-V7{ov3wnteMhr5Kc*kb34#+Olibh1BH2Fk~v)rz_Q+`oPx{j&*diGu) zzu!Mme(lx*YxpYuGI(T9>C)DtjN!*|@6-Y?V(|0&L`er#kY?UT^necy!b>hiN}TrX zpDNhlrng+cnGxMT3}lz38h>fPm0HnIT+xadJbT}zZeSNST6~=7J_sFy$cedSS$(c1 z`n+j%G0myz364=TeGlX`_uU9gh#en;RK`N(oUeUijc#nOoU6&#t9sCOB#yZW`cCpY zEP+y=LkEJJ9B`(9Pq_Ybvt~Nq+c1R+QahwHU6)p}PpU)vM_s#ww=$pAEmV<}AGNOR zSF$Ez8AV4+j$F`0yY5k$z3z3OFPZe*?cl(kXA0Is@uTu=xVKvMvKltD1kd=?kz3{V zcZCa$n5yE5Wdce2bHSf;pGa|;Yjy~o8;@_F8PpW7?e9Gg^LC%U07IASiJ!3TLtcl+ zu`*b|>+#lcMpa@L!ck7cs;Eb7Md0R0B?Jy^O0${-y-6BKMeR2RTVu7Ii8_8~Cn#NI zII%@mmy{FDc)+o1V&kK5CW)oiqOnJF#D|3WRD{BNxBYOlYnPTN| z^8!^`-z-73pr=VF>8&oTW?}cctdEH&)kI^*Cd(0A_{^bO~Y z-i3$B*~%OJkZOL29)@q_jvP?W5Zc|JN-s+%ZX{fZ_?|~A$XVoN5;5nfQw#@GWK!vJ zV(FVAm`gfs%fmk~I_edR81$iy+>kp80`^C;TvTp{x*d&Q&|f#$y~o5$?i5~Z5x)eW z=6At3UnCKY;cS>fImLz8_EWMPf)5TLZ4`r4R|S9vbB#osjClRD0owSDv;iyt=Kazw zdL8HiqP{kwzfO+X81jmYXt+&RmpAWNj{tfyc67yLx{hdY%qJBAB=7T}oV`GZ@$rsH zOZmHaB%LIY0xWg%vQUi{RT_kJXEk(VYj#KB2Eo_*RR8K{w_-UbQ>hbLi-ycn3h6I? zLP_>&Z6;!PBgkkAL4#wK78=bi`4My5MuHdSZwSBWNr}zF#4Grg;m*3!H;=4-%^JNc zcMZqtdeax~P!^iS&5X$73cbDwdSFDf$-55B1HZ|%u(zVo;Ct!@6`~_Z zIOk3{#fJY2ZSKpIa4QuA>Bke%-ZL})tU#R26Wb+k%5TqPa3w5Z&U0TB?0vLiuilD* z1D;W6-lcnI%yc7PaO|mH4(qlujr*ulOj|ii@oisR1IoJmJS)3 z;qvr!kp$Wl*`gtr^NA7>8&&CY9-cd&bgZCaB8wFijONh}NpoEHR%pqpY=xqXOva~CkT>a-DlQE&4cdA-|Kl)8AHkaC+w`@urXTGgw5S*PRO5< z_Y;$FtSwIWw`s(-2T?H&E(|Qe9US-Y^~uBNk-NpyqrB;6cvN6ebG=Tw-~O)fU!gPB z_BX%6pMFn9LEn)E9pDUwS{wy!zR2}{>{4#`yIucAhmF}FbWVfX8Xqv6dZe9Vk+_m{ zi^R2qM$7{i1~0`r;N`XhGecDVAoc@Oi*)vjH}j8xznNf%lt*#Gjl_#UM0qt8rvRuRn)o++)!-b@7hqT4a(-#OIx4R zU9-~q7Z|yQhD5jOHGT)@>g9bu0T3+3D>ibseU9wwhvl>XF&4r23$h3PR`M-yS~9Vh z61b?C38{IgGXr8HMo^sy3HFvon|4&zTnHCb4A?jR%nuu$YL3~4#zc@tc>-0GhznIecTp|kYTNch+R%H+&czCGu`l5&@eJ02; z2s}5Lx^;ht3=9;Bw2a@Ynj~4T@a-FtekTVHplZ|+S{nZrloEpk3MFieZUb*&WAX)n zP2^%8h#FKO32u?%NB14K3R3@{?D7a7tD!?xWjRUPq2Hc*cZ}W<{t6{CvQ-u7cB-x? zN!L#~_AO~?2XW9zqYof0NO3^y6Ofd4p7=mq;+HVrhJ*?3_+|JKX`%2DrW5c0us&Em z?zm+M;*Xua&v{;LxYZS@s}>A(1CuplD_mrE946|hc4x6Wr`dmkVgwe5DTZYW#IzI& zh^N+$y!HnUSRJX;?xe|vHcS;QuVmBzq|;Gs!LQp@1I%V_$m!@e@7FeFwnpWvG|TW9bsACU{v7?C{K8Aq&zHXhiz>W=fNtjrFdxO@+U+r8 ze!VdUGv%vP9NqZQYvJLsAds({UYY{lM037PvL2WjJ!C`a>C zkD-*jo|SbpJ`hB3zRj?x7+@8h!@AnVyg|&hRjSu`H&qlY8q>M>jZH*HW5PZvSy4N$ z7)wYdBHNDl?ng)@BHGSC^!YC~Aq+#B)Hpl(XqgVu8!*FbF6S)N{?n|LUTWWBB%=li(4TXto}awN?X* zkREl3xIL+L|kr|p!$Ia=^;>{o7u zug^O?%UBB{+z zfCZOeyt&JPZKNq@(zHb1N#3)TO`E+2Fgl^wa%CXue!>z6`cPZz#vf#^9%lG^{!5=< zuFfn7y8W@3km$RBATlhc2ss9cy+qisB~`nEh$Ok@+e%NKGWvVi2JqM-Fp7*PvKU+f zwWnje*EhyWT7?ZNlHA;YPA_>gHXT#;^k@0l347PXgJW-lGdcJ;^dZ7t+tj}`-|0u{ zx5hXjad-;UekaI{Wf?pZNmB`JyGmdf{?c)s?B%!&qtBjnm+lln|4HB6_Wh)9exY>o zslY}iJIVx-DpnAZLV5z=1g3cSeTu=5idZAIGf4^}F+J?eos#~sHPB7%LI&>)6%~F0 zr<*e7m;iHKXheWSp0M35&IuvHJg|Nk8UlR*9EvXCzo>$a4;V>YXBZR|@68mbjNi#H zG^nqfz<2DWae@S3hm5GgET6|GOgNNVH!R{E(yeyqXCMX?7wC_KA&c+12!D73@kCVG zeL@iA4C~9+!Yv(SDM>#0Z@nG;zubZKq93Q z8ahwS%N?W$)mu=00uHK8_Y)tu3^1a*wZg6yL}?y+;G)0%q*_s>Oti)B7pamFwzDcD z?S%%+)}ny0ZUX~@*wi$9K@9W7msbe%)EFbY!1^Ht z#-Opd?9*9=jQ@HQH75_hz>q^i$SoLs^7{!-?E#!l@-O_L%8$I5S7*~G;&&lA@Zaqlpals32OyVft2C|hw*Npl-nqi8tlBx=iY#F6s z5eNhHzMc0p2ygF@s{WgIa#U77bJ4O)N4j>ZuGoipB-YD6owMDmDB!&aBD&)|cuUih zOv4$4@(6bmxZRbJS^|SL^y(7T>%Izfjp&DsH2;+o6@+jwLG2z*>t7eJTG(@=1(!UN zfW*8pCX^)o?e38ltId(0sMe6@$x&D(`H}7SLusy_#}m;S%R^|MWR}j@Hk1 zPt_pcM%6F`(4$po z$yyhL*h{QVl%+%MT4Q+CWJ6Ox-hhZn1jVhby0Ub_iNUpHpBhRlhod#qE96KltCKUh zGkVA&F!@S3S_xL-S2^4JwkK#AQZBmGh+61!p32qap8b10qNo+ifgCisVRVgcW#CCGl*kk=*)*ip-)1}6 zRNW$|U061h9v^$5gRJACi~TS*F^bx|S7Q+9WkBoRu<`GGg1P1xtn10%lZm+gLR${@Q_y z$Km7pjTMUgLS``u)5pbEzGF35nj5q0pYxim| zFjSqn22_!2y=EV(4O8F);fL3W;WleQ6?(08Sq?6$Y&)t2yU(k}UXCz161O?TO5#>&IR?V2}5T zv0PFq%Qstr2OWPWVv0@VQqGc}wnDCXsdi|PbZ#l=GG2WRT-sEYyr4ksqNO0?O2}=P zihw;{b-gF5$}?HSN~c+HIKCzcBCyY=!S0T`I;+peA%d~_C4wmQU=A;399tT>7R6G_ zyX}Td+8(<7Il4pq-Yj>hYIYSS2JF;2z1+&1RF)C0FpIYiGi78J3Uigj1twm6Lpn== zhW@gWoZ9aG{MFFXKW~vO}&yBp$h2 zLkvYLxWfRv^Fhrqt(%VEzb5D5_@C~NkKnZ%GP&6nYwq|l9~FQIx~G=7R!>*$v)Rs=-scLV{HpAJNSlMpkju8(d^Wm)S3q;J>6$rWl=4v8soy)@}tNhGN--gDsRlC6yFNDPg6YMmb}K)jvI_jz}V0E93q zeh7n+hwrOsg^Qj26!5cH>aF}YvUbSL@y8{KtX|Kl#yArJfn;K`MlMktxq5`vERcI~ zilC@3f%r#a-aOPiMw?)3gmU2?MQG9B>!6lpRJ!*MP_z5#XB=ppm zK~sajQ$^~4M)%TYNWTKjlc37{XA;Ah{!sf~KSo?5T_kY7k7XVr%(M8X_ag5~sCR#e zGiVio^ixL=b%n5}OVF+qVWRrbN?-h9qOZq~hG5C@rookxlU+ES{QZN-6PQd2Xppw3 zdjn3G)F&3fE+DS%PW9>KhaX16;rwYLUAV84Kmu*U=aC13P-l(>?h+=SW$*|gNn#{V zG9-8%pBZ@U$aS*njlCO$IO0^}9&^X8@tL>>J86LxIkT}P9^?=qk|dl`*E8V86NDW* zEE2C}&v_MbGT$%iowcfeWjRg29RJESWMuUYt@vH0qlqs!nrsqkGZcO^AG0I{_7{0R2#aS3gY+^%e2!E+!_5fyketdoh z(uHX4Dl?Rv!TMRRN3tKyJ*eJ9S!Ab;8{42aqJJPfJWC^4VN+Jon1SHA8?1JKJu>-L zamt-??Mf^-CE}AU8a-Rq=3~u8>DePq$$-Xf47fFgQinye>cogsC2t(kVOS%J1}!Mh za#hK(HHGKE6GVl(;BH(D$v01aW>@sqwpo<268c=dq$>U1*VHvG(fDN1iHI;pB)N3P zIpjnU{MSx&667!dXHYvBU`_tzFy z1lV-S{>z{_Cmn&Zf>2Z*tSqdX{xLZh4O73{P?P`HwQu@uE@4H$e4#wVQF~fAi-p8m zq+>@a!-04b2$sF;5J`p@L-UX+p*02*k(>zUWQU9`%61MIVDa0hs~K%qrZrvZGRols zmq8yCpzW`%7d_9!0SA;-4&MiX@E}GTH7A}RB~5N|hd#Nd#^TcDA^~Gn??!!hU)&tD zj);0llD4t^xJXv za9xAEHekEIWbL0jdWER-Y+tTJzC#&5+=P7D9(E>XcVynR1ZQR5^>{C-eg|t|riI_p zgrF82b!4kP_1!#zC1$PzOe=3;1Wb7xZKRrvpS-WaJqaIHKL>I#FR=%A5N!5~s=02+ zpOx1_yjB0{XR@`E#?R>7(gobP(XA^XY@h1?da_1CS?Yw6mTv)FOrq%YSZ1fmy{sV3Ke|fYfgZCo|I(YyuimQ12^wYr{5$o*!EUayTr9DkKzZ7n6l1ersF5o@ zp>ay#J`MEP?aZ^Uy(sStJ_|KvV3>A*@+e|Fc)|PAgLrPNcW&bal$BHA?uBx=!5?P+?Q8wgIai5hQF*01zglKmz2AeWRg548!^qVu#CuF*hwUf@FCBtS z*$Ti!e~_X}|I9A$*EJr}ABa8uD+*YQ^7?7{sBf|xM<~HhD4;i~D^v)c2MYG-`Q+`1 zo&F&|c)JTctQ#u=%$%RX52Y_1A>a`)mLO3VYt7;q=Se+lB7;AS!XPbs98ts}75_Lo z-|6>iQy{N-kvK>{!he%!CHW2&{~Eh!E}b2Y0`)x^Gb4daDKhEdWBvQjy~H0wUwOn| zI7Bh!zsqDa{fff{GN*%P)fK4=pz^g1)yu|Y(y1n8BAkPlv^@%ul)S{Bp0>3a+T;Uk zRiKJk!hj=c>wJ_Qd#E2W^V4lmm6-uyK=qf0Fyh$!{7EgdM5QPcHF zXWj>=L_WE3whSo^jwh0;!mAo0KN|CF8arDi9?=qMxNk}4oUfUzd+_5Bv8YHG75_rD zsE5-fFxTC!O~sA`WhkYG2Kz0-;ZSXBi>T!pyw&^50IoT-y*wuR&QG}Myu*$gGnei= zoClUW3MXfgZarkPDMro)j}7Wfht0zHa->57XPG!}St$4=6I_dXFu9(G%1X7<++j1a z>&g*FL+rXen=By~0&M{zl&Eu%ue^^_jz!OZ6xKyVw=DxANQEUNgab~@PM?Q31tu^n zUBY&dMZZwL=q>u1+kObM(~?Dg!Q8;cjKa9e28u18_}7SIS~U}Uvf}8MDTYjDk;1_Qlk`f9;F*pduwRCUNSJcyEm*pKB2K-gnSi|k=R91@5FCnIx zIvdroXfjwBu3FkXXsz37kY5j)m($VMD@Gf8fU2e1Z0$1@Z|31R(1m6`4U%fOY99I* zX}XLOC*1z58`6WYCZx-MCL7Vyl_Y853LqGL>b6qvdvUZ{w6umHb{L2o_4Siy>8|hf z?K(rd3ZN5o9K)=*$M@ql>KR^HNQJik-lU@8>CAk2eb=sj(1@{ZPa)PAG>%C{{E%V$ zR;gWBWkwjZ?;xfN>06^K0AhCRhzCOT#RC!!Ea?A^-AdS7jtZCiSz0e9=x+@DnRbPb)y*Z{&ZsHH)rpX*2>v$9pJJK z)(a<&i+T7?%%MX%oYhi) zffLLJmuJ3%dYVOAKA-J*yovb_-vi%95zk`mw)1Var8x`vgi|n6RGa}@u}>@8mwSMF zLW<_KTPqW^MLUQ0EjyH#cfBr@7OCsC`;?u%<%_F@4xVSKzir?D%F~z8HtT2oty|(b}(xGUjXet0YU7xi~j-8CcA#tHkbOPFZgp3}7?GeID^q-2l6HgVL-K~Qr*<`pV}S3MZw_f)1LRAb13h&~QA?Exhy zsxh<${UR6EUolNh^lWH?w8M2_ix?|u#ukG&5@*2aw+{B|>EI}1E7VJitHDvUYYPlK zFn~|^sCZ`}vcJ7QvYhTzh7}9)8PWPU5};T}Z-~9E)nY(xkyNGLNS~jxk(gED)ApGX8~D?^j%-=4pf=4!PEC{{EBrahbM1`#Dex zp0Y4e#FFg!X!$imMrUIR!!ehkx;5w|$`tI=NoW^og=Lb|lVFq-@j((OxM8neXlHwa z0YPToua>Ti4B86254V6G`1)%A2oDhgfbn@)RBCbJX(&<>D|wOYH9#>n{zKyE1&2@C z3(O@F^^jGQSk0|A!jg7baj7))U0xngqMi+A>5IO&+sqCra40>pDz1m-rAP}! z^mu=4+Knay@%hM^^l{}pFE_U^oVchFxVpQM-v?~yc62KIDecv1Gi!!nA!VF|XxyJB zDSC9mGBuI`>0!=!{{^C;&n|U!Fm(C!4}K^kPG$iK)`IH%hP+BwNasCkrsk!Ff<6oW zOhSe-0mE_%M2mXJ?L7@1?YKGFp=_SgXiOL%&5lcK4?8HHwq9>%+|+T-Qt|fS0&0aS zV@!;h(9`>@b(_qY)eaw|X4osoJ6CrfEDFtnY~sQ8svGr^>*m^m59ST z!>=XIG~@7GhVYw^kry4SzU&0^Zc{?G`6PFjdSU#4a)*1Gn~?8bRwDKi$S2KW7RWYJ zr0=Sw-m@$)T8jX;Dj;Jh)Q!~;02Qko(kwsm@wnConPJ&N6vx>=sgR>in_0^7WUAj+bGW7Z$?v3|FS)Fqmbw3QY=9zH(@q_tYa*d ziWO5d;IIp%t|(_fe0<6=QKvepSf^8ANVHiX)$3{!gr{|CPo>^Aj)P*kIm(h~+ypf( z9TVDOFnuaDHJ(VuGC`S%DGW0DxVABs_-i$@X;u_L-Qv{Y2Lm+)@WRRh7drM6VHMnZ zkth;xHb-=Ti?L7c4hM6uFJKmEnnBPe>=%F%z1;7XrutTj&dT0NHhI*r%IaIf_qpv{ z=v%L^mFi3k&m~h4V+h=Q7^6jLqEw{r(lLkc*0|5UOOa+Th{|g_jFEswr@x}SQV(=KDL;v z9mienws*Uuwq1%;Xupqd?K52d#%zAipJ7YnPMkJl3r6XA&k(%wdTVVdJD4v16Pjb) zacjt?%U%2Psrq*~f{tGG?{WARw*&lrQ2vRvR~!=qT{`waWJVLG=|t%4#U=nI`1lqJ zhiwydaUGYxY@DAz2Ym{4b=FHcX3^a%Z%E?Bz>2M^7Rqn61fx;4$$Xra%D`s{bEgl_KkcNSG(FKf^Aq^p^||9!|58?MbZ4TF^qu!tElF)QPHv5WFbyr7B?Kx6! z;D(zEH9NO~8(WMo>Vcbo8NvxY0t3PyLHkFx{=J~N|9qqM-wK+Oi=mT|qlNu{SSPIU z|4W&`KWAdqTR*lC!=<)SrsKD|R^!i^*uQL{wuu5kS)t}Xw(wDMOfswaY{xaY zc_PQ0T5@vTA7^M|2x8DDRIP+`7i`Q(6Rq%}Q>{r?>L2$;AhtMcZuQkrd&qtq^Y=%} zPC}(A?l?8b_3l>jt>xnhVFUS)gxU`p~Oy;4Omk{d2l|W3! zgmM8FqG%Pzfz!#Q0#^u3#61WU#%zzvuBPO{T1I%Pa%{9fuI>bhCB9~Kq=IQX6O8y0^o9^rPCAw^Qbk783vrIWbvU1 z`bkkY47vChK9r)l4SDImoFD~E`jmm1A*~gw$T=v?a?GT(h&-I7K@H>d`<5Kw78JDT z7xF5d5j!?FJgXCX8X7qt%}K>&ews}p$)&s4Ad-ksPhRvFSC zkf3>)dYvzA`e-I{3!w0o{{Z1)$Ot{`Q)wv<^qRN2QkkdMUc;=M!*B`P?~uD%qNv~x z#A?o<>^q(}X%Fbu@c>c@bdoz*LT5HRplXRJwQG_lBS4|aZQHhOJ1cdvzV43Lea^q5JNCaL&eghDH)~zZ@s2s>cv2UOo{MKOrNM(2 zrUb||R++2^#Ta4^>17Ss;uS{tIm1XqWN-1%;)w!W*`R*?hKcP)VOuQl;FLzbj=B4@ zUNotdLpmK(v`Fe26|!XieGvu+#E?M=Vo&iKFsKkxUYv`rfJ?X7SR-R>WCakAM00M6 zs1r!LI}dDq#i8fE6l&EWm(D`d2ve3}A6PGnciN7XUk~XbS#97e_KOlnvd0PW_t(-zpVk*Y_ zr-66VW||@`p=Js8TMx!IJq8oHUdk->f#S8DLzs3xbRw`rlqYNU;D;6UkkN7)n6joI z!z8as=WBKQ@N1b3aocT`tT}UmG>d|lE9@hQ$%g|0xBE84duaHmimgyb38|y)LNXmq z93;5z_9^achnT1fvf28cR<1N9R&zP!hK+LlQ_1eI z>G2WJ$8W}4>WolIF&mqy58mkCgV$dUIhPweHWt<&M#0RnF6%P9b*Wd-RoHpg1)m&C z10OPOoUVPpHoc_k_ zk^Z9GZGHW&)joQzm(vP_pZuZ`6p*Vh)4E27J z97fmRu=3bkt1MWoe%2gTUE%ly{cCoDlW@*4e$TeQ6YO8lwl--10L6cIwmH~Z8UGio zPR;L`#)kCyH%+DXH%(=G4aWv?zG1v>)!ehmViw*1m$QmyZAlqPAx`>;_O@*s^7s1L zCDVC+AlaWK>4l-+REG_IKQnGyy|89}yK-A=QRy@0AkukZsWVSu+5{cj?1LlI&^*7zut*Z72Bz54iO zIf}AzSJ+**$TK3B(ckS_yOPZ}wu-U_qG) zLB54NtuJrSzVs4Z;_3m4Mq|YXA&`)aUU&UFo||t0{RE1K{X8b`x>W=oJ(MYQ{HV~Q zMwiG+Y5_y{V$>>$y-Bp8cPUfHQf9FCEO?_wRG2+!RQ0zP<5koTe80h1}@estk`VwK`J(jchkUYMBP zV?yQPeso~-Y(NWOxt2>4%#6&ip!2Iwe&Q* zyD)WMPH+>_$Y%iN9T}SG2rYWWLZCe`#yxvo6?%^YXuyZ$XxT5+5YYlccZlkb5=bbq zhR^+R?^7n9m<6gT5s~UJSMVhWP(idu_tbNe^rCzYA-}s-a?C`m3W<6@>#%uMzDhxA z*D1mBqWl@lyvUTH)F*mi0W8rfh}iV?wu~swp5<3ar?b6ViVSExeFhgD?Q7&2ktbEr z;nanIYhbj`0Wlr9akXmHB3Yy_j_Gsq zF(2t}dSeS})oKl%R#!1sH0ZFf^uVI|P!L)uA2W-3hWTaH#wys;7@36W2V}`xG+Tkv z?Qm5+@v{!y-r8q&IG>;$L78R#vUM1hS_)!Y3BDYA@XK3g+L z*g+$j5gGisuxT?7Os!K>*(;5tc;;KBC7fA9gj)OIrYvrab5+BKopOj@aEUnVzogaI zRox-w95(FXOCH*<4~Qyx5_Ht059{CUEkmI;VU8iS>lYemRszzw%O@;3q{`NYp<_jV z1W?of*M*65^K+$5*2WBG5fzOvP>de%E2YlzNZXwxs^dBNB2Yb|(wQ4TQ8Mctb{qoB z-!^ucyd5DR@~ZfBhM`&yKO;`LkB1*KEE$r@cRVj2^tLU5Xv=ku^LI`(v-J^!w7tDR zS3fc9(Q_v2YL!0TkugB=NwBgQYGVF9%K4I66HN!a_ZAHJYyiquFfMg^U7~mM#l*~n z)X-o^T`N#gy$Q4Iqt#5>SL#qX%tPXr5K^z1!VQP!ZN>(TT7Dp$s4i=sySIY$LGU|y zNvgsw{Q)P`L7)kO)1r!3qxRK0(Q}#5WzPeGg9X`nKHleWP z>-)K9F8CaT(D@NmaF~-$QB*IR{8$h2gAi8;Y#RzYT~u;$flPrXw&Vgh3!+nr?N;vD zCaWzPRjvK!vVf*G^ZfGar4CFjl1kIjT{JYT&h}H0WoXI$16duI+Xa)VoppYJ!qT5< z75H@ZQ~?QB^0mE8RLedZg4VYW5=|mRxYp4jdOz8nEf~ho3uM62%`QiZWL%RM!1id6 z8|+sdN^Jc&nFoc(v#$EHGG?q=6}N6lTM~IdqU0RBd9v!1w3jIz57TWr7byq>OnW#- zNaVO@qU$KHS8p(b?2t)fvxYj`Fn<0By}xnjdrly#1K``#=p7#VLFpjVC4Mk$-MOTa5rod-&o_V?AWC}xN+B=Rk2~V z4SqS1dX*EYt{IasHsETs(o6PA_T^v~Gsi05>sK0X(t|a=5tOI z#FR9MXLP$68v03WU!O0ySg57vgO`k#5HMjp{kCIboCV0WdIl zd1W*K?@h1J?enT~%1um@n;3r#%dXGvrc`eQ1Q{hM^e!K_l67Z6V)Qsr5ZQD&OI=n1nuH@ z>yv+pJc)Eg;|_jHa(_*$nG>hnyGmcDT$Y9WgqV?vl_Euneu3f+Z;mQ{NxYKS3eul@ zo!YzF99X35X3OhJzR9+Q&Dd^XeLaDDHzhTPeQaws(}S5VOxl7SI4GQbvQ4pcwSDm} ziL4xr5y8;y;2pJHHn|ROAE{&-er7B%NPO+?>cl3#gu8)V&>r?OR8WC?%W{HsEhl&W z1auIt>$f1>x7-OhYok2=Dm|UW?t7FIy7%6qm3+UP_bgZVMM+O?6q+7>wwlMe%sjMz zU>HL|D+T5rgSb)}$9)24VXQ8m7^aGe=&pC1^*SaFp-Cu? z3kLE1pFH`nxV)_f1OUKaf%C7W&(rres{gL^akRB^{x3f1|H>a0gun9VpC|p_=9lj$ zeTDNnfTm`{(En_Hsrn~M{!jCZM-dgVL?Bx@H87}E{6EDn&wP`B4(XzSgAl?FpAXG4 zCF_?i2wugK-*hXRTa=68jMoK7=j2}jWRz)5lD3j z2nzY~WNYwF0-z{np`%hVCx(|4#_X7IBr5fbnO2fuxsM|7E0AS?QhQkOzoDRTl?6)N z0o1b*AV`#*WCPH524S&QL2zHYNY#D z(jA)wVi;qM2EzC8+MqB~A*Mm@3B@yCTuTzUj)|TR9%;uCfl;ae7XY|L*>2{3@(NC< z;QP@P@FZIv%wrCFW#JN@EDJSevO|dsKa%H~1XhkNFC^^8buGYiWW}5t;?Iy8W9k(l z>`gpFhH`VWyrs6(@y@OISzd3+k`g8p01X=4fc8z#ljNpdbhk@RG*VGB4CoW|y!A{sKw#3taw13a>@10@!s_y@$Ym zOQz)K9D%Ao7_Z%dB(`+=7W`;NR`59pxVbBYa?K;l$P(>7d8`g|~ zNG4x_A4^ffJrBWmru&t`*eKFcfu`2(^8E8sX|QTb2wpDVmeg zB0Fx%ioSn$(-Z(Pp_m+1ZJ5a97+>8Vlfi-ELFZYrm?`1~_X-{6vy2*(SKY+V0raA| zOLEgcJ3~#<9$M`4$UJY02;R{K0_filbJV`Oa0RO5oF0ypyn6p^ND{qpvquOGKYGZ)o}vqdNQy z=#ze_5@VV)@$QW+u}AI3Z`9O6XO*+aGT($oTz@{MX7dKb?~a#+A*UY+kjGKaEc>N> z4`6V8fDu4QN6dRFktR-)!=4E+=wd88XD1e;-5@qA6wp`+Pe$i)t z0FvsI*+7#4$I##xE@Y0+sc4m%2iEzSMHk&mkaQ8$J90gkIgw`)M;N+xMJzO=14s+> zUyJAM|6sq#Bb8q1Dv?c`y|YzweBx-+i04YGg=e!u4ZAmcy&9#oT4XP0PWpRk>;G1G zU4J(45e%J3z)^t$Si;XTV5JD=E3N#E(Qt-q?wJK}+iFi7ho3)yCg|Kf?7AHc#pUp$x|buxfGBQT{w@n=!KRIZ24rA8t%;J(pq+p zqoDf;DrE`*oJX5D=V*lX3!43KPU8a7$v!YA=2abdpEPQ7tk`I~18Uaj^SKVvmJa{r z^Z`D6j_kZL1+#2yc4cEBGpwBh<*uR40JX+Q`1z+Ee4!O3grUC`JHkt{2y{9_Zr8G* zk$Dy6cPG^>mcrWHw02=m5l{>AojY{fLPFB8w1ShzB^7pSm3wp00X{;)J8$~-rR6~4 zp0DY47T|BJE^RM(IhdVng@Q7@?c?&n_J&eFaYlv3k))>Tjr{71!Sf+c8%E}bD(~YK z*~03wmo@a*=eNCD4vNe5;gl6#F@qdZ%QvXGjs?xNZt1mZ26O;G0h(`^XX6@b!K0K2gU(*QY9WUd-dxXn#n%f3^ zzIYCi#ru4l`oov$c}Ct`gCaiq{F2@xA$OtL#}V#VGeVAC?CjqAsxCprQ6O}}Tat5Mtz(*R-I zK+@k^b8IK?DX^0&fRGC%J}?&b9Io~ zV-LfMw}p&;e;?T;cKL+VD_9)bwC3@ z{u8QFei;1iZU`cT6 zP$cES78DC0ldD=!p~7(;5lHQ=<}z6Qyg`l=4}Qc=Zw;6v}>}M2%|?k+y6X zw0_DI`I;4>?L8{X7#+hUGL19kA^S?_=L^pi-BP*(2v9gq zW|o6Jm})9q9rAZ8(>C_dSZ5%V47wkweS5+(v-zZeI(Z)p%@+t-m*;U&R{lJ=s@-Ba z^~vO((RsVZb|hVJUO6j1e}E;pE1+^GM**7QZcIS-C@a)^mp=3G@Q0&8uYipAa$pzG zRd*xqgN-)o1ct1g6Me^u?g+oAdYkR=jH;JO9DXxX&?nq_p3QeVlCMc!)>OO8oPZ;b z@)RA{`HEIEKAm%I@uz|s2rS-q=zW?tM6a+XyA4K)s~&^}WBAI?nJ@!EkfUq1hlL%T z=emJc2@cV6Q$y9PL&<&(b^_hJP+~{YA=-2ZIs|ynncr^b^>IqX6gs$ugg>H=g-HxP zOZqV(q~@gh7gD5>t7BcBND`SNf1pc_PiUKx|6JhKGC@>9SQU3feHc{flgR(6z1k|{*oL= z@kShlSREYC1B+n;JufC1+7FJ8;~X#MipKmGnJ+!r%t(0$Rjq-#j8D^4umFB~vh$^1I4zt&Mw zPWJBmF#GI)-?Bof+?+Xr(@u3UuR9Xqv8J{~AkbVxW7fsAU@1d`&XDG>kIzJ7q&C4t zW0XXX4VHpVZ}*e>eWP1rozB3UKbtz2u|(mNX3|h`iF_q;fBX?>qTTVtpRxX^y>{$f zy1MYY@+3On2zq1h=zM6h&7-!X71MU<)ZBj_=vd#s-s@RyuVJ9|$6k_MciY0f8<4QD z{sQ%<=?KlQSv)Tohy2a@g$s3?N1$k)ez?ZpB5zmXmdrkVmFC~S{mBZWd9&wOCM(s& zV(vIZ$J*HzgG}=xMX-L_a(^bo*^s}1Jd6cpA)%CbRxtjgOmd{I)OfbCu5^kLr;`$O`#Uz zl`p75d9JR&c(}jLFgqg!i<;Rc9;=qQzkIl}0O<>cw75wyHZ^^7yR<`~e7X(WnqUrp zO%5fU_8Vl_KKt%&E4GT~z$rAIO(Dq*4a1#~^zPD#40{GF&; zFR;{|Q98vGW099ScgMhhg2Kn#2>pcIDNhY(m`g2n!A&{^=$fu6SUS+mN(>tYfuCwt zE95LEh4mYHt-JOcH>`hGMVLc?j8)%$$zK8WuccLy;(x>8m4TJ5!MCn*GIw(SFKmpo zzAcj`w0|~6WJc&!o$Z%Efpo`P4UcU=e?61$bo}48+|99k2?goS{I3t(1P}a2gW<|V zl5Cg;MCm)6J9b(wc)*YAaq;7xkvj^<~Y0b1_zJS(Hq=b5|g zjE9rDO)bjPeERNq9;f$`&$Uo-4*unMM8{(Dsifsg-E0hBHq~BRfs%Al=AU;JiS;dlUm5YlQ;2YT=|Bx_drz?3w+K+l3A01{oCVVP+@{Qv zp!QB(s#CqE#aa_}eUdoYg-5~oqGz8WhWWQ%0Iiy20D{~xf(-)m?WX9~4-DL1=oP7t zvV&&t3lQY6do}8Zy@-#+Uxd78&mZ3*9Aj`rop_=_!;&%Rv4n$qOL?-sVqXk)D4g^h zX?3QGtDKNx9)#Qgz;n&a@j?e8a$$a)ni5@u!b@OiGj!mZJ8~D**!qhB_z;kqr(5Eb zutl&CG9NLkUsy(XHEM|Sq3K1_!37^bvWKGyDhV*S^BX2y%KG$yGTiQoJ*95m89vBL zki7*O#4XU*i6lomhy#X0u=V4_J%OXtl^Q5JhX7J$+EI6Mn{=m)2G3am3=UxatB0PDX?#_-vVMtp~nMxKnYG#1lWhU zV4K-%XuhsVbp^FAM;%|#WYpbVq?VB;(1Gmh+UNmD@xeZe-jrxuj@d2SqABd&5YY}= zChTBRMsc^m#^GzRyYS`1cV)Zop4d5VsobSccp4Qz zA*E?ljaFiY?ILveHi?fU(U1LchL!;42IglIF_-!-MW&D>MDP{Ps{wl~%N3pizRF~p zPAPIeV&^0{2H}oNurvT$VqHDb&y{-dlbwZDkVDPLzgJS3-8E2r$&Uiy#!+HadSpI5 z%7nP5J6#?!LNIkHtY~`hVrLeef~q?cFTA(~kC~gmBkc~=B3NiTlhnK+ZqtZY3oglY zY6ZR-Pdww7uNX>AuHO^Iec8i;J}u7S`PBujUS+3uLhn~*m~MEWBBeeugK)?$k#$(P z(ny8b7iArFaocpE!9RpQp;3itVQHzdl@~Dg=9k_KL8y?$QsSRCG4`wE1gEr6tF}5F z_az=+VVntYQ|GBj#>tnPV|t||W424YUWGjJHol<++?q2WtM&kexMp9LWF#jG-yvJZ z_t#YMRLvxfODJURrXjwSt9T&^m=>xwibKIw8b)yqI61Hs1z2rp&ultCI%&3_Rq@D- zog|`>x}HI!Rqdg9*5RWCxjDQok8DM&wWy4+++kd;u##+U9);JrWvxv183n~~0(UF! zSK=R4-~zuw)mjY&?qxA=U3of_fNR&$mLFN3$^=~`nZ*;l9t16mMyyl7wo2`_%TTZz zlGf-8y7~n)L!1;Zvc&_U~7mTyIeTDK{vMj2VHh^_E)6|nLNLyVq(%cURTeY-XG9je^-o*y(1!B zO&TNZau^KQM=GEh@q)=7J=f%Sf{8J^*>uMoy5NsDtJKMl3<`@gW($&kE;$fA zvQr$jtw*f4LVkJt@qm`3bFp?@`EYji_XY5DcHgnPNO665%AQ}}1awX%qv?hlKGcr(kW_fx925W+!SDkCBmMuDef&!;;Q(A_VY+iqB(%eY*Ss-^BUt4bo%|_=Xgy{ zY|0JGkIo;jA590%V;+as`JPMVt5#Wb$WKcPvKz;dU`RtCW2-Xj8domu$_XGA4|gTS zN^|Z4F<#zP`DFJR&hxRM)$89F!HK~jyOPmQMQ}T#l6L)`MQGNp z^`^KiS*!R7bJ#RuS-Nbx^Vz0rVp>w92ECrw$YuGwkb%xxyri(=QaPC3l`~bLz`&F; z$nWat(QPAhuf?j=A#@b1kJ&BAm>m)v2oGI?ZBk{|p<2}*`E>>Kw65J_gVMS5#o!$0 zYBZq<>D*1@3%|RyE#1)LRP7W0DN}p>{`z$N^Ov;yJnihp5LT48ZF_7-_8ko{PM?vs zz{ytQ>D83R^;AaS8O;aBoPCGA&Q*14b9pMqfp2mL?bKa06uzW(YZ zY=@S#zX-9vs_0+qCEMu#hC2u=TL*Jnr+=5cYHd3&hA_N+tXQFePfAAAvnlS1_`3?+ zpMXt+|H?@rSZjEd2yEEWWtp0Nz_oi-n|B!QNZ{vO3~}70cgDx{gxm9T{wgWWFOOa? zJ_2^n8_V*>=H_JryJ++qmG@p89%5V3@088Wfw5#Nm+5~buLk@}^6JJnc~utY|3F@a z|5xPIhri_2HzK{9OhC+!yPJ6WJGMf93j%?&1jjMZ28_7j&d|08@<16ac0c!tm1|)^ zr(krZ+>LlA36gR^`M;=vt5IR5(^jihbo41Nnbsz{R&e6eOfc@!Vq>dGHch1UY+;7I zg{JUk7|hgxbciF-gtepA#fWXkjLC!7X$z7!A}#+?KzFH3y$r5*5X&YQ{-E$t@4@lG=>)034l zUwIDYS|>?PTsmP$#oHgnZvX0fJaR@0wJ~L5}}E=VoOW(#tTg8dB8Lss?*+xn2Fmg# zzHbhx7HR|36fhEm9V=EA$#8+8pDJ@Cm7Bq&jpxN`Emd*3<`+@89Cc$=F%d?LyU_d+ zI5_wYJkF8jz_~SAdAQVIJV$UIo|zslT@q$JYl#K>JVoFPVCtlYpRvAAE6QDgP8Fbf z1iLwZRMstlsd$NK2wTCfmuy%^%veC zEg4b&pd^JGTkp=y|08(S;(rIPKL4lSRiOV2yz22U!K>>30lfPAzX`nR`2Pm4T6}|7 zJ8Az<;8p1V9lRRwzrd@T$p0I7)$>0AufCl@>`$uv4lQ$|U(~mfi2|ocMOQlFjlOIl zLSxjSA6lM}3Rzm*CdJ;oV^uo;XxS`?p59SMU)BD#I51JlVOkq_={gmUG!6M1P1^ zqf?=Tv2NGVJ+@cvJP|lCyR*a@aUYDtY_?0>*^AJx7IHUi7Ed{>${^`MNU-W24EWdlV8B)3!5plyx*m z4H~)!mFX4Psc-8i(>&1(z%EYd~Nnrb_J{EKB40?Rghil~jH-spKf~ zozHvL0(MN*LQmyAxtUnW)|L%6Q{!gznOjvb=M(%t2e0zN|0m$psh^MkfLE*WRlX$A z9CR0TE>=$-|NqCXR>%IuuCkw8)&1XMS5^K4b`_m`GxC37SCRg|*wt$Izt~mwq^r6A zTkNXJf55Jy|ASq{{2$m=;(vu*ef$Tz3fI&w^?!|BwfGO%Rf2I&9?WhopL;la9S{7e zcBD*jnj;#7BW4c9VU1lx_ve_A(T~SGu6-_6@B{5^Zg%bry$%aOI(%jsv9KE#US9k@ z!5~%SEr^@%u5=OM0aw`D%_oOV3pZ6#_`lHAu&XPAHcoaNUTy)qR2_(`DzJ^-y04Jo z1Ce1PYE;}v*K4)R4PC+}#V*Id(oN&^M8yKchVnY#MEQB6pb?vAM`Qv{A(zG3=m8r^ zgAySjy=9aY>++?`Bj?34yedJh(3UHiy|#VV7uKsfX!Fg*nKlUDko?_Ow!WOamC<`U z2jA!lnl^D>L3{P3g9bC9Gm42Gp#?fb{F3#Lj-X69c5P!j!s2zLdEpmElu7c<6oXA0 zF;#N7zs%K$lZlIgE7`qz?4!1lkPdcn!qM*qJA zTm5#I2%6D8r>bj^lz}PHJUnfSD3#`ZT@|m3J-Zapw3VRRjlD@TKtKiD+EH_^=O8yWhG;B`Y%J^JB<*n9&SXe{Gs&W@a)Wc!4Rtq(hh!F{z>M$Qfb_8DA zYl;5^W$*#{DlhW7`y*84&Rf8MJ&4pO=n7(=EjI)%K1nOAgFpWG*v%%w^~K|Y!0UNMkbqf;NkK})$McBPsoZ?qRgnGlF)WLkP?l(6AUlK( zaoLU``|L6K!lI9_(NV0-g2k0+NOAOP1W|&!Z_+aP_SmR)557h8;>)DGyBO(e_C)KE zCa?5sZ=g|=DqG@XCu*G$sRBiQLLfN&WD6hc;Gz$YuD=t^B{3Ri%T<3~)Bn0rsXn+# z7gMXiEss`1MKd=7?f}su2T0;YqQl*bbYn7RDt3(V!Gx)*Lr4h$;lAZU`oWZ2#@k}R zgIWT0s68ljitdq;oAC~JhrBS#0n0y zJs`n`DNXnUB?=rU3!8wRb^f?v<`!#dj)=*HUC;y7!lny*gdO6YIkKzZW(831gKA;* z^#@UFG^B!`nYVr;p$W9(&9C0oJ%<{P&;7e#P`s1->TOp@o9UZ}#|$m=o`F44%|odlwj#r4mF4AnCtr&v3>S+5g z^Bh+>ud`_x@&QO#n}+F=0Dq3=M_<{2D5p_raOB~^d``M4#iMg{DRS?yqtCyAm zhM;jgrdajcLFn+P5gi23k7bMxB{sQ(Bky8N8s1@!39EPaJUpXN=ps~8$Q*e0cP5_A z);&pQ74rzl%&Z@Bgl_>%S#<<~x0E;|wzyx%u{# zG9erZ%`zs*i+}HuX)3TO_BpLJ2vA)AfO`AdH_Hz2z3YyX6gyk!m^|(fepW;(2T1y` zJ-6@VCMSK>3XP}ILlwU5T{lq^6Mer+J?{`5(rtjX@GCZDjxI)Oo~_?IWlYHlmSa3yKZ(q`nJy2B8MB$>K zGheAT?po9KsbNs(*U^cCy{T*U7IsCg^SY>c{#=N@to)YrS{aJ=(%_o#m_||)hUbk# z;d5%Y1*$QwRK{V#E>IuiB$>ie!5IfeX=Gatnw&e1j(#&xtf|hZ`ATf2+v2Zd$nfPv z2xb)%qD1aJ!B3lU7ylD7LFd=8bY()#1*jq0R-gyx{!x``Iv}y(W!x zOIgb7dU(sMd?5UiIg13M?2nR(8FW49e2w_K|1CMhsl z{jvUPR!V>NFbc)JFNZY!=i-?~y` z$DQv`PhQaWPKz9Lb*Amk0&Tz1@4xb+m8*=pDUI5q?#aemK%77zOJiz|d&cKvyGFiX zM-IwCB|n2TS_)o=h3{V-^l{b2dyhs;p>>5 zO&XVfR8X-=zfl%t^tOl3Se>&PVe!A^j);m;ikBhm$y8+@jwYA&cfYF%nXX5rxLkEz zPLwS4-{RU)qo-fxTJnNxYvml#{&YSBKlT!w8a=$O43*}fKE!t*Y&6o6ipgZL8UwAft)+>8Kdc&X`odE~p-p zYU&^xz-uQTz>`NgQVduhwv&Qz(3yU5_J_GxvD1YwDj0!N<* zj)F|Vq^loJ9T;%upOWGTatj5uC&82Z_cw#pdzvZdGHQk5N8)F%1M?{sW6blKX}cxl zz5FULSM(sW$JWq=jUPHVFT29dLKn{u0_-Zpn#!iN&mWGC?rs0|wXm8eOM$)%82?JKe=X9)zvY|BzZ+608);CyA89*du36i%T5yEr zcEz+@6pXj~6QAjBpd{OZz{?^L``g<(iD%7PZhP?KCvCdu&km@Uf4sSf5P@lukN|mVfjv1};xr}<({&J~>&Q3P z^aMjogc<5BQ&UH;^(w#MJacx`S37xS%`T2UtEZ1Gn^3x*yp+>CQ7P+F^k~-1=ggjj zh%yVWjEh=DwzwmwY|V-|c>yC!tMWnA0*Opt5r2ZrZ-URyG{f*rL7b3L)T+a57|~>^ zlo{+e1fD9c?20*fE-UL?Gg4N#ToodE1#1Q$>x}B6lqx8n3SdpquAQE$mpM3@*kE^+ zaf%BK;+yK0Jv3CR93rmfPswRC;^b|&UPxPBrq4Nr+@)czEloc2^UjZ?^7-kh=Lg#a z>q1q%LOBP;A-Kh%NI;Fhd5_p`To$=C0no;$m)$8u_hVEd}8pI_sEgcj<^^F z`}NZFtx%}p0Sv_oJ}!P!{rDNp+Bj_gZjjB7b_pWOCH%za8CO~uMk}*2HrC;k2C1V~ z=zSy=;$uvNY<=WT36VN75z3zh`mXv!RSvlKXh;%lWox(=uL?-^sDPr{@*^11%mru@ zhw>MrCwUj8ss0fmdIDuxai7yz20k7dujG%|%gm1xAXGiUc}z@e17r||yhZgP9m-dK z%x&#>{1ngGQu|bt%f;f#*I&NRlCgfVWS;I^+-@TFv5T9^=+lS{4I_bSfk{M8sG9NhLIo9rA~qdq*xqJ0(j&g4noOFNQ7y zBd&&Oca&_);HBdDN9rM1{FbIKn}E5T@pAInRm8?rX^Ek{a;HYo-lEE)%cC}AM6GJs zkV4T~AByHymPl~+Pl+li9g0*6&AcwDRwq|eq@vC$Qdxu0%BwmoowT^}qZB3ci}PkH zo4`#DaXYyL#1cH63dw4OGjZ^6s-I?VZq%yfeM)KQx<)R)#v90-(k&QM1@bo*v{=K- ze-dYJ=^}!nicrcsvJ8WIl+)Q#*~s9eqA9Ds5?B{|k+SBIO(sthY_sIdFxcnGy61fy zSZp`_rmY?W?WF57sN~yy+VbDt;f+W52H77y=Rg~lv;+UrOcnxFgzMXMQ@u1v1~aBy zq@!Hhm4;mWMR^5?4rcXSWoWrD|3Q@2Ja_d00E9aAT@#SuU#0zn_L7+N!j!9)4lQs668cX%#Hi|={VeT(co$SGT%U*j+fbPz!$iBsrX%Iz z^v4){nvPKZzW!}?R<(`~)nsEOM=Kf!MW*t-HVS;5wKQmo_2>`1NEH;B=GUR|bs^tZ z#dA+rQ)ZN{B+HGYWH~q5tqxE7_fNMCxHaA%X0EbBMoFcD7ZMdcL`t-f_~q;GnL!nB z>e}j7gr%DB3;sc3rxprr%#9vPVO2`l2aY4hanqejJkLIKLTssA5XZP6Q{=wAk@i`U zwJK26eZO2$W43?7Pm`bKz~!{lS~6%X06H0)=n<5qhat>b`{)P=g@#ozwZzX>4xc22 zK%80#v^fuYEG1QG;S4y1og&P4DoMFAt?&xTq;id%;s(vr>vEE8#hq`&8P?vYbhtO~ zy?or7X&-RQg0E~A@M8*}(X~TK(vdI9N{C&t@QUKM3OcBwZbMuz1-iyZja*yYwR6s# zs}puec*pJG4+=&+E0AxEp5DA1?6U`S9Pr0I8ZnmsGzZJvJK>_Eh8-{IAHVi>Ae(zf zBqRXK@Gxz;g2J5&f{47C^XM@v?9EjsN@ZF8go>pJLzp_ak ziZ3Pb+uQmpj{dc5Ld^jH(EfL2ldGAzld-OqzJc*S0d+%L8>jE%dn;oHU41)q8asDo zC0GD(*~VN0ds-~Rzn{)-&;WoSkAMIGASeI;0GC|O6bCZG zj;c86wHtY0Y-aon#$FguQUw2}7wb8#p0lH&KD_5EbEHlM9C~6j9cTK05SA>{Odq3@LKo z0z|##3{iSq4e(+TmZqVI>4@`iZ5XD#_Q5p4KPFe88UpLiHASD#(9t0{J0g7YP@fy zO@jtCZBJ&wmy9>R&yXOJpG;u}1}sotuE8%jU&3s*YjV)ucb`|fmQ!)wT{3fM^c`Rn zX{JMbdSWu=I49e}wXQarF#J&Yk0zx~~RkC>Ye*LIGy;*r@AL9LE4MJ?| zxzVtwUOb-@=w)k1q$t`M1!#^@iMrSrdCOO0 z_CiQRnivA~BW}W~;Z|(NnQm-(nmK*AQ!{&ioo=5rLzdm+&VYH-k6tPM6=f9I!cxnb zoroQ=ee4Fwo;;D<18|@wK`%rPMG-+P$A{|P9TsRKb5RVE7~olc;Igwo!J|4m<^D)3 z(6B;kW#*fa=?}n2@vT31cStZ(5V*u^rxlAL`QVBRt@zMdxL{CqNO=l47(~@`k#uaE z3P5HlV1sj-I0*P7qA#*luo7?FX~FKz)Fr2k3>t8`!w?{xRLnIzSlRhJ*TZ9tijCtv zfZHK#v#1zUG-I&HzqJ~tq7r0eS-pL-+(xtZNno`x8LuFqFXrgf*mC$dLtuLr6G*+26%i+-wTlJ&rzR@OgRM&h6aPl|_v~gTxOke}k%Q07Zl3(FY zmJlh$lay~&&+mPx+v`t*?~HaR14ck^G4~5_Y%SZivG#E!w-@Ss!xYgpn0z$Qr11kF zH8-VP3>(IvlG@v2(^?IA@diyCrp8SaqT7TS6pe@In5~+aqx0PZHEt903f?HE3FBLI zxr;bS$yG1~@Lex^TxUvuvGkPXV+y*;py=^lK;3}~DXkUL<)0hryAuM}J7{?n!HT5P zs8so#T{8dr$^z~}eaRLWyRyv;u^jdWje<6q|HI&QFjc38khgNU>OzQq_tn`dQLENS zR(a~K$X!2YLfj9qvCaB;;Y55o;iwW=?as5Sg?IeaKkV-)uO{K($_njd%PI*2t(AmR zUG1)$N1F~#1nNyqF(E;L_9u9SuAI*VVKxrgc(4mtlS!&-EhXgXZHQIziUC{Pwc23L zQbo7Z63e=rWho%HPsJjF?5ZA}LYOvoa78z=fXwRuVeK8eERB|J-BhJ*+qP}nwry3~ zW~FW0wr$&4Y4c|7bMN`IKCOM{KbY~3)<%pTPxRhxdT^J%O1HzwmZ(o>Dh;a0Pv&z< znc@U|=2WJzu%!N!bJ&Mv+Pf0InNzfS1czgr*mTLRv~N~w>HBK`X9g7+3Wuzn2atSg z6IMih?N{zqjhjuiiTYNz7FP3y>Ax@acJ>^3xs^GputcIXrOdd> z)cN?4cK1=84Z|W#dur} zY`(fORkMZ_`YjKxuIcxx-xrTnL^G$j8uor4hC;^DtyASva7ckz$QociSsMbImve4k zo(-O4%2qBL>6{?3kR%f}onPkCl0d~b8&%7~zoyYjLG^kZEnX5xc!}R}Aooa_!<8Y| zG;(TQA&{(AXKAG(95DS;#G<(b+Axu;ZgIF~uU3@fi2g-O%a);y2eq5Y- zzT0;3v{IR1@OkLlYBW8|ax4Jm?n%~JnYef1Ypr};Jj#~S%2s_@dG4LB236_o5yWE@ zp_E;|^EGTx=XeNnImoP2?n9qC|z7v({yah^CAk(=-qLd|D zrxsEVVRsCvJ&p6B=DbA1p=LaNq+z^7$Ius!1jk$=y{_JANA>oW<3J(q()PTCr&i-k4HPekTgMRG*AT zUH`CTIaz%5+tw6w25fo6O3@RB)ROSIO-GYd?@y*1RRD>N z)ViisbR%0dHPl8%|5Gt$Q>Tr`d!vWfk(WWb)W%a09a!LIN9f;T;?Dl@Qt{Coj0yI)taGgvpsAKHO>ue6g8R#Q;T_;SFSs)xJ}vG|K-Q20`6Z! z+2-tfTKuEK{c9Wlb3>U@@c#pkZ|7{FXa6I@8JPVy4o*5h+MDP<2dBD!2D`{*XIp?^ z`I0j-o6NmBMuWq907SVImLzp~jpGUR1(>hbYz-4BTO<^U_0$@7kmgd3dZy25DOnzZ z#dKjapncAVaUR^>k23`Y2L}g4Ks^-<+|fQJxOj1LCn;)&m-_?p=C9EXh|&eAGoS4G z3t>@fIN=z#$G54syL6K5pPVHM*zp?TU113u_>hKo4PwKYuwGRT*fW{7Y^aED7F{Ih(-?4(YVhjpah24z z@o-3HIHuh0Hg+7y=tivpb7jZm1~XviGkW}|Ntpoh@PY(7@eO8AaPj9APe}eTZv&I1FT~NXP8R*`CsxU}W5LpN! zCMG(WX<(pfGyHE+!KPF}JVGe2+hhQ~=y6D!w!LTgDSz!D0Rj5q(&J18_MZ*NrFr}C za3HO5Kg2{BwHqUWj~e6AvnW8N=`nex~@8m(-zq>f4%HCAFn=kPSj4ST$6PlKv4|4M1<7s1PeVOwL_>u>l9cYkX25zf`B|j1RrSa zou_kCOKhR%q>+XGl1RiA`)9kB$Yta#OK7txNpyL=dgMn}aXLnYM+u4M^mF^K6W-EP zi*R{Ns-TY~@V1_QckLG_k@y?CDb*DkRtk8)iK8cmKXaLA$4u)Mh2@wJ9&hr!2-=s8 z<95M%E1!+)Ml;%z)Ge3c4t(#=?6+PeE*1dl|qHUM&2y~HWpT8<^aok;PbMbP8Ic@^Fr?aO5syxWm8-{n@ z0+59t>V21zSJm4LE44L}S)JEs+i>L)EK%;w7E!*~l*B!WFrCP6RRgKK@B!+KC$bZ1 zT=pzloTW_biiD-M*HaD0Labx7B}$krk~xhd2PKWvgYN$b5^7-%5VYIDLT1`V(jV4U zAVU?kG2p+ZPUR&`wV9ZgD`+6Z!5H1zqq7e3Q_d9uKBpQBV*V`+N^}&-OC8k03KQR~ zGkY^LVpKw@@DyvacJcOPmjrH0f)EH-%T!G>rgVg{2r0xQuym|XujHmsCN5u~L8~kg zs0de8k``&@H37b5Jk!)^7T1vJlK@qVv!u8slL{BpL2zt;mSBF{?ixYA{rpNe*cHA}++jddRmo?G z&JUN`BTJvkbwrmG5=v6zSd|h&KnHvb8wzQ!^by`fwv6+|mcQeV49mHfULLRO!mW>Q zGNqHCfLgQb0nPqIYvoUM73++PHWpIW799oisDE!?ms*};4aRJ(Huu?NfIYEZkaze6 zL~M71KR$aCJt>o`OHSJPr7|wgHK152cb=0tQUc1F9+|`b;Q{ zlPT$%a36?^Xr%YB()F3UJ@q{#*i+>IaV~zkybaPTM#o2Od8AZ$%wuVw_ zM@WrFHlD=VOhNOnao*qPO-FM1;Xc&Q zx51^KoG9Mg7IkkQYLF7f93@C;waCJ$U5I>Vf?#}Y=99IIyYOhW*36V#JMb4pvmc#} zfam-{@+o20<_G_fR)fQK9EHQB+{z3IBZcH`lp?-f1TCExF zSo-EmGBmr}6>1_2CZ}wW`CxeL5xx(<2qv;ma_82#mZCvUr^1oZhpSlBJWMxgj#jI* zXOWe8)X=U-D8V zB*8iP9Erc^%Uu-p_C$)wT}$x(Ec=y2Y|G(~7okYztw>TKIG7lwtuwY`^ah4Shr!ks z(i+6g?G*VyB^50LJm3c@m$t$yO>N*U~nAK$=1kS+{78{>T{gy7@ zk_KAa>AM?uu7B^I{%55Gi3A2%3JL(=Ut|BDTmJYk!2i7y`Tx6pYvyR@V*g+4;Obb} zZLUsI93xHvpsPnTi6J4-kp=bxvkR|y}EJ{}^v zI-Pv`YTKN&b*kCdwy51lmE4Xe-0(XD$HP5N+81(?+HWHvp50>0tSmf|-Rjv#iPtiY zC-WH%V_DZVCk<&cB-%_6C4ZQ-IHBx7SIVT+pdiJvzx%bd8pbB%x%~+bbd#M;q(+dBPjx4$ym4)pMn(%BxkL60kJadv?mVviDI zt9FuuJ}^D7)3!t(Y}ezemYcMisbk}18GM~nxap8Oi0}O5!Wwg`-v%nBy2D{mo47f& z%WZgP@w2yC`_n_x?D9ALiq(3!p&K;+(<-pfoZ1>no-4Q;G}J&&x2kI8BebBPAlSwe zmqYJ$_K<63trA1L+Gt}j*l=X}(aw1QN6GHbr)RK*u1DEp2siL|AacLl zd;aNUA`8w5{{VCV&Rl(GDfyvmWM=8kzm^UsoK$89@xFRGIziLZjWB@>Y|Xxs)!4eY zQLL5|lNIbR1%v4pnP|Wjp9h!YTeGE46Df3k)Y_J`zd}mdQ;%|sA~+Nd{U&7ygIjIs|be0j)P~Va$2T+!;d_%7gEW{lSpOsl^OPUUqDIs?~3>*YD2Z*|VKZ);{ zj-8X&oMQiK#F~wSE&dtJu z0cg%+;pqUpP`X2bzKgaHQbwKenx)C>ve)Bvt-koqj^M-nniN(}{WedN<07!sDtDh$ zti1r_*1leS)^@>p<)E1?t#qAB;3UFI^@ei1Y5fH@#m64U>*vmELzZaQIo5EwPVEma zExv$~6K|Iqr0hgCP6r4sAGhTLP;z>nuucr2;C#z5fl--ZW1KljBJ2POfMno3xz2Mw z!Pa=ND+yqg%QYh7^23}*`a+(hjB(+KeW@*MgUs^1#~v|&+`T=fu{@`7Z_c4S3#mRd zkmly(9BsKv&WX3{lhT(7uA>+6bW*e;(y)bSFIN4M%5~4S_G{VB;B`72AzSO%3qfpS z*N&&3=w%7A%C5aDjfbzo&%M`B38oJ#u%hS%jp!88z`{ z&^Z{cx2VT#SZhspOfkR*ss6*`*i?P4obY)E5pc@+`k^U&h(?|Ndm49jBwRZzFm?1u zb`Klb3S=pO-0nsGqgDUw$pMI9rx`V~KlSsNg9?1o!_r+=*QVD|z$%~no&qn5wmY%c zgy=k`N|9zz=9bzZ-4Y?SqADv{tWA?cfSzWyDnFX( zNZN)q8y9rJ&-kkVbtc<~+~wYsJUj%^39%{sFvw)Qp~+b)_T%EwZa-eXeK zo;CO$b?hcYoRQNQI;ydk=;)Jqn|qJ3oO#q*qo}(=&NR3sv$#;ZrIrvh9Ug;d8fX^X zL|fxL-Xj~f_9Wk9J#W`#m?`Aiw0=>0Y(_%RGGOr^L1xnq_&amf>` z5TU|ZMP=-CtAheEs|)d0kn~JxYBuBZS=s@H#UI@e&T1V5Uz@^)fpLQS2GKth-5lR% zALriAZG_cpr|cp@qA;exnYxKt%TWEWiJCWqN@k1@GM)7{Ptr>1@}6Go1&csbNW}=; zUC-dBRAMSVV8is&@-fry9wMjQry^b+yK6Ay!|IT zX-e4Mh}$ev3Mu>gSS#q+k7o9zSq)Ld24%9Yg#cIr?TBj8qHHIjDb`>`cbNJ15&}6s zk9~78ZVqfGWGNr)6{RPw@a5WOGCDbb$pK2x`ZR1EQpuFml0JK37sgh9J>0^)coVAQ z0CY4sNoM1bxaNAcUnd92q(57P-S_#e*D5k}8+xmFw*;ek5Hb;ra)*;?Bw8#Iw6)2Rd6e7^`?wkoZ~7ss2(2{|2r9gti* zDY6z`bCp~VM1Lw4{=VyqUjI(6*BfNEf&5h*Q52Phnhq~YR zvYZPQ+TBnZ)_mhs<%0GC`-~gT=_^Zd1t`#VNcxePpgqwa$~(uy9@yr0((=G|{E2Bg zfzzTN^PIY5fa}$uYle3-_Fcg4aVs~ejP>LFML=Dxp{*^sYU!s5zSH;hkk)|iYPxP} z_OhbZo*$R(aaAWN)TF8_k(sDyBSozCTaPbt5MRH>n|(KZ^rO2pY1STmb3CAR*eCoi z1LniL7|=%4jw)XJw?SFfy@FMI zS5&)4xpa-Rb00H@M9YW^@!uT1IymN~<8ISQQKlJ_9+2p*9CsB;PSxo-6trQdlJ0ZK z2gc8!`l*DA#*{O|C<8id@=6zI=yV}z!#Gq&L|V>P&B18oX`het=HC3e>F`8TZNc-R4~e`%RFC3Lgm6w){DQqO2gR=d&ev#}K$m2Ot!&6cy9H%0Z`?}kLdtWqC$wl^IJ?N@8G}}AhEuk3djhN_-s+}S-$0w9l@hG0`BZ|SBQbY&IT^428q!KLo-8aJtk zRh^9U@Nksz1o+sW`CR`CJ4`*_0$?uM{xgsYh3dgG5GEfn@?L4}nlKIf3=34IWpk-i z7U9T!#9~aT)cJm(#6^^+2Kwg0+Q~9l#xbvP;*_dn$e1)5{F%&ol)K5P`^jwgb=7v1 zEVa;`o7ISjuI(%eydq{^9_oS{#0&CH$(<7JAh|76t2$$gs1tzL+ln6JOTwZ5^{F6yRH*XY%F|TW{qwiT+Y^QwCw7VK+t0p`&4{ z3|fNySo=bvP3-#cg$m8!+?evEF{vJ2dY)V|rnP4+tS}T+K?Jo=3qA9S{e1j`zKFGu zWsmCPL8*eJ-8$!0D(45y2*I8me=I>z^G)d4IQN{n<1-wSlhiRoQmJ|-jY$m#v%f@U z!Hj!!95vcu9Gdouc4Si5RR<9Z3evVr3=={X15GP;m#StXA*CsMntv0r=#*ePxjRAF zrJgyUZtihP>bzU0w#C(xibgoMdQ%lSicc*Og``_*0)n6z^7{;qdD6{M!azTNW)nfU<)hVJjdETc`udrcDQJtc5BY&IRFeL&PDMrW;%EW#^E~4UYJ> ze{ySRXuN8SHjmteqr|OM<@Ux>TezlEU-8-IS=b0mmkfD{y)$ZLzxr7^Ry3qw1w~e& zAG~lM6O*LEd<7`qDn#&L{eZ`oJbA!J| z$KPVDZL@>R5;3+j{1zg|x&}UBaTc)nGZA-Lu_Q-n5+FBYB(NP zD7sPz>dQddRdBrCSrlUSDKV7is@uO)w6l`+pr~Fbe@b{17Bv03M}nPvh*6nJuB|v* zqWAj-V?k$g>UE5SZ<_MlUoT*c)9U1r8}+ygKeKwAoeJ>A&oEZqg7mN98OzRof!;y&jT0)#?_hOi*w9F9B6RbrdC zGDzOu?F!Z#?4<-?9lk)pV2x!)(eN{bMS*f#+XHS{y*`VgDiY0(3-O+1BIdq`b~SCr z&QL-?Aif^Cit8$+-~d)Pv6ADWVmwPB3GrS?%RotqFuTVGf$L=1CHcarV@V#zZQw1U z>T84KVRidqwfb7XCzH5gL+4iyZ6jW`Uu;FL==S3jOUvvC9RiSNJ zh+PFe3Jjv0o>V$CbyR_i5@dz(6;X;fXQy|bw0h+%Q2-s(aRR!gJsuc1X#GnJg~3Y< zoTITO65@b4^ID|br4J3}E+9-vySP*JQ;~2f2U2Wlw)9n(Y*m}u8_W4cl?g38F&L(h zq?rm=Lb7SfT6h#D2fyQnbZXplJdxEYsyBK!O7QH_b~7GJ8W;KTSxexH}_VFjm?Ag{2ns`D1$ZyL&9 zP^KQmg>yJ+eL61+l1ddztX91r`$;;r3B<%?;vmAsb3BwW5w77hCfo{H-eD(1&xvcm z_7W#=9wM)g4V#PJ!}LDltSh7JZ0{CsHJ>)XGDzURi6^tV0&=Y9uT zw7k`&_g$lL`1jv<=!r|FiA!^)1&M=G7<%GY%q(3@Tf&QvI7SX;Yf^O-U?2uBda}#u zoo!q?m09qL6@XMH7*7gfNUPxmji8LxGU$BJc&D(y1hxpSYb)4q2S~_Uk zK-T0AEyu0<-zL_c-@ju>kj=tVPXQy>NfgYWVQxf+urq|p6CZ8)g^uLIrgTdA5(&*y zWkRgxm~N_xPCV?jCw`4}k?w3s92Xym3%&dDog}zK5WPu(N2t@~y#2P0JRUg69&Mc7 znLf*hn{Snps6pN7!SJd@ALU{V#p1dXC-vSt)(0=jn-%qHIxhwn^)3<(okqvAVCdY$ z-N{=+G6kl9E~LjSq-Ui{&C_b3V%d*)Mo($kyK3Jbs=9gQde53_0Z26xB&E6j-Rr9}wV)gXwJ&X*D%uV$4==6Tph%B7-^k|Lj zJ)F($Y-yMn=zoA%qyJ09#&_o${s$s<;^gSa5CG`A3MzsB!3dPO7km(wUwaaWSP?w{ zgBjyfl@ZxL2w||s_;YrDG2igBbMnypb91tDvhgGTLD}eYv9sRrGa+iS^I^a6V=y22 zGjo#oGhjR+>Vw;eM+o?He=Oa_~Vpx4-Zue{nzI|KHeU-MQ=T10lHa>tc(HNl<9@{af4~ubXLZVT4EvP6&D0k&&K8%^!~# z8jzelXeG?EwP@b66UP&Fd=>v-=Uc<(7N3IbG1KDufaFXu0vHG* zQJ#?J5yiZA>Jy!UQEA2q{xU)*L6*N4PdyG`AKp{~FclH6*CH9X|PZ7ntDNP ze)=#lMJm5(c%nN_PfxdCj*;ddFv}E6!FthSL~mDEWJTbqr5LrydU-&Am_X^eh<3e+ zk1d#ws7>1VeW62ZA_8)O051nU2!Ashr{e;390se|T%sluEA{1$^=>|Y63j@ny+1r4 z6NVsRW4V83?QMb=Qnej~g-8Q;@Hfu&<-nr={7mBw!0#e}F&X|as|lQw+JXMjPm9$Z zEUkhs$Q(>|1SFI9&3!9tb?I02)s1q=)<7$#4iOG4tl}a{b3MSfE?ljqg|o}`M3-4qsO10} zSJsS|AV!E@pH(Gw?QOjl>ccdYtec_Zm6>{KI+a?^&-(19lYs*4Zev#2mQ9e~pa3X> zvJ1?UulO@!I|K^rb;@s4VqHa~rGUJ0J;pA99y0)r$vo>;00JXSeil`$t&nn9bOr$& zCQ{{qAr$x&Gud&9Nj6JUaXep=VE-~Lym8raBQ5Eb5bMzPte%fJ)6D%F5I?;jdajgF2wsDaeItWSqegv& zsasz=@8;OJmdD{%G%yzeLELS7BSvq@kcr9CY{84Ymg$Wo0?7l#>cNO4Cz zn$0s4hG5@Jz1;Zar7W93K4ya1KN)jXi@mg$!yH6goJ2<2%bXMzm~=WiUM_Za=eL!bYrGQfH#Q{y=lt%ieh}szvB}$IMPN;Fxs% zY`73OTkqRus*kA8KqEI?0=2))z;S5)zyW6k;dJvx%AqBH9b7J4TbPUyj4f9EY3UdisF9J z6F)`rLg9V!zXu}${In6#7#*E2Vl6mq7|4wCwn_~3o3`_WGib$z3C)YMpCN(9_GP~> zu?9b};P0XcCPMA5O_{EJW<-?B9XpTr%$qt&DC)}Hf&H5TESQZj^F4(df4kH36`6VX zPV(rE)?BD`mj(*$88yllSTnS?!VAp^BUT&J_ATc`nBNDtSm2K{kI|+V3!XzCh(VWm zW8lJ<`W7qnG^9&yj&F*N6G(a%;0gRgc)K&eeTW%q+^e)gmYN`(IGlkI)Lo}tR|{H> zU8A9$Ujxdh-aXlQlgx}d!bm=jvJF0&&ZYb$YvQKl26>IR^s_i*z4yW{&(Tl5>V(5y z(^QLEopa_k0Zyvmh%$LJIqOF9{nSueCxhWGf&tU<5v2QK9spDO^|@!(!kq^(!r$fd z!G{so;agw$$sf43OAa-CUi^hWToKxh0W<5@i3aEwVJ#lmyrP}Ax}*3hw04kNf)Vff z_PFcTBY)#-+H^~kAhQ;QvFM3D_=uC>M7!Z)*0V%@bViPMZ29ADEE8FKIr`p7;=)Hk zR*yuZy9*B6J|n1T#i0}d=Ed+LU@DK@NdoNL^LMKOMzG94{K1?m*fBo2raLL(B9_{6r%5R zY1@LAW780oRVp^@xNy4lz?@;DH4&V51w(a5rAX7=(w;5p0F-F29`9Gg4}#n$X-YeJ z5shD#j3U}tjQE23fcQd?Sk&Y#Mw`ZsjeTl~2%}xs9cK-3&@NEX`*hc)hY@t^5T}=% zHEPTw@!XW=c=Dt8aXmo@Fk;9#ZcYds8Z6(eUU%LB{-sZ4IcZaoub01BOcnPNr`%L`r0+)08vp=b7kRtz8RbIf`1u%~ zzfC@Pw1Zghc8*C%2g_Fh(l6v=9*8qyX1Y{r{ybcc_W-4bNpB=(>_C9EBv;#z9oNmB zhnl}a%@nvu-$aCORGKqAZ2Q7UnZ20Kr62jbX)C#Y=%@#0cuA3YO>Vt3XY|KpDE#G+ zhgU`Zp=2UIa$1yT=r*+?|Ipgx(;QGY#WA12YEGIvg#wHZXiF15FV=N5@cB%RCx5RU zA(SO^PC4C>Fp!b?RXlH%+crt&8kPVYI|J@91b=Ate^>;hRqQAAkT$hRxm?FvBlO=23gwsP*x2l(}Yc@?%6etNjz>OpYg59Q!Z=7oT zTenk@I{Z|j(yo9|mUQZKBjEa2*h>i3kH`&!m*nf=L_XE^rLgjgtY><=`5ARF!~tJlxPoyje?FLga4@Mfk(6ozS@e7M`5$~E`rK> z0Gn-?&FQdkTM6xz*^?pT1Px7eC;yFzMZSEWK2$t~=(m4Uy%WQD+yk{DOT-#S#*=Nm zZ#%6hnR9cl#<}2!iyS&*2m>d8z&zx*f((+nP&iI_V2pm$=?glt$atlNvIZ&uivrT) z48N8W2T7d(^RZu-OfW^?$E6fkX%pemtid<|ipfY37Gdbb(A@3VI6ddN0$zkFkuA_1 zMG;|>ybKk~9Ar3}3jZr(G!{Oe16CnoQVL;moE(Y08V0Wfo*<;aJASaeKBPfgyIYpU zSTwvBK$sSTYp5%;RMHZ)C;QJ{8xCF|AvvoGCID^>G5a8Pqf5#H$WpLT=86G3wAT@4 zFf)MRcZ}ipzC8ym%q+>QR^>t9p59<_n9QS%?O8yWY$9C#Li!xVp_h0h<;55>*>|H- zJY@$YQ?|Z>W@RKRT9&9{G+$OgdTP<;Rfy&yz>e*=GTaGyWE zy&AlFsp6pbqkgw4U=_Chqv^+iJL460^1@Bg7 zKgxOis+Y3gy&*&#CdJ;!W=||I`5uCi&4W>8oqy5}f5i^=L!3oZN=uoL0m@fPR^Ry9 zr%0(04DZoJ1@mzy?Aux#O|n#cBBZeZ|bRpWzc$tDK!s&&A_rHnjRTP`>jsG?w3TYuZ#)JhdM zI|klau(m}%3^oO7LtD(s+pvL;Zxzc_E1zLOxnJiQ)u^iI$lK0mKwpm1N+BN9YP4;B zi@?`L@I$XwRR-KvyaERF-vb7F7zB*k`x>W~s0D?B!~Oi)PO_jx4_Cwn!$j5F;&4P0i9+&;VK1Z_$xUfQGS9xORD8EWA) z@9ZcJSM2W`0K~%=oJ_H2#G!=QD04 z=@rm8w^wf-UpsbiMeDJumSa(sInHM1e!#lS2a3uaSm3v8i~b)j2TUs!X#g+38`6`4 zGa{&&mJIOY5u5u1*Wy9vG@i(_`qZ7-9W1yk{yFDs^c%AJ5JIT7uU=7WdDWUBO_m-M1LXo7VX zTPY0(lRT-#5GpilU6~f7suhZKd#6#z{i7x?ueJOu2`JTI{xW4AAsZrQN_>_yP1AL9 zM=%Qt332e29QYW$uluA!;>Q3@f7G1rgV)@gK^wi;0-wv(&(V!R0XK^yXlVh**VaQv zq)taRcBH~Yu7TK0oa9YH)HWE9JA~GQ=_CHaCQewiPuxaM3D=UVm_I2gtdK-qMlu@%`m-Sl0~ zq=$HR{urVGhtUvNKPl98f9OB)+}XVbxwlKgUmm@Wj(6{iPxf{|P@9 zj{BF*lE!>%g7stqiAH^U9=(O(y!9Vb)oppQp~;@1^n)G3NBq}Kz&j4M0h|=~7;p9z zp(r`kVuS+RM}~0AL2gC{wJbAPMm#~X5@C8ZZC{x~M?@Z!FcS?X^g>5OT5)osJnBMH zwQrgtQIS8iEEtvAmf9xPWJ)U5>4SyZ0_)fo_oV_2jU00217vA7EyWWD^ygG3qChwh z51`=AsS$sJi()TUlhM<|^5njrPl_-(A+el&K4dd|sBnM&j7iF?UV0HXc>M2K2y?3G z`PB{aVeO`xGI|%6AB%W|arXj7#~}nY?LUGsQW$Rjq%;dx7#T8_$=fRd2JL;g=uPQx*6tcmdVq*5Iz*P5f^+7ys&~z( z9zGK*P2@dQ&%bHBXQMxap|)4@ncE+swA^FHJL^O&5e1GZ{3lPRXf|`VM55i{!qO*h z^J(wLL#YXNBw$~h%&&t5B4|H(EQ4iyPxeJZ> z+n)A%aon)RC~CN4fo%`>@r~9tB^V57vEPJhRN)_`ex_k&z-eQ0(}VdJz7NE&YvO?MIJIF7+qj?QmXNlj8B!7#(Kd6gX5r7F;V z>5Ql2aOfsx!;G0o0`D0=0y#_@&-8PgZD$AM)lNqmRnb$j?v2Ms4UHZbeXX6lw9+id z;-5+#w@MSzy+NnWjN2~lZ&cPrG(RXmMD$q+BtD|-W&a3vfOe+@SWsOpb9?_10wW+4 z6k2w#4Vca)ZAIOHrjTESL*6*y&%L%jlJ@Ev>39 z6Be7=5}(97ru5}a`et4+Qfr-aK)R`~FS@%1WXtptTV3l#ZdA#zcQ#u?-}AzP0oHvT z3ekf(61`*dMSjaVWrxM^2L@L1{Xz$!Uc(n5R*Cqn0xt!>9t(( z;X;H{rqWP8uAum?OXrCBXzlDx4UoZLyN6{08)*o~0B7@=k#{)^q3=_gjz^gayAb?Z zcB{h`7Q_`5#8ekjGqQH{$eyg+F*0?lV+2NdT1;xXD_;{eXM+FkcPaE0Ngo$5$^fDW z&!q(a4faoCnECl8{cr#P|CEIPtTFJB0|IFLZ#4!-7waEQ-`v2$_P-Gt{!ji=ww^#C zdM0vp*VQ(ZHoBBs!}1oSwbd*p8X7pHN}YvR2DK;R)+E&1&NV?9+Br)C%~-QHv~@B~ zLa6sN)QnL0Bom_v(}YIUX!?xa$NS~w$HzxhubCrUk0&4FLRLK7K`fHv@B1t1ZI20U zLk?WG6(w7S5u)cye|ynMmL9X}M>Z1LPbV3ktN3IYnb-unKV}YhT@qJ1oIU4TPTiO= zq1uwINQj`QSktSESpC1x70o2~#t-NwlUXjiAP14i>va`FGX!Zh(xBcxXT4eQ4>258 zbB@EJz90WeEsZ@>orh6wN63!-5A`kFjpa>s-EBHMniQ*#?evu6E@teXQ!1pBxPZ~N z5fye?3&x|X{^9eREw%n=){7nu>U?Bw0nw2cfejXMIGq?GHu{F$HQ7OYEkbOmr#;}CnQ!xv|&*`okEI!;c`ENHo$f&;t7S4xgWJc~dp=xgw>_O0#A^5l5PEq-!AIFubj*o6?44IYAIN1^V44pBfwsX7 z_64sL4(q@1Ib?|$y%WLt2H3~z$H0sR_1x-KtAEne>hOX>ljWPKL66@~mIieeYM(09 zYI+H^EvJ#a0~PI$08!8!F%p5YfrJ1kBscX1f@uc`3z8w8Fq`Irn2*^PtF~=g^ zm>da0tlFGi(^NQ@`{F++9}|`4ir^*j^eRsy@uN~p@4 zc{I3Yt73y~#rK-(+cvWEC^7rlqSMA?0y&>hfJtXFd7%Ryr6DF@XRg{Z@k zZ8k!%!@)|oo<97a-wM&NP=u4MiK5R3qM+J#s8RJJB94M;_Bp9i)+aMDltvTuS$!1) zgnM_F6Y87DaZuq#teJY37wSVfj3s<$Wpcb3Y(|wtG}&s|f8g#Sx4iSMr=;sAUJ}F7 zuqJ1sM9NakM~fuIWGl^Gk;JKp7@d?hGz%R_l}`|uG*}I;2RiXm5zimCn|>D*U-$U1 z@Hu*gYo?lJ)!$CYg!?AbndCgCNBEeC>Ce~K;70KyeDZl)IQk*cU8CUqXuZ-7Us@)H@2_*SLmz##2 zeX~1zIh?cj{D%|9Q6Ju!4EyXLlBYN+qP|GL}b{uZQHhOE5o*3ac?zh)ENJJje6BN zjomt}bLLue?)mMl>q*41+}%c#j4PA`g<;+BY|m}W!y6m04~Us4=!N8Uhs30x^@M9Y zAAOEU)Z~~^-eR?H@4Fg`kJv#x>R50}k0OSpwmTH9iFL*{hF1h84My-2HXBBZ!N4MI zs?bTh=!d?Bxk{6$)!E%H7a-5(+$Ic?>T+`}gf2}=ESIBKct5|6p*9LH!6p3(3_O4^e&Xk7CPt`x!Sd#8 zLRF}&AhxM=zs*zFT^HZ4fLSWc$FnQJbw0130BS{@Eo$;LELppzk0P~Am;A~Koir3Fs*sHBI26lU~P+)j4{?#e2p586zcu{SR+ zrk4$+T~`+{Ijl&D*DvRDg z227TdCtH62vE7@F%8C|BmDgx;<)6_g1WI4nN?%2pzhxV}3#Fh*03(E!)>Y;8^4B3K zZ@dkO$d$SMRE8WmCpM=unxAk~Q8rFOSic_1_kQE>AJ-gx3_%X6%Uj;c-~rL*xahxD zW?p0WKHc=5+_{E?kd)iN##FW~ckOyNXh4x4(%b#caQkI8rn5(>T*MZ33=-g9ghD(7 zCK?X>S-y29xu6%ql!WG-eB3`7KG|$zT7g6D(Bjt`H)UFpW&SH^peY=WEmjW43{wkW z>NeBBS+Zv6fU0u$ehd?(I*M6FWkO2CZd;M>WYbM@O+snjbA|%|b3IRKJiKmLX*|{s zchJuw>md8ZTIGCV8=YKOLJ6kY6!ndYnHo0_&*v%~WDbF}(oaw}BFU7zM#ogs2dohR zt$qP9er~~a5rvbNQPsFo?hiu!GN^_X==P{~T-#Mv8*Grl^kSVkPDyPaa)k14A7xgr z-2P^+=os%72Uc>AHTlg0RD+wJU#icM&L)4S+@4PDKv$d-LV8?fR9&bgpF22^XuhOn zU+>~$Z(<95tXC!=e%J_R=1qKmU#9tN5X?tOw`W5}$ z71s0Re)lJ}MXTMnTguv?tk=y4ukFgn$uP<1SJk|s&3<$0rN0AD^xb@OK zDUBrKJf@U6khkARRzilEgh3D|t!?G93-MC~;yH*N%(bSYP7L6Wh$d_NRV zXN6d_%_n}4<{8J39uNOkTs$gVNWf> zajOY7c$%$7u@>l5Gq_#K=&^TBJt17R3sP|RWq!f|+OrNeDq3{}pesI~ZPso(YeO~y|1uqD=Beb(LFC;bX-E48EQD+kPUxU`FFarg&w z2kqTL!hQ+U+fe#^UJhU;fRxDZKj;?^B*opBs5E@V61>?QtBb6y+jLl7Ypgh1in*-$ z^`6Wm5M6f=B)JKM-@;!MAHWbNSHB)e80C#~OD6f_90?CAQydj-0U{@Tsb@9WLAAs9 zYII*Bog;)&1fbo(I+6uRt)U5{Ibo^;*AZ|#H(l;DMSNiJ+P6*hn6VKPT~lQBl~)NV zo&P#N0Ta%+QF@f9JEMs81FxTR=XN1JxT$jC5;lD|tWOC;`e9>mI9_6FfC{84t2K`i zU@{J4<&O6MA?uEW!{1v?*qzTcxbp~wZmWFL#2=+`5fLJoifOq777aW@096Rt%26yeDvqUj z409#AXG=iKCB4JCZ2L)m4$Tx7eA!!($_LHrO^X{0A~1;Rmz_Yo+uSvH!!~5^p}?{z z1rrA(SNr&v>IT@v;Ov$P@?o*OH99Z9%-x99xPM=O4~JFl|LV5SW|i~Y z#a5$T92XHW>sOmSKRiL%9Z8vw6TSW}dZ-*2jFlit*v^vp{x?4$prbLw@-y52Gr|Ao z*}lsQ06^(~I@|x7;QOyTK^^~#PEc(tyZ!%tquW@16xZ#-b^`=eG>bJ$rsQ)r4gZlA z@)vN>zZL41;*@1vCqCCCkA=9=+C4a!seUx^&+*6GQrSjBe}b?%9X{6pf(+k|_^OtN zhD4zHte8V8KET4)er@S~a|)`l@wF&V#3T}|9Qy}F+n3GEW%3dTAixe~GCs@sqrV~} z(y~Kx`*R4y(7J-Wp%!ouE#$GF5u!i53%a9A!SSR#kuC0enUh7n!1}prclP;hw9q0w zgSQ7l?Lkq0<^#-(ws?8237w$aosx0$uY7;q>CF-I{TfUWa^uH-5JwL|0De%pmRfpC z_D2wd*2htL>*7UN+Qqqr81R>#b>rZ7?8i3cb{gWwe#UM;xhLb!Kqxj%?F1tpi+tfZ zDb}}^!O+3q$POkn9&C>504GNRkKuR}6u3BXszA{*Bi0&=*%?jh6zoIff1FbTe@{3V zSb=X40l<&cnL&{{Xfq04V`LcE;xk+^w3b4*8F2z^!kuLC&X_!)wBIR*s#2Y}r9VD_ z^e3M)SiA=hcw)u*mc^dKAlKH{xaNzj24m!54-f9e0_PEFz%~`1ga~(t!w`*E9nJEc z!x)IrMK1kTRIlSV2Erf&6JbSLg{wQJ@hG36Nvp;RG;WSdfJhU>*4{yB-Z~o0_^kjs ze8cl7(aHPjSVA6yELP8Bm0Y9!P7hqSCBY?u$5W;DM38}4nEMVMx<)_-{T0C62s|#r zJ;abj-Es2Mf6BuFsKI;;Xv$fj9=)AGz|c$iZ!c{T50`%VnGjBgY#%o4jCCwkw?V2 z;7xoCM~w7+>d;mnLC?-q{@kLqCc~KiY6e;j?JY`{KYP4aR^i7c($JF!l9zRF>@sQL zrmr7gIwAIFzytWd`?~#^HqXER~BX#?z1W~*Tm_fCUkPR zTNzyR_J51w9-nH_5x+~vCc~vm)YqDB0cP6rYuVH+OgV;XJ{exThJ29Wuq(@Ku>X@? zwcH2T#wA6&eMVSe$s@nHq>;Mj>jX8rAY5^;vSs-@ZpjEplslZP8CV;5deDrA9NBu8 z797Upy3wQEHU_Ah+Z9yK&x#vfyjAQ1a4w;<^cb@L?~Z>T0*13i9809tM$*Lv*w$;EPk|y6GKaa!z{{X9+sj z=kT392MZc{_%Rx{XcX_{)W&~GH=9MQ~`1k5fsyX?NcFSnzpeejw-IXM4 z8msQUel_LvYIK1(TcUA>$bj;fX@_aM9||fTuEnITDXkC<88H4@qsLHz@nd%?SF4O! zaw1O2Jo^<<9DP-T9rA0h`;UaH>S86ktY6{tU#4Gc(O~*Z3UtR@=PutYf7QVB3@Ggi zrY@s4u`S6GuNU<-Z-XtMPPTRX^scB!;b&ZwH{W}l&T2AS7QOUYujnS!`E`sl7@0S2 zhsfVtikV?kX#`bsU~*iztGW|yd6SObC3L*Msx#+(#_lhU25N{Zv{q;4+s~Jm!?*MM zc4&$==u@0P^y24)VFt8mPO_9iprKImTmhqz}5w#xs z*>rV=T}4Z84JOORw$=0+?ilNgIHH)ysXv1~PAz(H5@_<4u4q`CzL8&w%Ghn_+48h! z+g^<-AI+7XAyF+RQLdHlE~pMXsu(`lEAeQ@>~TQ|*cB1fiL;2+S&giNbP(h|{()f%yJfrP8Ue-jeId5eF=@N*P_F`LUdgF}j z=W!3}D7S~LaD*yTEpv_V!lc?!#I=(GJ`bL-bVJz=X%*8JbkFJ-Sf@?yV9*wRR=0(~ zOG@W0&&by#UizGMT`?;ao4TA009ObFnys}&Nw?ApsN4QovdE}a2+aLm1!J1xz!t`f zPD&uXelFpl5>ie?T7u||Ti@*7*?cQ^HYExv)?I-Pr`XZPT$CK&gpADQhT_rCpa?-p zcqOh-j@JwsW>lQnvauM=T(ShzfVd%8EPy@doM+f5cWhS(SO^{7M~*-_kVe&a ztUzb!E5q{liRWm!u%hQtC#~KCw*XBsh{b=}ymevOe&+aHws6ySFnkVLEDxi9-rJ>F zGp~~c>(n0pwAN3V-6Xl*j^Re}SZhBXs*wYP#8c)wgszlQ;ZkwGR(M4vT02CQLgG zO!=ifmc+Dnb~f>QrO;mPMLk3n_qX243aHr+JD}pqv4VnfDA-$?0k`0eYkQqJT&`DGdbSBL#vPas&y*YjU10C;DO!*7uAFoEHl*)?kr=0U2)%KtDT$KjE z|2z+B^82T&=l{W`(fYAzSmA$aIR%K(jnS&RE(3dWdD4-I(Ehk=;A@2ljEUVL3#RFavL`eH9tJUUe#5oShd1Z?L9z zslLMuQFC`@cA{t3mPDkYI{&2@QfGz64r5Q9;vgdLDo;{CeUpa9!BOn`7Z4MsA~|E- z$>&}(q%$$%{Ba_P7wDlw4yiksg|gtwMcNK==ojZEnBChWk?rqxO>YpRC((&j*B?V8 zaTD#n-e15K93d~py8+1Zc|Qz8y<;S(Bi@Bb%hl>!Mpap@NK%9t3z|DB@f9 zFNLrZmqte==HEXAknrOW=Y|^M#(5@no;!ARVU?g&YE2co#QW8ZQeJ&{z z|A%2n`wzp=NVY&3Uhi3}>Vk{tP*&H6$kj12p2QckpawoVp!1$3bBz!Xe%JsxoFu%T zVZb_#ZeSn=!;0aFB=UT;{XjE$M3{h?iI0An^opYpy^@p5^`AuUipb?G&LB5a!$a_k z5Xb2{`RyZ%&DED2eaIGfWDC+(nIgtgU<;#%^gnN83NO%7&Y^#a8pU7Aef3i?=Ix0` zrwrVgMZ!rTZ)6$9AIvqFCS@rWVj%Fwg*x#a<_7Y5jt&OI*f)2plNO!?0x};yTr}V_ z1V?{R(*?}z-kqAFb-CSs!8TxALsPC0rNGw$+Mac~Z^4X50$_sxRzdw0-bP|KA56J5 zo;H_O`av5;Ro`vU!r?pxE{H$OhL*qPHVtXEhSg?dgbCwzrh{6(8?YNvP?XBa$q8_w z_xT0at3hoE2{fd+QeW98=v(#bL=b@Z-qRLCBSLfPRQnDmiY_V8ryupf)=z`4m(uKl zV?c0PmGZ>C5|5~+L>l*(PwLk#{zTiY>(jco!OFxOc3q-7XiNJhL8qYpjEHIHh z2(IpP!=qNapHtU+Hmor${7G9p{$`RQv#v_-qc1sSg+$X)5%|Zey7ayxwXD>AC8C)X zY9+e{!plPS6X4gq1vX8WYwqsy6tGpPMB=bVkiQ4c2JzWp<8DPq<`>SY&6LcaEwG)X z{$7?)lmV0n&13N9382;`Zx;gO16WjN}+k%2_|S;d*F-W zpq^dw@Sr|W+sn=?*{tW=9pM?tSDDl*qacMv(g7$a2JF9#sA|4Bj1rsFT*S*qvDCpw z$fL%@z?)2Nz$SM33<&gV@?8$R`nn4KSf;U!I=4*A(0Z1}n z#)7Ndl7q&W=;CM6Mo{6)glEeF$QYNkc4}rOqQUE1Z~V9o4MqjlA}8AL31>REx~h0e zkneo1O| z*6or<>G0qVzdZRS3VR3_sz1aLP|$eO5Dwog`zA8K4-}~1$L*4P>C#~ToY?=I1pJ&p z{52Of6oY^2{C>CT(&vtoP)b61?vtRajs1FGFk2`S`m5mf8=c`v@0N`NC?LFs3Uzeq zNL(w-ARwTOk0cRC6;<>q6cb%o0?G_GsT-|!o$A8e!X|lv*8-j6gNS`K6#?b z%vubrqmGq`JD{!W0QJI!x}NKLf;zYk{d|bkp2jE}r|oFBWUNWsnrDTuc|FPubpjK6 z0^cS`uWlRr=W|58Z!XFmu`X3*Nc4@$R7tv?H{bM}{|)qeyYbe@IoV$hNQiSTNaiL2$WsP`y}vfc zYq9S+hi<0cup-}_HN;eL8D8^^4ezZvS66R&uCe3Xhcav8xYG$?)YLYE&*zPxC1Pt+ zvrM$5b64kn*d>B$mS(X&gJQxAW1@!x&wY!uX4Ynr+hdTE(?k4hU{*dHk`B_Z6&D>7 z(o9a#lC`olizf&ndo~s6uq-$`sn<`3)y%)j30IRRLnzH|vRapg$xg0j#z?(UrYw3~ zFzFz;OPJ+;PQ@iqMWZrOOeI{B^Tz=5(uGmub6GZNd>NBs={^Q3*2=gxLAs5ZR@F;h!(8e&wVb{eXG)Yhq+ zM45O}r*;BiRKxes1z~g_)G$;j?|ZY>R|38DNzqj)-NLIGnJ%Zy)eDL9l$N4s@VOZ6 z<}RQ*;;C{2)x?6db#dhAv4`ua?HO>f?QaXCBn>$r zwWO4%^iF7R)$z0Sa-TuD*1oNt7X0oQ;wsu|l5pjzcbV6b+0mQVp>1I}rQLM`DeKyG zum>sQ`Fm>(r3knA-iP}595Atq{CIv#zS_}WM5W#S&!hVI3^JuDNUE*t!cV7%C1crJ z5{vhgPx-4+*u4n2H)URz4boV4U9gh6RJpmki!{dV(vMPD1EcvHEhR}st+|S3LszHU z#YIc4#mj!{>EESUz%zKszzpMHUttAb|S+bZO>nVr^n$;_T@D-w3V$YIBxl z_0xZj8r<`)291qe4=hsN)zK?h+HlS+i)GycgP7OB4^N-S9KWWRFRA#uN#N@}yDd&A z+*Kh_91k#xV(RiHi^tkqVW_o&NW(K@-`1z*nd7NPj!`>A!_e}}93k?;SiLd2z>xf^pOZF4>SD0aPm zKcBNdxkn|f4DvgKHk)3=66AC_wfu?1-0P)US*?1MrIW>)G!#O#O57 zCNAkdgoDu4=lw|%{dFR}S{=borsTk{9XAm@?!2#s`_Ti8GVP71HKy%;rj&qt0M1!N zXQ70NaV;90X%#pEE!n3h4Z3*R@q{Nm0>q^)=nONl5UL%MpOtohZPO)rkp2kEXaCYIT+gPH>`$vKf-r5A_c4yQ@LWF-*R<>{nR1cAKwmM?{|Kz+n;cZp^-ou5MgNel^auw0F{K17_83;0OS{I zfcFayWBTAmb@6j`gCi^Ms{^-p$uP&cWh;`C(K|5XZ#VCom0Vh;Dt$eWP?mGsY#8jP zn2frPJb}{`Iz4~6*2PQ+K(L`-QVEpn<0gd|=+yRbvytX@wYimC0n`Oe5VTm!{G`!F zBT59c!CTDnDRyQD{#y-)^J^xG5Vm{bA7f+Vwnl^BGLt8Y;H>axx((ux64$RheLYs- zOZD$Wwv&2x$DW&Gux16Apt#V6UFR1zJ}tTC)B8n9T;h+;$57QlIo=l-`MG_djSNg) z3-+o{&Cd{nF%P_vLJEPdqI9#}t{6Cx`J4;~kQ|}6-~__VGo*gXJ`lmGb_Xc16o z7r$wDMbp_tmHaUj7)J-IdQ+8XkB~1#pasMr1oG@woBQmBfwTCYfXe=O&F{C&{3N3U z*d>2o)`F()7!+|t2p3mcQ#jCdOs*F-8%;-2RF3t6IBEUGMDK1YoDM#Otp{_p;mWNp zsZu$DyYX)1#Bv{JeKMe_dmMmMul>jA1gVCu(1(1%fu~H* zfwP^m3&y*!L;%Km4oGE4#XM9*G;(pzVOG3lPb@bwEGj}S=1at>_tY7W#g&ropJl{2 z)%&c2E3~R;pb2kTl9gxk!PZTMg`F{9=J&>3DzSyBH|*JmH173jIGk+qw-Z4aUrx!C zdfQtlU|MOEG-YMPs9p|fXLs@AUk3^W*f>RX7>vJXhyf~U38;P~O3mK~v3k!1EwXtH9W>g8R$k7EJ(^%5CJ_{JQGF>j~?c{d<3A z^b#}^$J3S44GEeZZ<96CgJ3NdFFa|`M{iRSbXcm;wY*zvF47cu#P?Z2$U`WYb@|EE zpsF*k24LzY;%>EOfNnFa+xr#le5%I!_3rJeq~lhnCg&*ZQ&}#oSQt5mw9dA3?u~Id z8CVKF&c5JPf*I*KIwQ43xS`c?&HSa-y!F(iiek5Wp+zKayFIKkf)%}b`fxPNj=Nwj z0nItC-omO|U8GJ$w=w($v390qtfN^t+1r82@VwuAcT3-+;eF0zjOH+DQ+Qmv5-xzP zwSXF5k6<@_Ro*f<@&Kzja%PPJ6t#k}6-H%+OsKzlZ!>>WpNANYE7Bre5`}y%S_Xah zrNS_#r06VwMzbm@bz%t@ zfD*ezgE0vx*&uD5q#T_38KE>`&=F67GlUvxury3Vv_Kv(8=Y2~P@Vzv_xxB9Zz@y^ zs!`$FiHK-;T z>Ptt4AJ*QySaSf2^@7>{So(x+Kt{3z-)&;c{mR~bf*IynyL)H`BS5%eqfqaLsPw$@ zn13^fO&_@y$$0X)0(3jNa|~?!p=@=^G7UDXRG-LhTBqa^oP%?Ty|ZMc5T*`alx!TP z!9(AJ1>GN-N|5-KUw413nakPYe;D&t>=v(u81d_p%?^E=dei7_j0@{Lj%4bk!v?Nvw$iS_!aaniu6^~Ni3lKZi*`#qWtEeI$;N* z?0lGDyetcqGc7?-jEiLPkUwZ7fD^Sv5((RLQ9mUP78ig0G*rkQhnssbm9>hOJuoC# z)6HDm4kM>9WRO<&0#`j$oHL`4M+*)iTNjS7bAYf@2uIHH(><_B zvCZP(+&A1gjci&)xQQ#5X6C0CPRp*+g(-d5A3=lJj2rMn?|1ty{621O!M-RwlCc}k zAD*?(+9@0pcGYEoGC?P2ue?+C6V34k6!U5Wt;OUn)f3C5ga6v)Lxx6j`bIM51I8D$ zk17O@%3x+rl|c3o!-DulEMc0B7~s&u+TW4;RPpT?FV zMG+KPAoS-x4dg!DhEkW(q9#_~B8dr@1PUMq#t8i(<=#f%t-ri;dy$VI^ymuT}HNW65 zB}Ix24UG@+7jct0Eh^EIoFZmr6G60WGm*oiCDzPhozt(gH*n{&2Z5x`RAo3j%Sl?9 z9BCkxTYTi;o3{>RB2H0fl{aCcKNia+SJzNhW^$CNWL*b+~y9rC|_lz;CiMgsf+q0%q8|P6sW4}WjnvI8|LQF1`OU|7p zZL-*~vs0eUCq=LHPyl4FFzo=(T-rKP_J-OQzX{tag_a+C#-PE15h)3)B`o%&BV9nV zW|U+RpHc3m<`8g7cZ{oJ|6UDPTTdppdC3?#QID9*z?9TmsEZm=d)J7Vnw(rfYPwzp-1tXo)ZBG~u)wQ5lJ(Gy7)a|^vlwXeiVX0^ zIV?kz)vsop5cIRR)ZV8zWxvZlm<41?Q0oTj{=dU|N&Z+s8)We3@T-KiQ*a>Q*3Tf# zE8x}{DP>N*&7|(_K-LY1{Q42SsD3m+8(w}k=nk=4gdIGf9Wb7a2)10RRZW>z#O1%! z;rCHG1!CtU%`*;6#K4-PFp4M=V67t51Li6PnXSO`hW-X8qEgsIC9+Z=J0_xd^kWT|;X9 zM@l)640%~-GTx;OuxY6j1o7nvqEolaz78k}imW}11110Sg@$1LnsXh`8*oRgH^%o{ z-uL_aA7e!`Q`tlICn)pJWdEOM{+Nva55|gtwSl9}|HHih!#?<#_dl!k7-|*de|Tpb zTOg46)72TRWqw=hr9p;(KfE&s;<`L>6H{X`n7f_l>3{=h5y?ctu|JW%_{7H!X477i zJSp{F(Qgv)!$N2>YkwbOqK4PjG=Td`xco~Vjt9vA-#*{EBdV`#G4l^o0(0q$Bc%JE_%aJM>(M#^l;hCo2@(B|Qg zX5pVMz&0BB@AC#zjqAQA)b4jm3=y3$;_RosYSX5_2z@Ax_$-K?U=NLv?TD;=e|*_F z#{2)%pEy|Ma9yiEpqLC5=KKq264@1rB->;gQR((XYO*X|jN ziZ1AO^htn4^iSUpc5%BeSWYZCfIwaJAnV}#S}{*Xsgk^1Gm`X2ZrFmA z7(xCj7%P>OQ^{)5U9H>PIr9gi97Si8SL4ZD0tsXTAe?lGYq?D`v}yp*r^gMO=k>!U zfjDenwA}Y!Ff6n1SO$f@yQIMjs`S|q62XIbEk(uKB()~N_5h^)U}GF3-rSD`=F6yF z-Xj4jO|jLgkPtTj$Oyv(_no9ebGbo|%(OmIhLukve7gXr@(P0+_oiQS>vT@Y8E6`0 zv;{T~<92r>ub(m5GYHSc$kwwN#EC@{NHGJsLAqUUFBb^}UG`AH+2j5?{lbDyCe^u} z81zH>yny`g2m!JwQXGzdE(fz?&KnKtVk4^C_)eI)RfG5$k1;nV*n~uQ7 zEy{lQX8f08EB3!>qIUak5BOs`g3w+jpX1rnIq(2rf$eKeIfQ%njm_E7iX|pa6L*tO z20cJ~66W0&t&`EsgS_@aQ8!D*Ry+Wyw)~lG=(NWT&8Wibx?2F;&%?#J6azW)N0F>b zYVX0wbhz0K+L{hNcddP)N$5Wu6j~td^teq0?Gs=8RzmKvr?ZL>2cvmVqa7Fz|G}H# z7W}F$T<2i(z5gJ}ZkkQN6JQ-m_-T@$_wzAYPu$1FJ{6u05ggskgP0k-g%i4GX>%$k z@CI+*%96QZA%L)$K98!ECnQ!if}hQhZ0L$dtOV&fuIfw{A2xv zn9A`aGMxF;)F8_t5tXx98~|%vtsiMV{@r#KC>c<)_tQR(0D80nL%wc|b#nFCanV$f zq{nhLpF#!JXb2;6F6&c{9fD(7vo9;_y&(4Op(gLY0215$bwc}u9!SuKp$Vl35Bw^% zKb^_Sr=r47TWn$ad>7D*uH~YNOiGyvdxShxP(Ttt{@R2tChC9^bU%pAeSMU2A47Zh zPzCo2vj(k&sDxuVt?Cybv!I*EkYr`zk!i7T*Z7%QS(c4|9+b?bab?_wv?|?ZrvB7O z>p?lPa94u#S5ELTSwI7{2?G>_0a-8#LGqxWX`YSaLH@qQlKP3mjLCG2S4^ak5~YEM zwh1I|y;_=6MJw554AZg}H=MeH6GBzx6gyeHN~)5QplQ>RX;Ts#LXrGW=h^dZAWt&g zQD5AYVU5V}uV;X^6400Yf>T?#>56Hpn?p+Jr;H;9|L3bWzLl->f&w>KK3E*7yWiq> z`idy?f0)3LDQg`R&W#i4WeXGdX7H~$Iuq+LBfX{xK=#CB?xk9Il*muATh(}{K?v}kCwUL5dJ$2pcT__2sxweEldRUgIRGYp@ac2|^n1O;gK@H!wE*{J2e96r0Cg9~C1A}d zM70>J9Zkj6AwyQnUFiN;(fbrP6+)ZsA}24q8ELDx(oajDmMXxP__iMq*RvQXP~9F`H`o;weoH ztbzzi!-{@I6|%*2wIJhyq<-sZnt?d5UPboCqjmcOBUUgm)??VerJ{x+@T{HRkImhA zigg$=mdX+L7qjH(8M_7AQt6%TO{dH?)CoYP>9GDnGc zwB^()p?XqRnS-495A?O+jm%st2NqX7$_JS9knzdjbN5Y4#)oO0qzXB4!@dW6IFt38^xT>f72^ z-RYY^Df0(23I1&^i9OZz*VDRh6-loa&n#VS5I?K16mQ5zV`AGP1|{vrJNAY7&+a4+ zLn^1}WX3hszQE{blPztHzV612PpOX5v!SiG$Mut5sb-Sci%wjt^TK9XOV6igp0&;n z=#xf@0u0?HAzQ8M-$ze zoY5(u_odm35doYV-@z$h&4ad57gEM+h#fR_8;BimtBCLYh+Iug&RSAzq@2B)Z{*m~ zFNt?0N90EwBpFLzeyQms`FcgjdB+|k`}`FmQh*iyXX@S1U43^7nrwc&Wb)3srW`Ik zrafVt57o>0yYzbLx-JN;$W^G}XOwfI#XJ$xDlD5Ke5~>+<4uRl19UC4PR{RDUou`5 zJ{a?4Uo_uKyRX5HRiH7S)z7ym`8EnxcoCX7hkF*5o%7G)F)fN9?zvSmm-Vb7pJeyf zGv+>XnN&TvJNpgTXFDI1V*FQL8<8@G!zN`rH!UeWH#}Y2B7h~zSR(#9^ph;-OjyW8 zm;KZ|i}4P3+p4hbF5Mz5klnUg&g?h&LS<~7)=2`ZDilu1G))o>jI%PgCcHXvlqvl! z6*Y`q@HKmp3a6!+bm>MiHWy@EOv!hu!?7!yU{q*7ThKacl$2j1=Cthnc-Y{IafV?( zED$npup!ErC%C4Kp6l3Zlk>%!f8{uz^}O9BBmlraqWeF~aVu@W|9NiR#Q49Z5C2#0 z+y9{t|I;&zT(Qyt3@ezWd)C?o&^3&P6#^XTn^%}L6-=rUFIoOCeOOAd134w1IGnHy zVK$iA)%Evr)cs`l4F}dc(ntqhy*snlYfM6d*-Um8{mT|_uigNj7guWSvl?5=#pB}! z((M5mpMEr&XrCuGM>kqM*f&&!r|C?=4+QG#fckIGjQfvnJ#yqaxM)D)M0npeg#*md zeZc*(!m*(V1q=d_r*VAfZ%1|kvhRI8j9}Fa9_F(-0=6pxxdRCA#jZqH=S`U2vwiq# z^|F|rGTpzfpJH`BKR0?tWxF#R;3@){cujNM;RT}z-mgBiZXf1DM2F|#hZ!Ef%Up$# zU(!6dYl(Ob3Wj10LWE9kyO4M$#g2`>9pJs|uCLwk|DFE$^vDE6 z5{*6=hC1Rb=!HdEp)F~%cy z_0xQJ2auifR_3516KCufU_+h`8hj6qL+!0is%*$nmN z+3(Yh7UXd_1VJoPj$f!Y-uiy->8Safc3LFu*|WV2K7L!05Q!IrgFPEbW7%SK%OZy+ z&EdA<`qs_!#i>~OP)Y@+Q|Fqw^kAAs$cx0)wN}_}6&upD!ZoTDmo13pE+mx@$Y4<}H zQHT45e|bA#O}cBoFIA}JLISps#oHYRc~Tz5%I--Q05$^x17OClzVe766pI8iVJ$kZ z0b#v%XLv!{(i0UJIQkITu2H~lLA)GL*Ho`>7&tzI+B%*Kc-#Ygq&7;(kPKa4DzC~@ zi!{p96Vi*T;9lkTXezK`hp&f48daCJC+bQyb)0L|=LZdk8P(G4IH7gH^(xC0>MPZU z>pRjNT3k!BQLkxR^MWY0bo-*kD$fPgDEKc*L#y_0(Hs3OVNYg47n$NwaP#FMKc=kL z!JknWcd{nsa3oIRj4$fdSwSoS_w#Y($pY!(Jud?W9*M81no#{)1(mlWe9s^<1dUtS z`qKe$xPfE^9f#OCx1tE|Sxa~v_wGcUg(@d@_13#9ABJBHPvNx}!TWCA0bgvW?0O~4 z?fZ>8prmnKO%~PqOt3FHw{;f;UYUDVFE@bV2ht48>e7*VTY-NQu%Hr_-|HP5Y#lSj z^944zfW9YiujlCt%C8%EQ28vg>XEF6)hAFXA@cMR=@l?l-RMyKNrKCPJeUGaPv*tB zOFMB#;`M?p;LD^_7#;>n5aINfa)J`~%yTp)84#OChXU!I4K*LH(wXN}ws9ehVKl<$5;=ymCPE2%8PpMX~eA9byic=0yS-dyi3@E)kM0B zlC*5&Jr%i?v%z;c^u(pdLIma>}!S$yPZgspmpkF6+<4 zrOaoCxMQK%!<2AR2ZnKKE2!swPQK_;Ry`}b;pLn13+^s0SbF*}?IvT{jH|XddZJ-T z^h?-)g)$-kkgz>gcx_~5pCLyC@1DzPB_T#cJHzkyu{~V6{t$|_g1l>iYZqDo8olE} zZ%)IC)2t4i<1k|b;1jYRBCQ_f59{TdTrc6<dmgN>*sagRV`vw`h!?AUT#(lB6+729`)k8);^tAIY<*BYLVaEdoox7?8*V)Efh z7vgV&X%A`S(P%}rQTTpq)mq<-wnb4draUEg?#f`93gmDL87&Dc{G?ZV^4jQH zuo;)~OSEWxRv?nVZcVB#FFF=3Al)^G_pt8KgXm5eiM-TPnMF2gL#eGpl&SSXra}f% zqBVC;V3NR6QSMv_yNca}X$dG&2uZmlJFu8I2|YBU%ktg%2Cw15YM^pbCU2blW3btU zqgklSf1=7-$FN&B53!`G;2kF+j3Q;S8F-sPX5(#ORZX#2-E6gcIs6C}~5V+S~-zZi?Awc65Q=1LF!0Ux=Pr+i z4o~Zt*Tg=oP#9Yvj&GZiP?42Jii@R~P{iR>#{r~~$WY({b~3MlOyS!y1(@%V%Ak|N z{Z6H~Mh@0YOY(4foLIV4Ii5ut_l;GG8nrlcL$YeDEexi1QrWTL#`C55Y<+=iUg-Co znhg0f|BZgUZO?_yCk{LA4ltL|&pzeSe*#P8GrP$D!3mNd3A8@*pgnYuIClb2&Wyu2 z0`!#NGS9u`07y~bH_NTF=FUk3Wsx0ybQ*1+4LfJDy5-(>*pYg4WGR*!Gtalr>3V{n z-Dm^il%ll{wsG6P`bzjpLkbzofAMYi`CR|_Jo{2)-ci+OXA#Zv8xn9F515pOsugR9C%DEgj-+~%Y-Kp0YCE7-J3M&3>TTKYaboYu3CJwIwoYoaAwjJ%1kBU~ zw+LfR^p0vXb%u&`4|=oprM%Y8zLp2;O%bs6Ws$7OQWBdqBo$_oO2V=0WVFI+HQlDYcDOr_bjer zyTP#MY*%3J!&BV*rjEp7ZEuO#CTk68N*E+;FLZY*9~}oo+m@Y@-}tQprwPd=a?6|~ zoa=4j1z9Wg?jZ?TDaDx+1cwe5U)1NyBUz18?e0dV6T#SJsTe3XdHIW)IAA(xg=>q| z|BJPE2(zrwnsw8*ZL89(v~AnAZQHhO+qP}nm05|K-`@A$)7kqp&VQP7J*z#(m@y*W z2veOi!M}*u)et8ivc6aCUwYjPXXR$5il0TNnhF zgjY0i+fCP(fVxemt)2!~q;h*JRH82qphT4_*SptDg(_jT*$i}fLVK9c2*g^^`RD6Zq>ZWux;gZvSpu!7=@~f_+Jcr7h>TqHd{xUq? zJp~z5-4gR7-Y8fwMMQ=f~gq<^`t7rOw_w^7<(g*IX2d)(%S!JIbnH&+}pUT60-&tA~AJCTIQ&U^QMV)GGTuGYBY_O+KwQJW0S>E zrEiOPqQH767>m)uiHg1Wn!;MtyfeX^>%8YIGVVOK2V#9sN#|yS2wrDi6W|a|?_g?# zXgqA=g^GZqU437*&Ef!YX#AP*L1Va6f{{~Go~{xqW1=nMQPr3gHQpR8Jb;EJ-se7s z=!&Ph4t2Dd0>A@= z*qu=#DSR))YAc}&)B7YYCyJj4e$4|#<0?QWpQ&6WgOst;x;gJY_X)Q%^kILX5t&#b z6A0nBecqG=^2L>es%`VdiK^`Vz3XkCtiBJtcB_n||I(4lr3}7nQTj7c_&WFHS>_&& zx`{D@_Bb|_jm68C;^k{K-5^>WC}>Y@WKiZNMbRWT6cRg?eyy(=q#^k$sor$%Qsiiy zrOFxBm{cUkpmvva$W0s@q5r&P@LZtLvhT)duD)Ov*XFBv@PgN+4X6Ryy<-r{X#2@w zJ%LgogG0TtCPG-Fvy;&xv@2+UM7Z_=8A#%|^G{|h5vztW$)mw?RhfjGf(|TJyFut? zSCC|(0%^1)2TV?ph&S$UN}z8}KCV0`kYZvgNl^m9htuN4y>^r)KbH+o^OVs5r#oqX zDDk1%x4Ea)>Mgz)zNj&qQxv}Bp`>`DI3GwVBWIDGM8uSU?VtwDm3K(B$5ZJ&T+wcTWLcHv=)SNI{<{FQT$^zI#1ZZh+5g@R^ zMo>-Z1i4B8XU0_J7?EO@$xRl_dONvDt=z1fA(YMtiu~K)TJ`4p&%L!98;Y3^5dh#H z8RtI>JeNQ2YnA`0$J)WpP}k+(-9k_y~u`M563OM5N zeDnn$KJT4S_W`jhWVe53*&GuZMe9hivM|2Iq?CPle0?Ap zrBDYbWAF&J!#N7{^`9|;^rMF=l%tVDiNP?5^uosTnNW+2C)a=apa5C&Ah3K%lXS=k zvR(Qq6*?A8b974n)7zVHM~@{O)E~f#`^oP$Z;wiESF=kOa$3^_AHxj$+wX=l10#=+ zfs_JRBm-mIwBHR$gdAqpLqpLNCFUo~)+a;~zvCG4PnNBqbVV!vzC~lKcv%XF5llG9 zp5k}yv^euk0aA3oEi>8r+tDu^Vq~hABQFkG-;s|zq55q~G;us`OJxoUVJI=7J~%#c zW@Dav1-O*6^Vakz$j=(dYc(S{D&xF?6{kK&n_ELZ05t6fov8vj43UtQ_j)N z31O;Q6|}`SeqFxUvWHp;s@!Zr;5qQEJX#%EZnhj1a-P>wO}^(1u)A1 zvkcH&_?5LH#tqZwLk@-Y{T8mC9rUKbCJq9(Ia}(6wvb4N9A*VMBEu?-4-5KXpKq10cS%m~M_s!}` zRR#elr;$xzm?iNY^R=OVqBKE;y83s>r^cxhW4l3VV#Iv+WM%wRh)pF-KBc4!C(Baw zKHShhj_3?E}cI~)q(vwa5v%!Sc^^z21 zuBWHGFHG2S9`2tH?inxOD>onVQ(DCCzmet!R1i-^-+|qL1pVdD($Gp=^WyQtD(##p^7vye*oSff5XwcD%iqe9WdsjfU#Q*BS27nhbG zWh+=%FW$~{O0d-n z_hkhc%(77Vxj3~p3%B&>6}nKEQ2Oo{0Uo;2@l?ASCI~>i_SvqYYUAzY4U|bY>%tE*3M_~()Wlac7B)aO$ab#QvM3(OnC|%vUIgE?{VBx2A{hPO?DXLwK{|=_rYy(o7zpR2#zEr*NTkv;nA(ThUp3hO=Gn7~!DlS~X=Nin0 z_L*`sYZf$^^1($1Bc86lAU(cSzlUSa`*=opEOP5Nm4X#wMq4~#JpP`rV9MApbt#=k z8E|@A7D#(~8!mgIj;8YJP2c^~jsEb4Q9OhL0Y8=p5#*`RQyvY_5_k z`vOZID!sBq-kKw_;kn0BVS!usl)jI$pyP{6-c$O>{8ZYUSW-P(UJL>ItUc3Eca=17 z*%`A9+an;dL*1XWogGZ{#WOAN%Ut~Jq-jhN(f1Dc;gT;!(HT7OW_jz`IlrAyNlNGF z^t9vJNQU7Oy(UR*e5y$nO2!TeA5J#Q?_S2yWa z^R9Hx#u%UJ7c9tWrKeSYA09C3EAkYIYVp_}N5E^! zQ6Flm%Uq^!3^!@?^eSlBsL~d-20T;uG`n5w(t4B1cv|rPUVBA@Uy6(~o#`@vwzt;U zw8b+O9Yi{g?g7=Apy*H`aFmCwZ^#rzy}yQaKa2)ml}d6}dH1zjr*W6a#;8NS6FQuI zdg$rxYV!%nPLmc_UHqxYL5ogX3~VwBaeS|WD$i(RNnUKUnqOM{%GY29PZ;SlFpe}~ zW5^h5P&6{vV3xcuFrR0p&G>9FyJ$C9ELd+4R)k+E5pJZGk&Y}epRYnFHlNSS)@0s` z_}4Q|k?KPwv^_}Lfy4}0LB#q2+?Y#3Mo|8q|Czix8>rvL)A{{VJHWmDv$b7V2q!+3 z$gC?;q!d}&3j+oY4h|g9yAG8*vCDxB>F(;mK}?Qr3f%aR0iAH75YDJVIZLX3&sD&# zU#wvt{{=177m8GrP&DQzPS9E|h3eivCederRh2|lFfN1%?P#r^^&mcA$kFeN5I5>a zT%OZFlnpZ4>>faLjO8%gq^(d#+Lcy!$UqoMa*D4eB;)Jz66pNU<)>9S24vs>El?mL zloOkqzMP7~7Oot0s&=>QB^uR-J;qND3Yl(8RDhducF(9>>A(~7=0SA3<^Vb1rWT7R zt|q`E!T@}zNBAd0u7g6E(oZ3w2AU2<-*LQA0kHY8KhJ|Mk9+(w_emU1yq;gq@gb}3 zcR4w)!PE+90KIIZlC@aM3@CD@2X?wol~g6iGW`O(Bw{ney9TVKtW3mHu{%8m%t4g6 zxJ)8x*3JPkZ2X=&7*KGC*BAVd1q!C!ot5pZX=(fnqIeY^9Q{`o4enl;24H#LygAr2 z6`362ABDQ-HIYlyQA27V$dYiC2G1IGod%lCsOTv!wJYrK4NXfDe^4;uX+`04Ie``k z@yM|!+Sz>0+^=Hjg8|ZT9oy9BS@ql&F*woaxE6+&q7CuO1tb(uq3nPV?F9t`Rs}DO zH?x%m66QA<(v?))kfXD+Ph4b4jtEXvIW9lZQSXen3GHBoWzGWFG%d)0FFg7bA)5y` zQnwjN@vpRLx{HDpd*N2~^m2xDd*ayf^{e4`l)(&GC|phAko7lxPGnN%jnUE3Gyotq zgL$mi!o}Fg-q*2BoJ&CN(dlZ`ZeEcp#Bit(_4OORlPuG1<)R)=s(8#SQlm22bSN$u-p1hlFe+UZ zU_x<%{kHT}>j7(FOF^t_&df??JINBv&5I7GGUcKSFSCFd`5e>CJ*>ttNu48@N`nR} zvjhr^w;}!3#;3W=-6uH8nT(}h<(>=O`Tlrleo`)JmSyk^0~FmdxTk!2We5olY4RCd#xR1xX)&0mA>GQ0vG2ipqYSf(7CGqZ z1byH$`U1b}(oj<`!GB2=ixkZEXIhM6JG2IDB{ik=oCiOi2Lw$A3=VpA>f_<5dYJ!FAF$tnwgz2<=^4lIt z(J@1?;-tecIw3QWJw#yp%H@QrZZZUob9ZWlUDT!^8Hg#sC)WWLM>^*2$QzuOgq&2t ztY%@&hfM@abu7YqHDt2M!>n_?H#bLVw;@`Dm#v-6ebiif6y>z1uwTfxV9AT^%_#it zacJSGRM(OdYMP~*c7Kkxyl(uyZoIQ@B4oBh(Z`V!dVuEz)>Cm(_uk;}*SVi;cA2Y{ zy_Mtjz|uH{?%2_MQ=)1Q#Eu|zj$|Gb_M&;6^L2mXi?8ur0LQaQPx1?y*0SnrX7sO~ zza@L;FWO|B*v>WZUufH%!e%``x%Y!@$_^bTI-H(|mrb9JPc!B}@c)cUkoUiEVL#Q4 z{|v?dJT7&t0030~rwWImv!j!(^^dOc-|>s~{~f=$$&U84271=oI7!Lb&3;>+l1nM5KLsl3jku8ZLw^$vAj*m$ zHQvVuVR)b<)v`+x0&xtm5x|3bA{LPpIYBn16gr3*6);Z|hb@eY0ls)-XhIe-$n8T# zueC>t$xamD4xl@a7y^>)rs#)$IK;?}Lf{l(_zco^dU?J5PLO`^7BJxWN914&vd7pj zz!%xATwy~A`ZEyhJayhX6ox(6J*`tVA#G2l6apT-q2T&t)3lrWbKgBVRd}1Wpl=+KZA51wJC6n!VFDPfBpp zr-sru=E)X%i~`kKo*jdhJ>b@pmtYMwJJt?*V@0B80={%lx_j`AUCM4!BUNHtS zz-5enLLby#ntjuHbA{`O!n3o3K*Q}ZAAo1VZ&CoJh9XZ}7bq#~Ko$ciKk@);}7YDz6XXxWY2F+MQ)CO4_VSQ+13L91uRLhd@q2@|?^yXY)1gHc%3YtCby?Mm=3nZuNV z+Bg~bz?M>JEKf(dWb7@5OLV%>I6A9STD1x%|F&oi78CeTyvN~;!jZ#Iu_XXSX|&kt zcS^GzyKbrug*WddTm>d$my`z^xxg;TyGba{`j%IcwNyu1*m;*bxALxL66{xGAv4>+ zysrSAzj@|WGuboNHl27?fP75bjliGxvL3*s$2;TkO0#J2oYnyW&f`>GXW3vOl@97A zv%RH0YCC(&5Nc4Rx-4)DNgI($;|c^Rt7_6Pc;z3mH&oP0X*u}P5AcP#Z0^y9{_#X# z=wi@>c`gaF{2n74=n?o7{xd4ge-?tTQvz)6>KMLJ>!o+KltW#KcmutB6YR%CtalBxWr+f;uh1Mj*Qb6EsGg2r+3I#vMlES5;e_y@lBU`GhkQM#x?eqE!ghgH!G;WQaY~#JDmxw ze%d_RGdK7ci_hMdUd4%OGRYl}jixQyokhT2{kl`(`zi`C!&PT0@2MdkS*75DMS8e0 zdAQ)tQ9Mfw(~k@p#1SLHwt#c9B-&^5S*^j&2qY9RUK7-e3ybk$G;egfTQ=ZA+LLv# z=XUkTv3D~h)mq*b)=Uih)MnaUXV$|SjdMaLe-kzeaa7|#Kd9rd!{Sndd$$;&xF}8v z;zx!)z&=pUs(b$a2sBFNTCM!(yHvuBho!+QAfip~xOh;&tGBHXnMPDUt#wKoM+g9C z@;$G}lyu%+N>&8xpD`0iQ|r8VA?mffh69DySO4h+c4&0y@#E+TX7}*N*LCMQH-~TM zzB}~3SYBC`iQ+=pfN880wi@906SO$8DY<5BOm2JhjivXn0#NLgmtx)i#dPrgQI7C2 zL5Y3dz0$?fUORFXyOGM+8OD8U@W@5D05=lDeuWvpRr`g#W9-zWIXB0Eq`qkhr!5dq z^e)pZ%|3|qTYD>%Ka-)@fXVo#L}S;9`M6|^cF7dd!*$yNxsrOO(YsWI+saj5yH8iIm4Cv=)tm8GR15uTH-1gqEr;3Vj#s=B_%Z9;t3C_% zYliLGBigSc+$l79LwN10%ei4Rz0E}QlvSPsedy!-1_Za3t!2D6H;@h}#s2z~Hx2O$ z&Z|b}H%?^(_&>K0&W4Jj$Nbbv#f?-7%lucR@0Df4&w}wwDv8ZVQ60Lzz+ByI#~TuC z=I1LK)_l9`e5^gU5+aRE1u3z3JowhIIphNZOtP0`1@5`q?PmKUo~4BncF4rm!G9Tg zGHm_2CQp@#15M!H_o+TpvH;8U;~zD>L?bJN>@nbaScjK`qe z#!9;93IRol--84q?wE1pPdVXLUE+M{$Xe1y$by7Zp0#BsxuTYctAJtN4q=USr&h)U@(;s^$W=+bv_A8SLaut9Wke7$>U7T=G5 zd&~KK(&G4-_mLL_V}tC?<^_0}ds2&AQ8>?oY12mizBX~fs_tSyg7)K{DP8|VBn*dn&`S7uyjgtF@viuVVtU2}Ehk4UU)n|?D+}~Lhb6Rr- zjk1}21!x9~V&RMubzr);ISy`YY|M$}5dGc{f^@=o_8!RV66y3!&~aN&XzOe8`JOXx z4f3!n%IE{6;T9HzWkQL8h_FM%5;;(q%Z4lz3>k%Omb0atVizic$0EWi=NV;BGuX{# zG0Ns0(_0q~6Riw-8V6YEhwhqlw#@ny$SKj^_MQz!l9Btz9k_^iIG#c_a#)tSSAxGv zn=CmfDny=|TRe1$oClC44d~>KS581xJ3NG<*7K9oM{_D%zM8f61DlRLj_~qrLrJALPoi5-a1t^h!-_`lT8I%*w2&8s754Ipt3Q_q&hMrt& z6Zlf`(riiqSLD6Tc;KtI60+k1#(C+1MwB0IAUPtZep%2*H@+Bd3?CXAkOT}^{^0TK z#al>)CY|P}B*L_a?$MFj`C#{9MMw=jTx+c0)k0q`M=k&iu>G9*vQWSwi5h!qi9zK} z(t8SR#9t7!G7_j)^~p-}@D!w6)2lMF5HHBU?HE355rH{_!AXe*mo`1nD)o}gC@uJ1 z*W)pcslPknA#g8hRlm%g*Jua~&aq24YBj?5XKk7Ehf3RSU-SY)qs{U`IP}?`MuKF7 zuZuhwg>!+Dv^M{M)%E+5HFA0k@d&9BVVJuS>fi0AttxeTil)auQXYB-r4lh=!t*UU zNmXx6&|mr6xSAj@m_#*b_?!<-bOpxP`IP{^LFwm(N#*?|heD(cON}RS=sBEmx3@%G z6roZyK|ej?nm4ZbEVd`jU{ONx!SoZC$VX2aCZX&?u&-oGBi$f((oqJVhaue{WzI;H zbA4%Uq8DJ&V4QFWj0TURvP5|_dIbxA^R4HN=HvaIJ_L$t0OS$k=E*BXge;m5-+(tZ zU$yY|73Z{R~VEgQ8_skp%LI z2qZ{RFw}spqs(jRTW42jNVVYrV{$J1eQ}8F$sDvV-{-ORtA^DcC)vI z%eqtttXDm6&>{t+EJGM5n;NztiUtZ#8db~uE;E_rOf_AYzOwIx74SxK3&AVS2;rH7 zKg|C<+1|t@^QJVOZ6?IhXV2oV#>sTb!PKb z`D?)#tB=2w4#DkK{-O%n=h*Q`BB%{@fYr<;@#&S?$<=Ru(@XA!)g39AG}3$ zG@&0iv41Bi)QJXJBIq6mT`EHOH>nLy=holIvcZY{Q|qO0v71NWXdX%XjMzCk0Xb`s z>Z2kO6lqOTLF@6s*n_vgVOphQP}Ja2(8ZxDHjDAZ*oU?io9bwbr zWkL}mspU@sxJUmN+^Bn6wQ{*OHr*=WL2}E_IDA>a~JP_;&({vMM!qQ}$ z6A_)sroxGKT5pPXRz+5n?$9;=)hs7o*NgG6ryCya6!SO)D;u-P@RdSf>9%!a(0hx& zS~@LJtPKH$-EK8X+xj%b%y3i8=^2G;6b_)~nBt%UGK7Nf6>k@I3WfD-W;~@g2bof7 z52tM9%`48A<>VJyvCdL>UR)bm6*7=k3eKzI${0{^0_d-!I&rh*BE^?RIGhcU*z4c^ zWH=M_8KEHNL2}-wecd`{q#-ir;cT)$C|D!bJ?_wMk}4! zX|B|gS!9t$izTeqoTKesRx8ZQ3j-u+Dq0-KDJ|<-oHXZ+6yz#ESK;K6t$`DS#}d@U zb@@u=Hj=1F#rG@LMdHqf_2LSdB+cRri_!^Hx^rGJxWUqK8zARAq+-W~7u%RtDwe(8 z6liy)m~(4`Q`jg(^{uw_*h#`b5$YFc8viF(8|HN+mAM`sMs!#g37rT52a z1uW}4k()_B?^seA8-EhZFmTbsD{zC8rg|D1ZM0Md=*fc>1A9zn+Q>*~n#j$ESG}SW zT-wyeTz_{$s#IS^{pC}4_%}fabrPK;2JOFd*Yfpq9PmN5$DjVvlS?PcQ^M#yBzoNA z2g-FZ$9cGtn9(ipcbf0rs<~VoA)-sNuS|HGA0DGwNq!+w-f~+!6gK!Myg5S&-ZWc0 zXkQQN6tS1)&iWczog{tQ5DSjsglt~JrP z`)27uce5${R|))fA7&r+TJ?4EQ$%RJ8b?H&i1m|zB2>YTs!Y2t)uiER2*r4gS&pS* zO<=u`3M#=4lpyVr9anX@ho7DRXCbg2Pl)^#A=oF)#3}2rYc#< zh1y;D1V6&y*}jjS`o2ic9y7ZPCOz$4@pB6SpUniq^y zhOw+Uw8>J?@qvHo=wbYtj29QW`|*J&DW#K+{y>g0X#P&#AAy?nfS8g|#~Ce`6Ewyfo-12Z*md2%2=3TyIvn(- ztE7_he62^nu8~;(qx|=S@mjhK1OGPUP+8-w+I!u6^P&08M15Bxp!&z*(O#9gww+ph zF~4dJbz;JC+V40c;bO)s&^#epMit;GwOce1{!`F9iMVHQTh4IcaB3v(5PYkIdieLF zv4gW`}h zE--b9fqDcvPi2jDCp4K?Kg1I&+A^?ddxi$pJ#56}%>>HgqqB8~LFeUpn*o1o>D#I} z143>SEEXpYDP1JLc?u>W4iBe{P5vN-8G_U@h>5_K(pMkW171P7*GQ9Y&mwc+T732D z7C9!e@PwB{jwF(kG{5yF*83FbNN<6Y3*(O^|ODmBE?*+U8+~nqk(Rh@z?l5f44MCT7@@ z(FYg(hMjJho%Xg5rH|sk3vdEEpD~A)UNqA|9C3cPHLRdXdAILEa+u7V_*;17z z;!KWYR6-S(oY6KeRuj|V$?m_n82hSK{mg#z%!dpH$kzdVI*_cwTg&5y4BcQ?=6G>Z zibPOPTP)!vL`8o_CCe&t(y(-AQSY|u)K1HKJTN&WrB9gsyS}-3IF?c-<6dqpfQzBv z^4cq3!m9a)Iva)x<$gh!#RJnor2llm+$Y$bdUfUNI|rblVK!do1U zkwk8jgR?-K*({fKgEI4a*ON$Fcr9*CHAS7Y`AUzrtsn)c4fv|{QaYIwtzmF`vlU4=9$l@Dm#P(~PKRS|t(omx*fPkCn}}wic0ka zQTJ6k4!Eraf!Lf5Mv$^+h5?v&+QuMqXF;U$a>D{^5V|N3rof7Nhb8lNrP)$qS$@qW z<+9G2GzB;3>ZHy$oTKtvpsBHT%D%0Dre4gj=OT+I@GJI|cA!RbCb*vu)0HlbwO07{ z>^45V$kvvFq50o8$<#^aM-2g2*|EwBPHyjQ;RbkTV1qERRiQ<7YgiiZ!g0i~QBkIi zIT!(FcB9OL{xI#r2CkYl38OVt&55SOvTCbPha0E|nf;UB;&t?Fp@HoYAN8979+{s> zIpuIwDtj{YSDTe*PA(GZ_>vzWGv~ET>qz0>rjkdjLw?&Rg@!7CLo2g%bg2m?>MXWOW#Sl%yCL;q{* za|K_%B`~*t_IC+J$c@SC?-Ytq2%visI$o=D#BOA!F#hft2X#&Zm(73PmXL21^A&{~ zhS&A*zp3}EH!X8T4k3GAJsPrp`dbgOYRDV0vyDl03t#;9Re8UM|Id*ylJ1?%6%+vA zpV$9?9t`bd|JQ8L4F8+a@ZXfC|7ECQ|1s3WY`I|5V>s6_|I1KQB*OM@LygrxhMKmY z(a=NuEU_+=NHZ2X0EQ&i!S!&{j*e#=3qo{s?J7`-7t&$@R-1W z)fH`%jL2Yq3zyV191r@S9Ee4jQyc=gpR5FaT@ZZtpo3=s%{h|6^i&UtzM~t9Q78|g zCkdMFT3FV{%ZG5ykvdR4qC6zX5m=ExIHLPGZ|jnwe^tj}}L7mqdsCSDLLJ(za+l<&yX~KAwmdJhW@QQ~7 zY!q`Cd%;Oz&9Gtlxcorub*M}!vXB&|Lp%t+E{0oC7*X8V9P*+p!r9jtP@qdUZ)R4M zlov(9{;4AS3Qq0VCyS}HLxZqmU@7U>y5Uts#BC9t+Tq+8BLg(o{0 zjf7N}q(|s!ctMgtSJm@}w_gB;yne)E52WHVd&bHHb%xnJvOL&)!$~p;b_MkDIw_e> zTbp1JruKp(c1SYzBw(qC1~%Q~tdiof20?AKG0nU^40NN??)lxO<9PB|+!_CL5p^X( z3tI7f)i7TohqfI!-on^tHf>Q6^g3$9)hMC7B6uLgGh{0>PX7kCv?L%S@6sWZ|n(ID?vbIxwLyItC zuU(eRWt^#TdLzU8RMH=WF@p)BzoLv#s3=-dc#BCDoM*CPjX6D`5x79=VU4N3hL26Q zS%;spjuwaFC?n%|CFQfiigj}|H~5=4aslZ3Mpp|Hq~+Y%I;E4W5_E_a7WVSlTdw=Y zhAYSiLOeSJ+ul6x7Dk4t5g$6=VtO>Ve1VGomE4oRB&|rYMEc9;?~atkZ~lrY5eZ;2 z@FAppdFle{d!)R@ITy7|xy=HS4dO--+U^Q*=&D`Pr)8VpePPxJsFt*Z=?|@9y;?$zSA}V;Ze2_`CD2O$d4^^RynR zJ70GA)EBHqniV*wqJ939`I@K}jNAOx2Wt6P>z=JmQK@)242bYoOGbah!~dvs$0|r+ z{yuc{N$kTK?B?l+lZuRed;2@vFVFB+kF;4>y*~V7nNJtJ-v(X7&XDv*Dt5%HBrMrQ zI0Qv@_)`t@a(gnz%lnu99&D3wkd(P_yO=!&qY8AV4bi*0Tk2OD@lsChmvb~XMaoQ@6ROU3@(oEax!MwLMhi)(+!iIWD{_XXjM+`lg^j=?U)s;l+d(FQKYxRL z+eOBj8vA)-%Xd$Joc>q*hoA##Md`;J^Urkq&vS1+77#%Be`<~~GIlXH{6G03`Z=&{ zjy3;tV2RI*>$a=3PItheLQ&U!Gz1jhITdQf@d;BuhRLrzPeg(G&KeL*ybLn{gSOYrj34mgm)dO z++;JonwYIIU5mkY>lD`OjIsUQu^ZLLQl))&=JDbiwjaOiG6e5s*h!Wm8&%t43qG<- zdpJ*Ac{y%~U}d^!-lx%4N~^Vg<8)52WAP8mR|% zsMh{n=@PVk2W=l_3TkA&b!!TCT?fzYQx`b8{kc4_E%j-;G6;OH20zRomhc zG5Z_-+`0+0KwImoOC8(FOSh@Jr+l>SHy$hQR;E(aiGg+CQcYg%e*W2bWwrO94?7o^ zW)K4lc{?9o>4*okV42mav@%krX4) zj5=H{`f119D%DgGnwZPh8o`14d0tQBv4#g&5AGhR@1o1qdW_j$1({~psuSAx;#;H` z<)3?Ll4QOROFJY%_j)wKMux)5focds)C^NzT#r`X?Zot>yWGAyvb^)8ot6K#&` zpL&(@+A2Ezl887hN}E@#^eekHw_Uj561`q;NKymDD+!ag5|TRZ2@2TlavFfV{)Bwg zUG0_N0?C-$jGG#Ib@s3$-Iq0qs)QsH8X3amwkabVxGmT5$HFS*Wr>Y<^rbgM_Da!3uh!lPS9JTg)`b44}gbk%)~ z+NRyPUO@a*5g@S#!fATs@i^q@6`J=K0;ltH&2O*q1)B~9s`lyCqANAc%;<5%{f%8spk#ndb!a2g}wtXZ| za!x%?&9xPjKY>uyW9l8pZsQ~ukKii4Pk?CrPSiPVq`vlKbBt3<`Usi`albuHKKxa3 zD=r1zNRt4z#PFF3iq0+)s-la$3L>x<6 zD-~WAbJB7WrM{Caj2{KYo*(S4c%V}qu79udpi1hP@=7-Qu=a2xg}PJF-m8l)bQ+b!6-{msC3JVu0SY^>5a*P!K|@7hJhAl4v#IcT|2glxTDyY@@4~JTI}l$> zi<_p=-<1cgf9_ImXrkIIYhV%IOiV7G&u}xLus$B$Dho&LR(50Q#TDMG~ak-@{9w}=UTbX18-6^|&TQ=Zt=|8=i@yfcJw5o&ba{)cg zGiIXEtH)kOc(Z>Pd;$;ab!T+9>DutO=k)L1ivn$v002YdrQd77{2Ige`Tjmo9xJFr zdV5eoI&NEB8j)sK<>E|N@S>qHc}K}ydZk>weiEnn;_^P*>G^BN);`sU^c+y-{v1JM z`HZBz*IYC#q{)nYh+abqEpKb!VxL`y{ERj>)KYU87(2*x<1wI!i=peYQ*Cyn!J$|g zgWPu)o;$>HalM`%qQLqKQ(P%YjCYADp?#cGQ2)G#fO5HVe*Y^*omjiXK{> zCyu$j--jD3Ybrm50U)s`s-b8R3FyFT!q0N#EJGCY3H8p#fgQ$YJj7}z^*L|Z^3 zi8^Qy zwDgdml_VB3Kk0&IOV(R!RTtDI#zk3Ew>0-$(^i+ITOjgR#&C^SVJP-+|X zYr_mk+Bnt8Gy{4HejHZ;qN7XdaM;WuM6B~*<`*O){$BT|HwhlyJZ>1kdjBIN&@s5E z6x=b_44d$P`TPSfem1Z;#4aK?>8T_~YN0<7cg@OwpgtS22%Cl7$^^Cjk}fzWJQqI$%i!( z99Vx|vxv_dBco{RmdXuc*oWa#K#5jBiEK8u6>^)-ly)VMx&(w(!CgHBxEIc$M`37U zR}{fU(c7cNK?exK-gtf$u-I#3s@b?JrFp6&!drUEaenhY3wMMF;^&OVMn{Y1?~d%&G)P!ylj3XOr`2=aG?;Lur(Y6Fy7Zl|#jE zRA?qP(y&A#K80vKe|wU%+3gv0i|1^9xm7&LFci6Z!vsC} zqhjCH3C!EM8#&sy;#mGJHL0Fq)Cl`h0!_TF5&28yNd@T|Vie$krD7cdHO#_^97~&vDG`6ueABx<+Hr+5r2RFYL{i^wa*d?vO` zK8jb@9s1>jQu(05m%Zfysqp!Hb; zI06krj_-?Cz7w~Hxjx!*Fku~<{OaT@Y6`Al8e(0DrxNtirOB9zG`g}lEmwvC0y`UOIumY zXvn6<4S`f@cs@^ak;>qTLot8`$E-rFB$R5;X#n+)2-arE=tf#~kqRloa&3fV$kI13 zCwmvpYFWCpU)VQ@&aWO(PTn^8GVO14>%&U&f^q$?Wk*NjBPlJ;Hi35Ep|?U^hiK=B zTFg#5J$W!N^l-}vnsu#j@4@G#6-=%#fHBOHx0zD5hg9rm-wo9%bjy>Ki66N9;JNVn z!?NtyqwPy>UB6X(NOS?n{j;}2%-ULnzQnkFZ@4_uLJ(W%uUFt<3?p$l4p->E`fnOf zLSuj={Fk|iC4`G$U{4{2m(S~(GFTZFi>nPwt8zNxdtP8XJPWlP1iz>Bn&s$*_lrs* zzzguw;^GJ~*+mKw4%$f~jg6)cqmr;1%ZS>PfAYSStrEoN;U5v8{u<%UB*i;xXbC!` zza1hit#v!!gD5GGvP2f3N?;4{NbZZjWDHxzu=mI>JC#lsb>$0POYUvJIVvD5%?uIA zI0y7x+sB(RFX_6E+A_Qz3vId&d%*?s#OJi4h~b#<-LDp%M_{SuTrFj!I8l^2G)YDu zdyp!0*`#EWV8JdV^s643YZNKOV@labD%3ZQ0clD#Ce4Y9JpgqXK6wqriM_XQ56vl9 zcZ|o~F2r7n91GvJM&Z0Fx>in%&eH|I{`?cVwG)R`M+e*{2U-OCVuJ_;k3YdVOU(wS z&+blq@~6G}GTa2xV(AbG48RiGmnHdxZZIlN0kWW5wapNdFTlYigBt70 zOe;$IaMCd?lrc3j+7_)~aFo?BPHXA_cZ;RT`qE6^!EMK#CyS+D9fxGn;T2u$_!i0U z@b~%WQf2LTfAteIdAch~VwJCe!`SVE4n8Y}WJg$zTEm}}7G^96Bpi)ffoZd@!&!W^ zxi@%%(Zegl0tW__Z4HA6SCR#(Pw;>XSj*ryYcGabA*?hDz%4lo8IZP$-YGANSZ6)k2&KXSGesyxojo9mrPw zR<{j7DQ|?S~+z@}Mnt z>~sLJ1^Oiv5jIUINQLtHuRF_lZ?xYt#8hPdwwCT80m^qhznH}Dtps8R|#LsO2I;EKYo)wk}n z*n~(TB1{$`=oT>+kRS=Z7F*P95q;KM)IQ`{3!DhO@Q~MS5>BjxVC|a0=F=98-HVDD zrg3U$puNsG87@)c)`Fp3C3jy0CK8EipbivTu%FP)Hw5pp;k~pJeqsk&eF)VT0H5Mi zGUpEHx?GjYG0L{TLVNTpZ`^+jX~Y9E`WiY{X~s053wS8I=A>aB^X&H&z6+! z)@_QjffZe;l3@Oa^QWUl*|U=M@hDws<94NQrk3U%EIk>LRx~9lZ?~3~b;< zXehIu9MPZ^J(&4*YIF#L=@}sbQ;V6Km_gKvn4eVhNc{rrKK2;lwLt@-Hu9n}kEQI% z+75v@+F3a`V}E~YK8a?f{0@S`9S)Vn^*Rhu%H+E zkEAU!Zsm+3ZUiGmq#RyFNs~{drUdE9N((Ds8k#N>54U$7$Eg~MEYW&avyEB}IQDXV zrA3>(m}mvaG?#M z;?5i8Qw$SYF2XtfZ5m7D-cXAgnL7V9|kqIj6n3<~8ruFJ)8X z^wA`}xsbxVrsZG}3l|A^P1=cO({-+Z5M<;~$O+K_OAQs4PvA63HCuOQ4}mVG7NL6? z%q>VFR3L>D5R3j1h@WyF+_|LZ4Y>mr1U=MU{T>1`$Zp36eNWl?JUn`}h3ZlZY8%I0 zaucCeC1ESUWq_Ify&I!d58Sx(<1!}uuxNk`*l`26x$5^CDZr(;%-8a^LOL;O?*_1d0=)qY^w4tuJ2J$|!&~ znctmG_;O8n*a+8Z*&Pf+#s@q4~mT!Q?Tu2exyZ>bBURS;+t0Sb>r*NvhD_V=8cd4DWtC6#q z%9!CV-4ZRb5Z5`CT2Mn+YiepZS`yj7Y-C}4BsP;IN(V|f z4mp^CvlZmH@%9=IAO$;TJ= zAuMVp8<~^4%;>Xk`iLU|NlbxBK=B3j&oqw^?t`5P835p)-sQjUY6flpSjzv?uBM5t zvxT#Vo}-DifwP63?f)><`*(&99h=wZIFo`BWdTie~$ttUwAC|gg9_A!uFtNBHC z>{{@~dKs@Ja}u#6w+pDZ9Xs*!;3N`_gd;Qwquem-?#bKqy|4%BFkEoCaY z9sEE$p2vLB4cUiK*5HvJVQbT_XGVJ*$$NF=A7$Ea)tf|Ud)?chDm#29adAg#E>yY~ z=K-Y=J?!Xf$$xBu%98#>h%&nV5>gXZc9+6APv^~wAM+G$?T2R8RsZ_5WK3&^6M8bH zMO{R~44L^&tRrs*uml`s<}~AjAHtybN)?LVs-fMeBGnAN##~j*LY`~*!`H$i#LDb`%3xY-hgoe@VvjXx|=_MxIOlv98ohX7PMg~)If0C$TR;tF|AVeZfr5jaP(2X zC3HeyI%?KKxyj(y2dmWV6pPs~vg&N@{05}}zS+w%kc(QUt1?gjxN9G&w1&pC0mx^1 z_507pGeP{`#h3q)65N-UK3e^jjofg}cF7=ASWoGxCUt9`MdgC|z+kq80RJAY%YjF= zTiqGZ=Ad03(E-0eJ zodlgj`LMC2B)JJG*eDb9z?0zlyrA^qVlc?iUf=1w5@xj&3D}C|yY4 zg^B}npOCu)4kR#Wvh@AqIq&*ihD}oD+Ia6e@}poK@5;erwh=ahL2Q*(H`Qs26bbFC zM~#yzBAii2wFX1y3Zm4zf2j?EC>Uj?K^`PdxalYlr{!;78}vzcInSIhku2Q}Ma;T0 z^BCE#F|S$gPbaLqg?(hDC_&KZcZW+zXW}(;ri8ce~+xEIL^-^3? zLLn)BW~M1eH&>a5=Ac}IVvba=tv)yrU^QgzNn%iW5p?%R8HY-z6RNPs7La^>GE0=v zRNZ9f+2TNo`(m9?IA2jh#;dtexk)~!K!`QpAzm!$BT!~@o?j#`L4)|3xb6PX+|?O!R;y_* z@rb^NyGRv{|}=?skNt*ahCUnLlJlh#sui@aI|$=orLp2s$AUGo6og=72b z-TA=A#XTFczm)Wz5WH|>oma-V?{7+{-k+-kZ?&UO@zp}@)w1ojwj4}G^{j(nExQn5?`lmId<&$cRCMkZR5Jxgx$e)HVg-kL*aMIGwFTY(+* z9$-qs0{ka;5f;DaDEK&4YSBR}K*1`g>uYX76*i&Qc_Ha}n0HxcDL42R>Mn0VXV(EO zHkN1d0j_es`mcPdcDCJ^pQNevi{u@jEjf#%zG-#RH?pZwF_aRJ0&jNTL}z=EQU0zR z*xbC{azt@k?UqO#CU2yWwRW|z9V{bwbu|__!j*LwDEX*ytT~Gej5^S>?8&;MYqCn$_!QpTz7>|ZEr6F_(N>=hpUP5xzU4`MF zEPzgfNu+`%(vCI=;~i=|4K|49#MAwO~s;@LK3WW)GKi@p5Wo80dWr+6e<}Xn^b>S$Xu)B$y?sCMB|tdo>M$- zg(0PT+m==qr&;z}Q@|ThVoGG1>bn`NZyXkJb`LM=Bq>@--GlLM@AD=t+K{!q#d^_= zE#{e+4y(G;16Q?TN(aEI*V_LO-fxs^v}i(z zI*Sa;NY3+;!h#4|1O{3}1G;Y+YTZFfutNic1s*$9-hBON-U8h9R`D#u!2H7DkGK2N z04GIh*5+_jvo>f}I0J5PUl;yZ7ykItiu((wMQg#Fy&6WFJy_ySMYMAZ%d5@9kMZ(V zJ!ow>J)-@)CCUq-Jj$AjBE_K=l&H^@OJCm{*C*Io#cHjb2rtJ1NT+EcFP-&H#a+2r zBnn!Q5T-~t4kVm+G~hB2WUt~)Q4JPtDqve+WU5;i9|*HkiNASLBDD32t1r2*W3;cD zWG%I)-7X^N)bZ^ zmZn|?b$b0*aj!(w^B??&I5xZ6>O@7iEaSeg=d4{HGM(-lVdM6!_DA4_RsK|>qB;;; zK8hA<+iTwoWpVq&zY2y`3Ikz^P7rMR7^=) zK-?@T!XgNe$y$eAe_3BKDhHkKK%#ylFXK1A5NQ>Vw5BJ2zYv=W>{g-C+TH_e6VQCK zm!}n2sRi^SFMv7mr#5ofwZn`JcXCSjv%$5U>JU-W44?SbP4qgQ{h(Y&N;_6mPc{MJ zjGuURPI@f!YkigTYOLF$J|iVksL>xdNLkR}^Fv(Nc|!X~3lxehlgv--!wR(wM${}` zT1wE9y)ov%V>e%hb>Ez{Hk&xPipuH2901Z*8aACx z*PGxss$dI$z)X{qU>~T;7B&y}8S@CavD|dM&vE*3nyGgGd9U5{0u+wYSd0*$C6|8c zHxY~DVxBC>_Ga|uz9W>R5Y`qEGii&`g#48kgt~hT-0F8aMvUT?G0tc?#+;dAxsO;R z7}mhj0lSb$*;N&*B2XzuujR)a$Mb@v0|qBb6lZ!;pp6cbJqX*4evcxY%h?l+xiw%> z9J+wK99B_THiFuv4nJTj*~&y_uOJ~*6=rg?9$hT`rvkafI*JJMEAS+m6m65*atNPp zBL+lD|E3hzS^`#f6~``ssH21LN>nJ~+oRVJjH)hyE2g5C(Cemb=0(CH8xhi030W8*yQVr<{?N_agN z$9otJTr4f6>$Ip=EK_%0tRaH4x+J4E2K3HV&T4+T4`Ufrlhvp{+HqS;n>{^=eRAA_ zZ~B{Q;zCaLOGO=M2RfwwgYBOaHO0c6)CmXx@XxvV*C$Gs6c9l3KRr?ZpP+WNFmd}I z#Pq+j$m&@Ah-uVM-kyN8+*|40)s8LNT6)ek8Kf4h+>J?A(YjuIdE?Bd(qs~~1SXfj zkLRwRsNlaTG#V-1VCF;`#B?5d?I&p|+3~?$%$0wGE<2YZ{j_y-^z`%)UNU+5ORn9T zuc^mo7M_{z&%drvdhWZf;0GLe%vyfZnHx%FWQUDnrP7!nhz4-!u7bHjE*A5a1N!4Hx@KF3-ESG;<#NYt zg=pl=9LH4k7VJjeCJ+c_!c4xaGYv`-lb^kTpIYr2~a z;)2=yT`DjA%8>S8d~;DbC+FY3^C( zs!Z(f*=m10LXv4%#d}xb7LzzzYhVMd!+721cGV0lmQV`-Rnhv@Uk3DvYFY;@-@E7M zmImk5QpG7?LSKfnWW_`ytTN~P6RrO@$o$ zJc|2Pp|2P))d65OI9^w$nep^1SXj$f2<^ap23dn?SX=97#cgaY>p(761*K3d4OG&))m)s=yr ze%XNg#}}DBS^14Nir*&!ss{!<)AW(|DAckzJTLFh)zNsJB>2skJ_{@|bqv%$W}QWk zP99(Nc@5M(R>lnA>sY5>c`(`U?A(}6$Aon0b$dg=?#ug7G;&bZbZK{$?c1Vwzzfx) z$B_ZYE+=7dSTnAj?~cxa8{2M}eoz)lt=T8u9$qDE(u1JG>TDPPRW#$gn@QhdZ0AIt zhav75?TuKu?`fgJHSLzrfEW5BFgZTV@H}8F#?U(91qS-OMA)J3PThHDkQ*L@8L4Me z=GAVhb?kc!*jT=b)-UV4r->URiL+T=M;7uxR9OjSE*Hl#h^)Rp^BhK>!1yctXT=zA zv({y+KSJ|Qav>ILCQ!Y!H)oo2j5ueqbtFgWHa4=x4l_$PIvVl|eVj8rdV+sDyST&| zFE-4t7UxphR7uxytCaZn`*&*`%k?)!Eq)A8ChDZ#rCg8UkaezQPHSA+%|?N~YUS+8 zT(IkQTS1aZ$dULx1+cG;R<`_|0sf$;T_I|~24R`!PRqdRxj&>3UL5U!cPtxr zXNwNjC!`kgrZsr__*;Zrkzar$Torf*FJxG=U|}aJd>GzGu+NR-9L)c;8s+QjLe^Zxo5e| zP%f%a3o0$4*ePimh2PdlS)BK>oYVYS3Fu>j?Pm!)ioUL+|Nan(@o9Yzf&i!%r;PN_ z&n=gjd>;TL-0|!5`Psf0H+aO-wTUF&FV_};1f>8-3tM1NLeB( z8IGQ(YVA!deUfl%Og5NzZ)xjF3Syv3`12&EEK7#DP(QO^NdIA#~y zy80Ezd0T#}3@-5G;3TfL!TCPw#~`#20E!kM;je$+yOqxct-bsKH$?N`N2mLG340S? zWmiNSOFFfw8|dVcAILCp>Hi(YCkFdug012Eq45+zcbVezef?=oKk10|H{cTR97W{h zoWyjLYb=97qp}_e?V4Cl0n6dLHS#rb9XO)B%BD^EVfWabEi8gW-N@CWM*T#VLn$=& zT%t!iOo+0{!!teqajM+d5NOB}%_Yp;fawr`o&&8YH++Ur^{O;0(c+Hwb@=s4Ll9LeuWJVP7Y0x@#H6(X_sb$-szzK;9y*=sTEc_{4Yx36@Qc+6s6 zLq=Hq=)yQX@&{|KBT}9f0Y-qaI16LY>-0;5JteU~9I!sG+lis) zbFh8Plcqmy7BEqtgBP(_GX~P=BQdj>(?k5DLdYpOAA&Th7;z+Fh2eFnv@yQdoZk~6 zSFR>0BQ0pHnN}{xWlSrkg9~IeEE@)Rj<9j`=$rB=<~3@ZVDct8VqUAgunje6*yVbk zW~(?yR=G>EHul$FNCLFg3Jdk%C9PNG@&H&J23G$4 z2t^5|^5+@?1KQ*-rf&z%tXDYb#!vk4?t<{GjFm;KJ68QdgoKw^J*vh}bZP|k@!cEW zsnH94`}A6HfE+Tn$)*ID|FbA3^v`DwBSGHve2QAfqef*SBW9yypyA_lxOGf)>hVM8 zuV?hp=J;ANk*}lDQxIKUxVlM=yL)H!Me&eCh71(#U_jmmKj&PT>63OG7s^>ZKxJ8Z zNsJh9L}7?Rv0jXf`bvSg(D&EY^m_H=+8N;vR?4~^c)rxg9^w%`2neBmBm4L+Q#-@M z4PvEwAo~zb`mm7E+3@c?T-7>v{|&r)*5#M7hJDU;9@c!bYJf<)IRLrMpHv~c?&Pkw zoa2ONn39DGYYe!a{_`nKre=5MOcRJ5&0VsNgkbSNL82^sgzueI?1OkuwMhNOvPjIL z#DwD8mNs@GOel-1iDm2tTe6|Ob8c;nwUgbNaFcf z8Ftq|m==lKIHquP;#Xft9~Iz64z@u5cx|xj`0@KD`ORQmsGk#O6yL@Nw(;*6`US58 zjkxl2q*|MN!rSG`*+X9OhGCIc21$I>aACMGGveHdfG`o54(>IkEC()j^I6Kjrw`F}gUms7ZIqZ&rBe_q%?&`eH`Onv7jgqtHxltRJ zjSv&_x0sHcoA9Ib;2kvV0%pI@svW4<57^jHGvGjJZh=D}?)5xh)ch<_T6ms6A*Pxh zXtLnw-rQrtKy#>Z{aUNV%lfduWxQ2AxX&Ja}Pc%A#0m z(S?L&QCN%ZFCj}|IbCvjN_jwpVj!e+3MNbn9ZMx|`PkzGhlHW>Fg`(SkoW8^_cpzH zb{L$I#i`6 zTO*i)hQKnitO=j+jf6;Md2!5g9oqfjDB(jEW*aL5n8nuXZBvwe)ElRChy(y2&98Mt z|De)l3+2pWm!M|gJR7Oml-Gl!JuPo+Gz*La#zzx?|F((wO@rmi} zn`3F;ogHcQ+z0lsQYw7IEUEAg=*dv@8a;HnEbM*Eg-c|2>MpNoQ{!e0fz~sNaC|>D zt2>ZS(=T`vW}!Us@&249vxw`(<>&T-UZn?EhPxW4p_ z*Kp;sJIr)RPUkoc(&e3IPh{+TJ2}5WM`-FTi=KE#u)A~xtA;Vet!RgeR90zY>vWgY z(ceaFQ_QFY?@MzI=hA0IA>61osp&Lv8g;gxPe@rO8}g*;$*b8 zD=_LDPHGu;4VQX9MLJ)Q96V@k3O0|M2Odu*j5a}>MD>vMh*j$I8Vb0Si9Tzq-*a~;K5}0Pcj|)wOcn@BZe4RyREOhbbn|Lkb{8NX!Yi6B ze_TVXJEsReMg8M5{&5psQ6Pwe%F-1@u}4B1c(=bX8U%J!(JM2YvzSwI>D+b_-NDQi$Ace*bA1 zjz1e4nFO7Qf%~2@{TTKiW62E^C)t5noyx2wtFV1K;32a7IuqcV4t-8%INFqvOW#<` zzIOCFZb>=vm#`crZPXqGK_?dnth|+E0+yF(fg&bBwux<^*bj(%va$`BUbo?#U?m>` zL=cIjVTq(~pnn8AATcT}1l-Sz`$v}lYr&pt`2Qg2z`)qX;(wZZ|2wI!rS%hZfb9ER zgO7+@4>WS!4uc-WslHsKgXbx500Z=2akr{Ok(3f7eGpy| zV(-oUE`aC~2q44`hcMap`$@ZHA=I`(Fgctk9KAS&o)K_I+z=@67amxREH zb=5h)rHw)o{T15FMjPXB>Qa@c%pE{6mjwJvs*QZm=)OKujuRXw|F`cDkMq;TLyjQ{ zUl4Jel)E^#vkZDD3eRKygLZUxer-6Br~XLTS2a~WX(s`ofjT@Ij2RCx%5m=9DpI2P zs>5mHgx#&XblN=qC#-k^0|Y0%Oy4Rx1E)wcPlWJbm<^E~rs5CM$MIY&VD;`s^asl< zZaa3NS4a{{{s*uW(9_?3x0uftG)G1Vz~J;XJB?rmi*eHQjCJ!pB@9(atKXcf8?4lY zf924se9YpsOA!t;I^@7;dajJ??=J|rf^IocJt>b>|I=NWEcQz<-ot$qc0;S+kJoZfJQ3?I_jDmG@y@aBuSZ4C~ zsEQ-$U|W5`EXZOjjzgG`m$Y#H-rU?0jH%J~c`_k4%CF-xoUa%*^&~I}N}ya|!x0ee z8ht`hZ&Y?9Q6Nl*#})lshAE9R&RJ-&?$caAl?Q^S`Y!vWe%Fl4Jm;JY(7xv;K7E8S z)qiL{u^4@}(BdVK06soa8vufsje#)xS)7i(R4vVDhTzrOK+J`UGh!J2#zBhkMo%&J zuqMI}Rd1a*W%|x|y_OmM7C?^F?N2TzKa%_T*&a`!oh zkQ-Asb~0#=K65L5DW=bSNrZRWg|}tFvCa-hNqBeHMl1w_uk=o`AS=%AC+sWOKmF zBMyg^>2UbnQEo8(Rasoh_bR_wIV93NRrMq0=@iu1)`0o?_SIW0wZ-#sQiO@8=FFg^ zCDG-~2LB~m5ZPlrpWIVjA7LP6yae5IG;Ngx5rTySe_sOVM~U&*PeuAurQE2{-oY>$ ze75%#)!4rAb0<}yo|?~jlEYAO#oF<$P+lL0yv1eJrTKZ$qVqC41==c`C90{5{N%-Y z)FRIcx@PF}`rmwr)Jw zGQz>l^jpvdy@R-I#Oz)1@ozA70I@peSci0!&RFVyAg-?t@WnW8dY`NyU7S*heM3*M zhfBy!t?nvt{{>HL_xS2L*q2T^JZoP^XPY)UxqcZK{PIF|h7zWr8zI(G<-Ej*Wxw<=?FnpRuUi{)f@_*q0nQ2S-?RJL zXHm*tR9);LBB>p0lKA%O3Zgch*XvT;k)~~29^Nm~n>s`@n(op0m2+En)&rFTZ? zNgHChTCHBulo^3vO9HpRN)9-{jQI3pyM2YY^0igB<@?CDLy2|L9EK=ezCP!-)h+?9a{?8EKalDF1flEmbcneU(7hPe`tuT@c)~JsOTl9Pk(G}apE%2%xb=6z%NhUDE;499b?_On}4u6 zBy06bBhfmLi%9?tur4ZIOUk9W^i%VT2_P<<>J16p4}hO7c~p*5nX z`}Zv=maoB#hoRcFt4O>s92pB*#N_>TX-dc6V(>&ahW#L73jFkBr^6@R{CxV%X2zWM z$AZG2x^m>OMq_yw3)?}SonTi%@v}tsBSS{muRJH*Cb79vo%ngZ33L&+Q6IAdCptm0 z3gSC^yqLbvM{1g*Xb2ET@VE$YTkt=8H9ViKPsJwQBK|=npR|#rFJs7jPHrLs1NArv zOuBb*$Vq|ybh_ia){8lj*q!~gs2>)hCtLU`h0Mf4UU%+Y#sn6UmVG zZ_>)4)nrTOu3oSz7lGwN*5pIN`OA zZM_Cjf%x^0ePfGW;`k5NU9CCZ|&vFcy<@H3f4fn1l04_!Kcfb0S3L zZ-Gpvjko3gW)_cP^MA^*+z&eX!iI>ke0+UjSKFXg!TrWeMEPMpO9mX6_CtmJE5!Qcyj zOaiRUu3P%w#e1dp=28&d_?Nx*)Y4)P8$8&PG1g8sYjTWWnzefbb}0ooqz})hAm2~A z@C$?t7#Q}gby`pqI(?-F#rf|B|LUWJEak@sW|UBUfaKL({&eU~QRQdx=_+NF)Pr{t zjxgH$0FediO;6u`3aFM{8=mX&IfK1UiXy~x$5BO^b$aI1GCc;J;{kRXPr3`Ak-ybx={Ya}70dO38_9unDjnq6yau$v^NIzj{I(Z8W+r$l_ zF^p>g0rkre5b_#qZOuFy^koUFAb)9V<1+ld^UPtvt0zf^P;2qEP;nUSG6EkERr#dr z8AOX<#<#CwOs^N=#64EiWFaSwZ4z0s&WQ`s^Dm%^W-mMqs*1+HY&Uk)mC7#$T*$Sn>%V(K+ zxLUH3M6gKNGJ*VLjY&mA#f0JBN+Uw?o&`)zsXzCvT&YqIm>m^gsJ_=X&X{&g0*&&m zYLG1xl_q0TK89=5(Il8NBBHeiQ=~-@9vOLOpCI0q%HlufoRq|#-b z3n+Z+fqJq6nv~VZ)W}ImX;pq|vIjDNz3n6UzKFBGAK@`~PuwSL6AD@aOYW#<>&rQv zBlppBE92p6j_Q-p4IIT`TvC924=9siB z1gaKTsTfPig#)LlW?9m$J?N5S3Dh~RhKq$9`#w?SE~0j z`VVpqCYEvl-X9+EUPjt!c@WIaC*}t(S_iAQHtdjwa{k!t$`-KEVD`U^r}koPW_&K+ zM#Wwm#Tt0|)+Ay(u zmnL_aV4FR4HdZ&V$t2Ebq&e-=lwqRepdyo$mhuU=>KVu-JDt?h#1p85^2@KEK>T?T znB&8!802|&8AmdT$zOVb-hP>e-7A~LjxfHdLMmT2`m0NbDgqRAnS%5<;`4w&9AA76 z9E~&yt&aT+8fLFIgx&=L|GP;=kp${B{!{e*Q&auxCY4|yz<=&4aW?!}(QvYJar_?> zX#QQR>YoIfX4L;mpwW-hX?QX!)C$+=lz86p714tb(tG^ zxZvgNXg3c_*?|zz?G@z23&Djz&xiwogm66G3zEOliz5Hx9-%fiKQ;Rxz}KyV?*Rm_fV*lM_EWp?aRwV=)&K>I)eD;PQ(Ca zvwJL%bQXMvdF>@Zw>~HpuGgM1?k!!1`+?}xniB{fH2Wr4 z>d*`5eAa{;=Am0Sf53mrpfU8Hu9be(oJnUwL;AC-_nbL%NcRBxIUKK{=&^GchiK9Z zZ}Dt}1nBp!!Rk4Lv%Zs`&eM$7rZ{>6(B3cT-??=G*pOuCBBwu6!+}bDHY$O^r5LBI z+70*#hww5W>sG*Vx(sO&XGhOfI49PxL8PvH66ZU)XXwv!^Xq zm*-!Ly;%mUzl)%z{bv7%OF`pqZcE^CeDyqIh|DK!%hqTM>(7Stv1a-;!u- zWKY4NLO6~NvlxycCEFiOVbKjZfiU6s&9n#>%OFol*wAP#?`1rZJIYpZhjwq^ZCZ!S zL5XP}=7#qiJ z8_bBwK(Y96Rp~-!Ti#?>iM!b_1cQF^GosJ}z@ud?bOy)fi-Ty(;8Js;fOOclCbh8G5!MQg;m!r(l%SFhtnVd`9^s~V z5}g=?Zo8Yf#?K_2nr!u8!Y(HhQM!Q_z&eYa-ON7-K3&EtQdt8MCExRl;frmwe=Hec zXEcfIQZnrliiCg-V!KChONQUUF@f_pCJ@SggA6bVypqX^%RE}KE3XnHmx4ysM0RF8 z9qN5#%#b1#cWAR8>eGf+8&mAdI#q-~Xt7uT?uRU1XH-eeuq@aI-Sd9x61s{%Ik>C^ zbU-oCwC5Hz>jmul=*lZJ*Jmc^%?bfBZ!VxSVSa!At09av6m~CDt|68o;?|mN)4Ia5 zbneIqAGq?Fk^eqrNp!LG8v5|nwnVEGx}Do!(PDmjE`wc!1X3PF{p(JS^$)q_EEmMB z9OL+GM{l=jZ*Lur;21+gszA1oqIiwP2|m9WPU3oymx#Y5t@@zFa(y z$vUCWRE-Fi&QEUxo9At}b0+7o$C3hqKm*uNBK@>Kn1}T{vUu|Zy7pIcm-vg}C0tfV z@`Xjiq>Yec@~4TrmXH6imD*B-gWVmcWFL>dofr`IoWk<})`iM53cCje={rAuN1cfy>FZagpFQ(@M6B#Y z+!#%QM7H^Bx;kytgfj7g|mr;b_w&wN%Ww&O^Mj2Umss zQ+48rSU8(PxowiCyaTEEmESBS6*zJ0gL1;o?KfrEofb^;Ayl26lJM#SpVzeCe_5@w`#P-9dfSWs!6H;cxZM47m9Nd;;p9%eWq#^E3XO6-F?{q zV(lNBY-`jlN;Hj?wr$(CZQHhO+qP}3v~Am3D{WN1d!Ku&Dr#4KIOjynnEznL=(CUZ z^rorP%0Ai@SaeTIwwyebYc(znl1b~9Sl2t`yMan!W4URwys{B-*NbCqLX#GqiMYu` z-e6K?Wie!NS$s4P{bc|1e@KNxa`Pq2p5W8VKU$T3Dl%cf!r+A_5q~Xr(sTYXWHOiR zIJ(YFos6mucKN365p|Na0U0zz6Qv0}(uDME34)WVe0C^5XEeXDF)eW(4W)enClhGZ z0JS|=!bYm70u%+irNfo0r2gQ61 z1sRI@cyiK;lB}ff1&6vIwCCGBA3gKe>$cq_l$#ufHU*{E?HT_YY%-dBJB8A+C?4QO zy1q%+YoWAG#E6TUO4P0KJ$n30_Yja+#%TJf|H>`4Jj%d{0KO21+dFAQP;tt6g~iL! z%nPwxBP%~8o&JW{d>bCPIC^$jG-@9g9z=ENYr)zke#g+S{dyx=>_$7N34cBJ49cQ^XQ_#zPw2s; zPe~Exz9ohO$?MHo5m;V-L5jpg5(WjvdLRV<>oa7KQaQDWm#C=f;AkPKxk+uoaLW74 z2Yhf5+fK?B;R%u?*F0MHPB$z-SZ{%w(dqBc{n>PJ|H)zJ-4i1ypW)j0!Dmz(NBv!` zmf48bbEc#geLM8)A;xHhHs$6q%X2h$m20BgsO?8yrWx{}+qzWxoDfqRwR3;o`0yLL z-{$rmhk;3!kB9{YNzSLbHvV+{Z*xg^O2QG#^UwllMUEvkRitcSEi+Z@GZvI!3f}G1 zAHHa%QJ=$-Y!h7_T|E40X1-mu)kX))f9t3qkG>F~ejw<7g6V&btT62V3o=nVJp&hK zb3MlYMnkA&V}~gQ|20#mz8(on4PCJ*iSo-;hyB>E&z0WP8A5MakOvh4~@nL_&07e`le7&?>Jr<++4 ze;!F!8I&796Nv)0z`k7IGReszdRp?DGh-qQDi+=&g&!o0h}n;X`{T&)ddm?mUtk#T z>D$eKoAJoNM^wXe^WSh}Cd&(1O2!L`Iz<~-_2mlRMD#Vq!Ytci&s4)>0E#uoFLMk! zL}FyQP35*3ciW;f+SMc=Uk{BGaQtqAg?lU-?F4A#|np6`nTn;z-rmVb! zMo+8$me@RV?}}s#kwOBRmjIR54dGtGa7MP24Xpr?4XwY*=3#%aj~W(k^+ahkd)h0m ze_y(2RPct0L_H3bvg=C+$P)#41P4M8cElA^>Nm=je0bNlPdILfC1sCND&;iqoA%u^ zs)eFMvNi+7pGRQX^pD4T2Tn-TetUUAAE1T6)rjVN?i*5DzH{pmGNwIW+PxY3f z>*wzoz+gVgMyU$quN5pIhkqEb)vX&1EraFB0p(Z5_rU;XwOa+PakMCAvd&36WfVkYUdU)JaapLcv`n*c6Kp;nR|A+_5}ICMuAwHFc^`_rsHgF(qj#J${gfBia+4h~{+eu6m&^BFL;c?QO09`DRI zUl0lL!j>dM<%Y2a0$EF0B9eyB$cDxlj>`LJ35bvmqy~N;oDJD8(uB)^6R(#4FHb1h z*^#pq;DsFrbBX>Aa}c>ZX;9DbLMM%jbVt^y*I9uX@asi5y|PGI zAJ@WlvPHTOfO}}l$k%%=o?~#x^&iUaU&?w?G0Fzy);He zB+P5Mv9ufS>%#9EwiWVD-U!0P^2^~FZ7|pMEyWbma^Sy!QFD;`P4i@ZCIG~y%#1a@ z&pk&B@-`YC+hU#i{)TOMR}`QMG>*WjLeB+&L@%c|LormMgyp4fw3@%Eq{!w}$bz4L zuL`KK6>im6K~Zp)CgsNjs+k4l>li5DTKg4XTlozOt?DfhT&5kUHVhX4t%dkTAbpVz z2K$C!e4&ZME5|o|=94ej4;?=@g8S@xomSD+qNoj5@ z!FGbn*)r<4ROwrlfsoI1-R^0{fv@kfQ4^I^>2MBQwow0>#IHJzaHXQEU(>cSR10_~ zf2D^s;wIwxd;r5mwKY^f7k|1d^Gq8oS57_X1e`C93CS`Lzm&rxn8TxYPHmeX-%o5>gBouQU1Cu5#Sj;Bqp?AHZx*5ED@ zVX}vW{+RKeLD6YRRdFz)n+#>SHZdd#^3Yv|{$twmXx0*jJ#EO8)d4xZouB9Dnr&eg z@LpJTIQ-g0lf8thC*QSytp#g`xEn9BE1M?DCKL7k7^JzL^kp$2$xIEKWeX_vViCk+ zd>QnbUjZiuih*K^H%h18cxuN`P!p-pqE{#XOjXt#)~3#x#8**cWSN%ZHe!%gZ53_w z2GVtV84;&fjmIpF-zfs^y^G>3{piR-Iun zs`O0sdLd)5_l4E8wBPeg#-iszeSfK0)g{_S50);ys8y#{;NH{boVylUxA5?CF4*G! z@L=+p&pksh>vX)Nnkn|FwAh|JpZM+5JCc;OI&J ze;GLDKQizHnt#i{W&eLNaEkF%B|gJ2ut>?1!^Bfw_gR&i+#-hCAahQBC|-}xIMvIm ztLl(FrtJQ6?;0)0TSpOHM#+oORD2VA%}A6k;=;9y<;H(rb;-e#l7B8E_^5j`)5IX7CS zTZm5T6ZV7L_$WiWNWUwuG@jrY1z}zpmj6yZa^AcpjZdpc*x3&^r3Iv~%8O4|npkx98nz&l6| zDxQuxquC#BC|SCc^^6$PLsIV&TMt)C2u9*G(__9LvfoJd{t-%+Wl5xELpU^wBrgsR zy5+J79hO8(Dc|vuBFw&>_X2`cEI1NxPM0|>X3=sj`JEb>|S?kJ}Ei z8-w()4GP@loYd;vAR5>A_a8MlkEinlC-5L#BT3&$5(o3PDu>L)vp*-8&^_RX9J+Jl z8YAW`dBj*?fnMm~=2U-(ufgjM;SmoraU&nPC2yJA{n?HK&!BGB#s^m)XvE+XhXQGrgXp<2*_zwh+vZz=!H7P zdOPnWR4q92rzjL?^3Xm21Bta1Q`I{srUc*k3qf}bb|ChYNXz!CRB+NoMh?zJ{Iv-!J%cny9JK^QaX`ppFFu>%uI7+tp zk;_|~4e_y^;+ z(RDx7la6ZP+&owMSkxThfF6Dl3I~exw>Ulp_$?!b=#1MGM-?v3!rhYl3fBV0+s|xs zW<`-t(jPp|NGCx22`vLu!z)akyseiLg{7+jXPgUsK#auhe2h z5NX#_p;kDa+v&IJ{3=(V8R*$8%oX^nf>{Tx^vT)sNQ0>0^cdmPK~1JN`hm|CBWUoV zN->6rq+497blF!$O<)%Ew!z~%1)Djng}p`6QB`K=QRtO#()F|9#p!8bZ_p4xGPfTl ziJ`y#{!m4h$Kh`>l@+oHd(Xj7I_;}Do99ruh5eh~mieD$iy||dmwtM1bvd>B7)ccmp}b8rvxANu^;>*Rpx7 z?5m4?b|*!i&lkXASXyqR7)Tgp@w_1(!Y(FH+PYD$%o$bmGc-Q-9N5~)y%)$CWYQO< z99bCt!V}4&1O%Mp>{-QWbMH2cC8>rxecoc}rmSM-ZXL#{zjTFy52OH(BAf?;yHXWLp#Z3E<5np4uk2p!+n>Kl*&cW*4R1$UdN`l6z5?0k94#s~}7`&>E#S#@{g;pQmZM=scC z2sWAx9)vI|D#3aoDZL%qV3p1%;ozgO`yi5WTJJ-9BthD(>4j zx6-%?(5R?EVU!RJ}rV$7Oi4_vOh(9rV z+h1rhP8UF;_L^KW5gOGVKkyIxJD)ool_pC8g|Cz zaQ6J__mtk2ZuX?573YQ~%IcYrRF#9DN7nGu?Vzwh}o{C7$h(e}IbqBcsErB9v z?QqqBHoCUzhbp_Fl2e+c<-o>7USGmV~<(!A4M2HUaVSyp1OqSS~&?!v27>-2D2A#!8B6URAZpd*YZ4#T{aW%dPMU{T;o#jm$qT8 zoVN->j0DAv%`S{lHgq3{NES$1M5_9~<NA*#2hFw*oIDd_kAQ)U99X;) zb6l)H0#VcqnhtEkaF&8v2OrVDYD^;Y6ljzpw(yvL{zIa)OOt3-6$)|;85(h<;HI0F zY`!^8QdzXlLb~yBoGP0Ti81!bor9Xr$XmH^{TfABaip)15>GM(2od2Xj0)yAo5GnF z1$ghngLtY?wc>ODFuZo9u7_b5q%(V z%!WQxvgJ)f$20X4JWf7W{i-7vJ({&zd^;rAH#J8-WQl?cGU9%v#@0s)*t?2ib@oFV)41PSMR!aOzzsRRiMRGNv!O3T`QahO9)mPWc2SEVw|PKB z-$yTDcm+tQuCDO^L*#})@a!y5MvQJVEks=*2WZtp0g~NzICJ;p;<$=KR%aQ2E5F-p2H!Gr-|8e)Pwa*7Dxmm#3PHmQ5T{4#rZSY4sQl!<1M z%4rh77r*knw+?G-M*fZrwX;9^Ya=h4*D*Km!#6ux(FCn=Q@O2zj|xxSg`tg%3Jv9ZDvt*XPPD4tDFF{D6N2_D6Ll%!0$ z(Q<}dn*23)x26+RIOQcFtwl3-t7%vp&efxz=@Z_XXajY zpCguwEy0pXo82*;)Wt6?uTat*e)2JJ!1>?|KDXsTEf+np35p=@K6Alz_0Ef1W-m+P zFwF>hnRn5hTGair{6i;*>Mq)m`}eN%DGw*RW$f_Pl|;QVXQP@d&s!G5P3#9yQcI-; z-{RuZ`v4#>4Xg?9*WQ3k@8)<4-SU>UGDt7C%)Y;q0)pq6E#MF%H!I-a$Jv)$^yKcg zyySbAGZ3x=B^Ze~^X;bizu|-E*vT}Uqz&|qOIk|@k&=XRnLA}Wyx2d11e3Ns>c)!| z>vM$NkZk^lgxY5vqaL_S?C7*^Y*q#~ee|kUVhnUaOiuy`l_GRviTH*#M;2oeTpO(V z@LnC@`B4Bj+kr{<-t77QQN1wrlN+?Ont4*b+R2XO8P{BB1y<4jc?X-pW}q-OoB?{+ zVWQ*W!&4?GSE=(IlM8fBJ*_?oTgFRexPfjpa$*J95vmmTG-ntGN0YlXRxv#7Txuid zQ0Eo-GxTEF=(LHqW$M>=Yci-;BOYbe67>*yO^H7Kr{G)W08E@2o$Zrj0!(3|`UCnw z_Zxz_w>JjXsHdY6)ND9~uW7a&GGnCk%GQX@z-GwSESA-u@06-WTkO5!F~E)Ha`4!; zw}leC>a(<5to5rj-Q&W=M=ANLau<2^&|M1;6M4o!t!Y{f6|C`YDWkQMhZz`!K)!X(QG8Ax(YNR)A4EB{ z%gI=6p*6aL=$tBJ-;2$UGMz#Ho^zq)g2*ZK_jdI>JHgxiqA|X+4FzThp1y(SF__R7 zhVxl{Rc-xEL_Z$?tdB!o@2N*ru#fvJ~kVW=quZZtJ|)n@Gpg|+TH!LAxW8eD?kC* z8P~tqE4R6IXD~r@_ur#vW6xkq1ySypCq5D4_W?9R=5Ri6#VdfiMU&}CRT1G4hZsUzSX zAVm`bLMr{>SLpNq!mo1VjaETYXAoTbm51`}{|mozHqP6J}7F|D_-E{lH-KL#Hms9Olmwb#0%nSSA2P* zPX5hfrl01zhRTq2zTaW_r zc_Inu`PC6!OEOYEwqlF%ggfDN!D0bqOC*=|n(u)JEi$litSB|}Es@7v%=zF_abTN6 zg4SyXak4!$7U$AWe<~UnpgBOKiP;c_^6(@~J_JE$@A_XhQ?YajUm1@qZy}X>!81a)@_o z)8H%ruvl#WCyPZ|A3|G#pJwZ17dfu|Alpe6^#}=(LZS5pp_nA+J})X43kO*^R>p}t ziu@(BuEGAN{};~OTY7{CA?rcNl(D|~gc4mD(S`dS^ye`2uDs-#hHiwQ*k1!eGX8r2 zzW`~~BW3zerhsDXu}Nceja~Z7V)th8NuooIKjLI(SPUMvrB2sb=AUy4S5Wwc#VDo% z8t23@WrUE=qESPHA$Y;t0n8$xsAN|;2DP?aW+K~!8e+dlnA`l*D+r5X8#}LN{%OQU z^TZ}NUgJiC%O}?Srlvo`bII7_e;P3!+O+RO30Elzcg#p)?Lr!?YNrc(gLb`d#TpDl zeZz&hLWmmq=7w%hjAPQpp##Z*v?<_9VT}PUcYGc4hGU}*<^cELijlU95G5PsE&R`A zU&nG9akDU(@GAJl!V8K{px|G)hcH3_kR!ta9~K}1rd)4~&_Ul`UMK;Y9EIKqmX%4Q zFE|B0SbtnjTRVZu%nz=8r^Vmts$!}yv-IrV*i^fu#XN&3e=4!0rXAuVmjVbHp(y?v zXe?Ufkh7d(Oj<_E`K~@vE+W7|)-ZcA1Jy1Lyu9$ey}Hi!YcaY<)ounyAk)rc8@v~RINCOkA1 zN9NIm33DI8i^}k*A297`Gi?Cf3R1l?_b1}IP<_$wIsYAyl1AfQ2dLma+BvY$RdMY1 z*#JS_(|gVaOQJD8Vu(@SY*LSW%)f3KGbW__E4y}(qQ&!rX38z!LW>8|hSn^qsV%gB6~&vJQE6yk1!Wv#FXGghX-zMpHm%=1l|WFyA*|PP z(C`V7K~SJubfAfhU6H&xGFN62JlaGRpvBER_oY_l^tS&Yj6>m=K80ZIU|<9^l}ISq z!SSc(hB^H`gZ>HODq|lpbsmf5&DpS<%I4!=WT;&eBk zgZt|p@vFR^s3u`aws&g+6q&Hs-CYp7eiixavRH6Vn)A^M6!@;=nf*c%8{UzNf|@8f znq!8+1R9Tr7v4VvoA$58`oB5t)W!jvfJkNvXRrPmD6H zDtFVW{h7S10jy2}HCb-y`(8k!km2{r8Ibno`VnfW_KPEv-l;eceW?l4*s?f~>WK%8 z?_?@VgBE9?#LM&+V6xHD_!gsTsXxePTA^_*FkDhO5<9I>+tychjz|trq)kQ=YBVvg z5QM8CyHj3JMdmlJwQXQco#z&JcUQ}%`PpcYREw=Ii&t@F3u@;zg1yq0*2%upZa^^) z>>DpDGkJ|h0;#p>shniMR3rkkWLFDv%i1A#N}_8>-hnPLCQoVIfUA=k>-k9!3TwG+ zx*mwxOxJEU6pTlmq@qYAnJDRQ*?2ezr3{<;+bhX$0qoTd&5EgEZP{qpi=p&iBLich z1xdr)hzl;1PI#2MuQng#RBYN*+nPzbN*U`{x=dHDWN2z^>06p))ub#}CgC`lOeqhy z>YyMgF|1AKd7Sw2Wt{lWzS5=*`*zDGg4>QdpZHd|vN}W`ZG=-$jjM%ODlz;vpV<;S z8KzajNGM`TNl;Yd$X_Hz5y)bCh6((|CpEhzN3)yVVb`}{+K=dzEBVD-IOmjH0I5}; zRu*y2eCFlvv4NNnJh0~MTMDHxH$`mb_IJr@T@kRJk0E z5m!?Nd)P-8plOH$rh~)YS?QX#&Fh{DruyQ~VqNj+&(gT$!lRF}Xo6R-I_aP#r|uSf z1yUT7tP*Yb*wCr@goI~V-3?VVp|zh<0{sJE)uV_|M!3&VF8G5(4W#1jFa5!j=AR83 zY5}U*+4V8U*Jhc0X6&{`XiWWH&%k!{*}rwFeyLN!F|^c{Qiox;u01Dji^XlT$31R+ zkzdIZ7^E}k0||QT&kq1s_=DijI!lQaR(i>v!V$<=l-q(Updkf%0w8%`&i1EX&F{Cs zXHX~@HCBB$Z2iZ-gt%Z8JW{qlfY(3q_df^Y5obUE_5bN>Vq*g*b3;1=N8|qn;idEa za|4R{&Ep3;Z)mUB{?yq83_G%*vs$X+jZshqIWIxLd~? zJD!zw$>e+5bBJhl{`$xBKx<}!2yVvgfNMzm9WK`DQzk;{TT^NFd2FJzRBXKHScCU< zhZv4FN9PIG+m8hk)`xaKR{~vq#{NROn_#PqR!5dx+v7{h$ppr$F2o&3W(BJAL54J~ zdWz%I*Zemw{9QJ6PVbL3;%&99E>OZ(eV*j7xdVNE$Yl%L*MV+HoZpv%6VU?F9aMjFg|D85Q?d~hjnq+p|5?E3v@o#uXb|l(2 zKo*T^ez4bM>jz9jjn}F(n<4t_8)D?sUzk!+BSWqH7QiW%Ze%8prpBE+wwak3($;g2 zqnvXddl`C^j#wKdG|U{XXTP}!KZb*efR@iE18){X-h+gEJZ=9^9L6+cu@7)b!DD*1 zq61p?xe1q(+75J(70=VYMjyelJ<@6=`jY|eTA9rqX!oq$^Xh7nA!}d)B~D-?b*Ue3 zgj3u`6K@2I<7-w^@&4Od9t%-pC-=ag(YEzG=WoW9qgRoo@NsnVngg`kKXH5Pf@?zg9Ai#c9sMZ)mm9DNr8{MITA-l|i< z25^yOduB>=-+9PWlHJpecYB;tX4eUMqlZ`syHi8;Ku$LQcq81sZWhg{nd*%6h(l4B znC!q}-&T*;bQa5>FIVgO(X=gPfrnw3kyA#1wryr1I5DXi`?-HxuuFL@ zb^(`Ao&@{<>a-_$Cd_%FT`K<-3T0$gH5@Y=4*|4Jonpqxk4(ftAZSB}uzqTdgH|61 zW=2qxBSDvhmw3RSb5;U{(`4{e&g?Zb(rOb#Hw65-{j_%A<+G5a2EswSDRKDw#yN!3 zuCh3((3E4mvVC@6auQ_-hO)4qqWy2N z#n8;;6no&wGTIL<_fvu1OHt@~!2 zj11qvfGH9Ux^p!0Tn!5FK|fajaDR7QzoZ>D-M<>HcA+4G-|M&mvtw-5H%sDZ6I}am z1q5D|{*i@UN|s5*u7z2%8ryc$tO-hu?hu(ub2O0Iu^t^_KCc`uxI2(6n3>ZKN{h&a z9`{@dB&2xe+UMUa*DmFcX1$uYi~Kv?ybb%j3A1p{i({Xcaa$P8wm6@4LsE4_yh%j))%F0>v$ z;q;=lA*Ef=)OVuE%ogN$409<8uM9L^W**v7a2t<%^V&+V6Yd}%x0wd}Up6a<%o4m- zvw*9h-BCH}cAH>3Fu9%Y9&e;O)^4%iZ4@CM-IS>AVBM-HTUd}XNNEx13R(OD?T)Fq z$D%z~A|a^M47+`i60|957iSI>m@C*4_$92fwJyoOJ&xrK^MwJ6VH2uj->{!bP79Sq z#x;l~Nn4yaDfCKrJL3V6xVcZH&I$Io=AH1TD}~+ETY7;t4+aRO;&2pt+7K8lC~Nsm zTn0%(J&A9N&O~5OESOXgS7YdDJWJ&WO>_3vQ(P>(MH6Kap{Hz>`ac@Ad?^eRrP&^p zm=@j=3eGWwiqI0mN-T`Qr-;dt!8W#nx2iZT1u zDaBlxtOs+MJ)D)BXBFnj23$hr8ti`@M6~fDDJ9Z5BlO!q#Y2!Kc$gBL>vJ&I89}Eo-Z+F7z0(CRiueXx zh#nn)mc$6(V5PhuMkj}E=Vfdl=scCfb_Nk#{JjJl#2v0`DTt@2>+`C{2V5yg}{kblkvnijmqF6lhhawIVl4-o<=zg1SJ#sL(am zC^R=qqKu^`M(lS5S!sqVF~uTUc%P(KKYE?2ZZbTHUtQLU~z{G_yG zUPkEs7?U;M-XSvAo{N`Bq|WvV|5SMKTT$ozJP@MK`g3G3r00FKsv*NO8nSiBNpux@BrH%+B@v9h{Qa{U}CkygPsX8qCv!aF0ggY`T3RX}m$Qtd+)~sa+=Pr(=E@=V_I0G5_o*R)zxPX*E zNC@SU^S7Z8G~q?%>h#%C7oe?+Hk!W10FU=5;bnQyRRL|c^s{Lto`<+<)n zr8{D#hp~9HXs@Heb1D{%U1Gy5m6pzc`A`=}nhNS;0&ZcUuwUVWKKA)x@agZ1u)-3Y4_5DE(1UBx!&6XG{_ph} zrl&=-kR4s9kXCRSd4P3x*}*ik}O!<4U+w@0L^U=uw;~ za6nRdLCsc!a7Mh3R`9Oni}Qo95Bz%rJdw?4!Y@nV6$0=`sZKR#N-C6oH}5d}QWBse zt>lIde7G>aQh|pa#IX_;roh_>FmhZa(Ce@RmGF0vIYUTN&@2sliE9qzf$b1>wv-j@ zaS$AUA-bd>xdE5U${+<7I<;gxEc}jR*fUK9E339^q>8&>6pZ+Dw@_9TTnb1*-j&OJ{YH!^vQCtl;3;y^;&9P2;FJNpQ9u$&63eyxGleerL zrfuQVai#A=#+Il1a}+)E!ct4CsN|l>^e(id_-=~ubA>T4)^j#k0(Gh&Yx)z#gCw;3 z-x!+0TwtAIcoXh+l_7+>YzgORysra8;NKwtqBvsl=GVxq3OMn$8kBI28|cSRzO#H3=#*Up%H$_XiSI zM|aWlEHZRhuvA7A(t;H=DgdNsmqLIP$8OGIAB%w{hH@Sc)J9=-$pt5r7tS9I=SMIk z9I8e&ytq=`fN^xSAS?QvnMvWX$O$948@BW=LQ;Qs74g*xD&qp9hNN7h*4?}T;=HXw zEBg9pWguT{4C^BY`)C;kJGgHHUR|vOB4Sd=aHya-)aNt@q;v`cA%Qhqd{v5kz4}#g z!kuYVL)c4yUd84E*8eKb|cAmA>OJwytTFH+Z< zC!)$HOKjK$sk|*2n7BV$mi`(d4333Pf{#*m$4W5W>uH*YL^`^n+?SfR2CuEj4Z1Kb za&mCMc^!snzH@;et9i1ga`4YWxdeosyI5;871sLwTBt;V_e5Jy$E>W!FpUhgch1|30MF@LkZ~hMnMt;urz|z(1YRe{P%bL;wJ^{-X`69t78Ne#s931aVf$n zwisqr4EfEa%-f+KQ# z`Qsv0*L@Ty9HC4Ir96ZrVfv9xE^A(DsxACYPq=0=Qk+N}gOL)QEyAdHL_xyTPby?r zs?2%zoRUf}3fU9>EQCA8Tg}v;=-;2D9A}RC*b^kk9YC|5O%hqCowz{ZwNVDnBlsjS zAb0MM{rU33RdlqOOd?LGgc{F8N-PgOmb7Ek^Og;q#1GRK3;8{)B5dbAj7VB;NPs~H z27;2Bf6J`cWW5FT(oHve?mQ8^Qtu8%yq-+LvsP+gEd!E=w3}y4i8S>r!7SGy9~?^( z$29DHzhim43#F>@b5huBoL3A5z(ODgAv17r>~*uw4GKS^fL#F^QPhxcs8F9Uf2!S# z`3_NpH-wPC0<3dCDws6L>{;7u-l8cWT|z7t0hH=zEKLnh+<%x3xwdk0*sGDx2@C_L z{(N$MX6~;*7*P-m9u6Q|is~#pjXu8L&u=tL87xovqCDp@`*H~iK8RvK0P+hFBiAX@ zm^l`Wr{|O>>*^v(P>YDz7|C8NS$N`kGjTYHwt^nx_dew0^`IOx0jqxEo@Yxmo|TWf z!TO)%EP2t{b(J1vN>Fa8)0e3iCzZ^j3|Mg{h#Gi+@1edpVcJA}QuhHS316I;9TbWfUeFW^)GAyI zhaNn^rX!J61lK6d_(Hu$*6``YeR1RJVqSK3fKw<@p&(^DC}U_++QHaC1Vw-)(AZEH zyNNlG<5U4j0%$5&f5y1WDpH!(|l*4}C0D^qN^D1X4{&PWI`83c0%p-qhd@HiKvJ@U=q1bOIE5zro3yA$& zA+U8tZ9e-J+AVEU>fI2QUGfq-hrjM7Lcl$H9-TYjT82(hy05px8mrT2mN@OXLAAU- zzahky#=m*NqW%a~fGGTap3p>0(0*R`39IuMg}xAS9PtSQQ_9-W|C1vO7h~vhC)pjY zxUDS{v+Iakm-TcE*Ta7*jol^N&hg!V2-V5ITpLD1`r<4(>U|AKEJ*|-82#0h3)ngW zk}=wHJlTi4`91}Ee#=Iixk6bzifJ>Wa>;>M!sgfR|*Sm!XNm2zP_bD<#(d1;*(gJLKYRHli`A{AO ziu2){9hsTKnBEV-zi*B0d*A-^{0C}8J6$Mc>`WHtH_c8-NX%^G!qol0Jy)j zeY$vI1%xCI7OSfk2QCrMf3Cw4R%=oc7{|6jxkk28z`y<|w!_qolLz+0oRDGpkdN**K4W7g=zWltPhrDn|Qiu z<+f|(Hqex5wav(e7yHUZ@mQGVRALv`B5lsvbg%+oEa1nc#7!?|q*6kGKaq*2OBJuxuaDihmT|gsFs?J1(ZB*>^ytK zFl6o)Vfa0-Y4RM|NFP(Rqr9wiYO>e%ioN`mWJS3Hqdc-rm`9${QlqEqW)C=N8vxp+ z#LALN;c~8M^x9!trAh0sUB@{+j!Lf)Xk>IFQGR+`@z)Sm1J@dUSn)SQ=}g&Mztjpk zRi3Q^sx$Q5-qV>y$p@{%YOJz5u?7>-vFj>Zs#L$OjsiixWcNaAKs9hHNlP1IMa!KI zIj#A9b7jQya@VxnuXg+K_-7|ncPWMKxsc7C?v3sr1RZTU7TW6PQ1PE9|9{Q|j4uBR zt62X=(Dj@>?EgDgia$G~hwTXe;U0`v>!P;D+% zQCo;pvb);>iS(2RmHKvu-qY;kVkjupUVd`pO_2c#pgqm847B=@CBm3W+KwEOA-ch z2s{(OfxaR9Gvc1hhCq1k$|>l8E)IJg?+V0ugo92NJtPFArrkXvv35%f^#oB`tb_o+kM)$ZQHhO+qV0(ZQHhO+jdW%Z*Jyhl6NvQ-@QB8Px55{*;#*9ty)#J zKn)BAPLN)|NRi11x?=jw_;3a-iI<{?3m1Um{&+SH{FCT@p?;)88)9Vwtw{d&n6$MTcm*Vq0$`&1mn_jIwOb9-;!$fQUUc7ST8Q-}PoS+($(!7jq311r^NBm|? zdPK#J_DEg;-x~s{ks7?mR&=t2>Dv@IP-ghAd;;`Ib*DZ{wW<>6%L9%1%AAfVn4_h8 z27aBlcwAjSFANceYX&?6QeaIy0y$APB3kYFhXBjgi8YlIXs`i714;oKDX&5$8d`Hi zyKzXG1F&?wH|iCO_9V;YC%uenhto-?1I~`C-K4U-5ta2FfWAtTD_~B~E-fWRTXnuY zB($k6%Qb)5x=dm{!aUZSkXXGQv6lFNwPu<=vfR>4EomAT3_0FJ3zBOH`bZkXCH`kt ze?plf!Asd+U_J`oakHE5Y3**=m9E75IBBJUAfgm$ZA_qaSpJU^?JdTUbrEe~h5lRp z{H(%elHMVfibcXTAHYEa7%Sz0C~n(!*OuIkl9dkQYP)PECmgNzR%u1IQeAGTq`=%e z3ekP!Bf&*joGEIKtm#Qjq+ECza24ovR#NF~B>X&*)aDNMp$=T~%D+2*6&sJZ@f&9g zisOC{$)!^qTi@C6WpZYX2J9h%8zmIO{|0b>8H&+ zj_X0BDj2kpro4-_l(c8+Wt7XLcw_pB?Bl5V&Af)T49xR+!^h^PKnNkU0-BqPMPN#F zIhk|a!xOkc2(_bNj5Dd|cK29Xd}NT;2ype{@E4*0XG*EQdOY9s(2n0;UP&t1;rh44 zkD7(zL+kSU+#4A<7fyy!a)9fvMFAfn%lupI=RVrc)tyU!I#Yq!2aZDhYS;+l&dhAp zI!FhGEOUxW`!WlVX6ljjrTy|5{PeR(IphXqEyNHFO>;~((#DmGop6>f73VU!zd7kl zQL)*U_?PevsP(dWsghonjOe6sG@#B^>BG*yw#$7MD-cCba|0OR{t&F$LNEe_AWZj1 z8~#0v#(#c|>^EEDXG4$XpIDaoqnE}KUNT1T+8#Lzc$9E1(EO`G>mZTno?6peUd2IS zG@L)BHe*|BG^3Er6v^IBgN%9k+@zm<@wnt{sxhjEnnsypF1YaIifE3Ou6#a9$gb9S zUbVhSUh8Dlh)?qmz5|O_LKQRj&6=y#wC5^$D}7HZXdQEhvz6v7r;eItm6^(bMZacs z)bh~C&3G$q8pD$CnElH!kc7??`mH-Zjh>iP^{y$}{s&xuv`!$lSz&fK9{VsvMg$U# zntGcTjLId_99jl@<*j!uO7IvHebLF4IV)jUO9stEWeRM$;EJ_m4_C?7G-OS>Y4DuJ zwbC*2h3D+hb5n+Vf#3F*_KJdpLhV^qNB0%3mc^h(ERkE)b{+U9N?OHr&bmFpDwf=* zLBDhOVf4ajX_Fe|XSZvDk;a{=YsIp@8h$7=O-3NCYCUs-AwCOiRZI(+e5e za9PO>L%pha&z)RkQ$a3mJIqB<(fnYI?0rUh)t%rlG(2s_(kL95++j2&Ni*W%&4!JODqxF8JFxxZ`BsPN9_jef+UeQZQc8u!vbXwo%dj>0XH(rE zS|$H6T2{4^BO9RhD{0l-Q&`dvCa0fQ7x)_of}nt|TWiOugD0vAPBkN{aqQ=6zsaZV zHO?EZK~fjV<0~EKMK*M~$4EDmXEMOOs$dpoc(MLXp!8&XbQsty*+&oGaVMmLWvv5G z0c(r!!pF8;!;Rf{dfph77LR$#Cu#Kcai^u4Ia@VWAyI`2?pPyS8?PpqFj#*RMYp<( za&I*cCso(>GfBzdBlQ};#Dj6lQ!BYgcqN9`|;>yy5PfAc& zxh><{gT{y9AfVHPrC$^=a%1w;$p-+kwIpJRDFuJGTPo<`s{@mi&W7Q$quV5%y0b`) zR^1!l{!0uL{5KbodBW zf4CVB8y(-EnklWO3}@&KtBA_yA2kqZgW!7GSf04NR43o}J6tJ?e6nS$-5GJAUtR%g zKRTQVPCUaU**`NN^p6?v>!Dct`rx1-WQRqoPvr~x2Z;G-cBJLqFVlFKAF%xw5G$qO z$8cyUU=fuKRH!YW{D{C4-YN`)j*bu2m7aNz4FUR$oQ;or9Z-XcYuT@rMKqT0BQ4nX zee;Cb4~$zOnc3STlkTf^P!1L0jjs}=tVxVO?7-uRxm|_GRY00|SrJ0z@qUky998+j zVbC(6FJ?U-5<&q3#j1u-E!Gvpa4fQuEuZ4R?f(CC1FHOU1ET+P1ExHBbbfFUEQ)7+|F{9e zVOknDr=wRV_4)O*k5{w@{NI}Y@c$YiWOzpD* zrx!xBtB*xe9UQa3a$i`qM4{<0gaQGjvZuaeJn3wctaQz~yVJE>=7dWoG&7 zF%c#F?bk(Ven8lZOy7zB?jq@Wg$`MTIv!9SvI6rl)ITfWqv-4h-_g6ZV6GK0A)doZ z1T9?9@grN_6G%+{7}(++Sm3SyABE=+3q ziow_Tn;Q4_cn(>pJ(h1J-i|Ba#fSzFX4DJ&Q%d9z4Ou(js3iy6l>G~gj8uB z_%PLRpH*Z(5E)|YZ8!|)^QPgLyu5w(-@kq?wEh7TiTPDU>(-14YdycfXMrsM?b0;K z5SUvC?S8{ZYfkzaCkj8x0f>98Z`1)ZUynbAM1lkmSIH}>Fl~#PZcfG_T;m}f1l+Lp zPUy6i-3vEnh_V3$f#0V8A_jmqdUo2fAS$NBqs;dr%5duY)#nEdllVu|Z>Wqb$oMyY zSU@I>x|Ec z)bq9}*M{MQpzWa6fZ!FoJ52H=r6vtFjllz9mmA>8(JZSvhsutdFa!Xl5#`wLzjL>l zeqmCpj_5#6k%-q|v`h-TIN==rMS|%lIrs?Gy+%6J768!fS@P*d1@s;Uwpy6bquEfS z@0aC5rV%rZ+nofC$ar!Gr9!s0brK@?zfD3j=K#Z_KQz|aSDBiMKXRCPAH^xgwe`eT zm#Dx@_!ztu-+Hxv<8b-eQCbpMusJr}6GjRmfoH*A1GfxcCFW38C<`ixX~m~7N0DA& zFJDbMxZ-vYo#VU55ZKbZW}yfDcopmSJ|nN^Ms*ik%l>-a1rl03W&$jUleqLFqrm}g z7JzHh3ak0ds}xXl_=ed=&ZT<#rWAOt^gOWCxIqk*50lz=?M{g?G<%{PbFU$w%gnII z_YFA$?@L&N;3cYn)F`lF#6m1eDZ*uqrP#9Sq-@d5k`R#S>KeK>N0LhidOx3JfV9Tl z|1Gc-IORw9dtT-$wOCDQ&hZtI&$u0v@ExeBUMRI{VYOu8SWj3B1UPE9IlHn7^Q9k+MTOFN+q@Ig8*8?TbMluwjx7V)b5 z*CBi6$#Suhfn#|@@-q&D4UTZZ6mz~G7!;xzQ;7c1rWBsF(ULD_ltNWNSsx!K5oJGKbEQ;Sqc!JQul&IaGx^Y`;%E}j~C_rvQx$~mkHeCDcoLp6~HdN?`) zlgA-Jm}NsEujHgpu%M%C&(-Zio5Wgoe&Fe@tkL&%yj?9ST?yAKmw zn@Jdt1P5;hO1oclb1&Jj3}Q%xr;+4|;O<<@O(rGpj=G|uytzMVo~>J zPPcH3cIc^UM7M~Xb8hGhf=ghPAju6XhxG9}pVN*3DbcRx`BFix{CgbmXdtyr=lKS1 z-dY6@H-YI|0KnIP$;y0evmrd*{FY4;i;mZ-d(9h8ry*Yx8JTM~mcQm8@L}y;gK9S3 zb}87P>ba~XLAj>f!sh0&PS|56`w|nor6K(NHDceTI9Wou zB@ydbKGt?U_CgFxEslsiaQA+ZsBUg`%GDjSin2tx@xbSESH1`iE%Vf#7EnGB%7OWnGc&S_{!rpFDLtZuUFT2UFCHcPvw zj};*rb&Ewkm^l@zhO zR=s`@sGzaNQ@DyT{GP1K3iGu%>bGa2n98$-K-@MOQoUj$_Y|Eo_uRU-rfrJNL z=1HuHPgdd1w}z2g$9o{Pk{(2F=yw$h;V#4IK@n2^%R7H#mK-oa6k>Eq)XdUeZNmZU zKFO0n^>PGa5z?zyr+W?kjc6PpUR(~1u?^l_zzk4;H7MHipaIQD9w5f7 z1Rf|Y@n8<;;K68ts%R5Nt0))BNgeSogK#ur5{JRLOrlX^Lo@BZk0LqJN+)ssR0BNM zF{VN<&{0oOb4KE6A*djqqv7KM$fQ3<9o)>_L$3wGwLB%Ek@RJ`*8c+w{P zrj%sKa-ee5bQKE+#FNNJ#6oR-=2e{XVWnJz;NUjPlGF=$mP!0(uzS9LEG==9Hmaex zre&p6K#`>Y1OQW==!6fbbaTSi3TEZQ6%WEcnEz%aEn53WbJudt63`u}P z6%@ETFOyY;g(Z|q%YemJI5pr(R^_oapA%26^6d&U2JB?~TVDnk-e9=$O=vx~{mE|q z$*wYX%PB#4$-6CMK~Dkuxn&uqIWQ z6>FF1OAL0&t?U&_(7J@;ZfsK!ucC~Oal($(9XbQQ)e!AsLDHU}3XlMlV$sF(*pFgq z$En;eT^JgZLjvEzN}&arXp}X1+%ciIG?D+Qx!*MJ0SUA=@qnyj7=2CBiPW3Q7Mu6c z8HS{n3;DvyAtNY9G#fK<4X4$l!7>cXRR;<$c4mV)RLKcLfPalvDdgQ4e&=2)DYHlr ziw$q2fZX{BDjn_Ymf=0)Rm$ymn-C4@6@L25Hak(9X4%gTg{!%Cnm-EqBjWEp&pHeWV5F*k0Uv z9o;JvvB2iVO)3hm*7Vo=P0Pv$)v$F(27z|JX+jFpwwFLat=gGodbB~y0Yavjo-MWt zAdb(9cyLT_EQpLuaj&fk*em!X(v1w~%qPL`Q89u{DlMS(E{;@2`9YF8NP07(NEv?x z0b+SjMT7h-5G_;|_I3~72Oy@~El;7x6M0SjOTJB#>n={NEv;t@3E6YuN1=x5^;|8A zCac@3)h6Uhjun$FYu$uPnE>|} zt@=59Ou7oY+R3{BRb7OrhzFp3sg^sY!X-Jx(1PNYUDJH=Q%uX z&p0$6H-wy;H$K6~H@p9JKuRnRSRF6`fPa1NKX*WDMgRbV|J4p?U}I%#WBnr+(J?e~ zFt9hXb+obnU+#xh|N0@CQxl^^ySJ)_;}9(#1e$uDRaIR{yrO*LiO+VNJAu(??R>$g zJSHt(n9ISf+g0@Nx(GMCDkE;L;3UrX-08*TrPHquV(1t0Y==KU4_61(knHa7Wd_39 zwtlLFNur*Eu7tDxI)4Tc#1{OapThp|@enGKhwa58ip_#1NamV=P=Wl7>I{;v^Hw>B8z`MP|Gs;}m;L9k4vXMj0pgC6>%6FIXL+PhUJ8d|>N4!yWztPR~!m z!}E&Ia3>{6Q2EE;EFYSj&@^&pzV|nS`-C2%PLwV#!&inyD1xgP0eNU1V0sZj0c^7F zZDy$uJ@$(yTVjeKcX6MpDkpHfqjWxCC^{MkLvISizFHn4ADyrzxQ zMn^?GA_P}qZUC}+W;gtQm4XVfNv`dh(m_=rL35)TvW>XD{{;qsngzfTrZ94#7E6q! zl>`?)!v1SDE~aPIB+6^T3muW#*Fs^&dY%uJaci;S)5Y^?z+ebW5{FYA{5Xw)tCH&M zQ5dUjup_EOlO*NBqYz7!&Alt=U#uTHUTK}koag0ed-D|^+IkUXek+Ft zYTF|T8^|LQ^N1v+mt+E_8|Y5~#yjBw*Uxm0%(fSi7!K(!)$ zfJgCdBmH35NAw9pmg2;Tgt%!%t}kjGGZ_*dN!Lq0viLb;{9q27<}yZR2OzYm*h5wMkGI z4+sH#!jV?o4xzw+D^}v~1SL}T4yy#YN`S?p*o%~pJ!=YYij9BJ5 z9_whIrp#ZJkB!pP^I#MyGK47%A^Y%RiOnQs0(bJ-$BKy0i6jO8BnmzdBp$VK2AZI`sQ$F0+ib`=HQq0E5co!pMz!; z7RH?Mjt-FdMlQYPz=4V-c|kZYj~z1}XtD&V>m8{NPe-i0jher_X9S8#?`&mDnnSER zJ8yN3u(fH+9@pbl7K$j0TmG}{;S~s(8&%eun*ydqLzzf8tI}Xs>h}-=c=CZ{)y6I@7ID^~ z%zNv$*0EvM3(da9UC*ojWx;efGwL^fZhW5v*zzOEr1(W}aulF&t?LRfS_GTm<(TNZ zE)@Q{YK7Y;=og~+BN4azq8oqw=HwpZ_$8c=ZPWg9Kx1hte0P&+0rTwKQ0)B1Ap_I% z_HD$&jsEt{iuwRe@CaQYO-ZdoP@~7EmJ*i9+y%^-=BZS@G5)Xve~-f!}g4tXbJBfIu?6VkGU`eAc#d+AY? zqY$F}1r0=mz0v2cYPZGVA~~0#{9oo8kE55uS1(j-e=uCr?$Sm6li+rsX5H|hKI6Z> zu$C)_Nfrl5<)IseY3-JfCse0-l}+PXCOdx4U>HCTU5;Rp+gh`*BZgJ8fFpn3j%+^N z_oQszV0U~1GQ6YDnVa9mf|ci!y68A6T8Gw|7ZW5i5(?>kSZN2IF#?=T-wt>@67!>Bl5EGkwCQ_l-iDONX(GTUt!N3@D}IW8DS-dD|I zGafJw8Z%(;mfB$L&z%E03cdTex}VmWE9|?YV6AbQBUN`jmpxv-A8^b&gS*D>svc`B zxHg2(cX|G`=x=b;?z^8B{jU-K=NA2}`@dmG{T~6-1~%4?_BNK5M)o>-wr13}ZvWRg z+yAFvY0aNQWynV(Sj3-WhmNg)-;^nT6ii2`#6+VzPd{&L;hW0KC#b&(Ghp(WCY7t|#~Ep(Ok z#@b5&2z%Vzwb)AYx@ zk0bt9Fev1#BNM;89vsFrLG4IUfG>5(2iWv+AQ^0g32*#_7`?9<)X-GqEYaPk8Zo`F zC$7+VBE8>D;yml`f#vJJ(qDh$&IozFrLqpt3Ml}X_;~O#0|&=-dX2}CcvFS#2$e~r zi(u-NYGGr#es%>5DYS2VSb*lhGfX~|jBHZ*EN246^N{)zZ0WHeB>a2*rdYqh7}^}) zI3NXW3S#{Ne$u4vnd9O5;aSVt3vDSaY#sJpgUQnO`gP$_}dmFSN53!F8bu$rZxUm6zOTUTqWC@HsgM) zB z7^66wQKG(WhdDT7A!Ahxzj?VW?qSR^{@GZ)P-I}z2m-;c^;orn5LLK5?Vf|ARqLwe`Kb+StZ%SC^5cn+jq3*uRNNB!+7T61itXS~JejilhVm=SyQ(Qic@7d9 zExJ?{I@mBzk4aBhQ{JaZX9Ahb@6wF`RY)b4{1k>PQWjzm8OsHc14tp>07d|sD$U}u zB2PjMgp3LG1=r>^%ZzmYTvO%MHM!z8YcBbQ99@`{jLK2^Alamae z{!l0}^~{ME&!$_UMfZ%8lqY7=39Gqmy3R3Q>k?$YYlwAOP?yhf*Ce;W;fnU2Y=fG*0BfyWpHVNNO+f{S-A&+{<~ z1c!)q9|@+S@-1Uc(M`gNtfuz`Ar{RaA+N2cC z1CpKUHXnXGE6F;Lzy?z5ArIdRXr`)-jedEQndiVaOQMD%03$^)1jWfuuN^xC#X8Py zGtZzkmqX+asf;wdsl`y|1;U?@pMl9PY%D{Q^*horIGWB&T}Y8KGli(1+o59z{Q|4P z0ZrHTOM&QVh4Mmsx{qPE`MiEKlYU(Ye-cPn5>x_(FL3j6ZO)&=9MjhpVEItrc`IHP z*;=pn$(EYx@XkQL0Q{})F~Gls6AuvuoBBgeAFy%JGE3^p$oIrp1lJVz45k1%fW-t) z6s(B&2$bsM^E7Q;Se3UkPtQK?O=WF)vZz|DSH-LeH$wMs<#}g3D3P^QML0$L5UW~r zPkWD|xYa&qN=7)A>Id}} zhy#vm4!@Q&qIxcblE`j-*d}U5rDFu(T_{&s4Jbr5gbSdzI5LI?>kOi3Qka-QBl4p; z@}i}7*uPF*_V;f@PQ7SC1jokb5JpJ|<2|DU#iE0c0KRQKa!oCSS-dgg%`)PMeyp8r2YCX3D2u5_KxhE3~&Rx83oG)4va^U-`L1KfgP?n`&fqAe~!r&Yu+By$?PHC>wMLbVS4{X7r3rr zjjwHT);_NMtfpm~^~5616!1*VA5p#?YX)*z`R5w{-;yTuT$5{jDygi$`>Q^DstcX! zbI$8MNTxKT-^#WUHLYs)kuj=D>$&AA!>Vm*DW7f}b$-b`J$i|Nr5>jx#)(#Ku(2AB zYqVu4$wDis98*K3%A)bUYEi;kwN*RmTxpYh;jv7!+I;-yMWOMrR5Rv`&O;GPXZfof z&FmmkT3lo$T42nI`29`CsZlpa=6gnwPDBcd!h7`F?JNIg@0IS2eG;W~{w>{Ot3IP% zLT!lc0%yvZUvr^x=gR+=)s=_nq}ILubO!1q!fnGQ^r32$rB;mPiwys!ugv=&Y#DcNSSm>Gjw^Xb@yuI*0@kDKn+z6au>FFjQc%J>V)COaZmes(}E&xFenK@ByZp#?8 zkqFb>wvF*?Q+t7+STd1>HlUU0<@f~meH{aQ9u`9Oqrd4+tk?$6=W%cE?(Qz2-}L0K zF63_dnCFq=h;vMP@5fu-=#L>*$Ug}8VYuLwh=wCLq7$JkVIh&=K5~7h%aF*mc>A&L z{_*d;Aat**1On3Ue}`zJho#%GB_OpDXP{KuhdpP5?Z(Uw6kHK+OIhI7qUt3%{m2p! zqV(Yp<7-)Rc$z!wQSe0w^>w&HG(Yx-o5SK$3@~;P>58~pi#2sEUZ~TN4J?Jjut`_i1Y5=0Z`8YEjHMlVw2Lo8pWT}}ZvH-={bL60l#L(d1 zGNVGzpGa;46_$y5O($F>JF0Yd35%@nylrE>r_Jo*x4)uE*#7L3`C`OnhoU~#rF8pE z3L60AVg~YY66wtx;$$1Ihwf;QvtPAAI#el-T zOUd)jy#@#|a^ZUWbIaW#f(%FKeUR?|1sdB=@I)LlHLDL#;V;C2C1VAS;Bv|2y_N=X zEy#c=NH6Q>s}|epc)i=X^<%YzdHxCNuT6l3N>BzB$2bRI20cClJklXejSn?DfM<(X z5sclov97Ai5w7=N+9Hh9I0znn-N}5_-l_ zMeRhNvXu*7xzJr4WF@>gpQki|=VT3G}*EUFV6%*UTjl#D$m}UIF%y_t= zMflCVlMvHKJrGEY%h^ZHej?+bGXNo46ksYXsUyIG%BW0}us@fHw6_o)nW8woK*naT z9-GDz*D&nUX&aAmaKq!r8)$6iRczxaf)mUbzZ({DWe(8I!AKLXiHS>LvWnZf6G1>D z%;NP?^+s*jy5XlM2v`Q*Q+KVC`;;<{9;$yRC zGL;GL0`+pFL04$1tG;%e-YDiLB+!~m5#)pGC}OjY?w9AmNuhkUaq2f;s9Nqk{0ew{ zd2CQ>0hEA^R2WAjg_DE=K=xq12Qpiy=-jkoYnW9@W`RjIp;%+T=%*qZjg2KUZ59bJ zFZV~Uyvn~$hiI7SDUn@4Zoo`NyBbSE?QW7(krrY)n$h3VujRiBeGTE`6iYKLWVe1p z4LR;_QllT|*DDb1k&v$hzI$v#Ofjw2Kl@FSYq6Ejf>9GKfj$1VG&I;~@~>`1&cx(w z`mO0f!is9M4iSHB269N1072w(+$A%7tJO%~9A&7QwPJa_gKfD}1kK4N7c;Xyl<|ZK z@vWA6Auh8vg@v3k50A>?v7E+S*WRf2J`ej;tQuGPn$Ho0RF@2ftc+@OQLRu?;ar_q zDPU3@zTAi5v6Z)^dfDo+V1iPesca*kl4wEj4k=vcXZ^mQvRS+|5M!mdyjijYV9lYV z&#{O)TY6;`psrcoB(!N95e~ZQ@K}ngcgeAd)R)YP~sZxQkJ^7f|DVP+N6K8T}|$i9x# z3GWG&&cIkexjthq^=e_J0^(B`L!sEM|2(dZTs;`KCb+3FHzd~GCf=1M_lbg;a~1vZ zof!t0$o6`R_39eMvr?@SCs{S`=N*CH!*vCZ{c2B@U0wt=WWafudgppJvRwXPb>vvG zL@INny=Tx0*#d;UEl^?8i9V9m+yfE13cCq4s>cP>E9@w5n>LO%Avbh1Q)qv3*3>|@ zSfog0sB)|#Zamb785Qhvlsu|^pzBB0W!`eABWg&gQLkeem#}PisnFLSZK^j1nv?t%HlvvMCHeTBk+?HFnb{i)67BBGPp{#G4j1 z94}je9#jlaLwr|9K2O=BgOL<3tfy?0Y`&ihWVS$!#{fGXjb04RP*A4Iq+DiHeqKM$ zV3&Sgpj#3em!M{y9;V5cj$bMqs@_3KQeJ|C9Cqe>4|;AiXP>vIu82@&)9U+DK&qkL zRAD96YZjyuZ|?SlI$j^~lpmMc)r?Cg;py{11ievoK?`kSQ#Q3c(W&S2`g#^UdG|mQ zQ0$WtFPSVsZ@0=SW>}hWa4)`c(@d<@%D41>T9@QNJ!YK}xHeIrZe{srEkTemLZFGU zwlK_uFy!)X;C=k1)9W!&2NXzV=Yx{U*o;mhqElXdqE09I)1B`k<>u<^pi%P-oDcozz-2#r2JDJItWEr1a+mCx)G&ykZyfIrnQpvx_?mvYElH zh@CK-w^>Qhh=^3_9woR$|Mm@l!lsMw<>~f$WxW3p#9V>ztndRxLy4?AGMQlK&S+8| zX2I4w>9!^O#NjacFKS4}4$vZSkz4bd=+GHwtMh~UnGuNQ%w$M*Ff#26YO-J5@? z-0O8}VyK*Bm{JQM;|aGdFflnK&h+MqPD;&3VlUubqcN79_v|;C(o+XA|152`*d^Ll zCv}}Im3&hD;x9j@Jxe?q%ioyGG9)uMgvl`LEc6o)*_ZKpbA#lg5r&3(V}BkOoe+>) zw5YiB@LEf|-5z1Q?*4dDKFyT2mU)sOKmY&`q@Vv%sXA_hCE|Wvb?O$^A3_@5WT>&8N0eY-XIzkUv1m@@W+Ycv zxF{Y@wz?t~$mdWNJZ~uTT+$Z25E&ANK<#XVCy0a>!aCw7C{1raiVyhYvoenJG{-B= zc8W*{fg%P{owlvA*&lKsM4cx5tmvin*r~JFJ2DdMx4pq*L-qA2*8ifiU#Nrf9Ag)v zv)>DA?Jmsp#ZpfEl{TziYCcA&I##cKYOWqbMKeF9T<@OwWMApYR6UGtQ^KT)y|iDU zVj86=^1yl=)ihLQfQEY{pq~l9PaP@{1%tbr&m*Hk@7e{cWe*G|G7 zM7FA)J)fjC+KLtRNxSO-o1IUwsj%6WS)%|<-IV@{v*PdmS!Wd{;O-`J!xJ!Wyd^6Z z#fB360OiWrA=|z5<0)vOGbjme1ij&W(Ei5WDs?JxCn2;$94A3hi#$qHSn%<@NTf1? zPxkfVQN}BnD~p23ZhWisH~kiQpA>BquLKQjf#}-@_p$5&O5oNaSCo2$3H#K}!TVIB z#NLp%qr_Uhuhuk{#MX%>d9VCz_sJDzDFHRiA!YY<)n-Ov1??*hPqcQLXTJTCTHS|A zZVjdbrwOX`VKi4iXC8JnEW58k#>n#B@XM87HGAMsyn-H!PL|6yE(?~k&Ysr8{%d7q znvlFL#D;FBBSSXsH70A$0=iI1j-Nyoj!1xO@_~IS{_Es9m(C;wmF^~a!kuy2vuo1O z5(Yp`>nodjG%ox`ELzBGDOJFKI}rDCwxx`kPcHLnit&dVxFp&U4+hyh*5HdSdDmQk zbXMxAc3*UDU7Gi=hOw>lVk zF>tnjuqUo#uQeixl_8TNn@a(buVEqh=`WEWU+3wFY)Lxq2ujIgV8sGga~%s+bGsa1 zQ`{zo;9wg<_=6ee5HuTu0o)akf#n7k{V-iV^!<0TO)M3q2zBMsq?Z_hNV{Dz#G=AD zZDMUj!cbAG^%Fu9XCX{rRio7%zS| z1MwLGPjlP{rmwbOoWtQKzU>_w^AnAa7w(hi9cU1)-r{Gz?IV&`vajg67ntnB!AVOX zpOow)2Mx0%xm8$$j9WySVNaXGH&H#&AWODs3en*19tc;ng5XzlB~_eV6BcyD&*!+I zmAew{$0Ti;@~*xzhw2K9{bQBLo9oAuPGpHMVC7C9+r{|WtiJbKxBb%B8<{S{vzgy} z`Y_KR-@V3AqYG>79af%ZoOCasvTrOqFT2WbkQ!N%HyC#;A9*%+xK{OC8=nhH2uy|A z`A(R`-8CTMABb0aUpPF|G&f^Iw1u0+MLbTnm%j~Ooi;>#%oruT({x_l;OY(TgT3#; zu2}54gWg%Mt}pfEowtDsud7vMq}-r8{?2?ab==-Oq#XUe&=v!{yOmgwlx5(X1Zjk4 zWMarQ_D_d2CoW0LF*Y~v2kyefUS{^k&Z0L%Sk{>T7`_qlPo?+Gsv2@%V}5?{e_c1E ztGLOosZ3ZW-HQ2&Q?~lMhua4}2b`flXw1|32-hv#(hPs~8PTi#O?3%N_h7-)e+d%`%d;XE0?dVcs-PV_~$!y`=FUw!H2CW z>(r!4y1bQS2JUo+!8OoGbqH(?kH-gPrGL8$PSNirdAcTBM|Jv(j7gqHO?1fOXl=`!Smc?|4{i+dfs#~l2fB0sHI;MFroZY& zw64sC$o}sx@|S|Q$?tRCeFAKnQ2&sSU%>qzS4$T(=$v~vZh{>N4Z!X7BFAP?P1vUmmSe7{2E3Z=G;1a$ zUC>A!Ra29SLYO6H4n2vyAWE`|hQswqFzgXoGidJRis3v60Nb`iP~X7Yh1#(97It?{ z``*;CMjl(R=ZZ>lej7x~E{Vby%fQmW3oZ-p4@`TtKu$7=vqXep++ca)E+sj(az$0K z5jE7CP1eBk4fv6%nx1-DS5lijmduoMaE^bXuU)ltX^Q?xIIWkMb36VLR#tGm#G$Bs zx+_F{QHSA2fDPJFT0lw<#gt?AdrI#0Sa)b+7WZENU7#xBJe$lEDzsU|7EzLsZYNKS zq|$`yNF_w|#A!KzvfSLMOD4HAR4F%inYRyh_6KHMh+>QtqX62Ie0D9hM2oJaFD7^_(}nd6A0ZUSh3Ei!ChnZvirbX@M#th`I5t2%6+@6k zL7Qb5PMpHV2zWl0^qX$onqWW9D?^Ba2Y&a(rL?SR^z6AGj-c&9S zG(tIEOpFsTYaSwnDm;nxo!Il>ss3OuCfnjbJ@Si<H^NgJg>qu(#*!H8$P;F zNfje8hS)}@Wk6xbAF)~qZtWYfOIEnF%c6zYy2I8j;2e;fpnL-$RA@_lm96s3X3dBx z9BFD}qMwuCltGvV#>EJN-~H9Bz=?S%+q|Bro;Mrt2`i3w%tYcR#AXg~buJ%6&=Ih2 zmZ?LCeN|A%rM#a@mCGqL^M`NVD$JpSaPd69CRToGRwLZlEfeQ~Pb_P0PnL8d74ElgVXVEcK1^!YxpeUA?CNGi1ldar{pM+FN^bi=_9zF^>Jm^bg(lq}ep)!{$ zDbp(jc)1z{k*7ND?;i?ZEPMH3gusY8mg}=>;5#kEa83TX}`M^&R3 zi<*-BGbzzAfAs;3%aO>a2up9fWhtM!6xOFh(7XC-JvRygvi`BiIflWBPKx`!v2Moc zPoF8k*X&e(BV);?e)%+1fmgAX9HT2A^@<*1RXEhjh6$|k3)-QsTKe0s%+ap%H!bU7 zjN;}76A0A`o5}{Gp%m>~+@+}n!|1KF?`8J$h`s|s{%k&(G#e=NJPiPwd}BY?mp{Xl zH^|kxWKXc;HK~7Ze*@%y z9xVrc#yai)ZKI`*j+yn3qgChs?_jAF#Rt_#izKLU${&a$IOAQYfgrOZtQo@iS%f=Z za3GSKHB^auLu=g`L@}SV)6?OnHt~{|8dflPuO0J>;xiWSGMY)kxQBPN`i0-8`h7!Z zYX}1q-4GIu_1BYD6|jv$z;YD5suK!UwJaA`|6EI{N~H(MZk57I84TUA9LOMXDnweX zO%K2dvOqFGZmbShdtT}|BVzE#*e z!_VCA@PC`s|6j|={h#M_Csi|Bq+#SOwH1M8R-(YkU624v-AO%6+7;hl&8>#*dttwg z3b6|smD|TIs8h=IV_OJ&u)sh>Q!xpnlW3R4eZ|ID#R|#MG8OTOU;W1MaAU=l$fb#1 z5sKTlGnP5Z{}0mMAy|~KTNd25ZQHhOn`hg$ZQHhO+c?{{ZKKbBC;htPcE`K%q6Rgn zVXgSqmzis2imH0M=X{6#)~s3c zWywRXRidgYT4yR5Jg%?%)fG)Te#(ukW;uX6k{{9?*^Vy8moeuC@Fd;S9IZ#663m%& z!$0&!zY6c<-2;w;Gv$Wyj7BBQnR>%LbVSby^X1)xj-xaEa6O1d(~I>6-Ex`!QIQ^(joVMvq={kz@XAz?<84js7TY)F(3{ksEWT2!Cz zA^mM1sbD#cD)mgrjCX7Le^Dc^Pf=)8Rj7oaFa!ej#h zQRj(hH(=iuBYDOl(Ir!joK#Uuqq)xme0sW>%k-ZpwHxCA&-@!|0I~qs`qxa%ZCJJ*d!|dY zG^lC99n*YU=tAAW>Rq8*;R#y-S9FJ5p$&;IZUGONn{XV>6;koGy z{lH)Fg?*aMa5t2-IRi>>sewl{zqHM5%YA&yK**MOwQ*Z(FD=qJ=!A zXo(JP=h?!FXHXrp(ij!thltXJh~h(q;zR-?QaRb2psEWPAfgWdeHFJ)sjgc4F{FEc zO9y!-2xb_^Px}gwr#ds0`_r6BqZw!Xg^VL0R@0Cl3Ca9P)sF({S+t3Pyg%r}6Rhaa77j#&`FG@3h9s6^ZBL4G%y(W)ssLHcB@bsfO^-t{!%^up@b`f&9 z8`1~9jegwY2q5Jw9}6 zt+LQNy#k4g;PKKj+1`#AKza6!4VXVrq^u_wAxuWg_f?u#W;u{4*cMjjbqiy2fBTIWv|YLVm?embqXa2n%QA=PW@% zrty%fdgxENuzWNO+u&hEjFbUBU;*#zi2m~Zio_CqF&$J0S_Po2(!KGRf;)Ij>)hu1 zJWLGB*gJnVcs$iZ+d6Ijh{Z=C*l@6Gxi~s?tC|X>xM?n&M)5F-Y>>hxbf~1>VH&r1 z!ABr-~;vBIJY70ar7hlllkicd;-V;;Q*~c+xJUkVZtil-VGBI80zH)-J={74*En4 z{)k4pBYrAR-*qekn2BcxotsVz7jP#fUx@Zpbw)kKvnR&W=e-FQ__wN>hIwz8V17EL znebsreCi5k$vJ>A_DKe3U8G;ae|%|VZt?emH{deHt_8Z|Fov!LxMMZI-Wv@|htGtQ zBVr@Y5$TEX1h)e^a34SpJB5oQz!T&ObqBUfx}b*<7yM}~G8v$Y8o+tzit?t>4?XS* zrcpFTBbHh9Wm?qHDZv^f&bhG|ss{Z3kq@*YBb zc`mz7bFt)G=LshgNtW)}Eq_|r8FQFB_(Y5&ESx*Mqx0x9qHSd-JkT4CBRbFE1kq$e`W9_ACM7T*fN&|fU0*nG79|h*JTYDzG zr`r8IYa}Z21U0RB<4N^PT<7amcP`677TzoH=OMmq1OJI0{v34!Bo0jn@kL}!OeJ_q zNN@WT@@~|tNy<+X!_2pLO>bL3l4?f*puTN+H?wT|x zUdyl4pPXx-PlQ?P%PW1xfA>b&(Op5`!28#DyXKxbt)PODjqO6-kc~d%>$Zw*qK#Wc z?JqtDFsImI&1nxLGp18RpDLt}i-Nf4lPSHGU)twB>+@gW=RT8je&KIL>0h;`ycie> z90Q{`*hL_i&2*ttr9?SZsGJ@(+|rc4%2DUvRbe|$l+QOW^I2(1^gF_J zOeH%%#=NEHawQYazez%F!^qCRnL=)($j*M(Kl{J`!8+InBOSaj0093%H2*i&k^WyK zN$7uH75?|Ij*FwUwS^%wy^FJj_5TCjxEWYD|F=j{z9rwVp*P>~KkxsS1UaInZ-+gG zxVydiDXdj!F4;iK4oL?G^#mmDT$L|@Feag>5fI={MFT1pUKob#Mw#Q@UG$ooNQtva zg!BP!{lo?~CpO~B*4@`8`w-Eb^i5P1?7h!L5J$P(> zWtBqaOOPshnC+S>sEsH)k9E+g5z>O%K(->tHiCUH${A4`#XchI0G+D=Y9qV_W+OYV zi`4xL^lb&+>>QS`;E?REg>7t6+Qf1*=zr->09>_YZYE!NkLTR5GrMHFaxML>P$82t zMb3c!!h}kN8PUjypIfdmbwiZt9D0J}oJbJpkEb=1Y*XDJMGv!RPB2to9kx$^TmOSZ;OKeBS%n_$*4Nx&xHev_c?f^!637WjXQ0VRt^n!8`uiBoU#8blVnc zVAzXYN0HFmdOcQIgLhW{7tF1jx zeEH&_ZNBj1O51PH4ltFt&=QNoLyVlJg_SpGJ!9tVgm{7V)@6Xln<@`1w;d8;iKibS#bh+ z&$)lI1huS(Hv|yAd*Oyuvlw+yt&_V8)h%0xtg%X3JCiVONzfL|Vx<9}&+?WRuHBM| zYxSO29$+YuBZV{tdK}aJh7idOM#n|V><+kNHj^SloKu%+=9Bhw)iq5&0Lh@)OaThm z#J|3bZdD)I*LEpx74u#oCyl1xjx%#AlQ|_9R4E!|W<;WjMz@ zDYF&Y&Asj}e|Z*We{=WSm|?Od58j0RCgxk>Ga~vAk#tGkv$ssS{L7NW&a*5NCa?Wu z$ygBzBnv1b7Muwcilgv$wt?cqH;r_l=Y*5QN@CVg^9&nmdh7+Bl!k*`Gz-HJ2_Jjt zM1{BM5s|E&iUag%M{ZW&9p<3h&|aMRVV|wmqQwH4DxlIE)y-`3=y>Fpdfk9-JtX*a z9lFjUaVxMQz_eXPLI|-e{hQN+_yf3Oz|+YbCTSlzZ+_L@>CW&2CFcy~M<`L}?k}96W2V%w^I7H}rFzpXm?#KnlG!jjQivGgFkYM^XzV5&T zs%H2i@778NkaAfWKg%3lewzpXM5kgR|5|o0s{6&Yri}C{I(MGmPq}U-)#D;cJ!ys?7nvUDk1bk#R94M~r;_bIoe^KN9K@<+jrfy7k_yJkhZx?uiwA*`j2vP%(o+Ar5hD6sI$O z+{xeKK5tw)?=Y*fL6?|{v89O8m*&i#1y~!QjEi!^^KBSN=XOt*ku{@N{jAzq?J3mI z1gSR$$>Mu5#|8{R%073M%ooIGzQU#8?S~xyriL9?@=cFZ7VXv4`fM;Z8T0m74E(^R zfiIuj+zZBi7)DUI1;$o0`sno?fh`O0-@)%2WWFtOmweuMQ$33pw#E|A#(4GdC(k?a zPfeM_U(+vH}>z|qkZjaq0t+t;Dy`rn&O^XGz^lYn9m)B5NC#V`UJ~-&DcosER z?e|Yq89`ub=RB|C!G>mJ?x1cnL=%J!HNM8WtmykV9l^C`6jhw6izg5p_wzHNU zgfZV>*2f5{|I=)(cD^qL-vFA}#*Ck3V6_XQSqtohQa#ibD|bVw1C;wT^&eMwZ)jK5 zv2I@f( zdZw=u_w_J=;~v(JYWV^IiL_8l6bShOQ9wRt(!W7`H&%HdC=~NNEffd7y-i(XU5Ahj z-eXxAIXM}(-hMN$kGP|Yi>-nGhgXgi0){!OH5)gLpIp`A5OL2Qp54;tIGtd>`siS3;> zOi`?S>aCa4rpo2CE5?iE*jL6fW@Eg+Brp)=r^bG0@Q#4;-Px5_peWvxy)bC7Vdj@ty=6JlKbVYpvbd6}2(AU}5 z+Z5>QFRyHt($%mf4+ zdN-kS{;1cYJIpfZ(6O(D>fAC&Yzm6ZI9`&#@INIEQ`S&9a5*F{xC&Mw4cD}E$!#4A zH73$bX7q9yTU%P#yN&Pd2qaKp()>20PM2Qvl4VxRHjiD*sV;FXD~Y!J^i7qVHQj(h zMyzF6Ukqc}lv5uB`R{W|3ZXAZz85Xs_ncW?T-hT5V^_ETGtGO1=tG@z0I7idNzx;L zItM|p-;{=~4O^juBzqW9WkPi$53hqmyA&X2q&5-C+o}Y6=I12V|0^{Pb%SC>uLfM# zl0D?Q*VX`Ococ21CTk!++x3m_+cVM)Ob=l&Fx-ed@^=$4*}Xr^w6-<6d*=m-UN(dw zze`8|^Gde>U3_jSo}pI(1UKaOl9pGZT_UxxKQ4_+5Jh0g>#K(p50~U$s@7sxYwwb!3fAvpALG?Ql)g#JvTPrl@j}Z3x$MX1Lb3dk za(YV@td^%~J_{473GL#`jLiD#-6C^NgZ+g$puk#;TH;}Q~ z$)w{ei3gFbp?&2}efk37bBhx{Q%{9eCxvN1bX#mW91q;yjYdS`LX!1=g*t( zEhr-X(2W;I>YEZT#umExzXOFx>h4}%*&RGPvW`t_{tOdTGBn7ySEsU+Lj{q?&LpyB6s6{zQz2VHOD=Uu{$`R!ziwuk4d%{t1wW0s5uI8|B` z7j-t0-uhUEqFPCYb2HlnM~XChJae7yup^G5D{7yQ#Kut(@+jkfSI6>$6(KtevBm0g zEX}Ov+8;oOHvMIrQuXfYj3&0W&aZDA8R;N{z!I$@?DEg}`5Q4k$-_^bv@t=j4jBGT zvz9|st40C@)l_77N)brur#yb{78=#fiC$fW?&t+7*GKoFs1b?8F%+LgDlhY!TXcL^ zpufB|A~YbNOiIZOXEh&Z>KFnM{|t~flRltGx2TM}X5;?$vxjmphK6`1ar_C-!W)vr<`jTL$T2de)#XzMG1RjhW^E z4CPhzd*5)NU2eiMHZt`zDzBRT0NY@=wsu_{Qz6g|B76YcORagUEZw8O!l^QI|B4UxEtEK z>mi|qnaxk2t+FQrCY(;v>Zc5XNH___*(G>xZ?y2leHY@zP*>?Ge#eY(FHlJ;pet9I zQ+&t1HnZwG*T+y)=d=*fBrg3NUCc%(KnOq>l??pFx}m^ihidAU7y+GlEdYotuYLqW zRl-9HR7c-Sj>Gr3r4V&Y)*zi~`r|px8KF`OwTokz2$ZJD$XO;O0exu&yz&$Cp&*+p ztqQigsfvzbk@x3WfRiml(B;+9lnqrwkJo{T+2KcFAUqStfbp?CVR_`adH_blgqV4x z%lvXlt_3+iv>LErokT!*ogKqkojAFG5jwYT5bMr6X1)FyzqrMx$$MegEF;C*KwVi0 z^d%IC3a9F^*;Q%I+Pg*h+np*?+%K3<`o;XLp+Q{GOT@0|VumKcL>U|EQC0HseSI^|1o#heVHOuvffk1nwczG|dwZMR=sfs8KfytOaC6D7-F}eTa z_smQSp-v772=Z~Vu--8XDu);tYv38+?)_>M!1)3m0UdbvYdoJz+!2uO8**83DFBN= zx|vsD_P8V$L)U=k_$W~!tfy{&Q8JeBIRfy@%i`S`jK?;~E5a_Bu!@`GbN#Oxg5-FF zb)>_o?7j{)Q|#sJzKdB|<7?_$eI|LYa8e5S5mA+V?{L{&>Z<2ofj=C`?W+MCUJ){G zu7MDmW>t{E;PGU*qC@~y63mbnh;qm{3Ubf~-alPa)NOcMo6dIp8k(AVZtOR<^ry^i zQ^%`qE8PMxyu!5JXC6^F@<)qV{n>7}c7$uh#M7{b^{l$>hq{;uk>66@69FueZ57GIkdwAAm?C+-G-i7Jqfbi^BQA_P3lkDi{6;;C(PgYI=#aG-D3q zaIL{;Dv@N;YMW|eA5#hxWjP+v>|h>JRBQd7XVC3yMT8{#7?8iKY0f$qjug`bSh?G=0AJL~EMaWkCbRt$E4b;7FA*|eB z*qs4f2C`ITA#GCj;<@9(KvLR6?RR99-~42=sp^eBmeN4Wl)6!0K`%Q7E239!iXVsm?-B>QpBfN; zT=KW>srER86SM*LaPrGcf*pQkqo}i9u1vYOI(xX8jg+fZi&h`k(kUAC-9RuH(&g8f zA}cB+NYn|-(p%!^HFm)6+Ii5p_Qnur|NU!um(HPIk99s3_!RnPpiiJN_`tyFMv$D{ z@Kx+rh+Z=%ZY1 zE4Q|EQK#S+seNekBlmYUMU=+V=vv@pG71J_i1v@Rugm+I$W(Klqe>}|T} z3U%m8UFV(r=N<;{r8k{4FBRMczxi(?yj=uGgnIc0q*QvUlhQRp-6SdwJ_JTm-@~O! zfz?1Th#T=30-ZrC>acD}d&Z06gN5bcv@l`fe8-d>? ztaj(Awu^11?AF>|x@^x7Z1T~a(hXa}MDo_(m9HOWhsu8o_XDSgaaBY50^{~SBzF$+dx;n0=-XT!L6zNF z@A25mIX+fh3F+HW?KDqZVd2`n%<1s_M4Wi+HGGCHuG$Bkn5=557}ye_FfQlP3fSn$ zIGS+mLgcOYp+$Nzi=@=`cB!apk@DQ~9+ea`GMm^YM?<)(gj9=M+|p+cC!G|pA@r__ z39RRCyqLZivdQ9_S;bxHO|mKF-8cguTj79rtT4ve2QC@*n)(5o273MZ^R*Q08{9ZoH$| zsPXwS{N)xZlT(6zIFue>rH_Y0#P5mx!_ z2gp!x7L*t8hL{iv@eriJmkhmOK+-i2D54OT(BuKLG#*SICb(B)YN z8AAz;X{3`^aB42s)`J^U^HsgxW!kW}DVV4Wm=F(>yx!jC0`}=PQSDZ-iP_@aXU$)e zq0zdNQ@t*_%waFdfAK3Z=Ww6U|Di%;W~Oo^f&Mx5{;THyzRsy30RU9~59{2~-0Y^bsyDjTO3vtJTJ1Yq!}{G3IquP2GEM?{3g)^gv!FmW>_iuOfgxlVJVaQ*q$z1 z(^2KkB-5dj(sNLDojb4zQg{G(<~E&Yz;;2ZV|U+&)kw|t%lihO*tu69v!gHXsescT zeDNUuQ`}Sf)4`wuA81)Sp)s6LB62a_;42Jq4p%SRt7jf}w+!@|;TXLlj5(2+wcDA& z_JK_LY`v&=YqXzJji{LczpR$F?Ab5r%c7tMQLcHWNtoLxj+9Af`=5y(8YZHW$t_ve z3M3ZBxZvn=M5d0RFdmk7aBZ;ZHse%=N;2#PZ?mwHdr~@iJ+0GZhZe~cvO9)a@K z__2Fn&@ZupjT&TWZ= z)qrx=dl_&jN}gU5FXaN|BjUCmipVpKH-V^`$M^g~fH;m{9|KIxJatNG!HSlQ1-;VN#(pcv0bt~_ z0Nbbs3JbG!ECoaU>?;~_lBr@3?oEGGvD^cQaur7$Ym}X1@`~LnR7|*V$$p0k9$9_P}v{!fhKpl-$_sZQ&AksH&)i)_vk2Dc4_F-!8DF$BUcGd8xsl-$`S6-0A z>9Rh{R#klDWHvu()<$kY>w;h-BYT6HKA9Dd2i1~~ps#~|>21ousB>D&Cbdo?cyF#2 zjy}7bc)df7qc+jwe(ARBSukeu^2Vj z8sE`U&mRP5*#zt#uosqg61A~Pc`GmD5<+gM!I2=< zKX5k!BC3**Z9NI#gkJZ#Ud33*&1t9qkpH8z#?y`a`Oj0)+WT|%keuiFPl zZl@AO_s0WsT(RyPTl3FH5$J%g33d${LPyLJ`d#DSj5+P^9|q=(gYVwP_~#9tQX(iR zUi3i9;-oe?E1`kL9i{ICh~_nD!;YyI%Z=mP&Do1m0@3|*ndq{B59$VE&0(7im*yNh z?zH;jjN1?Vw!RIo1FB^Sf96&1DhnAeV z>%$SNY|Kslwb_+i%5<!ncney#U`h zWt(bd4qsK`UV*SgxVIr*9SfQ)2J3l<`L1;FySylrxd!F@Jd2FdNF*d@)Gz<$DigE(5TC_WeO61=pvCV7o zOleuTT@Ql@&yYit@I!*LVU)3(25;6FCC`&>sn-1#rSGD%3NE$e{ehJ zg%N%Q47Mn?A@^Z5Y*J?u@i-nLOS>x!Ua21ld3NI)D{6-@XA@MBtl&}z4<$~o_ItRm zRxV<)sAVFstlI+fz^r=b_S(u^9J)4_J#s4v5IgY&D7w5n<6TYoM{W4Ic3f(9Lb7gD zN#Zd;B0O3&6OQkpvH|X9#jZpXA20&zG!h%$a5vVrXKX?PdS*s%)cat2e+A5@2Mx7CbJCdGVw*| zhcZZ0ltr{uZ39+S^r${O0TNZEBL$Oq1$GFFA!ls{7I%j$3 zU>~Gwl-3%GMZXdID5P@%B35~*Qd7*)i;=AsJZ5BMupEDO1SHXxfC6SI3!e{?q zRur{p=q6FHmJ{OP)~qyVK@lx1?P^a;ysP2DSdEG14o3hg1F{A6wd^AWuY06&1H|pC zsnqnyyiJ2m3iQC-4Y;-l=4*xF`uUbF`6-q}Y{yV@dqn^Ty3yg`4h9^B@C{abn3u8+jWZgJ_+1Mt{C>f^b?@GBEL*%zSG zMN%?zO0UuM%-QSjb1Jh0XvUAobRGx5kYGAB?mcxyWlw+}?iTwe5Tj9ok@88wl%a*0 zDLtUDH)jl72)s)OT}WcfyJfLrp9Teoa_u2GJ2ePvoSjee8)R?NtenkEl42)PRH@&G z@_|I(fZKmDY5h-Xla5giLP)I(w})U3Z5cnR22ka{;B=2K!-zy@3eo;nrqWRRcqMAF zzvt|-HL;AU`!?xmF0s)q7$}~@d*d|xn#5{yK7utoPOz<+|KEM?T!-VT1#dT31*vt^VNp z58QXbaxjO8)27 zDWa!i+~Xo$fyA%N4`l*cC-PjFnU<$K*{9kkfdZmA*E8EWV>-=(zk%rk@M3^tFbfFsI*8IJWbc zasB)+PmJj|slKLvS;+snMEv*Hi$fv+0OkKfIO%L*V`As>KNi(zG^OJOmU0lOq+@Z}Yp}o_tjA#Y*64WT`~?9oBD)jKm5V(+IE^61&~s=y&-u@Y z05?QeM12Kcz5#{YbWIk0Hd$^sUkAcilG-hxonf5b+T)z&+-BYIkn8GJVc$Al*T=q_ zxI^#JjrPYvf9-~Tjp6Bf_p=HZ*52AZg)Fh?Qfx_XE}S&qb;%@z_aZ=qZ-m@R!1FB9yy?R z?Cu#*ebUM83r2g-vF!nz`h>2(QFjYfwQyCwBJKQ)Z|Xj%eV>VWglzm`R!a87Pkt!d z^&c+}diV1luo+CZ^jBVF4XFMq4OxWEGEr+f?J#^K(i17MeJANun86>~0?wIRaUfdJUk~6&VS>N$R zjK??XwhXgAb7N1MGer~y587uhn?9vc%D&yqUTb@C)0%`x1V@t-+IZc!H!UUy zZX3-8H%3{8HhFPCbtfR>D~tl=k-_2rU5L2HoZIs5752lP(9%*}Z7$U7TC&ddmx+(} zg_wUTlM~{EFDwuqREU(sz*LsQ%qDX6?CEk4@#;BE;*Q)-x*rTd`Q!eX*B_t9x{DY~ zrFInw?0=Q*|1VW0yGIeAEN;xFUIH=>X^Jp`K6pWzOb%gSKyWZG(qY7I-7yT%92y03 zQkZt11Lq*vx&JRzHel4)u?_z{b_Cu$#0m!D&65!y(C$2QGnt|Q(cB>d zn3r5RIt=r9E4O05yZqJQjyJVI=bfg(-l2 zV`$2n0|B5#j7q$lq@_m+oS_bOxMG(y8f`rFPcy_A(QRt$BnzO=GfY~u!2>>y`K9yy zRRak5bx&!9y?}mg3Oo7I^)dDo)wocbbK&cBSnk~JTbRIjS6}CIsb81h3;Eh^hv%^z zZo$5!ng>hw=gH+ZPg`znI8{3N5Hv_RJOEyCz_JXK@%UjZ zz7iI}n*(jh;NYA9gPVqXYKR(0A>Lw$8QPN7@<8oZWuW=eJ6}3yrqU^jKfgk4!G!>) z#t;F6gopXtwl{|e6lJsi?mVVUBJl$P?gQbLP?STF<;65GK|iP}L`6I%pk>k7dDqw5 za|+b;6I~37h#pfN^h*s%9PGDz{R0l+HZ_H)gKep zAhpA1qd_1`NtTE$grEbD?+`37BVaNJr2GGj{3H`6JBGF*HaKdJehbJE?-OQ_aq<@t zNdOt}VI2J>-p`+4yoj3&0aOCpL4@IOOeJbU16vKr20(FsPsAhGR;5S;6&@GTCR!LO zb$}96RmsPgm^jq2g1mvu#0N)2!616FoI!&%-;+5^<{ZKZ1#?u1v4H*{Qa-*AsInJHgg7HSn)7HJnjF3pqSE6Stljd8ir3n&`l|0SfX>jLKOGEB?4Q9Vs$PSE(tDgkW8r$Mgw1Pjs{|nAF0n4=^PM^kAq2uk9ATJ8N{E)5Y~JCkIhuX!(w{1V zo_Bzlewi5KOUhiRo3)I88m~4(rK54ft>b1}?6iJX6P3P)CEmYu@dCu0R#?5`m;OvW zHrOxlA}V=<*?umwy)$8>R!Hj2IN29AZ*5B7&-s2_`;hZF`ONL=M1CLucCjTdnj+YV zM>{y*UHOD`BykPn0Vh>7&^qM})bpfVGQ9#b3u3+Opzv`@cXEji2HxG4dJ(a}b*;A~ zqE*968VIMzFUbaCzyvbMd5y=XBIx0;o4+yMS7xX{r>CA%F_G?2>k<2d@Kf z|2omfq9_zJh#PXbK8_s7cyW z{*YixS7s~YcnC9tYhX|f9Hl~1x1GaT4%wr&@^}T4%bA@G>U~#0b9|vCPzZRRXp3Ez zyn@f!uS+I$b$0;SA+8VBAyuY8mHQq2tYZibAyaNbk4%mX0YdS!b~5j$USx)x>C$7qu*mnkON zMPJi(Sf{Ds&q@p4pi?uo7P36rOKR`dRcybe>Z?!nrd#8$hVk26RRW|c4E^|Ee>mCV zxLrf$DWYG2Fwlj=a5oWnmoya;wg<#X76VKt*ZJJ@F)xZDqwb#}nee3DawkbFc73{2UNp z&FQk0nPscWcAmT*@zy1f)&#N%hdV(m4^X_lK&TasOcO8muCM+$rh$^Grc39S_ej3-NF#6O|+@l<7VpI2_B!B(ILeN&$ z(sTa4r2Fx4GTBKBvpkf;fN3IvdGwmc>%p8f^`BpacR*IYD#Qr1&H*<=Ti*%H0M{F+ zBVoq`GE&@&Y2slhUKByX5|HE5)|6h8yPA_g!7`#J{gLSerV)lC{2Ym{0M?dm1hcQu zOx}NN5%=(Irt%;nQ;I94CD4|TSc4ubCZ>+x5_@8fS#vdNtwluEPwj7H(TE+F!WX1U z$+V8iVrto2K|IMjfCf;{@c98qQ8YD~F4Im#`bwU7;&gJ}cB-Hc5lKO7Jx7j{6M0|J z`;ZnyuR{4Zh_4zsfN&TZFGfZn^8i4!iY^N6I~0y<*vU>iI)G~f;D{%uSR|#qnWwe} zc7Z1AxpSv9+HVF5j9>NrtYrJ$F>86*|G>KUv<{6Gwa}i#=)pNQtTB9);Gjn!#AYyQ zGviaJRzjFTfPt{hQwi0pAToTD{-D^VzR~NJO}eWjUG5uDd%Gd6MnkdZ2Xu`<6j=AO zRETA0l3awVCsqYu{|YuRH`EQOpl3CpC*o0~X0XdY(a~zaS;MMM|4I%5_1&PCq}Z#N z(NpZeXFG_rg$nD|2H_^V3}BC{+OIiNba$QYEUu?`8%>OP(nl^UD3E)+w5G~|6G5c+ zJyEoVNZYmm!fyCA#dSDK5^4y?w8;}Ob)eBJOQ~}$_C#RU$lm0v8pgTouCv40)Qf%W z`_#CMy6LSe^UI87Lr>z-Q)2Fke%74(_uK=d6{zI8A>7XLE}6t{w!c<=#z}2?tKO8} z6hs@ZE7(c(@GFaGx%EzN$?aihaz`tq4b=dd{%{jqBS}-?KEeZEoga{>|5Y4KOR)9k zd9ZWULCm2W%K{SUJ*UN-)uV~p4x3&JVwkR67ioN3rIj2?t(#xH?%z~iE(GA{&K4eAzBgwfVtj4WO7e7<0I3@Mzk!hqDYQT9 zQhAuK+$T7gW=~N)5)$kZ{4j}#KOK;XY6N|@x9W4kA-vai9`usVpmC2e@R7bgJPNf1DH<*wjl_bLSHCVb42{AU8+Ga+1uu z0yh5Yy{ikiL|d9wn<=FGs8(tGR&TDPJug?jCwk0og&JD7);ud`Z}3dDidtTE94!jsp^ea)GsY&_>3JzzUeSs$ z3GQKu%~-C%R$1DuZKnABm+u3-_oMs8KL!6kfb+kHqHO&A-Q$0%;G3vu z+aYtJytvcJN^8?at*Ht93qD4uFxGGx0oEFjLQM-(EthhSh!>k(lPt|?XlgA(VEI(h zd*!c>`vUlx?tU277Z7+|OZxYlkC5l?JG@`qVvk2hu>$YE4nO}MLKMiKh3yZ0A(!@o z2NIqfm*0iz1%$QVh4qH1F=`v|LGO4B_16fa4R9I1fnK=sdF`z{Us_chEZr5Wc;v>o zCaFLT?WTV;9%!A6@kn+sMI88Dexxy{tavz1r_2_gmHoh{GfeYFUAiHl?olN~TF*i; z|3Xx`w26gr7#sxCFnjzMO}svewgG2jB(**YsA;A} z$eHQCd}9Fij%577dwbJH0PEcdo?)>@rDQ>dnvHzog9wUNFF>B#o8-Pvf2IE+udd&z z^-d4iVeu&iJs?@5u6<1O;!kK?UMA(mE-nL;&&;Li;xUzexLr z=uDt(&Dge8u~D&Av2C+rJAZ83wr$(CZQEV1d;0F6*BzhnK5Orf5o$0*5tjBFvB)R= zIQV9fEX?UzmO6~Ne^^Z*19i+Z3|7`x31OJirwdj1t?e zaCsFmucpa579=bVl=ajrQIg9%zCHtR)(>?7uD{t02Ow58JF#W_8sTi$Xu50&{gOrl zc3kmTt@QOlQ{UFZKq`Hl8RU9)ZvHsycj2CXbNWc7HCU4An%;aWh^rod=6UxudXv_W z;8kYrXJnN8fc_6pwF;kFLkJ4=FPr^8O|Q|v*;f58fuw(>Og1J)P8PN{|8a!l{&zp4 zx2o1ZKO_3~nht#mrUE866$t5BV-(Fo?NBR%wz4=wIo*;FzDCq3jw%XmN+xmJyhBJD zc6xCwTsQ~i`}{M5c#J#!yV-M-+&8Qs&`ai85gDhb#O39s_O$i%%M`MdlnSg*%(wS? zm&;K7w^7%fh#A8l+E#EOD-1Nd&5%J(Q|^^@m0l!mk|SM{i+9^w%A=0P0BhRNhLm`=5S^hm%9 zwVsKZZtMW7DWUpQ1;boD`B?HmHOigH0})PC(4r^9m6stM)QC|wTz()Vk2{7$+`lb< z4%V48{!5;^o31F9@x1i(P0Ih{@-mC}jx@6=FYGZo7Bb&;vPmPAPR4-t6c$^Ypq`)& z>6h~PfFt6;BM^>t5fYVYkKHk8(92-Fb0gk6!sAM+r+!u<>vU4;i|a?2vwmB0vl;&{ zjPD%HRu4LVOdWS2{%OE{J4B+7`ya2MgwK|AyU&u z*uRE(92=!L#2E+j!M_@87vNI+bn&R0*03#kw@-(V0FFoLfGmVxs?6ZD$8CbWUg|O5Q7174l zO)D}-yh^BdFLS>QcPR;>Ji(~23z~{GLrGhL+GH?jTF?X&@7+~6Bq&PSO}t&VZ0{7DXRs> zH|>{h;LJSAle)6m_^v9(9k&b{+;HI8Ev1iQ9p5yPbA@Z2L|a9gt!c%t<$r z&1`mU@e#zzkdtVDw(9|L>upG;Ms&2fR>gDVbhfx)0)evKtSgY7y+%+-OrG~FM^l!O zJYWADQ*L(ceG$Pw^|koZ`MYMa;$gj$PY(n?D#2O(tR$&1eR+CUYi0h=d1ozjA@60S zT&Pz%n{0}r|GScw%Wg&7`f-JQdnWx+7X^SK9<-ldGwmx%{lUaAtFmaqk--`W5c&zT zT$8OK&g`iEgSIoFN9X%C@ySc3MDsK`?pwUQlKbTp}7%5S` z2oIV;BEdwM)c1Wf7~(zS1_E?uzn(+-mY2Rq7~VlJueUj$z*Oi^;^+I9nJ?3<7T^`2!IRV=@@zXD=g*jt18 z)-DcGY(QZ{#fEYtqo8D{#?%Gh!6>L}2YnZI`Ov39#RXyW;#R~{1vKx!5p4-Hf5E2h z`QPknv-{hHz_=X6TM)Y=hby>shCYM$;uvT_i@uebduNec_z}DlFY!btt=*jhsQ{ji zE9~fZKJni!2fr^Px+bI4QL;N*d}OM23hh^qn1)to5Zpz}|Z)uf_QD^LRae zRE6|?U1e2`AZ`eHz9d|U#cb%4=;7HM8=f{eATL!8PC08bzbHDA(O^On$IaFcA32WP zNa5)4giQ{ij^f28x(Br&(9T@e=Df8E&kXa>L>0}FR6O>BIe{uNYXt>gvGl`lolG%D zS3d7*h6wF{-qsMeZI4uVS4o!lj_Qsz;}#-xaoy>y)ojzVI%Jcplvo~wm%r7lj_!`` zsr?xG-gq+FOl*wqJ>v!?HSFFZ=K2}-`tSD|VPL@Y)*rQHX^QnG{s0w!%#YlWuLb;t zFNn|;l24btmUl-cg5s$}JrkZu z8{iFK%lxc}YWeU7mbvOv`7O{0icl;>0J=q6TlnTUC_9aPa^{>M8-fQ&$=RuawOL(< zCb+@BwA~TT!|V;TvLMAO#&xui42s>};Re!$GO;yh+(GvccYVp(V!edPim7!&iZ6>Q zrrBYN13~Zb+_;+bt#wAay#9H!QFX6sk}!U7zMKYq#rVxM40Zug16Bqk_`4wGT;RkI zf3+_+fm6HRQA?}ja57${^1RXeaP)$rVx6xk4>5&lIkbeV6f3K{4K9s4B%HCV7yNW; z857;WKLsZax3)P_O)osj?(DGOM+LJy4aBe{_7(hwOjO=M+4}NIys=~Jkt`W~O@&f& z8rBrN?jroez4g zB7D!C5C_u_^`o`(^7rZG=l|*_XScUJ!T!}I{m(Y?zh4<({Qv!x;b7wA z@c(^fG;wP=Zmhbu#(`0Vx2t!1vX2hqhT*2gUmYthJ*)ne`b*J#DfwvAZ!9dx6M|xl zq>mslu`eV;zWzJSg>Au@c_GF0kL<(#*=~X6s!eo(fenh z9@pD_Mn9}J(m7d-WrvzGttQiE~cWcbBe??=;GD*@xL{x6r3_Q}U zSitS8N7-u!_)D^;iL(Zki;#~)qV!4^tlI>ajwML`tFd{}NDpFPJCq>f%zya6o9fH( z`V@fyx~Qv_Kgn$s^KKw6Q3br$#VYDiU3lwyF4j<4Y4Tay$76cs7?R0tmY$a*Uwc;{n9=rk4%`{7I(kA`L-1355_a3Xvaeyv5 z_Ep^8Q|+^X-*K8>qz!BOA$&Eo0A*<{yXx?+c_y5y3nm+n=OE4mp0M8tvi1KImb9zO z%R-)nw-?$~+Pd1ev^lz#8Bt=#Y)=?Kd$-@`LL)7g;KMC*+lVuGkm(Undd6-t3dW*y zK3P*v{7VC4bwt*bRK`>m##uNb$#~+r}wh;Jl$adQPlslqGPOF3CFE z1#_y~mb~{u-7}*YWxm0j@|2d2z(tJdYeCQiathLUOy!kEg(%EG@b!faO2>gA}%FkKF zqO~e$tzLc4+Z3ouFWdvmQQrYrU66#)6j`0Mx5(D_HIke5#rCcx$CnRc(iu2;BI4-Y zTwW`?%>=ZvtvgieuW^N43Qd_O8{nXfOFuacnBa=O zQSm_9%H;qR@SJi6T6JSs1h2&S4I^KFGBB=>U#gH!UX30}28uB)CJn*mb12GWwa{pF z87yzE2}h~0s`kr6By}VND%s1$juc?V&dynQUacgTN`1}<*BOfHx!ZAdjZL?(7PA8c z0bsGBXDH2uMgXB#%3Rzp=SGtcJ&j6-_5wZzn1R_CA%M2JCmPY0+q4l?^>TspOj3Zt z^sfdm@zyNl4omCr^#V}x#;T{7H$bO; z_|C3NxiXAefPw9+;lU8e0H0Ka+pkz^`1~fR-7#7bf(Eht2m2ICF{fU&Up?lhB#?_U z729`cde0`t=`S!(gb@y>{+BW8I$bWAYJ%erBsHTpqILSJM$y zFAj%DL@ub3zG{*Kf)fe>c$A;KNYagnPIL>l0yD;`Q!;nW2%%Q;xI90`V}yjf_P}qr z*6L6v#6Img<+2e3z9WxsEaMU4vCv8dX68T^gGiwx_+!O%e?3QT&T?Y>)ZPF+6gERM zS>#Sfn#k>1LgxO!i0jKaqI~NvIz;k9GI$#WybwBv+UvXN)Y$NJ+0nu|jRtY0prdR@ z>+1(je1i+E)xUp@oI>P69}D11OX!HiDjr5>1j9S`PU>^;A%D`ZV*|}rLDl3UcjC7g zB`9c~R(-81XN&|_4@9kohUatsn(}}2JI5vJOA3P(mmT&SSH*2a(RZ!}FVN7ZAHsSJ zyxc2=a2?y_F02*ICB0S&PZ?A1M2^RyQ`65_R0lE2qO2DDO;xUHU#fDv8zH_Vy+ z1B*MKcN?siNuWI=V@$tQVvb2s)?yCF^+((PKlz!nW6%4J4R7GXk)%17RxBJsy~W8(Wd};3836_fF3%=mEUZb@&}b;?2vX zC;f?`j;p>lGyMo3ni+35PK`e^^2;(JCD^^;5wj4UK;7acM^w=ijNXi?rL}kdZAC4kPC?!qOxF@tgK~isI9K*GIqnzKn^~##;8>m3pw7EoV_$Qti36t@>GV=*E zQ=R%XMI4=-N)$1-@tB)yNd9|fOc~!5^U!eSQUla!0>0gp*W^-^hxU{t!PSDkHF;umJs#SL*Rb4k4z%L4Bi@? zN0q4T6XB<;B+F7hH+A@i7S-!&WwrjzFUTeCmld{tX=m@Z zV@ZuBA6lvSCl=ao+;BUuHqiY{4IKi2*SAP~;Yq5Xh7ne14I8;qpLXYr2$N;@C_K4W z*{=pA!DzjRZs|kew~hLm%W{!B)_jyJVU=JPNY3p)hBaXGHW1m8pJyaICWw+e8ws#z zlurUd%!J0dv|t*PBOp=6T=6erevxX=E;l=|PZWP0p0B6RD zHD8z6z;tkjRSXe)jbjCVc`TALBCBNtQzD3vPm|0oEP^E1)u+|`x2k(QVc3{@TsWps z2@Cz|;a|9msa@mtTPZ;d!{%x72XFZlY4usEQ&9zea%l?IF?TyM>yok);E8ORyw`N7cW`@UEpAE za_uKs=LLL%vqlUNPR8v9h$lt24NCJ|M~mNRuC0STCS~$q(pfX{5+C*kfe!l>d)$#_ z;i(Gk3@J?u|>`7j5d%H!rC%Y>n(8VK<2m zpi4T`y`UpJ)hi9`31PEoHAnKpXH)S=n*}S+m<)ZQN$p@A`B~a4d(}MiOc=Y$N7wW$ zG<2rNUni(FG`uL#WtMl_C`VY`N(40A=IEY`x?)ZjDGdTAUVKOm{$L$~-X2%`k9odY zQ1Z%~_9D7@tA!BSebC>&)7!n zHt%;CuzHsy95e+60M>&~6kg+%Is|n?YzMu4$#ckkTUUUn!#9^xI57v%RCzwp>Fe61 zgt<-JchIAWuPDe_y=YlO| zM8JL4>bp}K$uOd=s(@t%V#`qum7cq z-TT`Ioyjj0rl^l}NzjXi}FZ)q&U|!;LHG8IEF!nJy zFk?fi2#x?$K(r4X35Qf18q6vf{wysLii_BO>lZ(^|03&#l{NCiuuY{EjH0V-FNBj5 zZ}Kr#v@{L=+!?3rAQO(RCULQMxhC(6~Ttsr4x*>d?Roz zkOe)@C08^H!3^IyoD>IVYd75{NPTy_%AtjZdtTQpOF9oc=xaQld>DC5ObQB4x+a2qCz=!cz2Kc3HZoOK|(P;WNq0cLXFz zL3RpMKqcq7U=jC0aQBtbmWpTD80L8AYawE+@Af=6+NuN+V0S^aDnJZIZg5OMmk{Gh zi;9-6*VY7}#R~Gs+9|({`_v-~D7WesBUl*^?l%)fM;mPWv}Z`tmyJS#!N;0CJ#z$v zq^o{r>`%BHa>BXkD7O-L{lBJOsPH8O8|75*kA8u_Pz-Fdllt5$>Qq#NEO`Hmq9k02 z+v~%BzEY4nteIUzg?){~8^ci6d|ikaMQFsUk4g~j#-O_|8$2q8b7%lWgXvMT6Sr#R zLHWX{j_)Vc-{=RC=x0QzyV;EuwW~`!zSkJ#p6feW5IuLW#PKezT)L%Bi^eDV&4BY4 zrhv6WDU~W@OM-Np40*vGZ|wSYIuX%wCeP>OfgqB>R5{F$x?D|BIx=5iXJk-G4ge(a z7*Q6NG2PJbgnh(+ap9wiNyb_jL8f}D%ODd*^Dx}TF$LS_QVJ?OZ2r*Lpu9fCq zmQL~$pu>l&H55TsOM=ORyGjm8QS@8TmG^+3osQy5?7j5lW$i;S3b#gF-^t|iiAOTe zPM{Ev4b=emL&zeMy7h{l@Tg4}C}ZJ`bw#huztuRh)Vg*#NFc(hSS@J4a%QB1;45F* zbN615qu7UrG6kd0uC9Hh3d@7Tnu*l#!3&O%#U&eyB;Xjw*%-vf;PC61TyMr(z|f4( zi@T>agh4Ndz&0$laevw-hM2p!L6Ti<$Tjhc>o_4P#+rLv6?WC70#2*>odhMlqb*TH z;9hDaQj8SCc)Lr8|YhgEh?vWc}Hk8P*O;CpI6ft>m?2Vq$lN$kolGT_7jSv?8b4I#94)*j@ilWYz5+? z{6PC8xvi#0LO*2E+)TUvp2A;uJ2X&U`rYiOp4pwK7sC@+Bo!%(E8G~^TqgYbozWGl zfi`Hhicdm<2h|D;*(DabStjIb*`zsLSF^hS08MPw(I?WEWHucPYxN=R676O#F@nSS zPQVitg;`tOm}Aip<>(MC=PNOrq&qB7~a(4L63M74J5;9A-RLS+-F&l6?k7Y#&Ee4 zpw)L+!X2f0JhF%%P=An6-*)||2Q5Xk0~p{kEPVh^Pjx~v0PCX!ebdqIN>G@0r;fQztJx)vXsF5Cu(~V4PP=nZ#U8T9ktbQ z3iXBD_tepX`j>)GiR9)n=3@hlL~DNF$B<%1FdcAW+Kp9+Mli$kKWnO~d&2SiTi;@l z6F36dNh9%S>i*Q!{T~%RoJBtE>Jb zzf1Mw&~0iqTdcJjshy|&5e0^^pS3~45M9-dcX*4zB1lh%k@~DJ6f1Y+@)Mgcij(RC z!%T=VxJPt2bTpJUWS(6ml@zv1>Qg{yB>GVPVoOQDT7!VqHa*!Z_W{mPP(0U`J$CoP zEl_F$jg&is6wSwvL_Nv{>w(64BDnS9o6R1#D|u+MiAohaVc86#na<_Tm|Y0U2H#$Q zzh7POM6?`k{WOop`ZY6Rw;OJBn1##uhn@0%-MiJ$daezp^fJWHL)nYEuc>#(2eJCK zS%4YxU?0CyCx|yG^Wpo|2Kw*XOfAGX)Ak94-4LJAt&gEA%1+#62y^qG4^RY^FOCs= zZMPz$eX7OyuAr>YR~QlIsUROEn2{h;Drp;{BcxK_;v8J%soqzDAjC)G&l(}(FyfK$ zYMSr)>F>Ebm+%qqV#aV=g0auQCh@l@K8CErNpr7b((%rssdY*nG_7)}&p<)rrtm&D z7vzLjiSec#({m{wL=$4qavx|TlCrR1ghO&2`K)2zvvoY}Gf9X3l%AH?b>h%yeRU%BFk+LNMk(>9kvu$&vU&lQ*(_$+r zi9L_gO!s?Sfp6&0OPv5VVKy4yWiR2rI`U3bPgi|&z0ZlMx5>YJ91rz%w_1mXY0LXe zbf!PZ+(HQn-uMwc{UG?<%|YPbG5I`M%rcC-BVFKZLs2PQ*~*9`=R9EtEDeHU|9n8? z9^gnbEhwh9lx*mp+{nW8lOuT}UxLsXa;t~F@}2n~np{j(#^_Fho`Sx_R#M^B(i5+L z-c%*hWUpCENB+j?vFc__p}jhzc+!w@eh4j~aehsG3o%UgrtT)o!4K&NIJ(67Nz^ky$MXS>5ba*| z$ZCa8#Q>co@p}cOWfbWD)fV}Kda;!%Jiyc~YoOX-U3narX=~6|AQ$F1qw@kB*XNUH z_qL;dr$qbx4<&>Gfw$aXLUX&L4TgjyoeysrL$0KnXHNoQoQg0k&b2IO?q&1VE4s~j zcRn&ySRQ$z`f|$4y$Gu0E4%P$W-OQiiXpd#?V0W2OE_xa6+@xMeO0SBg$(4pg%v(G z^u%*%?ttg}V0$RyNOt}M7;UoNv+|Ti?+0CkhjQLPt$PrARera`#AO_yM zaL_0p@s&sK$2o|1)%i>T^d76y3J+Au(}9?2C(hWdrU!b4k%utuU{}02YH`^TeY3iP z4uyrFqLF1uaef+ZKIbb=Vgf+?(DaNO63V}WEHvJWUz1J$pSPXb*>CR(=U?aXKgR8U z=i<_-fPm!wOU=+f)BArE3;l=i^CC?dJ6tiB>}+f}2qN(~G*QWV+89~|Qc{#$35n#o zWOK${2`KV9rAz&?h)bWE?9zC9Mvvq^)w9=K7=@89z_Qw^${`q;bv^ zWwMZeCT3xJdlj1u;rw#i2i+MUFbNCxGWkDpGZ)t@zBk@CW|vN`6yUF(w<}Zq{5q(C zzUT;FRJR{cKG!rPP|CT37~`aJP|KoPlM%OxR%Ns&Cb?t3O-IHhb@!ZyqEnVSB?DRg zhJ8ivq05gGidQf5!*t^1?le&>w>pUax`LR|X+vs#zz6@A)4F=22jG`=APjn?2*Rl>@&hO1` zA`C4FbeZ7Xc8H#NrZ4G~n#nMmYI`G(!Fs2uH!pI{w8F4&H z=clVp(GvJs$|)&!dfE>4)R$(1x>o9b;n#WHs!Q~Xg%Un@Fnd|L8NZawv@&TbJS90d;Y1|>EBRXJYxVY* zQRid0*Us7(&0A$-PWgObM!{lvoL9&5 z4Arc`V(tN2{7Dn|=I!k}zdLtgv-uXU#(i2OcoL$U&)B2V)(IW2W>YayjS`~RqcS!L zQ+T;-${n>U@_6+RPXRQLkRtdD1XpfPteF=#cvr4f4SL=#$IDl1ZQO)ASwDv_*IRmS zx3?V;QWG>eKF?h<4}bE+r{>q&o9Zl5Xk?$L9J|(+8%{Q!!d}Qrs79-`ke% zZdS-r576%-3PD8_D2!jX{t)2<3}tSEMkE7X2T>t{a>C>Uhr0hXg`L?{?fTF`7@Cs& z3vh8c9;&!8QPWOnTMJilsyC@HOu}n6l{J|fPtJH+t{P9*vV;56(5y15+S27*!kpx8 zOLC!^&8f>8o-v$$X8LzB__@q#s=>-@Ot~fCFr@j&L$pM@3mQY(bB1V-E@kBl$+NoQa|7FPhIjSAJ zoYi{|{cRt;?e@y{`T1ElPGPt6{S~DAwf5rS#}3b&#Vo94s_Aa|=jDC(zI|G!m4i9G z+sXZsn_U;VbtFbN?vjRChsO%z==5w|K2<1N9$1=qOiFoj0=n#h@aij1p2QqSkNloV zDGw&92MjeSMp&l^T30PEyHKYy8{iS{^57BwJZl8hufs1AD+i490zMDZaPgD6xNEz7 z3pe$oUUj;ZTIMHiK3U1U06q&AHX9l4;_CjE*Ie($P~i6|KV`=X`Y!Mi-fXhU$`|@D zo@AM1crAf`rwKXd7C&dhx!rzTm7y8B(i?3FwVV!|pn|8$W>rDJ9HhG;eq0H|QElFO z+^XVN1c1`iVr*A;!WuGhk8XB5X=Z!sd-{vb2Z(qTQn=zUs4VzPvPU%|v^S!jLipDo zwq9zJUh;D_b~g0Q?w++j`lC?7B?#h9MD9KazmDp|U(RbT#cM6*Eu3&iW$$qi+=T#M znO3|#yN~B3E$DgJB|D8aw5_RpY?ZO!R(pl!m_GRK@=%zA$Cf^NGH7T>AF{@F39~BJ#n?X~0{5 zFwh0XQ_OWQ8Kyu^j$eJpL20wT8Emq(`v%VSpMZ{ol+-ys7O~s>%KWmmMBltjxRz$|HNp!WaZua}%Wx~7>G|85e zT%8g0rXa8@3w7`*!$T61;k+Uk7bAAu_`K10-kxG+`S?s|9IL>~Qu{>O;N5uwOJbPP zH)#WGtlal*T+Jxdu;%bw>`$wVtL!in*On6s#a)+QO*H5Wpt^k1HMb8pWH4nE_Hzac zeoy)G!&(<#=z2Gnoq{-q!j_{^>cSR-du+=5oe`*f%cMT2!7(qUv478tjbY@e!F%{BRw0k zCKJZl!S_%lkhl7|XcQax$t!ef!e09)7uDRX8J7QK(zuCzY&vR2vQN7(tTO>j*$c;xPT5RV z@(;f!{?ehQ@l|O6H3N-n5*tU|vRj%iGaHSrSvMT~WpDJiR%UCP1sZB@at6I+fsCN% z)*_cNdzLf3Zc~70;VwCH_z?N*aDOOn&fl6{hsDJgJi+eVWF66Hn1Uk`YqkR5GRE_9 zF$Rq6NO&LY78q$MMMYZtV!hQsVsTIbh|Z#fi!8z%0zF-z8bM+iGhVqnhHiCD}u@nOH3@I%5&EV33;GO^>ih4WI`N91d#vTL;$Bec_-e9TmV&=3lt7^~I#ge| znIFz?>MN&#nl5aZqH?^EVklKvHz3wZxf)|e6kE4g{bHbRnSqMBCZTs$7T91w)j&3h zyZpI$ldI#G5W)6=ex=eE6nibrU$vJEO|h2qgoOd{-A>@d%b5m^P~h&O{{|j(fp$Xx z($4_7@GS>=jZ5FnhTsRLGW${&emn|Zw80k44NPXz%S9n0gWe;A^AGLgd&S1%q1v-W zX)ZPz?n!{!709Q0H`d3KPM@&2F(I!BE`Mio6Gfj2oy2QF-L3WOnU3^_pH=nuYgYN= z&t2T6!gz=C?>G}11Hr`5W(VS(F5hA*pbMVHUoA8jNB_c`#urP5N6h40XCl#_^a>Lu zGUE*9<)#qANJl3zC^Hq4U#*`Z4!}Th-bLyM)(eYRUl%3sVw8I%3l&1v%m2u-08 zc4Eny`^$lz6S*0p(()(i3Vl?!QnP`{>! zKQJvil}9beOd4{B-!f`_3?E@w1x_<5R;XIvAZqzs$Gf%$V64vyv^1RqvpMAmI!)9# zqo)Lpc8NLly@DCVF|P0C6G7Cm+R2v-R;mU;Gftmax(&X3&$5k!TW)@)V3@x^Jt6aI zN7$(JhSZkoYC|SuzaeeOY;>hrL>c7Rl{){8s5@wx^d3vrBSIl)MN8sdaPundyS4RnO8BiZ%GB!$@^IE7_t4!~le{%cC) zr-mx7Z=*2it_IGLhK^%eXZVEj%5X_AoeGC?wE))+j~h^J&h9sU;wJ_Do{u}Lg~l!p zh^Ri8w3)SSd-p>ihkwrx@1Dt0_lpDtL6^c$c6}|C>wH#L;N6rm_cKl-73G9*ac3ZV z0sL$+Jcpa-pp#tteXS{x#cBKVS>apDmne^Bv7J^Rl$pn}0@K23<`c`)%eTnHJ@Ls1 z$gC%>TIhk9B(~a7c*R-V(qF@T$^adKAy}cD8kyV5LaW=BQS@=PI@BY^!Oj9;$z;eB zW8JV`AV`%kS<<{q{a-~VP0tnC5+p{5f&Pp_qs=0<_6d}8sRT3W!4QyZVAGv9?Kpb3jrYSC-{dhs*nO zlL9Y#b5fRwqe%1PwRo-`js!7k^u~PbyxOxs#D(w1!P|=&ZxL8X5)Z!(CbZPDLO=$f zAxA&dVcM2|!dC}+UrSAa5wH>wiOA`1{)>>RlNRjEBjGm;b>8j2rJ6%JON41un)fKE zUpWE|zX}!RP|WQO`K7^5L?9y8%Z~Akzh6f>4;>uh((Ynpm`A)|waxX}xg&<*%M!K*eb4CE>_akb&jG z+7Z?T`ULiWwMrrZpF-hq#!NysrMOlRM{8gA%o3E|a zriicwQQR>5diw*0K3HCkA6Qzhr_Q8WZld}|p? zW@boSsOSO8$bpMhIOz0!+EM}ANkKzxMQuZJC#Fvuu4Wi1t5ER=z1J|z4z(u`)l38) zuhg~>lXc}>{e5?Pqs9LB zV?Y4Xf7f#-|FH z?u{@r#WLL+`o5+oxCL{`<^vp%wENH?qRrDo-*N5bBH{gw^D4_c_jO|?KL}efBu+=| zw*vEzAoKfx4?&F|Nkt~`Z$b0OJ(xgW15fb%3 zIU|Jqq=EI3Q^4H<&~MdRf)tHU&{HbiCcbG!rocd8@rN0`>N`m(G;W8F{hcKE>rKHV zw419LZN}sv$4oQnlYiy=IBnh{Fgr4(IJRfcd;(@e-I?s(&L~7s;ooYUK`=uhm?|k;JKm@duA*PmR&N76$^K=VOeM5iDo91eG9THQBFDVsXaGxgm?S0?Vg{$y!~4 z+x^^OiUzAS%Xwk7p6J<`+KWTZP$?CCdCc!_3{{nSUs^6(zk~-qY7*w25b=d zmZ7Fa085&O3q&u$3vtLH=CLc{k}KMt3`=C6lpuSup}>jP0eJBqlQ zdF!0m0WkE35v|X(=Z;3^+bbW$oWadu$!k*5#$&G8Fz8Ia{KKTTE8q()!n)fWu799Q zpE|Lt7yjv%hx(O779NiFn(t8(_4Q|(WAeTku_U+SB}?w}J?IY&kw>h6#;gJiSN)3b zI$Knad5&+s_jJzgnc8d+?w}Q|9CsMS7*HHBTC%9L_KVmVrL+hcu_Y`O5<$W(orEU; z+k~z?kmezW&vg7yVkL^GbXa~NQqTwep3)n`^OM1W=Pu0w_H|9J`d-T*yrK#fA93wA zR6>p6m*lH+XO_zmVNZ(viaVgzR!DFpQTmf+wt_3A@60SWw+B$=nk|k`X?yb{YRahvJ#rDe= zH}4=7z($y9PPI@^W3rf8yl^0Hs$#>fwIj z)m4~f!$z9h(MnGjf#L3RmfK-Y9pX1?Cwl$ZLwUB-?5wuO(5VWA)$`yIV)l}woA$0` zm;}J=kLK)w^q}OcU*MFhg6;&{&`ob@ylq$UIHQH-U2O3Lbsk1XvCV&DFPbW2@fcn(m^49=kp-eFGsAqX|l*;XQh z1NI!vE##BUR@+gTDK}g6VNGNHhWsCwteWSchzbS}(Es4t|2yK1P5bZVzeK$M6`AS% z|3cnVnj5wUtL_wtRAI|QDR-ML4VcrH*OTTWzh+F#;@dNR>uODNq$S}`EDS+OP-%uV za}-g-rq9sbYgMTl7AG=jF7E=C{M}DF2eptT-`^upOQ7b{K>u9q?!D+KHY>crw;1?J`d2D5z9^$^q<|&+_;fj_{%vP$M zOS6%4D@Bz}I~ldJETkeoao$LqH8a7!KxExcyG*lAJ5RGu53pEh18zjqZ9BnsQuaPr zHCGjIYdG9XcF`>E%rp;FH1iX3D5F*~SMY^OGFPG-gV%D~zcq7R?e!ezW zifV>zM?KbB?}XROZ+Cm%Pze%vI2kMb*d+%I; zQ!!6DW--FfRh(lly>y}WI+T`%fAR-_XBqMifNS*YF0G^rIUHC6&O4{4Cq4Ud-VW?3 z%3WwmGrIrkExe9Ky`P0^mN^;7zDmnJxVddUdpD)I6}I`!HOw%A zJG5{>N}E@7HbNym_&`)+FP~5_$XU~&fz#|jfZQA3(yP=W^0m_fOWQDRCM5Cn(%n(t z(ALuQ)VJm3O^m7Gks-@hqt)};`X+O))`Bz~^Dfb+)RCM&QbP=)i?wY)PBR5`B^bv9E z`(etThZ!HKjNa7 zA}Fpyd);*J*E-NulhG6VZis>41)KS0a!P@UC+Zeiew?lehS+LCHE$ zw@)o&U9=p9s8)p}1CwB$y4r(6>L9qwkfgz0exEV)mMbp{VTy!gCC!j)##ER?%>ixP zK~{SQL1lR|<+f2yFQ(gn18m@#Vm>K6i|q{Zttt^WWLnO7KgsV(C@l)LYpnuzs4_7< zmdrp*s~#{|mK_e7S3Da}moziwe!4*&w2sf%c$=D+j8oRAPP5TAom@O%*I<9sUC^2; zC$%!Uw*Bq=aX$L2)_Cj!$rJJ80^ru)W-)3y#(^EN-Ye2#190QsO=>#_t|6p;NhQt^Wl0%{$BdMwB$H?>(Eaai6 zZUTIg;HPZ7P|6)!cbI~Z|BmRjfdncC>SN_E2tf;&ZSUg8Qj8ITWcbZkJ0%NIYQec@O)-z2;+@oUd z9OQT67UmFN4#px$>dFqHG$*frd#jrGzY z->D18xd_HAAsrzw0}>GOi(aAk?S*@k!8Y9*=j5;3y8yi6!J^LyP#u8e7xNrS!IB~} zAT)sXfOhFqLmdT+TjUw~=!3Oi2Uc77DS+Xd=t7Dd$wef895V3i?7w(69L=LL(WdaW zxG#64=7M%%%jnSzKq*b0B+y1+akRkZCmoOBx;j1!HA7RWnjIJ>7)meJXvikq0L@sq zLc37`!MAnY)ioQob+uxfa6+NQ5R8j)nY6jteW1O4R0AeYH=zkAg<3VIMLBEil*Oyn zl_LbIvLuX}uIjqC9yI5qBPI|d@lb*^MyW@o-!Qmf?yM`8b_(=*fQFs60ZglaNog%a z639TVVUxKR_6B|Y9I9hD(uiT+hg%hD1S&kCCLQb;&=Kq%gjX%K4mf)_=HUpq5s_>4 zZ~`i!C;s%Wb2f>9TmOJNA&im@uuF!6EX-c8qhCM-LcL5`!xH6jIQCw(tcRyL*#{tt zgW_4`G(eKlVq`48#Q>|ONs{3g@jgnMqZbL&aBZ*#(GGOb<(=r50ZAMw3(qDMRfdbM zg@1MoK=aA;P?)GTyp%|5} zocp^Yd|=5(paK9ka$uv=!xEquuKs;ci&{HU>sR8W1#>lNM17S-V)lh7 za?N?{SapCQ4Fk-PHmte2JWvoG91RMWZOwBdRInCgJn{7XVb}G(>gHa$NaQ98lkmUIoXBB#u+r3l{N%RT*`=b7g#ytr9%7zYC} zqi+CIBkGkMR_os71EtMN3p0jEovH$03#{cL(KZwrE2X^g?^jFkshrPw&Sj_aH`;_( zrK+4y8DLz$%Ea#{LbLvuKiG9)w-;IEuJNAo;uXe@q0i^?jw#kOc4i*(HZolx#*oNFU}avoyFrm~)oMiNsv9^_(mEGO&&rHg z8q*K7L56NOd>N|d18^glEHm;rz`hu?qrX2!O4MxYPb_n00{Cr&{!aD;*Y9MOvW{bb&)7}bEC7l6ahKw@?)nEs9 zqs%)d_KWxvX+t0|*p2*^Y)T)9nW5BR!U#7*%u*ahZu+yNOtu7bf0H$+r|cVZodm@`L_t_p22y}Xp$Vb~{2ez8oM0gP(5kBdvLU26Ho|wbv9AFa zMVU7^0+=Y4fs?f>xI8+ZbD*G!4QLn7AxVme4Qm916%o?N_A~b$jy(EuM@+1MBzC>( zNPQ-~ZXu-4tVk2V52f9S71};^C2S+?#&eC~8qfB&7wuX|QRAuTESG}&}P zoqL`J1=88}F;eMsJLZvrj2uV%gYr7tg_B8D#R$i$gka7Q(>vYAi;k5j<&A;IAat*a zJ42zF#R|u501k8`O+f*O)I;}qA-Ltv-@o4SG`Xp=Zx)En;eE6j8Z|Z4yk2$YG}Sdb zwKj{zsiFu26Y6>v;rj2n+N1k8R)xXf`pQu(JBaoj>i*g!aNdR3c@9BTe;^0QPhLG~ zp}n5Hz3?E6Wq{Ifh#S$`d6VM42GA z`^A_T6A!!MK|f`~zKv1;cvC>T5lS^!=+FUGj1ktj1+*0;A%^_c8l&vwUhvQ6de|vo zB>sOSwJ?kbzNZxK)4`fO*tydDZ2kYekbxEd)=}`JV8KW-S&H2?RBkX0GH{d?4(#QW z-Z%#S5`WSwLKFFNHq~DIJ9j^6XZZ0j-9BCY<(`G{0iU-7bh^H1M|#C>VeA8G5xs)G zWIwNg^Vq-;gbaDdXGr7%xnl}+k-eDuR)X1(xMR`9b13fz1k!j_u#EzE=?osVl;KLj zlrCM}%Rd-$VR&(k;7Z*oK4H#z50pk1m?uqzpDi-JF!-3{!HNN!3fpHM2h;mug!$}o zhPe0JtyWJS*&8@u)w0NFN+*MBF{PrWAZ?Ltoua^vde8~ENbRQS2QWrC*EQOb_`+ysfw^|NMwZ z&upFQ&0FPz@^WgK#lUDWjg#UR+!4q!h;Y)aI#R#^QO%~pr3*|EECuJ}d_+2*Qc-^! zP?G)W9qJPgpv)>h8HqoG?!Gb`ou^Jje)RVfZJ~O$Hvi>}5D=!ox$(AMgBs-l`R))F#XQgQiXnw#UKO z=ge5mxK(N~C9O?J9Dbz+e))H&d6@@2=zYhjpZCSx>jv%fWl*iQ!)81o;%4HHzUMv$ z3(hhRuXKDMGuJy2ar|qZed@>) zPFovs$_CDej$kvjd1^x^J%4NN0AXZNK2-^8KY~iqhugeEI_-SR`_}5fF~s>J;(WmL ziB1=De_CpfNa&G8oaeJ*3kt&`L@#?~%Q;Ns9@dlt(v{|U1DN>p^7b;L;)18pS9RM? zIEj6vx-t}tQn0C^y&1MiaG;J2F=N}FAABAHWdz%*Lt616&d~m<*KI<=Aj*?b4eHel ztP1SBnV;bOr>#vpQ!y%c6-#hm^+L6~FhOa;u~6+CUk52B1A(9n^I;5`F%){9yH!VGqd$f4|$HEYTw#;R(hIX6ZGITjd3 zDPh#5%@^>N@q8ui%W61R`A;zqe=-nZ@>q!L_aU>RU_SP=rGH+ zrsk$Qumrc}Wy-CRis2XnIIM^`_tBCpsa_N~`}Ev_9Socu>$yp9Tkd_x?=yVMAOBt1 zsnPCylz8wDsi9OymgilpWI+^8i&iUlza)@lEnf!>qPc?TaZ}^sA4n%}DhO^?n(eSG zo=nA|o7kwm@cC7Re>Vbma&0$h^qJE~<02}H+3Qp=nNdcytiw9tMJ#WHwfX@bf8X{N z3G$8jpOHy@0z_DFSYIIUNtZ4rLPyFoq_x|NgKRG=A-j^CkF0*KjM((kt@LMe9i!TU z^%SV$CknzXtj!PR-c6j_TiSsV7lG|=jcFJWBN56s;$z;T?*9IuNBH*t%^khv$0kH_ ze)kO*?U~|RXk5@e{VVXWdG;=Epil~EGUEWTnBeGKgH1FW;=cC|Ft!}i)bYCjK?RHg z?{Ihe%%nI@$F-%JZx!gieu12Q{T4zf@_zp7|yIhwRLDUz#2@e7ngY zlCH71UZg&+KDhxU)wofv4kKr}J{Lx2e)S$(;LcGir;*)Q*^c|ljdY)ovHUnZkNkp# zTZnpD)R$`iw(Ap?TYU4{fAe6Dpd^Nlh{4{aUaP_tfdpaZSHqn1xYvvwIE zrY^Sr+qGVO6v+36*l;COG9e$e{>E6pQB7o;&IP+}lUsm^F{!73_^t^ePVDa9xgI7K zc*PWN-&%Fw#omed{)#Z1rh7*YX$e`8T=hc)ygL4_207d|za_*sbf7A1N4U>agQrr5 zc=(d}@~;DFmP%wsK8h5G*>uIc6O#4&8`r9NAaZ}wq~)KPc3#3>VlYMYfc=8Dzz;eJ z6OB(r7_(`C#m}gz{fEDTJ_TKpbqCVip9E2)jflfT~L660$EmqUGYU%%Bd|Nz$Do>$Lp>^uD=ST>%2U zhlc_!^O&ZlP_zo*HVVi2H=WMmc>FQV;fSn4*#b7R$EV}^(^X^sGq0Kh)D^oM{R0WR zfDYLNc!m(*%`*!wI_lTcKh=kQ$jPxZ1Gp_J1OygdXah7e!+hjbesbqv>_JMQe-gYdOB@UI}BH~%vqDDLt|6jOVI_wwX zBMm_7WlEoN=78fSxOBJhND~?)6xq>0vL67-=L=*k$(3WO{U0`K7H`i}C|7T<^R6a`D$lH0N_h)P)MPV1kz-yxYW1hWhE2v(Wm{ zV(}I^R2$Z^`R-_gZ2zV@RN8u12Io$$h*y9DTZz!0?neyMl~{k=1M=849Togn`CD}2SAq}8g{jU{ zcFEH**gbXo{U?F1rTywX_2K*x`O2A$OEDSYDNC))V8*5wEcs$PQ;GLmz&u~6eFimg|))ovg<-I9#SD=7r>re>g z-S|Y!XmA-dwH;O(?Z;f^K44cnEO)Gzu6LcwOtZ+Xf;*8KzU6VoMRSFiNTP^^lXiguzT0K7IN_HriL1BB-6mz98z@P31B1Q@q{j;+)(Z-sYvi(NTyNvnT*0oy3;5; z!li>Gv(rNY7n8UlEL1fnC;>{LS9~)6ZwBT@xtm5;VC%H-~vv(j0 zCTw_OUDiDZCbRxW^2outtf@&krgS(bjFda5Op49!)9mEV$CH#BHM4B=Izk+*XXWB8 zJ5v_1z?U;Hj0B-5ot);X{0D_mzG^KmnIl(FrdS%K>|9=|j#{wyR=?ztK)??dpI_rI z-NgmMRa(lQjE48K)Z^TVxD-J8!Fgv;jps%>sN5vBpZ^+cv(g9)DE@lH{_|u1?+4pb zzryPOUoEw+uDOl5lkWdK-2NZn&)SKaavSu>qlr4FG~KQ8HGwi2i=lr=bxO@~DnT$U zDoePh=8cM@{UNxft-wbfdd75Kdb}}uufuEWO5cirnGui3auZiiK7U-?nl)OcSiYaU zziCYW_EwXrjd0&g5&2?*sOl+2u8p-+<0BcFhZrlc;+&Yp94X{f|2FCQgPBuHMN|cg zow@`ks{$y`+W2u)MO0LUSX9NFm-%6rg=LlnX_iH;mj!T^MYLNYR2Oa{ouZ%QW2+0F zm}%!=Tf$k_P}dDM%rdX?vYB;DW>#s}jXlj~hEN{4?YJv-yMb}MHCMjc51AD}LaC1h zx7H@T*pl4(3&W_D$B3{Ya7T$xO`V57+!*^u2m3?!l-UTZQc|S^KaeJwGsYA(kpgQgvGnb z+yZSw+>4w)drL}2)XEf!7S;&a5q+Xd^|TRInJis#Br zlLtLg9VGt5PDfJ^IntXZHez8WZ~}U1zFsx$A31rPD_+TSYWcZi#zj+{qDr?EAeznM zL+i|Ep(SVO7a3dO1ZbG680D+JPeKgn%iC#M!gnUR7tl!^C3x@-%Hbs8M5FC&4i}c? zs0%_1dt&2NN$c*^_VeDCY@(|({JlTXi$BjollBs7Qy_S5V3nePelyzI@fvc6pMOa6 zNspM}LQS?&kK>593R`N*c4=@-_n%t3chTcx<<|%QpX>GCU%Vid|Fs|Z7qjlJLoVC<(l&hoZX-S070Grf7d&af2;m% zFLyiam2_QKx!+@GhXBwoguFyZ5?LoMPh35SNP`6uN=S|1$B?HN9jj{C0SLnm{@4+U zFaoT}+AQJ1*0P*wm@P>OTC^{dWQmm8ohfOJNS5iCsGJ~Kthkh^d{nj`@w4i?EWvtl z8S&=5bCClLa1^B1d+qb`vF+MhTguCBM)BHu8`!-d*ZG^v+EAKAkoSldSa|mv(x@v9@eVee`l_l+07Vn23~=w z$!xoCv)S{2U9r|`Y~$_pX?f*5W(hsvYCB$G_HBC5T8@DJF0gecf@i+l82iB1E^FM? z%#>O|q2&r``0@V)(zai7&|-b({{U4f+Q+>aDt0}XXP_;<+s>n+)ee^$ZGV)=kl<#b z{Q7hr=DI%GR*JCoK-$K?7P$#>MSP)iEA3in^PS`Cc_I0M{;;^4baVKm+dr#bLB3(Q znevQq9dX4gim3el`^a;`bCms*<0eOwVqtz`ek1XAnfj?x8iab%^s=Y%M7Fk;?e{5N)j5>vlH895i1|Z<`p&K z@;xIO@O-J-VHiz`HP-LP<{zz^Iin5i!`&9bLzCK9f|T{_vd*ReAB*Q4&6eYew`I%m z+l~C7#g|Wei!2iVmB*6UP1^bwm696W(r|I~{d)+VmGoH;9jyU!EZ4&)ORECpRWMDj zD*4pky%1KD~S!l1C93QD(CsV`>;@a}&*inEHxw<*iwZl{g$kZq5yKgt0mWDqgg) z=*Id(o85f<&O{3$2zQkM-%bTopBg0YF!|h3hzm=Nw+U0)P9%3o}-5bb5GQV$mfULwh-6~ zWvibaU1+SdrI>&Ct%h;nu(}4001zS1&!X*3`qug@w=lN=uLJPr&sx38wZR2lP}ujF zD83Utb9v?uydYS@=***$iw(yQf>lQJxpgR$hKq&Y%SNT>NM9pu5kIb*ifEvDr#cuP z8oG_|p|p#oB_(b<^chrMKqZ@2Hl&r>O~5dbEK-X4*c27dmN8RU6mK%Ww*Ssy{|uXT=?(nn&xEHV7R9RN#K- zVYGQ$pl1kEZSxx4{R=H>W<<7&mfK8vXaW+KR)BrzLTv`76FD_&KCqu)=)exz#%-kJ zZ3;E_w6&_6q&EQn02XM~_W$KJ*e(SZS?qNRbh|LD*~PZDDBMAi)nDgb0-i!9q@2IJ zSvSLx)^#KTKrky%q<&($1oFoO81>A6_`NS8yLy>7E7EOAwdj}hG!ylC3w{Wi&-c7< zCZEs|xaT)od~oXDo3^OkajQHGsu_2R&v8G44nXKJt~f18e~bCU^p&v z_Cq~{35*!p+Ada7=a!W|R{%6Lhm`4?h2!er;2*}P?;7}YtCCHNPl7PI8*6AI7y{VS zyP}{EUnH~vjD(qwPGzrZo3nqHd>kr}vuYX439{ZHjmrySzOQY#C#*q?DYb?lhsA>OcKA2mf{i_YKU^|$>genW z99)|`fS%vV`j{WH>Xh0}P5-0qrFgkozP#st^0w3;&uKv`O-(U1y`Gk#TZ?o}MMZ;h zmp&lv$jQy_Z4QdRcfEg@R6@sacln0xS`FSlDDRv6Weah~AL`w%Q6m)t@W@fwHY$vOS=}RL=lO~U>UABVK)S`BCT8TB9EBc3N zvJv{BsVF`8?TDmHXXtmKedC{+3G`d!^W(e~pi;`DmPQ{vh(VLaZp^F;FP$gh?aMV{ z#q7tHV2`UT+rxt6X(K<56I)t?kMQ$E5hiSBCAE^b*o6NZo_Pa*Xjb(uZ^)IdPTJoz z$G*O746CEh`&i|Q#E1}+^MPKG&-8I-#=mpqpKQI9s4d;!$tn z&Lu_WRtXBIF<*B4XZdO6$fvbw6UWhDoBKh&Zoij$UM#h5s$fNlx^JfYvnq>y9uizk zLZ&7ui1QIEVnokOpj>fmIg8x_&BI%ni`}F=F_GVul?;}%Jz)LXnvOz>qg$Y+IjwRN z+`|2UYy!@7Bc8q~#&M79vyr@;>;Dl5h>cDWLR;@giNgm(AQ{`pp=AwxS}}7*dioq+ zE8+&x>#Bobc;$tW%|;~VR_XRgY1|xXv@7>&1zQDp>AcixKU=;8PVV|OKj}5YS?@6( zd%H(2l~^jN<#b{v3E@Q=X!EsU*IqbOm1Zkq$1@)Ms!MwTcf;bUX6Yk=K3xR_lh6uY>TQL#yQF^jeC72HOV+?&tRGs zliUJ@nl#?FWyZ}7AM4iu9=L7_Ya*Cl`Nm)(Q)X@=`5a4592U2W5sID?YJ%Pin{P1{ zm&eM*Z&p;T>0AGr7}H`YdzL0<$6gfO7|l^uP^K~3OF`jZ&sKS4ypX(OYsf?HN&AUj zmawDmVWX0}2AhsQS~{wmKJqz=hFs@dqRwl{gV56cy-wQ>Ib!IWRqU&2wyREX(CV*a z6z4g4WG`m=D|333$0n)5FH05+3U4qZP>h;>HP&UN8O*j9Z2{)cH1nRq;lq{DmPuyG ztTV~We5LK5fZl!N8Vx$2sN`kH$ol05wps8}*~Z+i1dunwK}{l3!uj_DE0|hZwWtyb zxuE_n6Y$OhA14QE-C}Gr*Jf|>Bc}lc-m-Wa8A7^m=_<;PU|2)PW$M{0e@l$ zYZ##0GMxbQJk~d*bWTI8^;h_?jFvPyl5h|t7^f3E``o`Y;N@J_w)a2*h!QnghBAL= z6Q_x7cypEfMvY{dyh}V8?>DQn+%u-b#Ag>ws;+(`#5_oi(A9)z!)7Il=V+qQ19;0p z3e*Qcjm7Il7Tf0$sJB8jMnvF&MnItnfYIA33vODjSX?0@!kwkG=6B%~Xg?FH*b&>G zizCt;4ZFJu&*=>lmb0t?^%>QYV`9->QjuX=`g7Y$aHu}Ef_JP~B1w``QGR@LeiH+O zbxv*(eITbay0hf7GgZ)RVJ5V>P-f9n`IX-`HzVt?by<{Bmw5BpbV)3IgMt6eJhla3 zIqui&XXPqWmty5uk!-x&FjQ0pqGnIFe1A5(IT_Gw)ThADEx0EoQVNF(Rd3r zeXP}_+25RZCgu!+4`|+P6U^o5nLv5)G;N^NpdibRef`Anf(t8~&K5lLEw`j~hg`{eCfg?mWJoYF&3Nu45l z$9)oyZ(?SZc*Ho)w&b~8H>#wno2vE!Gb;udz#aO|);X4Od)b<`H4$^dQl z`M_uCI5)EcLAn&fmc=JSVAmepce)L02o(nksaQy}V&nplmdE|+{g|PTgymBH62xz|P>@Y&dt^C*3Xeya3bBlR?Cb^R zQn1qWl!o%l^pD4^BU8IdZxs=E(4)YlqI%6lU}-6Z5@gG5p>F6X#=2PXT?Q55wH6*^ z*cLpTTIzziKo?{rBO}gwqll_JnlUn#f`o|-;zQmEdK__+*;*z!Vgabq{O9i@Mj{Kx z0@L2o1W}S^_%MyAZ@@naFBQCmMjs|Eh<+OPhLA!05{K~F4F7z*(*F!EVg1QB#8JZE!Y-j3( zVi#W?YtWYfukwYm0oH7H!v0PHH9i4p(yQ)5HJ^FgEbL`@hv3?r1vGONOq-uYr1sSR zNZhFCN1DOe$M}OaLnJ|hBUt)cAv8tJ26tGfiLB#g1vAF*Sn+NKlYX<*5JJeN#L8lb zgvzW-^3Y1~i}oba-coBS`TnQ;sZLbWJ91YR`E&EQ2-XrtZ^CR1$e;9eSejkWhkk|1 z+v|S)oW?t==DCOx@Z9O{ka?f5b`L2I&}qouFBXKAl*L7km-&Q8|@i9d4*gUk?r?M6pg zYaryyx3mWYkLIl?Qrs7xJU&jRT*g~3w+o{%+bJtA`7d|*MboGaB<7A|pkNW}De`og z$yY9rucv8Gpoi@j0j(ZbI9VTzuK2rTUj;l4j3f!=Nkg2C_#eQtKIX{5|GQ`<*wDNM$$S^#ChB>n?dyHSdztM+huYmRfW>L9Rd8HQ?BLhI{fTnI5iYMsb=0ur zb%!wX)O=0@0oiJixOMfwhaps9ZD!$b<^a2vK~U9)0T_5eu{Q|bgR(ELEk~k<%PYyn zXYmFP>agTzz`a$ZA)+vJUVW|Tmt?&zf(tc&w73*PTPNwySYy&B)(ah=9-?d_o&mt3 zZ#Tl9vO2bdZJGK)9#88gNFdp}-407NFDBFL@)F8s&cthBGZ(Fx-oWySo<3sT{785; zgzCOgotRhQG_HLm7CmGjZt=q6M&&~3+Pt=`rVh9*xQrCGSFkoZ+b1Asl4YTQ_M1Us)@RWa|A)?;afse0bpn zUq02mjD+;L6QR-v@}E~N`fy59DmTsnvLM}m4``%mb%?IES_HCYsCj-H&-LlxQr>uea1tL0_@nU zDpm`fVLFpQQOJA5Ss5te2SQR&@MtRqWF>@}_!#>@A3|*V!xE0W>yH~G(0NKHBtnMZ z3n7`-RY~-Loggr&y+JL^=V0ELO@e0kmRQyg&P#pobemQ7sAlN*I5^b!A^?UM_0LZ@-%e0W+!*eS_DB^P`R>Lsdqxbu*n@BI>%g111lnfkAHOfI*9MH62@QhRasWM}KC2Ga)JoU9*zQLw?N;uDbf6|CpRh3{BQq9Ny!vN%P^1~y!R zV%4Q{S+tn-Rap3G3SOoZwOW>LDb+>_yu%t*L74AWTK57DaRocnyIm$^9EHN;`9vQX zFl|As&~`U%Vq41fU%#&Nk)oKJKzY5VV*}J@VRww?STU|b8_%TP1S6nS3J*?kLd0ws@yy-`!yJU}13SH&p1t!Q@ zQ4!VAOgxA6z3wxn`zQus}4ifG~}j7b`=VgkoR@nkM{#1Ff(CiT0&h4}f1ru7Ea zR;GwvIT#6k_M|TR=AIrMU9CN;KR<5rCXp-}<)(GWZPO=b!T;v)iLEW4;FT%z z--BlG#O?_>-x!>Y%KzPM`x|cn7q)b}DczOjc*vo(qqf24G^f(jIB-~30A;z#ZKxH+ z#?*|j%8i1+N2YxG?Zc52DgJ_JvkaZ4?miL!WEjyOdE7>z)~0C@f@L=UBYPjx_07b6 zqOBIcNI?_GapMj0cK{EDL$Zl40H3TZc9-{ln$0JzOeGj$kzWcJs>vB~wXvU$&FP*HIc%aSkh zO{jPxNZuJ6G6Q5MJ@hC)GlXBiGb!S&Xv{5yrbzx#&#WjsT8MYil3-IU>^z5ur5kq%-qV2%hy@OgunH}Z80%;sTWS^TJH zJKh(5Daw#2=pvni63PL@D_NJ82%N@pV%+Bgq$`2Py=lQSmI^vDK_mO*7h7vYP0#^ z6nC2FkzRfS%M5@^KRk>RubH1zQU9Yo$;NVoW~xOqiF~_e5mi-(--_Ti_qvKJ_7L}B zjR!nj&hnGT`KfdN+y%-X!0B6PIeTC{ILiTw!T=i?>Y4IpP2@rsya0%ie#CqXXP*6N zN&OqLxjh(^j$y?tSlgrRnR{$Yt{9T-x$66xsLZAD{9Q1g(jD;%lbhu~&&I-lTiD~& zJ8zCbLq&5LM7;iHl#9NfoOXg`MKjJRx(_w<;8#`qAc0M*?vvTxEilhy5MC=8o;&8M zvBXH8N3?-~ZC#j-B3W+4xEj;n~`-%jj z9PtSBV>Fz{mF%0sS-~>u;s5W1snx@*|NNMt&UKv0GD!U#cps3`K3zL{lM}byXUf7?Gri~6Eel(9rzQfZ0IM3a(n@s=epI^rjt-BJGW!xwHfnh zz4&mv%LuIa^RPU`K%|6J1|6`20CJ83O6L@WnKiPo!jwmyCFeQ+B}Rh1w8yaPN(8WW zy&@xLVXQF>Ka7n(SlJPsrG)fw8wEVDzG##s>CO{F8pbZ^yU>N}ZO%M+;>%{N%u>L( zz{m(fXY4BR+~bds+$ArkGyfy0A+C4UD~`y-wzqrO*e28B%Y2azQ001P7>zR%(&Xak zIE6$5rbYe~N%NgK)MfY%_?=HUZ%^b-=>A~u-{DixFYoF72FccN*pa(Prxg2%XATj>Nqt2ME_<;nBN;{ zX2iYsg%nT*kLx2Y#W7I+Fewm;!K>Fd49pqoo~9H5OOyq}GjG7YUDh7_=vxv_A~Bberaw-hgdIOf|wDtxUxhqh6p__2Sf^ zs1+5ubHt`1XijKB3g4o+v_R!69dhY)%T2JQs#hUg@`2+ZqKQtXzBApJ+?2cJ|74N; z_PD9wDr1a1MCFhvlS5ihPbXLj=dgj>zv*)C|4b;)3^7idNyr@HHo+{hiB6}>9Cf6y z`6>*3T`@d(rq6B!rw4te`OAR`>fwzPWuPeMgphoaV}%y1Nc>s@+~<=NkNOVy6Pq3c zQ;yDw-|Yr5lK#p_}9M5kWs=h6D6US0*KiLHI~lu@fLe8)h0|C^;JP z3Fw@WJVF)RbY7zlPk6A+y7iGS#YCUTaaO(nKKQtyZ`ULf8rt6+xC^thTEyRWNF%c| z@z8jdNj~1PGtbBkH}jV-GC}M97}i4wo0aV{+HQ4|!8U2|c-kQ^O9T5c=a#e!$qn;f z)}xf%iPn?z1O0o1dxPtMXPUstaJ89i*j&2(jq2W#VxxN9hO4Do**-82$9;Kb`5+eW zt&#V;BOehQbR3>*+_m#K<&zjJ+^ar^s;embYgse<26Eej3NGQ`fI7yR5bL9EY%Vs! z-cv<^U3ou=n9Ir$mc4kzVl)c&&ggyW_FMuzFWdW#g6Pq?9Tf*IiV{!-1d z$fp4D7qk~2??bKXLD)8}^XWj*XIx^BBS`2e6kTE^pENGaU7PjK^PBRe{ZjPtf*5~6 z>o6d()GonyxRKota;rP;U7(v%kHc8WClm3Eft>(e7dE8fomA4$bV0B0Vg@5afVLFL zH&&zjbJ*~ZO01J|IA3xU`8Oy@ulv~M4@rU?iQ(UJB2&Cd#LNhKL1!hZTQ*4?%dgNy zv@^xIU1=ZlwZ9X-*VmVd-zG^%D{sMXpZSwGamvC0YrXN(z=B_!f26J}d=49msSEk> z92o!F!&D9U^V}g#RUBy|XjFZDQAzr^A^Ux^BxsILOz%PHO}Vo#zy zAcV%;2F{QMo~l0F|C!{gxSAtFFG*lGO!%ib+{W-fH5^Bkl3B@uM87+^G8}UzP##HKK&C#!hU#8-F=Lm%<^~*u#P#{d@7!FMYA^Aw!feLTe~e6uQ!uGxcY?8 zrNZO|GnYnSyqF<@7#HXo0w${x|HQ)1V1TV4u#q*`$ZOHuXYh92w2%QOhgnu&n}h(; zePa48f7yw@9rwGUehOTS1onpx7kz9e-3z|5D}T-_Vu|l8#nQ8wy`zgla-!~5`~Bu( za^(zeSQ{BhZ`|c0=jviA}4$qS{P(h4LORez;YcFr-`6M5qvm<@UayZAH0ZMg5| zutnA&`(^*!dHLb$(k#Eg`{3PTeActxh2|tlA#~MYKi26HuOOM4F%?Rh*GeFEC#`W^ z{T$=-siV5F5*RjBrU$mZkb)%gz{E+)$KQw<35XekK*fwMK56!dyqoOdox&oSlmJ;- z5^2VIe{r(WAv+F6f1lq~ti7e|X9aGNjZuI6Ire;H?~pSHSMRMC?A{*Ku-trFU5=>8 zL=~i5Y2RQy$@XIajz?*2IrGcqi?9~zRMn1mnxaa#q!-e=Np&;P^PJ2eRw zZR@sa+qP}nwr$(CZQHh;S!vt0QEA^=aU;&t+7CO<`3*Dr9DR)T;jW2G3L?{?xP|Nk zBzDGMxS2+EF5v8NvAN?4OOmqxQLhsCvI+p^%l6Zgbd}=R{r)WDT)lzE zt!giYpB7kb7*Q&b58MRtPHBc;nAtzfZ=Q(X`Oz(Jai~SOzxqJt40?9uOy5B-yYmRe zPF~;p0y)0IO^3DdH!tYISX^RQTU6#vA*qp6`r?e!AP^bklj3d^v}= zc$Jtsr+gBhb#{>YVfJo8F}s~1>E(S{UipUD5NEy6A@07W`jE)I$lC6VuX~f&y~>y@=MXfsZm%Tp1i|5NAO!(Vp7z9 zoM`Mu`*_dTO_k%R0w12@#)@u_^f~VO%NPA7JuKEIJyEaxSD)fNAn7RO%T!9j9EqIb z-BfD44yl}?a1ZYwe{bLZeiDD_~Vxast-@yR&^@wo^dpy%2xttqhPa`p~+>3gCNWQqyLxd ziN))CUg|2VP77bFtLH4PBO7ekc-CjZYfwpCX>#p+t|M=$CMFS6{#*Y)n!~O9XoGQb z0D%7}3;(<3Fq{VfK;wUxV)frNhYp_h4yJbh;;jD1G^_tXZJ4U9YlE}qnwOcIi%XY2 zg|C<*GVyo4iKdqJUo+lV++jx<>0%jiy-H$Jjb+k-!(9T7mAkpCx!ST_TAVReq%w&m z5Q%7X8SO^Dfb3%e5am1(?K~ff@1-!FmI2gLsXSd2ABnw~(Q}ToxmoxzlOyGIZvUtA zZRgn;_nDrju&^iOPu;hN^+kU<=|z8uu0Pk8USNKIl>}0DhGE*6p zdTUy(b(z>*Q>%_HJNUU?^~qK6X#tI^i^t>&)H9*8M4FvstfHz@)D5}`I6PbOoyoiwZ`?$((#@w1|H$_G|W>z< z5q2GJ6+RpMl+vPoncFar(3+%kQl0orv4V4nTg^|#J4Opl)57M%$I8rHq@_lM{xT!!p_mF zc`nj2?_-jPE8L&Yd=b~UdEQk{Y1c``TuG1Ldd1vgmw4B*idoJI=1#Y~U7djLXqQ)< zZC?Bx!}myGB!%aoM^YoQuod26xuIR=mAB>^nX-cT>Y8SHRJrZ_MUqN> z2bVpKw_w$yKBlu=SM6D{@!+FPW3g8^1}oMW=#!&0>eZfCVhxvXaR+Q)0qs?RSFApN zblEobrZir)SP_U{rE#E5>`im|^KX!0Z-zF;-N|y~b>7e4@Z?IpF^M`!COAM1yRw5`^v%5?yCa6)5_F zL(a#2%Gq}2%+c3$@jV|PqfW7ipKn`iu5iCVEnI=S)t)v;zke~08a4aYUa*{=)zfK> zTAtGc97H;w@hkGF^QjMUsqWf=?LxI@SKHR8xntY)s%f_b=lZ z?@Y8CP#QWhxZe(7b!=CHwYD{0I(*p(2p6xgsNHyvBi$}v5A>c1gqoW7juGB&+X_m9 zUH8CJE45-XE+v$^4(8=<*Lpp7?Fgi$P2CUVG)uGAdz~$k8c)2aKY9ZHY|c zb=FxJ5VM#E^k~ugTXwEg=xO8bl={pH1;v|idnu8v9+Z`#4UO_|uyIB#C`fU&>3ZK#d zmiK~PCKzHzNB3cKtfb+4xV9hB(4Ai4S+59C3%p+sG+^8Q0X}skcDRaLz=rN)%Vy2N zjp)HxXV>C`>*>Hy?(ra76vya>Zw3tp?FQcM6JdWlTb%&7p2{mZ{EZGQmtLOj)OXDa zWE3}^cDQ}m9gy96eSC*n&vYY^q9{raAWu({#B8Hi**kL8m~La>F%M9kb^u0TM@U)^ z3FMusujhhI>eof&=v-Q|N7%C@?PCg+Uv`QMhc-~P?mCub-5>!};hI_;6T#=N%g)jV z+M=Sp4ZE4<+^_k#T_A!>I<g&tf+BGlBVk8gh?Yd+?RVU7>$nVXnHbB;rCSY@^ z?7q5=LU{)c5iI4zVMG6}SBuJ#hVTcfNBNH5|2ElShIVjyfM(Ekuxne{!2_>4N|Y)-cD zG(UFcT!my;Igv{CIb+8L*)m_KNi`^{O2$5cu)b{&dPX;Rt0uTB;=D)T&i>IOgfP+Cd-V|&0n71mSuf=bs@(-S)Fr*5dk^P*6v&^0(!ZSqX$U5;Y! zs+J5tgb2sOa>Oz~>OTF7aV^!Iob(4|yMsc&8w5Jj8}o_}T$I3e$RQAiLJe$+6}3*& zW6}sxUNdZug{;p~1`u%CMbBf&dfRc602$EZHX?nLgT(5?xM< zakDXG&K*m2Kv8W6G9cUWaf(2w_6FSCBBO|-LZm-YHw+zTt zX$6cW8~o++znDl4WxsE6NqayUnz4TWZn$wBpiGMbc!P}{@^ns3C$^VSS_ zUzc|To26OWme}d&+sD-t&6DZY(S1Z{q0Mb3mp^nw@_5LiUWvu~hsBSl)p@ZuQ(oX9 zbv?`?)Auy?Z^b|B4~WrFh62CQaU*Wa?1 zLIK&(lccQjf-*T))%_WPGw5TkJ)wr!0!|Ik=>(b=N`5g*b87%>;~EMOU_)FWD2F%# zBGXHA!&L99zQ&BdGtm%tgAc6}+CT(%E2m8i6z{{^9|wh~UZsyO zl`YyFsN8E^SD!$-VzZcQDgz!4(xwHG?SLUd)M9>^0=x$n!{V^!I|rsMdiKHI5Y1>_ zk+WZwASM3SiZ5_Zbv}H&VP<$+2P+OGPE7Lo{J}{n!4tu+CkF;mfo66Y4~?i+ED+VoVg=3X89m<7rlai0RBP%uw&LR z#RCjy*e6M3!+)0q(QFFT|pdSRMGSl^Z~fAV!RDg>{}cA1f{AMM1xQd zT8!^B2~?ynIrL8$8dl3?p<&}|oreHs2zpQ%;GF;A@(~PiOyhiuRkRN|DLuhs$ zHhj5`Mi8$f8idgh>;~?;goPNxj<8l2ptfRsJ$#S!8~*!N9nsOqj_+WK+{nDTd6dLh z&KjSjAw9hpw#_-gq+T+I3p_?+JE3c;eM;VCfsiU&@nCuq0g_a16WFrQpjJ^!Mzb_3QCM& zgbuS3C`oaI@&+m^04BCL_#5xMDI#V#qCOSp%aan&jV&q33yQfE;Z7Vg+y2WgQd$+q zc?Nhc(9K8(!s+E4u?k2gp;jnHV-5!QQYKk6$bk5$;J?roEi4d9X*-|Yi1P$5mXUZr zXln?)d3BWgr;mRlcqpmyQJIMMUsA+#mC>xsQ?5Nrlc=#9Rmy<<%{+T6GC2`bO`pNsg)Cb<%- zfd)M(-kTi99zAO&_;mt_Hxb9u(K-K3$NtUua% z*cuAAld$Hhka*6v$B4w{h=--IJBbO`@nJbLmc3SWj*}#I#n#>&5 z(78Yxpv6BLty^*-BS*3gB!ZpJ8YM_$bzZZD{OW$MQV`;SmN6o^ur74WCmy zifl{vH;rjmHO3A#7=r!@`vP0XC2KW-3nUDK+f%zGLQthLJe4xdJH9I%iZ90KTNkH# zq+ikDA2|Otg<%JkN=CLZ1#&VRXKhl0NRqImQMZ zIyIqs^M{2vc7yHKvS80`K;Tqr@-@KhO=W1edjylv%Bb9uZGt`p%wdMTMz(@2sLbpp zY5>hp!imoWc3vZHOKUn6SaJl|4LT2u9AOF$Oo2frh~1z?FZS;Eu~KF=V`Dl~1R@g{TLR zIRHlAhfCy-5s+9ql}5mXJU(2pVgT@YNQ*V=-iRA2tjaQ~p(+K^6xod^rfnEdnAE*T zMB9X(m}KxNR;nUYCKPAao(y}pVv1IHj6^)(fTER39=SHm z-#+LW#t#;EnBefJAdG~)E1c%v8f(!|kP%YnAFDGse#j+`{zu(pgVLQ?=#uX$dgeiI z|MdPPLNGh<&cq)UFvV`i3#9u>B{K6DFtiNImKd=oEYv*2*T4Q#qX=yP=CFZ8edzV` zkYVkqAQp4EBAz?u?r7_t&07JqrT@qB3noeqkh}@3Zy40_o%uccuh?nY@(hBQ!YY%s zl{ZvFAk;blS!>z}dG}=&7_$1?gmwh%{uVbC(bm7_T3ysv#J%K^EmzJ<;{spNeR!>! zuQm^E2wxqvinm^m7NP9OtigFTL@W3sdutQzO*J283{%YO-tORCkOhO!#+UDiO&tdV z=%TSYE=_+U(!xrp!Is?Dmor zoxE6v>Vzre9T}2za-vRhu6P}}yTqwd-;=*L@ucamL{`R~(?0-tr#Sy zouQynApPMZTxhS30cug#^gxu|73G_zM((Y(-T`iGg@pMFPef z-7tK&jL)vT2)3RtTjngCRJQ^RLFu});4RLsq-cFIu89eeAqkTMBbdR3SIISk2r&{Y zL|*~e>ZI)j3D#I}pzH9wFwwcZ71TFB%(8qk|0eAxXR0f!;kWCsYGtvwDi7 zDl0&M@xHHxYW&?_{_d>1eX6PsG-uR6&SG8!M6&I~x1$ud#O^maP7=c*Q*0b09&^2f zMOI(lml}A~15HDtj_$$!h-40cu$eAbV>`o9ujk9wsr<}*W^<#?+k|TnJ%fLgG#~@# z+DsU(9B|ZIGR_TA<*ALq|2Z)a^H=n2-;T0q^HVsrXgQb)2yM7Y2D)~vtq&hzKVx1$ z`anu?12*Nb&0B2ESgoIqG(hxFoEunXU&vB+W70-Ck)hgpgSD17)1;bYT1|9c3~iq* zj7hpexl{*!6kUK%-P`V8UlajR&mzk^H3_P znS$s?Kz)#h312*POG)ykN!Jv67YIzPt;JSh-qci6FKv)n!R*evB~w`tN2gv`2K+%@ z5)c!C(Lm!V*&u-rcHU*i(PdFG2Q~DK#a|iO69R%w>)Gt1nUjUv-PP>i1|ox(0Eg#|~)37gHn*lz99^ibF)7Gxjb)f*<%0@lwUkvX7-{}N|oVqPWN z_axOHFFGY8OWdMq8`$|~rG^7rtg?$w8t1eKOFvMr6V~3%TIR{uKY>^5imK!;ROCZp zNAW|d38Bx=*qW&2L(ArA>;=F_(eSrXzWmv=A$xJN_hX=+vcrT7Yd*e=Ce%+~Jc&iC zIEbh08qKvznQ{V})U%Cc)Oj7tH3J?&nwFtLb?PubxdZ2 zWt#3p#^&pRHyR^gLlAlnCG8!o40vTdXI#X3dg34jufkOZ^(;+ms&C8jWjMuA0~nCAVhW)^4)w)WVvxj8tAx3h35VJe(f*0ePxfP)ZVI z9ifyYPQgit4Sa*7l-#5lp_Duf3=U3apr43)60Y%2N*)Cea@+%Q1@SKln>b9j-MZvv z;3AZyRY5w9u1*YFEIK-@V^k4MmeBm}6INfh3Nj{$)#Oc>e)Jst!2%J3>Xh5cU`^2a z(MIb;}B4O@c)ik2K(v!a76yy^FQ(Y0f*v^atFJ&KVZ!it7&1oX>m_s zu<;~U>DR#;hhMb>W*JV|Pe60b&#z>`l~De{cqi2rv|}#~l&ZGy)kp&jgd+ij3JO@j zo7d-!Qm7$@9*Brw$q^Lc|4d4V{ISEs#Zm@Fnf~?g)V~l>{n6?kLK}N`ewvr>x+KIr zF(xA92}gxlZVi{OqH0?TU&1_cinl2*4Ho^kFX*-9Bb$ev=%&hm?iBW>7!hk=KoYLh zTga_Q9B1;xH(D9)zFfWQ02z(|XN&>G%BNZU`4Wc=O3JR;)d7VL&V-Az4CK2vlFINe zm!H2FpNl}YAJ2(lDkqb1HkLV{#TUKeS;F2_zznRESy@8%4*t?Tid^DGGeR_!(mOCK z6p`(MV9qe(5!%C0iewcZsU*~(g@hQLy_%IV2D)b|)rP?bV#L~yHeg}hqTroN<-?SZ zEb~Xk9thQ=Q<2?-C0jUu&UQR{(9fcC}uiGIl6X-4;f+)5gn6L%IfOZHl5r|qUkY{Y|4eiqbs99-c0=x&kr#7HKc0otxNk3=*HW*1uYTQak>6M`!uH^Ne($spQb z0Wt3!#*ucYB4rm9Zg0~rF)MtD8)cQwLi^rC=vuQS-H+Y1lVf4p7%q9Oe6N?mlGMK9 zpssTZtOqxNb~+y#C$MxYtSI3uEs@>UlSaZR20kRMG7Zq13PUg3u>mZBpnVIlcc&5) zr{9=K&c(U5()MPP@-DW4F}z_WaA9qqwO=$qB4~V?N++16`FK za2HD(V5tK(epCbeOyI?p&l~i$Q;SD0F5&%@Yb3135F-a?#rr`X5P~+JQh35H;PmiS zC}!r+4XNr4|t@*dPw<+rfCzbK%98KmHNEkfVhtEoK}M8+1@%4XZUQ+w9n5 z*JqC~6l&Re%y$%W6QQRt$hiRbPtnCpbd}nIM6RXqERCO%aRuYjs0piB5T6@5mZ;*2@02!#!up=Y9j^Cq;$EAVi8tOw=dZ3aA&y7{9XP& z@8yfNV8hDe6hJR?2}W&3(D7q>i1%a1#ZK@+(T2k%GY{~>SU|@sxg*&8DP0>-i!j=l z)|nwL_5PU2Gz#hhnK~%0+%4x+rKIEl97}Zvieg=@|SVzoYW{foP20#GTN7xe%`hxhC2%Rsa{Dq!m>?N8T{v;dJ zkwo9;WN&0a{}0eyjnmUJjxGX!5GbD3fw<*My15;VMyhoxrt^JmCbn~P`voCR(d$|r z{j_eijJ|B2ZhmGbqHj0jV>bJl-Lwv4yx5*u`B|NobMt&&m8M4YFQX>#sai0@6`0)4 znSX?_KV&o#n#ZMf&M%+rlYom0DhC9TezK66>6DFDZvr{_8{f>QPf{W!7JWs1BsM)7gccr0ajN~6(v!U ziXSH->Ph6Nw-Z&KtuRSlpZZ10FCL0Iz7qJ$N>{6Voy0V3xLUu@SWMo}cbER`XEk~7=(}4Wte@y*_Kbb|} z-A~r@A@}-&?3wDRpcHXJD@34|6`Wa6&%6q_yWUuFgum2spco}cE5caI(X!$&|Jk=K zIMvo2undX&X9Q8$7y)x7O{A??s>%J1|KOmgU;M9Hf~;XUJZJ#b;2H^oIyvcXH_xk zIoBfks%WOYU#p^wYHi;maYs!M6uRdQar5VgU#|Udz}?P8cgalI_WpM8N*Ejo;@A%j zc7ONv;@Ey5_U36^&E@lU$$Pp_>6O}y-6?$@(awHO+{l$<4+Agmq6pmB;kfnq>wyxnZ2nf}p_A1Q=A1M)vgy9xi!aQvja zf7594ID}D%=6Gb^Bpm^Q@<^{aD~N8(?>M1ke;{f?>`zkp-W{HKMYoH#{p$7sDoj!7 z^x|!l2Hf%enBOhX_7f2(TbAo$DUytYDmD8(2kCo7ABMytaml$}zabT!lRLbHo=gYo z5)S5%UBy5mAa=u~IkL-Mpa)|)xYPG<=yCI1=+mQcmC0QLG_#Fnvhu#yh5wpA!+SlV zc<0{|IQy&Ixc@UlaEb@PPgFOM9pJjogO*MSnstl@UT%{gJP3C~aq3_X9d8Tp>E=#7 zirkyA@yBDph5-LfchGc;&m_;DQR=3HzH@9TcsQP|cIfo*yyPL+cGqGne+;<$O0)vx z(~bQ;>G8o8I%>|k zAdc-}eMh7Nf&hU7FoX`KW2|MN?GDdmKKP+wA$m%TpXS?C25HR}ws5xCt{4E&cr26x z;H4^OdoMxc4XyoI#;hVVjLGa*orXZdZ!PZeF_*=WaYs79>mr9;3s?zx$Grdp{UE$o z#UJ{42L?0I@V{bmt44%DIRiu*;khshkBzxcmTPygp|;P500{>(f+a$;S62g8-sho% zA6|&@A>v}(w{c@W2q>~}y2!tH+q!P~^>p3U^0(g}p0+FBSFNq(@pyhldu{d3Yz1qy zS87{+>%w0{A0f3HSK(!*d+_Jf_z2qmO#t4UBH$v;6b$HE=s)mcB0OR>LXYAoacC&; z9kelYab7>C0g!`R`w&802Fwon`6G%F#CGYgcG`P}eYy(GnD)ex!GPs;F)h@4mK};S zmmZ&{qef}04j-9gL>+c)&+FdLF-~kL-pcZt(?@nVND+6Zj z#{5ASPt2Glc*^_vBn^uqP;(ZG;Mj%tI*2F;RAYa0sWx)4qp#j)3|43k6<+`41)QRe z__G-nL=_9E79yfDRi@?Aet%o;J3`&Csl+W}=x((Pn*LSY;JqVINaOz%q z@1PefmLz|=lFtQ)k1pQAZ%`II0^AuzC`~AgOk&qhpDLJWxt$KPhDxce`wV`qJHUmv z8@@5h&7#YbN2o+e*?vdp;P%!Hiq~H$YzXMSv_iRRr7riW705A5;`&vKAmit*w$12; zYLoz$UzSLg8LTCtCNCwVCM}U*onNY~a^Yq7hQYZac-{1JL{&i0n_dJ*?u%@jrH~Yz&{uT*wN_v;3gMvy!=vc|0BS|yRbcI;TcFEY>z%N z+zS)a9>XE4h09zq1^gKD@&CvacOJe$k7YbA)gk#A%Qdv;xB)nWLp5Zh3!>=~Hh?x0 zWK8I_$vpZB;Xq$xn)w-OV(uGpqWd2W6gY=&Z2Wb?ohP=i95Unq6P7Fh_p4LvgL^Ar z%5K4wW^u_0VG1I=dsv|$ZC=l=m-~rHtGZD6a|Se5eHe%?JdJ}x#@J(10mU5!6`|R| zNv(FLX?{kTZDD*-@e?Vf6Dq~m<@_q0t+mL}Sm5(257YiEs>-NG6?xS5G%SX!%GLgX zt1Yx?Y!N{GWp%L|cB*x>P?(xH)9jb?y~#!XiJcM=hDru%T$kzYD6UftT!sbYvF+5& zPN=Z;1{9f88k%(X8lQ!L=&)C zkuOu&#-lETN6wOncU<~=$YFqXY0Ot|3`>hus+?KVgbkmp21<}>-!7lu+edM0OXg&#_IImkLpR#{b*qt<@{^mpETo7GgSt)#JYx$$_n zK)ZFHHBJ?viv_PF6(2663fc>rsL3(MFX@gAS zR6ObszpMSWp5O!rN6%+Y70Rp~9UljpaWnOXhY)(__=CI1FL)&&bUp2C*H4 zb`;l*cS%q^v*Zsp87nRbrwYv^TSGQanFWNUu}fZJf56699qNxOB&Q*9X5fA)`3>(o zAu;4&e>wN+0mHni@;Ke<(+Os7-j^>choz|dvazao@gwylkLBIxv9;?L&7x;{v1V$mj>B>|q#4(h&aMt}SMCOGiiH#2*~ z|C<^!@UWwZqk7`pV7Xt`16N7V>;Rk$KsNPa zVF$Y}O0Sa?PSp#=$Prn*u*B%(8TVcM6qO9xtIa-kp-UMkA!BMqB?U}bvh|{hDJky! z1!C<7ZjyZgpSD(@#Re^|ZUyhwN07%42ofYKnK(19&r0 ze)$8;^yG8B)`}6Rfqu5WWqm9Z8hiu%-sP29X%!pb;v!5)fb!~98Jso4(vN{^nQHYh zAYcC)Rngm9t(lrX^G=TP*}jSAVLxjx2clby?-#Jmj?(&8W zl^wO$!UG-!_h*zS&2ea>*b087zr46FG0OyC*R-WzDLtqfl>*11tT8<$P4Myw#fWmh z8V9OIe>eLe=Uf}D4&Z#SOFn3iJrf(N$mJrDDOoy4FeBEUQx&17Bp7B%I}~K@XC!0i z@z}zPHD`M$0-Ky|>bqGZ^c4Q~c0s7l!H3?2PL#29b2p)JwFv8sn;D-5KlK!}Fl(}~ zHfu6m@I_A?bRz+#T^KwYoXn>?!HgRA2r~okO)&UyCt3RCtndw%ogN??NHpDPEXwQb zlUYlwIR{#HDIohD%HTTMy&y26y1Peza-O74mDcD@BfZ!NnSQ1-e4$f)lfkIgR%T~G zf>~aoWvEKCvPiS5JiO~wtNL4Oqujij zBhWVzA7b&{SzaSy1jwZXX5|EC1~R(=eo__v&60SzY=ex{Noyniduq}ODTF0}*Ya2Z zmkTr20~||G%#Gpjpek$=Jsm**K2X#nH~^n)2Dh$P(QLUqEVFCSVGWN@&+plnrs)?% zi`7fmiBP^G6%5QK8A z0KUUb2@)A;eH|Z}TaG$Z;~pX&e305}i%C}XR#rtN3PQ(6Y+rPrIf?zC2BLAQuE<`< zX&W6VJ(hY$@OVY5j!tncI|{2(ohKTay`2=QU_~4|u@7njG_>krqUf>^;w0$t{H^zN za1(G=`%BP>PD+Z!i_Dig`jf8CDqJg$q8R~Erdk{oKvfL2_|hyRs1L{=R+WHrU4r9T z%h0#j%kx8%1N7Xo#-^sWHii*7;xcBA9@2FuU5g}L^_H}2EI9rFz?sNz-^7>@Zzx~{ z85y5g55O?;3XvX=zWQakDHMb6SswGttW0tc2^})#dX{pK;UU*mVLqC*8`!r1MFUXY z#P8aDI3(_E3uOta<^t%Fzxn(yys3pd5tE`REJY-VBXgyPsMg#M`mKzANo_ao+68qH zxJ*+M)LVOYhL%vmq#RBk*X+aX?Rxv@qdP{0AHsCe zL^T3=g1QCj(4jiCy>_-jubWQa`Wc(wC4ZNvPYqC`qYP-)>xu3&ktGLU-G@w)%9tLF z-@`uP*f1x=iEdf<#saLX+E!VztsWLy(rN(ow8fV0C0(KQnNPM>CrbGN0P@%dNiJ%j@+E?ml48aJ56Jy=UE2_am#lM_ygy(*vB^ zrcDrrjG0S%SARd{V!T}M(gn`bK9+A#E56lLt73ic+8ggzNsa{GwDAh$Ns5ak8rdW2 zl4PRJdQ@;?ODcG z;W#D0NsePeOb9T@FW?e+4VYM|m2nJ7KYcayav)bT4e+*um5H^A9}6pn#kT`PEc@UR zEfsKy7Vc~7TW}+!t$Lk&vp1JLOW);Mf%w~@;A<=0Vp^;8-=PY8(1~jGXbcN_drgY- zy+QJ7`Q}CBfNRV26D2o6Vxg} zS2v3LD>ohlF9#6*5Rx<~T5OWbN+eh zK{$j7t>_L4+Cnr3Z+Pu`I{5omKf_=rH_VO8O@0>g2u_AE=g^=SWjICYs({9EUc71f zyMbtn9c8qv_6&tlnC1Kf+uH;YNfKa!ikX`lDjpmnAm`~Li8MA5o)nx0&KRVjrJFG} z9cq*`gNL|%G5gdR)5ImHf9oi6dI|k};k&^#$4lR^-24$-j0&(p^sVdtH++C>i!w!W zTQkj)mxSlmdHTFn7I>rSvog5{AwwQChE)#&FQa)$}(>XE1_7- zspiMwJaFH9(1AfBYq{cX&slx-UiaBQ&cEkvr*jq-{w0X{V%fGMp6Aae3Gd$onfaGt zY5^#^TPQ?i=~nE8T5PqFp;543mrCFV*TutL#>iUAYYXoD8pP0EPEHm=pInOQuMqIX z&PkV8)fEq&trm*&iWJXBMJO<{FO0U;oV*zN7WFQV#bGg~Z*@Q3)5*y64p*GO8CCe; zdeJYwM+$+`aC0PcbB_KX>1LcCL9LA1>2((Sc5>96s#YzG><#J_n7_dMP*cz=!A=>! zzU$p8*%mzPO__Fqd`cBwV^j|uw{vMUCv_u#XEMHwIxBEx6Mw3D%nf?;>WBcJQZihlZr6rl}ODjH@axmCAA3BEg|>z)6hi^aYr_+?apCL)zytH@KIl0HEb#2 z#ipRep@siBSW*5MUyT{MEEPgS%VRH&%KF=cLCbG6cTkZ~GA6{+YAn96sX|ptQqi*$MbJST% z#2w&40nMAUgohRd&6B*LP%1o$XuOj@q_OQL-gP)5#$~=|ecgO$ze3&VjUL7r%>|Qx z-$++wOu(i55dz4r>YtCIDS9H-RG$(WcqBFzYiHQhX7Gs~%Zo6()c)TN)GsoGw^-=nQ`f6lQ|zwKQ6_Xkedfk|=({LCJ;^R;&ary{XO|1% zL%!lAE~daKw=rJQzZvyI(X>GCr)fyshB{zQE6eZd$2!0UX$eUHBT;GWD=_*mvHPwnvi8V~2+v&E@nx3KrBxvz383IAkVXaI2tpA+ zfQ|$OEdk3@R?T^4J9gKpHz1qTUkNYc@cZNV8`R{p+Z+H#wn9>rX*|u=-sZbKXPUhY z^CTR4etg&dl?Z=RbFfg(gmYf#umsy8AwXt=ZUj_B-V$w;6;WBAP!-W(p9(XOWuH_T z>9x+SgY1%8LxaU0pH*no2D(v1_Tc?qyue_Ij<@LRR#oNOBbvl zCR?-jc=GI=unYqp8^za!j>f^0)OGIz4OR=f#iC6ui)F|i(MCMsOxF*2>Igv?wLe5; zBJ$Hu$LRcR2Q}(Uiry8dI*VrjRym6rw@Z~^ZS=>)?qyy)`|gx#SGU^joTzcP$B#_t z@d8eWlMjBl^#b-A6839z&qLIm^zi4pdd4l?8T%A-OE%txr$?5tplKBtV`Br#HOBKz22B5AFK}% zqapNic!C*oaEhE50mG0=Czfzby=1yFP5GRAV4ZPY#p5K`#hkX{lTuC%5Fs>3NFE+z z)G=3+KlrBj@*1(N6w6dt$58?t(2FMtHH|5N#;nr)(F922O5gI%Apw?{HDCP{4nM;#;%s7rp6WL{=~p)E;dChlZc}oqwTco8~*$B@NS`01`LCO?f%+9E;|6d3W)Fhef@NDr9Bnesl%;GsO@#lIYm9=ZJK# z6quC8$sltw%Ps!zB%VisTcb$@A{!M)cC1$Q3-*5|n6Krz3mF&y;6HQv-zRtt^?zMg z^WPk-&i2OE&i~t?P1TsO#~wr7qo+%kmMY=1*_d1-lQlw494ARjR#S}Oh|9$gG$~ZN zG+Qug-NenJz5!=$W|0lFie49(mkull$HOXso0s;wD_r}*^ro6uwgYvtI1t``H8Yp= zMXLarx$W_MJoTNq>s4i9HI=$|KC6#+|9Oca`Bvt7F&^0Sz8|BTN;;NqJD%!8noKmJ zZfdFjBLl0d-Ag@!&JtEDu=`Yf=%T`ItvGCF-Y6qY`JIur;SANRE^z0E#>Vy zK|>Fz+zx@cT0Hp^5ISicmUi{-87WIEH$*Gj-Oi^cvKk&}s0L1!$Qq$!hk)&q1tvI` zn)a%Jr!n>9Q!Q=yvCDNMmi8|JDPx`?DQ@GuPSf@}`};9fgcJ=@H#Y$V0A{Y=b*WA% z0WO^;$SmnHkgYO1Ol|Ce+2IW%b!LJ9y&06Of;0hwwRbk*-V0lv{7xDq9Klc>!DT23 z(LOMbc@gjJ)srBR>ybCe3hJsB?qQj)l*Uw7u9n?6(&Kp<2~4se!X7d>%5`;FC(pyk z3mccqdBD6oz2lAA_KI8gij}QB`&dl*-&}+4ENv;tl#<~O1K-CMTlH@98)#&BBEQwP zKizz$A)|I6ngEE+UUbI6As;d3l3Xto=!RLfX{f<`)zxLDh2;do6c0%dKL1j-q>!uU zMhg!%1$_h(3LM-4LOpeZ$c4HBa|{>7;~LWj5{!lz?inif%eLX}-H={9c@9+gBPH|N zDvWPQQ$R$}4&GK5Aq5@wca~g`v>ehSZ0@2t0^JqrI_%yz3D+`% z0seY}*U@O$c3#il4v4QI-`(%>bfx(0lGEs(0KOpQ)7%LF-PG1;^%`#enZzTOQu=TD;<`LjlrAtD#CP__MV=X{D;8>K!y6$8{x*1NM=TFIl5q|j zo#kIkI{CBK!vyPU>k-B=n_oC;P376kTevxmLjasW+N(Xv_n~RqJ zMK~Qhi0I8AbR=r*vfeP$)C2iLCxO71Pnz(1#$UqI#c%~Z?NetQCqhTTjxyUKC zIzO^J^x3-P!H{RNg~F)qK8K^Xyg^G+bEPo`9KA=n;Z%9oOfVu%rsq5;`fV%prEpL9 zeIMfutk<-7l5Q8$lF2r>RdsnQp7UhncmCs#r(G-12SN1Z0gz}}jC~LYEO6#Vvo)WA z+S}1QJ6bwHev&2HD8)PxiGllARm-h z8!dl`kB=>fvPxxcNO?B_2sI&{V247LnEyBiaY*2nSDIlF8Sc*UE3>;mNff2_Sz zkSJmE=GnGw+qP}nHcs2N?LKYWwr$(C-Fv>7-JOYv|HaP6RK*)nxTuW0sK|KU%;&co z_=+5x1V099nvF?1Iim8e0>bN^~qEP zvH-|osa`-9OT3=8O5&b$P7}+ZzEbqPs$`0;0|A%pDvetl#OtjJmP2~KG~7s& z1Ll|dJ+XS65Iw`Ma3h4lMrc&d*pzXbpZ*y979qi|0#PlqP?QDKTCCeaUlr zcS@EwDTh%j$j-%!lScNg$%Zr2-i9T!M5rK+1b!=)X zAN9V$U3_ga8c2t^ux~}Ckk7=feNQ@!*C@)3C#DBrzNHjYE$Vu>3qi?7Kv5+O_Oo`E z!uDAH6pYs(2}*8;#)Z39-XrZAFHG0pl6Up6#S<&GPLkM%ThMsk^T7mXBb(%a}L-D zt}S@qIeW@EyX!aXHS^GW$4$6i$rYzeDR$5>sHGhqRKtS=#?a8{T*#0vtUGRAA;{0g z%2C$ZBHOcoYiyX^@>;@0Ab9$u{bf{Y*;Bc=_K?ti@9sp=JdRhccHr(4=tKcjj`Q*D z7CS7KoC>8#CnTgEN<8YAi=>Z{mSaU;cFivMN@aQ{bRXW`q$Y#VX(A(YzSRIgmM;4w znps6q`8;mcaheLoZzwGnr4c#I`e0nGsE{?wqUeZPpSnd)abLZ%%r|58KCza+V$D>q z7xvHJgy}#3pdCm)1HS4ie*#oQ({xyj!#p09k|tNf+t#>xK@fGu$VX6@0# zX4O;;Y1cmA);W575JEFp=Om-Uh=+ErpQLka+ zV9cRoz~>KLQwp&A=HpO+Q&m~_KqVJ9HC5uPcwhHL(>qu}mf1sBz%7|`Hp48v256ym zF=tx=JR=K=>hZFEO-O_;5cvU`qJAV!lmTUveW{91NZ@Alyf^zQ;Hrvu=<6meV5JhD zX_bg?Kt$3x(|PW+7b$nTtm&WP%GiEKbV=3!)<1Uv_nM}OQumNbPzN>~+_3Xc{|*B{ zTqh+foXJFbss<rh7`Tk@yKCh3+lK=K`N@|Ty<+dB<9$j0Rei;hZ|1C`WlRmtUi-R!Q z@W|W7&KZe#as~7EYs@Srh^yN}=_70mWs4ACf1w~g;r3|hB=u94FF!%%Tjs8;J zdgJFHLYv+0G;`yFs~c>zik*5C@lYy21_%DET8Op75k-IuBW~vlnTn787yvqR`~yBR zf!g&4^3+00hea)24*$0l7!|m8(cQW6!uIDp6?_KcNZ*=uK{Z(0>Z@a6+l#TPOg4|CHVTbwS?!4uP4VhBz^X9|eqA0r!+1@l{t2_+yHai|vLd+uPV!05Yc>d58s#L#rS)v ztHJ0yF?y=&>7eLqr~u_Vdy3>ca3V4Ki^rH(82I~ODp6%SaOmi2=xNF5d!Ya)udCkI z@t>4~s9@;LGgp-O=H4ARp^d}V{!UrUS?)^k8JXb^0uB5xTi_6jQR)O4|MK&n9R1hX z`}YDs{{N>S@xPG&{!sz{Zwluh4^kU#NfoJ-q*X{2!w5za9TQy#HMO z&phz|+$;Pa3-5nG3;*BvJSiIgD|zIhd|G8*v?A`QjOkGWF=>Df{x%}6R#AR$- z`^~oZPCwAu;rxeb)P*$MNPzYDl5^d<7Rm$X;W=s$trBBh6Gd?;hi=1PpIKs z?H(Ed>{=#Uk7`&5Eh(Z7RDcolOmkZO){NvFj8>nxI#{XHSEL$;BiJkY$F040ES$2S)?BG0spvOBujtsQb*UJ`s?~+)Mb9ZQ|5_I6 zowsO73`tf2k`d4y=^XMc1BtC*v1v|9?UXfFUK;!3Ac}%=qpMXt7tk(4C?*|i zZHo2j#&EY&}c*{Qsw7=wD)MNPI|v5K#+m@ zV|=93#qCFI(2X)CijY%;7=K&<;>qkjJ~LBWW4^xJ&H?CeS+mMYkQNQ{H8mP{cRKt| zk8Te-)9LQw;OglkSJe)w+%z`5^$%8^)tO@JbOM8o@S-dA9{W_&0h@`3&3 z3Y$!PAiX-&6IcezZX(f915Ju#VN8sbmNKkJJkt`hkUwWIe~@IWd9B=}(rLr|NwL;M z3y5YYNOA=fB^d{z8&rb>gZzo&;tDB4gdeVf0^~%@gNtwA=}T9I!mo>7yb}Ob2d+^? z&|lkoc~Go?wvHHamg9go|DVBfjLuktziq18Eo0o8Efa}52^rLe$6AoKXgRAa&mtt# zqlNNUu$Cp8u;v^XET{JYoP7-N7UEi~2F>by%ekS+vWdBW6v6X%&$0~em_{>#s1|8I z;fBvoxR?q7cY5&uae}@F#3WSX)^?X(V50XzrtGi3)xU9D@vESpFqXK>Ti0=X@fEa6 ztM&jCo#rS-R(Od&4RrhK`d@@by#0h{m^HuxP2qD+GE-?$U61YYfXyQG*HJzJETJon~hQ8Zjng`-71mF;`3$Fxq9MHn(PluS`Gs zWVHrgu(ySwn)am7)bfS<+|y^wYG-2rsYg`A&`6JXfh}nh;1Gtibt$m| z#{6(Dc>Hz}koU)o95r5vKGYcZXBEFLn#_AxtvH<#XXr41?O~IAzl*%6Qj@D0QAg*& zz}`uA6tskCq(*M3NrD{l#8lgxPQx7Fk#vcQh^?O@2|h6_N>^sE91ch_=Z!&j4~KtY z)wlz>3Bbr(7dzCJ1GgjxrZTva|9J$=tv7VRYm_EQLWugzsBVX&Gx*BIrPE7NFF8=; z`3$@xxu&r99L|b7WiwhQi=l*Jxh=?fe=>RaJRfN0&`tXv zx4=Kw{=t%G=SqS4cf-|zH%bhDnZ?t9*5n~06s99x zbXE<08@swfzZ2?GD1AF@(%|#ri=z!PcMS_b1U=AHI*WZ|&;2T!|MYFs&>K!b-mtOc zrvR0E*5Ta>;XYB8ra&!0pKq7KWunYfRw^#3>r9I>g-d(`a01P3J4Qw+7hRva()>AZM6d}Wj>>FnnRQL>zxlr zrbxqaJ{$qWv{Vqudjf0#dZlcn7<#deeh*J;;@anToF&H5O%9g6)LWF7Qaq)~g#T;i zTbaib7G`y20_CDPQuH@Gu3Np3PlD_BJ%d>wk4?XrU98pR!JR3;PtbTQp)5b1uD)^J ze-%1i+MnMeL-}#y7JF?dhvP#Hx{y&lpnSMtjB;&V>-eq!Ehk*BX*ZM9S2`5KBy2Ye zQ%(r&Ny9G#TwkWgbP4oIY<_&_Mh4u-@8%2*e*&*JAdpZ__;*#h zhkmS%FzL$1CpR@(oJR|X*kO&jqZyp@p?WL5RkYopfRq1{#1kQHd#Qbqi0lU2B7*6N zj{7De{NHG9;Tm-P-)Yn{O!%jIhn<-KCK(9WkujFgBI+>?_6942EultrkQ*08l~V#& zFB%rQ9e~3UK}*cO2I_5~U4+7?c+$~irXVm%ucf|o^LKYejRvfm+=H_}#cTKaS!#%& z2cZX|yX*r;1kPIZ#_GBKL59sf3d@AxA`0mANff8+gblgk7DgB^eZX9ipk`mwFQ1kH zU8DVN=%na&55Ms+HhI=Tx;5I(#ReHL6z#EA30;-Z9VrJfQz81(7p;mYX@nG?K?wDL zzXOWH6hy+QE6-`2&9u$z0)@+kCH@^{q29n~^c2=GZbPZPvv9VDv|xWFBFXwi4pyi= z!q5snc&#X?t7hy|xcLot0EH3I?%wR}h$6>cP3K6!Xfw*W7yGA>#2L)-1l%E01F5ji zgN}Tu$(U}ssJ7x8jY+yR-wRV>t>kFVoS|l|IX>rAfvsuTF2N;dKB06Z7u5)A9JyiL zjKbiPg|{uk4}JO9?;}JH1*%hmX*J5uk`-$%wWHGask}kI)l!&5`QnwR=<+<392s5e z*e(deFU2~E%W6c|=`STs>WR~#Hn;7lE0C4IW1AOe*HBC&fV|*p%CrPR6=9SWKo9`5DorOJ{p`Ien37O6WfB@{0fyu9Fk6~wHiSo)P zYaE7-k;#QNn~w93))BK@#8)KKIQf1wRg*bGEBW#Ge_7VG7hS-fSRrQP_+=3e+2sx? zW6%^1`2JaO6)#R67je5uueL&a%jx((+l)&ThEsV<`GI?oBgR{b?~u4)xRk|xFqE_F z{v*gCIrLgoQKeZnz4lpxy&P{9A9q;(Htn|yi6G{(d(_C4;0Bc*pq?fE^D@99Z@>%W z&mQ=7gR&keC;nFV5YGvT*A!uqpGV-8x1zeKL+^h2A+p)(?3<&H5!o{qC_g3|gfQe( z7VRhb#v=I=zzq{$+MD_VSO?apAtSnOi>X37(_6)_;Czg80_xk7+_P(=-wsvs~S+R(amX1;wnh4RnFttbqmjx3DW2aElx z+@~1q3bs<8Nk&JYo$gG8Z=_=s%sB_?VIW<98OIQzM55|F_jTz?w@rT||-{xGY-S)x$89K;lA%o;CO-C>2h zgMuP2LaA=hNHhK|N-(6GcJKfj7V!K!MWb5Oz$tUr4n>zUAlRv$xdKA*CaZ2i9v{0{ z$KGXkq*E{;L7ISSP)B4SZ`2gJUaQoyQE~nrU~%8#-rzTi&0W74A|~ zf5EXGuN;SAs=H^R&ev%}4*3BI^adLw(WfpN11xrn_J&K`QF)Bg&{uuE!3qwng>L5d zztlbY2Xeg?uDoGXP*-60K~y*DEihMEf&CMSdFRE0X*KmOa099|&hBc8fJc>DbG4TC zeZMMV#>C#$e_x}hJ*rZ(u>suX(U$y4j0>!SKR`tMBoN3+ah_hEL+I_>S&jOaSuRFU zkKqTD2K^uQWpN}b2u|Yd2Ot_#-;bjw;hp_7E~BdL0He|cz$>c#?NiMZLM8x(Y1;rE zWpCTi4o$$RQD7u{1`Iax(nDd)b?bgbR+xn#|BCpgy4y*Z$3j=rcnS72X(VgITec5v zl(c2b-a%BI#~J(Qp@wWu1Rgv)_(1MUE85D__#35BINsfHEyjCJBr%xOa`<~$32PCj z&T zNCbfuqnQA}VeQ0z?inazY6=$tC1&}jE3m&j3wMM+3M`eh2~QbXP6bN;^Cd( zd;ABb$;X-9pis`Q%V4MFqSgX>er2MN=u`;p3ta#VR__xnn>zYh3pfeX2C7ff{j94! zLc~oL$xRJgNwrY}t;11lXgLPL(}}QyE%`GksSfz3cngLJlZj{w=fyI?+ON+J-uBP@ zNWkX)0r&_iZj@7j7q60j8v@$sz;3n&!w}(va$J*#$c5vaxMJv-IUA?tjpffg)uml5&S8SUDc^_hqkca<$Xws3xDRN@ zZFFqBkgv@So{pcy-i(!J0i2_YS6(6RYW!PctK?xRxEq95=yi_H^8n=g$Nkx2o-i^I zhB0CtdOi&J z{CE=P?o$%)7$HP8G7PmMbO&M<6HA`{8^W^S{wGvvHRw0i$c*4QTMfvsTEY3LvEOr& z+NZgz`iilC8|MVPmHSy06@ZjkU`wuQ)8c&)pnsuna8--|qC#e$FEw9oE*?G}t{z-o zULPyhhmSWg%QkyC#>3uRUQN7d5(~@S4@hK!!3AV_;;U3rJ_jM(AHy;voI=GWuL@%De>vaU%x}?q z7x2emQsvy-nV&c1hH~#1t13O-&-nkNk=0O@c4;C40Q@&`M;aIe1pwmT`9F(Ldm{hm zG%_PgI}=MgbEp3gs?RXCwf%v_19xvh+@h7hD8iUEQ{m)!I3scs2m)CWZnfH2I@z0% zO)kF2Rc&vDUF-HWI7ee=$GioY+iGWJMWz0=LZoTWt7*>u=1QCyX+ zo3PA7!(*O3Zs$s@yLLkee!_J-A!Gh#Ab!HR7~wkDPLH7iHQX5!!}i>3V3~9(w-g@l zA|W@Hf)R6v?;h_awiMBsQ&(CXoKFcH=G5q%rW9e(5Qq&{=u(W$qQeeGO{#&K#8Uq( z7(kB?fC+z|;*%I2FujRTmwP|5M}47gYrn052R2!rb_`%wlMVZ7LI0x9r@ zC*xhc?t=k0T>JgjbXdH5K5Ex{p1*M|Ftht*Vt{nnC8!rY+<0gWG09Cgfb3pRDkeFa}IoXp_AXFs1y~7`;DRibl*ZypwDJWb5u~UEtyj4pZYRu6^3t92~O5{T40U z(Krm73U|C1R9EQRHf!A&wAf++)83`P0;$OM3TX4!YhGDS`%C^H%m|P8;VE!QtwHm~ z_V<1hDo=;a#$lasfbc*MmmGm32-xcYf93^BkulEV104b)VYx`?$cjvECI>)aaY)Gy zdpaLqASNk_wF1Ul9QJ^$Z(y&1`b*>Y_A0A&{`APy9F{ab?Cas6VlW{%nF?)*w7*ynx_3oHo%u`{+zhS$AhLA6R-9Ki|w>hNyySpa+( zUho35;a=>RqHVV+h=#+QL()f;h1CO28;*=ShXt`$W!rb3n#b998y?*Y=pV!Cm7LR} z-d!RpU*lA*_k&5-!bau$efOKfH{6ZhMOBg>BT%|jz+7Ihpr?(7v2Bh(mfW%K5Kh+= z8BAEXOHIV+Y#^jmgQ-m1T zlnXmF9EESA(C{PucAN;$_u7~ng7|h#t?`2Q&lkiltr42 zaGdV>gC{>T>GDa?eGwJ|JmXBc+VE&ebOwQG&lCLVzBEN32bxol`baQHyq_&7F9v~_ z35dYj(`M*t88laRP9}RpU#u1`$&sE9(`dI6HuRuvM|#Da2Ypn195PV!WZM4+zXFW! zM`GbYG}x}Tkj~1C=U}1FBc|c-Xje8V1Y+^H_{Z=TjbB5f$PZ+Xrz($#_SmqoD6H?y zudM=f!ezlwIBARPfF7po*muc9$+x!%^wKMBX9!W-1QRsqDVKF~FsZ@ST3|jR#fD2* znE95l)Djw?ZHW%k5hL?mXz@4sLwgc|W^Y|+qClr8Z*L1teAKCF%xxaW6Th{pMxzo>dM(Lm74K$8;1{B*_LG4Z_HM?-NEV92@E2JF;w_*gO=IxaDQh_CtE{skGdXbzv+87pcP{T10In668 z)_HXLiGV3YN1e%$=nm^U>-3gov`bM5OH+fG;om^xX7~Y!-^9EM@6zNML3pJIDL569 zl;R+e^H$;1ffO3{ZVBlapf;3XeaoT8Jfj1mFs0<^w6PLVJtCY-CaQteeIT%^NddrW zVQnQ{Xo{~-199#ro{$7CerKjr9*aqwewl2c3LYBtss(5yR0*6^k@$Go#4?2e?7Vdn zFK|ZKOJqD3D6f6rzbvY$cl6}MQSl>A&DN%3$xr1{nBy?D!MRo?4+b-4DHjwx6!L%j zP(1vVDbxjZvmVeq_Q$n{Je8YBhBpZjB(*8=Rjsm;o_Q}|4Q&&ZS;Y2!V!}q`nim@GH=MXGUUP6&^1jZTr><2y5-vw73iS)$5!@d4_@dI z{1>Z<15VucJ7J~}FXBTt{$Sm%woyp8pub~X8(1tW)MVPpmcvaXsWL|z47clQI;K|n zDZx&Vw>nB%g_hnNtPJTB_jaJ_V@+|s+&YFj&j03-f29lf6{GGRg7RC)eVmD2J*5(_ zL{wzA9ivSz`n2*GsUK=P`rZeHqME>E)MQ##AAv`aWv8#v$gdo*INKq?C~#{~6=nTZ9oa=;gXd5O3tmEUz|&t^w+tfKui};g{wZHClVzE8K*hlF^plq zmPN(Rqqt8=*uztXa9ABR-T6k@hK2xD?hwkBD$*HG3$a(etizdw2^{{(EdcWbr@*?i z^2uAfWR7s!3TxUVt0It;n?~~Lhxp3GyT77enAS}Mf8FbYeI=+~Ju#_GYg->Xq$5WDti^~U{edh5M z^~kcb1qPf+6BM?}=&jZRR=DmA+zH6v-+*l(;Sk)i?V zsz;I&&u%|0JMC!puz{Ddc!)=&=7FRN1(GCJ;gxaYct{}@FwQ^?Wm#2&-5!y)LxDCF zNR_Rjtwb?44KE6ZE4w0+_nA%B)!nhGcBpv5zA#z1%uNxlLtl{J^y!#6zYq-Qk!j@J zK@l!>te!t&MDayX2MfsT7j7ZL;Ci&Inh@ zaPMfDv#?ejZ`QJ_tv8c#qq@=8 zH-O%Xy#^eOw|_)v?Y0)4*Flo5n)xq01o%VZEB{;SR8s*$t;(eQxr}Qm=aXzy!>Dg_Yr{xH)ey@FtT4H{3cp)2tEkL3v# zi+c%Rj(-qZH;kGMNVbqu@0=%Cb!nFiC!>fpzSeA1_1ahYT6A)4B4}}bPXGxvyd(Ke zzC0d3f&j_)4QBrA((vaqB46jH|15Iwz!Z$D%280mi&w}C_ao~jV+UC-zu!#qDh@Wy z->uK7rZB>ilD4R=c$kk zMRay(*(uN4gL?{-I~y{6k4*8Prn8I=Ip)>Gi>?L+fL{eL-XNkKNx)q+z}frmQJXip zZKjq8Wt-~w{K7+$y6|siPhe(^rA3c27bfJ#S+#&5b8Kj9=%D`P?9W7ApCf=DX`uf7 zSlda3`V)cQf!t46H^!#Mu>!d!NLPYZ3-_8A7@gjml!nySAtul2yKojl^?o^*pb@=| zL_&90lb+k1SK~7Sk87C1Kn_%bGTl0*Hm%z9(RYbse{ln6wYlLO>4NqswLKSs!BYpb zb50Fzgt08hf};*0bZ1P6c?1H5IJS4^c{x&;yFw&0f%V47#vRj7u6?>V(&D*qr4`Py z`pv-NwMV@q0Z8-QjKT2~r7^4V=4|RU;pAMcLWPti*nd|to zWZi!=j*{kPee#oMEIYbKTGR+%*WKA9@F;fYUu?Y{n+NH=4Y9xxrn=@DkwAWChK62i zB!9w|p#0HDB6U&T_tTP+V0#E&y?GK}`qgwNH*+cAqvZ!o=s3^yb)F2~_(Ss>4`|e6 zN>FpA6?!J&cD_uP!(&e9wiw(gED21-hSQS9wM}GfXyAs_jt?Uf~0Kk6)m;bs0 z2gn8hK>2^KALx&vv9+POsnfsqr2o<#ITJ?e6Ib9JB25SgLGM)h7hK>Xg)R^1Zh_lp@+aXKIa#8GhmqjwG zNOG~n@}|gdgTL zvsLeim-~l9OzH4(qZr?&L^!pGt6J8w%XPZiIV)?u)d!>QpkMq2U^NnVM33GR?rfyq zDNHiQKgQ@o#g}S_n&H-%{xJG|&uH_Pl`rCL*z0oqq7feeC#-_ps=ptkKGaX~0oGkD z;4f1T&evrAQ4oS7ZE)2dy71U=umkQJ{eD{DuTnvsS{3SL9tbBy?>`I3yOaYh2z~yF zh|9O*yV(b7vuX83bI{JKkM@-x%-i2YaGl&mPHl_Q%V2SgLEZg3c6sMF;i=!Few+x0)k%Rp*|V-KvRJ z+&kAY7VdZ2FSQ=&VI9EVs>pWOpH9>+@E^b~^nc4mFZQ$S>GPfMxc9G>um7&x4=VyY z$0S5Y&~ABN=bK&PKoBw`#U%@VV1v|$_1pGW{6I$-{)xECnW8U!uYCXL+jsIu03@su z|8Sh(MOP&E4E_;3<(tRW2|RUMUzmqte>OBQ{82{;71@K5g>KINP3SKOfYF5Sw#8_nVycgnAP z-*4%jU)n=2_SdauiKKeSH>MxGUvA)Uc5m))NZ@axpZ_oFz&mW2{u?;?8s-TPDVxBS z{v-T!gQ8C*m;?5U1$_0GJxbP)XT5`W;~IyxKVQ3^4T`lH<1n|V-3?fMf**!)nx(m5 zX^x??Jx>oJMRn_bz=Ai3RN-kW!U@`s;!r@&FXNBH**kt|PA}@wC-PU42D3jOs*oSD z&@Xo|AFhxewoooielK+XZ1CJ}*c{!D9jFgmFdw>5E_^;c0SKdhdQ8A=l;K;N&>6na z*uQ6CbLs;)y;wr}(EmV>bL=E69YlVGZHOGUh^4J996lrI9oX(3g=oZX+xEz0*(+w%*2bKO2GIBF+Q6G0oP^7yE7OB#tkK!2F*!79 zfS-RTQtfqP&7xc+@jj{L~VMff%GUc_bOk(Og0u) z^XU6OT%mBQc(^Kf(5W7`!{nqGdeDWDOCOIbdD!La)Wm=MQJLMPvV(nWBTW>yp@Q_- zqOw!;*b?%nQu5G&oK-c%tK4tTd}z~J=j)`HrYjC&9A+&-cIg4j5v(h<3wmw7(*eJ; zOW;Fx$^q|be&^k*nY;yMPum5*`S|kv!+vBB?q>WWP>jEm1!2u>s4K6*j z$1sfh&fWiW3H*6m!(4wpS_}$N&pzOUeB?o{5x}Jp;C6Bga250(gm_gdd}VvL1+xZ@ z%9i?wi_n6bgNwii^4!hs2jR`V-wrBtgP3*-uO5Hd3dV7_13GI9KzwookmMf5x-Q+d zDXq3|NE4+&%dp&|xt9?>jf?0tbMamXat(T>7x)6`j4${J$R##+4X`ag2k4LI|1k1b zRRFTxiTfxc?DZdF3*e2T>o)k5&L2PcRnR>Yz!ze{_#b2q#Re1~=*P1WwUY=(yngn&NL6M72KRn58lk{2>YCCpB<{mEvA_Ecu=>&EUhI*)ib91rrA_pJ6hbHxJ09h( zhz4H*y21$3+vJ^$5XOk=UO5mCWpsPe01iKC$t;s97tQL@TXOkv=>y!}@`If@rN40c zZ1RB`qJg>E3*QhP*aob-ai*fbAMj4PBg`IIm%KqcU=H97S$5^{<8bP|IKkBs%_Kk6 zEqk966yBN2`zRFy_MUw(_`jc7Fb@?%X~ZLaLjf!&a&TP+B=XsH{@basHz^!~k}ry* zmtgv=@s__Y1GQPZ;wk}X%Qf^~258kfg>2m|V-JoYGJw_jW(MRj77^0sX z#vy(1sVFf_ogT<6vce5H!O>G2Sx#MZ%iH1|59GbP&{z_}Z&9@>Oz@+;&{WjE2jo%2 zZQ8&ilfORDZRtKI@GLdqv2@C>>RlJs7rpY&YTu*QT`$f~ZP4j+{0nNK)=#uXnqRT| zauwUF6@b-P- zq%6njFt$Ketun)2WT~qKM<;Jm`p3?FX>2dx;K>e!qj^4Un}dkaG z$<~#`@_3FjKuxq+lqy}rjz<3^*K=f6wOT`1NjIar?F1SXPv<+PjtR!nw`hoAt5%KI z0G;egMJ)SL+X1 zi}10ftd`HCi=&##+WCUzPa`Y9B+;7V_05{%?k=T)j@L1esF}3U{_aWw?R%aIko4>p z1i8f|z`3w)8_&o{+oIGk#9IgSt5gcVP9O13kipr;a`34S3v%-U?Lda1TznYeImPT~tq&8R_oBp!<;lb; zlq-4V)0XDVn1hRqUKRkrG2@}fn6f@wLkKDpqfKPaQp%4;i)qrzmw-^5<(z52h-Ib= zt{`Oz$OH0iKtp3rWlO$+QA{6SD9IpN;~`?>SAqTu3}xBfvC1xBvK7VlDq*8OC(B

9rjXF9D4 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%0D~tHMeKrYS6ffB)g{z1; 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

Q2q!tZ&jqtVA(Gpb9&}KcocoD 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%0AQpw^*<6d1wwTdw^ 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≦HsWU72$4W1%fWE-TIMOz&>_Zo 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 Fep6~ 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 ZquW`UJmRs~K6@R92JMkaoC5_i8J3Dr7z2 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

Z{RO9bZ8|U$#`6J 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%0D!8A>|xHUeF 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%0ASnmb2r1mwIEry36QkOfD$;g5eitX2ZFp7 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

  • U+mh5~ufm-G1S@xX_H63QPFm8b0H!!$xob8%3ahv`N#;}Z*&C+505;}b49-{c;SqHhQ+UJ%!2JBGKw zoeQ^M%D_ZxbA3+HLoTgt(_$^FPxy3K*<^hW4w@T;0N?yOkLoIb`GI?p0VTKjiBc|a z^sqkT6CRc4*EwOvXEL38HSYw3(@*fQtLegzR3v5ao9c~dzQz7hxbz9S(J$i#ZsDhl z5+*B&w&fvaIiA}x@MLwl)1~ycj1p$80BHR5g-~fu3RfO!MhaM~cXZKVGPua-W8*2t z0aI#a4PM=`Z<_Hw3@ ze&0%y)`Cy%uwwFP>S!e2$yd;)^qt*z;8JI zX(5!yH+!)g1@IYQlZK?Z(&SZL$bAz22XM$_m`mdLXUzEz#_&G_4uz{gKnDNssO$f2 z%rQ1{`R|Cse{trN@jK5;dw2m7vHF1!f@iBYEG1DB!RorQv{t07*j?h9&*%Y;Jd~udny?_)fC6 zu|Di%bFw<@bW`){*xK1e4fOpHbQ*nSB#ay;h?V|H0w@4!`15YN+qThVc9(72HoI)2i@U5_&$;8`$NS#z zjB~!+V`t>A9hr0Pj94pTuC=JhN-q}N069OF6gY}-Pupt}v+QL#7F_)Dtx7*OF5g?` z97OWnI_S2<8Ow#=TqQb0V$R}Tll-(h?o+UAOy%B8s-zrN(`#gMJO3HW zdfA5ywxvF5MZbHE%}ll_Sbm|aJ&PR%Xlk3(yS|^VhK{ge?EIFd)C?wn8eNc5A3fh| zjc2Pvd;hc1Rf?<0V)I=P!p6+*W@Bvqp(Kj)!cgXsa&fvU*-gk6_TrBYaZAL5ur036 z#4Axt?!yH>5>H>6&}9Eis&(K6uy!{R zcW8CcobrG(Q_`hk3kKusYS}g-K%SquU`&Nb+K~ClYt(^mSfPJJPF3A;LfHjR9ieh( zW&-ELBR(@Pe?Z~yg|;*{60;tM{-d3+MBOzipE2PfYSJnT$-VTAQC z9ud1V-aVtDOfhE&17J4DPyv`9ouRrT&8Pq{X<>8owmC<6Bk@MDXE#1SvJI1Od~!sL zqK|;jhvh9XH{kORhoaMbHsYAs0kpSHU6a zKo{ujP?U6F367dJ0=bc7FDe-O5Ir(mk9xHL@#aiXcT!V7O1D5!mnwF)m$T34Khos6 zRz!l<*P7P?KQDU5OSyA(f*8w}z5)iWOx}V9u#I89r|X*FRTg6RVk957P6*>!6l48K zeMr|`0_)GCVo(N+xf8|RGcb1}@N=Yx!PH^QJ zm7=bn-O$SJW7L<^OB4=9t-|N>kLn-3mS?T?8$_-_s2#c8_`;an`5tvVM6N$kx%;-E z^J8-7axe9eq(!78JPGVOOIP(Sw-hJRl`C+wO|Olv!&YUAw0Xz2A?q1H?F|rIcV@33 zIvC1Qbl?_Us>ZI zGGCYaqIkmyH7Be7&X&udNZ;^AbnGAP703tWNdAcbq1^XM|3(lBr$JBj@pcJ`q~g91 zFh&rZNL}<5`GI9@UJgbjW#8+aVY*8>75si&_Xp_hTR;KSIST!e^8q59&XsS_U?60v zUlAp-S_>S|ALNzt0b!^=?l05)&hv;Bim`T04d8qO4Sj47IIj(!`@M>at{^gTl(KKP)m!&n*#jnGz+i1B@R*+x;PHqE_18oA>sv=LmwKu7 z=wMl2xf&2z`ql6ybh#{S$LB#Bn~&rnM~-0JgzLmBS7LBsM;9pQG>5+zx#~8>nPfT+}06g%-!!M zG&QZNLH~Pe*PG}O{$>N#o;u|LL%tYMSD>f|*&kBTc+Ug7O(@bQx%XOd!r4(ov4caT z$AS16eK#EVQ{9%!Q@`AVOFZ&R?Xb2aLqsvA{~E_J0wk2ucupA+w7 zr=&#Ew+gZqxNMVRP_Y~lvK3j`0g`@4UY7tE!7jvu^CpKf=$OJW8~6eNJKT~0`U*VJ zTQKuLX;&Yr{Q8iq2WoRZ@gP^)dNhy+V|NF={!cvUlW|}#>}hZIDIp?)UD8wEHT0_w zwLNTGHIfICe=C==8%bL-(Ul*+6d(2`wc!27jSo%Rq9FT~ddutC?hMcvqTm%FS%pQg z2=0-H@YP0te({~rGauw;yWlnHjSoQ^{>{5m-zS#P6w z2h)%*j4{6)la-@owJ(G*zYJ4)pbz$tFM_`T0zGKEFM+=SFg@(7LEw&)qh+rzvOhLw zlTi;?FRJCrz%^MLb>6KRF+HL^=Frx`DZ2$;@aonsj3TOm)4E;Oy7fr;JV_f$k-u7= z8#O1WrJr0RZ3qkT)dl}+*7D)%f{JcKoGby`2b0M1>^Webj5SiNw}FRxYsHCsix@QDO z55eva7=Oe-A4)|}(ZF6*JnbL782eWsPxg^MODm;y90k>PxP+yvl=J#8)yWKx9i7BG zJHV|8$jgXMeAnUWtrd{K5&(J{{7_^$!{X%={kW5m*UR_ileNlXfIpflXli4C zFFvtF1B%0KIB`yCC8d zJ43%%4ezhN_1GmK%@7X;))^52H9K*Vb|`RFGFDXnl(d?@0Z^979G-uB?pWgwx%%q(uFqj9A?jyZB`X)@&*P$Z{7nI>;w{RLFR&*D=?g(<;%AHgkL)|mfrC%b zt6sDfDK-n05qJN1<4*DkCk)V170BSBwvPGEDI^i-<;aoyCQsNGWjk0a2v#8 zZGI^_0!Aj&?8uKm5hKs$j&x|fQ>Y1SOX9a7zdWnL5TXsPqDE7H%109pEUb2ah&Ke# zun32qTqAzeFTk!3AQ`=$va$GKQ5E%2r5eM-D6aLtRcpQBU>MGUXavFQcLv4LM z*F@PvTtn9BuW{orNAvrR-xdc{BE~gf!N+Rq6z-_zE;{ zqO*>vmo+YlAI5AhX7U{=rcn3L!TXgAXL3GPOW7N=9P-;3ewQOl?v1g=i>ZYcxQ1(S zz?jFlu>7yO^8~95Ec_{9qf;R|3#$)T^~{f}KNeLOBEJ~{cT4hcxm_+z%N4Y zX_G$D5REvnZFr+VtJYN6!^%^zBWzVxY&RJZJ;*M4Q%^P_2r*Lddhy{A;SsmojE!YY9 z-G@e;x0g6l8rrwkr0{`8Srp9|jl2qPa{BM^^|LtA1dmBqwf%P4tmL$%ZK7Mh|Hll) z%~r57-FE(MIu=}VmcF*Gx_(>XhgTyHYPOb^HG1`TGhrffb_TY!;c>mNuX+Kt9=Y`x z*+1Wl>S5lw0oP@tjNu4F&8xDxYmO4pv*)8qMh8yTF??w&Res+?u`omf;^56}N^q zaW{v%z}rC1{((@VV>8cPPQ8(*w9&L=Q>Sz=+x+2{uVO7L_|#N*>}qN~O0gZUDs%gn zM}m#!St!mkIa8`&(;=+XVxLSAR!`YJgCIu_){_W?X#p#7Psr}A3_=gxr=(u~Cm{d_ zzmhhY3;Nc{PoS8*IgJ1J5Vv7_Q4@aN6fUfdZJ+s{*ufi0sp4kkIbCd*o+2IiXV!E& z%?C6#dKL(8v0k{hF)K-27AvI(Qe293q>Ks|JSI0>re@f6Lw0l5{^VocH9uIjl99QD z>@uX}AHXzfI-yQ*%V#wmdJk1s9Ygr=kj6f!vK!f~DlyQFP6nHt)=W+ksFebN09LsA z*U!~$vI?y}YxD90hF{d)=2&H74MX*l46X7@UxpLe_K_k+K^m)%>*!=KKweVj`0;RYw zQC@}cJR%?Jd^V>e!f#@@yx0lus*HboB2y*Tm$CBnO;yHICczIRZ3{|#xdcE9*pe5k z$tF)^X_?Bi&)AplIv-wSp+{oh&CVbwZ4C_=y^&nZMm7>NW%D!4u;=bdlzyNIx+MHr z+X`t+afd+pfrKuKf(7bxow<65bsoR5-iqpmZFzE%fp!;k?1VV%AXHp4wv+!rKfl%y28lE7t>#YT-OWIt&wr5jMI#^wn|#?q>9;6X&G`q1;|G$e;#wo08|*2XSmd4DT3xh~>4sWQv{ zq0UBj%Jl@t1aG6RjO?CbsOfkmtO zG3p@>Y)y~x05f9Z$*e^j*{^2iC2)f>_7m20nDD6Kfh4jhQ(hT(hDcL_TQ{mx&gbCt zqpD!}@Q5Xs6Sw9Tm!j9c0D8e|VXQfwae3m@A*s_j7Okj#1OZt`*5FBq&WZA2i z49z?Q=(d3=o&3qUOnlV{^EEZT<-yko*melX^26o^`8a%FV~z-M$zaE?6n88?SonXp zyQ*^>gTousm+2i0@p^E>|u~R#QEvnp3t9iXibDyk}rSGNU zfOm&qA!C;D1;aFn7r$7<2(Mi7U$b^)6XlAoIy@}kGz)wMh4D8U2Y0&c_hECuL+>S+ zbL2D6qdrnILXVRK1C#Sf3vP9Xevi(m>2 z_TYZ;g{EWt3ORk9FL)JyiGg-6P>Hzc6eXP|<1c`8yYFpCI!Z^tmW*Y{+zE92?+@1K zMdcb-Dlc_y(n^xVHm+lBss<%IU@lGQgrR{5A07OJByNhmnlfc6e4ipXFPNIpd5HX0 zFys{4avibzI41s-5PSXNGHmQY>-;|1pJ6klWr%BcZ4&fb+(j~J?W8QCv1bR3$(ir6 zR_aVc*Gg!XZ8(`aUQg>~RGL`k=(+rbwhTh#W6|AMO9ad_e{;;#bjIeI8@Nc2GyhE6 zhMV=nS~N32T?1J>%{jVri5n^~TYCSFQbQBzO%E>v)6X|-&;#j(RT(h>1}$D~2ZbDp z&#*LF3)!K9_s_6p!#Hs@N%&c+#Z%wKD}bM8f3{>RoPlwrhL*pW@VT8~!rebcQK={3 z%DR}UsVAp0j${PIYVrokv_t430p*2+AX*-D0Gug_&c8wajOcu28k7iRvumZrs9+*p z!fh7XUZ3FDa|rP`_-FlqBc&3--k7a|`%BUdg)pJr+EA8WNNrPFrm5!=LE3k3m~^at#;@#CrYoNg+v+-Xel z19hJ2WLT8}en^N7X^vp=u@#!=jr0C4!ULy@D;?q6K(XZe6{AWx!6=J7z?HepGLv}l z7ecy+SL{!qYW5kDzq+ECt9q1-+@=o0-ciqgk1x=8Jt`G@XR*`a70{cOZBNZS7Rg~Q zIH0N+8mVE>-hFrSc737{uZd@xcmp1T#IqAo0!+!14V|f}&|zOTeN(k84Uo16p@dZw zQd6r2%7QlJMIl51wDv_QQdxKs`Xyp&}$F75q*8Bjs_l~lnOKfGjo zV7zF|GL@P2mrJGbmcsOT`m`IIFDn<4PMKPrPN1_>J&MR+zS(yLFoNgJeK8#V$3nZlz+WoO>=i zv{;NL%?d>SJ>D6CT6LU|iq!HWuT7N-kpPEy(^sgNyN%tdK=Fgg5?R8-jVhrUK`V8% zI`#d1m0*LhHW+QmF~4E{#z8Uz^pl>3)<6 zn?p|(^Vv#;;g-z*tdtdVP?G0hU z-BqkgtT)ffYtmdD-L}ig<_tQFC=1+KomAPs9cd!GXjGFZ@KE}6$0rw3k}i@f?m$oH zapofC-W=VaE9brlgNsaHVCkVqg(>gVDptq426n5#*Xta05-ZTE5zqGqcGFd*Q-3HD zH|-m~Vqf7BrE6Q(blr|391j-QUh$c}otkTzQ*3 z-9la3x7)^pps_a5w7Zd*`x3@1B5L*O!U;|L#DAM!K_4HJg%LL&cD$=bqdkMWK0%nXPwf5PiF)pJw0qV~mz`!fq9v&Dp$R?rM%OsA-?$(H{> z{ebEwEW~V+1=JOIXVbjo=qj;QHiv!YMbkmn$|8)ap2VnO=uP_$swSKd|FS}Z`RuSt zLnIKG#j(0ScI-Ir0>d=yQzNp;j(5D`o$kSrl0Tv>bwn_nbkZ7a?VWn5!&F2U59lZ}0!kaFc}~POLjJgu$E1GcZmj?j`0eJp7>qmj2Nou=LDOcD zcJ|GH_(s(m__f{RSt?ZRbCXv-gU~O_Yx(xY{=F)3@A%h>(L#`bkAY4gVIP={fdrao z+w}Ujx$+SnV8*QHjhwZ&@hhDyHIMVI-Gdy`_VX^sW=1r?{x}7>2)_PJyBxQLls~R` zc$G2wyY3Z`FZ{9x+DSUhNEY~MxuAp<634L!U5^#ICiL+`+{!L-nM4^)&Opcdn7Q)bY?JISljXI_;Ah8s&g4_OHxHnqE zVmHH70h3_3l4e{@yf}!LI&1{r-txyyVdsN7|0NCGEWi3&li3OHXjo@_i z!<2l%S&qd?rRCd0ygZ_udP5r((50}N#XDq8(w$^%JGP1hd*`eIHo5+>Je(f+jr~+M zp8ODqVkk${O?Naa_+=RPs$KMmV*Z#GI{XrZ(HNGyxV;kBPUj@-_cFtGF`y5GXm;D* zs&)qEh=_S#%27VUX7!WEQn9Hnt(y(DimXf60Uv={(dBs~bO>2~zIr9w2lHy>@=0(O zv2)Gf_U$Sv(R7e|kxgR_Jyc>~9XDk8xpll&lu>mad|wRJfx35?U|+0NI>E{UAU^5C zggcUF_XgEnb@4vrBa}SH{>mi)SFe4C5@6P;_24#$5FZ zM1jw9>hcqMc=o@UtQ{U!p@b!BT1^DO27Si+W)%4xR!EkfYnL7iv+=s@*P7uE<({N` zDZ0;^5@^?Z#jyAnP%Y8U`Y4;NMd|XfGjsA{a|X5BGD~t>Mz|** zUp85F0wYaz*rLR^IGG)#k!oU}&GSI7{wfR11IGL(a_BV z)}qS$B6Ph5E^y>* z(D2Q^E!~walhD|z`O?~bW@IPs-BVt~^zHEqYp$~8kVl;wrK6}A$nW~R3;Dv}2soaF zhU@~>##5S=WgYI&2e*Cr9ME&;R9S1WE_6*F`j;$Sl#UT9ezoCUgItd*Wjr}1dv7!?eOu>` z@(QU5oYzx4M=UWlX*aW0oWMKzUqCotyPfoR-xr~l<|)-tp(WAIXn7*xUx*y(s@ZrX zrq#+n8YpUW%0yd4!UN(bEud^3rKM2QCnb5ZB%-7ng@1S|+?VA&@G%&Z5Wu#54I}Cd zI-%{mjIr3=B^+0PQg6}Zc$+4vd#PCfOiyuMUm`vCb(e6}W;B1m_u1?>Q$J+`fmH@w z-So-mp9O^%tFH$X$G9Ij&L`(V~HF|HQaHD{?6uE%3neW)MeA zu+!EfU}sJicWOD*UIm?zGD0ZO#6GbiFd59OggmmgRf>B-8UE9D^Xl>&qpQ*+MCX>b zuv3JzODeBTYSurwkKa{7;_$Q%kHCqnpk~aW7`r*88Q`4fvMw()T&is#RPPWxx1J|CLIh*Zp#*)jh0=4nU)>V=|Oq8Y86img2qpt4s?rN zNs*TyT9N2&##sGEz%Jps7bg&a>^WlGEe{ziw|6Oq+{I#7!Dv2X1EHzzdsv zI<~I(>Xm-7hIkx{YO*Nd0M&`?FS1ubo5YDDfd*~))BTre7>HVhWUw{x~k1+ z^UX295=e{H;k2FA5{b8K)l9>F!ptOeIbDWT1`)qG2NDs(npSDVrNQD|1n*TcTe~gb z9N9`;mhslW6v88Hf}K=p98W<+KBod#G$#H0J$Zb*Rf*?B+G?u4#j1}Jn0Df)Lf{UH zWNo-^@CSz_-lTAGx4@&-uq#OE1spbhjQ+1c-4lWMAiLgOF^8b*}bhTuA!U0~3*{57IY}WN# zCF58GIm|~{hpZX2yS%WNgH8b6cJ9dYnE+8o7OIdD<_f3PPcqcw3F7H?zqA+o70J0tGpbS&Yj5;jZjESmUE~? zi-a1<(%I-LCe^g;K)A&#!Mg@K5>fDNk4zm+Ls7OjI{h3ZdV~{(d9Uc_Q!ZuLOy;uS(Ld}ySEPjwC z){=CyvVB?5z+l(}+*2CfD~An6sZDKf3uU4jhID||M!llRhxx#_rYn){7PZSB+Ol?m z&M&?}#g8vcziy-SR9+9}ox_A!A0L(zlNwkeS$E$pF;tcqEoh;0DB@O~zW=W57_>Q! z6C=z~mLeG6Db-K{AcH0<^rTHkA8HMLL$iEn5asW)duRYnAh&Sq)&nT(rsMyaOP9es zi`;P%O>+v_wmHcWpdnPnY^_Tdi?eb=Ks*04B5sA|yz_fmPOoc1jZZyHiFPuA28ud@ z2YqK!N3aP)->c0)Po!rn`32JwRNmJwIctJ7n~RH zD0qAcP;L1SVrn+=RB|$g8HvI4L^5)v!ZreBgsXaxS{fsKDDe-lbk&!NTthsY@n5{z zMG4_E3+-E$Fz@C{K{9A)FuK8t)Hm58Xl;m+mM{mh;XIGw@ql8vum&+qRQO#dh|C#RERqI&W2(@>| z#njzXSG@k{ANecf-V}OAbfWy?{}YolYj^v&@#wH{mu=k{25>FWaD*1wtbRXMbX7=d z!=k451ir_IRxz!L)!g7)7M!?{rgGcOi}pg9-=a&T{Y>BS(PO*|X|gU$%A->97VQYT zhR&!qC@H>Ec1?P+U=!mZZp&Hl=F&q0}dnsc4VRmTiTx#ET4u~7TjM{5zg#2+@It?ZG*cm2y*?G}i+-ZN54V(?Gp|5fwQ1laSeCCb z)^Gf>91+@uCC#Wdt1Sl*upN&%NnJr0$~4Ep*S|p zNMFXK(Z;c;1BZHAkr)wN!pk}JqAGMe!*@+BMO!Uso`{$Hm1*y@<|W#(nDe1EqZOQDm<-yZbErJ^6fjDfL%BmX}O&62DV>h};|GdzpZfV>Rx0fOz`zb5@ zltSZPZ*)zPrHknhyKdyhzz!DRM54GqZm!as{D4dSB-s4msc0Jggd)3hblN*Y7_ALG z*ybH+dMNzA7op#{2JiBh1<@+Yjb(J?1}F_c43Jg}hldbX=fYSGmT16v^rvJPmu~64 z%d!b8na)PoaXPglunQ!}Le#rs1g;MJNnDSToU(3Q$-LyaFIbB-z?glAJdJLAHg1@3 ze0LrjCjj;U*Kh)+^a0bXWHOjZIhicsw`=B{bXgPT$92BHG@k0lNv0or38#ZF*puNw zKqpRSP8pm!hTWf*oSC7g%-21JCT@m-mFn!OF#ClxbQ6rdgBI;#iA3!Md!{2aNggz2 z!}(TmlqA@MlVN}@N|p1s7}&Bf$0&8WRIrSBVTTkhd+0iPLc4Jb^w8+Dvf@FFe8GDg zSQS-(uuaY4dt2tO2J#AIXvJ0f_^Z5@*KLXl5bzgNO_S<(%eX!#!b^|(XIzW|R3Zlf z+lYnG@({ZmF4G2Ob>PH2qT1rmNU*_kwXapE)e75s=_XF)CcXL#mJF=E=TR5yUw?$T z^O>0jUVL5TWjZ&TU&80z&eX+3PK9zx^qiHxF^4`v+C+@Cg(&YA&LUaLs9*&U{)5BM z#y^hV&h3ZkNDtGbpSVr?=z!&Wu)$s2zN@Xpg-qBO*4SNZ*O4Yvp#stUG5TKV*7 z7H&OrwHfS}BrVpPtdg)Ws^QkM=RYuP=;h2Qf@PhI906vULaE5oCrfh^P-4yNG~;`i zn`-o1U+v-=hHCufyS5yAYIgm_B{h_5pz&)lU~vXZ%C7R4aQ2a6blein>)m3t#`5cC zU#XK7I@=Fw_tbB&@0EEV396+nx#^x&e^4YgEDt2;z_l=1&?@X&*rXvp%H zK?9I2=yw-*P9UlzF&J+bX@AjI8o#r{)}=e@k#dv+q1lP7)L@poS4L?>ApV-v96J%e zJTtDAqd-b5HK?GtNZcFsstl_$SLjG`6|YIw@1UENw`d3(CyCWmSya#VG$9<*JEgSy zE2H)qIW&*H5hJesXBY<-fTjVF zKryQ@&)t|HnDW6SkRI6_GwG>DUs=1q0dom0)E2oz{JEcYCoZlLz?WaPZjXM>n$Gs( z&5Z7vT62S$sq-3NSnGTwe;aGf!H;#XJkxL<6K9>HjqQPn`jL8hs*gUK>tD2HT^ae6 zFri0`$syhSNcHnr1d@r+GX=4JPKdt)ziOTQOu?y`+LTONfO^l;kV>rB96jo4*m+?K zjb@rgSR6Mx^1-aXDgpfWk2|8NIK7z&(xW$a{oTHg$vc0jOit+KN2_nK&Zg|mNs-p* z?~7@O&m3ml7nkIYtnDE%zq~F3HVpw|j-d)l?H=vLy98!9mFFxC+UjfS}+_Y9hLBRpxPPn9wN;Mg}2WnFwk~SB2Odu>HZ=AfX zy#CwhVl$Y-z!UZKIGp?>-E9z8;c4B&o;uxaG20PG8K-TIf2u3>&r&y#Yl*iZ<(ksT zYH4#95CB2+M9O6jyc@a|IoV>LIjA)j|8XHmacCQLYs-`Y+Q-8un`ejnr$TF&A*&P~ z=g;^QYOkULd%lgFW?2Uuzl0JG%2>ulMmR}1f6TP}N&0S%qm?f3QB}Ir_9Xvuy2i)ww0n=kFY@UNUsZQJUeX zL{|$65plIJ!53*=@4^07vA3^xH%orp!Qbf)hmLl!79A#!WBpBjPNZS$wveHg^GRvN zM!`FbsdNW5HTZv0JOWBK|HeF#<+N^e9>B_|En?}i!R(KC{?XSh;So2=`QT8e zoH8zpiA}F(R+T1uys&25FVB=__*r<0FD?$_ojs2$bd6hRo`*ZV zjaT9K)Il`qx04IUC@-|Sh};sCf|utos+hcSqF|y9QWqP8e1jr;PSl6*{bx+>X9I_R zxRsV|2AMvYAtT%clum-OKaLE?Jpwc~8e@CtuONNwZmkKl{1!}XL#%Y8OI~l-({7YS z9j;VVqffIgn1i&NwnkSLncLd_=OfB>NORh(zPbFqlQjbaMtX@1@n4p@L7A5#4g%g9 z1s>?$8igM4-YW%9-hdj3YjJ?R@U=N$J8+xswEL&_pt_%?kJl+?tH}TlV}9oA`}hlp zYL63S(7H9;#Jhc{w}3aH(6z~_A58ab-jf!9KVchl?hVGv;2*gya{2+r2iyIdL>QkKOJFe4ApZ%~5V)2$Jcme_FM{dV}h1#WdR>c)E-HHO_#jaTaGoq{ZwbLpsXTQVF zHs*OSyYJ^VgzixRGZI7W3;L`srJtmA=eanE<8R;IXZ zIB&q34JzL&#yy@lAm~7&pfz$^pKMtbdl3G0>c(cS6R-Ot#h$ij(a_pnR|@`uX(&%! zKca4>Kw`(b8=?DRzB5SkArKefwUiwhKe`Xf?J!WpQ7B=s-j!O%Cpey-0(?c^XtAIB(p9JuBah1Di;Wj0yuRg zK3kWClU;$78{^10EZO6y} z0GoZHhyv;dLo>(lvk zg3qY!-Z>teR3lh_8us6yogNiqaIc#n)p{-Fjt3RGGiPBSvFqq>MqC^ujut-TZOm77 zMSVCj&82BYDCJ~rGwjdc-!W!zWE;EXn7`Iha>rXb*d+-in~ZE5IM$?Y0TN6|HK0_{ zQuBoT)l#ub)#Vq}xRMA&2rth(AfG@V@Z=lcRhLRg_{MlrUC*8L)3U(JGh=?F@gLvw|t8yn-qKW``QaDN0v{vNi=%7Q- zHN5G7sz$%{fD>e4CQCa9Mga^acD+pj&yPJ_|295YRv2Z2vmYtqTYUNaMdB z=w@JGWpCwbVDN9tIsBUdx5<;EBV!?$w{!)SQN7vM$@5km;*HqJc0YKH{W2vjb_#-KHstd4R^gdL8_K`D1_7Oah z6#LF=!Y2ayu|Jihx)nThcsT@6%^N6sE?C-6dOpmVTIxdic=pT_BEP-$22X9}v~|8$ zk#7{0#- zj%EyMs_;ON|0FpU(U~*;r*-p$1p)?p00sgAL;LRLUo-bl|HA+EzW+C4j$Z$}|9_Kc z8T3EU_@_URe@@@WzehvlzjH^9UM5B+mSzS9{|6GEp1gk#$v?O9|1%vX|5ZAIz=42d z|C0}IV&?2>Wp2e_VDNvQ*u=s4--n0R|7#TNR446mIncLCTVbOlmb za*9o2Af$pIO*KDhBnzhvd5eB5(e7yL6t#AwX=F=MBPViB^Vlu+TAq~dL-a@@)#X>Fhvu4aA z51*RCdb{Gx6e!tYBpAnHQJ*WKVBC#l)I~1q&nw+iS1?C=UU)|SeB(Mgtoy5OTc`x- z4Uh5W-l|_qd5L3lgJ5$L0MJuDws)h0&>F`|glLKBj zQ!hVKY0$+>i>u&jV+qK5dDh+ER>Ku&G`A_!W?)(B-G*V)a6boDEwPKbq}_qcMt^=l zV}ZIdB%Wg_JYZ8tLc?*DVxGcbGQv`Wceb=hpE17#mJ_a<_qYU{^dA`YcmzDpjX-W5 z5{R1c^{~8eL#$Kj%)0bVtNrQ~ssMNDZpSlMVAbHR6s2y=EF03S0QILlSVrV#K~=&( z_0ytClNs$xUn2S-*KcKG2G|0Vr3$) z0L@JfUkc#^dTI8YVHga<-s!UW&fX<$VndtGuC6;7Mw35Wsmu&yOj?to+EGNPgw6eA z!!7XSisKtDFH~DQt}vYrNcoiv3qV88%Nz*6Fw6t6FRUcoD5uWmF-owk`GqXA-OMBY zNOjTo>PqVX{ToqnBDvu@Qmv%pACF%0ELiHiBFW|Zn~N7Y!yau|>jaF$PFBk<_3LXrs$N>e>H&uNl0;oA-!!c)={QiH~O+Wwj$gh_mBt6846_(tTOMM%`{??Hcoy62%Yo?+ghTil->5 z{f#J2@J}L=GpXdrCMhxZgy?0C`1;_`9NfRfkMyRsAx#VPeC$!4Jmr%eB}d@Z^j2;< zro>0b4n$SJ>rP-$qd-1Zxy(4bplc6Fnm6}j1iHSA)on(}3)U9446U-~-6sBu9Ui$> z)rN)VtG+iO^E%q8Q`8KzCust$-LA1R7t8WYfvdZ~r@l}x%ceti?3DyKg?Y{*&*Uo3pL0l`#v0o2!*AgOi(?n;HH8Wed47;F$ai zTg*;z`Wtwpo)c<_#|3a`?XI>u4Fy^%A0&lh)?_or>7rcm;ZhE%&Ze>;!RJrthoDht zZg+&vsMQ!{_d|jv1iPngeZ@fYxVaSvX-e6r_xkAYNaR$K?4#G0YJMt73rL1cpbnV% zz$2z8I1ugZ4)E2%MQr_X+)p%kiz#oZ8a+LM)1=0xDWhsZR6jIUxmgNsTXWuKFM@SY z-tC=j>SFGd=)R~Qm_0POZeG_XUJ!JwhgKC}x!pnL{rBUM^cbA>UsAZTmdzSA14Mv0 znNX1cSr1g!eKd*RQP$I&>mpr`i=iLAsIIsm-YV$*Bi{XMudVh6@OTTG|B*UF9`y0| z`!@yu0R69rylWgFAi@6%1uibOuFgjGE{+b)uKx)prnT%G4%(1EuMGNM9W^^o7R_2C z3OK8R>>p8d=Kv^V+Yok2P))KMm(oQt%I=#5U)?Ms(iC*mxPZat&&1~8%!vEXg4AVs z-0zHaQeV^O`;Cr&8Fb>sZ3=1A%=X)ncqp42e&lT9e)#(SXemJXol@=btXPHfiqF7* zA7@!!?Mo0xKUT>!fx{vr$Te=VBOda zS308#6Ki<3h{iRn%f)o;lZwVJKApoO*-E<9rgi?qmD=cc{Mi5C>>PtT?Y3ny5Kbmf_&fQYP*?ee@FXsA^H65h@w$-_DQjZ_;x!qM;zW z&T$*(Y(|zI&i$c(KaZ4&6iN7Y2^f*1*-;tMpITYf_9*eD=bjRWIi~Wd>O;scKsQgC zba@gUc{O6Ms}*Qx$nA5fgVwudr$1L$P(1?S506>#N&AC1>;`?4Abq8ni%=_hvLjpjEk3d*YW(VxH7 zHzin$n|^~6PYAIY`LebR{EC-tO!(EPI-8&kFB0WHmlCw&CIPZ4G{w;>PiJvPg zYKUC6FCT*U^4Ku-f3}!@>kh`NRI-0mfl4UHWi=HK%>_j*oUJKi`JUY7%}nt>2M^1f z>4d@(=3KS0q56~PiISgGEjut&Gpv08>qJ5epO#K4Z9AH@<@-D}6=baWE}xw0?<`T-a?QSms_X>F zEuVIvDZclIy<@RY`^UWz>~k)6&sGg>xsJM**9fsr^I=rT zAQE8VtFo8Lv|+W!6oNn`4aSUIG122H=5M5xgd~{9k*Ro~&?8g&M>;Z8uOz^Q`)p7^ zXPIXVSsn#xv1;0|?HeU1SXDAu7l|PyY(J5Gl`iOLew?gaXB_(E?7(;Riw{Vs2BhcaFGwJue(-2 z989+cg%l?<8>@H$u)`N3s}>FrMtnA1wmmvyr*qo*02Sq!vvkR*98ktsmgLJx5t4e$ctih-&|h5 z`z1ls*fSdV-zKzbz|-EVqyU3U-Jm%o)S9v>N?vQA;r!SL`S*&PJ)u6FR92?vQ@4?q zu%VSh-L_ZfB-8oJW&`5M%W)5_kz_)lRucpn0hFj_9)S5f?cOyAs_KuwDNRLIk#+l5 z>)m<6x^|UMVvamqwrkVEy0W6qyJSAz!~42;4f6e(<0Ma9 zMcEiG*lYxq#gXS85hM{>Uv#~Q2dG?>|C`~%%xFXEeuLM4O8H+GIUYI?5a)lQxZMma z{+rVNH#NSbu4RWig6?}ORp3I?p*7y!#z7O%`=4ekpCXV~hMlI7@X#>!fW z9`O0%ZN@M`F2;4GC9}G3GX45zldC6vqr9qIZ0Sb`hd58X zyrxB0f+x$Z>z60V4UDtyQj(PA0+t<)itI^!-g4yg-m}{>&O4mU3*Ay3D zaAEcWCo&>MAcZN@;9JcX`e|dOivX3(1iIDo))bOK9SvQ@ z_H`L0WPrFA%(Q@^mtqTsk6srtgGEn-Y5h7>rFvxJJ)U4qwy#wJ*xNDDS_y4cA{-Z2 z@?F{HiwjHSz}@8sr+Trvq=4d89MH2LuQ_F0_Vsn~myixCb#cY}b%~mP=gTA<@B19` zwn<3yxXUu&nTW|og36$6Xtg8VAYqrU^}Wd%`0+h zwaB%_WoQ=~3A9y~UG)sZl2&L*A!`Lm!r-}TXUOi}T1;fN^79Qf)x{Ap)xb;ql_hL^ zRNj(^yKEFe(?oD!D`eT2gipS(z4LKKl+DY$WeJ6~Ee$qfATc3opD=yPuS7$|sBQxI zhBHw$xKXLVB6RQ7j@D~ta<3e7mgV9(XVF_+RND&5r{8g^URu^@r8MgZ`P9yMvywoMpzPKD+&9^@ar>G`pTW zm1&r#rrf!CuizO7yDF>`W>o1_?%f{gzP^QV) zBBXIo&6Ls%J%7yNfpHHoKj5yu&%EZ032xbONnP2v1u{K!-=0Tt4UaI5l+IcUbM~Ov zr4(#A)q9cZ(sxe;bmRq)Wit%vVeSwT7uRshxQ|q+ZHk|kJ7exAV9eWY)^g}EAX}C# zQH5xW{wg{cZo1tNl6Kw1dVwavV&LcI3F%x9Fu}o7p^vk^6(7xeq z{EJKudPy6_@+#AAHr7JsK*Vr?q8@nsBD0HKOq;3aeSu>dYc%uwN+Cc;CZysCkN~G{ z3%uux@afIxC!cN-NuTd+!1<2S{Y<%|VobP20EMAFpUFbyo(%o-@FF+=JCD*MiV9xM z78*YDylL2i<`5o^OTxXCsmrrMac?n{r}8`^kmu7g*WS_sR1FJiU$l>9w5epM)gj%s zF`E*NBM=%$nS#w(w`eoz4vPAbZShUDzzcdnY7#TKLO7F*Alx6xd6ESTllaA5238&f3FX5ZVM5?H%*d9Tj(7ZbAOsjCRG2g>8#gTREg zq`>CK-~0Csv;9xF%Pq!d2YiE#w8x$ydmOXi!hw+DXyM%r;~&Ev8AXD<-KZtdDKocJ zaiMU8p(FWy>{v`pI9&T>P9lX2Q#7-=Pe+`~udF(2k(e^KshOD~4svr$l9@o1KZTFT zs^+%=rZGLM<{4oy$DS%#w;I>%_6#QSD>$H;-f1H(Vq zcVXWAYPoxRKBytFogJAenFg8CLXb#l>MrdhgYzRNCW*L<^nA`aE{5wPL85!=3sXB* zX5NvIgO#B(?J|O1z;9MrDJLXhsg3QVHI4Rs{vbSu!KS8?ms1IQ+#8tyLH|<8fDxZ> zcJv)4D^M}0VkOId(YinIiTA0Egt>;(4^5!dVEBk{X@zylj62)WC44JWN(8{6u8cTD#y_)K z201?CU+|YONRR={jj9H)2d0wJm&SAPOw7mfy|3h9l_t{%L8!arsH}RpImHE=-ciC5 zp!yi?$$I(qdmBLDD}KB4Uy}d@;yn(%-%|M>t?;i^L;w;H5YK<2A{yi_^>Zu)^j%w z;46lTj4HS7<8;hY%_F*q`S}!_g0S#Tg>{y0W*S<0(WSNfUj-ZXpp1HKY?-Nyg2OZc zZ|rb;{Gt6YeSik7R;={Ir^r8H}`zg63b8Qr}n?0SR6H(P{3DT+dHXXCdp^?9$6 zI}V4LV*D;*%*gAq>$Hg1JiEYi{MpZcG)AOrDH1Us_G=Q`r73dNJ+G{!R#6zaPRy~w zM^QqPMWw19ZAPS-eMf{WpVKpuH-3mfC}9}mGw)e+=?)*Bc#B;X);w|xK0Us5v0(VI zGNAJMu;m?3;KsesJ=FLLbVO~}rr4?Z)uI0B@%?Cj2K(7v*s7hAQ+ozblLW-Sfz117 ze;(aSQ!h$?_`hl?OYV@D?-z}KvE6qbWpY$boSQ%HO$}`{BKE|0XEGK*p-8gY_B~f^ zGxCP!K0*3qpqZPnBA1ruKgN z!))D~r6Eh%`K?K1e_P~F5O_yp=(aTo883=f~vi&$B@85m?mJdP3lf*}A?tXaPY$H#(N=>8HUitr_=zD%xl* z$+Vy}VTVPv|M@Xra<7Lx9bIv-v_r$IusX7YF#kI}X2?y7&vrhZe^#tc?<1L94zf(7 z4A@O&&3^G7PpyawovKAaJPvgMz9tiR;J`f3aAdD4U)aCJiA2Ax9aQ|6IaS+Ht>DSJ z<-GQ;=q!&xUG#;1U}2~hESD{nWaZrVm?vM`B3or~1``?rUEUy-NJVi&REaMpz)~k> z^d$#US1XPaO0l-)+8b6Q6qaZ#4IhJZ_2xvR;wRQEV36-p#jwdiZiZpA9lb7+_Ss1J z@HbUqg=i7Ac}9wDR7du<&9{@;qN%W-e#<$wExLsiI;$A(Aj-@C_ z3WBs}V~T|&SU<=!yC<$-;cx%B1o8Qf+3o@NNmd8g#|lm0I^TOHDEn6Y22z%>Ect#D zP<~HbVaGS|MCe%&Anq^xp)o9lhu^@;8+Dp@1pQfBUAMD?&JUmL?+7SbZS?m&!v%lT z;{ZD>fT{7eo+P-Fh;mMbAEssfT0@&VfOBeK&IEd(CR(JC_fjR-|t+(M=o;l80!rtV3zxl`~;&V-j`-BG~btUm|+Xnel z4h$_;)YkR`jL+3zey`0k0g)cy2P#OwJAVDfUdP*Nu#*MzFS$)tW$OjTkFQAm<27r{}0r^kv>~f?sr| zm2OLM%><|#}>u`TPD?KLM*`~kR{`>cAYovpu( zagG{J)m`qaUWc8WMmJmn0&X)Jp^Q3!`(r#E6Xq>?uv_J#q#}dn`9d0&I(%crK>{DcdmMJZD2Kqs2d7^xp}S3*|GA#-;J4Fm=F6}jAY2--3VY2`^q-%8DKJ2q-o z!58=|Zc4^5i(hCaHgdr8BPI>u;?)?x zln&pK7x~9L;HGArtTBk+Fg!GTBdpKbZ+Uy8g1ykeS*i}i02}-Yg6{KfI`FW*?aLxD zw?J#!n&+8SoRN07<|Rn@;}?8vE1o70NbWlF?ybce+F9Im5by%y#1_EK9VFoFlA?t_ zsnXU-XZ?D`N+a@oXNyG3d*J2mJEXoEzdyA z%P}9;3tnNbkf)XiLaa z5;o1{!K(`*!IT|p_3Niox_Wx!;}{v58?iAjdXiy?d;3T@8zqVx5}v$PZY;LqEo2x= z8cUn)R9D>E=f8P?m#BzcoO#~mDSj_=(2ULe&tP&mipyS}!*%^h$3D7&Lr-N?|G@5! zTiB|O1QMRM02;PJSwuhufgn0@=kqpVDWs- z*_=EP{7WO{%u3pAD?EN*k{8{xbk%->ce0{FC`z+Ym^xTnVp#Td8#VCcac^gI!JLO| z5TU4QX`#~&n|cmoM5{nUG&r3NFzJJRqVg00)}qARXW=&7_)ww_E(4_Ste;_;Hl3;F z;`!wM+ERWu&EsWqrR>Ly2eL+??lG($_GbG|Z)#Ou_5D#Pqf>s91HyN6N0y>W8lrWgB-hk|%(y{*Pb`dz^@1R|X&7a*+?;H7@);%*yczTi6^_*c1$8r&P&69+gE}-EyXa++q;Dv zH*}Q`da$A7Dq_(EjGjIAFgvLa$u34^BrO$q92~87h%ZWQQ@EqZMF@Srdh{d8Oz#(k z7?ERoHNIi$sWAP+(V8-n2yhi8=$E-UUc?cv8}|s5=g;*+1CM+w9CfkT!l|}7K zz?21(WhuBnhtqD(r%W0$6w0@()RYd}Pwg9WQd~dkd|^!{&YwVD61b<^sCUZ@uK*Ke zp70CUOs)qtn=Tu|QXfQRU0*t6H}F)E{O^~Da|8^20^tM^;X}P9OCX88Cc;tuQoq|M z_>=7Fb&yaz-jOz_LflV?93vX#uD z(lwdK02+X!jMVyXSi%Iy6`KwZ7|8~(!v5w1T@PA+o!}3F5aXuw5?bw#UOBa z=#Vipz!Fzn%8IjMIN`%XeZ&v*d0ttr2SAyd(l?H{Z;|3*Fb;L0+`c>oe}wYV%*z6b zyV8*B(-T*>uktJVaUOAEEC+^!S%TrDKMSaKitb>a)T}`>X@h)44)3MIQl_yz6|dgd zbghnhuR9-4ZeT0;e>ziOH)4VtEC-ocdI_N*VXClW>gyg*GCTh`+)c|3jDnQXG}>tA zqp8vP;7?jY&PWI~08t^l@hR{-Bi;JYUUF-;ftwqg!7*}LU!RGNE7)lAcCJ>{e+uU3 zP%xN-L?w1GqP?8Pfr)P_FvZ_7u+S`=1tfy+C>I`%OFTT5&l?RM(;1UYK(p*k%cYGG zTF>r#b*%keokjJ6Sg;XwZ!OzA+6)HQdpDN_#aFz?poeTSq25$3DuL6}r=d+5Gnk-m z@jjAl&CehVJS0smI(gIU0}h++9JRH~5(eSpWgb*3*t?a)O2uZR>b4FQ(jGrUcC{Eh znsY2DdXke2M1MMDqnw5@qCa7%BEMu!EGct9CQc5^CyleCiC|Z z)$32<5d^CeVAKwK!)!25iM#JbEH}tj!;rywEC4;{+`!)h2 z&0IuDe|%$RIe^-dg}WHp_TVe#;Dm&Ea#n->{UVaR)zi%qt+_FKeSby?&~#; zs_kK$eKn)xOeyEq>SAdj^zG-{_zJj}!iw>e6wy_(8xq5BqkWLcxa?lXW;Pz|lLf)- zg1+NVV`x{g0~4hh&aNqWf5M_1x_6StR|m|Gl6=}|YN(hd^ggWKly7^si3A zCzmmPIa|gev-RB0*j5ep>1N1d9&FNO67|cp545su*!1{`u_jD^r2ME?6Mubz|MQR_ z8#{sOg#`lo=eh8&9}+=eKtR0z3Ca3bo``>gvTPFjY&V$TLa%*ch&!zP=QvJ?CwSS+ zpOe-z=)X9Jl-a3Fy|En&;aj|MGW?jn_N zN_B_tWDE+amPQt>M@YMgbGs;1I}(;N70px(*KNVLCCS5KSnd7h%;O~4Q<{$g@Ts(4 z*E>o-duKG*2Pq`7L!8ISy|@XUb2fSF9N#3+`bfIevVy!zl-8f`$ID2#F(7?G*vMGQi*lTAJdEJP`#woT;A)Ck zc&iZ>8dO|n#oC^WHSC7(?Z3i5{kikGh_&@m8|i@Z^OfE}spT@7hl#JX28@K1vaGTNza^BD0)UM2$! zT8M}YX=Jphr_{J^;fdchZbE_y~WD!+I*M9ZgNTV9VuUPvX?+ z#p+TqZ^CHlZHZ`Q7x87B^Y&~vo699lO}|Qxd7APMGZV|x%Gje^*-BUo zH^S(zUcUoF$1IbFAEiHVA7kt!F^sQ^U8HMkxJ+Bz=ZSoL81;^#HA41AVaBwwZy?c6$>u|0uvp@B`({ z%+&Z*O;Es3X-sJNHG8?n>3HO5FnU zxEdtqhyz=APLEnxcgN5qfkAK$$m&=h-51O3^R&Z+)5522r7B8gy6k{chl~0Hpx+uX zG#T}wO`mWm`f;1L70}psMF=6^>=va;V?)CAOW|`cBtvq}c|oxVsjEe~ zxdxdj>#ZwMD87Ibj_K?!gNzR169P>#)6}qG(*q=JdgC;HBQ;Le6+f-qQiKSV10*bs z0X|XrZZ8NUqL|v%zy?%Xqb2l4MInI{9BEL5y~;TUv^&OmFVtYb6?tA10H{jrZ5v~A z)vp42Uhl0VB}X&Si(=TCP5mo&WJ7;x@99gD0Z7{XdtqJdy~NPC$z~=c{-!rXx}4p` zCqM{a4e!>iX#v{L#3QY=Vmblo2fVPbQX@GK{r6^zq_)^nkZ;7amv`NuKhO%()lv06Xfh-!(J8KB@}KkkU!U~wBLCrR&G$6B-v8i~pW?N0+8B-Bd8MULUP_-7jwAQT#=CY_(~i(> zB$44(?53wo1_kuSWkG>q0ig|9v-fwwfnd(9A=Gt{zy zMHZ8-;qXvo=4ZTj)(V&0a^rq`wVX0?%1-@LvAHpU&&ZNaKQRr0JYzCEp)MWdO0N5> zZ57fw^Hc`BW&emK*$K2+z8g`!ZU6Y;dg%F@2Zj!ANQRC*d9rc7_lX+?zE=zHscruO~KiWd+eMieMNxXv58Z?iA>cVvfpwv7y=p z`wSSr2c5er3dqOBfjtheh5dU#Y4M3{$=pY3$NMckPzPe^!Q3(6_F&+~)zk0!##|5H z?#iz49ndk-F}F2^M(|bMQBg6q=Hb5m;Z*9>&wnd7R*|ee@_wXN(J)t6xX=2u1dM0GMehJXyFQpm=}1Gt6VZ-P#D)9(}%s z@MQHnb>aVslKCOBtfhXay*q2!gIrY=(fHbpVj`J`2;vM3c2U0yLxDL+ z&Xc5eOQX*#gI1`4U>BK9Cw8K!8RnR|ZyQMR=-)ta-Ka!X&vE?>4N`=5g{jgD)26K= z`Mh&j0&u=5*!98!hO2X9lD+Nk`+TPD@BNg>pG76Tb^WA$!f4$Zw;-~mrqNXqLu}&K z*ZK0{co|1{YdvW3@8RNE`qp6e7Rgcs;Q6 zAg$GIR~85XVHdSuRZGCd-c2o<9x#6y(8T|w{mi8T2Zvj4-AsS$Y3zRn`V@>ir&Q?ISeh! zo%MoCArWT;=Iz6|soU8Q$zaabo*rdK7+cc}-Yj)a%eu8C(c(6Da<%XQnszz1Ws^sU zymmEpqzDrO55%(Foz+vE3&g;9{f*U|2UHD#`G>+~1JLK48Eo;Q=kRpWB6z#T)3Ejc_d`%e7QwJe%?br#8b7W*Zq zC#;ob=8wLuJO?;rDi~Py7#%X>UWI1q_RSJM>d!sRtXq)XUqIToB*-U+KcDMT7P8ZF zQ`r1GVD7Ul_h-V~ov~!%!$Gto!TjK_MEBeE1LcS@3TCZLj#LBBff)OU$uxH(qp2_i zDOq6p^T9MU!rW&(R|rSU4v_zDAZm*~gdGV&4!|B>Ybz%Y2h&X(?nUpe<-m_DED%cM zj$%fu;`uUe(~$kSJORuh8*@V4FgH!qAriO-rN?P3Iw9ZNgx?Cr_cjbt#~Q_h_z|V_ z6ZaC_be_B9P#cHSaSbE3f=gkf;^qRc|BQh(tx`1Wz+ac=Ol$CaHp}( zi$*df1zH`Dw-(1yv~_vmAxhp&4@?Zl=obN1hNRI4Y*F7`I*KtPTp`;~URc)e*5^qz zc7ixTC?X2ZJX;q%R<>X+*}aJp?W1DXgcJQXJ%KX#g4n(@V^9Kv;#oOB9GKyVoilg* za`@~2r-tVw)NjnB1Y}u2gJ-Sy@(Y0ziuW2~>bNjgF^C>t${~E=Iy!7U{=auJ(}txqb>fRc2QrU|9 z-=(-YFlk6aP6}s*sH`Ey+D)Tr;2dvs+T8M(Gtv6j2t+f0d!Gl`Ag3;=iI<0Pb;vsk zG?ONzK>9TaQ{HyFwB}(`>%0g+z!9RvolM2Kz$-#o?LB~KQ?Y~DS?0()fZty)8MhQP zpkgU5@#I&3f>a^hh#E6PIoBd~f>s7v^qKm3+}c^EV%A-&=WOc5VQ*^dhRWHBS?<() zJMefk%j*23`QR(oW;N-*9S4CTmTwXsf2bF50RigHa^}J)r*YAG zM7mtg&6*3h->0=b|vJ6I(IC%;7`^(*ce%0Ea=XQ|AHN2ev0uO0-00~lHZ}pRBvO4zj>BVv zq;=U;$TY0bWKb}2^u`%8H8R(h^G>6k3}PYJE-EL?KnVLQlYyW1OHuVttJtijWcD@o zcdvDhaj`au5;|rNo`Xc0iJz~bYDZLq zgo0|$K7eEjai_RgxeDC{)|i8qeXd(AY7>~?(U{;#sJsc)7t%p|CH~@K2ZPZ>v@7dd zRpt}e0#_;Aki^D=#S}@>i~bT~S85G^0iOmcBh(a2j$ zqUi{+HV-+_jXe{i$sNqc`S3I)ShoElyqQON^gA$vGt>;1ln6H0qqZm|Mu?TOG)XJF zb}_ZwKFbTb8}(!iwXm%I1#SANaq1TS)`fv5BK)w zW^n@W?`s~mA1?ucM{>lU1o42AY>8t>pU1{zOo^VQ zkHULLmBpo9AU-6*<{6a`Ao0|?6WkIK>epuYl^1Vol9Sh?USVmwQpEFDzsr$_kyZmZ zzOJV+T`4qoN_i9L$%&oxura;)g6;?ju80NHiF+njY$p~QKfLNk@LNm)7;VPtJR)m2 zDiUORhCGNHis)RD@9%|yTvI}^HPgUpuoq9+&#?An?HVS{`UM3k&m1+{$jH?Kc3d&A z%H2bK_lz@^&+oAS(NO3D`SmWKl?wH)-dxqdzX(;}y4EK7VGbl#;%#9JA7?`pO-jva zru4oZf8=V#@^ZW@XkAjw;R70>N)sRksW0S9P1#{_lz2eE8M^>E{!|~1dX*T`L7E$| zPG8=1O+8f(hkg1%#~Mf2-qgV zhWD~w=(*P^XVcTvqH`8rwK#5Ezz7HMo}b3;2A5=R{53axC`jgp`>EHtjot~=Pf}uK z4WOtj(GF}hfg$RDNnl$l_DzxqCib8z%Mz!?9m%VQKdBQ&=C?)5w+<!}T_o*3L&d{4IR zrY#lcK=r7G$olL8S8XkkL+ z4GQ=s_YHgMM-tGMBj&ZGL*oH>KbFsk7R>-L~ZZd7czRj|Aq zNVqzFe%|SfUI`!s*hbT#GGD+kKCyvN{3MHkG>B3PpAS4+6qT2qUmb{9qYhwE8GUVz zso*<(d#3e=L>8G4x=po&A8%+lvWk|$&2Omj4~4Trr;??(un%h45qc31-|c^l{lRih zo-A6XN?M|Y#p0;I5Jwn28TR*jTj%e#CTrbANd)%}!-RdId4DKR-^#3@&z-)iX&_=S$%4>7sT?>uHA=-%kqi(!dYj;*|_`-hEpXz?0N@t}_Z zRt@QHCV^S{Kcm;)k6C1pE2k#3q1zdhrf}RnjWk*_fkolI^Nw1*Y()bfjt@ScMW*FU- zcIN7eurCAA&RIc<0!vbKbJ2}yw6~{de<(+Pb+5$Oj^-&i#;O!_wb@7%&142#{4`t~ z!cvI&=eA%_=RkKISRxp(i^+rtti26w9VE@118DQC>1(a!e!lGszIKnhV7r4TBNR|j zY+p-&??hI2{m=WOU#Tr~S1Ie2i9sGISp`*CLxmt*{f*2dUMXTZii$Vsm?-t;Np}89 zepr5OZSS`Oho*lim>A@88OeIgaV)CLRBoPk9)&n^4nxBqOV-aB+K+xn>JI<`IS9H2 z%V9MD`7lbW*tw8$GK$DCB@cEGgy_`j?!)8%wlp;|L>E{N`a2(nu%cp6q!=}ej@+t> z?0>~yJ`RBYrA5GXgz_lsmX;+^jX(bc6D7R2sA0(|_qnI6NCJCItw3Oqj?Ak&4`JzGs8rGTzLMunJ&arKu$sm`eDNqTgMS>@8o6Bqr++}e{ID;^SfA?V z)W4lLiLjl#P`s^|vTve{mA54VL^oHpv@L}CQOn8JayHt&pIYifW$6WA?)!7>7s83) zq`vA#QTnNs0Wj6TY}nhvE9)VOAQ-=3p?Q3O16$~nmY0{tF)j4n>}gE;gAJuKJd9eo zFyC)No1t*e5$&WuhXXmzVKVD2bF(HI;Q?DX4Fb@syrIY2)9G;d#VuUNd z0plT3?snixx{JW)pt4;!47PFL-nOAgf#nAiq@=m8VmZplO4}}qPNk>Zo!Js&r9jSX zHgq)&QXMI@jSWl>1U64G(!=oEkr0kA$TRxjDw_4A!E#!6W|*A%;6hRfyKfXHcs@1( z-lXGAG}aN9GI&>?3=lrF7xxrFtM#NiMKdU+mPY~oJo;C>_?CT*3uGS|ky|yzq%k5lN zw~`p%s9dKQLUwe}J*7xgYPc<}xtU*?l!*##l5?g_A9P;*mkN+bu#k+bq`@rO7kPjU zLE^`MvdG-&jCqz=SCC-Q-4crH0Z^Z<(XF5yI7GQQ9YDs>7vdN3b98GY@lrjydq45r znbR{l^$spdZ(rSOe&%pD1j^pv{MC#EHTuU7=lx*BG*K!fH`e07IYN> zQHJa=l@4~4%N%)=OhN7z9UVS^!aJY_phtRdayR=E2$ z%Fdz}Z+R@czh^P1>Dk5kSB)5&H-hapr=$s@T^;}Elp<0V(3_~68YnWF^CgxpPo4x4 zsFI~08shs6vpVUQo(F~fKRh84p+oK2pv#c6uU>TB))7i?@xqXApu-zeF2z?xH3Ww# zo?lGBFpw3|R9YZ}siJ{Wf`k3%Ejl8wv*gdQVvY1kk^`KcZVa4XKRTYRD`JKX$}{bO zjFnC26-V3W3?m)>^Vj4Eq-`t3ii9`9Ik}%T6XL>J=&mKe@8*975&psgMg`q3Cj*{+E)|^!IzO|k zPX)(QZ$2kNt|ZnP8C^Vgc&#DjkKR(?e+t!#RUkSWrtxRRP@vLa1s={QQKq=k^)y+8 z=aB~KybX7q+pP1>EaZHi@Dv4kKI#&$#ClV0gZ((Zj2RJ$M@8b=V7&FRjq*is6w>K~ zgNL<{a0+{*V~0YIU;v+kJ!bv&R~I{$-(O4fMR5SSW9*(Xu$A%dw~ zi zSu&&};7z*RW4VW%(Bdl>TC=A+;~pH)$=LB0bdmF>cfRf_wAC^9B14BOfEZ zc*wy30{Vx9|8GYA9sly*LXiIX=ljq4?f*Cb?*D`kN)R>v`^3NhKY!^~9^P=Dl?^Pial-Kz4#x?zKVsu1ZL83&9(r(+f-Mj7HZQHhO@3w8*wr$(CZQK3#`3LXCi#UV( zZjEYG5jD$|E5A%yjzGd5&HF51l2eA)&d~;#+!?+1&gx>}ICMda)=`@SX7#T9yYLBB z+x-qI9n=?Hh`swIzN&xdbiBi?S~c}j*Y4c8SQ+H& zL9CtburZww`4AL{!T~xpFM(Mj%9G>er75Er&C}4iH`TkOGn5!3<*=rjIzv>KDK&X_ zK9)Kvq|Ae(;q@|9$wt({roD`p+F@`t@%7^o9%_Dh9RxZ%S9AFFFJ7to2{pTQy66<& z2cd*KiOO0_q&%peNho|zgBFxUb1PH=+WSGR+Fv?hXic$Oe>z>P?-ERKt#|b`V zzZ8hNj7R`KXITQHP9fjL5ch^(?(T8wjP9`c*vZ3)CMaMc6~Ribkp=5jglh|Ohq+We zNA?e@)FrbzS3_sUti8f<<+OrMGPfqket#~Lke&bfMC+l@s<9TbJ65TV03w+P+DJ!h zXy40t@78z)+g}UgVBKGr2fY&^Iykj;Ts^b+jmL=Tc19w2BfZA8`Ebx8dEgTCvYw-2 zd{*u;{Q!pVO7|WnG-{?<79bu*MmF+-PrEVNzG_#PL5+={nKB>wUd&fJpd@@C7V4sq zoazYjuc+Ac0lK(kI&LS+YQqD&Jmq+Um@OrHt~gg4GVGhqkwgU1pOj&D|6eD|)v zpHPrOMMg{e2H02kL7g?}TWB_L50P7yEBZ4@LV`Q@jDTiJH~WfA?N5k40A85Fs%?j6 zK;eWV`f{<^ACOr#wMYRuI~h9u^~*GG-X?j2(7My4zhgn`<-a8fymqGoxTJ(w%<+%> z3gTEp7vbn|Vb67v#Ns$|ORr1oH~Akd-Qe%Oa>==M(QodsnIFLQ&jil`nHuD|>7h`$ z(tal!v0XCF;-rNA&mB|9iv)I7B&aKb%(cujF3~?SX8SFzGH(E9N#b8Z%(5n#X9mW<4D<9+WWwXWjy%GBb*jb+!ik{Y0xKR}QZ%XM3 ziI9tf8JPK)Q9w~Pm#y2SZCH}neem>aka~L-Y=&lru!85yAO?{0nETj57MeNwy&Mxx z2y&_Lh%e(aU^()&+Y1vU1O+2XreC+<(85f6&x04twc|5cpP8#CwnxLa_?YY1Z()v& zz-;f6NUuYg36uiT3X#*JbifUdENM4Mw<#iB%-xG8MC_ z$?;u1fk{v4$Na{y;5s+2ca?yu!8Co7ecOx-k_$aTml$xQ0tvxE_~U&^%H;?0Wymc& z5rEP&qx#h7h93g-vy!*aG|z*jTudW&hxsYh5BlZU)tjS2b6P-qr0?57&JiB|LXk|O zmXz0{bu?|2Q9g@eEk?peJMOyRDVgsZ9qN}oLeqfN+diN8k{0UL2^UMCK&QVIdICN z8F`3ZW@=eJF71CQumd4GCFd&Y+3DY*hv7BzA5ZFyoJXHwTQ4E_GSA*p`vwrRSgwYw z1Q19GB_Cf^KuQ#ljs&X?rS4TWhUGMx^xm@L;t7#Bw@wkq{1;XS@wx@3)d1DSqQnUS zzj|d-l#0NB$r0{lSant$4of7{Z0h0yfM(`s_BJnOu%f44Y!9f(JWbw}*n+9Ki=%lB zl4psJ4-_)_njXk!_%uukC^4256|Hm9jb;|BA}4}@_kuME1S-6+Ae@4vWku|uVaP1J zh;F}$eFaiYg}3PFT6GSDoRO}|(6&h6#h1cxPGz?e6id2>v`C+6`4H=S5MC56u1C8vbx z^W_=$i!-M?d%F15@y*%U{%ztf&vf;)j?@Rf*==r})Jx*a%KByiQRH%;xoOi)4>zFc z-Npib@MXtb1N>AOjYxZgvt*!XWk4I4CFxfKmYFt5&sb-pI`nV7gr;rNz9>3{3{6zgK@LujYGBh~p6%Uog&LVBvW$Pq~7C)Pm`FlT?a1rS6^7~ya%~`=B#=^47 zj`u%p;MRI+a&~HOT}iB^V3&) zTZ!=lh!K{t?a4=*#O?IaL!slA5v%p0*a>_9r~H6Vru>AGg0vnz}$wV3#b2K3qx2DH9*nw!@Q&5 zBbcz!%68qA<=Nx6!FG=a;xTuh80KbR%WFX+7c~BrS*D8Yv9Ans5Mep$_c(BV!D$b3 z!E>Fk;jg)?HVi$EdKtdzo?Eh5H=_#_zd2a*ibs&|!15vhA8a4O8<_c!4t=Ed2UKUk zUS!;|<2kJZHk38;#E%69oPHhYN}4B&zzhR9u3)XIWtg0{SB|b{y}V+2G(xk2@ACR& zacku0KYNY~=_Jjv>7bXHl(EFN#w4s#xQ@P~PC&EA#oP8waL&8JFeX0jaug+>7)Dde z$<7*{05&)oIBQJCTLl)>y}T`eX1+`1r)V{09iwrTBj_U!JzYNl?AaN_I7PG8Yt+nm zgoG2R;Aigljf_~OTT<~ouB5_}HK)Ec5`3om^OG_buE~dnk~6&7=qUHl9t%frLNSMG z$pD@yKm-`7AZ$5_a>+hL76IE>Gz%0w_%A2%*`MSX7Ml>{psN72uGE0m>DH- zFww(TiokW}R^CahJR4l(RCG^vmps2gd+}&hQ#{Nc(Nq%83`QIQJZddAus%k+uwce4 zG7$9q!&eCXWJP6mpdobEg$_lIc4hX2G)kYyYvYE2cC^V{Wh zqh-}-Y8e5fVhRIjH%$0kY#=l+7A2&B&QH<_3mH7Fq^TR0Z*EYEj1I0oWFeD_FpPu4M^PW`7r9!c-D0~_eomE{Y)m5FHK8(;(i)2`s0tXct z%tsqHXrsBT>G3LtAgU!odGdPrQU;s!eclgAj)d0^V)}Q?HWs}4n0^PWnZ&vBNfz08 zo-&+R&}fJyPAs!gV}WC5o*_o8+4Y}Q0<|3%B^CW&$C4%~2{{_QI<;V5X8J1DWG%oS zdE4X;S4ancVe6yUGsX5m`SaM=Lj?BfOrkV0hm}JAc`|jdUPSgU6?@OFI54H=PEjvmnWThqY#-0O{-R2?5Q$ zYjTQp8Ntg`R2N`Ua2#m;fqK8UlqA7z1j4!3t=nOG`@rWpeT!qTz1ia%T{SnPkzGwI zJ#c6B@bj(D^iS={YcGO=q6bZIG6<@k8l8~p=Z5XUXUvdOI3ENudMX2h_6NI`h3*s@ z3S722tRam{E+~&*^B(+@S>9j1UJv?)Sx9pe#OYw8*aZ$2EF zmaFd70{~%|McC*2g>WqCj}j?tBEzy3^5w6hpe26yMpUQPX^Vgw2%k73E6W8+Zyj6F zOM^+U6tGgfyBpnBk)o5OkCqe^>w)vo;td*V2(~=OndM=w^e#c6$j|fV5~Ft8VwQ3R zH#v;N+9g+V479OW6m)qT=Mjv&9(wtf68v3Jiq3bD7LG!AX*qP$Tva7qCagDzKgz&;+# zh_Ek*z;r+Qvq^{C*AAhTL}-Pqx!R+7_tYY)*uLb+ zR(?c}Qok=U%SF*NNGdTty2uCJASwaR)xlU0e#DBR$ksn-m5HJkmHan}=l7sl(dj>c z&K?4K3W*xe8V*wCN?)c_y+z93HBj$USLudIS zrxP7IHw~KJAVNpp! z+Xci?LN33`OcpQNb<-N1jtHA37FynBD-mzH?E*dlAbkdh%mSc9UR92WtzxlUKX z@SIlRw@A-WRccFQ9H1=LYRGSrSE06(t9(LYsU8~5*(`0!(r7HGfF&YKTq2g77zbNL z)NUEBNjl?xW&xMbW&nG!k;zRS*HAN%YTDFa1(@ct9)R zV~!J7-)(;%%PfRe0Vd-{Q_&T7twT_}quNSaGuvji$tHZEDgi~C2-SfJ7YtZe=xUiR zPK4_A2tcG}bw8N0^Rm1j>HY>4XGwTn!M{)&{UM#2_C`CfMd`~$=|vv(Za#QdVmPVX z*Sd$Nl40*0DwtZR>5EvMyX?xHvNh#820&z}*&l!Y-tOvvWjsSe+z=;{LBmRVu{EbW zB)6!@``zTa#<83(6Ny5<@4l>Pc9}&vQMVAD0pY>?^_ zw8Zp%Dc#o{F4$mjHkpPhI3LPb!_l;!#fg&gWgnEZ^v$(j28K^j$M6EnGCLECy|t=Kre$1Ec@G2BC>eFd@vdFh6u+-@`W;Wp%)x5aj%! zXo=#8=6ehIs4NWkz2JtJ3ac3%;)_3dV_+}U$;8~WW=bYyjJX@sW1`Dy1Y5fWu2B59 zg1?McFP00R%WwO@cY73AnjY?i}(?ZV;-&fK%PT zVihh?z@>0SgXUv!#rg-x*CmDq+D)fn|-!T#L zAx>$Yed+WY5n{P9yigTjbf-oLTsHJYIQAcwwoH5fi#%nFcUZGAFLfLt z69b@{LsUTKeXYaya+@Z_jn|(R)ofO{P{_c?PurhQ6qriRC$UIP zY`ldFusOcNZ@}Znooq5djkebdMUt+?B>3(Pbs-uhh-s;rR5037d0=MudEU#pup)(> zK>SuBaF~D3ZbmyTy*WIQL_22|P81(GwbMdhsrx5<^e+i@$vp6Xb$Qpo;5%Qu-$U6x z#j$yEs)*ubqlX^UA&Wfex;^nQT!EV^^z4xpL4L{e!gFp;5G+5WA#4?-Bf>4{285AO z=53S=DUE&C?sb&BF{%qul}ik*^g-i-bXeY>%R3&-F^Nq3FTk)x90uV`~Q#4{@?TQ)4%Idtp6MD|F?bre-Mwa;`Gqn5R3o$ zP<#wErhygt(@9%^9UQw$a)~&KmAZv%7iiT~$5MYd7qH89-Jq-N)UxP~5#RA(3pP>Z z?)3X`b1aZ#Gp%GDt7qG-825Q1l3_j!o8uf~x(waOh(?ojG6_eD;{jIEF{=E(ORMMurF9_7EQj7e^w4`o$l3++8|-r2;}^e%sSlChAFy!7tav z$e4IeL}D;?vZro6ev3D}iNU-)3_fQv$s|2f|7>q%il#A~J1(#CvPBfwjq$k257(y( z+cUoO?=qS8k{jpvTMc)Hc6D`n+UlrD-8KLs>V)*UhJel`2GFYxC<5Z1(|Ofc2C{_Ps&DgFqGLf;yomI}Rd@ zD51`{OJqt_9!8eiC(E`wejsT*;UVq<1R!uqI5Rp)Ir-3LiTUC>gsYRy^8SGfoE&*3 z$$mkXjAdQVq(SF8lMI~x=(}Coy`0B|80ItBjhOo0(qe22E8RNC49a=@Z>erx|6@(~Nd96JrCoc$vC@ zXJ!2w`0HBK)%MLtjCD9g2(z3Em-TmHIIahSn_>8>q9H-`WCZvb)dwd>7cVROnWGkl z?8axuX$N0Be=yWdTEcaCIDLS@TSRnggRS?K63l}}aqjG< zWkFZiMwblSahI!&0~?MOY+wg`B&deX{q5ZK_I+w2q33JmtfS%K#Rp$UOXur5#^?J2 z-j?g`?a>D9^TUuWW`8J0JpJe;2QN9NCENPu^7`s$} zV)Z9FV6@X)??UPo*be6sFq)+J>Mbs)cNhAHjTgI>Yy>Oq>8h*d0?nO?L=71)Rz%m5 zc4s{{9|sp7{)hb7Rq!<^61!h`KXn>8q-r1|ZVnS}yVX?G&h8ZMX<+JU%4~~YcU$kH zVXln}s~fX1O9Fqg+wn!2HRc+(latNmsQaRI7@Xp{I-S0Mo>|5Jnw2kz5|5wUiF8f} zE=C7d1{@vz8Xl>2+nJ?BG(2+N8hF8K>2oTSd9Rzhr`2&M2cE9z*)O3j+q>vTF6cLW zxo+PxyJqI+7S^Dy%UWlfcpt8t-soy$v3YKw0(w@(=2l|r|o4U7w zR3ibQucLRk0^ZxB3mg1HNuUcKv)wtMCk1Qfh;W5K&ygj5T7=;DCr=%0vly_)&kT`P zGnts#1R})w(ioxGM4YFOK8H)R9~}}TMIKGah4OT$ciBXhLMTNC%FntVkjvmjClwiK z&Y{?i+1>^nqpzd)ZrOy+5F(QhMLDh({mn{5pPHV^---xIP7>#jg5h9>E5!~B5dtYJ zW2jXcYuaE~i~&D6x93;5exU{WLmv2w^Z=VAp*~y$YbOAnYR!RjZi2A!>$r{^Z}f-5y)_elFRp`Q|+2A7_a9q|0L&^yd_tmP*u1< zO!F*e&podkBXj{7^$10Z0&gp93TjYPIbAHWPO2(LlH z5pQ0vmPn8u*ha6l3eEg)(~(|IAGUDx1i(}vK)uhvnQ|hO4%9D6GR%mj7Y=R?P9jjo zD;%K3!U1un-*uj`hAG=CJRycU@vNQYZ(U8F2F1y8ana!LU3sAbf+4Pf_)afyv7ATE zpgGo_q9yRe7Lmu@CuQ_Cy9&~8fjPkRpkSf`e+rWvtvge?0o0o3sUR3^Ft8+&gI$Ao zrs(${>OBFB)JL!8>rYzK&Ohv~9Iivh+wsXZlbAlYf7Dx1c;*G+#j|63{mtS8y>9|q zs7{&R9#`3B)M63dIRkrXhjwxhkMcJU)p!?*!aD*iJp>97tD^v;fHdrp6?HdRQtdTwCWXde7 zP%8V*f(#D0c8J15glwvEmn_10Pf3eBX1PQl1l#i1At_D#94BXS0{eLE)i=}obfoV9 zvfLs-V*(*>--r}xDUAQ9y`fdubltEC$fd$M`TAar!OkiU!R}J$43ZHHddv5bzTBhG zvV+2gNxf4PZswAJn%J@&Q*XW?gPfaQC48&blY-NDHUw)|J}rPO$MV_xvwV4!j_}g+ zvXxre$iI|=?C|e80*aP!!V;*k?2*5?VN5P)971r8jEEsl1735&d6?MVKswtJs6?ca zO@&2+KoAE+l5Mjcs&$e0v-#Qs-5czh%*i53LXh{hNsN)^P6Z1nuz8b=0|^r5N2mUy z1MYbE3qv?LmY66;;sH^{B!E1IQE8yZUD<8mIBqQy!MPo7e`fdQ^%^NiPXI}?t{FH3`#4sBrT-LhR*X?5y znqnWm>oA%%k8*+=o{04pzjuS6#UPaLiNEl~@QNQ{ZeLwM=E@x5typ)>==EH+S^4k1 zcqFFSG}T^AJkT->`@TJO>`}z;=!nVdhHHV)3uuV*xkV{a_BwNHpSqbX0)HmX+pRH}XgTBnH3FPI@!cSd$O&|AkzKtUaFJ|j z)*S4kZqJznNIfek|I`v~SXnjxGBYU>94((#5UfBp!U=T+_TS3#9&we))|IVEk3Z-m0cm}O&ZIwo2grzmazm7uc1 z%mTaCvZgl0%^Js$`|8x{!lYqWBN;xLGf{~9+N*i(8%8bQ(AC-%ra!WNd-1&}RhYZ! zVt$RJiCkJk_>#BAAwx0`_DaQad93&!*|%oVuk|+syIQH52r<<3fDP{HCWxZvFaqu= zNn?+^E$m2{Ac2x;L+Ft=z^C+1Wr^6{toc#hdktIe2odBY3wY^q_AP9=M#~! zI`OWONl^tM5VL|LI*ub#Rd_;+aq0+7jSG+ln2R-yq-^qhAZ+~M!Uz*|(U@%fr53l@ z?dnz;UrARefe6v&@w(s$+hDDvqNo_?KIA``pR zo=+%BcQ$D&r|T)BtHm{BB+?>^v@%CYehG0c-s#Om#nJe5HlmZZVcJ%+7=hK)A^X&I zz?ov_%*`j$H7=#9u_mR*6xNqZYmbyk^SJxX7}hw}IEBMCKkAI#I|)=|2V@k{$?(n0 z`yK=wm~1a7W!GV@0oPq$?HGhR5~zAUHWHzdeGU<3J^)}FM{Z2gus{`!j>0gis?iIU z?WPV&h_v2eAu(RxUMMsEQ}}4|)`(aufM^l|RY~Pk^VAWya?R3x;9;}X;qZgTLl2bS zl_vxlXevU)Q3F9f`QrFQ;@8B0cwYyLAp0P!jhtBPtQx*rP+UcSjdT>URy2CD%I7mC zgm?hAyQEx*V!vM<*VM&G-o|eTneiRI-ga2T*OAWljjrCRg z;&~1Pu$jw;W#2GG+LUI?OSBg6J8i-N?AKBIMPiG#GhV4A_$Hw!`m(Po)dw55r0
  • oF5%wc?0lVIdiCvTMwKQ}m1M4pzSU2C#ISwFq zErlijx_kWB%{^!QZt=`z`J}cE1f#ziR5=GU*4dQUnhH;gJGn(0#0dN`rZm^?8)4S( zGo&25LgMIc(m57!*)Q}o{PT0CE|!F5)~T2rhu9kb$Ip%2Fp&U^y?!?k&L>W6ced?bOuZfkZG5|s;ahA`rpIUrYJ>unaY@fWWlOz|uk57YVj@!Nz@XVWp zTmsS=iGdF0On(K%f(4=9$3n+bhXp)CqbFd2;6Y_E@UqaPIs75`(oZSD1i_FMsT?y5 z3`7tb{Sz<=I`)#vD}M;7OM;4C0ZmNs18f_W*ZvR+C;|ts99{aIKZHj5sTeGX5Q2e) zz(c2(g#{5o072upnj#hSDVk_^`B6cLxcc6qwaG z0HPBjRJz%>AoCg|lt2-W@yfBK-vvO7p@_s4%BL+byl3>pW>7@Zp>fNuI2Hw-I*xQw z0K^)KMTr-khjmrPHI~oy!s)v~)WR4VSq|A1nE71p1}-xMoY-T7i9;j@F1gLc`hYXC zY**4Y;3z>SIBQ9d;Y+*Y<8hG$(WVm;;_o_}1+&v1sCwS%P*(jOR0)^b-5slIEA@{V z5i$OxM=bl_sEyw{K%e#WHV@kKL_p|=McKqP9E|k@b#LzllY_9;SC@c~U!B8)iyHJ8 zi!~}{{hZhP7OUI0@d7^Wj^$hYNR5=6}dwAX!))g$0VOD)*xHv(7tMAchusdEE<13Ia|4YpmVDsnwx(s$Rfn$2h;F4DPn zP=vmgBHw_!@9)qQ-m z3+3&T_V$|u74|CJ5Qc_H-`}TCOwMyQN6v_s*EcG(TGntk4#)hUnUYHv?2BN)s2sjcu&e0%>qc z%=Df>?)6|wMVvWk!pB(o*^74F_NwteFhs5B{awh`ce`wj_)VHBpnNX5s^>lH*j4f6 zz>UMSs;7MAnlwU$@JcK*UQK4uCs^z8{Z?!)oygr&)LQ20xFY9Ez7;+t>$SE5lBIx# z!+D_<+yiI)eNC0VOG3m$G&5Y-6b9rR4WWu=Mh2V0ft;fw?ij~$iq8zQR05|TSVHUL25RB;4}?=rFid?BqX}oM=c(o%O9>&43Kj?gsMhb&+a3<*(aGlcZu<+ za-SonSs^v|5zQE8m9QyJ`buM4Qmb?2ZhLaP|3}+fheZ{2|D#AqNhl~GF-U`ebUPqO zx6&fg9nw932q+DLG=d-v(vlA3HfdVaik?^zTHtD^4$gEn2CbaxI-N23HHMOeOG`U`&m@*7&AnOkiZ1{ zSw>%0#q#w}nXkcPoRC@~f>!KjHNj&%klLtukqJJCP;~qjHMx<(=K4ufuAR&#E&1&2 zu(n&dZ)G;=XaI!Ljt2c!MU=3gLeq|U>jFCnV|0~c3%D#@nU*-cm5%-XbOYs5Gj8CI z%1H$R$B&^FdvO`yQS}|^-o1EWFAJ4kdoeToOO^29r@)-RuPsey-gZEgN&bwp0cRuQ zZ1z})zcN{2zCyD|&zi#3N<_*6BH-F#4a6^0LA2KA z9UqoMl@z%c8uWR$ivwUQ8_7_$w8vB=IO779qe87$w#>v zH~+@^u_^9(J7MKqNT1wt*iC#|;@kzBZ{njZMeZ(FoAo*W5i4t;oAFF?+#Y`^f?t+0 z3|wl*z~|Z6g=nqS#TwQ2VDesMm$u&|4(oFFyKEwg-Z5+~Ycw@COI(I4I1hd#_w1|X zp2`($(@Khv(l!(Zn%7`c%cc+JUcgCSC`yf|j{;t719oKHj!F%CZZ>6-^=7qpqB(%{ z8Hk$*BXd8#LNF7TQ_QyJTA!z}*NiZzIb!X`|5j>qf`l0*x(GT)si4 zPTMHvnzi>lDMiGl51IIo&P`3132n!T`uL@)Gi3Uor6+Yw+P*h5{mqfJk9X1XL@pI+ z6Zi|0I?>Vo+VrUWvc%?thX)k%r3f32GQ{H@2A6pbuNX1S_L&73+kLo*`4W|1@_AM2 z&XGtZ6O!%QpjS*DUhJFHupzOKCt5~_ku;p-;Y49o*k<2lsCmf4Rd*l)D|j8jAy3R9 zcW4MK*eq|8glSUuqg>{ZKI9T6BE z7DYdN_HzTo;@hYcl>KtGtwwp-a`u_^sY@#q&44W%=&Qy;kfx=DJ=zt@@R;I`%Fi@g zE$or7clYes7(QtU-pUP2|3JVxsiwq{Yi<6FP?&;Jr6{dP>)CMFdys_}WC^)pxdXD; z22j`&kb(^lkhkLnbFMYEJmHz3R7eE5_Orb#(GlDa_qJKV?vuL$Z}Ym+2`TY>)bcs1 zte-vqAWXrnQs#ds&ye@LFN~Pr=w_IjiGp9{ds@79=x|r`Jx4a%Pj3XZzv5;PK4kr^ zHqX&+jjc#1LLp8hlsb095(~2Ue0q~35tsRak%>YEoJxSr6!z(j|3-qKY(8$rhezN% zYR-1+zeo(8^%oonFl~-vv2Yl9|T!v{Vzd@LaehHH+NyyS+(z++kvwg}v~2W(Mh9lP_^A ze)(-Xhg11^wkhAOxEIM?uo_{)!z#Y}k+a`SpQI}p=j|EgC)AdAaFxrE^7zr`lDvNh zt*L>jB{ZzR43+06skkr$q|C2tF!Qt#<}sc5tQ|0PoXU>+MZl#>k+hs7Y=aG`8ta7SsYoK!gV} zdx zThm@Ie?A8$PJy1CDoh5$jINf;XV(AV%-n$WLGyfqyri>NUhTlls}5fD0O=m)Xm;2- ztR2L}$lOSs2411pU3QFwuV-n_rzB%Z@za&*FVsE54%Bocoak30e}B>ak8fE>Yy6*Y zSvucC^?GtVaEVwYt_TqG3wP1>6K+P_r9m-r9&a+JAIM#(g363 z8^)|kG%%<_jG_c+qL1Dd)&md!c3nbYJ+NVE7q_(Rm3r5(i+a1W-SZe1``PESp9VXf ziyayLq9!rFRnNayo^#PJ0_D{!ZFg7$HYjZh%k4%YNj{8>IDE}AN%8WsCpH#u)=0`+ z_|@j^#d!IlMsYG@BzxIEvo+nxTj4gWEJg|$UVo80;~DsX_t%-PLq`2U_I0iH97c1_ zWkPs%)04Q4zx24S%IZaJ)2>i?5Hg@Jca^B{?HG&AyusHAO8%dABDL=6njUU!VGnBw z8BzPYu$FSKpBhu*hv=NT4;NWuq<%4eo!nW>@2tfX_ebBxA}9Z<`HM}ZwYfBjtRSC`9N8V%lN00O z`t{;WQhU07YbU6Ct^Vv8OaD1tHs5vsHTkn~|KR6SdqfW!R-mmpxV9z0?I~^aX989Q zJx{^Y!uU`XEI!Y&eY3^wa}q^C?^nXqk=q-@2)Obxoh=sb{opS+OkZ)yj4ys2$dWMB zTXRS`X8m0?b4X8$DF2|rP_H2A`+N3Jf9JGb*cVbVW4QP6_cIE1GGm0t@psQSkZCSU z$`Nfa*f}j)E9DrNHHmxrcX>yIhs^X~;`s0ksFez6RT%7?d2htfw(j72De)Za2!X>J z6TUKX3~d^ZaOpv6FnKMDENIPq=*E!m5`=85Fwl1+1lKc#pFUI0xo=+_%L6(8Fo1zd zrX7I8IHWwkY%vAv>BgmIVEGmB`<_-Ua9N4&^@c`kjq-awmi~Tdf3`IU{bcIvwU#a_ zKsJX^4`4b)C$;8(1;Hr8+3dq`g%k4~RcQZcrc73KB?Zc1o)xneI5`3E*3yuul7TrY zJUM>vX&qU4ZFzb5gP|v#5Nzhi;9v~}qv9Pkm0-yH^Cx=_g=eKA?uFI$1`SW@%7neS zJPm8oMI1Q$*=lCbESg#MoJ&U>&fC(`4}3>p3Npu0PF*SPm%~yQBdrqdAWeMKcVB#C zRMIiGg?WZ-q26P=e#^3DXH9US0mKmaj4^IT206H&JldP4d&*A&r;kLCbqOExf7z9| z>=N7-16h(!LZ2RKtU1_PT&U3I|#n)xC zcvq3?s+@YI^IT_zLSf5FJLAL6Kj8BiCh7=EUyjZZtof~{Yky*T1w~xKvf6#>fsA;L zby&U4HDc=enaYLp$yLs%nxDtqw<+QM*ZfuMi@6h7fuV(sNIIAnsr2TPh`q)2-MO(r zx;D@FIt0?8>@GJ>Ir;$TkywfyEl((5G{)B`Zy+5&M+tLXiSI1^Kp21R{A?HzHg6R} z_^Pmn&i@tt>}4vuSKA+o<{eVc-}M5*&MO|Cm+6G|sE? z8UV9fS%0OwE)bS7{`a7u?&Mb#s%Scr;6j zqjK~n?Dw^Y-(QqiJa}rRKAKr>JydJltFTd=M$=%>ix;C+lhQi93HWJOuqO5M=ND_3Nriote+ATwmV%eN{_pg(7?Zh3Ge5U$7O`CV z*1`p0xafrVWhOCwc}nZ)?(@cJH;Oz_i@^>AO={t6v1zB$fL1B@5?;FA@IU#Cx;kd#NZBYQpg)Y@@VIKGx}Vm zX{j^YIxBS@DG!h!Liykq;JNIMEfW4qq~^EFT?n5TMo@On9%U1%y$N_t0>d*?yZZ~V z!5H|#ev$(%!+80e;nYc0;LfCH78^#J0bQtOGms?bP}4g(AkJi1CmwUXdIYpF>kw^H zj{V^#Po4fVc)vHs_M-3s{&z0xOuVFPqOw~v$9qo%j_(Bg$WMSjWKrEe!`m(YG7N2M z9O{nSNFe`>cNmhh`zZJadFH#QWq}wI^3Qg=dBH!P@D@I^)nnm}ALN3)wiG>=Z9y;} zeZ1KSf3HjvX?7f$J(B7)?T7zMc`Hv-#WqjknUOaK-2u$?;Jh66g;zimZlHPT6|l=Z4miLuh^a*?op0V5l|YNV=8ArX9-Q;+W8>>B z`lgqA6fIp78<&IAWABVVeP4)}Y9p~zxtx~5@5Z57{^A3n1smeqV56CilFYK^-QSRa zFS$Mt7x|tMzL@+}2z)|IEgp~dBcXt<9KWoNkQAGeRrtGJ+%(F)C4N~Ceevi*KQXoC zcf#LV85Dng;7!*y_LfNWh85Gao=37-4N9g@b{{zWvY&SN6)VEE-ck1}^}X@#R+?%- zbQ<@b#aGq*q3Gtll~A{WGLBN|9oGcuLiZ+V8^zc_6sG-rp5*O$OE|v{=D2i^VnEW6 z$PMAVQq<_&Zju4K_vrrFXnNL>rMJ5|#9K;YTi?O67?|Uu-%QeVC|>ryx$Hp{{g{7D zlHS1C`;;fjZ;cL`Qg&W@c{kFuc%O8L;~7 zF}Ca*h|(S01aScY99i4fxq>=4vW_hA4+%m~hAdg|LpPNml8OpG5T((CyNm?KINDgj z9Jup7W_Y(EJAV3h5y>aXo>1^ny2d2xNOsUNJp+i*e5jn*3V?e+#c8hrvq9Dc6Sj?c z3b1$TiPSU=xWF|oq5oFYAxy#pZEBZc{JQF=-c}Cv8>(oa017(lv`g=g0&^1p;Zd6p z*{^2xQ6SDV&|_j-li9!frI=qth1mjXD*b6Mw7wx4-*|Vo0mEj~HE=Y78BEN=*{9o& zejMdWnmOGm&T&yI$n|H1j_#sZP$HnvU8(QkNa{~!w;_IAhS|#x;$9dX_uUHkKxcg` zORv)_W-`;0NIJOr2PyM$r{lg7bHi-Uq_V8GzT(o%<;lYNZM9UP9=pgsFIrD+jg?|E zjTb)*MfP^~)g<_p80yZx3;Jq)kwR{fi(3tDxNZNHb2CzJb>t1uWT^Q*o|b(Tn#q5{ zv+;W~Vr?kebL6e;l$+k9OQvB2qsO`julxFL>JA+o7Aol7NixzBt|Jcf&8vZ2$gIMi z8Vhhdp{Aebl=gX$d7pOjV*eVK{uM%eb21wmX}c4w_&KqghmIj-YV|OHR+&`u{X4pB z;d|mzrNSV=kv(GL6_b5b*6QK>Docb-OA=kSCA+v(CrFTY#Z~WH7T;ru=v`rn*mwbw zB|&n_GT4b!BaP!q>OA?7MweX>7Oer2S&}+y6xbp*?t&y%0dc8@{?$XuK~V0^K%X)x z+533By}spK^6D>);!@gS(c!CysaJ4(`u=4aki|Xq*&hLWw}^;w@GFd3x%rTS^Ct&a zcU#z#Y9=;WY&P)HGP4>oS9hfzC)LO?Im%kNd2xjCY^sfD&@g=!7MG*|$L5zlIlc|@XpUfrow!!fQyuyHduA8g`vz2kY0%!@7G5 zJrA>S{yw{`KHfDC{sDpTe#DP3qw3ipsEJxB`E2qgiMHvL{?>&-!M`W2Eg%_i4FW9W zxAd7J-iDl;ayuAT0%nvuKpm(n1#reVw9e()0y%&>Rc}gOnZIc>a}Q>AW;tc1u(AP; zF)Lq-d8zAXae}`u%3N6mzxu740>`sdh8aH@FoDBm{rtBb_Py(~>RlMobynB!L{)5c zjMIr0;Xg;R3_JTHYQBdj2^UQXq>LTn-MR=joQNlr8UFS`G?#5Lxc;mueGumrV}Iyl zhKHmx{Rt-AwDNd)1%D8^hM3`2pel-q&NIkM^oUB`-a0sMV_h|3)Q8lu7X7>XMmmCqQ>Hw|nX zoWa_hzLj^t5O3R$poAaF{{owJc>p374XpD|)wIq9U}pX%77sSq==#?)1}ZvwV;Vip6Tayu;wNdk-DjR+Bz=u{b+=q0?=jByPFViTM z-Dt)2-?_}DcR2f|-iHToJpl=6n+1JO{TcLi(uW;V^uE%H3YOL^C^$-ZwxuF@#g ze0#Pa$aV%mXB5wEjFOOCZ5qC~Xh$thCgVy@z<}NUoS{7R=q`Znq6GcqP6if!n=LyNqQTlgW5A;7`(; zm9TQ1uTk;vi4kB~4Ps?;tzlpPEts7fGpbZ|!md))ynk|M&a0W-*`nCyGTkow^8Qu! z-6$Pt=28W}Rl@{^y;G^@`ZQlRUnp=8CN*(|6U3NL1{F|iGU%!;>-(ztdvhuy=ue|( zn+%l~TNecV_B1pHQZ}TEqeT6F*$3_LQ$5|Lsc~&h%oax^@w+z)h#;*st;6%8iD~!x zKc?qf(zhx1Z)JX2-Br@-IXEa^b&k{uIASDrn<;(Kp^p(uGWQv3!7uyKKWNX%@EWV! z=+^@Heq#CJKOwH;dLqafls#mzQTJ+!lM3$8yB)9KpwE(Cq{x>DK6lQ)9wNhBbAaAV7Vm4-AD+s zZ&BP;a_@l#l_)BY%`v z(B(l}JRC#4J?Ee`4-k0a_mi!@?LBQlYTC^5KQ;Rn&)TjmY z6+r8{c^D0!(PyXu>Ke)%p~&~EK_W(1WsjASyPbtn&{77QnR&nFLJ9}pKiprESkQ?N z3A`n-jT+k8Z3B5M{_G&J?Z7A_6-IWL-TA#wgE6)4Oi+_PPK$*M?Pr|JTp5%B?axy@ zC>b=JjM5yM$$Wiu33a_C^9ol~47;)WE%Fo#ObMZS$1$RReo66Pzep>(GFx)O>-jLi zFVYR8H4cm_mj^8l(5?X1N`UUp#8_QGlOxTr{cxZdprG(9LpcbRa&v!r24JMLfheTu zBw&s*jR2L(b=^;Th}W+T);{Ac@d;rxZJuP717{L5ag2xO z&>4a%_2jcn6XxVd)8ulqaOV|j-}Kbz_l613q~7?){1fA#Zq=l}qS1EXEx73$p~C^| zI)ibOf2stAsy_}1bMEJ1-MbGIPo2QN>akD5>@?Ac;p@NVoz3b;Ip<*{ZJ9{u{xzXm zYq>~orGXhkm2H);<&;#7RB2yX7A9U*U%a$fcMg*(GDjMk-Mr>kXyLGQZtqUD&y{3a@z-@yYs=xp7kHtS+ivY} z8Q#p}hSw#oM4LfDS1fq7JW0kqm!uC-hOX3BrAC}DV@3rb}Ye8ZCG?P*nRVDU)B`tS_*oSX*3o2k4=Cgo`9X$v|@kP z4zLq9G%5Yt=G%U|Hpuo`5ET45stLdJhPn&NdIs_`xNBc5DTBk#?3Sw_rx4h*ZVD>$ z$Lhe5MMiD&zT)hnlEw$MI&im{=AUc>AKX#QC_X));Ukd#X6)k?uvZL>(gSC#C+q5^ zaeb}k`z3qy$h>cwhr|hiv5c-^431?aa}?jU=CpJkws~fkB9M>ty9OSbpg*tuxIHgE zaNqF32CZ0mj)T_XR7DX8D)w$A_D5c)?o53Ag$aL1;Shf>X-0$yLv_~(tm|I$pc6y= zo~QeK57n@K-Z?OiZ5|sKQ7ROr{~OmmVdCbwha1}K9ZNZnQcIM%?IOf!k>rV7>4I4q zs&D5^3Rh=N0#W%$!|5a>bO~~XFi_ows>yA`^HU}PDXL=N5qLc`$;Y_A%Eu@+DxrJ9 z>tcnVBpwMYKHml+qbA|okH9J&QIi0tU@_2Xtph|n&c`q^S$crvrZiBxbuNB$ zNjmJJ79&bT!hG|hbNU7D9vJ=vkX&C4x=DqxtxB!AGA}taF^S~^TJf5TY724(c986(SNDd zY+u%QdB13UVd341M&s8`%@Vn1q{aNQX49!IO@V>?mtM8jrqWQLnFiAyMPQJi?a;>!I1zrhfK>bwh zXc1dhUrnqZ>r3@T!43(e-8Z4@S8zG=d6c~om*n|Y|r`=5_$w`VF_kVw9cM!K&xxbdj!ie|x z+2QMoSwpr2dpJV5Wa0iFojRC_Y6-e1>7~CKOY!+!X8tTyqjH^ovvM6`n{Dc8w|a^6 z9C-DsmjtF}y!01Sv=k^lf8ngN$F8fh7a{g&LcBVfeJZF!r6f?8iTPIXd7z%oo@816 ztZ7Z6y|axrg(9%G zat)yKMG9XFvk@8!%QjujKaFm)HI((4SC-W##Ay}*D4Y+xn^3&59JLOq`WMRf85C<9vWaDPHB-y-96tM}4A zmt@nAENn?U&xCyAw@(*wd{h051d8!Z1wg~;V3_eJ>|`w|{e6k%U%94Bzvvfkzkqj$ zx%mg}2j8Y1L6;*D2gW>!y#*FC?JJ{I4$DWgzt3EaR|HUh9Hd_PM18|F!wZ99TEZSx0m&J8{f` zwCcRVXRFI}s>es%+11eor{AqCryfN~mCoj6z22GDU0j|nM9pSBv1^(m=O1*MENF}= z>}gbAo_PE%P;Nn)U5DrE>#cQ-MG89_v_~}S+L}hnB&!LJop8(p_htPQ{wS6U@o>xW z?`02~c`!|0$@!K~Z!KE3g)te1s87&ix4fXaH*#m_Z!wRc_lTv&Ab;?M#@94SA;I+l z8XTWgW&!%h=#4%BMxTBD;DfigOu-O5@~)*v|4`o!i6Rnk3GxmVViWKPI>t;A;ksvk3;oiY>MP<@)2ik3?{3^VX$HzIW%2=usr@Goaxs#)Scx0RuTVYF*=u z6Vy-O6rKKv>=SXgf*_OIiBe|&Vp>b8(Yz2Z?OZ%nl5Lg7fx)IK63N?E>B4Kz?$UM; z*rss*TAXs>!jgj=TH08I)C_tkDtG2)-}3g;Ym7_z-RC#aon^rD^c-#(;-puFX!}ZX z1f#fPvkt_j=^6yl41kI!>&+UALc*D+ftfj#kEj{6!vvCSR&WJY!)OJ zT3&&-ZE>mQp`&-sie|bT*;6yZxz>rP2Bv{~ZMu5Ma>gS0vfbiS(`iE**Is_s>eFBW z*KNgtFY|Ct?S9XJr5`rQn}@VkN_}V*wIyrKp(-0GxraFk<{O%y%)J*jXzKU8H0OJC zMh}H2q>i|crI{ZT_$lbcoc7f`lAhi2{a7KOFkTp~b&u_=>fs~gT+Hl>*9vF9GtmK0 z+If(*CUW1{ZgSe`e08C@VB7(ktW)optV0E7DwvXDN+X_8v3THIRcOPTEMQ$x8yCZy zARxG3A4fcpT%A{TUe@{iJac60JdP^zGiVbK-g5g9JfzP(_Aw%)&mVHkNI;6!jsy9Dh07ScgiGFn75Y%-5QiWZ zs~t=d0FiZrm+p|aEcgAu!G*>DWQvVelyM~_czUZHJet-mOuq7f9QF6?{t7j@)QS_! z3N87Ku_JRxO0fUd5(T2_($SEGEIqn+Nr20q@Kcq=m4Xl@kFA*S^TlgL!3ykleHPag z8-^90dq0SAVF^FYV*lalGXLMOx`e3p7Bf2h&~p{&ZQi906GaWoRUqM4e)h|YPGF^`?hlxUfPddThd|w@qmg~QvOak^ zNRiL_RCMP)u^}-|KTcC{?5Wr>Lim$@E9OiI#eH$=0_SLQ`Uj^-i7zLhEfG0^n{yz^~(C?fG z-2oDhA7$uh8~PMX0w0j_lRyy0a8KN#WSdtA<8{KUq&7&ZX-_5xcJM#I2( z)TQQUR+FxKNi;f9XV9~l486)1m6=B{llyXE3jFqPooMzru5X8>Qr}veKjj~g`YAXq zl(8Hv?$fk-6|!3mo@7sUKa{o;hM%PpGoD2o{&=lCnt9Nl+W3m*VPFlrpqzFOUd*}W zb9J3+Qbhi$hlZA$7Yp~w#f6@ms62-+iG(Hwr!YBm{%pHDHbMen`XpRV9J!3)Ep07Y z)kABz{ZC1kr-yf{juzU_1VHuq(EWo) zRQ#U|f{-s_+d6X%adpC{~LAK)!cn1K+ zhd>9OH|Y5XV)cMg9$ucumG(JE(^7RuVT`d0SP7=C5TMu%Ji;`4&+Pz@cbn|a?l$TV znbft)nNE&f9^k}|y^EDNs!}6D+CN_-OF&E1beJ zcankT+55?;RtMMlyZRnKwrTGjw{f!_eiC2*ZRS3BgxJ`0&8xJ*Ko>{rz9jiX-6Nl` z&Hopd`P@K~zuZrqp6O%l<970NrC>fZ1=H72u^LC0(9hUdnu1E85?+nF>U|V)~@0u9%59;Gw(idgM}?9?8kjKR>t&QfP=9=`WUrM zR^wU@9>KzTidP;aL67BDe)7%jJy>Z6eVj}ZH@Kn2}aR;=Lk`) zw+Z)}gbg#2(zMRCDgjft0aeY-pfbKvv6w5l`n3HZ{W^eZ=??nyD$$%p{I$qqulFv2 zN_!1KxwKW)DtquUEqd1tOX2Frs`O&R`J@9;x?dG8bn(f^wErLKIKyU1myx$I2L`cY z{Sl~|RXc({$WYW9796Z`POO_?blZC2?8&A^yCMWyt28%Z4$h=OO6QdSSgUsu6`iEF zR2C^X{>NH%|BtnL6Xuw=5jnWda39JG%03->M^tV`_d5+ULexK9%#CsV;{GNIUV-ve z*tO&Rsv$>3l2jGjBc}RuDxhb6H1MEJ6FX>MGNS%1rAjd*Yml{7Uw~Dq{Pb71^@}{d z45Nyq7S`ZedlE%Udb_D!6EJhEFJBk2HcM{UU&l45@vG!^TJ5$umEBat%U>nLy1zIXYRq*l5yMr3_ze9KYc83f{eC zx&d$CBf1pkSNnI?dhU|?o%3(6O! z!HAeK6tKv`&IRVQ0Z~)juVc*%WJvh8-3nxuzu)wQ&lOneUAH?!cyPFSeT?H|)PTJ8(g3R^DXi+r>TA{z|<4<*$d)tt~+^RW)d^eDH&#$)?^jNG1 z>-E))26z2TnhG^4C3SMhO-yWlh;YsQUNcNO%IH7)V7gl_7O{|(%+DSez+{?mb+Q!Ak1|~NC>0~`@_XxIV zH4uo*Mz-`;mJFIUar$@c^?&=&Z8~lIEoH{!vt(hA&cKZ444G-N$rDJAN9R=YHoL0m zjQZ1inbK<$Yu_FsV36x?PBW>_LF2km&%GZ_c4Ul$*=?&{6MQ8W+cuQarZ!pCZHpqW z^}VB%hqGzCOYQU!4%@`d(AWAtkGQX=h*4N`CFgUaH_c}X42P5(_Wh1M_x2-m!??i!)6wQ4hG?qhYQFPz@h0Rr0&f7&&u{bFQ9l{=_shiLMw@PbryHujDoL^O-Zes z@U6km)}-$!7%g_b>AGpW1{=8R9Ul@>FP=~* zT(z26u7gzD#qR<-C)u}|MGowqxZO0w4$Ph;x?9R`EQl(2El#`%+mI$v@B=;-KGl^%_1c-8X7Vy%3QD-%J<1I_frY1ON24t@VBmcq
    oHJaZa%&cRgbKqQScY`o5It4F}rqGD>-kDeG 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/rebuild.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/rebuild.py new file mode 100644 index 0000000..684c658 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/dateutil/zoneinfo/rebuild.py @@ -0,0 +1,75 @@ +import logging +import os +import tempfile +import shutil +import json +from subprocess import check_call, check_output +from tarfile import TarFile + +from dateutil.zoneinfo import METADATA_FN, ZONEFILENAME + + +def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None): + """Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar* + + filename is the timezone tarball from ``ftp.iana.org/tz``. + + """ + tmpdir = tempfile.mkdtemp() + zonedir = os.path.join(tmpdir, "zoneinfo") + moduledir = os.path.dirname(__file__) + try: + with TarFile.open(filename) as tf: + for name in zonegroups: + tf.extract(name, tmpdir) + filepaths = [os.path.join(tmpdir, n) for n in zonegroups] + + _run_zic(zonedir, filepaths) + + # write metadata file + with open(os.path.join(zonedir, METADATA_FN), 'w') as f: + json.dump(metadata, f, indent=4, sort_keys=True) + target = os.path.join(moduledir, ZONEFILENAME) + with TarFile.open(target, "w:%s" % format) as tf: + for entry in os.listdir(zonedir): + entrypath = os.path.join(zonedir, entry) + tf.add(entrypath, entry) + finally: + shutil.rmtree(tmpdir) + + +def _run_zic(zonedir, filepaths): + """Calls the ``zic`` compiler in a compatible way to get a "fat" binary. + + Recent versions of ``zic`` default to ``-b slim``, while older versions + don't even have the ``-b`` option (but default to "fat" binaries). The + current version of dateutil does not support Version 2+ TZif files, which + causes problems when used in conjunction with "slim" binaries, so this + function is used to ensure that we always get a "fat" binary. + """ + + try: + help_text = check_output(["zic", "--help"]) + except OSError as e: + _print_on_nosuchfile(e) + raise + + if b"-b " in help_text: + bloat_args = ["-b", "fat"] + else: + bloat_args = [] + + check_call(["zic"] + bloat_args + ["-d", zonedir] + filepaths) + + +def _print_on_nosuchfile(e): + """Print helpful troubleshooting message + + e is an exception raised by subprocess.check_call() + + """ + if e.errno == 2: + logging.error( + "Could not find zic. Perhaps you need to install " + "libc-bin or some other package that provides it, " + "or it's not in your PATH?") diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__init__.py new file mode 100644 index 0000000..a40eeaf --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__init__.py @@ -0,0 +1,44 @@ +from .package_data import __version__ +from .core import ( + IDNABidiError, + IDNAError, + InvalidCodepoint, + InvalidCodepointContext, + alabel, + check_bidi, + check_hyphen_ok, + check_initial_combiner, + check_label, + check_nfc, + decode, + encode, + ulabel, + uts46_remap, + valid_contextj, + valid_contexto, + valid_label_length, + valid_string_length, +) +from .intranges import intranges_contain + +__all__ = [ + "IDNABidiError", + "IDNAError", + "InvalidCodepoint", + "InvalidCodepointContext", + "alabel", + "check_bidi", + "check_hyphen_ok", + "check_initial_combiner", + "check_label", + "check_nfc", + "decode", + "encode", + "intranges_contain", + "ulabel", + "uts46_remap", + "valid_contextj", + "valid_contexto", + "valid_label_length", + "valid_string_length", +] diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77681209984103eaebce371a136dfc8864e7ea21 GIT binary patch literal 837 zcmbu7%Wl*#6hM=CWG0hj-kl=;U?gZjMXV443X5(k5bDMo%Zc5LsUMN!88Lr@*zp5= zjJK@#1y=Yb6+&IG!BS4{y-x01XW1n1=h62s#fN?n`~c_Q(NeC^ zO0Lnm_170Ca)UNuPz7}GHAJU$_%YZQ3MSm7+_CZ&7v7zlb@J|5@0h~+)@?ci zSKM+UaH(a%6*DgB?45_WQ`AlABFai1+C@xt?|t`4vbW8%=h!ewYBz0D^v>EuKHbx` zTXy&DpI9(e*_~T;w#FK+sym}^%)*ywh^koAx+7d|SH=%BFay945CKMjF(3xOl3Y4!_p-qJ$Xt8ssfV2C1>PHHz_vZKBB=vgLz;^z( z&2Fo17>{YPzu7oh#Gd|+LKuQY#(?>3VEX33@~r{)`M~yVW(ZSQk>fl1?fNdhdE^Z$ zeq~VgtIUw@=7g}fm|y$c5RPyk8N!v$YJJ1<>xg)wf=C6CNkpa)sfr0iCJ>oMxeZrxZgl*QcNK>rLh^rX2djVXZxl&CK`{pe_U9%jONS}hTCu2%8_v|5mGrq z7VjVmx-wGEsCZXyE-im{10aDX_=BKs8a@+-Z=ye@w1kD7OD=8c^vzR7-x0QO9@!W#(%XA_YftYA z5A_%y^kYKV*Kzwj<)j&ey-aZtWC40bJ5H4YG8;kMv(WCi(U@buj(w+vA~yxQXTd~< zN4CjwbBk@Thb(956oo1?bDU=u$-apu`7%u4U(a5<9jBw=Fo8^pIc;z5ZV-zoj92Cs zeq3K@nmhQJ0WOLr2M1ru=_fDuv+4)_NR1c3q!GbCn7 zkT-=mNh8u~g;WWN~Q8=4!?rgE#K5491w9YPcInF3Iwkt($XmY?Q^Z-ty zc=9(k#acQQKo=fQ=Y!^pn(mB<o`@8E?B9mWe|jvg|r-1fOHgLT}Zi#siW$S1x7!^(qb$;TEhnuSz8}mVraRA3eHQ_9-18?ZX%43AL z2yK#hn*C`be=@%#KBk>>3BSEu6VJ2QLV&5TNmK6i*fvIY@GLXUG8^GcW%iGrT=UxV;H2EPe^Bt{M zoGxcT$P3NFWz?3YzLJ4JQ}7X@`{G_M{|PF(r2Lo!&5BdU!GT71_jT;)9E!|XWrAhq zhOugCiG?F`GB@*t`7@P1Yguu+bDFN=RHpTnqsy^sgk?=Ek_!%C#X*6pVOCxbEbZtV&?lthRd{wpeAUE?L_;fBqhYO24$|etO_MqJ zn7fbj7c3#%JfV0mfqm{2MM;yKt`fM0LYY{*oNR4~#it+@1y8xXWH1aPS!4+9R-L}4 zi;NV9i-g|)kss_b`+48!aP%gRI%eg4THKyjiJmFN;SAO?k4>|x*)SWkjrrO6Sw74E E0cF2Sz5oCK literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/compat.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/compat.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64088424625e2581763c02a9d25f34f98c2bfd41 GIT binary patch literal 737 zcmZ{izmL-}6vyrSYT8~8I1my{S%Z#Ck6RcJqB1h3g@ zpE+eu__f#gYrhHB0cRqBP=pX|0uhP9k6=BZP5=?a8}9`pB_t&lLsEuf1ilExm^w#d zLY5m8_JsVVxIH+X%tzP?m1*{cyEM^OEMDn1W&7 z*bQH@TfU(CB9NsLaLX|w?UvyYrN7JUN(1UlR;9|CN>&?%Te!$Te$kn^uH;r1Do2sk zRgtxwxmNPx?0lN(%E0S3FF)s7&{-v9o|UR;b92^qcCb>j<>h=HIueHzb3CT>ATByw z98z$g0vsrgUC%-8!-Oh3Tq*Lw$^D5(PJQA8t``s9uJ>jLe#5`>)LVQ#oqt@+k~h=o z+e9ePiBu-pnX0ZdBr2l~JXtiRkGnVG{`2KuP z-}61AZRywsr9!ZwV=rxFx|X~}_qx#8WPNSWhDB#U_g>kdt8>J>>;DklH3xPaeDYnR X#IA<-?g41mkIC@I{KR|dKllFu*+Qe? literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/core.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/core.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..915bbae62c4d8531632b580126583df32f51deb5 GIT binary patch literal 9580 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/intranges.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/intranges.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ee1025793ebd8bfdf67cb8da1a10c86183416e2 GIT binary patch literal 1974 zcmZuyTW=IM6t+Dxo6Y7zAOR9Ul?6r3Na-$tC#rB!i`tipNHXBOKF zq}mk^X{A2&N5EtMK!41<_9=g%FX?wYxjQXoc7L2<>~A`J zI9fP7#wDEm_s2zX5QEhY)1r{&c(|(#-4<0jkY-%k z4h~sWTAhs@)PA5VtA?Yo(-1a#WVF?#OI==-B<}XK>{n*kSzosQZgS8?rgy z_2;{>>~_0xSH9RIe@pus#!2+$SX-~^=IhkTH}XV%ColbVW%5B@riBmi(M|XyT|U(E zyY-?Ptl#o}$8ooF1bo=jSk&RS$V45z7>^2FN0gSNZW-;yrtD_O*x4Xx0Xh2$)BcXd zu?aimQ$Ao*q4+d#+=&T4#P13Fd2~;N_wN&mjl2VR{{oK0D3y|DY?8DgddG zyfV{-f=SDPwqJB4#t9I~9iRE+&KVR*gH1x<5E>iOjtQ_$=0@QZBwxeT=BLdUV61VD>t&G#Ej(i^KpwMOAN=GB8s236>2_}=~ zF7le<45>y>A&)dNYzl6FI$MeAwZ(|p7 zLvX}%^-PkeDoYY`17{dL7@_hF6^S8`>wr{Kefj`SfZMIA!YlZ|k#pGFTf<6?3;mGl V$u43ES$k%QeJ_SOIZ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/package_data.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/__pycache__/package_data.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1eee3ca5e5a2f2a0da9fa41e864da1683c53556c GIT binary patch literal 201 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 Tuple[bytes, int]: + if errors != 'strict': + raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + + if not data: + return b"", 0 + + return encode(data), len(data) + + def decode(self, data: bytes, errors: str = 'strict') -> Tuple[str, int]: + if errors != 'strict': + raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + + if not data: + return '', 0 + + return decode(data), len(data) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore + if errors != 'strict': + raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + + if not data: + return "", 0 + + labels = _unicode_dots_re.split(data) + trailing_dot = '' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result_str = '.'.join(result) + trailing_dot # type: ignore + size += len(trailing_dot) + return result_str, size + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore + if errors != 'strict': + raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + + if not data: + return ('', 0) + + labels = _unicode_dots_re.split(data) + trailing_dot = '' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result_str = '.'.join(result) + trailing_dot + size += len(trailing_dot) + return (result_str, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + + +class StreamReader(Codec, codecs.StreamReader): + pass + + +def getregentry() -> codecs.CodecInfo: + # Compatibility as a search_function for codecs.register() + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, # type: ignore + decode=Codec().decode, # type: ignore + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/compat.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/compat.py new file mode 100644 index 0000000..786e6bd --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/compat.py @@ -0,0 +1,13 @@ +from .core import * +from .codec import * +from typing import Any, Union + +def ToASCII(label: str) -> bytes: + return encode(label) + +def ToUnicode(label: Union[bytes, bytearray]) -> str: + return decode(label) + +def nameprep(s: Any) -> None: + raise NotImplementedError('IDNA 2008 does not utilise nameprep protocol') + diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/core.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/core.py new file mode 100644 index 0000000..55ab967 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/core.py @@ -0,0 +1,397 @@ +from . import idnadata +import bisect +import unicodedata +import re +from typing import Union, Optional +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b'xn--' +_unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]') + +class IDNAError(UnicodeError): + """ Base exception for all IDNA-encoding related problems """ + pass + + +class IDNABidiError(IDNAError): + """ Exception when bidirectional requirements are not satisfied """ + pass + + +class InvalidCodepoint(IDNAError): + """ Exception when a disallowed or unallocated codepoint is used """ + pass + + +class InvalidCodepointContext(IDNAError): + """ Exception when the codepoint is not valid in the context it is used """ + pass + + +def _combining_class(cp: int) -> int: + v = unicodedata.combining(chr(cp)) + if v == 0: + if not unicodedata.name(chr(cp)): + raise ValueError('Unknown character in unicodedata') + return v + +def _is_script(cp: str, script: str) -> bool: + return intranges_contain(ord(cp), idnadata.scripts[script]) + +def _punycode(s: str) -> bytes: + return s.encode('punycode') + +def _unot(s: int) -> str: + return 'U+{:04X}'.format(s) + + +def valid_label_length(label: Union[bytes, str]) -> bool: + if len(label) > 63: + return False + return True + + +def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool: + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label: str, check_ltr: bool = False) -> bool: + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == '': + # String likely comes from a newer version of Unicode + raise IDNABidiError('Unknown directionality in label {} at position {}'.format(repr(label), idx)) + if direction in ['R', 'AL', 'AN']: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ['R', 'AL']: + rtl = True + elif direction == 'L': + rtl = False + else: + raise IDNABidiError('First codepoint in label {} must be directionality L, R or AL'.format(repr(label))) + + valid_ending = False + number_type = None # type: Optional[str] + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {} in a left-to-right label'.format(idx)) + # Bidi rule 6 + if direction in ['L', 'EN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + + if not valid_ending: + raise IDNABidiError('Label ends with illegal codepoint directionality') + + return True + + +def check_initial_combiner(label: str) -> bool: + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +def check_hyphen_ok(label: str) -> bool: + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': + raise IDNAError('Label must not start or end with a hyphen') + return True + + +def check_nfc(label: str) -> None: + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +def valid_contextj(label: str, pos: int) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x200c: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos-1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('L'), ord('D')]: + ok = True + break + + if not ok: + return False + + ok = False + for i in range(pos+1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('R'), ord('D')]: + ok = True + break + return ok + + if cp_value == 0x200d: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + + return False + + +def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: + if 0 < pos < len(label)-1: + if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label)-1 and len(label) > 1: + return _is_script(label[pos + 1], 'Greek') + return False + + elif cp_value == 0x05f3 or cp_value == 0x05f4: + if pos > 0: + return _is_script(label[pos - 1], 'Hebrew') + return False + + elif cp_value == 0x30fb: + for cp in label: + if cp == '\u30fb': + continue + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6f0 <= ord(cp) <= 0x06f9: + return False + return True + + elif 0x6f0 <= cp_value <= 0x6f9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + return False + + +def check_label(label: Union[str, bytes, bytearray]) -> None: + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: + raise IDNAError('Empty Label') + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for (pos, cp) in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format( + _unot(cp_value), pos+1, repr(label))) + except ValueError: + raise IDNAError('Unknown codepoint adjacent to joiner {} at position {} in {}'.format( + _unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + raise InvalidCodepointContext('Codepoint {} not allowed at position {} in {}'.format(_unot(cp_value), pos+1, repr(label))) + else: + raise InvalidCodepoint('Codepoint {} at position {} of {} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + + check_bidi(label) + + +def alabel(label: str) -> bytes: + try: + label_bytes = label.encode('ascii') + ulabel(label_bytes) + if not valid_label_length(label_bytes): + raise IDNAError('Label too long') + return label_bytes + except UnicodeEncodeError: + pass + + if not label: + raise IDNAError('No Input') + + label = str(label) + check_label(label) + label_bytes = _punycode(label) + label_bytes = _alabel_prefix + label_bytes + + if not valid_label_length(label_bytes): + raise IDNAError('Label too long') + + return label_bytes + + +def ulabel(label: Union[str, bytes, bytearray]) -> str: + if not isinstance(label, (bytes, bytearray)): + try: + label_bytes = label.encode('ascii') + except UnicodeEncodeError: + check_label(label) + return label + else: + label_bytes = label + + label_bytes = label_bytes.lower() + if label_bytes.startswith(_alabel_prefix): + label_bytes = label_bytes[len(_alabel_prefix):] + if not label_bytes: + raise IDNAError('Malformed A-label, no Punycode eligible content found') + if label_bytes.decode('ascii')[-1] == '-': + raise IDNAError('A-label must not end with a hyphen') + else: + check_label(label_bytes) + return label_bytes.decode('ascii') + + try: + label = label_bytes.decode('punycode') + except UnicodeError: + raise IDNAError('Invalid A-label') + check_label(label) + return label + + +def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = '' + + for pos, char in enumerate(domain): + code_point = ord(char) + try: + uts46row = uts46data[code_point if code_point < 256 else + bisect.bisect_left(uts46data, (code_point, 'Z')) - 1] + status = uts46row[1] + replacement = None # type: Optional[str] + if len(uts46row) == 3: + replacement = uts46row[2] # type: ignore + if (status == 'V' or + (status == 'D' and not transitional) or + (status == '3' and not std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == 'M' or + (status == '3' and not std3_rules) or + (status == 'D' and transitional)): + output += replacement + elif status != 'I': + raise IndexError() + except IndexError: + raise InvalidCodepoint( + 'Codepoint {} not allowed at position {} in {}'.format( + _unot(code_point), pos + 1, repr(domain))) + + return unicodedata.normalize('NFC', output) + + +def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False, transitional: bool = False) -> bytes: + if isinstance(s, (bytes, bytearray)): + s = s.decode('ascii') + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split('.') + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(b'') + s = b'.'.join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError('Domain too long') + return s + + +def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False) -> str: + try: + if isinstance(s, (bytes, bytearray)): + s = s.decode('ascii') + except UnicodeDecodeError: + raise IDNAError('Invalid ASCII in A-label') + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split('.') + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append('') + return '.'.join(result) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/idnadata.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/idnadata.py new file mode 100644 index 0000000..1b5805d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/idnadata.py @@ -0,0 +1,2137 @@ +# This file is automatically generated by tools/idna-data + +__version__ = '14.0.0' +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x37f00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0xab650000ab66, + 0x101400001018f, + 0x101a0000101a1, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004dc0, + 0x4e000000a000, + 0xf9000000fa6e, + 0xfa700000fada, + 0x16fe200016fe4, + 0x16ff000016ff2, + 0x200000002a6e0, + 0x2a7000002b739, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + 0x300000003134b, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5ef000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b120, + 0x1b1500001b153, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1aff00001aff4, + 0x1aff50001affc, + 0x1affd0001afff, + 0x1b0000001b001, + 0x1b1200001b123, + 0x1b1640001b168, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x605: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x70f: 84, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 82, + 0x857: 82, + 0x858: 82, + 0x860: 68, + 0x861: 85, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x866: 85, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86a: 82, + 0x870: 82, + 0x871: 82, + 0x872: 82, + 0x873: 82, + 0x874: 82, + 0x875: 82, + 0x876: 82, + 0x877: 82, + 0x878: 82, + 0x879: 82, + 0x87a: 82, + 0x87b: 82, + 0x87c: 82, + 0x87d: 82, + 0x87e: 82, + 0x87f: 82, + 0x880: 82, + 0x881: 82, + 0x882: 82, + 0x883: 67, + 0x884: 67, + 0x885: 67, + 0x886: 68, + 0x887: 85, + 0x888: 85, + 0x889: 68, + 0x88a: 68, + 0x88b: 68, + 0x88c: 68, + 0x88d: 68, + 0x88e: 82, + 0x890: 85, + 0x891: 85, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x8ad: 85, + 0x8ae: 82, + 0x8af: 68, + 0x8b0: 68, + 0x8b1: 82, + 0x8b2: 82, + 0x8b3: 68, + 0x8b4: 68, + 0x8b5: 68, + 0x8b6: 68, + 0x8b7: 68, + 0x8b8: 68, + 0x8b9: 82, + 0x8ba: 68, + 0x8bb: 68, + 0x8bc: 68, + 0x8bd: 68, + 0x8be: 68, + 0x8bf: 68, + 0x8c0: 68, + 0x8c1: 68, + 0x8c2: 68, + 0x8c3: 68, + 0x8c4: 68, + 0x8c5: 68, + 0x8c6: 68, + 0x8c7: 68, + 0x8c8: 68, + 0x8e2: 85, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x202f: 85, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, + 0x10ac0: 68, + 0x10ac1: 68, + 0x10ac2: 68, + 0x10ac3: 68, + 0x10ac4: 68, + 0x10ac5: 82, + 0x10ac6: 85, + 0x10ac7: 82, + 0x10ac8: 85, + 0x10ac9: 82, + 0x10aca: 82, + 0x10acb: 85, + 0x10acc: 85, + 0x10acd: 76, + 0x10ace: 82, + 0x10acf: 82, + 0x10ad0: 82, + 0x10ad1: 82, + 0x10ad2: 82, + 0x10ad3: 68, + 0x10ad4: 68, + 0x10ad5: 68, + 0x10ad6: 68, + 0x10ad7: 76, + 0x10ad8: 68, + 0x10ad9: 68, + 0x10ada: 68, + 0x10adb: 68, + 0x10adc: 68, + 0x10add: 82, + 0x10ade: 68, + 0x10adf: 68, + 0x10ae0: 68, + 0x10ae1: 82, + 0x10ae2: 85, + 0x10ae3: 85, + 0x10ae4: 82, + 0x10aeb: 68, + 0x10aec: 68, + 0x10aed: 68, + 0x10aee: 68, + 0x10aef: 82, + 0x10b80: 68, + 0x10b81: 82, + 0x10b82: 68, + 0x10b83: 82, + 0x10b84: 82, + 0x10b85: 82, + 0x10b86: 68, + 0x10b87: 68, + 0x10b88: 68, + 0x10b89: 82, + 0x10b8a: 68, + 0x10b8b: 68, + 0x10b8c: 82, + 0x10b8d: 68, + 0x10b8e: 82, + 0x10b8f: 82, + 0x10b90: 68, + 0x10b91: 82, + 0x10ba9: 82, + 0x10baa: 82, + 0x10bab: 82, + 0x10bac: 82, + 0x10bad: 68, + 0x10bae: 68, + 0x10baf: 85, + 0x10d00: 76, + 0x10d01: 68, + 0x10d02: 68, + 0x10d03: 68, + 0x10d04: 68, + 0x10d05: 68, + 0x10d06: 68, + 0x10d07: 68, + 0x10d08: 68, + 0x10d09: 68, + 0x10d0a: 68, + 0x10d0b: 68, + 0x10d0c: 68, + 0x10d0d: 68, + 0x10d0e: 68, + 0x10d0f: 68, + 0x10d10: 68, + 0x10d11: 68, + 0x10d12: 68, + 0x10d13: 68, + 0x10d14: 68, + 0x10d15: 68, + 0x10d16: 68, + 0x10d17: 68, + 0x10d18: 68, + 0x10d19: 68, + 0x10d1a: 68, + 0x10d1b: 68, + 0x10d1c: 68, + 0x10d1d: 68, + 0x10d1e: 68, + 0x10d1f: 68, + 0x10d20: 68, + 0x10d21: 68, + 0x10d22: 82, + 0x10d23: 68, + 0x10f30: 68, + 0x10f31: 68, + 0x10f32: 68, + 0x10f33: 82, + 0x10f34: 68, + 0x10f35: 68, + 0x10f36: 68, + 0x10f37: 68, + 0x10f38: 68, + 0x10f39: 68, + 0x10f3a: 68, + 0x10f3b: 68, + 0x10f3c: 68, + 0x10f3d: 68, + 0x10f3e: 68, + 0x10f3f: 68, + 0x10f40: 68, + 0x10f41: 68, + 0x10f42: 68, + 0x10f43: 68, + 0x10f44: 68, + 0x10f45: 85, + 0x10f51: 68, + 0x10f52: 68, + 0x10f53: 68, + 0x10f54: 82, + 0x10f70: 68, + 0x10f71: 68, + 0x10f72: 68, + 0x10f73: 68, + 0x10f74: 82, + 0x10f75: 82, + 0x10f76: 68, + 0x10f77: 68, + 0x10f78: 68, + 0x10f79: 68, + 0x10f7a: 68, + 0x10f7b: 68, + 0x10f7c: 68, + 0x10f7d: 68, + 0x10f7e: 68, + 0x10f7f: 68, + 0x10f80: 68, + 0x10f81: 68, + 0x10fb0: 68, + 0x10fb1: 85, + 0x10fb2: 68, + 0x10fb3: 68, + 0x10fb4: 82, + 0x10fb5: 82, + 0x10fb6: 82, + 0x10fb7: 85, + 0x10fb8: 68, + 0x10fb9: 82, + 0x10fba: 82, + 0x10fbb: 68, + 0x10fbc: 68, + 0x10fbd: 82, + 0x10fbe: 68, + 0x10fbf: 68, + 0x10fc0: 85, + 0x10fc1: 68, + 0x10fc2: 82, + 0x10fc3: 82, + 0x10fc4: 68, + 0x10fc5: 85, + 0x10fc6: 85, + 0x10fc7: 85, + 0x10fc8: 85, + 0x10fc9: 82, + 0x10fca: 68, + 0x10fcb: 76, + 0x110bd: 85, + 0x110cd: 85, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, + 0x1e903: 68, + 0x1e904: 68, + 0x1e905: 68, + 0x1e906: 68, + 0x1e907: 68, + 0x1e908: 68, + 0x1e909: 68, + 0x1e90a: 68, + 0x1e90b: 68, + 0x1e90c: 68, + 0x1e90d: 68, + 0x1e90e: 68, + 0x1e90f: 68, + 0x1e910: 68, + 0x1e911: 68, + 0x1e912: 68, + 0x1e913: 68, + 0x1e914: 68, + 0x1e915: 68, + 0x1e916: 68, + 0x1e917: 68, + 0x1e918: 68, + 0x1e919: 68, + 0x1e91a: 68, + 0x1e91b: 68, + 0x1e91c: 68, + 0x1e91d: 68, + 0x1e91e: 68, + 0x1e91f: 68, + 0x1e920: 68, + 0x1e921: 68, + 0x1e922: 68, + 0x1e923: 68, + 0x1e924: 68, + 0x1e925: 68, + 0x1e926: 68, + 0x1e927: 68, + 0x1e928: 68, + 0x1e929: 68, + 0x1e92a: 68, + 0x1e92b: 68, + 0x1e92c: 68, + 0x1e92d: 68, + 0x1e92e: 68, + 0x1e92f: 68, + 0x1e930: 68, + 0x1e931: 68, + 0x1e932: 68, + 0x1e933: 68, + 0x1e934: 68, + 0x1e935: 68, + 0x1e936: 68, + 0x1e937: 68, + 0x1e938: 68, + 0x1e939: 68, + 0x1e93a: 68, + 0x1e93b: 68, + 0x1e93c: 68, + 0x1e93d: 68, + 0x1e93e: 68, + 0x1e93f: 68, + 0x1e940: 68, + 0x1e941: 68, + 0x1e942: 68, + 0x1e943: 68, + 0x1e94b: 84, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052a, + 0x52b0000052c, + 0x52d0000052e, + 0x52f00000530, + 0x5590000055a, + 0x56000000587, + 0x58800000589, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5ef000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x7fd000007fe, + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, + 0x87000000888, + 0x8890000088f, + 0x898000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0x9fc000009fd, + 0x9fe000009ff, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xaf900000b00, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5500000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0000000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c3a, + 0xc3c00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5b, + 0xc5d00000c5e, + 0xc6000000c64, + 0xc6600000c70, + 0xc8000000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcdd00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0000000d0d, + 0xd0e00000d11, + 0xd1200000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5400000d58, + 0xd5f00000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8100000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xde600000df0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8600000e8b, + 0xe8c00000ea4, + 0xea500000ea6, + 0xea700000eb3, + 0xeb400000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ece, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f6, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x16f1000016f9, + 0x170000001716, + 0x171f00001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001879, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191f, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1ab000001abe, + 0x1abf00001acf, + 0x1b0000001b4d, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cfb, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c60, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x310500003130, + 0x31a0000031c0, + 0x31f000003200, + 0x340000004dc0, + 0x4e000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa6990000a69a, + 0xa69b0000a69c, + 0xa69e0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a790, + 0xa7910000a792, + 0xa7930000a796, + 0xa7970000a798, + 0xa7990000a79a, + 0xa79b0000a79c, + 0xa79d0000a79e, + 0xa79f0000a7a0, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7af0000a7b0, + 0xa7b50000a7b6, + 0xa7b70000a7b8, + 0xa7b90000a7ba, + 0xa7bb0000a7bc, + 0xa7bd0000a7be, + 0xa7bf0000a7c0, + 0xa7c10000a7c2, + 0xa7c30000a7c4, + 0xa7c80000a7c9, + 0xa7ca0000a7cb, + 0xa7d10000a7d2, + 0xa7d30000a7d4, + 0xa7d50000a7d6, + 0xa7d70000a7d8, + 0xa7d90000a7da, + 0xa7f20000a7f5, + 0xa7f60000a7f8, + 0xa7fa0000a828, + 0xa82c0000a82d, + 0xa8400000a874, + 0xa8800000a8c6, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa8fd0000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xa9e00000a9ff, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xab300000ab5b, + 0xab600000ab6a, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe30, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x102e0000102e1, + 0x1030000010320, + 0x1032d00010341, + 0x103420001034a, + 0x103500001037b, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x104d8000104fc, + 0x1050000010528, + 0x1053000010564, + 0x10597000105a2, + 0x105a3000105b2, + 0x105b3000105ba, + 0x105bb000105bd, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1078000010786, + 0x10787000107b1, + 0x107b2000107bb, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1086000010877, + 0x108800001089f, + 0x108e0000108f3, + 0x108f4000108f6, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a36, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10a8000010a9d, + 0x10ac000010ac8, + 0x10ac900010ae7, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10b8000010b92, + 0x10c0000010c49, + 0x10cc000010cf3, + 0x10d0000010d28, + 0x10d3000010d3a, + 0x10e8000010eaa, + 0x10eab00010ead, + 0x10eb000010eb2, + 0x10f0000010f1d, + 0x10f2700010f28, + 0x10f3000010f51, + 0x10f7000010f86, + 0x10fb000010fc5, + 0x10fe000010ff7, + 0x1100000011047, + 0x1106600011076, + 0x1107f000110bb, + 0x110c2000110c3, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x1114400011148, + 0x1115000011174, + 0x1117600011177, + 0x11180000111c5, + 0x111c9000111cd, + 0x111ce000111db, + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, + 0x1123e0001123f, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, + 0x1128f0001129e, + 0x1129f000112a9, + 0x112b0000112eb, + 0x112f0000112fa, + 0x1130000011304, + 0x113050001130d, + 0x1130f00011311, + 0x1131300011329, + 0x1132a00011331, + 0x1133200011334, + 0x113350001133a, + 0x1133b00011345, + 0x1134700011349, + 0x1134b0001134e, + 0x1135000011351, + 0x1135700011358, + 0x1135d00011364, + 0x113660001136d, + 0x1137000011375, + 0x114000001144b, + 0x114500001145a, + 0x1145e00011462, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b9, + 0x116c0000116ca, + 0x117000001171b, + 0x1171d0001172c, + 0x117300001173a, + 0x1174000011747, + 0x118000001183b, + 0x118c0000118ea, + 0x118ff00011907, + 0x119090001190a, + 0x1190c00011914, + 0x1191500011917, + 0x1191800011936, + 0x1193700011939, + 0x1193b00011944, + 0x119500001195a, + 0x119a0000119a8, + 0x119aa000119d8, + 0x119da000119e2, + 0x119e3000119e5, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a9a, + 0x11a9d00011a9e, + 0x11ab000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x11d6000011d66, + 0x11d6700011d69, + 0x11d6a00011d8f, + 0x11d9000011d92, + 0x11d9300011d99, + 0x11da000011daa, + 0x11ee000011ef7, + 0x11fb000011fb1, + 0x120000001239a, + 0x1248000012544, + 0x12f9000012ff1, + 0x130000001342f, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16a7000016abf, + 0x16ac000016aca, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16e6000016e80, + 0x16f0000016f4b, + 0x16f4f00016f88, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x16fe300016fe5, + 0x16ff000016ff2, + 0x17000000187f8, + 0x1880000018cd6, + 0x18d0000018d09, + 0x1aff00001aff4, + 0x1aff50001affc, + 0x1affd0001afff, + 0x1b0000001b123, + 0x1b1500001b153, + 0x1b1640001b168, + 0x1b1700001b2fc, + 0x1bc000001bc6b, + 0x1bc700001bc7d, + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, + 0x1cf000001cf2e, + 0x1cf300001cf47, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1df000001df1f, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, + 0x1e1000001e12d, + 0x1e1300001e13e, + 0x1e1400001e14a, + 0x1e14e0001e14f, + 0x1e2900001e2af, + 0x1e2c00001e2fa, + 0x1e7e00001e7e7, + 0x1e7e80001e7ec, + 0x1e7ed0001e7ef, + 0x1e7f00001e7ff, + 0x1e8000001e8c5, + 0x1e8d00001e8d7, + 0x1e9220001e94c, + 0x1e9500001e95a, + 0x1fbf00001fbfa, + 0x200000002a6e0, + 0x2a7000002b739, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x300000003134b, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/intranges.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/intranges.py new file mode 100644 index 0000000..6a43b04 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/intranges.py @@ -0,0 +1,54 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect +from typing import List, Tuple + +def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i+1 < len(sorted_list): + if sorted_list[i] == sorted_list[i+1]-1: + continue + current_range = sorted_list[last_write+1:i+1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + +def _encode_range(start: int, end: int) -> int: + return (start << 32) | end + +def _decode_range(r: int) -> Tuple[int, int]: + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos-1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/package_data.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/package_data.py new file mode 100644 index 0000000..f5ea87c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '3.3' + diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/py.typed b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/uts46data.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/uts46data.py new file mode 100644 index 0000000..8f65705 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/idna/uts46data.py @@ -0,0 +1,8512 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +from typing import List, Tuple, Union + + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = '14.0.0' +def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', 'a'), + (0x42, 'M', 'b'), + (0x43, 'M', 'c'), + (0x44, 'M', 'd'), + (0x45, 'M', 'e'), + (0x46, 'M', 'f'), + (0x47, 'M', 'g'), + (0x48, 'M', 'h'), + (0x49, 'M', 'i'), + (0x4A, 'M', 'j'), + (0x4B, 'M', 'k'), + (0x4C, 'M', 'l'), + (0x4D, 'M', 'm'), + (0x4E, 'M', 'n'), + (0x4F, 'M', 'o'), + (0x50, 'M', 'p'), + (0x51, 'M', 'q'), + (0x52, 'M', 'r'), + (0x53, 'M', 's'), + (0x54, 'M', 't'), + (0x55, 'M', 'u'), + (0x56, 'M', 'v'), + (0x57, 'M', 'w'), + (0x58, 'M', 'x'), + (0x59, 'M', 'y'), + (0x5A, 'M', 'z'), + (0x5B, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (0x61, 'V'), + (0x62, 'V'), + (0x63, 'V'), + ] + +def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x64, 'V'), + (0x65, 'V'), + (0x66, 'V'), + (0x67, 'V'), + (0x68, 'V'), + (0x69, 'V'), + (0x6A, 'V'), + (0x6B, 'V'), + (0x6C, 'V'), + (0x6D, 'V'), + (0x6E, 'V'), + (0x6F, 'V'), + (0x70, 'V'), + (0x71, 'V'), + (0x72, 'V'), + (0x73, 'V'), + (0x74, 'V'), + (0x75, 'V'), + (0x76, 'V'), + (0x77, 'V'), + (0x78, 'V'), + (0x79, 'V'), + (0x7A, 'V'), + (0x7B, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', ' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', ' ̈'), + (0xA9, 'V'), + (0xAA, 'M', 'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', ' ̄'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', '2'), + (0xB3, 'M', '3'), + (0xB4, '3', ' ́'), + (0xB5, 'M', 'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', ' ̧'), + (0xB9, 'M', '1'), + (0xBA, 'M', 'o'), + (0xBB, 'V'), + (0xBC, 'M', '1⁄4'), + (0xBD, 'M', '1⁄2'), + (0xBE, 'M', '3⁄4'), + (0xBF, 'V'), + (0xC0, 'M', 'à'), + (0xC1, 'M', 'á'), + (0xC2, 'M', 'â'), + (0xC3, 'M', 'ã'), + (0xC4, 'M', 'ä'), + (0xC5, 'M', 'å'), + (0xC6, 'M', 'æ'), + (0xC7, 'M', 'ç'), + ] + +def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC8, 'M', 'è'), + (0xC9, 'M', 'é'), + (0xCA, 'M', 'ê'), + (0xCB, 'M', 'ë'), + (0xCC, 'M', 'ì'), + (0xCD, 'M', 'í'), + (0xCE, 'M', 'î'), + (0xCF, 'M', 'ï'), + (0xD0, 'M', 'ð'), + (0xD1, 'M', 'ñ'), + (0xD2, 'M', 'ò'), + (0xD3, 'M', 'ó'), + (0xD4, 'M', 'ô'), + (0xD5, 'M', 'õ'), + (0xD6, 'M', 'ö'), + (0xD7, 'V'), + (0xD8, 'M', 'ø'), + (0xD9, 'M', 'ù'), + (0xDA, 'M', 'ú'), + (0xDB, 'M', 'û'), + (0xDC, 'M', 'ü'), + (0xDD, 'M', 'ý'), + (0xDE, 'M', 'þ'), + (0xDF, 'D', 'ss'), + (0xE0, 'V'), + (0xE1, 'V'), + (0xE2, 'V'), + (0xE3, 'V'), + (0xE4, 'V'), + (0xE5, 'V'), + (0xE6, 'V'), + (0xE7, 'V'), + (0xE8, 'V'), + (0xE9, 'V'), + (0xEA, 'V'), + (0xEB, 'V'), + (0xEC, 'V'), + (0xED, 'V'), + (0xEE, 'V'), + (0xEF, 'V'), + (0xF0, 'V'), + (0xF1, 'V'), + (0xF2, 'V'), + (0xF3, 'V'), + (0xF4, 'V'), + (0xF5, 'V'), + (0xF6, 'V'), + (0xF7, 'V'), + (0xF8, 'V'), + (0xF9, 'V'), + (0xFA, 'V'), + (0xFB, 'V'), + (0xFC, 'V'), + (0xFD, 'V'), + (0xFE, 'V'), + (0xFF, 'V'), + (0x100, 'M', 'ā'), + (0x101, 'V'), + (0x102, 'M', 'ă'), + (0x103, 'V'), + (0x104, 'M', 'ą'), + (0x105, 'V'), + (0x106, 'M', 'ć'), + (0x107, 'V'), + (0x108, 'M', 'ĉ'), + (0x109, 'V'), + (0x10A, 'M', 'ċ'), + (0x10B, 'V'), + (0x10C, 'M', 'č'), + (0x10D, 'V'), + (0x10E, 'M', 'ď'), + (0x10F, 'V'), + (0x110, 'M', 'đ'), + (0x111, 'V'), + (0x112, 'M', 'ē'), + (0x113, 'V'), + (0x114, 'M', 'ĕ'), + (0x115, 'V'), + (0x116, 'M', 'ė'), + (0x117, 'V'), + (0x118, 'M', 'ę'), + (0x119, 'V'), + (0x11A, 'M', 'ě'), + (0x11B, 'V'), + (0x11C, 'M', 'ĝ'), + (0x11D, 'V'), + (0x11E, 'M', 'ğ'), + (0x11F, 'V'), + (0x120, 'M', 'ġ'), + (0x121, 'V'), + (0x122, 'M', 'ģ'), + (0x123, 'V'), + (0x124, 'M', 'ĥ'), + (0x125, 'V'), + (0x126, 'M', 'ħ'), + (0x127, 'V'), + (0x128, 'M', 'ĩ'), + (0x129, 'V'), + (0x12A, 'M', 'ī'), + (0x12B, 'V'), + ] + +def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x12C, 'M', 'ĭ'), + (0x12D, 'V'), + (0x12E, 'M', 'į'), + (0x12F, 'V'), + (0x130, 'M', 'i̇'), + (0x131, 'V'), + (0x132, 'M', 'ij'), + (0x134, 'M', 'ĵ'), + (0x135, 'V'), + (0x136, 'M', 'ķ'), + (0x137, 'V'), + (0x139, 'M', 'ĺ'), + (0x13A, 'V'), + (0x13B, 'M', 'ļ'), + (0x13C, 'V'), + (0x13D, 'M', 'ľ'), + (0x13E, 'V'), + (0x13F, 'M', 'l·'), + (0x141, 'M', 'ł'), + (0x142, 'V'), + (0x143, 'M', 'ń'), + (0x144, 'V'), + (0x145, 'M', 'ņ'), + (0x146, 'V'), + (0x147, 'M', 'ň'), + (0x148, 'V'), + (0x149, 'M', 'ʼn'), + (0x14A, 'M', 'ŋ'), + (0x14B, 'V'), + (0x14C, 'M', 'ō'), + (0x14D, 'V'), + (0x14E, 'M', 'ŏ'), + (0x14F, 'V'), + (0x150, 'M', 'ő'), + (0x151, 'V'), + (0x152, 'M', 'œ'), + (0x153, 'V'), + (0x154, 'M', 'ŕ'), + (0x155, 'V'), + (0x156, 'M', 'ŗ'), + (0x157, 'V'), + (0x158, 'M', 'ř'), + (0x159, 'V'), + (0x15A, 'M', 'ś'), + (0x15B, 'V'), + (0x15C, 'M', 'ŝ'), + (0x15D, 'V'), + (0x15E, 'M', 'ş'), + (0x15F, 'V'), + (0x160, 'M', 'š'), + (0x161, 'V'), + (0x162, 'M', 'ţ'), + (0x163, 'V'), + (0x164, 'M', 'ť'), + (0x165, 'V'), + (0x166, 'M', 'ŧ'), + (0x167, 'V'), + (0x168, 'M', 'ũ'), + (0x169, 'V'), + (0x16A, 'M', 'ū'), + (0x16B, 'V'), + (0x16C, 'M', 'ŭ'), + (0x16D, 'V'), + (0x16E, 'M', 'ů'), + (0x16F, 'V'), + (0x170, 'M', 'ű'), + (0x171, 'V'), + (0x172, 'M', 'ų'), + (0x173, 'V'), + (0x174, 'M', 'ŵ'), + (0x175, 'V'), + (0x176, 'M', 'ŷ'), + (0x177, 'V'), + (0x178, 'M', 'ÿ'), + (0x179, 'M', 'ź'), + (0x17A, 'V'), + (0x17B, 'M', 'ż'), + (0x17C, 'V'), + (0x17D, 'M', 'ž'), + (0x17E, 'V'), + (0x17F, 'M', 's'), + (0x180, 'V'), + (0x181, 'M', 'ɓ'), + (0x182, 'M', 'ƃ'), + (0x183, 'V'), + (0x184, 'M', 'ƅ'), + (0x185, 'V'), + (0x186, 'M', 'ɔ'), + (0x187, 'M', 'ƈ'), + (0x188, 'V'), + (0x189, 'M', 'ɖ'), + (0x18A, 'M', 'ɗ'), + (0x18B, 'M', 'ƌ'), + (0x18C, 'V'), + (0x18E, 'M', 'ǝ'), + (0x18F, 'M', 'ə'), + (0x190, 'M', 'ɛ'), + (0x191, 'M', 'ƒ'), + (0x192, 'V'), + (0x193, 'M', 'ɠ'), + ] + +def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x194, 'M', 'ɣ'), + (0x195, 'V'), + (0x196, 'M', 'ɩ'), + (0x197, 'M', 'ɨ'), + (0x198, 'M', 'ƙ'), + (0x199, 'V'), + (0x19C, 'M', 'ɯ'), + (0x19D, 'M', 'ɲ'), + (0x19E, 'V'), + (0x19F, 'M', 'ɵ'), + (0x1A0, 'M', 'ơ'), + (0x1A1, 'V'), + (0x1A2, 'M', 'ƣ'), + (0x1A3, 'V'), + (0x1A4, 'M', 'ƥ'), + (0x1A5, 'V'), + (0x1A6, 'M', 'ʀ'), + (0x1A7, 'M', 'ƨ'), + (0x1A8, 'V'), + (0x1A9, 'M', 'ʃ'), + (0x1AA, 'V'), + (0x1AC, 'M', 'ƭ'), + (0x1AD, 'V'), + (0x1AE, 'M', 'ʈ'), + (0x1AF, 'M', 'ư'), + (0x1B0, 'V'), + (0x1B1, 'M', 'ʊ'), + (0x1B2, 'M', 'ʋ'), + (0x1B3, 'M', 'ƴ'), + (0x1B4, 'V'), + (0x1B5, 'M', 'ƶ'), + (0x1B6, 'V'), + (0x1B7, 'M', 'ʒ'), + (0x1B8, 'M', 'ƹ'), + (0x1B9, 'V'), + (0x1BC, 'M', 'ƽ'), + (0x1BD, 'V'), + (0x1C4, 'M', 'dž'), + (0x1C7, 'M', 'lj'), + (0x1CA, 'M', 'nj'), + (0x1CD, 'M', 'ǎ'), + (0x1CE, 'V'), + (0x1CF, 'M', 'ǐ'), + (0x1D0, 'V'), + (0x1D1, 'M', 'ǒ'), + (0x1D2, 'V'), + (0x1D3, 'M', 'ǔ'), + (0x1D4, 'V'), + (0x1D5, 'M', 'ǖ'), + (0x1D6, 'V'), + (0x1D7, 'M', 'ǘ'), + (0x1D8, 'V'), + (0x1D9, 'M', 'ǚ'), + (0x1DA, 'V'), + (0x1DB, 'M', 'ǜ'), + (0x1DC, 'V'), + (0x1DE, 'M', 'ǟ'), + (0x1DF, 'V'), + (0x1E0, 'M', 'ǡ'), + (0x1E1, 'V'), + (0x1E2, 'M', 'ǣ'), + (0x1E3, 'V'), + (0x1E4, 'M', 'ǥ'), + (0x1E5, 'V'), + (0x1E6, 'M', 'ǧ'), + (0x1E7, 'V'), + (0x1E8, 'M', 'ǩ'), + (0x1E9, 'V'), + (0x1EA, 'M', 'ǫ'), + (0x1EB, 'V'), + (0x1EC, 'M', 'ǭ'), + (0x1ED, 'V'), + (0x1EE, 'M', 'ǯ'), + (0x1EF, 'V'), + (0x1F1, 'M', 'dz'), + (0x1F4, 'M', 'ǵ'), + (0x1F5, 'V'), + (0x1F6, 'M', 'ƕ'), + (0x1F7, 'M', 'ƿ'), + (0x1F8, 'M', 'ǹ'), + (0x1F9, 'V'), + (0x1FA, 'M', 'ǻ'), + (0x1FB, 'V'), + (0x1FC, 'M', 'ǽ'), + (0x1FD, 'V'), + (0x1FE, 'M', 'ǿ'), + (0x1FF, 'V'), + (0x200, 'M', 'ȁ'), + (0x201, 'V'), + (0x202, 'M', 'ȃ'), + (0x203, 'V'), + (0x204, 'M', 'ȅ'), + (0x205, 'V'), + (0x206, 'M', 'ȇ'), + (0x207, 'V'), + (0x208, 'M', 'ȉ'), + (0x209, 'V'), + (0x20A, 'M', 'ȋ'), + (0x20B, 'V'), + (0x20C, 'M', 'ȍ'), + ] + +def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x20D, 'V'), + (0x20E, 'M', 'ȏ'), + (0x20F, 'V'), + (0x210, 'M', 'ȑ'), + (0x211, 'V'), + (0x212, 'M', 'ȓ'), + (0x213, 'V'), + (0x214, 'M', 'ȕ'), + (0x215, 'V'), + (0x216, 'M', 'ȗ'), + (0x217, 'V'), + (0x218, 'M', 'ș'), + (0x219, 'V'), + (0x21A, 'M', 'ț'), + (0x21B, 'V'), + (0x21C, 'M', 'ȝ'), + (0x21D, 'V'), + (0x21E, 'M', 'ȟ'), + (0x21F, 'V'), + (0x220, 'M', 'ƞ'), + (0x221, 'V'), + (0x222, 'M', 'ȣ'), + (0x223, 'V'), + (0x224, 'M', 'ȥ'), + (0x225, 'V'), + (0x226, 'M', 'ȧ'), + (0x227, 'V'), + (0x228, 'M', 'ȩ'), + (0x229, 'V'), + (0x22A, 'M', 'ȫ'), + (0x22B, 'V'), + (0x22C, 'M', 'ȭ'), + (0x22D, 'V'), + (0x22E, 'M', 'ȯ'), + (0x22F, 'V'), + (0x230, 'M', 'ȱ'), + (0x231, 'V'), + (0x232, 'M', 'ȳ'), + (0x233, 'V'), + (0x23A, 'M', 'ⱥ'), + (0x23B, 'M', 'ȼ'), + (0x23C, 'V'), + (0x23D, 'M', 'ƚ'), + (0x23E, 'M', 'ⱦ'), + (0x23F, 'V'), + (0x241, 'M', 'ɂ'), + (0x242, 'V'), + (0x243, 'M', 'ƀ'), + (0x244, 'M', 'ʉ'), + (0x245, 'M', 'ʌ'), + (0x246, 'M', 'ɇ'), + (0x247, 'V'), + (0x248, 'M', 'ɉ'), + (0x249, 'V'), + (0x24A, 'M', 'ɋ'), + (0x24B, 'V'), + (0x24C, 'M', 'ɍ'), + (0x24D, 'V'), + (0x24E, 'M', 'ɏ'), + (0x24F, 'V'), + (0x2B0, 'M', 'h'), + (0x2B1, 'M', 'ɦ'), + (0x2B2, 'M', 'j'), + (0x2B3, 'M', 'r'), + (0x2B4, 'M', 'ɹ'), + (0x2B5, 'M', 'ɻ'), + (0x2B6, 'M', 'ʁ'), + (0x2B7, 'M', 'w'), + (0x2B8, 'M', 'y'), + (0x2B9, 'V'), + (0x2D8, '3', ' ̆'), + (0x2D9, '3', ' ̇'), + (0x2DA, '3', ' ̊'), + (0x2DB, '3', ' ̨'), + (0x2DC, '3', ' ̃'), + (0x2DD, '3', ' ̋'), + (0x2DE, 'V'), + (0x2E0, 'M', 'ɣ'), + (0x2E1, 'M', 'l'), + (0x2E2, 'M', 's'), + (0x2E3, 'M', 'x'), + (0x2E4, 'M', 'ʕ'), + (0x2E5, 'V'), + (0x340, 'M', '̀'), + (0x341, 'M', '́'), + (0x342, 'V'), + (0x343, 'M', '̓'), + (0x344, 'M', '̈́'), + (0x345, 'M', 'ι'), + (0x346, 'V'), + (0x34F, 'I'), + (0x350, 'V'), + (0x370, 'M', 'ͱ'), + (0x371, 'V'), + (0x372, 'M', 'ͳ'), + (0x373, 'V'), + (0x374, 'M', 'ʹ'), + (0x375, 'V'), + (0x376, 'M', 'ͷ'), + (0x377, 'V'), + ] + +def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x378, 'X'), + (0x37A, '3', ' ι'), + (0x37B, 'V'), + (0x37E, '3', ';'), + (0x37F, 'M', 'ϳ'), + (0x380, 'X'), + (0x384, '3', ' ́'), + (0x385, '3', ' ̈́'), + (0x386, 'M', 'ά'), + (0x387, 'M', '·'), + (0x388, 'M', 'έ'), + (0x389, 'M', 'ή'), + (0x38A, 'M', 'ί'), + (0x38B, 'X'), + (0x38C, 'M', 'ό'), + (0x38D, 'X'), + (0x38E, 'M', 'ύ'), + (0x38F, 'M', 'ώ'), + (0x390, 'V'), + (0x391, 'M', 'α'), + (0x392, 'M', 'β'), + (0x393, 'M', 'γ'), + (0x394, 'M', 'δ'), + (0x395, 'M', 'ε'), + (0x396, 'M', 'ζ'), + (0x397, 'M', 'η'), + (0x398, 'M', 'θ'), + (0x399, 'M', 'ι'), + (0x39A, 'M', 'κ'), + (0x39B, 'M', 'λ'), + (0x39C, 'M', 'μ'), + (0x39D, 'M', 'ν'), + (0x39E, 'M', 'ξ'), + (0x39F, 'M', 'ο'), + (0x3A0, 'M', 'π'), + (0x3A1, 'M', 'ρ'), + (0x3A2, 'X'), + (0x3A3, 'M', 'σ'), + (0x3A4, 'M', 'τ'), + (0x3A5, 'M', 'υ'), + (0x3A6, 'M', 'φ'), + (0x3A7, 'M', 'χ'), + (0x3A8, 'M', 'ψ'), + (0x3A9, 'M', 'ω'), + (0x3AA, 'M', 'ϊ'), + (0x3AB, 'M', 'ϋ'), + (0x3AC, 'V'), + (0x3C2, 'D', 'σ'), + (0x3C3, 'V'), + (0x3CF, 'M', 'ϗ'), + (0x3D0, 'M', 'β'), + (0x3D1, 'M', 'θ'), + (0x3D2, 'M', 'υ'), + (0x3D3, 'M', 'ύ'), + (0x3D4, 'M', 'ϋ'), + (0x3D5, 'M', 'φ'), + (0x3D6, 'M', 'π'), + (0x3D7, 'V'), + (0x3D8, 'M', 'ϙ'), + (0x3D9, 'V'), + (0x3DA, 'M', 'ϛ'), + (0x3DB, 'V'), + (0x3DC, 'M', 'ϝ'), + (0x3DD, 'V'), + (0x3DE, 'M', 'ϟ'), + (0x3DF, 'V'), + (0x3E0, 'M', 'ϡ'), + (0x3E1, 'V'), + (0x3E2, 'M', 'ϣ'), + (0x3E3, 'V'), + (0x3E4, 'M', 'ϥ'), + (0x3E5, 'V'), + (0x3E6, 'M', 'ϧ'), + (0x3E7, 'V'), + (0x3E8, 'M', 'ϩ'), + (0x3E9, 'V'), + (0x3EA, 'M', 'ϫ'), + (0x3EB, 'V'), + (0x3EC, 'M', 'ϭ'), + (0x3ED, 'V'), + (0x3EE, 'M', 'ϯ'), + (0x3EF, 'V'), + (0x3F0, 'M', 'κ'), + (0x3F1, 'M', 'ρ'), + (0x3F2, 'M', 'σ'), + (0x3F3, 'V'), + (0x3F4, 'M', 'θ'), + (0x3F5, 'M', 'ε'), + (0x3F6, 'V'), + (0x3F7, 'M', 'ϸ'), + (0x3F8, 'V'), + (0x3F9, 'M', 'σ'), + (0x3FA, 'M', 'ϻ'), + (0x3FB, 'V'), + (0x3FD, 'M', 'ͻ'), + (0x3FE, 'M', 'ͼ'), + (0x3FF, 'M', 'ͽ'), + (0x400, 'M', 'ѐ'), + (0x401, 'M', 'ё'), + (0x402, 'M', 'ђ'), + ] + +def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x403, 'M', 'ѓ'), + (0x404, 'M', 'є'), + (0x405, 'M', 'ѕ'), + (0x406, 'M', 'і'), + (0x407, 'M', 'ї'), + (0x408, 'M', 'ј'), + (0x409, 'M', 'љ'), + (0x40A, 'M', 'њ'), + (0x40B, 'M', 'ћ'), + (0x40C, 'M', 'ќ'), + (0x40D, 'M', 'ѝ'), + (0x40E, 'M', 'ў'), + (0x40F, 'M', 'џ'), + (0x410, 'M', 'а'), + (0x411, 'M', 'б'), + (0x412, 'M', 'в'), + (0x413, 'M', 'г'), + (0x414, 'M', 'д'), + (0x415, 'M', 'е'), + (0x416, 'M', 'ж'), + (0x417, 'M', 'з'), + (0x418, 'M', 'и'), + (0x419, 'M', 'й'), + (0x41A, 'M', 'к'), + (0x41B, 'M', 'л'), + (0x41C, 'M', 'м'), + (0x41D, 'M', 'н'), + (0x41E, 'M', 'о'), + (0x41F, 'M', 'п'), + (0x420, 'M', 'р'), + (0x421, 'M', 'с'), + (0x422, 'M', 'т'), + (0x423, 'M', 'у'), + (0x424, 'M', 'ф'), + (0x425, 'M', 'х'), + (0x426, 'M', 'ц'), + (0x427, 'M', 'ч'), + (0x428, 'M', 'ш'), + (0x429, 'M', 'щ'), + (0x42A, 'M', 'ъ'), + (0x42B, 'M', 'ы'), + (0x42C, 'M', 'ь'), + (0x42D, 'M', 'э'), + (0x42E, 'M', 'ю'), + (0x42F, 'M', 'я'), + (0x430, 'V'), + (0x460, 'M', 'ѡ'), + (0x461, 'V'), + (0x462, 'M', 'ѣ'), + (0x463, 'V'), + (0x464, 'M', 'ѥ'), + (0x465, 'V'), + (0x466, 'M', 'ѧ'), + (0x467, 'V'), + (0x468, 'M', 'ѩ'), + (0x469, 'V'), + (0x46A, 'M', 'ѫ'), + (0x46B, 'V'), + (0x46C, 'M', 'ѭ'), + (0x46D, 'V'), + (0x46E, 'M', 'ѯ'), + (0x46F, 'V'), + (0x470, 'M', 'ѱ'), + (0x471, 'V'), + (0x472, 'M', 'ѳ'), + (0x473, 'V'), + (0x474, 'M', 'ѵ'), + (0x475, 'V'), + (0x476, 'M', 'ѷ'), + (0x477, 'V'), + (0x478, 'M', 'ѹ'), + (0x479, 'V'), + (0x47A, 'M', 'ѻ'), + (0x47B, 'V'), + (0x47C, 'M', 'ѽ'), + (0x47D, 'V'), + (0x47E, 'M', 'ѿ'), + (0x47F, 'V'), + (0x480, 'M', 'ҁ'), + (0x481, 'V'), + (0x48A, 'M', 'ҋ'), + (0x48B, 'V'), + (0x48C, 'M', 'ҍ'), + (0x48D, 'V'), + (0x48E, 'M', 'ҏ'), + (0x48F, 'V'), + (0x490, 'M', 'ґ'), + (0x491, 'V'), + (0x492, 'M', 'ғ'), + (0x493, 'V'), + (0x494, 'M', 'ҕ'), + (0x495, 'V'), + (0x496, 'M', 'җ'), + (0x497, 'V'), + (0x498, 'M', 'ҙ'), + (0x499, 'V'), + (0x49A, 'M', 'қ'), + (0x49B, 'V'), + (0x49C, 'M', 'ҝ'), + (0x49D, 'V'), + ] + +def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x49E, 'M', 'ҟ'), + (0x49F, 'V'), + (0x4A0, 'M', 'ҡ'), + (0x4A1, 'V'), + (0x4A2, 'M', 'ң'), + (0x4A3, 'V'), + (0x4A4, 'M', 'ҥ'), + (0x4A5, 'V'), + (0x4A6, 'M', 'ҧ'), + (0x4A7, 'V'), + (0x4A8, 'M', 'ҩ'), + (0x4A9, 'V'), + (0x4AA, 'M', 'ҫ'), + (0x4AB, 'V'), + (0x4AC, 'M', 'ҭ'), + (0x4AD, 'V'), + (0x4AE, 'M', 'ү'), + (0x4AF, 'V'), + (0x4B0, 'M', 'ұ'), + (0x4B1, 'V'), + (0x4B2, 'M', 'ҳ'), + (0x4B3, 'V'), + (0x4B4, 'M', 'ҵ'), + (0x4B5, 'V'), + (0x4B6, 'M', 'ҷ'), + (0x4B7, 'V'), + (0x4B8, 'M', 'ҹ'), + (0x4B9, 'V'), + (0x4BA, 'M', 'һ'), + (0x4BB, 'V'), + (0x4BC, 'M', 'ҽ'), + (0x4BD, 'V'), + (0x4BE, 'M', 'ҿ'), + (0x4BF, 'V'), + (0x4C0, 'X'), + (0x4C1, 'M', 'ӂ'), + (0x4C2, 'V'), + (0x4C3, 'M', 'ӄ'), + (0x4C4, 'V'), + (0x4C5, 'M', 'ӆ'), + (0x4C6, 'V'), + (0x4C7, 'M', 'ӈ'), + (0x4C8, 'V'), + (0x4C9, 'M', 'ӊ'), + (0x4CA, 'V'), + (0x4CB, 'M', 'ӌ'), + (0x4CC, 'V'), + (0x4CD, 'M', 'ӎ'), + (0x4CE, 'V'), + (0x4D0, 'M', 'ӑ'), + (0x4D1, 'V'), + (0x4D2, 'M', 'ӓ'), + (0x4D3, 'V'), + (0x4D4, 'M', 'ӕ'), + (0x4D5, 'V'), + (0x4D6, 'M', 'ӗ'), + (0x4D7, 'V'), + (0x4D8, 'M', 'ә'), + (0x4D9, 'V'), + (0x4DA, 'M', 'ӛ'), + (0x4DB, 'V'), + (0x4DC, 'M', 'ӝ'), + (0x4DD, 'V'), + (0x4DE, 'M', 'ӟ'), + (0x4DF, 'V'), + (0x4E0, 'M', 'ӡ'), + (0x4E1, 'V'), + (0x4E2, 'M', 'ӣ'), + (0x4E3, 'V'), + (0x4E4, 'M', 'ӥ'), + (0x4E5, 'V'), + (0x4E6, 'M', 'ӧ'), + (0x4E7, 'V'), + (0x4E8, 'M', 'ө'), + (0x4E9, 'V'), + (0x4EA, 'M', 'ӫ'), + (0x4EB, 'V'), + (0x4EC, 'M', 'ӭ'), + (0x4ED, 'V'), + (0x4EE, 'M', 'ӯ'), + (0x4EF, 'V'), + (0x4F0, 'M', 'ӱ'), + (0x4F1, 'V'), + (0x4F2, 'M', 'ӳ'), + (0x4F3, 'V'), + (0x4F4, 'M', 'ӵ'), + (0x4F5, 'V'), + (0x4F6, 'M', 'ӷ'), + (0x4F7, 'V'), + (0x4F8, 'M', 'ӹ'), + (0x4F9, 'V'), + (0x4FA, 'M', 'ӻ'), + (0x4FB, 'V'), + (0x4FC, 'M', 'ӽ'), + (0x4FD, 'V'), + (0x4FE, 'M', 'ӿ'), + (0x4FF, 'V'), + (0x500, 'M', 'ԁ'), + (0x501, 'V'), + (0x502, 'M', 'ԃ'), + ] + +def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x503, 'V'), + (0x504, 'M', 'ԅ'), + (0x505, 'V'), + (0x506, 'M', 'ԇ'), + (0x507, 'V'), + (0x508, 'M', 'ԉ'), + (0x509, 'V'), + (0x50A, 'M', 'ԋ'), + (0x50B, 'V'), + (0x50C, 'M', 'ԍ'), + (0x50D, 'V'), + (0x50E, 'M', 'ԏ'), + (0x50F, 'V'), + (0x510, 'M', 'ԑ'), + (0x511, 'V'), + (0x512, 'M', 'ԓ'), + (0x513, 'V'), + (0x514, 'M', 'ԕ'), + (0x515, 'V'), + (0x516, 'M', 'ԗ'), + (0x517, 'V'), + (0x518, 'M', 'ԙ'), + (0x519, 'V'), + (0x51A, 'M', 'ԛ'), + (0x51B, 'V'), + (0x51C, 'M', 'ԝ'), + (0x51D, 'V'), + (0x51E, 'M', 'ԟ'), + (0x51F, 'V'), + (0x520, 'M', 'ԡ'), + (0x521, 'V'), + (0x522, 'M', 'ԣ'), + (0x523, 'V'), + (0x524, 'M', 'ԥ'), + (0x525, 'V'), + (0x526, 'M', 'ԧ'), + (0x527, 'V'), + (0x528, 'M', 'ԩ'), + (0x529, 'V'), + (0x52A, 'M', 'ԫ'), + (0x52B, 'V'), + (0x52C, 'M', 'ԭ'), + (0x52D, 'V'), + (0x52E, 'M', 'ԯ'), + (0x52F, 'V'), + (0x530, 'X'), + (0x531, 'M', 'ա'), + (0x532, 'M', 'բ'), + (0x533, 'M', 'գ'), + (0x534, 'M', 'դ'), + (0x535, 'M', 'ե'), + (0x536, 'M', 'զ'), + (0x537, 'M', 'է'), + (0x538, 'M', 'ը'), + (0x539, 'M', 'թ'), + (0x53A, 'M', 'ժ'), + (0x53B, 'M', 'ի'), + (0x53C, 'M', 'լ'), + (0x53D, 'M', 'խ'), + (0x53E, 'M', 'ծ'), + (0x53F, 'M', 'կ'), + (0x540, 'M', 'հ'), + (0x541, 'M', 'ձ'), + (0x542, 'M', 'ղ'), + (0x543, 'M', 'ճ'), + (0x544, 'M', 'մ'), + (0x545, 'M', 'յ'), + (0x546, 'M', 'ն'), + (0x547, 'M', 'շ'), + (0x548, 'M', 'ո'), + (0x549, 'M', 'չ'), + (0x54A, 'M', 'պ'), + (0x54B, 'M', 'ջ'), + (0x54C, 'M', 'ռ'), + (0x54D, 'M', 'ս'), + (0x54E, 'M', 'վ'), + (0x54F, 'M', 'տ'), + (0x550, 'M', 'ր'), + (0x551, 'M', 'ց'), + (0x552, 'M', 'ւ'), + (0x553, 'M', 'փ'), + (0x554, 'M', 'ք'), + (0x555, 'M', 'օ'), + (0x556, 'M', 'ֆ'), + (0x557, 'X'), + (0x559, 'V'), + (0x587, 'M', 'եւ'), + (0x588, 'V'), + (0x58B, 'X'), + (0x58D, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5EF, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61D, 'V'), + ] + +def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x675, 'M', 'اٴ'), + (0x676, 'M', 'وٴ'), + (0x677, 'M', 'ۇٴ'), + (0x678, 'M', 'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x7FD, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x860, 'V'), + (0x86B, 'X'), + (0x870, 'V'), + (0x88F, 'X'), + (0x898, 'V'), + (0x8E2, 'X'), + (0x8E3, 'V'), + (0x958, 'M', 'क़'), + (0x959, 'M', 'ख़'), + (0x95A, 'M', 'ग़'), + (0x95B, 'M', 'ज़'), + (0x95C, 'M', 'ड़'), + (0x95D, 'M', 'ढ़'), + (0x95E, 'M', 'फ़'), + (0x95F, 'M', 'य़'), + (0x960, 'V'), + (0x984, 'X'), + (0x985, 'V'), + (0x98D, 'X'), + (0x98F, 'V'), + (0x991, 'X'), + (0x993, 'V'), + (0x9A9, 'X'), + (0x9AA, 'V'), + (0x9B1, 'X'), + (0x9B2, 'V'), + (0x9B3, 'X'), + (0x9B6, 'V'), + (0x9BA, 'X'), + (0x9BC, 'V'), + (0x9C5, 'X'), + (0x9C7, 'V'), + (0x9C9, 'X'), + (0x9CB, 'V'), + (0x9CF, 'X'), + (0x9D7, 'V'), + (0x9D8, 'X'), + (0x9DC, 'M', 'ড়'), + (0x9DD, 'M', 'ঢ়'), + (0x9DE, 'X'), + (0x9DF, 'M', 'য়'), + (0x9E0, 'V'), + (0x9E4, 'X'), + (0x9E6, 'V'), + (0x9FF, 'X'), + (0xA01, 'V'), + (0xA04, 'X'), + (0xA05, 'V'), + (0xA0B, 'X'), + (0xA0F, 'V'), + (0xA11, 'X'), + (0xA13, 'V'), + (0xA29, 'X'), + (0xA2A, 'V'), + (0xA31, 'X'), + (0xA32, 'V'), + (0xA33, 'M', 'ਲ਼'), + (0xA34, 'X'), + (0xA35, 'V'), + (0xA36, 'M', 'ਸ਼'), + (0xA37, 'X'), + (0xA38, 'V'), + (0xA3A, 'X'), + (0xA3C, 'V'), + (0xA3D, 'X'), + (0xA3E, 'V'), + (0xA43, 'X'), + (0xA47, 'V'), + (0xA49, 'X'), + (0xA4B, 'V'), + (0xA4E, 'X'), + (0xA51, 'V'), + (0xA52, 'X'), + (0xA59, 'M', 'ਖ਼'), + (0xA5A, 'M', 'ਗ਼'), + (0xA5B, 'M', 'ਜ਼'), + (0xA5C, 'V'), + (0xA5D, 'X'), + ] + +def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA5E, 'M', 'ਫ਼'), + (0xA5F, 'X'), + (0xA66, 'V'), + (0xA77, 'X'), + (0xA81, 'V'), + (0xA84, 'X'), + (0xA85, 'V'), + (0xA8E, 'X'), + (0xA8F, 'V'), + (0xA92, 'X'), + (0xA93, 'V'), + (0xAA9, 'X'), + (0xAAA, 'V'), + (0xAB1, 'X'), + (0xAB2, 'V'), + (0xAB4, 'X'), + (0xAB5, 'V'), + (0xABA, 'X'), + (0xABC, 'V'), + (0xAC6, 'X'), + (0xAC7, 'V'), + (0xACA, 'X'), + (0xACB, 'V'), + (0xACE, 'X'), + (0xAD0, 'V'), + (0xAD1, 'X'), + (0xAE0, 'V'), + (0xAE4, 'X'), + (0xAE6, 'V'), + (0xAF2, 'X'), + (0xAF9, 'V'), + (0xB00, 'X'), + (0xB01, 'V'), + (0xB04, 'X'), + (0xB05, 'V'), + (0xB0D, 'X'), + (0xB0F, 'V'), + (0xB11, 'X'), + (0xB13, 'V'), + (0xB29, 'X'), + (0xB2A, 'V'), + (0xB31, 'X'), + (0xB32, 'V'), + (0xB34, 'X'), + (0xB35, 'V'), + (0xB3A, 'X'), + (0xB3C, 'V'), + (0xB45, 'X'), + (0xB47, 'V'), + (0xB49, 'X'), + (0xB4B, 'V'), + (0xB4E, 'X'), + (0xB55, 'V'), + (0xB58, 'X'), + (0xB5C, 'M', 'ଡ଼'), + (0xB5D, 'M', 'ଢ଼'), + (0xB5E, 'X'), + (0xB5F, 'V'), + (0xB64, 'X'), + (0xB66, 'V'), + (0xB78, 'X'), + (0xB82, 'V'), + (0xB84, 'X'), + (0xB85, 'V'), + (0xB8B, 'X'), + (0xB8E, 'V'), + (0xB91, 'X'), + (0xB92, 'V'), + (0xB96, 'X'), + (0xB99, 'V'), + (0xB9B, 'X'), + (0xB9C, 'V'), + (0xB9D, 'X'), + (0xB9E, 'V'), + (0xBA0, 'X'), + (0xBA3, 'V'), + (0xBA5, 'X'), + (0xBA8, 'V'), + (0xBAB, 'X'), + (0xBAE, 'V'), + (0xBBA, 'X'), + (0xBBE, 'V'), + (0xBC3, 'X'), + (0xBC6, 'V'), + (0xBC9, 'X'), + (0xBCA, 'V'), + (0xBCE, 'X'), + (0xBD0, 'V'), + (0xBD1, 'X'), + (0xBD7, 'V'), + (0xBD8, 'X'), + (0xBE6, 'V'), + (0xBFB, 'X'), + (0xC00, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + (0xC29, 'X'), + (0xC2A, 'V'), + ] + +def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC3A, 'X'), + (0xC3C, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5B, 'X'), + (0xC5D, 'V'), + (0xC5E, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC77, 'V'), + (0xC8D, 'X'), + (0xC8E, 'V'), + (0xC91, 'X'), + (0xC92, 'V'), + (0xCA9, 'X'), + (0xCAA, 'V'), + (0xCB4, 'X'), + (0xCB5, 'V'), + (0xCBA, 'X'), + (0xCBC, 'V'), + (0xCC5, 'X'), + (0xCC6, 'V'), + (0xCC9, 'X'), + (0xCCA, 'V'), + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), + (0xCDD, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), + (0xCF3, 'X'), + (0xD00, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD50, 'X'), + (0xD54, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD80, 'X'), + (0xD81, 'V'), + (0xD84, 'X'), + (0xD85, 'V'), + (0xD97, 'X'), + (0xD9A, 'V'), + (0xDB2, 'X'), + (0xDB3, 'V'), + (0xDBC, 'X'), + (0xDBD, 'V'), + (0xDBE, 'X'), + (0xDC0, 'V'), + (0xDC7, 'X'), + (0xDCA, 'V'), + (0xDCB, 'X'), + (0xDCF, 'V'), + (0xDD5, 'X'), + (0xDD6, 'V'), + (0xDD7, 'X'), + (0xDD8, 'V'), + (0xDE0, 'X'), + (0xDE6, 'V'), + (0xDF0, 'X'), + (0xDF2, 'V'), + (0xDF5, 'X'), + (0xE01, 'V'), + (0xE33, 'M', 'ํา'), + (0xE34, 'V'), + (0xE3B, 'X'), + (0xE3F, 'V'), + (0xE5C, 'X'), + (0xE81, 'V'), + (0xE83, 'X'), + (0xE84, 'V'), + (0xE85, 'X'), + (0xE86, 'V'), + (0xE8B, 'X'), + (0xE8C, 'V'), + (0xEA4, 'X'), + (0xEA5, 'V'), + (0xEA6, 'X'), + (0xEA7, 'V'), + (0xEB3, 'M', 'ໍາ'), + (0xEB4, 'V'), + ] + +def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xEBE, 'X'), + (0xEC0, 'V'), + (0xEC5, 'X'), + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), + (0xECE, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', 'ຫນ'), + (0xEDD, 'M', 'ຫມ'), + (0xEDE, 'V'), + (0xEE0, 'X'), + (0xF00, 'V'), + (0xF0C, 'M', '་'), + (0xF0D, 'V'), + (0xF43, 'M', 'གྷ'), + (0xF44, 'V'), + (0xF48, 'X'), + (0xF49, 'V'), + (0xF4D, 'M', 'ཌྷ'), + (0xF4E, 'V'), + (0xF52, 'M', 'དྷ'), + (0xF53, 'V'), + (0xF57, 'M', 'བྷ'), + (0xF58, 'V'), + (0xF5C, 'M', 'ཛྷ'), + (0xF5D, 'V'), + (0xF69, 'M', 'ཀྵ'), + (0xF6A, 'V'), + (0xF6D, 'X'), + (0xF71, 'V'), + (0xF73, 'M', 'ཱི'), + (0xF74, 'V'), + (0xF75, 'M', 'ཱུ'), + (0xF76, 'M', 'ྲྀ'), + (0xF77, 'M', 'ྲཱྀ'), + (0xF78, 'M', 'ླྀ'), + (0xF79, 'M', 'ླཱྀ'), + (0xF7A, 'V'), + (0xF81, 'M', 'ཱྀ'), + (0xF82, 'V'), + (0xF93, 'M', 'ྒྷ'), + (0xF94, 'V'), + (0xF98, 'X'), + (0xF99, 'V'), + (0xF9D, 'M', 'ྜྷ'), + (0xF9E, 'V'), + (0xFA2, 'M', 'ྡྷ'), + (0xFA3, 'V'), + (0xFA7, 'M', 'ྦྷ'), + (0xFA8, 'V'), + (0xFAC, 'M', 'ྫྷ'), + (0xFAD, 'V'), + (0xFB9, 'M', 'ྐྵ'), + (0xFBA, 'V'), + (0xFBD, 'X'), + (0xFBE, 'V'), + (0xFCD, 'X'), + (0xFCE, 'V'), + (0xFDB, 'X'), + (0x1000, 'V'), + (0x10A0, 'X'), + (0x10C7, 'M', 'ⴧ'), + (0x10C8, 'X'), + (0x10CD, 'M', 'ⴭ'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', 'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + (0x1258, 'V'), + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + (0x128E, 'X'), + (0x1290, 'V'), + (0x12B1, 'X'), + (0x12B2, 'V'), + (0x12B6, 'X'), + (0x12B8, 'V'), + (0x12BF, 'X'), + (0x12C0, 'V'), + (0x12C1, 'X'), + (0x12C2, 'V'), + (0x12C6, 'X'), + (0x12C8, 'V'), + (0x12D7, 'X'), + (0x12D8, 'V'), + (0x1311, 'X'), + (0x1312, 'V'), + ] + +def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1316, 'X'), + (0x1318, 'V'), + (0x135B, 'X'), + (0x135D, 'V'), + (0x137D, 'X'), + (0x1380, 'V'), + (0x139A, 'X'), + (0x13A0, 'V'), + (0x13F6, 'X'), + (0x13F8, 'M', 'Ᏸ'), + (0x13F9, 'M', 'Ᏹ'), + (0x13FA, 'M', 'Ᏺ'), + (0x13FB, 'M', 'Ᏻ'), + (0x13FC, 'M', 'Ᏼ'), + (0x13FD, 'M', 'Ᏽ'), + (0x13FE, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F9, 'X'), + (0x1700, 'V'), + (0x1716, 'X'), + (0x171F, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), + (0x1760, 'V'), + (0x176D, 'X'), + (0x176E, 'V'), + (0x1771, 'X'), + (0x1772, 'V'), + (0x1774, 'X'), + (0x1780, 'V'), + (0x17B4, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x180F, 'I'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), + (0x1879, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191F, 'X'), + (0x1920, 'V'), + (0x192C, 'X'), + (0x1930, 'V'), + (0x193C, 'X'), + (0x1940, 'V'), + (0x1941, 'X'), + (0x1944, 'V'), + (0x196E, 'X'), + (0x1970, 'V'), + (0x1975, 'X'), + (0x1980, 'V'), + (0x19AC, 'X'), + (0x19B0, 'V'), + (0x19CA, 'X'), + (0x19D0, 'V'), + (0x19DB, 'X'), + (0x19DE, 'V'), + (0x1A1C, 'X'), + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + (0x1A9A, 'X'), + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1AB0, 'V'), + (0x1ACF, 'X'), + (0x1B00, 'V'), + (0x1B4D, 'X'), + (0x1B50, 'V'), + (0x1B7F, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'M', 'в'), + ] + +def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1C81, 'M', 'д'), + (0x1C82, 'M', 'о'), + (0x1C83, 'M', 'с'), + (0x1C84, 'M', 'т'), + (0x1C86, 'M', 'ъ'), + (0x1C87, 'M', 'ѣ'), + (0x1C88, 'M', 'ꙋ'), + (0x1C89, 'X'), + (0x1C90, 'M', 'ა'), + (0x1C91, 'M', 'ბ'), + (0x1C92, 'M', 'გ'), + (0x1C93, 'M', 'დ'), + (0x1C94, 'M', 'ე'), + (0x1C95, 'M', 'ვ'), + (0x1C96, 'M', 'ზ'), + (0x1C97, 'M', 'თ'), + (0x1C98, 'M', 'ი'), + (0x1C99, 'M', 'კ'), + (0x1C9A, 'M', 'ლ'), + (0x1C9B, 'M', 'მ'), + (0x1C9C, 'M', 'ნ'), + (0x1C9D, 'M', 'ო'), + (0x1C9E, 'M', 'პ'), + (0x1C9F, 'M', 'ჟ'), + (0x1CA0, 'M', 'რ'), + (0x1CA1, 'M', 'ს'), + (0x1CA2, 'M', 'ტ'), + (0x1CA3, 'M', 'უ'), + (0x1CA4, 'M', 'ფ'), + (0x1CA5, 'M', 'ქ'), + (0x1CA6, 'M', 'ღ'), + (0x1CA7, 'M', 'ყ'), + (0x1CA8, 'M', 'შ'), + (0x1CA9, 'M', 'ჩ'), + (0x1CAA, 'M', 'ც'), + (0x1CAB, 'M', 'ძ'), + (0x1CAC, 'M', 'წ'), + (0x1CAD, 'M', 'ჭ'), + (0x1CAE, 'M', 'ხ'), + (0x1CAF, 'M', 'ჯ'), + (0x1CB0, 'M', 'ჰ'), + (0x1CB1, 'M', 'ჱ'), + (0x1CB2, 'M', 'ჲ'), + (0x1CB3, 'M', 'ჳ'), + (0x1CB4, 'M', 'ჴ'), + (0x1CB5, 'M', 'ჵ'), + (0x1CB6, 'M', 'ჶ'), + (0x1CB7, 'M', 'ჷ'), + (0x1CB8, 'M', 'ჸ'), + (0x1CB9, 'M', 'ჹ'), + (0x1CBA, 'M', 'ჺ'), + (0x1CBB, 'X'), + (0x1CBD, 'M', 'ჽ'), + (0x1CBE, 'M', 'ჾ'), + (0x1CBF, 'M', 'ჿ'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CFB, 'X'), + (0x1D00, 'V'), + (0x1D2C, 'M', 'a'), + (0x1D2D, 'M', 'æ'), + (0x1D2E, 'M', 'b'), + (0x1D2F, 'V'), + (0x1D30, 'M', 'd'), + (0x1D31, 'M', 'e'), + (0x1D32, 'M', 'ǝ'), + (0x1D33, 'M', 'g'), + (0x1D34, 'M', 'h'), + (0x1D35, 'M', 'i'), + (0x1D36, 'M', 'j'), + (0x1D37, 'M', 'k'), + (0x1D38, 'M', 'l'), + (0x1D39, 'M', 'm'), + (0x1D3A, 'M', 'n'), + (0x1D3B, 'V'), + (0x1D3C, 'M', 'o'), + (0x1D3D, 'M', 'ȣ'), + (0x1D3E, 'M', 'p'), + (0x1D3F, 'M', 'r'), + (0x1D40, 'M', 't'), + (0x1D41, 'M', 'u'), + (0x1D42, 'M', 'w'), + (0x1D43, 'M', 'a'), + (0x1D44, 'M', 'ɐ'), + (0x1D45, 'M', 'ɑ'), + (0x1D46, 'M', 'ᴂ'), + (0x1D47, 'M', 'b'), + (0x1D48, 'M', 'd'), + (0x1D49, 'M', 'e'), + (0x1D4A, 'M', 'ə'), + (0x1D4B, 'M', 'ɛ'), + (0x1D4C, 'M', 'ɜ'), + (0x1D4D, 'M', 'g'), + (0x1D4E, 'V'), + (0x1D4F, 'M', 'k'), + (0x1D50, 'M', 'm'), + (0x1D51, 'M', 'ŋ'), + (0x1D52, 'M', 'o'), + (0x1D53, 'M', 'ɔ'), + ] + +def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D54, 'M', 'ᴖ'), + (0x1D55, 'M', 'ᴗ'), + (0x1D56, 'M', 'p'), + (0x1D57, 'M', 't'), + (0x1D58, 'M', 'u'), + (0x1D59, 'M', 'ᴝ'), + (0x1D5A, 'M', 'ɯ'), + (0x1D5B, 'M', 'v'), + (0x1D5C, 'M', 'ᴥ'), + (0x1D5D, 'M', 'β'), + (0x1D5E, 'M', 'γ'), + (0x1D5F, 'M', 'δ'), + (0x1D60, 'M', 'φ'), + (0x1D61, 'M', 'χ'), + (0x1D62, 'M', 'i'), + (0x1D63, 'M', 'r'), + (0x1D64, 'M', 'u'), + (0x1D65, 'M', 'v'), + (0x1D66, 'M', 'β'), + (0x1D67, 'M', 'γ'), + (0x1D68, 'M', 'ρ'), + (0x1D69, 'M', 'φ'), + (0x1D6A, 'M', 'χ'), + (0x1D6B, 'V'), + (0x1D78, 'M', 'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', 'ɒ'), + (0x1D9C, 'M', 'c'), + (0x1D9D, 'M', 'ɕ'), + (0x1D9E, 'M', 'ð'), + (0x1D9F, 'M', 'ɜ'), + (0x1DA0, 'M', 'f'), + (0x1DA1, 'M', 'ɟ'), + (0x1DA2, 'M', 'ɡ'), + (0x1DA3, 'M', 'ɥ'), + (0x1DA4, 'M', 'ɨ'), + (0x1DA5, 'M', 'ɩ'), + (0x1DA6, 'M', 'ɪ'), + (0x1DA7, 'M', 'ᵻ'), + (0x1DA8, 'M', 'ʝ'), + (0x1DA9, 'M', 'ɭ'), + (0x1DAA, 'M', 'ᶅ'), + (0x1DAB, 'M', 'ʟ'), + (0x1DAC, 'M', 'ɱ'), + (0x1DAD, 'M', 'ɰ'), + (0x1DAE, 'M', 'ɲ'), + (0x1DAF, 'M', 'ɳ'), + (0x1DB0, 'M', 'ɴ'), + (0x1DB1, 'M', 'ɵ'), + (0x1DB2, 'M', 'ɸ'), + (0x1DB3, 'M', 'ʂ'), + (0x1DB4, 'M', 'ʃ'), + (0x1DB5, 'M', 'ƫ'), + (0x1DB6, 'M', 'ʉ'), + (0x1DB7, 'M', 'ʊ'), + (0x1DB8, 'M', 'ᴜ'), + (0x1DB9, 'M', 'ʋ'), + (0x1DBA, 'M', 'ʌ'), + (0x1DBB, 'M', 'z'), + (0x1DBC, 'M', 'ʐ'), + (0x1DBD, 'M', 'ʑ'), + (0x1DBE, 'M', 'ʒ'), + (0x1DBF, 'M', 'θ'), + (0x1DC0, 'V'), + (0x1E00, 'M', 'ḁ'), + (0x1E01, 'V'), + (0x1E02, 'M', 'ḃ'), + (0x1E03, 'V'), + (0x1E04, 'M', 'ḅ'), + (0x1E05, 'V'), + (0x1E06, 'M', 'ḇ'), + (0x1E07, 'V'), + (0x1E08, 'M', 'ḉ'), + (0x1E09, 'V'), + (0x1E0A, 'M', 'ḋ'), + (0x1E0B, 'V'), + (0x1E0C, 'M', 'ḍ'), + (0x1E0D, 'V'), + (0x1E0E, 'M', 'ḏ'), + (0x1E0F, 'V'), + (0x1E10, 'M', 'ḑ'), + (0x1E11, 'V'), + (0x1E12, 'M', 'ḓ'), + (0x1E13, 'V'), + (0x1E14, 'M', 'ḕ'), + (0x1E15, 'V'), + (0x1E16, 'M', 'ḗ'), + (0x1E17, 'V'), + (0x1E18, 'M', 'ḙ'), + (0x1E19, 'V'), + (0x1E1A, 'M', 'ḛ'), + (0x1E1B, 'V'), + (0x1E1C, 'M', 'ḝ'), + (0x1E1D, 'V'), + (0x1E1E, 'M', 'ḟ'), + (0x1E1F, 'V'), + (0x1E20, 'M', 'ḡ'), + (0x1E21, 'V'), + (0x1E22, 'M', 'ḣ'), + (0x1E23, 'V'), + ] + +def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E24, 'M', 'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', 'ḧ'), + (0x1E27, 'V'), + (0x1E28, 'M', 'ḩ'), + (0x1E29, 'V'), + (0x1E2A, 'M', 'ḫ'), + (0x1E2B, 'V'), + (0x1E2C, 'M', 'ḭ'), + (0x1E2D, 'V'), + (0x1E2E, 'M', 'ḯ'), + (0x1E2F, 'V'), + (0x1E30, 'M', 'ḱ'), + (0x1E31, 'V'), + (0x1E32, 'M', 'ḳ'), + (0x1E33, 'V'), + (0x1E34, 'M', 'ḵ'), + (0x1E35, 'V'), + (0x1E36, 'M', 'ḷ'), + (0x1E37, 'V'), + (0x1E38, 'M', 'ḹ'), + (0x1E39, 'V'), + (0x1E3A, 'M', 'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', 'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', 'ḿ'), + (0x1E3F, 'V'), + (0x1E40, 'M', 'ṁ'), + (0x1E41, 'V'), + (0x1E42, 'M', 'ṃ'), + (0x1E43, 'V'), + (0x1E44, 'M', 'ṅ'), + (0x1E45, 'V'), + (0x1E46, 'M', 'ṇ'), + (0x1E47, 'V'), + (0x1E48, 'M', 'ṉ'), + (0x1E49, 'V'), + (0x1E4A, 'M', 'ṋ'), + (0x1E4B, 'V'), + (0x1E4C, 'M', 'ṍ'), + (0x1E4D, 'V'), + (0x1E4E, 'M', 'ṏ'), + (0x1E4F, 'V'), + (0x1E50, 'M', 'ṑ'), + (0x1E51, 'V'), + (0x1E52, 'M', 'ṓ'), + (0x1E53, 'V'), + (0x1E54, 'M', 'ṕ'), + (0x1E55, 'V'), + (0x1E56, 'M', 'ṗ'), + (0x1E57, 'V'), + (0x1E58, 'M', 'ṙ'), + (0x1E59, 'V'), + (0x1E5A, 'M', 'ṛ'), + (0x1E5B, 'V'), + (0x1E5C, 'M', 'ṝ'), + (0x1E5D, 'V'), + (0x1E5E, 'M', 'ṟ'), + (0x1E5F, 'V'), + (0x1E60, 'M', 'ṡ'), + (0x1E61, 'V'), + (0x1E62, 'M', 'ṣ'), + (0x1E63, 'V'), + (0x1E64, 'M', 'ṥ'), + (0x1E65, 'V'), + (0x1E66, 'M', 'ṧ'), + (0x1E67, 'V'), + (0x1E68, 'M', 'ṩ'), + (0x1E69, 'V'), + (0x1E6A, 'M', 'ṫ'), + (0x1E6B, 'V'), + (0x1E6C, 'M', 'ṭ'), + (0x1E6D, 'V'), + (0x1E6E, 'M', 'ṯ'), + (0x1E6F, 'V'), + (0x1E70, 'M', 'ṱ'), + (0x1E71, 'V'), + (0x1E72, 'M', 'ṳ'), + (0x1E73, 'V'), + (0x1E74, 'M', 'ṵ'), + (0x1E75, 'V'), + (0x1E76, 'M', 'ṷ'), + (0x1E77, 'V'), + (0x1E78, 'M', 'ṹ'), + (0x1E79, 'V'), + (0x1E7A, 'M', 'ṻ'), + (0x1E7B, 'V'), + (0x1E7C, 'M', 'ṽ'), + (0x1E7D, 'V'), + (0x1E7E, 'M', 'ṿ'), + (0x1E7F, 'V'), + (0x1E80, 'M', 'ẁ'), + (0x1E81, 'V'), + (0x1E82, 'M', 'ẃ'), + (0x1E83, 'V'), + (0x1E84, 'M', 'ẅ'), + (0x1E85, 'V'), + (0x1E86, 'M', 'ẇ'), + (0x1E87, 'V'), + ] + +def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E88, 'M', 'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', 'ẋ'), + (0x1E8B, 'V'), + (0x1E8C, 'M', 'ẍ'), + (0x1E8D, 'V'), + (0x1E8E, 'M', 'ẏ'), + (0x1E8F, 'V'), + (0x1E90, 'M', 'ẑ'), + (0x1E91, 'V'), + (0x1E92, 'M', 'ẓ'), + (0x1E93, 'V'), + (0x1E94, 'M', 'ẕ'), + (0x1E95, 'V'), + (0x1E9A, 'M', 'aʾ'), + (0x1E9B, 'M', 'ṡ'), + (0x1E9C, 'V'), + (0x1E9E, 'M', 'ss'), + (0x1E9F, 'V'), + (0x1EA0, 'M', 'ạ'), + (0x1EA1, 'V'), + (0x1EA2, 'M', 'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', 'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', 'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', 'ẩ'), + (0x1EA9, 'V'), + (0x1EAA, 'M', 'ẫ'), + (0x1EAB, 'V'), + (0x1EAC, 'M', 'ậ'), + (0x1EAD, 'V'), + (0x1EAE, 'M', 'ắ'), + (0x1EAF, 'V'), + (0x1EB0, 'M', 'ằ'), + (0x1EB1, 'V'), + (0x1EB2, 'M', 'ẳ'), + (0x1EB3, 'V'), + (0x1EB4, 'M', 'ẵ'), + (0x1EB5, 'V'), + (0x1EB6, 'M', 'ặ'), + (0x1EB7, 'V'), + (0x1EB8, 'M', 'ẹ'), + (0x1EB9, 'V'), + (0x1EBA, 'M', 'ẻ'), + (0x1EBB, 'V'), + (0x1EBC, 'M', 'ẽ'), + (0x1EBD, 'V'), + (0x1EBE, 'M', 'ế'), + (0x1EBF, 'V'), + (0x1EC0, 'M', 'ề'), + (0x1EC1, 'V'), + (0x1EC2, 'M', 'ể'), + (0x1EC3, 'V'), + (0x1EC4, 'M', 'ễ'), + (0x1EC5, 'V'), + (0x1EC6, 'M', 'ệ'), + (0x1EC7, 'V'), + (0x1EC8, 'M', 'ỉ'), + (0x1EC9, 'V'), + (0x1ECA, 'M', 'ị'), + (0x1ECB, 'V'), + (0x1ECC, 'M', 'ọ'), + (0x1ECD, 'V'), + (0x1ECE, 'M', 'ỏ'), + (0x1ECF, 'V'), + (0x1ED0, 'M', 'ố'), + (0x1ED1, 'V'), + (0x1ED2, 'M', 'ồ'), + (0x1ED3, 'V'), + (0x1ED4, 'M', 'ổ'), + (0x1ED5, 'V'), + (0x1ED6, 'M', 'ỗ'), + (0x1ED7, 'V'), + (0x1ED8, 'M', 'ộ'), + (0x1ED9, 'V'), + (0x1EDA, 'M', 'ớ'), + (0x1EDB, 'V'), + (0x1EDC, 'M', 'ờ'), + (0x1EDD, 'V'), + (0x1EDE, 'M', 'ở'), + (0x1EDF, 'V'), + (0x1EE0, 'M', 'ỡ'), + (0x1EE1, 'V'), + (0x1EE2, 'M', 'ợ'), + (0x1EE3, 'V'), + (0x1EE4, 'M', 'ụ'), + (0x1EE5, 'V'), + (0x1EE6, 'M', 'ủ'), + (0x1EE7, 'V'), + (0x1EE8, 'M', 'ứ'), + (0x1EE9, 'V'), + (0x1EEA, 'M', 'ừ'), + (0x1EEB, 'V'), + (0x1EEC, 'M', 'ử'), + (0x1EED, 'V'), + (0x1EEE, 'M', 'ữ'), + (0x1EEF, 'V'), + (0x1EF0, 'M', 'ự'), + ] + +def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EF1, 'V'), + (0x1EF2, 'M', 'ỳ'), + (0x1EF3, 'V'), + (0x1EF4, 'M', 'ỵ'), + (0x1EF5, 'V'), + (0x1EF6, 'M', 'ỷ'), + (0x1EF7, 'V'), + (0x1EF8, 'M', 'ỹ'), + (0x1EF9, 'V'), + (0x1EFA, 'M', 'ỻ'), + (0x1EFB, 'V'), + (0x1EFC, 'M', 'ỽ'), + (0x1EFD, 'V'), + (0x1EFE, 'M', 'ỿ'), + (0x1EFF, 'V'), + (0x1F08, 'M', 'ἀ'), + (0x1F09, 'M', 'ἁ'), + (0x1F0A, 'M', 'ἂ'), + (0x1F0B, 'M', 'ἃ'), + (0x1F0C, 'M', 'ἄ'), + (0x1F0D, 'M', 'ἅ'), + (0x1F0E, 'M', 'ἆ'), + (0x1F0F, 'M', 'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', 'ἐ'), + (0x1F19, 'M', 'ἑ'), + (0x1F1A, 'M', 'ἒ'), + (0x1F1B, 'M', 'ἓ'), + (0x1F1C, 'M', 'ἔ'), + (0x1F1D, 'M', 'ἕ'), + (0x1F1E, 'X'), + (0x1F20, 'V'), + (0x1F28, 'M', 'ἠ'), + (0x1F29, 'M', 'ἡ'), + (0x1F2A, 'M', 'ἢ'), + (0x1F2B, 'M', 'ἣ'), + (0x1F2C, 'M', 'ἤ'), + (0x1F2D, 'M', 'ἥ'), + (0x1F2E, 'M', 'ἦ'), + (0x1F2F, 'M', 'ἧ'), + (0x1F30, 'V'), + (0x1F38, 'M', 'ἰ'), + (0x1F39, 'M', 'ἱ'), + (0x1F3A, 'M', 'ἲ'), + (0x1F3B, 'M', 'ἳ'), + (0x1F3C, 'M', 'ἴ'), + (0x1F3D, 'M', 'ἵ'), + (0x1F3E, 'M', 'ἶ'), + (0x1F3F, 'M', 'ἷ'), + (0x1F40, 'V'), + (0x1F46, 'X'), + (0x1F48, 'M', 'ὀ'), + (0x1F49, 'M', 'ὁ'), + (0x1F4A, 'M', 'ὂ'), + (0x1F4B, 'M', 'ὃ'), + (0x1F4C, 'M', 'ὄ'), + (0x1F4D, 'M', 'ὅ'), + (0x1F4E, 'X'), + (0x1F50, 'V'), + (0x1F58, 'X'), + (0x1F59, 'M', 'ὑ'), + (0x1F5A, 'X'), + (0x1F5B, 'M', 'ὓ'), + (0x1F5C, 'X'), + (0x1F5D, 'M', 'ὕ'), + (0x1F5E, 'X'), + (0x1F5F, 'M', 'ὗ'), + (0x1F60, 'V'), + (0x1F68, 'M', 'ὠ'), + (0x1F69, 'M', 'ὡ'), + (0x1F6A, 'M', 'ὢ'), + (0x1F6B, 'M', 'ὣ'), + (0x1F6C, 'M', 'ὤ'), + (0x1F6D, 'M', 'ὥ'), + (0x1F6E, 'M', 'ὦ'), + (0x1F6F, 'M', 'ὧ'), + (0x1F70, 'V'), + (0x1F71, 'M', 'ά'), + (0x1F72, 'V'), + (0x1F73, 'M', 'έ'), + (0x1F74, 'V'), + (0x1F75, 'M', 'ή'), + (0x1F76, 'V'), + (0x1F77, 'M', 'ί'), + (0x1F78, 'V'), + (0x1F79, 'M', 'ό'), + (0x1F7A, 'V'), + (0x1F7B, 'M', 'ύ'), + (0x1F7C, 'V'), + (0x1F7D, 'M', 'ώ'), + (0x1F7E, 'X'), + (0x1F80, 'M', 'ἀι'), + (0x1F81, 'M', 'ἁι'), + (0x1F82, 'M', 'ἂι'), + (0x1F83, 'M', 'ἃι'), + (0x1F84, 'M', 'ἄι'), + (0x1F85, 'M', 'ἅι'), + (0x1F86, 'M', 'ἆι'), + (0x1F87, 'M', 'ἇι'), + ] + +def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F88, 'M', 'ἀι'), + (0x1F89, 'M', 'ἁι'), + (0x1F8A, 'M', 'ἂι'), + (0x1F8B, 'M', 'ἃι'), + (0x1F8C, 'M', 'ἄι'), + (0x1F8D, 'M', 'ἅι'), + (0x1F8E, 'M', 'ἆι'), + (0x1F8F, 'M', 'ἇι'), + (0x1F90, 'M', 'ἠι'), + (0x1F91, 'M', 'ἡι'), + (0x1F92, 'M', 'ἢι'), + (0x1F93, 'M', 'ἣι'), + (0x1F94, 'M', 'ἤι'), + (0x1F95, 'M', 'ἥι'), + (0x1F96, 'M', 'ἦι'), + (0x1F97, 'M', 'ἧι'), + (0x1F98, 'M', 'ἠι'), + (0x1F99, 'M', 'ἡι'), + (0x1F9A, 'M', 'ἢι'), + (0x1F9B, 'M', 'ἣι'), + (0x1F9C, 'M', 'ἤι'), + (0x1F9D, 'M', 'ἥι'), + (0x1F9E, 'M', 'ἦι'), + (0x1F9F, 'M', 'ἧι'), + (0x1FA0, 'M', 'ὠι'), + (0x1FA1, 'M', 'ὡι'), + (0x1FA2, 'M', 'ὢι'), + (0x1FA3, 'M', 'ὣι'), + (0x1FA4, 'M', 'ὤι'), + (0x1FA5, 'M', 'ὥι'), + (0x1FA6, 'M', 'ὦι'), + (0x1FA7, 'M', 'ὧι'), + (0x1FA8, 'M', 'ὠι'), + (0x1FA9, 'M', 'ὡι'), + (0x1FAA, 'M', 'ὢι'), + (0x1FAB, 'M', 'ὣι'), + (0x1FAC, 'M', 'ὤι'), + (0x1FAD, 'M', 'ὥι'), + (0x1FAE, 'M', 'ὦι'), + (0x1FAF, 'M', 'ὧι'), + (0x1FB0, 'V'), + (0x1FB2, 'M', 'ὰι'), + (0x1FB3, 'M', 'αι'), + (0x1FB4, 'M', 'άι'), + (0x1FB5, 'X'), + (0x1FB6, 'V'), + (0x1FB7, 'M', 'ᾶι'), + (0x1FB8, 'M', 'ᾰ'), + (0x1FB9, 'M', 'ᾱ'), + (0x1FBA, 'M', 'ὰ'), + (0x1FBB, 'M', 'ά'), + (0x1FBC, 'M', 'αι'), + (0x1FBD, '3', ' ̓'), + (0x1FBE, 'M', 'ι'), + (0x1FBF, '3', ' ̓'), + (0x1FC0, '3', ' ͂'), + (0x1FC1, '3', ' ̈͂'), + (0x1FC2, 'M', 'ὴι'), + (0x1FC3, 'M', 'ηι'), + (0x1FC4, 'M', 'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', 'ῆι'), + (0x1FC8, 'M', 'ὲ'), + (0x1FC9, 'M', 'έ'), + (0x1FCA, 'M', 'ὴ'), + (0x1FCB, 'M', 'ή'), + (0x1FCC, 'M', 'ηι'), + (0x1FCD, '3', ' ̓̀'), + (0x1FCE, '3', ' ̓́'), + (0x1FCF, '3', ' ̓͂'), + (0x1FD0, 'V'), + (0x1FD3, 'M', 'ΐ'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', 'ῐ'), + (0x1FD9, 'M', 'ῑ'), + (0x1FDA, 'M', 'ὶ'), + (0x1FDB, 'M', 'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', ' ̔̀'), + (0x1FDE, '3', ' ̔́'), + (0x1FDF, '3', ' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', 'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', 'ῠ'), + (0x1FE9, 'M', 'ῡ'), + (0x1FEA, 'M', 'ὺ'), + (0x1FEB, 'M', 'ύ'), + (0x1FEC, 'M', 'ῥ'), + (0x1FED, '3', ' ̈̀'), + (0x1FEE, '3', ' ̈́'), + (0x1FEF, '3', '`'), + (0x1FF0, 'X'), + (0x1FF2, 'M', 'ὼι'), + (0x1FF3, 'M', 'ωι'), + (0x1FF4, 'M', 'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + ] + +def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FF7, 'M', 'ῶι'), + (0x1FF8, 'M', 'ὸ'), + (0x1FF9, 'M', 'ό'), + (0x1FFA, 'M', 'ὼ'), + (0x1FFB, 'M', 'ώ'), + (0x1FFC, 'M', 'ωι'), + (0x1FFD, '3', ' ́'), + (0x1FFE, '3', ' ̔'), + (0x1FFF, 'X'), + (0x2000, '3', ' '), + (0x200B, 'I'), + (0x200C, 'D', ''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', '‐'), + (0x2012, 'V'), + (0x2017, '3', ' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + (0x202F, '3', ' '), + (0x2030, 'V'), + (0x2033, 'M', '′′'), + (0x2034, 'M', '′′′'), + (0x2035, 'V'), + (0x2036, 'M', '‵‵'), + (0x2037, 'M', '‵‵‵'), + (0x2038, 'V'), + (0x203C, '3', '!!'), + (0x203D, 'V'), + (0x203E, '3', ' ̅'), + (0x203F, 'V'), + (0x2047, '3', '??'), + (0x2048, '3', '?!'), + (0x2049, '3', '!?'), + (0x204A, 'V'), + (0x2057, 'M', '′′′′'), + (0x2058, 'V'), + (0x205F, '3', ' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (0x2070, 'M', '0'), + (0x2071, 'M', 'i'), + (0x2072, 'X'), + (0x2074, 'M', '4'), + (0x2075, 'M', '5'), + (0x2076, 'M', '6'), + (0x2077, 'M', '7'), + (0x2078, 'M', '8'), + (0x2079, 'M', '9'), + (0x207A, '3', '+'), + (0x207B, 'M', '−'), + (0x207C, '3', '='), + (0x207D, '3', '('), + (0x207E, '3', ')'), + (0x207F, 'M', 'n'), + (0x2080, 'M', '0'), + (0x2081, 'M', '1'), + (0x2082, 'M', '2'), + (0x2083, 'M', '3'), + (0x2084, 'M', '4'), + (0x2085, 'M', '5'), + (0x2086, 'M', '6'), + (0x2087, 'M', '7'), + (0x2088, 'M', '8'), + (0x2089, 'M', '9'), + (0x208A, '3', '+'), + (0x208B, 'M', '−'), + (0x208C, '3', '='), + (0x208D, '3', '('), + (0x208E, '3', ')'), + (0x208F, 'X'), + (0x2090, 'M', 'a'), + (0x2091, 'M', 'e'), + (0x2092, 'M', 'o'), + (0x2093, 'M', 'x'), + (0x2094, 'M', 'ə'), + (0x2095, 'M', 'h'), + (0x2096, 'M', 'k'), + (0x2097, 'M', 'l'), + (0x2098, 'M', 'm'), + (0x2099, 'M', 'n'), + (0x209A, 'M', 'p'), + (0x209B, 'M', 's'), + (0x209C, 'M', 't'), + (0x209D, 'X'), + (0x20A0, 'V'), + (0x20A8, 'M', 'rs'), + (0x20A9, 'V'), + (0x20C1, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + (0x2100, '3', 'a/c'), + (0x2101, '3', 'a/s'), + (0x2102, 'M', 'c'), + (0x2103, 'M', '°c'), + (0x2104, 'V'), + ] + +def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2105, '3', 'c/o'), + (0x2106, '3', 'c/u'), + (0x2107, 'M', 'ɛ'), + (0x2108, 'V'), + (0x2109, 'M', '°f'), + (0x210A, 'M', 'g'), + (0x210B, 'M', 'h'), + (0x210F, 'M', 'ħ'), + (0x2110, 'M', 'i'), + (0x2112, 'M', 'l'), + (0x2114, 'V'), + (0x2115, 'M', 'n'), + (0x2116, 'M', 'no'), + (0x2117, 'V'), + (0x2119, 'M', 'p'), + (0x211A, 'M', 'q'), + (0x211B, 'M', 'r'), + (0x211E, 'V'), + (0x2120, 'M', 'sm'), + (0x2121, 'M', 'tel'), + (0x2122, 'M', 'tm'), + (0x2123, 'V'), + (0x2124, 'M', 'z'), + (0x2125, 'V'), + (0x2126, 'M', 'ω'), + (0x2127, 'V'), + (0x2128, 'M', 'z'), + (0x2129, 'V'), + (0x212A, 'M', 'k'), + (0x212B, 'M', 'å'), + (0x212C, 'M', 'b'), + (0x212D, 'M', 'c'), + (0x212E, 'V'), + (0x212F, 'M', 'e'), + (0x2131, 'M', 'f'), + (0x2132, 'X'), + (0x2133, 'M', 'm'), + (0x2134, 'M', 'o'), + (0x2135, 'M', 'א'), + (0x2136, 'M', 'ב'), + (0x2137, 'M', 'ג'), + (0x2138, 'M', 'ד'), + (0x2139, 'M', 'i'), + (0x213A, 'V'), + (0x213B, 'M', 'fax'), + (0x213C, 'M', 'π'), + (0x213D, 'M', 'γ'), + (0x213F, 'M', 'π'), + (0x2140, 'M', '∑'), + (0x2141, 'V'), + (0x2145, 'M', 'd'), + (0x2147, 'M', 'e'), + (0x2148, 'M', 'i'), + (0x2149, 'M', 'j'), + (0x214A, 'V'), + (0x2150, 'M', '1⁄7'), + (0x2151, 'M', '1⁄9'), + (0x2152, 'M', '1⁄10'), + (0x2153, 'M', '1⁄3'), + (0x2154, 'M', '2⁄3'), + (0x2155, 'M', '1⁄5'), + (0x2156, 'M', '2⁄5'), + (0x2157, 'M', '3⁄5'), + (0x2158, 'M', '4⁄5'), + (0x2159, 'M', '1⁄6'), + (0x215A, 'M', '5⁄6'), + (0x215B, 'M', '1⁄8'), + (0x215C, 'M', '3⁄8'), + (0x215D, 'M', '5⁄8'), + (0x215E, 'M', '7⁄8'), + (0x215F, 'M', '1⁄'), + (0x2160, 'M', 'i'), + (0x2161, 'M', 'ii'), + (0x2162, 'M', 'iii'), + (0x2163, 'M', 'iv'), + (0x2164, 'M', 'v'), + (0x2165, 'M', 'vi'), + (0x2166, 'M', 'vii'), + (0x2167, 'M', 'viii'), + (0x2168, 'M', 'ix'), + (0x2169, 'M', 'x'), + (0x216A, 'M', 'xi'), + (0x216B, 'M', 'xii'), + (0x216C, 'M', 'l'), + (0x216D, 'M', 'c'), + (0x216E, 'M', 'd'), + (0x216F, 'M', 'm'), + (0x2170, 'M', 'i'), + (0x2171, 'M', 'ii'), + (0x2172, 'M', 'iii'), + (0x2173, 'M', 'iv'), + (0x2174, 'M', 'v'), + (0x2175, 'M', 'vi'), + (0x2176, 'M', 'vii'), + (0x2177, 'M', 'viii'), + (0x2178, 'M', 'ix'), + (0x2179, 'M', 'x'), + (0x217A, 'M', 'xi'), + (0x217B, 'M', 'xii'), + (0x217C, 'M', 'l'), + ] + +def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x217D, 'M', 'c'), + (0x217E, 'M', 'd'), + (0x217F, 'M', 'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (0x2184, 'V'), + (0x2189, 'M', '0⁄3'), + (0x218A, 'V'), + (0x218C, 'X'), + (0x2190, 'V'), + (0x222C, 'M', '∫∫'), + (0x222D, 'M', '∫∫∫'), + (0x222E, 'V'), + (0x222F, 'M', '∮∮'), + (0x2230, 'M', '∮∮∮'), + (0x2231, 'V'), + (0x2260, '3'), + (0x2261, 'V'), + (0x226E, '3'), + (0x2270, 'V'), + (0x2329, 'M', '〈'), + (0x232A, 'M', '〉'), + (0x232B, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', '1'), + (0x2461, 'M', '2'), + (0x2462, 'M', '3'), + (0x2463, 'M', '4'), + (0x2464, 'M', '5'), + (0x2465, 'M', '6'), + (0x2466, 'M', '7'), + (0x2467, 'M', '8'), + (0x2468, 'M', '9'), + (0x2469, 'M', '10'), + (0x246A, 'M', '11'), + (0x246B, 'M', '12'), + (0x246C, 'M', '13'), + (0x246D, 'M', '14'), + (0x246E, 'M', '15'), + (0x246F, 'M', '16'), + (0x2470, 'M', '17'), + (0x2471, 'M', '18'), + (0x2472, 'M', '19'), + (0x2473, 'M', '20'), + (0x2474, '3', '(1)'), + (0x2475, '3', '(2)'), + (0x2476, '3', '(3)'), + (0x2477, '3', '(4)'), + (0x2478, '3', '(5)'), + (0x2479, '3', '(6)'), + (0x247A, '3', '(7)'), + (0x247B, '3', '(8)'), + (0x247C, '3', '(9)'), + (0x247D, '3', '(10)'), + (0x247E, '3', '(11)'), + (0x247F, '3', '(12)'), + (0x2480, '3', '(13)'), + (0x2481, '3', '(14)'), + (0x2482, '3', '(15)'), + (0x2483, '3', '(16)'), + (0x2484, '3', '(17)'), + (0x2485, '3', '(18)'), + (0x2486, '3', '(19)'), + (0x2487, '3', '(20)'), + (0x2488, 'X'), + (0x249C, '3', '(a)'), + (0x249D, '3', '(b)'), + (0x249E, '3', '(c)'), + (0x249F, '3', '(d)'), + (0x24A0, '3', '(e)'), + (0x24A1, '3', '(f)'), + (0x24A2, '3', '(g)'), + (0x24A3, '3', '(h)'), + (0x24A4, '3', '(i)'), + (0x24A5, '3', '(j)'), + (0x24A6, '3', '(k)'), + (0x24A7, '3', '(l)'), + (0x24A8, '3', '(m)'), + (0x24A9, '3', '(n)'), + (0x24AA, '3', '(o)'), + (0x24AB, '3', '(p)'), + (0x24AC, '3', '(q)'), + (0x24AD, '3', '(r)'), + (0x24AE, '3', '(s)'), + (0x24AF, '3', '(t)'), + (0x24B0, '3', '(u)'), + (0x24B1, '3', '(v)'), + (0x24B2, '3', '(w)'), + (0x24B3, '3', '(x)'), + (0x24B4, '3', '(y)'), + (0x24B5, '3', '(z)'), + (0x24B6, 'M', 'a'), + (0x24B7, 'M', 'b'), + (0x24B8, 'M', 'c'), + (0x24B9, 'M', 'd'), + (0x24BA, 'M', 'e'), + (0x24BB, 'M', 'f'), + (0x24BC, 'M', 'g'), + ] + +def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x24BD, 'M', 'h'), + (0x24BE, 'M', 'i'), + (0x24BF, 'M', 'j'), + (0x24C0, 'M', 'k'), + (0x24C1, 'M', 'l'), + (0x24C2, 'M', 'm'), + (0x24C3, 'M', 'n'), + (0x24C4, 'M', 'o'), + (0x24C5, 'M', 'p'), + (0x24C6, 'M', 'q'), + (0x24C7, 'M', 'r'), + (0x24C8, 'M', 's'), + (0x24C9, 'M', 't'), + (0x24CA, 'M', 'u'), + (0x24CB, 'M', 'v'), + (0x24CC, 'M', 'w'), + (0x24CD, 'M', 'x'), + (0x24CE, 'M', 'y'), + (0x24CF, 'M', 'z'), + (0x24D0, 'M', 'a'), + (0x24D1, 'M', 'b'), + (0x24D2, 'M', 'c'), + (0x24D3, 'M', 'd'), + (0x24D4, 'M', 'e'), + (0x24D5, 'M', 'f'), + (0x24D6, 'M', 'g'), + (0x24D7, 'M', 'h'), + (0x24D8, 'M', 'i'), + (0x24D9, 'M', 'j'), + (0x24DA, 'M', 'k'), + (0x24DB, 'M', 'l'), + (0x24DC, 'M', 'm'), + (0x24DD, 'M', 'n'), + (0x24DE, 'M', 'o'), + (0x24DF, 'M', 'p'), + (0x24E0, 'M', 'q'), + (0x24E1, 'M', 'r'), + (0x24E2, 'M', 's'), + (0x24E3, 'M', 't'), + (0x24E4, 'M', 'u'), + (0x24E5, 'M', 'v'), + (0x24E6, 'M', 'w'), + (0x24E7, 'M', 'x'), + (0x24E8, 'M', 'y'), + (0x24E9, 'M', 'z'), + (0x24EA, 'M', '0'), + (0x24EB, 'V'), + (0x2A0C, 'M', '∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', '::='), + (0x2A75, '3', '=='), + (0x2A76, '3', '==='), + (0x2A77, 'V'), + (0x2ADC, 'M', '⫝̸'), + (0x2ADD, 'V'), + (0x2B74, 'X'), + (0x2B76, 'V'), + (0x2B96, 'X'), + (0x2B97, 'V'), + (0x2C00, 'M', 'ⰰ'), + (0x2C01, 'M', 'ⰱ'), + (0x2C02, 'M', 'ⰲ'), + (0x2C03, 'M', 'ⰳ'), + (0x2C04, 'M', 'ⰴ'), + (0x2C05, 'M', 'ⰵ'), + (0x2C06, 'M', 'ⰶ'), + (0x2C07, 'M', 'ⰷ'), + (0x2C08, 'M', 'ⰸ'), + (0x2C09, 'M', 'ⰹ'), + (0x2C0A, 'M', 'ⰺ'), + (0x2C0B, 'M', 'ⰻ'), + (0x2C0C, 'M', 'ⰼ'), + (0x2C0D, 'M', 'ⰽ'), + (0x2C0E, 'M', 'ⰾ'), + (0x2C0F, 'M', 'ⰿ'), + (0x2C10, 'M', 'ⱀ'), + (0x2C11, 'M', 'ⱁ'), + (0x2C12, 'M', 'ⱂ'), + (0x2C13, 'M', 'ⱃ'), + (0x2C14, 'M', 'ⱄ'), + (0x2C15, 'M', 'ⱅ'), + (0x2C16, 'M', 'ⱆ'), + (0x2C17, 'M', 'ⱇ'), + (0x2C18, 'M', 'ⱈ'), + (0x2C19, 'M', 'ⱉ'), + (0x2C1A, 'M', 'ⱊ'), + (0x2C1B, 'M', 'ⱋ'), + (0x2C1C, 'M', 'ⱌ'), + (0x2C1D, 'M', 'ⱍ'), + (0x2C1E, 'M', 'ⱎ'), + (0x2C1F, 'M', 'ⱏ'), + (0x2C20, 'M', 'ⱐ'), + (0x2C21, 'M', 'ⱑ'), + (0x2C22, 'M', 'ⱒ'), + (0x2C23, 'M', 'ⱓ'), + (0x2C24, 'M', 'ⱔ'), + (0x2C25, 'M', 'ⱕ'), + (0x2C26, 'M', 'ⱖ'), + (0x2C27, 'M', 'ⱗ'), + (0x2C28, 'M', 'ⱘ'), + ] + +def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2C29, 'M', 'ⱙ'), + (0x2C2A, 'M', 'ⱚ'), + (0x2C2B, 'M', 'ⱛ'), + (0x2C2C, 'M', 'ⱜ'), + (0x2C2D, 'M', 'ⱝ'), + (0x2C2E, 'M', 'ⱞ'), + (0x2C2F, 'M', 'ⱟ'), + (0x2C30, 'V'), + (0x2C60, 'M', 'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', 'ɫ'), + (0x2C63, 'M', 'ᵽ'), + (0x2C64, 'M', 'ɽ'), + (0x2C65, 'V'), + (0x2C67, 'M', 'ⱨ'), + (0x2C68, 'V'), + (0x2C69, 'M', 'ⱪ'), + (0x2C6A, 'V'), + (0x2C6B, 'M', 'ⱬ'), + (0x2C6C, 'V'), + (0x2C6D, 'M', 'ɑ'), + (0x2C6E, 'M', 'ɱ'), + (0x2C6F, 'M', 'ɐ'), + (0x2C70, 'M', 'ɒ'), + (0x2C71, 'V'), + (0x2C72, 'M', 'ⱳ'), + (0x2C73, 'V'), + (0x2C75, 'M', 'ⱶ'), + (0x2C76, 'V'), + (0x2C7C, 'M', 'j'), + (0x2C7D, 'M', 'v'), + (0x2C7E, 'M', 'ȿ'), + (0x2C7F, 'M', 'ɀ'), + (0x2C80, 'M', 'ⲁ'), + (0x2C81, 'V'), + (0x2C82, 'M', 'ⲃ'), + (0x2C83, 'V'), + (0x2C84, 'M', 'ⲅ'), + (0x2C85, 'V'), + (0x2C86, 'M', 'ⲇ'), + (0x2C87, 'V'), + (0x2C88, 'M', 'ⲉ'), + (0x2C89, 'V'), + (0x2C8A, 'M', 'ⲋ'), + (0x2C8B, 'V'), + (0x2C8C, 'M', 'ⲍ'), + (0x2C8D, 'V'), + (0x2C8E, 'M', 'ⲏ'), + (0x2C8F, 'V'), + (0x2C90, 'M', 'ⲑ'), + (0x2C91, 'V'), + (0x2C92, 'M', 'ⲓ'), + (0x2C93, 'V'), + (0x2C94, 'M', 'ⲕ'), + (0x2C95, 'V'), + (0x2C96, 'M', 'ⲗ'), + (0x2C97, 'V'), + (0x2C98, 'M', 'ⲙ'), + (0x2C99, 'V'), + (0x2C9A, 'M', 'ⲛ'), + (0x2C9B, 'V'), + (0x2C9C, 'M', 'ⲝ'), + (0x2C9D, 'V'), + (0x2C9E, 'M', 'ⲟ'), + (0x2C9F, 'V'), + (0x2CA0, 'M', 'ⲡ'), + (0x2CA1, 'V'), + (0x2CA2, 'M', 'ⲣ'), + (0x2CA3, 'V'), + (0x2CA4, 'M', 'ⲥ'), + (0x2CA5, 'V'), + (0x2CA6, 'M', 'ⲧ'), + (0x2CA7, 'V'), + (0x2CA8, 'M', 'ⲩ'), + (0x2CA9, 'V'), + (0x2CAA, 'M', 'ⲫ'), + (0x2CAB, 'V'), + (0x2CAC, 'M', 'ⲭ'), + (0x2CAD, 'V'), + (0x2CAE, 'M', 'ⲯ'), + (0x2CAF, 'V'), + (0x2CB0, 'M', 'ⲱ'), + (0x2CB1, 'V'), + (0x2CB2, 'M', 'ⲳ'), + (0x2CB3, 'V'), + (0x2CB4, 'M', 'ⲵ'), + (0x2CB5, 'V'), + (0x2CB6, 'M', 'ⲷ'), + (0x2CB7, 'V'), + (0x2CB8, 'M', 'ⲹ'), + (0x2CB9, 'V'), + (0x2CBA, 'M', 'ⲻ'), + (0x2CBB, 'V'), + (0x2CBC, 'M', 'ⲽ'), + (0x2CBD, 'V'), + (0x2CBE, 'M', 'ⲿ'), + (0x2CBF, 'V'), + (0x2CC0, 'M', 'ⳁ'), + (0x2CC1, 'V'), + (0x2CC2, 'M', 'ⳃ'), + ] + +def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2CC3, 'V'), + (0x2CC4, 'M', 'ⳅ'), + (0x2CC5, 'V'), + (0x2CC6, 'M', 'ⳇ'), + (0x2CC7, 'V'), + (0x2CC8, 'M', 'ⳉ'), + (0x2CC9, 'V'), + (0x2CCA, 'M', 'ⳋ'), + (0x2CCB, 'V'), + (0x2CCC, 'M', 'ⳍ'), + (0x2CCD, 'V'), + (0x2CCE, 'M', 'ⳏ'), + (0x2CCF, 'V'), + (0x2CD0, 'M', 'ⳑ'), + (0x2CD1, 'V'), + (0x2CD2, 'M', 'ⳓ'), + (0x2CD3, 'V'), + (0x2CD4, 'M', 'ⳕ'), + (0x2CD5, 'V'), + (0x2CD6, 'M', 'ⳗ'), + (0x2CD7, 'V'), + (0x2CD8, 'M', 'ⳙ'), + (0x2CD9, 'V'), + (0x2CDA, 'M', 'ⳛ'), + (0x2CDB, 'V'), + (0x2CDC, 'M', 'ⳝ'), + (0x2CDD, 'V'), + (0x2CDE, 'M', 'ⳟ'), + (0x2CDF, 'V'), + (0x2CE0, 'M', 'ⳡ'), + (0x2CE1, 'V'), + (0x2CE2, 'M', 'ⳣ'), + (0x2CE3, 'V'), + (0x2CEB, 'M', 'ⳬ'), + (0x2CEC, 'V'), + (0x2CED, 'M', 'ⳮ'), + (0x2CEE, 'V'), + (0x2CF2, 'M', 'ⳳ'), + (0x2CF3, 'V'), + (0x2CF4, 'X'), + (0x2CF9, 'V'), + (0x2D26, 'X'), + (0x2D27, 'V'), + (0x2D28, 'X'), + (0x2D2D, 'V'), + (0x2D2E, 'X'), + (0x2D30, 'V'), + (0x2D68, 'X'), + (0x2D6F, 'M', 'ⵡ'), + (0x2D70, 'V'), + (0x2D71, 'X'), + (0x2D7F, 'V'), + (0x2D97, 'X'), + (0x2DA0, 'V'), + (0x2DA7, 'X'), + (0x2DA8, 'V'), + (0x2DAF, 'X'), + (0x2DB0, 'V'), + (0x2DB7, 'X'), + (0x2DB8, 'V'), + (0x2DBF, 'X'), + (0x2DC0, 'V'), + (0x2DC7, 'X'), + (0x2DC8, 'V'), + (0x2DCF, 'X'), + (0x2DD0, 'V'), + (0x2DD7, 'X'), + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), + (0x2E5E, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), + (0x2E9F, 'M', '母'), + (0x2EA0, 'V'), + (0x2EF3, 'M', '龟'), + (0x2EF4, 'X'), + (0x2F00, 'M', '一'), + (0x2F01, 'M', '丨'), + (0x2F02, 'M', '丶'), + (0x2F03, 'M', '丿'), + (0x2F04, 'M', '乙'), + (0x2F05, 'M', '亅'), + (0x2F06, 'M', '二'), + (0x2F07, 'M', '亠'), + (0x2F08, 'M', '人'), + (0x2F09, 'M', '儿'), + (0x2F0A, 'M', '入'), + (0x2F0B, 'M', '八'), + (0x2F0C, 'M', '冂'), + (0x2F0D, 'M', '冖'), + (0x2F0E, 'M', '冫'), + (0x2F0F, 'M', '几'), + (0x2F10, 'M', '凵'), + (0x2F11, 'M', '刀'), + (0x2F12, 'M', '力'), + (0x2F13, 'M', '勹'), + (0x2F14, 'M', '匕'), + (0x2F15, 'M', '匚'), + ] + +def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F16, 'M', '匸'), + (0x2F17, 'M', '十'), + (0x2F18, 'M', '卜'), + (0x2F19, 'M', '卩'), + (0x2F1A, 'M', '厂'), + (0x2F1B, 'M', '厶'), + (0x2F1C, 'M', '又'), + (0x2F1D, 'M', '口'), + (0x2F1E, 'M', '囗'), + (0x2F1F, 'M', '土'), + (0x2F20, 'M', '士'), + (0x2F21, 'M', '夂'), + (0x2F22, 'M', '夊'), + (0x2F23, 'M', '夕'), + (0x2F24, 'M', '大'), + (0x2F25, 'M', '女'), + (0x2F26, 'M', '子'), + (0x2F27, 'M', '宀'), + (0x2F28, 'M', '寸'), + (0x2F29, 'M', '小'), + (0x2F2A, 'M', '尢'), + (0x2F2B, 'M', '尸'), + (0x2F2C, 'M', '屮'), + (0x2F2D, 'M', '山'), + (0x2F2E, 'M', '巛'), + (0x2F2F, 'M', '工'), + (0x2F30, 'M', '己'), + (0x2F31, 'M', '巾'), + (0x2F32, 'M', '干'), + (0x2F33, 'M', '幺'), + (0x2F34, 'M', '广'), + (0x2F35, 'M', '廴'), + (0x2F36, 'M', '廾'), + (0x2F37, 'M', '弋'), + (0x2F38, 'M', '弓'), + (0x2F39, 'M', '彐'), + (0x2F3A, 'M', '彡'), + (0x2F3B, 'M', '彳'), + (0x2F3C, 'M', '心'), + (0x2F3D, 'M', '戈'), + (0x2F3E, 'M', '戶'), + (0x2F3F, 'M', '手'), + (0x2F40, 'M', '支'), + (0x2F41, 'M', '攴'), + (0x2F42, 'M', '文'), + (0x2F43, 'M', '斗'), + (0x2F44, 'M', '斤'), + (0x2F45, 'M', '方'), + (0x2F46, 'M', '无'), + (0x2F47, 'M', '日'), + (0x2F48, 'M', '曰'), + (0x2F49, 'M', '月'), + (0x2F4A, 'M', '木'), + (0x2F4B, 'M', '欠'), + (0x2F4C, 'M', '止'), + (0x2F4D, 'M', '歹'), + (0x2F4E, 'M', '殳'), + (0x2F4F, 'M', '毋'), + (0x2F50, 'M', '比'), + (0x2F51, 'M', '毛'), + (0x2F52, 'M', '氏'), + (0x2F53, 'M', '气'), + (0x2F54, 'M', '水'), + (0x2F55, 'M', '火'), + (0x2F56, 'M', '爪'), + (0x2F57, 'M', '父'), + (0x2F58, 'M', '爻'), + (0x2F59, 'M', '爿'), + (0x2F5A, 'M', '片'), + (0x2F5B, 'M', '牙'), + (0x2F5C, 'M', '牛'), + (0x2F5D, 'M', '犬'), + (0x2F5E, 'M', '玄'), + (0x2F5F, 'M', '玉'), + (0x2F60, 'M', '瓜'), + (0x2F61, 'M', '瓦'), + (0x2F62, 'M', '甘'), + (0x2F63, 'M', '生'), + (0x2F64, 'M', '用'), + (0x2F65, 'M', '田'), + (0x2F66, 'M', '疋'), + (0x2F67, 'M', '疒'), + (0x2F68, 'M', '癶'), + (0x2F69, 'M', '白'), + (0x2F6A, 'M', '皮'), + (0x2F6B, 'M', '皿'), + (0x2F6C, 'M', '目'), + (0x2F6D, 'M', '矛'), + (0x2F6E, 'M', '矢'), + (0x2F6F, 'M', '石'), + (0x2F70, 'M', '示'), + (0x2F71, 'M', '禸'), + (0x2F72, 'M', '禾'), + (0x2F73, 'M', '穴'), + (0x2F74, 'M', '立'), + (0x2F75, 'M', '竹'), + (0x2F76, 'M', '米'), + (0x2F77, 'M', '糸'), + (0x2F78, 'M', '缶'), + (0x2F79, 'M', '网'), + ] + +def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F7A, 'M', '羊'), + (0x2F7B, 'M', '羽'), + (0x2F7C, 'M', '老'), + (0x2F7D, 'M', '而'), + (0x2F7E, 'M', '耒'), + (0x2F7F, 'M', '耳'), + (0x2F80, 'M', '聿'), + (0x2F81, 'M', '肉'), + (0x2F82, 'M', '臣'), + (0x2F83, 'M', '自'), + (0x2F84, 'M', '至'), + (0x2F85, 'M', '臼'), + (0x2F86, 'M', '舌'), + (0x2F87, 'M', '舛'), + (0x2F88, 'M', '舟'), + (0x2F89, 'M', '艮'), + (0x2F8A, 'M', '色'), + (0x2F8B, 'M', '艸'), + (0x2F8C, 'M', '虍'), + (0x2F8D, 'M', '虫'), + (0x2F8E, 'M', '血'), + (0x2F8F, 'M', '行'), + (0x2F90, 'M', '衣'), + (0x2F91, 'M', '襾'), + (0x2F92, 'M', '見'), + (0x2F93, 'M', '角'), + (0x2F94, 'M', '言'), + (0x2F95, 'M', '谷'), + (0x2F96, 'M', '豆'), + (0x2F97, 'M', '豕'), + (0x2F98, 'M', '豸'), + (0x2F99, 'M', '貝'), + (0x2F9A, 'M', '赤'), + (0x2F9B, 'M', '走'), + (0x2F9C, 'M', '足'), + (0x2F9D, 'M', '身'), + (0x2F9E, 'M', '車'), + (0x2F9F, 'M', '辛'), + (0x2FA0, 'M', '辰'), + (0x2FA1, 'M', '辵'), + (0x2FA2, 'M', '邑'), + (0x2FA3, 'M', '酉'), + (0x2FA4, 'M', '釆'), + (0x2FA5, 'M', '里'), + (0x2FA6, 'M', '金'), + (0x2FA7, 'M', '長'), + (0x2FA8, 'M', '門'), + (0x2FA9, 'M', '阜'), + (0x2FAA, 'M', '隶'), + (0x2FAB, 'M', '隹'), + (0x2FAC, 'M', '雨'), + (0x2FAD, 'M', '靑'), + (0x2FAE, 'M', '非'), + (0x2FAF, 'M', '面'), + (0x2FB0, 'M', '革'), + (0x2FB1, 'M', '韋'), + (0x2FB2, 'M', '韭'), + (0x2FB3, 'M', '音'), + (0x2FB4, 'M', '頁'), + (0x2FB5, 'M', '風'), + (0x2FB6, 'M', '飛'), + (0x2FB7, 'M', '食'), + (0x2FB8, 'M', '首'), + (0x2FB9, 'M', '香'), + (0x2FBA, 'M', '馬'), + (0x2FBB, 'M', '骨'), + (0x2FBC, 'M', '高'), + (0x2FBD, 'M', '髟'), + (0x2FBE, 'M', '鬥'), + (0x2FBF, 'M', '鬯'), + (0x2FC0, 'M', '鬲'), + (0x2FC1, 'M', '鬼'), + (0x2FC2, 'M', '魚'), + (0x2FC3, 'M', '鳥'), + (0x2FC4, 'M', '鹵'), + (0x2FC5, 'M', '鹿'), + (0x2FC6, 'M', '麥'), + (0x2FC7, 'M', '麻'), + (0x2FC8, 'M', '黃'), + (0x2FC9, 'M', '黍'), + (0x2FCA, 'M', '黑'), + (0x2FCB, 'M', '黹'), + (0x2FCC, 'M', '黽'), + (0x2FCD, 'M', '鼎'), + (0x2FCE, 'M', '鼓'), + (0x2FCF, 'M', '鼠'), + (0x2FD0, 'M', '鼻'), + (0x2FD1, 'M', '齊'), + (0x2FD2, 'M', '齒'), + (0x2FD3, 'M', '龍'), + (0x2FD4, 'M', '龜'), + (0x2FD5, 'M', '龠'), + (0x2FD6, 'X'), + (0x3000, '3', ' '), + (0x3001, 'V'), + (0x3002, 'M', '.'), + (0x3003, 'V'), + (0x3036, 'M', '〒'), + (0x3037, 'V'), + (0x3038, 'M', '十'), + ] + +def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3039, 'M', '卄'), + (0x303A, 'M', '卅'), + (0x303B, 'V'), + (0x3040, 'X'), + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', ' ゙'), + (0x309C, '3', ' ゚'), + (0x309D, 'V'), + (0x309F, 'M', 'より'), + (0x30A0, 'V'), + (0x30FF, 'M', 'コト'), + (0x3100, 'X'), + (0x3105, 'V'), + (0x3130, 'X'), + (0x3131, 'M', 'ᄀ'), + (0x3132, 'M', 'ᄁ'), + (0x3133, 'M', 'ᆪ'), + (0x3134, 'M', 'ᄂ'), + (0x3135, 'M', 'ᆬ'), + (0x3136, 'M', 'ᆭ'), + (0x3137, 'M', 'ᄃ'), + (0x3138, 'M', 'ᄄ'), + (0x3139, 'M', 'ᄅ'), + (0x313A, 'M', 'ᆰ'), + (0x313B, 'M', 'ᆱ'), + (0x313C, 'M', 'ᆲ'), + (0x313D, 'M', 'ᆳ'), + (0x313E, 'M', 'ᆴ'), + (0x313F, 'M', 'ᆵ'), + (0x3140, 'M', 'ᄚ'), + (0x3141, 'M', 'ᄆ'), + (0x3142, 'M', 'ᄇ'), + (0x3143, 'M', 'ᄈ'), + (0x3144, 'M', 'ᄡ'), + (0x3145, 'M', 'ᄉ'), + (0x3146, 'M', 'ᄊ'), + (0x3147, 'M', 'ᄋ'), + (0x3148, 'M', 'ᄌ'), + (0x3149, 'M', 'ᄍ'), + (0x314A, 'M', 'ᄎ'), + (0x314B, 'M', 'ᄏ'), + (0x314C, 'M', 'ᄐ'), + (0x314D, 'M', 'ᄑ'), + (0x314E, 'M', 'ᄒ'), + (0x314F, 'M', 'ᅡ'), + (0x3150, 'M', 'ᅢ'), + (0x3151, 'M', 'ᅣ'), + (0x3152, 'M', 'ᅤ'), + (0x3153, 'M', 'ᅥ'), + (0x3154, 'M', 'ᅦ'), + (0x3155, 'M', 'ᅧ'), + (0x3156, 'M', 'ᅨ'), + (0x3157, 'M', 'ᅩ'), + (0x3158, 'M', 'ᅪ'), + (0x3159, 'M', 'ᅫ'), + (0x315A, 'M', 'ᅬ'), + (0x315B, 'M', 'ᅭ'), + (0x315C, 'M', 'ᅮ'), + (0x315D, 'M', 'ᅯ'), + (0x315E, 'M', 'ᅰ'), + (0x315F, 'M', 'ᅱ'), + (0x3160, 'M', 'ᅲ'), + (0x3161, 'M', 'ᅳ'), + (0x3162, 'M', 'ᅴ'), + (0x3163, 'M', 'ᅵ'), + (0x3164, 'X'), + (0x3165, 'M', 'ᄔ'), + (0x3166, 'M', 'ᄕ'), + (0x3167, 'M', 'ᇇ'), + (0x3168, 'M', 'ᇈ'), + (0x3169, 'M', 'ᇌ'), + (0x316A, 'M', 'ᇎ'), + (0x316B, 'M', 'ᇓ'), + (0x316C, 'M', 'ᇗ'), + (0x316D, 'M', 'ᇙ'), + (0x316E, 'M', 'ᄜ'), + (0x316F, 'M', 'ᇝ'), + (0x3170, 'M', 'ᇟ'), + (0x3171, 'M', 'ᄝ'), + (0x3172, 'M', 'ᄞ'), + (0x3173, 'M', 'ᄠ'), + (0x3174, 'M', 'ᄢ'), + (0x3175, 'M', 'ᄣ'), + (0x3176, 'M', 'ᄧ'), + (0x3177, 'M', 'ᄩ'), + (0x3178, 'M', 'ᄫ'), + (0x3179, 'M', 'ᄬ'), + (0x317A, 'M', 'ᄭ'), + (0x317B, 'M', 'ᄮ'), + (0x317C, 'M', 'ᄯ'), + (0x317D, 'M', 'ᄲ'), + (0x317E, 'M', 'ᄶ'), + (0x317F, 'M', 'ᅀ'), + (0x3180, 'M', 'ᅇ'), + (0x3181, 'M', 'ᅌ'), + (0x3182, 'M', 'ᇱ'), + (0x3183, 'M', 'ᇲ'), + (0x3184, 'M', 'ᅗ'), + ] + +def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3185, 'M', 'ᅘ'), + (0x3186, 'M', 'ᅙ'), + (0x3187, 'M', 'ᆄ'), + (0x3188, 'M', 'ᆅ'), + (0x3189, 'M', 'ᆈ'), + (0x318A, 'M', 'ᆑ'), + (0x318B, 'M', 'ᆒ'), + (0x318C, 'M', 'ᆔ'), + (0x318D, 'M', 'ᆞ'), + (0x318E, 'M', 'ᆡ'), + (0x318F, 'X'), + (0x3190, 'V'), + (0x3192, 'M', '一'), + (0x3193, 'M', '二'), + (0x3194, 'M', '三'), + (0x3195, 'M', '四'), + (0x3196, 'M', '上'), + (0x3197, 'M', '中'), + (0x3198, 'M', '下'), + (0x3199, 'M', '甲'), + (0x319A, 'M', '乙'), + (0x319B, 'M', '丙'), + (0x319C, 'M', '丁'), + (0x319D, 'M', '天'), + (0x319E, 'M', '地'), + (0x319F, 'M', '人'), + (0x31A0, 'V'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', '(ᄀ)'), + (0x3201, '3', '(ᄂ)'), + (0x3202, '3', '(ᄃ)'), + (0x3203, '3', '(ᄅ)'), + (0x3204, '3', '(ᄆ)'), + (0x3205, '3', '(ᄇ)'), + (0x3206, '3', '(ᄉ)'), + (0x3207, '3', '(ᄋ)'), + (0x3208, '3', '(ᄌ)'), + (0x3209, '3', '(ᄎ)'), + (0x320A, '3', '(ᄏ)'), + (0x320B, '3', '(ᄐ)'), + (0x320C, '3', '(ᄑ)'), + (0x320D, '3', '(ᄒ)'), + (0x320E, '3', '(가)'), + (0x320F, '3', '(나)'), + (0x3210, '3', '(다)'), + (0x3211, '3', '(라)'), + (0x3212, '3', '(마)'), + (0x3213, '3', '(바)'), + (0x3214, '3', '(사)'), + (0x3215, '3', '(아)'), + (0x3216, '3', '(자)'), + (0x3217, '3', '(차)'), + (0x3218, '3', '(카)'), + (0x3219, '3', '(타)'), + (0x321A, '3', '(파)'), + (0x321B, '3', '(하)'), + (0x321C, '3', '(주)'), + (0x321D, '3', '(오전)'), + (0x321E, '3', '(오후)'), + (0x321F, 'X'), + (0x3220, '3', '(一)'), + (0x3221, '3', '(二)'), + (0x3222, '3', '(三)'), + (0x3223, '3', '(四)'), + (0x3224, '3', '(五)'), + (0x3225, '3', '(六)'), + (0x3226, '3', '(七)'), + (0x3227, '3', '(八)'), + (0x3228, '3', '(九)'), + (0x3229, '3', '(十)'), + (0x322A, '3', '(月)'), + (0x322B, '3', '(火)'), + (0x322C, '3', '(水)'), + (0x322D, '3', '(木)'), + (0x322E, '3', '(金)'), + (0x322F, '3', '(土)'), + (0x3230, '3', '(日)'), + (0x3231, '3', '(株)'), + (0x3232, '3', '(有)'), + (0x3233, '3', '(社)'), + (0x3234, '3', '(名)'), + (0x3235, '3', '(特)'), + (0x3236, '3', '(財)'), + (0x3237, '3', '(祝)'), + (0x3238, '3', '(労)'), + (0x3239, '3', '(代)'), + (0x323A, '3', '(呼)'), + (0x323B, '3', '(学)'), + (0x323C, '3', '(監)'), + (0x323D, '3', '(企)'), + (0x323E, '3', '(資)'), + (0x323F, '3', '(協)'), + (0x3240, '3', '(祭)'), + (0x3241, '3', '(休)'), + (0x3242, '3', '(自)'), + (0x3243, '3', '(至)'), + (0x3244, 'M', '問'), + (0x3245, 'M', '幼'), + (0x3246, 'M', '文'), + ] + +def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3247, 'M', '箏'), + (0x3248, 'V'), + (0x3250, 'M', 'pte'), + (0x3251, 'M', '21'), + (0x3252, 'M', '22'), + (0x3253, 'M', '23'), + (0x3254, 'M', '24'), + (0x3255, 'M', '25'), + (0x3256, 'M', '26'), + (0x3257, 'M', '27'), + (0x3258, 'M', '28'), + (0x3259, 'M', '29'), + (0x325A, 'M', '30'), + (0x325B, 'M', '31'), + (0x325C, 'M', '32'), + (0x325D, 'M', '33'), + (0x325E, 'M', '34'), + (0x325F, 'M', '35'), + (0x3260, 'M', 'ᄀ'), + (0x3261, 'M', 'ᄂ'), + (0x3262, 'M', 'ᄃ'), + (0x3263, 'M', 'ᄅ'), + (0x3264, 'M', 'ᄆ'), + (0x3265, 'M', 'ᄇ'), + (0x3266, 'M', 'ᄉ'), + (0x3267, 'M', 'ᄋ'), + (0x3268, 'M', 'ᄌ'), + (0x3269, 'M', 'ᄎ'), + (0x326A, 'M', 'ᄏ'), + (0x326B, 'M', 'ᄐ'), + (0x326C, 'M', 'ᄑ'), + (0x326D, 'M', 'ᄒ'), + (0x326E, 'M', '가'), + (0x326F, 'M', '나'), + (0x3270, 'M', '다'), + (0x3271, 'M', '라'), + (0x3272, 'M', '마'), + (0x3273, 'M', '바'), + (0x3274, 'M', '사'), + (0x3275, 'M', '아'), + (0x3276, 'M', '자'), + (0x3277, 'M', '차'), + (0x3278, 'M', '카'), + (0x3279, 'M', '타'), + (0x327A, 'M', '파'), + (0x327B, 'M', '하'), + (0x327C, 'M', '참고'), + (0x327D, 'M', '주의'), + (0x327E, 'M', '우'), + (0x327F, 'V'), + (0x3280, 'M', '一'), + (0x3281, 'M', '二'), + (0x3282, 'M', '三'), + (0x3283, 'M', '四'), + (0x3284, 'M', '五'), + (0x3285, 'M', '六'), + (0x3286, 'M', '七'), + (0x3287, 'M', '八'), + (0x3288, 'M', '九'), + (0x3289, 'M', '十'), + (0x328A, 'M', '月'), + (0x328B, 'M', '火'), + (0x328C, 'M', '水'), + (0x328D, 'M', '木'), + (0x328E, 'M', '金'), + (0x328F, 'M', '土'), + (0x3290, 'M', '日'), + (0x3291, 'M', '株'), + (0x3292, 'M', '有'), + (0x3293, 'M', '社'), + (0x3294, 'M', '名'), + (0x3295, 'M', '特'), + (0x3296, 'M', '財'), + (0x3297, 'M', '祝'), + (0x3298, 'M', '労'), + (0x3299, 'M', '秘'), + (0x329A, 'M', '男'), + (0x329B, 'M', '女'), + (0x329C, 'M', '適'), + (0x329D, 'M', '優'), + (0x329E, 'M', '印'), + (0x329F, 'M', '注'), + (0x32A0, 'M', '項'), + (0x32A1, 'M', '休'), + (0x32A2, 'M', '写'), + (0x32A3, 'M', '正'), + (0x32A4, 'M', '上'), + (0x32A5, 'M', '中'), + (0x32A6, 'M', '下'), + (0x32A7, 'M', '左'), + (0x32A8, 'M', '右'), + (0x32A9, 'M', '医'), + (0x32AA, 'M', '宗'), + (0x32AB, 'M', '学'), + (0x32AC, 'M', '監'), + (0x32AD, 'M', '企'), + (0x32AE, 'M', '資'), + (0x32AF, 'M', '協'), + (0x32B0, 'M', '夜'), + (0x32B1, 'M', '36'), + ] + +def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x32B2, 'M', '37'), + (0x32B3, 'M', '38'), + (0x32B4, 'M', '39'), + (0x32B5, 'M', '40'), + (0x32B6, 'M', '41'), + (0x32B7, 'M', '42'), + (0x32B8, 'M', '43'), + (0x32B9, 'M', '44'), + (0x32BA, 'M', '45'), + (0x32BB, 'M', '46'), + (0x32BC, 'M', '47'), + (0x32BD, 'M', '48'), + (0x32BE, 'M', '49'), + (0x32BF, 'M', '50'), + (0x32C0, 'M', '1月'), + (0x32C1, 'M', '2月'), + (0x32C2, 'M', '3月'), + (0x32C3, 'M', '4月'), + (0x32C4, 'M', '5月'), + (0x32C5, 'M', '6月'), + (0x32C6, 'M', '7月'), + (0x32C7, 'M', '8月'), + (0x32C8, 'M', '9月'), + (0x32C9, 'M', '10月'), + (0x32CA, 'M', '11月'), + (0x32CB, 'M', '12月'), + (0x32CC, 'M', 'hg'), + (0x32CD, 'M', 'erg'), + (0x32CE, 'M', 'ev'), + (0x32CF, 'M', 'ltd'), + (0x32D0, 'M', 'ア'), + (0x32D1, 'M', 'イ'), + (0x32D2, 'M', 'ウ'), + (0x32D3, 'M', 'エ'), + (0x32D4, 'M', 'オ'), + (0x32D5, 'M', 'カ'), + (0x32D6, 'M', 'キ'), + (0x32D7, 'M', 'ク'), + (0x32D8, 'M', 'ケ'), + (0x32D9, 'M', 'コ'), + (0x32DA, 'M', 'サ'), + (0x32DB, 'M', 'シ'), + (0x32DC, 'M', 'ス'), + (0x32DD, 'M', 'セ'), + (0x32DE, 'M', 'ソ'), + (0x32DF, 'M', 'タ'), + (0x32E0, 'M', 'チ'), + (0x32E1, 'M', 'ツ'), + (0x32E2, 'M', 'テ'), + (0x32E3, 'M', 'ト'), + (0x32E4, 'M', 'ナ'), + (0x32E5, 'M', 'ニ'), + (0x32E6, 'M', 'ヌ'), + (0x32E7, 'M', 'ネ'), + (0x32E8, 'M', 'ノ'), + (0x32E9, 'M', 'ハ'), + (0x32EA, 'M', 'ヒ'), + (0x32EB, 'M', 'フ'), + (0x32EC, 'M', 'ヘ'), + (0x32ED, 'M', 'ホ'), + (0x32EE, 'M', 'マ'), + (0x32EF, 'M', 'ミ'), + (0x32F0, 'M', 'ム'), + (0x32F1, 'M', 'メ'), + (0x32F2, 'M', 'モ'), + (0x32F3, 'M', 'ヤ'), + (0x32F4, 'M', 'ユ'), + (0x32F5, 'M', 'ヨ'), + (0x32F6, 'M', 'ラ'), + (0x32F7, 'M', 'リ'), + (0x32F8, 'M', 'ル'), + (0x32F9, 'M', 'レ'), + (0x32FA, 'M', 'ロ'), + (0x32FB, 'M', 'ワ'), + (0x32FC, 'M', 'ヰ'), + (0x32FD, 'M', 'ヱ'), + (0x32FE, 'M', 'ヲ'), + (0x32FF, 'M', '令和'), + (0x3300, 'M', 'アパート'), + (0x3301, 'M', 'アルファ'), + (0x3302, 'M', 'アンペア'), + (0x3303, 'M', 'アール'), + (0x3304, 'M', 'イニング'), + (0x3305, 'M', 'インチ'), + (0x3306, 'M', 'ウォン'), + (0x3307, 'M', 'エスクード'), + (0x3308, 'M', 'エーカー'), + (0x3309, 'M', 'オンス'), + (0x330A, 'M', 'オーム'), + (0x330B, 'M', 'カイリ'), + (0x330C, 'M', 'カラット'), + (0x330D, 'M', 'カロリー'), + (0x330E, 'M', 'ガロン'), + (0x330F, 'M', 'ガンマ'), + (0x3310, 'M', 'ギガ'), + (0x3311, 'M', 'ギニー'), + (0x3312, 'M', 'キュリー'), + (0x3313, 'M', 'ギルダー'), + (0x3314, 'M', 'キロ'), + (0x3315, 'M', 'キログラム'), + ] + +def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3316, 'M', 'キロメートル'), + (0x3317, 'M', 'キロワット'), + (0x3318, 'M', 'グラム'), + (0x3319, 'M', 'グラムトン'), + (0x331A, 'M', 'クルゼイロ'), + (0x331B, 'M', 'クローネ'), + (0x331C, 'M', 'ケース'), + (0x331D, 'M', 'コルナ'), + (0x331E, 'M', 'コーポ'), + (0x331F, 'M', 'サイクル'), + (0x3320, 'M', 'サンチーム'), + (0x3321, 'M', 'シリング'), + (0x3322, 'M', 'センチ'), + (0x3323, 'M', 'セント'), + (0x3324, 'M', 'ダース'), + (0x3325, 'M', 'デシ'), + (0x3326, 'M', 'ドル'), + (0x3327, 'M', 'トン'), + (0x3328, 'M', 'ナノ'), + (0x3329, 'M', 'ノット'), + (0x332A, 'M', 'ハイツ'), + (0x332B, 'M', 'パーセント'), + (0x332C, 'M', 'パーツ'), + (0x332D, 'M', 'バーレル'), + (0x332E, 'M', 'ピアストル'), + (0x332F, 'M', 'ピクル'), + (0x3330, 'M', 'ピコ'), + (0x3331, 'M', 'ビル'), + (0x3332, 'M', 'ファラッド'), + (0x3333, 'M', 'フィート'), + (0x3334, 'M', 'ブッシェル'), + (0x3335, 'M', 'フラン'), + (0x3336, 'M', 'ヘクタール'), + (0x3337, 'M', 'ペソ'), + (0x3338, 'M', 'ペニヒ'), + (0x3339, 'M', 'ヘルツ'), + (0x333A, 'M', 'ペンス'), + (0x333B, 'M', 'ページ'), + (0x333C, 'M', 'ベータ'), + (0x333D, 'M', 'ポイント'), + (0x333E, 'M', 'ボルト'), + (0x333F, 'M', 'ホン'), + (0x3340, 'M', 'ポンド'), + (0x3341, 'M', 'ホール'), + (0x3342, 'M', 'ホーン'), + (0x3343, 'M', 'マイクロ'), + (0x3344, 'M', 'マイル'), + (0x3345, 'M', 'マッハ'), + (0x3346, 'M', 'マルク'), + (0x3347, 'M', 'マンション'), + (0x3348, 'M', 'ミクロン'), + (0x3349, 'M', 'ミリ'), + (0x334A, 'M', 'ミリバール'), + (0x334B, 'M', 'メガ'), + (0x334C, 'M', 'メガトン'), + (0x334D, 'M', 'メートル'), + (0x334E, 'M', 'ヤード'), + (0x334F, 'M', 'ヤール'), + (0x3350, 'M', 'ユアン'), + (0x3351, 'M', 'リットル'), + (0x3352, 'M', 'リラ'), + (0x3353, 'M', 'ルピー'), + (0x3354, 'M', 'ルーブル'), + (0x3355, 'M', 'レム'), + (0x3356, 'M', 'レントゲン'), + (0x3357, 'M', 'ワット'), + (0x3358, 'M', '0点'), + (0x3359, 'M', '1点'), + (0x335A, 'M', '2点'), + (0x335B, 'M', '3点'), + (0x335C, 'M', '4点'), + (0x335D, 'M', '5点'), + (0x335E, 'M', '6点'), + (0x335F, 'M', '7点'), + (0x3360, 'M', '8点'), + (0x3361, 'M', '9点'), + (0x3362, 'M', '10点'), + (0x3363, 'M', '11点'), + (0x3364, 'M', '12点'), + (0x3365, 'M', '13点'), + (0x3366, 'M', '14点'), + (0x3367, 'M', '15点'), + (0x3368, 'M', '16点'), + (0x3369, 'M', '17点'), + (0x336A, 'M', '18点'), + (0x336B, 'M', '19点'), + (0x336C, 'M', '20点'), + (0x336D, 'M', '21点'), + (0x336E, 'M', '22点'), + (0x336F, 'M', '23点'), + (0x3370, 'M', '24点'), + (0x3371, 'M', 'hpa'), + (0x3372, 'M', 'da'), + (0x3373, 'M', 'au'), + (0x3374, 'M', 'bar'), + (0x3375, 'M', 'ov'), + (0x3376, 'M', 'pc'), + (0x3377, 'M', 'dm'), + (0x3378, 'M', 'dm2'), + (0x3379, 'M', 'dm3'), + ] + +def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x337A, 'M', 'iu'), + (0x337B, 'M', '平成'), + (0x337C, 'M', '昭和'), + (0x337D, 'M', '大正'), + (0x337E, 'M', '明治'), + (0x337F, 'M', '株式会社'), + (0x3380, 'M', 'pa'), + (0x3381, 'M', 'na'), + (0x3382, 'M', 'μa'), + (0x3383, 'M', 'ma'), + (0x3384, 'M', 'ka'), + (0x3385, 'M', 'kb'), + (0x3386, 'M', 'mb'), + (0x3387, 'M', 'gb'), + (0x3388, 'M', 'cal'), + (0x3389, 'M', 'kcal'), + (0x338A, 'M', 'pf'), + (0x338B, 'M', 'nf'), + (0x338C, 'M', 'μf'), + (0x338D, 'M', 'μg'), + (0x338E, 'M', 'mg'), + (0x338F, 'M', 'kg'), + (0x3390, 'M', 'hz'), + (0x3391, 'M', 'khz'), + (0x3392, 'M', 'mhz'), + (0x3393, 'M', 'ghz'), + (0x3394, 'M', 'thz'), + (0x3395, 'M', 'μl'), + (0x3396, 'M', 'ml'), + (0x3397, 'M', 'dl'), + (0x3398, 'M', 'kl'), + (0x3399, 'M', 'fm'), + (0x339A, 'M', 'nm'), + (0x339B, 'M', 'μm'), + (0x339C, 'M', 'mm'), + (0x339D, 'M', 'cm'), + (0x339E, 'M', 'km'), + (0x339F, 'M', 'mm2'), + (0x33A0, 'M', 'cm2'), + (0x33A1, 'M', 'm2'), + (0x33A2, 'M', 'km2'), + (0x33A3, 'M', 'mm3'), + (0x33A4, 'M', 'cm3'), + (0x33A5, 'M', 'm3'), + (0x33A6, 'M', 'km3'), + (0x33A7, 'M', 'm∕s'), + (0x33A8, 'M', 'm∕s2'), + (0x33A9, 'M', 'pa'), + (0x33AA, 'M', 'kpa'), + (0x33AB, 'M', 'mpa'), + (0x33AC, 'M', 'gpa'), + (0x33AD, 'M', 'rad'), + (0x33AE, 'M', 'rad∕s'), + (0x33AF, 'M', 'rad∕s2'), + (0x33B0, 'M', 'ps'), + (0x33B1, 'M', 'ns'), + (0x33B2, 'M', 'μs'), + (0x33B3, 'M', 'ms'), + (0x33B4, 'M', 'pv'), + (0x33B5, 'M', 'nv'), + (0x33B6, 'M', 'μv'), + (0x33B7, 'M', 'mv'), + (0x33B8, 'M', 'kv'), + (0x33B9, 'M', 'mv'), + (0x33BA, 'M', 'pw'), + (0x33BB, 'M', 'nw'), + (0x33BC, 'M', 'μw'), + (0x33BD, 'M', 'mw'), + (0x33BE, 'M', 'kw'), + (0x33BF, 'M', 'mw'), + (0x33C0, 'M', 'kω'), + (0x33C1, 'M', 'mω'), + (0x33C2, 'X'), + (0x33C3, 'M', 'bq'), + (0x33C4, 'M', 'cc'), + (0x33C5, 'M', 'cd'), + (0x33C6, 'M', 'c∕kg'), + (0x33C7, 'X'), + (0x33C8, 'M', 'db'), + (0x33C9, 'M', 'gy'), + (0x33CA, 'M', 'ha'), + (0x33CB, 'M', 'hp'), + (0x33CC, 'M', 'in'), + (0x33CD, 'M', 'kk'), + (0x33CE, 'M', 'km'), + (0x33CF, 'M', 'kt'), + (0x33D0, 'M', 'lm'), + (0x33D1, 'M', 'ln'), + (0x33D2, 'M', 'log'), + (0x33D3, 'M', 'lx'), + (0x33D4, 'M', 'mb'), + (0x33D5, 'M', 'mil'), + (0x33D6, 'M', 'mol'), + (0x33D7, 'M', 'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', 'ppm'), + (0x33DA, 'M', 'pr'), + (0x33DB, 'M', 'sr'), + (0x33DC, 'M', 'sv'), + (0x33DD, 'M', 'wb'), + ] + +def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x33DE, 'M', 'v∕m'), + (0x33DF, 'M', 'a∕m'), + (0x33E0, 'M', '1日'), + (0x33E1, 'M', '2日'), + (0x33E2, 'M', '3日'), + (0x33E3, 'M', '4日'), + (0x33E4, 'M', '5日'), + (0x33E5, 'M', '6日'), + (0x33E6, 'M', '7日'), + (0x33E7, 'M', '8日'), + (0x33E8, 'M', '9日'), + (0x33E9, 'M', '10日'), + (0x33EA, 'M', '11日'), + (0x33EB, 'M', '12日'), + (0x33EC, 'M', '13日'), + (0x33ED, 'M', '14日'), + (0x33EE, 'M', '15日'), + (0x33EF, 'M', '16日'), + (0x33F0, 'M', '17日'), + (0x33F1, 'M', '18日'), + (0x33F2, 'M', '19日'), + (0x33F3, 'M', '20日'), + (0x33F4, 'M', '21日'), + (0x33F5, 'M', '22日'), + (0x33F6, 'M', '23日'), + (0x33F7, 'M', '24日'), + (0x33F8, 'M', '25日'), + (0x33F9, 'M', '26日'), + (0x33FA, 'M', '27日'), + (0x33FB, 'M', '28日'), + (0x33FC, 'M', '29日'), + (0x33FD, 'M', '30日'), + (0x33FE, 'M', '31日'), + (0x33FF, 'M', 'gal'), + (0x3400, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), + (0xA4D0, 'V'), + (0xA62C, 'X'), + (0xA640, 'M', 'ꙁ'), + (0xA641, 'V'), + (0xA642, 'M', 'ꙃ'), + (0xA643, 'V'), + (0xA644, 'M', 'ꙅ'), + (0xA645, 'V'), + (0xA646, 'M', 'ꙇ'), + (0xA647, 'V'), + (0xA648, 'M', 'ꙉ'), + (0xA649, 'V'), + (0xA64A, 'M', 'ꙋ'), + (0xA64B, 'V'), + (0xA64C, 'M', 'ꙍ'), + (0xA64D, 'V'), + (0xA64E, 'M', 'ꙏ'), + (0xA64F, 'V'), + (0xA650, 'M', 'ꙑ'), + (0xA651, 'V'), + (0xA652, 'M', 'ꙓ'), + (0xA653, 'V'), + (0xA654, 'M', 'ꙕ'), + (0xA655, 'V'), + (0xA656, 'M', 'ꙗ'), + (0xA657, 'V'), + (0xA658, 'M', 'ꙙ'), + (0xA659, 'V'), + (0xA65A, 'M', 'ꙛ'), + (0xA65B, 'V'), + (0xA65C, 'M', 'ꙝ'), + (0xA65D, 'V'), + (0xA65E, 'M', 'ꙟ'), + (0xA65F, 'V'), + (0xA660, 'M', 'ꙡ'), + (0xA661, 'V'), + (0xA662, 'M', 'ꙣ'), + (0xA663, 'V'), + (0xA664, 'M', 'ꙥ'), + (0xA665, 'V'), + (0xA666, 'M', 'ꙧ'), + (0xA667, 'V'), + (0xA668, 'M', 'ꙩ'), + (0xA669, 'V'), + (0xA66A, 'M', 'ꙫ'), + (0xA66B, 'V'), + (0xA66C, 'M', 'ꙭ'), + (0xA66D, 'V'), + (0xA680, 'M', 'ꚁ'), + (0xA681, 'V'), + (0xA682, 'M', 'ꚃ'), + (0xA683, 'V'), + (0xA684, 'M', 'ꚅ'), + (0xA685, 'V'), + (0xA686, 'M', 'ꚇ'), + (0xA687, 'V'), + (0xA688, 'M', 'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', 'ꚋ'), + (0xA68B, 'V'), + (0xA68C, 'M', 'ꚍ'), + (0xA68D, 'V'), + ] + +def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA68E, 'M', 'ꚏ'), + (0xA68F, 'V'), + (0xA690, 'M', 'ꚑ'), + (0xA691, 'V'), + (0xA692, 'M', 'ꚓ'), + (0xA693, 'V'), + (0xA694, 'M', 'ꚕ'), + (0xA695, 'V'), + (0xA696, 'M', 'ꚗ'), + (0xA697, 'V'), + (0xA698, 'M', 'ꚙ'), + (0xA699, 'V'), + (0xA69A, 'M', 'ꚛ'), + (0xA69B, 'V'), + (0xA69C, 'M', 'ъ'), + (0xA69D, 'M', 'ь'), + (0xA69E, 'V'), + (0xA6F8, 'X'), + (0xA700, 'V'), + (0xA722, 'M', 'ꜣ'), + (0xA723, 'V'), + (0xA724, 'M', 'ꜥ'), + (0xA725, 'V'), + (0xA726, 'M', 'ꜧ'), + (0xA727, 'V'), + (0xA728, 'M', 'ꜩ'), + (0xA729, 'V'), + (0xA72A, 'M', 'ꜫ'), + (0xA72B, 'V'), + (0xA72C, 'M', 'ꜭ'), + (0xA72D, 'V'), + (0xA72E, 'M', 'ꜯ'), + (0xA72F, 'V'), + (0xA732, 'M', 'ꜳ'), + (0xA733, 'V'), + (0xA734, 'M', 'ꜵ'), + (0xA735, 'V'), + (0xA736, 'M', 'ꜷ'), + (0xA737, 'V'), + (0xA738, 'M', 'ꜹ'), + (0xA739, 'V'), + (0xA73A, 'M', 'ꜻ'), + (0xA73B, 'V'), + (0xA73C, 'M', 'ꜽ'), + (0xA73D, 'V'), + (0xA73E, 'M', 'ꜿ'), + (0xA73F, 'V'), + (0xA740, 'M', 'ꝁ'), + (0xA741, 'V'), + (0xA742, 'M', 'ꝃ'), + (0xA743, 'V'), + (0xA744, 'M', 'ꝅ'), + (0xA745, 'V'), + (0xA746, 'M', 'ꝇ'), + (0xA747, 'V'), + (0xA748, 'M', 'ꝉ'), + (0xA749, 'V'), + (0xA74A, 'M', 'ꝋ'), + (0xA74B, 'V'), + (0xA74C, 'M', 'ꝍ'), + (0xA74D, 'V'), + (0xA74E, 'M', 'ꝏ'), + (0xA74F, 'V'), + (0xA750, 'M', 'ꝑ'), + (0xA751, 'V'), + (0xA752, 'M', 'ꝓ'), + (0xA753, 'V'), + (0xA754, 'M', 'ꝕ'), + (0xA755, 'V'), + (0xA756, 'M', 'ꝗ'), + (0xA757, 'V'), + (0xA758, 'M', 'ꝙ'), + (0xA759, 'V'), + (0xA75A, 'M', 'ꝛ'), + (0xA75B, 'V'), + (0xA75C, 'M', 'ꝝ'), + (0xA75D, 'V'), + (0xA75E, 'M', 'ꝟ'), + (0xA75F, 'V'), + (0xA760, 'M', 'ꝡ'), + (0xA761, 'V'), + (0xA762, 'M', 'ꝣ'), + (0xA763, 'V'), + (0xA764, 'M', 'ꝥ'), + (0xA765, 'V'), + (0xA766, 'M', 'ꝧ'), + (0xA767, 'V'), + (0xA768, 'M', 'ꝩ'), + (0xA769, 'V'), + (0xA76A, 'M', 'ꝫ'), + (0xA76B, 'V'), + (0xA76C, 'M', 'ꝭ'), + (0xA76D, 'V'), + (0xA76E, 'M', 'ꝯ'), + (0xA76F, 'V'), + (0xA770, 'M', 'ꝯ'), + (0xA771, 'V'), + (0xA779, 'M', 'ꝺ'), + (0xA77A, 'V'), + (0xA77B, 'M', 'ꝼ'), + ] + +def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA77C, 'V'), + (0xA77D, 'M', 'ᵹ'), + (0xA77E, 'M', 'ꝿ'), + (0xA77F, 'V'), + (0xA780, 'M', 'ꞁ'), + (0xA781, 'V'), + (0xA782, 'M', 'ꞃ'), + (0xA783, 'V'), + (0xA784, 'M', 'ꞅ'), + (0xA785, 'V'), + (0xA786, 'M', 'ꞇ'), + (0xA787, 'V'), + (0xA78B, 'M', 'ꞌ'), + (0xA78C, 'V'), + (0xA78D, 'M', 'ɥ'), + (0xA78E, 'V'), + (0xA790, 'M', 'ꞑ'), + (0xA791, 'V'), + (0xA792, 'M', 'ꞓ'), + (0xA793, 'V'), + (0xA796, 'M', 'ꞗ'), + (0xA797, 'V'), + (0xA798, 'M', 'ꞙ'), + (0xA799, 'V'), + (0xA79A, 'M', 'ꞛ'), + (0xA79B, 'V'), + (0xA79C, 'M', 'ꞝ'), + (0xA79D, 'V'), + (0xA79E, 'M', 'ꞟ'), + (0xA79F, 'V'), + (0xA7A0, 'M', 'ꞡ'), + (0xA7A1, 'V'), + (0xA7A2, 'M', 'ꞣ'), + (0xA7A3, 'V'), + (0xA7A4, 'M', 'ꞥ'), + (0xA7A5, 'V'), + (0xA7A6, 'M', 'ꞧ'), + (0xA7A7, 'V'), + (0xA7A8, 'M', 'ꞩ'), + (0xA7A9, 'V'), + (0xA7AA, 'M', 'ɦ'), + (0xA7AB, 'M', 'ɜ'), + (0xA7AC, 'M', 'ɡ'), + (0xA7AD, 'M', 'ɬ'), + (0xA7AE, 'M', 'ɪ'), + (0xA7AF, 'V'), + (0xA7B0, 'M', 'ʞ'), + (0xA7B1, 'M', 'ʇ'), + (0xA7B2, 'M', 'ʝ'), + (0xA7B3, 'M', 'ꭓ'), + (0xA7B4, 'M', 'ꞵ'), + (0xA7B5, 'V'), + (0xA7B6, 'M', 'ꞷ'), + (0xA7B7, 'V'), + (0xA7B8, 'M', 'ꞹ'), + (0xA7B9, 'V'), + (0xA7BA, 'M', 'ꞻ'), + (0xA7BB, 'V'), + (0xA7BC, 'M', 'ꞽ'), + (0xA7BD, 'V'), + (0xA7BE, 'M', 'ꞿ'), + (0xA7BF, 'V'), + (0xA7C0, 'M', 'ꟁ'), + (0xA7C1, 'V'), + (0xA7C2, 'M', 'ꟃ'), + (0xA7C3, 'V'), + (0xA7C4, 'M', 'ꞔ'), + (0xA7C5, 'M', 'ʂ'), + (0xA7C6, 'M', 'ᶎ'), + (0xA7C7, 'M', 'ꟈ'), + (0xA7C8, 'V'), + (0xA7C9, 'M', 'ꟊ'), + (0xA7CA, 'V'), + (0xA7CB, 'X'), + (0xA7D0, 'M', 'ꟑ'), + (0xA7D1, 'V'), + (0xA7D2, 'X'), + (0xA7D3, 'V'), + (0xA7D4, 'X'), + (0xA7D5, 'V'), + (0xA7D6, 'M', 'ꟗ'), + (0xA7D7, 'V'), + (0xA7D8, 'M', 'ꟙ'), + (0xA7D9, 'V'), + (0xA7DA, 'X'), + (0xA7F2, 'M', 'c'), + (0xA7F3, 'M', 'f'), + (0xA7F4, 'M', 'q'), + (0xA7F5, 'M', 'ꟶ'), + (0xA7F6, 'V'), + (0xA7F8, 'M', 'ħ'), + (0xA7F9, 'M', 'œ'), + (0xA7FA, 'V'), + (0xA82D, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C6, 'X'), + ] + +def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9FF, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAAC3, 'X'), + (0xAADB, 'V'), + (0xAAF7, 'X'), + (0xAB01, 'V'), + (0xAB07, 'X'), + (0xAB09, 'V'), + (0xAB0F, 'X'), + (0xAB11, 'V'), + (0xAB17, 'X'), + (0xAB20, 'V'), + (0xAB27, 'X'), + (0xAB28, 'V'), + (0xAB2F, 'X'), + (0xAB30, 'V'), + (0xAB5C, 'M', 'ꜧ'), + (0xAB5D, 'M', 'ꬷ'), + (0xAB5E, 'M', 'ɫ'), + (0xAB5F, 'M', 'ꭒ'), + (0xAB60, 'V'), + (0xAB69, 'M', 'ʍ'), + (0xAB6A, 'V'), + (0xAB6C, 'X'), + (0xAB70, 'M', 'Ꭰ'), + (0xAB71, 'M', 'Ꭱ'), + (0xAB72, 'M', 'Ꭲ'), + (0xAB73, 'M', 'Ꭳ'), + (0xAB74, 'M', 'Ꭴ'), + (0xAB75, 'M', 'Ꭵ'), + (0xAB76, 'M', 'Ꭶ'), + (0xAB77, 'M', 'Ꭷ'), + (0xAB78, 'M', 'Ꭸ'), + (0xAB79, 'M', 'Ꭹ'), + (0xAB7A, 'M', 'Ꭺ'), + (0xAB7B, 'M', 'Ꭻ'), + (0xAB7C, 'M', 'Ꭼ'), + (0xAB7D, 'M', 'Ꭽ'), + (0xAB7E, 'M', 'Ꭾ'), + (0xAB7F, 'M', 'Ꭿ'), + (0xAB80, 'M', 'Ꮀ'), + (0xAB81, 'M', 'Ꮁ'), + (0xAB82, 'M', 'Ꮂ'), + (0xAB83, 'M', 'Ꮃ'), + (0xAB84, 'M', 'Ꮄ'), + (0xAB85, 'M', 'Ꮅ'), + (0xAB86, 'M', 'Ꮆ'), + (0xAB87, 'M', 'Ꮇ'), + (0xAB88, 'M', 'Ꮈ'), + (0xAB89, 'M', 'Ꮉ'), + (0xAB8A, 'M', 'Ꮊ'), + (0xAB8B, 'M', 'Ꮋ'), + (0xAB8C, 'M', 'Ꮌ'), + (0xAB8D, 'M', 'Ꮍ'), + (0xAB8E, 'M', 'Ꮎ'), + (0xAB8F, 'M', 'Ꮏ'), + (0xAB90, 'M', 'Ꮐ'), + (0xAB91, 'M', 'Ꮑ'), + (0xAB92, 'M', 'Ꮒ'), + (0xAB93, 'M', 'Ꮓ'), + (0xAB94, 'M', 'Ꮔ'), + (0xAB95, 'M', 'Ꮕ'), + (0xAB96, 'M', 'Ꮖ'), + (0xAB97, 'M', 'Ꮗ'), + (0xAB98, 'M', 'Ꮘ'), + (0xAB99, 'M', 'Ꮙ'), + (0xAB9A, 'M', 'Ꮚ'), + (0xAB9B, 'M', 'Ꮛ'), + (0xAB9C, 'M', 'Ꮜ'), + (0xAB9D, 'M', 'Ꮝ'), + (0xAB9E, 'M', 'Ꮞ'), + (0xAB9F, 'M', 'Ꮟ'), + (0xABA0, 'M', 'Ꮠ'), + (0xABA1, 'M', 'Ꮡ'), + (0xABA2, 'M', 'Ꮢ'), + (0xABA3, 'M', 'Ꮣ'), + (0xABA4, 'M', 'Ꮤ'), + (0xABA5, 'M', 'Ꮥ'), + (0xABA6, 'M', 'Ꮦ'), + (0xABA7, 'M', 'Ꮧ'), + (0xABA8, 'M', 'Ꮨ'), + (0xABA9, 'M', 'Ꮩ'), + (0xABAA, 'M', 'Ꮪ'), + ] + +def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xABAB, 'M', 'Ꮫ'), + (0xABAC, 'M', 'Ꮬ'), + (0xABAD, 'M', 'Ꮭ'), + (0xABAE, 'M', 'Ꮮ'), + (0xABAF, 'M', 'Ꮯ'), + (0xABB0, 'M', 'Ꮰ'), + (0xABB1, 'M', 'Ꮱ'), + (0xABB2, 'M', 'Ꮲ'), + (0xABB3, 'M', 'Ꮳ'), + (0xABB4, 'M', 'Ꮴ'), + (0xABB5, 'M', 'Ꮵ'), + (0xABB6, 'M', 'Ꮶ'), + (0xABB7, 'M', 'Ꮷ'), + (0xABB8, 'M', 'Ꮸ'), + (0xABB9, 'M', 'Ꮹ'), + (0xABBA, 'M', 'Ꮺ'), + (0xABBB, 'M', 'Ꮻ'), + (0xABBC, 'M', 'Ꮼ'), + (0xABBD, 'M', 'Ꮽ'), + (0xABBE, 'M', 'Ꮾ'), + (0xABBF, 'M', 'Ꮿ'), + (0xABC0, 'V'), + (0xABEE, 'X'), + (0xABF0, 'V'), + (0xABFA, 'X'), + (0xAC00, 'V'), + (0xD7A4, 'X'), + (0xD7B0, 'V'), + (0xD7C7, 'X'), + (0xD7CB, 'V'), + (0xD7FC, 'X'), + (0xF900, 'M', '豈'), + (0xF901, 'M', '更'), + (0xF902, 'M', '車'), + (0xF903, 'M', '賈'), + (0xF904, 'M', '滑'), + (0xF905, 'M', '串'), + (0xF906, 'M', '句'), + (0xF907, 'M', '龜'), + (0xF909, 'M', '契'), + (0xF90A, 'M', '金'), + (0xF90B, 'M', '喇'), + (0xF90C, 'M', '奈'), + (0xF90D, 'M', '懶'), + (0xF90E, 'M', '癩'), + (0xF90F, 'M', '羅'), + (0xF910, 'M', '蘿'), + (0xF911, 'M', '螺'), + (0xF912, 'M', '裸'), + (0xF913, 'M', '邏'), + (0xF914, 'M', '樂'), + (0xF915, 'M', '洛'), + (0xF916, 'M', '烙'), + (0xF917, 'M', '珞'), + (0xF918, 'M', '落'), + (0xF919, 'M', '酪'), + (0xF91A, 'M', '駱'), + (0xF91B, 'M', '亂'), + (0xF91C, 'M', '卵'), + (0xF91D, 'M', '欄'), + (0xF91E, 'M', '爛'), + (0xF91F, 'M', '蘭'), + (0xF920, 'M', '鸞'), + (0xF921, 'M', '嵐'), + (0xF922, 'M', '濫'), + (0xF923, 'M', '藍'), + (0xF924, 'M', '襤'), + (0xF925, 'M', '拉'), + (0xF926, 'M', '臘'), + (0xF927, 'M', '蠟'), + (0xF928, 'M', '廊'), + (0xF929, 'M', '朗'), + (0xF92A, 'M', '浪'), + (0xF92B, 'M', '狼'), + (0xF92C, 'M', '郎'), + (0xF92D, 'M', '來'), + (0xF92E, 'M', '冷'), + (0xF92F, 'M', '勞'), + (0xF930, 'M', '擄'), + (0xF931, 'M', '櫓'), + (0xF932, 'M', '爐'), + (0xF933, 'M', '盧'), + (0xF934, 'M', '老'), + (0xF935, 'M', '蘆'), + (0xF936, 'M', '虜'), + (0xF937, 'M', '路'), + (0xF938, 'M', '露'), + (0xF939, 'M', '魯'), + (0xF93A, 'M', '鷺'), + (0xF93B, 'M', '碌'), + (0xF93C, 'M', '祿'), + (0xF93D, 'M', '綠'), + (0xF93E, 'M', '菉'), + (0xF93F, 'M', '錄'), + (0xF940, 'M', '鹿'), + (0xF941, 'M', '論'), + (0xF942, 'M', '壟'), + (0xF943, 'M', '弄'), + (0xF944, 'M', '籠'), + (0xF945, 'M', '聾'), + ] + +def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF946, 'M', '牢'), + (0xF947, 'M', '磊'), + (0xF948, 'M', '賂'), + (0xF949, 'M', '雷'), + (0xF94A, 'M', '壘'), + (0xF94B, 'M', '屢'), + (0xF94C, 'M', '樓'), + (0xF94D, 'M', '淚'), + (0xF94E, 'M', '漏'), + (0xF94F, 'M', '累'), + (0xF950, 'M', '縷'), + (0xF951, 'M', '陋'), + (0xF952, 'M', '勒'), + (0xF953, 'M', '肋'), + (0xF954, 'M', '凜'), + (0xF955, 'M', '凌'), + (0xF956, 'M', '稜'), + (0xF957, 'M', '綾'), + (0xF958, 'M', '菱'), + (0xF959, 'M', '陵'), + (0xF95A, 'M', '讀'), + (0xF95B, 'M', '拏'), + (0xF95C, 'M', '樂'), + (0xF95D, 'M', '諾'), + (0xF95E, 'M', '丹'), + (0xF95F, 'M', '寧'), + (0xF960, 'M', '怒'), + (0xF961, 'M', '率'), + (0xF962, 'M', '異'), + (0xF963, 'M', '北'), + (0xF964, 'M', '磻'), + (0xF965, 'M', '便'), + (0xF966, 'M', '復'), + (0xF967, 'M', '不'), + (0xF968, 'M', '泌'), + (0xF969, 'M', '數'), + (0xF96A, 'M', '索'), + (0xF96B, 'M', '參'), + (0xF96C, 'M', '塞'), + (0xF96D, 'M', '省'), + (0xF96E, 'M', '葉'), + (0xF96F, 'M', '說'), + (0xF970, 'M', '殺'), + (0xF971, 'M', '辰'), + (0xF972, 'M', '沈'), + (0xF973, 'M', '拾'), + (0xF974, 'M', '若'), + (0xF975, 'M', '掠'), + (0xF976, 'M', '略'), + (0xF977, 'M', '亮'), + (0xF978, 'M', '兩'), + (0xF979, 'M', '凉'), + (0xF97A, 'M', '梁'), + (0xF97B, 'M', '糧'), + (0xF97C, 'M', '良'), + (0xF97D, 'M', '諒'), + (0xF97E, 'M', '量'), + (0xF97F, 'M', '勵'), + (0xF980, 'M', '呂'), + (0xF981, 'M', '女'), + (0xF982, 'M', '廬'), + (0xF983, 'M', '旅'), + (0xF984, 'M', '濾'), + (0xF985, 'M', '礪'), + (0xF986, 'M', '閭'), + (0xF987, 'M', '驪'), + (0xF988, 'M', '麗'), + (0xF989, 'M', '黎'), + (0xF98A, 'M', '力'), + (0xF98B, 'M', '曆'), + (0xF98C, 'M', '歷'), + (0xF98D, 'M', '轢'), + (0xF98E, 'M', '年'), + (0xF98F, 'M', '憐'), + (0xF990, 'M', '戀'), + (0xF991, 'M', '撚'), + (0xF992, 'M', '漣'), + (0xF993, 'M', '煉'), + (0xF994, 'M', '璉'), + (0xF995, 'M', '秊'), + (0xF996, 'M', '練'), + (0xF997, 'M', '聯'), + (0xF998, 'M', '輦'), + (0xF999, 'M', '蓮'), + (0xF99A, 'M', '連'), + (0xF99B, 'M', '鍊'), + (0xF99C, 'M', '列'), + (0xF99D, 'M', '劣'), + (0xF99E, 'M', '咽'), + (0xF99F, 'M', '烈'), + (0xF9A0, 'M', '裂'), + (0xF9A1, 'M', '說'), + (0xF9A2, 'M', '廉'), + (0xF9A3, 'M', '念'), + (0xF9A4, 'M', '捻'), + (0xF9A5, 'M', '殮'), + (0xF9A6, 'M', '簾'), + (0xF9A7, 'M', '獵'), + (0xF9A8, 'M', '令'), + (0xF9A9, 'M', '囹'), + ] + +def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF9AA, 'M', '寧'), + (0xF9AB, 'M', '嶺'), + (0xF9AC, 'M', '怜'), + (0xF9AD, 'M', '玲'), + (0xF9AE, 'M', '瑩'), + (0xF9AF, 'M', '羚'), + (0xF9B0, 'M', '聆'), + (0xF9B1, 'M', '鈴'), + (0xF9B2, 'M', '零'), + (0xF9B3, 'M', '靈'), + (0xF9B4, 'M', '領'), + (0xF9B5, 'M', '例'), + (0xF9B6, 'M', '禮'), + (0xF9B7, 'M', '醴'), + (0xF9B8, 'M', '隸'), + (0xF9B9, 'M', '惡'), + (0xF9BA, 'M', '了'), + (0xF9BB, 'M', '僚'), + (0xF9BC, 'M', '寮'), + (0xF9BD, 'M', '尿'), + (0xF9BE, 'M', '料'), + (0xF9BF, 'M', '樂'), + (0xF9C0, 'M', '燎'), + (0xF9C1, 'M', '療'), + (0xF9C2, 'M', '蓼'), + (0xF9C3, 'M', '遼'), + (0xF9C4, 'M', '龍'), + (0xF9C5, 'M', '暈'), + (0xF9C6, 'M', '阮'), + (0xF9C7, 'M', '劉'), + (0xF9C8, 'M', '杻'), + (0xF9C9, 'M', '柳'), + (0xF9CA, 'M', '流'), + (0xF9CB, 'M', '溜'), + (0xF9CC, 'M', '琉'), + (0xF9CD, 'M', '留'), + (0xF9CE, 'M', '硫'), + (0xF9CF, 'M', '紐'), + (0xF9D0, 'M', '類'), + (0xF9D1, 'M', '六'), + (0xF9D2, 'M', '戮'), + (0xF9D3, 'M', '陸'), + (0xF9D4, 'M', '倫'), + (0xF9D5, 'M', '崙'), + (0xF9D6, 'M', '淪'), + (0xF9D7, 'M', '輪'), + (0xF9D8, 'M', '律'), + (0xF9D9, 'M', '慄'), + (0xF9DA, 'M', '栗'), + (0xF9DB, 'M', '率'), + (0xF9DC, 'M', '隆'), + (0xF9DD, 'M', '利'), + (0xF9DE, 'M', '吏'), + (0xF9DF, 'M', '履'), + (0xF9E0, 'M', '易'), + (0xF9E1, 'M', '李'), + (0xF9E2, 'M', '梨'), + (0xF9E3, 'M', '泥'), + (0xF9E4, 'M', '理'), + (0xF9E5, 'M', '痢'), + (0xF9E6, 'M', '罹'), + (0xF9E7, 'M', '裏'), + (0xF9E8, 'M', '裡'), + (0xF9E9, 'M', '里'), + (0xF9EA, 'M', '離'), + (0xF9EB, 'M', '匿'), + (0xF9EC, 'M', '溺'), + (0xF9ED, 'M', '吝'), + (0xF9EE, 'M', '燐'), + (0xF9EF, 'M', '璘'), + (0xF9F0, 'M', '藺'), + (0xF9F1, 'M', '隣'), + (0xF9F2, 'M', '鱗'), + (0xF9F3, 'M', '麟'), + (0xF9F4, 'M', '林'), + (0xF9F5, 'M', '淋'), + (0xF9F6, 'M', '臨'), + (0xF9F7, 'M', '立'), + (0xF9F8, 'M', '笠'), + (0xF9F9, 'M', '粒'), + (0xF9FA, 'M', '狀'), + (0xF9FB, 'M', '炙'), + (0xF9FC, 'M', '識'), + (0xF9FD, 'M', '什'), + (0xF9FE, 'M', '茶'), + (0xF9FF, 'M', '刺'), + (0xFA00, 'M', '切'), + (0xFA01, 'M', '度'), + (0xFA02, 'M', '拓'), + (0xFA03, 'M', '糖'), + (0xFA04, 'M', '宅'), + (0xFA05, 'M', '洞'), + (0xFA06, 'M', '暴'), + (0xFA07, 'M', '輻'), + (0xFA08, 'M', '行'), + (0xFA09, 'M', '降'), + (0xFA0A, 'M', '見'), + (0xFA0B, 'M', '廓'), + (0xFA0C, 'M', '兀'), + (0xFA0D, 'M', '嗀'), + ] + +def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFA0E, 'V'), + (0xFA10, 'M', '塚'), + (0xFA11, 'V'), + (0xFA12, 'M', '晴'), + (0xFA13, 'V'), + (0xFA15, 'M', '凞'), + (0xFA16, 'M', '猪'), + (0xFA17, 'M', '益'), + (0xFA18, 'M', '礼'), + (0xFA19, 'M', '神'), + (0xFA1A, 'M', '祥'), + (0xFA1B, 'M', '福'), + (0xFA1C, 'M', '靖'), + (0xFA1D, 'M', '精'), + (0xFA1E, 'M', '羽'), + (0xFA1F, 'V'), + (0xFA20, 'M', '蘒'), + (0xFA21, 'V'), + (0xFA22, 'M', '諸'), + (0xFA23, 'V'), + (0xFA25, 'M', '逸'), + (0xFA26, 'M', '都'), + (0xFA27, 'V'), + (0xFA2A, 'M', '飯'), + (0xFA2B, 'M', '飼'), + (0xFA2C, 'M', '館'), + (0xFA2D, 'M', '鶴'), + (0xFA2E, 'M', '郞'), + (0xFA2F, 'M', '隷'), + (0xFA30, 'M', '侮'), + (0xFA31, 'M', '僧'), + (0xFA32, 'M', '免'), + (0xFA33, 'M', '勉'), + (0xFA34, 'M', '勤'), + (0xFA35, 'M', '卑'), + (0xFA36, 'M', '喝'), + (0xFA37, 'M', '嘆'), + (0xFA38, 'M', '器'), + (0xFA39, 'M', '塀'), + (0xFA3A, 'M', '墨'), + (0xFA3B, 'M', '層'), + (0xFA3C, 'M', '屮'), + (0xFA3D, 'M', '悔'), + (0xFA3E, 'M', '慨'), + (0xFA3F, 'M', '憎'), + (0xFA40, 'M', '懲'), + (0xFA41, 'M', '敏'), + (0xFA42, 'M', '既'), + (0xFA43, 'M', '暑'), + (0xFA44, 'M', '梅'), + (0xFA45, 'M', '海'), + (0xFA46, 'M', '渚'), + (0xFA47, 'M', '漢'), + (0xFA48, 'M', '煮'), + (0xFA49, 'M', '爫'), + (0xFA4A, 'M', '琢'), + (0xFA4B, 'M', '碑'), + (0xFA4C, 'M', '社'), + (0xFA4D, 'M', '祉'), + (0xFA4E, 'M', '祈'), + (0xFA4F, 'M', '祐'), + (0xFA50, 'M', '祖'), + (0xFA51, 'M', '祝'), + (0xFA52, 'M', '禍'), + (0xFA53, 'M', '禎'), + (0xFA54, 'M', '穀'), + (0xFA55, 'M', '突'), + (0xFA56, 'M', '節'), + (0xFA57, 'M', '練'), + (0xFA58, 'M', '縉'), + (0xFA59, 'M', '繁'), + (0xFA5A, 'M', '署'), + (0xFA5B, 'M', '者'), + (0xFA5C, 'M', '臭'), + (0xFA5D, 'M', '艹'), + (0xFA5F, 'M', '著'), + (0xFA60, 'M', '褐'), + (0xFA61, 'M', '視'), + (0xFA62, 'M', '謁'), + (0xFA63, 'M', '謹'), + (0xFA64, 'M', '賓'), + (0xFA65, 'M', '贈'), + (0xFA66, 'M', '辶'), + (0xFA67, 'M', '逸'), + (0xFA68, 'M', '難'), + (0xFA69, 'M', '響'), + (0xFA6A, 'M', '頻'), + (0xFA6B, 'M', '恵'), + (0xFA6C, 'M', '𤋮'), + (0xFA6D, 'M', '舘'), + (0xFA6E, 'X'), + (0xFA70, 'M', '並'), + (0xFA71, 'M', '况'), + (0xFA72, 'M', '全'), + (0xFA73, 'M', '侀'), + (0xFA74, 'M', '充'), + (0xFA75, 'M', '冀'), + (0xFA76, 'M', '勇'), + (0xFA77, 'M', '勺'), + (0xFA78, 'M', '喝'), + ] + +def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFA79, 'M', '啕'), + (0xFA7A, 'M', '喙'), + (0xFA7B, 'M', '嗢'), + (0xFA7C, 'M', '塚'), + (0xFA7D, 'M', '墳'), + (0xFA7E, 'M', '奄'), + (0xFA7F, 'M', '奔'), + (0xFA80, 'M', '婢'), + (0xFA81, 'M', '嬨'), + (0xFA82, 'M', '廒'), + (0xFA83, 'M', '廙'), + (0xFA84, 'M', '彩'), + (0xFA85, 'M', '徭'), + (0xFA86, 'M', '惘'), + (0xFA87, 'M', '慎'), + (0xFA88, 'M', '愈'), + (0xFA89, 'M', '憎'), + (0xFA8A, 'M', '慠'), + (0xFA8B, 'M', '懲'), + (0xFA8C, 'M', '戴'), + (0xFA8D, 'M', '揄'), + (0xFA8E, 'M', '搜'), + (0xFA8F, 'M', '摒'), + (0xFA90, 'M', '敖'), + (0xFA91, 'M', '晴'), + (0xFA92, 'M', '朗'), + (0xFA93, 'M', '望'), + (0xFA94, 'M', '杖'), + (0xFA95, 'M', '歹'), + (0xFA96, 'M', '殺'), + (0xFA97, 'M', '流'), + (0xFA98, 'M', '滛'), + (0xFA99, 'M', '滋'), + (0xFA9A, 'M', '漢'), + (0xFA9B, 'M', '瀞'), + (0xFA9C, 'M', '煮'), + (0xFA9D, 'M', '瞧'), + (0xFA9E, 'M', '爵'), + (0xFA9F, 'M', '犯'), + (0xFAA0, 'M', '猪'), + (0xFAA1, 'M', '瑱'), + (0xFAA2, 'M', '甆'), + (0xFAA3, 'M', '画'), + (0xFAA4, 'M', '瘝'), + (0xFAA5, 'M', '瘟'), + (0xFAA6, 'M', '益'), + (0xFAA7, 'M', '盛'), + (0xFAA8, 'M', '直'), + (0xFAA9, 'M', '睊'), + (0xFAAA, 'M', '着'), + (0xFAAB, 'M', '磌'), + (0xFAAC, 'M', '窱'), + (0xFAAD, 'M', '節'), + (0xFAAE, 'M', '类'), + (0xFAAF, 'M', '絛'), + (0xFAB0, 'M', '練'), + (0xFAB1, 'M', '缾'), + (0xFAB2, 'M', '者'), + (0xFAB3, 'M', '荒'), + (0xFAB4, 'M', '華'), + (0xFAB5, 'M', '蝹'), + (0xFAB6, 'M', '襁'), + (0xFAB7, 'M', '覆'), + (0xFAB8, 'M', '視'), + (0xFAB9, 'M', '調'), + (0xFABA, 'M', '諸'), + (0xFABB, 'M', '請'), + (0xFABC, 'M', '謁'), + (0xFABD, 'M', '諾'), + (0xFABE, 'M', '諭'), + (0xFABF, 'M', '謹'), + (0xFAC0, 'M', '變'), + (0xFAC1, 'M', '贈'), + (0xFAC2, 'M', '輸'), + (0xFAC3, 'M', '遲'), + (0xFAC4, 'M', '醙'), + (0xFAC5, 'M', '鉶'), + (0xFAC6, 'M', '陼'), + (0xFAC7, 'M', '難'), + (0xFAC8, 'M', '靖'), + (0xFAC9, 'M', '韛'), + (0xFACA, 'M', '響'), + (0xFACB, 'M', '頋'), + (0xFACC, 'M', '頻'), + (0xFACD, 'M', '鬒'), + (0xFACE, 'M', '龜'), + (0xFACF, 'M', '𢡊'), + (0xFAD0, 'M', '𢡄'), + (0xFAD1, 'M', '𣏕'), + (0xFAD2, 'M', '㮝'), + (0xFAD3, 'M', '䀘'), + (0xFAD4, 'M', '䀹'), + (0xFAD5, 'M', '𥉉'), + (0xFAD6, 'M', '𥳐'), + (0xFAD7, 'M', '𧻓'), + (0xFAD8, 'M', '齃'), + (0xFAD9, 'M', '龎'), + (0xFADA, 'X'), + (0xFB00, 'M', 'ff'), + (0xFB01, 'M', 'fi'), + ] + +def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFB02, 'M', 'fl'), + (0xFB03, 'M', 'ffi'), + (0xFB04, 'M', 'ffl'), + (0xFB05, 'M', 'st'), + (0xFB07, 'X'), + (0xFB13, 'M', 'մն'), + (0xFB14, 'M', 'մե'), + (0xFB15, 'M', 'մի'), + (0xFB16, 'M', 'վն'), + (0xFB17, 'M', 'մխ'), + (0xFB18, 'X'), + (0xFB1D, 'M', 'יִ'), + (0xFB1E, 'V'), + (0xFB1F, 'M', 'ײַ'), + (0xFB20, 'M', 'ע'), + (0xFB21, 'M', 'א'), + (0xFB22, 'M', 'ד'), + (0xFB23, 'M', 'ה'), + (0xFB24, 'M', 'כ'), + (0xFB25, 'M', 'ל'), + (0xFB26, 'M', 'ם'), + (0xFB27, 'M', 'ר'), + (0xFB28, 'M', 'ת'), + (0xFB29, '3', '+'), + (0xFB2A, 'M', 'שׁ'), + (0xFB2B, 'M', 'שׂ'), + (0xFB2C, 'M', 'שּׁ'), + (0xFB2D, 'M', 'שּׂ'), + (0xFB2E, 'M', 'אַ'), + (0xFB2F, 'M', 'אָ'), + (0xFB30, 'M', 'אּ'), + (0xFB31, 'M', 'בּ'), + (0xFB32, 'M', 'גּ'), + (0xFB33, 'M', 'דּ'), + (0xFB34, 'M', 'הּ'), + (0xFB35, 'M', 'וּ'), + (0xFB36, 'M', 'זּ'), + (0xFB37, 'X'), + (0xFB38, 'M', 'טּ'), + (0xFB39, 'M', 'יּ'), + (0xFB3A, 'M', 'ךּ'), + (0xFB3B, 'M', 'כּ'), + (0xFB3C, 'M', 'לּ'), + (0xFB3D, 'X'), + (0xFB3E, 'M', 'מּ'), + (0xFB3F, 'X'), + (0xFB40, 'M', 'נּ'), + (0xFB41, 'M', 'סּ'), + (0xFB42, 'X'), + (0xFB43, 'M', 'ףּ'), + (0xFB44, 'M', 'פּ'), + (0xFB45, 'X'), + (0xFB46, 'M', 'צּ'), + (0xFB47, 'M', 'קּ'), + (0xFB48, 'M', 'רּ'), + (0xFB49, 'M', 'שּ'), + (0xFB4A, 'M', 'תּ'), + (0xFB4B, 'M', 'וֹ'), + (0xFB4C, 'M', 'בֿ'), + (0xFB4D, 'M', 'כֿ'), + (0xFB4E, 'M', 'פֿ'), + (0xFB4F, 'M', 'אל'), + (0xFB50, 'M', 'ٱ'), + (0xFB52, 'M', 'ٻ'), + (0xFB56, 'M', 'پ'), + (0xFB5A, 'M', 'ڀ'), + (0xFB5E, 'M', 'ٺ'), + (0xFB62, 'M', 'ٿ'), + (0xFB66, 'M', 'ٹ'), + (0xFB6A, 'M', 'ڤ'), + (0xFB6E, 'M', 'ڦ'), + (0xFB72, 'M', 'ڄ'), + (0xFB76, 'M', 'ڃ'), + (0xFB7A, 'M', 'چ'), + (0xFB7E, 'M', 'ڇ'), + (0xFB82, 'M', 'ڍ'), + (0xFB84, 'M', 'ڌ'), + (0xFB86, 'M', 'ڎ'), + (0xFB88, 'M', 'ڈ'), + (0xFB8A, 'M', 'ژ'), + (0xFB8C, 'M', 'ڑ'), + (0xFB8E, 'M', 'ک'), + (0xFB92, 'M', 'گ'), + (0xFB96, 'M', 'ڳ'), + (0xFB9A, 'M', 'ڱ'), + (0xFB9E, 'M', 'ں'), + (0xFBA0, 'M', 'ڻ'), + (0xFBA4, 'M', 'ۀ'), + (0xFBA6, 'M', 'ہ'), + (0xFBAA, 'M', 'ھ'), + (0xFBAE, 'M', 'ے'), + (0xFBB0, 'M', 'ۓ'), + (0xFBB2, 'V'), + (0xFBC3, 'X'), + (0xFBD3, 'M', 'ڭ'), + (0xFBD7, 'M', 'ۇ'), + (0xFBD9, 'M', 'ۆ'), + (0xFBDB, 'M', 'ۈ'), + (0xFBDD, 'M', 'ۇٴ'), + (0xFBDE, 'M', 'ۋ'), + ] + +def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFBE0, 'M', 'ۅ'), + (0xFBE2, 'M', 'ۉ'), + (0xFBE4, 'M', 'ې'), + (0xFBE8, 'M', 'ى'), + (0xFBEA, 'M', 'ئا'), + (0xFBEC, 'M', 'ئە'), + (0xFBEE, 'M', 'ئو'), + (0xFBF0, 'M', 'ئۇ'), + (0xFBF2, 'M', 'ئۆ'), + (0xFBF4, 'M', 'ئۈ'), + (0xFBF6, 'M', 'ئې'), + (0xFBF9, 'M', 'ئى'), + (0xFBFC, 'M', 'ی'), + (0xFC00, 'M', 'ئج'), + (0xFC01, 'M', 'ئح'), + (0xFC02, 'M', 'ئم'), + (0xFC03, 'M', 'ئى'), + (0xFC04, 'M', 'ئي'), + (0xFC05, 'M', 'بج'), + (0xFC06, 'M', 'بح'), + (0xFC07, 'M', 'بخ'), + (0xFC08, 'M', 'بم'), + (0xFC09, 'M', 'بى'), + (0xFC0A, 'M', 'بي'), + (0xFC0B, 'M', 'تج'), + (0xFC0C, 'M', 'تح'), + (0xFC0D, 'M', 'تخ'), + (0xFC0E, 'M', 'تم'), + (0xFC0F, 'M', 'تى'), + (0xFC10, 'M', 'تي'), + (0xFC11, 'M', 'ثج'), + (0xFC12, 'M', 'ثم'), + (0xFC13, 'M', 'ثى'), + (0xFC14, 'M', 'ثي'), + (0xFC15, 'M', 'جح'), + (0xFC16, 'M', 'جم'), + (0xFC17, 'M', 'حج'), + (0xFC18, 'M', 'حم'), + (0xFC19, 'M', 'خج'), + (0xFC1A, 'M', 'خح'), + (0xFC1B, 'M', 'خم'), + (0xFC1C, 'M', 'سج'), + (0xFC1D, 'M', 'سح'), + (0xFC1E, 'M', 'سخ'), + (0xFC1F, 'M', 'سم'), + (0xFC20, 'M', 'صح'), + (0xFC21, 'M', 'صم'), + (0xFC22, 'M', 'ضج'), + (0xFC23, 'M', 'ضح'), + (0xFC24, 'M', 'ضخ'), + (0xFC25, 'M', 'ضم'), + (0xFC26, 'M', 'طح'), + (0xFC27, 'M', 'طم'), + (0xFC28, 'M', 'ظم'), + (0xFC29, 'M', 'عج'), + (0xFC2A, 'M', 'عم'), + (0xFC2B, 'M', 'غج'), + (0xFC2C, 'M', 'غم'), + (0xFC2D, 'M', 'فج'), + (0xFC2E, 'M', 'فح'), + (0xFC2F, 'M', 'فخ'), + (0xFC30, 'M', 'فم'), + (0xFC31, 'M', 'فى'), + (0xFC32, 'M', 'في'), + (0xFC33, 'M', 'قح'), + (0xFC34, 'M', 'قم'), + (0xFC35, 'M', 'قى'), + (0xFC36, 'M', 'قي'), + (0xFC37, 'M', 'كا'), + (0xFC38, 'M', 'كج'), + (0xFC39, 'M', 'كح'), + (0xFC3A, 'M', 'كخ'), + (0xFC3B, 'M', 'كل'), + (0xFC3C, 'M', 'كم'), + (0xFC3D, 'M', 'كى'), + (0xFC3E, 'M', 'كي'), + (0xFC3F, 'M', 'لج'), + (0xFC40, 'M', 'لح'), + (0xFC41, 'M', 'لخ'), + (0xFC42, 'M', 'لم'), + (0xFC43, 'M', 'لى'), + (0xFC44, 'M', 'لي'), + (0xFC45, 'M', 'مج'), + (0xFC46, 'M', 'مح'), + (0xFC47, 'M', 'مخ'), + (0xFC48, 'M', 'مم'), + (0xFC49, 'M', 'مى'), + (0xFC4A, 'M', 'مي'), + (0xFC4B, 'M', 'نج'), + (0xFC4C, 'M', 'نح'), + (0xFC4D, 'M', 'نخ'), + (0xFC4E, 'M', 'نم'), + (0xFC4F, 'M', 'نى'), + (0xFC50, 'M', 'ني'), + (0xFC51, 'M', 'هج'), + (0xFC52, 'M', 'هم'), + (0xFC53, 'M', 'هى'), + (0xFC54, 'M', 'هي'), + (0xFC55, 'M', 'يج'), + (0xFC56, 'M', 'يح'), + ] + +def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFC57, 'M', 'يخ'), + (0xFC58, 'M', 'يم'), + (0xFC59, 'M', 'يى'), + (0xFC5A, 'M', 'يي'), + (0xFC5B, 'M', 'ذٰ'), + (0xFC5C, 'M', 'رٰ'), + (0xFC5D, 'M', 'ىٰ'), + (0xFC5E, '3', ' ٌّ'), + (0xFC5F, '3', ' ٍّ'), + (0xFC60, '3', ' َّ'), + (0xFC61, '3', ' ُّ'), + (0xFC62, '3', ' ِّ'), + (0xFC63, '3', ' ّٰ'), + (0xFC64, 'M', 'ئر'), + (0xFC65, 'M', 'ئز'), + (0xFC66, 'M', 'ئم'), + (0xFC67, 'M', 'ئن'), + (0xFC68, 'M', 'ئى'), + (0xFC69, 'M', 'ئي'), + (0xFC6A, 'M', 'بر'), + (0xFC6B, 'M', 'بز'), + (0xFC6C, 'M', 'بم'), + (0xFC6D, 'M', 'بن'), + (0xFC6E, 'M', 'بى'), + (0xFC6F, 'M', 'بي'), + (0xFC70, 'M', 'تر'), + (0xFC71, 'M', 'تز'), + (0xFC72, 'M', 'تم'), + (0xFC73, 'M', 'تن'), + (0xFC74, 'M', 'تى'), + (0xFC75, 'M', 'تي'), + (0xFC76, 'M', 'ثر'), + (0xFC77, 'M', 'ثز'), + (0xFC78, 'M', 'ثم'), + (0xFC79, 'M', 'ثن'), + (0xFC7A, 'M', 'ثى'), + (0xFC7B, 'M', 'ثي'), + (0xFC7C, 'M', 'فى'), + (0xFC7D, 'M', 'في'), + (0xFC7E, 'M', 'قى'), + (0xFC7F, 'M', 'قي'), + (0xFC80, 'M', 'كا'), + (0xFC81, 'M', 'كل'), + (0xFC82, 'M', 'كم'), + (0xFC83, 'M', 'كى'), + (0xFC84, 'M', 'كي'), + (0xFC85, 'M', 'لم'), + (0xFC86, 'M', 'لى'), + (0xFC87, 'M', 'لي'), + (0xFC88, 'M', 'ما'), + (0xFC89, 'M', 'مم'), + (0xFC8A, 'M', 'نر'), + (0xFC8B, 'M', 'نز'), + (0xFC8C, 'M', 'نم'), + (0xFC8D, 'M', 'نن'), + (0xFC8E, 'M', 'نى'), + (0xFC8F, 'M', 'ني'), + (0xFC90, 'M', 'ىٰ'), + (0xFC91, 'M', 'ير'), + (0xFC92, 'M', 'يز'), + (0xFC93, 'M', 'يم'), + (0xFC94, 'M', 'ين'), + (0xFC95, 'M', 'يى'), + (0xFC96, 'M', 'يي'), + (0xFC97, 'M', 'ئج'), + (0xFC98, 'M', 'ئح'), + (0xFC99, 'M', 'ئخ'), + (0xFC9A, 'M', 'ئم'), + (0xFC9B, 'M', 'ئه'), + (0xFC9C, 'M', 'بج'), + (0xFC9D, 'M', 'بح'), + (0xFC9E, 'M', 'بخ'), + (0xFC9F, 'M', 'بم'), + (0xFCA0, 'M', 'به'), + (0xFCA1, 'M', 'تج'), + (0xFCA2, 'M', 'تح'), + (0xFCA3, 'M', 'تخ'), + (0xFCA4, 'M', 'تم'), + (0xFCA5, 'M', 'ته'), + (0xFCA6, 'M', 'ثم'), + (0xFCA7, 'M', 'جح'), + (0xFCA8, 'M', 'جم'), + (0xFCA9, 'M', 'حج'), + (0xFCAA, 'M', 'حم'), + (0xFCAB, 'M', 'خج'), + (0xFCAC, 'M', 'خم'), + (0xFCAD, 'M', 'سج'), + (0xFCAE, 'M', 'سح'), + (0xFCAF, 'M', 'سخ'), + (0xFCB0, 'M', 'سم'), + (0xFCB1, 'M', 'صح'), + (0xFCB2, 'M', 'صخ'), + (0xFCB3, 'M', 'صم'), + (0xFCB4, 'M', 'ضج'), + (0xFCB5, 'M', 'ضح'), + (0xFCB6, 'M', 'ضخ'), + (0xFCB7, 'M', 'ضم'), + (0xFCB8, 'M', 'طح'), + (0xFCB9, 'M', 'ظم'), + (0xFCBA, 'M', 'عج'), + ] + +def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFCBB, 'M', 'عم'), + (0xFCBC, 'M', 'غج'), + (0xFCBD, 'M', 'غم'), + (0xFCBE, 'M', 'فج'), + (0xFCBF, 'M', 'فح'), + (0xFCC0, 'M', 'فخ'), + (0xFCC1, 'M', 'فم'), + (0xFCC2, 'M', 'قح'), + (0xFCC3, 'M', 'قم'), + (0xFCC4, 'M', 'كج'), + (0xFCC5, 'M', 'كح'), + (0xFCC6, 'M', 'كخ'), + (0xFCC7, 'M', 'كل'), + (0xFCC8, 'M', 'كم'), + (0xFCC9, 'M', 'لج'), + (0xFCCA, 'M', 'لح'), + (0xFCCB, 'M', 'لخ'), + (0xFCCC, 'M', 'لم'), + (0xFCCD, 'M', 'له'), + (0xFCCE, 'M', 'مج'), + (0xFCCF, 'M', 'مح'), + (0xFCD0, 'M', 'مخ'), + (0xFCD1, 'M', 'مم'), + (0xFCD2, 'M', 'نج'), + (0xFCD3, 'M', 'نح'), + (0xFCD4, 'M', 'نخ'), + (0xFCD5, 'M', 'نم'), + (0xFCD6, 'M', 'نه'), + (0xFCD7, 'M', 'هج'), + (0xFCD8, 'M', 'هم'), + (0xFCD9, 'M', 'هٰ'), + (0xFCDA, 'M', 'يج'), + (0xFCDB, 'M', 'يح'), + (0xFCDC, 'M', 'يخ'), + (0xFCDD, 'M', 'يم'), + (0xFCDE, 'M', 'يه'), + (0xFCDF, 'M', 'ئم'), + (0xFCE0, 'M', 'ئه'), + (0xFCE1, 'M', 'بم'), + (0xFCE2, 'M', 'به'), + (0xFCE3, 'M', 'تم'), + (0xFCE4, 'M', 'ته'), + (0xFCE5, 'M', 'ثم'), + (0xFCE6, 'M', 'ثه'), + (0xFCE7, 'M', 'سم'), + (0xFCE8, 'M', 'سه'), + (0xFCE9, 'M', 'شم'), + (0xFCEA, 'M', 'شه'), + (0xFCEB, 'M', 'كل'), + (0xFCEC, 'M', 'كم'), + (0xFCED, 'M', 'لم'), + (0xFCEE, 'M', 'نم'), + (0xFCEF, 'M', 'نه'), + (0xFCF0, 'M', 'يم'), + (0xFCF1, 'M', 'يه'), + (0xFCF2, 'M', 'ـَّ'), + (0xFCF3, 'M', 'ـُّ'), + (0xFCF4, 'M', 'ـِّ'), + (0xFCF5, 'M', 'طى'), + (0xFCF6, 'M', 'طي'), + (0xFCF7, 'M', 'عى'), + (0xFCF8, 'M', 'عي'), + (0xFCF9, 'M', 'غى'), + (0xFCFA, 'M', 'غي'), + (0xFCFB, 'M', 'سى'), + (0xFCFC, 'M', 'سي'), + (0xFCFD, 'M', 'شى'), + (0xFCFE, 'M', 'شي'), + (0xFCFF, 'M', 'حى'), + (0xFD00, 'M', 'حي'), + (0xFD01, 'M', 'جى'), + (0xFD02, 'M', 'جي'), + (0xFD03, 'M', 'خى'), + (0xFD04, 'M', 'خي'), + (0xFD05, 'M', 'صى'), + (0xFD06, 'M', 'صي'), + (0xFD07, 'M', 'ضى'), + (0xFD08, 'M', 'ضي'), + (0xFD09, 'M', 'شج'), + (0xFD0A, 'M', 'شح'), + (0xFD0B, 'M', 'شخ'), + (0xFD0C, 'M', 'شم'), + (0xFD0D, 'M', 'شر'), + (0xFD0E, 'M', 'سر'), + (0xFD0F, 'M', 'صر'), + (0xFD10, 'M', 'ضر'), + (0xFD11, 'M', 'طى'), + (0xFD12, 'M', 'طي'), + (0xFD13, 'M', 'عى'), + (0xFD14, 'M', 'عي'), + (0xFD15, 'M', 'غى'), + (0xFD16, 'M', 'غي'), + (0xFD17, 'M', 'سى'), + (0xFD18, 'M', 'سي'), + (0xFD19, 'M', 'شى'), + (0xFD1A, 'M', 'شي'), + (0xFD1B, 'M', 'حى'), + (0xFD1C, 'M', 'حي'), + (0xFD1D, 'M', 'جى'), + (0xFD1E, 'M', 'جي'), + ] + +def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFD1F, 'M', 'خى'), + (0xFD20, 'M', 'خي'), + (0xFD21, 'M', 'صى'), + (0xFD22, 'M', 'صي'), + (0xFD23, 'M', 'ضى'), + (0xFD24, 'M', 'ضي'), + (0xFD25, 'M', 'شج'), + (0xFD26, 'M', 'شح'), + (0xFD27, 'M', 'شخ'), + (0xFD28, 'M', 'شم'), + (0xFD29, 'M', 'شر'), + (0xFD2A, 'M', 'سر'), + (0xFD2B, 'M', 'صر'), + (0xFD2C, 'M', 'ضر'), + (0xFD2D, 'M', 'شج'), + (0xFD2E, 'M', 'شح'), + (0xFD2F, 'M', 'شخ'), + (0xFD30, 'M', 'شم'), + (0xFD31, 'M', 'سه'), + (0xFD32, 'M', 'شه'), + (0xFD33, 'M', 'طم'), + (0xFD34, 'M', 'سج'), + (0xFD35, 'M', 'سح'), + (0xFD36, 'M', 'سخ'), + (0xFD37, 'M', 'شج'), + (0xFD38, 'M', 'شح'), + (0xFD39, 'M', 'شخ'), + (0xFD3A, 'M', 'طم'), + (0xFD3B, 'M', 'ظم'), + (0xFD3C, 'M', 'اً'), + (0xFD3E, 'V'), + (0xFD50, 'M', 'تجم'), + (0xFD51, 'M', 'تحج'), + (0xFD53, 'M', 'تحم'), + (0xFD54, 'M', 'تخم'), + (0xFD55, 'M', 'تمج'), + (0xFD56, 'M', 'تمح'), + (0xFD57, 'M', 'تمخ'), + (0xFD58, 'M', 'جمح'), + (0xFD5A, 'M', 'حمي'), + (0xFD5B, 'M', 'حمى'), + (0xFD5C, 'M', 'سحج'), + (0xFD5D, 'M', 'سجح'), + (0xFD5E, 'M', 'سجى'), + (0xFD5F, 'M', 'سمح'), + (0xFD61, 'M', 'سمج'), + (0xFD62, 'M', 'سمم'), + (0xFD64, 'M', 'صحح'), + (0xFD66, 'M', 'صمم'), + (0xFD67, 'M', 'شحم'), + (0xFD69, 'M', 'شجي'), + (0xFD6A, 'M', 'شمخ'), + (0xFD6C, 'M', 'شمم'), + (0xFD6E, 'M', 'ضحى'), + (0xFD6F, 'M', 'ضخم'), + (0xFD71, 'M', 'طمح'), + (0xFD73, 'M', 'طمم'), + (0xFD74, 'M', 'طمي'), + (0xFD75, 'M', 'عجم'), + (0xFD76, 'M', 'عمم'), + (0xFD78, 'M', 'عمى'), + (0xFD79, 'M', 'غمم'), + (0xFD7A, 'M', 'غمي'), + (0xFD7B, 'M', 'غمى'), + (0xFD7C, 'M', 'فخم'), + (0xFD7E, 'M', 'قمح'), + (0xFD7F, 'M', 'قمم'), + (0xFD80, 'M', 'لحم'), + (0xFD81, 'M', 'لحي'), + (0xFD82, 'M', 'لحى'), + (0xFD83, 'M', 'لجج'), + (0xFD85, 'M', 'لخم'), + (0xFD87, 'M', 'لمح'), + (0xFD89, 'M', 'محج'), + (0xFD8A, 'M', 'محم'), + (0xFD8B, 'M', 'محي'), + (0xFD8C, 'M', 'مجح'), + (0xFD8D, 'M', 'مجم'), + (0xFD8E, 'M', 'مخج'), + (0xFD8F, 'M', 'مخم'), + (0xFD90, 'X'), + (0xFD92, 'M', 'مجخ'), + (0xFD93, 'M', 'همج'), + (0xFD94, 'M', 'همم'), + (0xFD95, 'M', 'نحم'), + (0xFD96, 'M', 'نحى'), + (0xFD97, 'M', 'نجم'), + (0xFD99, 'M', 'نجى'), + (0xFD9A, 'M', 'نمي'), + (0xFD9B, 'M', 'نمى'), + (0xFD9C, 'M', 'يمم'), + (0xFD9E, 'M', 'بخي'), + (0xFD9F, 'M', 'تجي'), + (0xFDA0, 'M', 'تجى'), + (0xFDA1, 'M', 'تخي'), + (0xFDA2, 'M', 'تخى'), + (0xFDA3, 'M', 'تمي'), + (0xFDA4, 'M', 'تمى'), + (0xFDA5, 'M', 'جمي'), + (0xFDA6, 'M', 'جحى'), + ] + +def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFDA7, 'M', 'جمى'), + (0xFDA8, 'M', 'سخى'), + (0xFDA9, 'M', 'صحي'), + (0xFDAA, 'M', 'شحي'), + (0xFDAB, 'M', 'ضحي'), + (0xFDAC, 'M', 'لجي'), + (0xFDAD, 'M', 'لمي'), + (0xFDAE, 'M', 'يحي'), + (0xFDAF, 'M', 'يجي'), + (0xFDB0, 'M', 'يمي'), + (0xFDB1, 'M', 'ممي'), + (0xFDB2, 'M', 'قمي'), + (0xFDB3, 'M', 'نحي'), + (0xFDB4, 'M', 'قمح'), + (0xFDB5, 'M', 'لحم'), + (0xFDB6, 'M', 'عمي'), + (0xFDB7, 'M', 'كمي'), + (0xFDB8, 'M', 'نجح'), + (0xFDB9, 'M', 'مخي'), + (0xFDBA, 'M', 'لجم'), + (0xFDBB, 'M', 'كمم'), + (0xFDBC, 'M', 'لجم'), + (0xFDBD, 'M', 'نجح'), + (0xFDBE, 'M', 'جحي'), + (0xFDBF, 'M', 'حجي'), + (0xFDC0, 'M', 'مجي'), + (0xFDC1, 'M', 'فمي'), + (0xFDC2, 'M', 'بحي'), + (0xFDC3, 'M', 'كمم'), + (0xFDC4, 'M', 'عجم'), + (0xFDC5, 'M', 'صمم'), + (0xFDC6, 'M', 'سخي'), + (0xFDC7, 'M', 'نجي'), + (0xFDC8, 'X'), + (0xFDCF, 'V'), + (0xFDD0, 'X'), + (0xFDF0, 'M', 'صلے'), + (0xFDF1, 'M', 'قلے'), + (0xFDF2, 'M', 'الله'), + (0xFDF3, 'M', 'اكبر'), + (0xFDF4, 'M', 'محمد'), + (0xFDF5, 'M', 'صلعم'), + (0xFDF6, 'M', 'رسول'), + (0xFDF7, 'M', 'عليه'), + (0xFDF8, 'M', 'وسلم'), + (0xFDF9, 'M', 'صلى'), + (0xFDFA, '3', 'صلى الله عليه وسلم'), + (0xFDFB, '3', 'جل جلاله'), + (0xFDFC, 'M', 'ریال'), + (0xFDFD, 'V'), + (0xFE00, 'I'), + (0xFE10, '3', ','), + (0xFE11, 'M', '、'), + (0xFE12, 'X'), + (0xFE13, '3', ':'), + (0xFE14, '3', ';'), + (0xFE15, '3', '!'), + (0xFE16, '3', '?'), + (0xFE17, 'M', '〖'), + (0xFE18, 'M', '〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE30, 'X'), + (0xFE31, 'M', '—'), + (0xFE32, 'M', '–'), + (0xFE33, '3', '_'), + (0xFE35, '3', '('), + (0xFE36, '3', ')'), + (0xFE37, '3', '{'), + (0xFE38, '3', '}'), + (0xFE39, 'M', '〔'), + (0xFE3A, 'M', '〕'), + (0xFE3B, 'M', '【'), + (0xFE3C, 'M', '】'), + (0xFE3D, 'M', '《'), + (0xFE3E, 'M', '》'), + (0xFE3F, 'M', '〈'), + (0xFE40, 'M', '〉'), + (0xFE41, 'M', '「'), + (0xFE42, 'M', '」'), + (0xFE43, 'M', '『'), + (0xFE44, 'M', '』'), + (0xFE45, 'V'), + (0xFE47, '3', '['), + (0xFE48, '3', ']'), + (0xFE49, '3', ' ̅'), + (0xFE4D, '3', '_'), + (0xFE50, '3', ','), + (0xFE51, 'M', '、'), + (0xFE52, 'X'), + (0xFE54, '3', ';'), + (0xFE55, '3', ':'), + (0xFE56, '3', '?'), + (0xFE57, '3', '!'), + (0xFE58, 'M', '—'), + (0xFE59, '3', '('), + (0xFE5A, '3', ')'), + (0xFE5B, '3', '{'), + (0xFE5C, '3', '}'), + (0xFE5D, 'M', '〔'), + ] + +def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFE5E, 'M', '〕'), + (0xFE5F, '3', '#'), + (0xFE60, '3', '&'), + (0xFE61, '3', '*'), + (0xFE62, '3', '+'), + (0xFE63, 'M', '-'), + (0xFE64, '3', '<'), + (0xFE65, '3', '>'), + (0xFE66, '3', '='), + (0xFE67, 'X'), + (0xFE68, '3', '\\'), + (0xFE69, '3', '$'), + (0xFE6A, '3', '%'), + (0xFE6B, '3', '@'), + (0xFE6C, 'X'), + (0xFE70, '3', ' ً'), + (0xFE71, 'M', 'ـً'), + (0xFE72, '3', ' ٌ'), + (0xFE73, 'V'), + (0xFE74, '3', ' ٍ'), + (0xFE75, 'X'), + (0xFE76, '3', ' َ'), + (0xFE77, 'M', 'ـَ'), + (0xFE78, '3', ' ُ'), + (0xFE79, 'M', 'ـُ'), + (0xFE7A, '3', ' ِ'), + (0xFE7B, 'M', 'ـِ'), + (0xFE7C, '3', ' ّ'), + (0xFE7D, 'M', 'ـّ'), + (0xFE7E, '3', ' ْ'), + (0xFE7F, 'M', 'ـْ'), + (0xFE80, 'M', 'ء'), + (0xFE81, 'M', 'آ'), + (0xFE83, 'M', 'أ'), + (0xFE85, 'M', 'ؤ'), + (0xFE87, 'M', 'إ'), + (0xFE89, 'M', 'ئ'), + (0xFE8D, 'M', 'ا'), + (0xFE8F, 'M', 'ب'), + (0xFE93, 'M', 'ة'), + (0xFE95, 'M', 'ت'), + (0xFE99, 'M', 'ث'), + (0xFE9D, 'M', 'ج'), + (0xFEA1, 'M', 'ح'), + (0xFEA5, 'M', 'خ'), + (0xFEA9, 'M', 'د'), + (0xFEAB, 'M', 'ذ'), + (0xFEAD, 'M', 'ر'), + (0xFEAF, 'M', 'ز'), + (0xFEB1, 'M', 'س'), + (0xFEB5, 'M', 'ش'), + (0xFEB9, 'M', 'ص'), + (0xFEBD, 'M', 'ض'), + (0xFEC1, 'M', 'ط'), + (0xFEC5, 'M', 'ظ'), + (0xFEC9, 'M', 'ع'), + (0xFECD, 'M', 'غ'), + (0xFED1, 'M', 'ف'), + (0xFED5, 'M', 'ق'), + (0xFED9, 'M', 'ك'), + (0xFEDD, 'M', 'ل'), + (0xFEE1, 'M', 'م'), + (0xFEE5, 'M', 'ن'), + (0xFEE9, 'M', 'ه'), + (0xFEED, 'M', 'و'), + (0xFEEF, 'M', 'ى'), + (0xFEF1, 'M', 'ي'), + (0xFEF5, 'M', 'لآ'), + (0xFEF7, 'M', 'لأ'), + (0xFEF9, 'M', 'لإ'), + (0xFEFB, 'M', 'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', '!'), + (0xFF02, '3', '"'), + (0xFF03, '3', '#'), + (0xFF04, '3', '$'), + (0xFF05, '3', '%'), + (0xFF06, '3', '&'), + (0xFF07, '3', '\''), + (0xFF08, '3', '('), + (0xFF09, '3', ')'), + (0xFF0A, '3', '*'), + (0xFF0B, '3', '+'), + (0xFF0C, '3', ','), + (0xFF0D, 'M', '-'), + (0xFF0E, 'M', '.'), + (0xFF0F, '3', '/'), + (0xFF10, 'M', '0'), + (0xFF11, 'M', '1'), + (0xFF12, 'M', '2'), + (0xFF13, 'M', '3'), + (0xFF14, 'M', '4'), + (0xFF15, 'M', '5'), + (0xFF16, 'M', '6'), + (0xFF17, 'M', '7'), + (0xFF18, 'M', '8'), + (0xFF19, 'M', '9'), + (0xFF1A, '3', ':'), + ] + +def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF1B, '3', ';'), + (0xFF1C, '3', '<'), + (0xFF1D, '3', '='), + (0xFF1E, '3', '>'), + (0xFF1F, '3', '?'), + (0xFF20, '3', '@'), + (0xFF21, 'M', 'a'), + (0xFF22, 'M', 'b'), + (0xFF23, 'M', 'c'), + (0xFF24, 'M', 'd'), + (0xFF25, 'M', 'e'), + (0xFF26, 'M', 'f'), + (0xFF27, 'M', 'g'), + (0xFF28, 'M', 'h'), + (0xFF29, 'M', 'i'), + (0xFF2A, 'M', 'j'), + (0xFF2B, 'M', 'k'), + (0xFF2C, 'M', 'l'), + (0xFF2D, 'M', 'm'), + (0xFF2E, 'M', 'n'), + (0xFF2F, 'M', 'o'), + (0xFF30, 'M', 'p'), + (0xFF31, 'M', 'q'), + (0xFF32, 'M', 'r'), + (0xFF33, 'M', 's'), + (0xFF34, 'M', 't'), + (0xFF35, 'M', 'u'), + (0xFF36, 'M', 'v'), + (0xFF37, 'M', 'w'), + (0xFF38, 'M', 'x'), + (0xFF39, 'M', 'y'), + (0xFF3A, 'M', 'z'), + (0xFF3B, '3', '['), + (0xFF3C, '3', '\\'), + (0xFF3D, '3', ']'), + (0xFF3E, '3', '^'), + (0xFF3F, '3', '_'), + (0xFF40, '3', '`'), + (0xFF41, 'M', 'a'), + (0xFF42, 'M', 'b'), + (0xFF43, 'M', 'c'), + (0xFF44, 'M', 'd'), + (0xFF45, 'M', 'e'), + (0xFF46, 'M', 'f'), + (0xFF47, 'M', 'g'), + (0xFF48, 'M', 'h'), + (0xFF49, 'M', 'i'), + (0xFF4A, 'M', 'j'), + (0xFF4B, 'M', 'k'), + (0xFF4C, 'M', 'l'), + (0xFF4D, 'M', 'm'), + (0xFF4E, 'M', 'n'), + (0xFF4F, 'M', 'o'), + (0xFF50, 'M', 'p'), + (0xFF51, 'M', 'q'), + (0xFF52, 'M', 'r'), + (0xFF53, 'M', 's'), + (0xFF54, 'M', 't'), + (0xFF55, 'M', 'u'), + (0xFF56, 'M', 'v'), + (0xFF57, 'M', 'w'), + (0xFF58, 'M', 'x'), + (0xFF59, 'M', 'y'), + (0xFF5A, 'M', 'z'), + (0xFF5B, '3', '{'), + (0xFF5C, '3', '|'), + (0xFF5D, '3', '}'), + (0xFF5E, '3', '~'), + (0xFF5F, 'M', '⦅'), + (0xFF60, 'M', '⦆'), + (0xFF61, 'M', '.'), + (0xFF62, 'M', '「'), + (0xFF63, 'M', '」'), + (0xFF64, 'M', '、'), + (0xFF65, 'M', '・'), + (0xFF66, 'M', 'ヲ'), + (0xFF67, 'M', 'ァ'), + (0xFF68, 'M', 'ィ'), + (0xFF69, 'M', 'ゥ'), + (0xFF6A, 'M', 'ェ'), + (0xFF6B, 'M', 'ォ'), + (0xFF6C, 'M', 'ャ'), + (0xFF6D, 'M', 'ュ'), + (0xFF6E, 'M', 'ョ'), + (0xFF6F, 'M', 'ッ'), + (0xFF70, 'M', 'ー'), + (0xFF71, 'M', 'ア'), + (0xFF72, 'M', 'イ'), + (0xFF73, 'M', 'ウ'), + (0xFF74, 'M', 'エ'), + (0xFF75, 'M', 'オ'), + (0xFF76, 'M', 'カ'), + (0xFF77, 'M', 'キ'), + (0xFF78, 'M', 'ク'), + (0xFF79, 'M', 'ケ'), + (0xFF7A, 'M', 'コ'), + (0xFF7B, 'M', 'サ'), + (0xFF7C, 'M', 'シ'), + (0xFF7D, 'M', 'ス'), + (0xFF7E, 'M', 'セ'), + ] + +def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF7F, 'M', 'ソ'), + (0xFF80, 'M', 'タ'), + (0xFF81, 'M', 'チ'), + (0xFF82, 'M', 'ツ'), + (0xFF83, 'M', 'テ'), + (0xFF84, 'M', 'ト'), + (0xFF85, 'M', 'ナ'), + (0xFF86, 'M', 'ニ'), + (0xFF87, 'M', 'ヌ'), + (0xFF88, 'M', 'ネ'), + (0xFF89, 'M', 'ノ'), + (0xFF8A, 'M', 'ハ'), + (0xFF8B, 'M', 'ヒ'), + (0xFF8C, 'M', 'フ'), + (0xFF8D, 'M', 'ヘ'), + (0xFF8E, 'M', 'ホ'), + (0xFF8F, 'M', 'マ'), + (0xFF90, 'M', 'ミ'), + (0xFF91, 'M', 'ム'), + (0xFF92, 'M', 'メ'), + (0xFF93, 'M', 'モ'), + (0xFF94, 'M', 'ヤ'), + (0xFF95, 'M', 'ユ'), + (0xFF96, 'M', 'ヨ'), + (0xFF97, 'M', 'ラ'), + (0xFF98, 'M', 'リ'), + (0xFF99, 'M', 'ル'), + (0xFF9A, 'M', 'レ'), + (0xFF9B, 'M', 'ロ'), + (0xFF9C, 'M', 'ワ'), + (0xFF9D, 'M', 'ン'), + (0xFF9E, 'M', '゙'), + (0xFF9F, 'M', '゚'), + (0xFFA0, 'X'), + (0xFFA1, 'M', 'ᄀ'), + (0xFFA2, 'M', 'ᄁ'), + (0xFFA3, 'M', 'ᆪ'), + (0xFFA4, 'M', 'ᄂ'), + (0xFFA5, 'M', 'ᆬ'), + (0xFFA6, 'M', 'ᆭ'), + (0xFFA7, 'M', 'ᄃ'), + (0xFFA8, 'M', 'ᄄ'), + (0xFFA9, 'M', 'ᄅ'), + (0xFFAA, 'M', 'ᆰ'), + (0xFFAB, 'M', 'ᆱ'), + (0xFFAC, 'M', 'ᆲ'), + (0xFFAD, 'M', 'ᆳ'), + (0xFFAE, 'M', 'ᆴ'), + (0xFFAF, 'M', 'ᆵ'), + (0xFFB0, 'M', 'ᄚ'), + (0xFFB1, 'M', 'ᄆ'), + (0xFFB2, 'M', 'ᄇ'), + (0xFFB3, 'M', 'ᄈ'), + (0xFFB4, 'M', 'ᄡ'), + (0xFFB5, 'M', 'ᄉ'), + (0xFFB6, 'M', 'ᄊ'), + (0xFFB7, 'M', 'ᄋ'), + (0xFFB8, 'M', 'ᄌ'), + (0xFFB9, 'M', 'ᄍ'), + (0xFFBA, 'M', 'ᄎ'), + (0xFFBB, 'M', 'ᄏ'), + (0xFFBC, 'M', 'ᄐ'), + (0xFFBD, 'M', 'ᄑ'), + (0xFFBE, 'M', 'ᄒ'), + (0xFFBF, 'X'), + (0xFFC2, 'M', 'ᅡ'), + (0xFFC3, 'M', 'ᅢ'), + (0xFFC4, 'M', 'ᅣ'), + (0xFFC5, 'M', 'ᅤ'), + (0xFFC6, 'M', 'ᅥ'), + (0xFFC7, 'M', 'ᅦ'), + (0xFFC8, 'X'), + (0xFFCA, 'M', 'ᅧ'), + (0xFFCB, 'M', 'ᅨ'), + (0xFFCC, 'M', 'ᅩ'), + (0xFFCD, 'M', 'ᅪ'), + (0xFFCE, 'M', 'ᅫ'), + (0xFFCF, 'M', 'ᅬ'), + (0xFFD0, 'X'), + (0xFFD2, 'M', 'ᅭ'), + (0xFFD3, 'M', 'ᅮ'), + (0xFFD4, 'M', 'ᅯ'), + (0xFFD5, 'M', 'ᅰ'), + (0xFFD6, 'M', 'ᅱ'), + (0xFFD7, 'M', 'ᅲ'), + (0xFFD8, 'X'), + (0xFFDA, 'M', 'ᅳ'), + (0xFFDB, 'M', 'ᅴ'), + (0xFFDC, 'M', 'ᅵ'), + (0xFFDD, 'X'), + (0xFFE0, 'M', '¢'), + (0xFFE1, 'M', '£'), + (0xFFE2, 'M', '¬'), + (0xFFE3, '3', ' ̄'), + (0xFFE4, 'M', '¦'), + (0xFFE5, 'M', '¥'), + (0xFFE6, 'M', '₩'), + (0xFFE7, 'X'), + (0xFFE8, 'M', '│'), + (0xFFE9, 'M', '←'), + ] + +def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFFEA, 'M', '↑'), + (0xFFEB, 'M', '→'), + (0xFFEC, 'M', '↓'), + (0xFFED, 'M', '■'), + (0xFFEE, 'M', '○'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), + (0x10027, 'X'), + (0x10028, 'V'), + (0x1003B, 'X'), + (0x1003C, 'V'), + (0x1003E, 'X'), + (0x1003F, 'V'), + (0x1004E, 'X'), + (0x10050, 'V'), + (0x1005E, 'X'), + (0x10080, 'V'), + (0x100FB, 'X'), + (0x10100, 'V'), + (0x10103, 'X'), + (0x10107, 'V'), + (0x10134, 'X'), + (0x10137, 'V'), + (0x1018F, 'X'), + (0x10190, 'V'), + (0x1019D, 'X'), + (0x101A0, 'V'), + (0x101A1, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x102E0, 'V'), + (0x102FC, 'X'), + (0x10300, 'V'), + (0x10324, 'X'), + (0x1032D, 'V'), + (0x1034B, 'X'), + (0x10350, 'V'), + (0x1037B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', '𐐨'), + (0x10401, 'M', '𐐩'), + (0x10402, 'M', '𐐪'), + (0x10403, 'M', '𐐫'), + (0x10404, 'M', '𐐬'), + (0x10405, 'M', '𐐭'), + (0x10406, 'M', '𐐮'), + (0x10407, 'M', '𐐯'), + (0x10408, 'M', '𐐰'), + (0x10409, 'M', '𐐱'), + (0x1040A, 'M', '𐐲'), + (0x1040B, 'M', '𐐳'), + (0x1040C, 'M', '𐐴'), + (0x1040D, 'M', '𐐵'), + (0x1040E, 'M', '𐐶'), + (0x1040F, 'M', '𐐷'), + (0x10410, 'M', '𐐸'), + (0x10411, 'M', '𐐹'), + (0x10412, 'M', '𐐺'), + (0x10413, 'M', '𐐻'), + (0x10414, 'M', '𐐼'), + (0x10415, 'M', '𐐽'), + (0x10416, 'M', '𐐾'), + (0x10417, 'M', '𐐿'), + (0x10418, 'M', '𐑀'), + (0x10419, 'M', '𐑁'), + (0x1041A, 'M', '𐑂'), + (0x1041B, 'M', '𐑃'), + (0x1041C, 'M', '𐑄'), + (0x1041D, 'M', '𐑅'), + (0x1041E, 'M', '𐑆'), + (0x1041F, 'M', '𐑇'), + (0x10420, 'M', '𐑈'), + (0x10421, 'M', '𐑉'), + (0x10422, 'M', '𐑊'), + (0x10423, 'M', '𐑋'), + (0x10424, 'M', '𐑌'), + (0x10425, 'M', '𐑍'), + (0x10426, 'M', '𐑎'), + (0x10427, 'M', '𐑏'), + (0x10428, 'V'), + (0x1049E, 'X'), + (0x104A0, 'V'), + (0x104AA, 'X'), + (0x104B0, 'M', '𐓘'), + (0x104B1, 'M', '𐓙'), + (0x104B2, 'M', '𐓚'), + (0x104B3, 'M', '𐓛'), + (0x104B4, 'M', '𐓜'), + (0x104B5, 'M', '𐓝'), + ] + +def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x104B6, 'M', '𐓞'), + (0x104B7, 'M', '𐓟'), + (0x104B8, 'M', '𐓠'), + (0x104B9, 'M', '𐓡'), + (0x104BA, 'M', '𐓢'), + (0x104BB, 'M', '𐓣'), + (0x104BC, 'M', '𐓤'), + (0x104BD, 'M', '𐓥'), + (0x104BE, 'M', '𐓦'), + (0x104BF, 'M', '𐓧'), + (0x104C0, 'M', '𐓨'), + (0x104C1, 'M', '𐓩'), + (0x104C2, 'M', '𐓪'), + (0x104C3, 'M', '𐓫'), + (0x104C4, 'M', '𐓬'), + (0x104C5, 'M', '𐓭'), + (0x104C6, 'M', '𐓮'), + (0x104C7, 'M', '𐓯'), + (0x104C8, 'M', '𐓰'), + (0x104C9, 'M', '𐓱'), + (0x104CA, 'M', '𐓲'), + (0x104CB, 'M', '𐓳'), + (0x104CC, 'M', '𐓴'), + (0x104CD, 'M', '𐓵'), + (0x104CE, 'M', '𐓶'), + (0x104CF, 'M', '𐓷'), + (0x104D0, 'M', '𐓸'), + (0x104D1, 'M', '𐓹'), + (0x104D2, 'M', '𐓺'), + (0x104D3, 'M', '𐓻'), + (0x104D4, 'X'), + (0x104D8, 'V'), + (0x104FC, 'X'), + (0x10500, 'V'), + (0x10528, 'X'), + (0x10530, 'V'), + (0x10564, 'X'), + (0x1056F, 'V'), + (0x10570, 'M', '𐖗'), + (0x10571, 'M', '𐖘'), + (0x10572, 'M', '𐖙'), + (0x10573, 'M', '𐖚'), + (0x10574, 'M', '𐖛'), + (0x10575, 'M', '𐖜'), + (0x10576, 'M', '𐖝'), + (0x10577, 'M', '𐖞'), + (0x10578, 'M', '𐖟'), + (0x10579, 'M', '𐖠'), + (0x1057A, 'M', '𐖡'), + (0x1057B, 'X'), + (0x1057C, 'M', '𐖣'), + (0x1057D, 'M', '𐖤'), + (0x1057E, 'M', '𐖥'), + (0x1057F, 'M', '𐖦'), + (0x10580, 'M', '𐖧'), + (0x10581, 'M', '𐖨'), + (0x10582, 'M', '𐖩'), + (0x10583, 'M', '𐖪'), + (0x10584, 'M', '𐖫'), + (0x10585, 'M', '𐖬'), + (0x10586, 'M', '𐖭'), + (0x10587, 'M', '𐖮'), + (0x10588, 'M', '𐖯'), + (0x10589, 'M', '𐖰'), + (0x1058A, 'M', '𐖱'), + (0x1058B, 'X'), + (0x1058C, 'M', '𐖳'), + (0x1058D, 'M', '𐖴'), + (0x1058E, 'M', '𐖵'), + (0x1058F, 'M', '𐖶'), + (0x10590, 'M', '𐖷'), + (0x10591, 'M', '𐖸'), + (0x10592, 'M', '𐖹'), + (0x10593, 'X'), + (0x10594, 'M', '𐖻'), + (0x10595, 'M', '𐖼'), + (0x10596, 'X'), + (0x10597, 'V'), + (0x105A2, 'X'), + (0x105A3, 'V'), + (0x105B2, 'X'), + (0x105B3, 'V'), + (0x105BA, 'X'), + (0x105BB, 'V'), + (0x105BD, 'X'), + (0x10600, 'V'), + (0x10737, 'X'), + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), + (0x10780, 'V'), + (0x10781, 'M', 'ː'), + (0x10782, 'M', 'ˑ'), + (0x10783, 'M', 'æ'), + (0x10784, 'M', 'ʙ'), + (0x10785, 'M', 'ɓ'), + (0x10786, 'X'), + (0x10787, 'M', 'ʣ'), + (0x10788, 'M', 'ꭦ'), + ] + +def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10789, 'M', 'ʥ'), + (0x1078A, 'M', 'ʤ'), + (0x1078B, 'M', 'ɖ'), + (0x1078C, 'M', 'ɗ'), + (0x1078D, 'M', 'ᶑ'), + (0x1078E, 'M', 'ɘ'), + (0x1078F, 'M', 'ɞ'), + (0x10790, 'M', 'ʩ'), + (0x10791, 'M', 'ɤ'), + (0x10792, 'M', 'ɢ'), + (0x10793, 'M', 'ɠ'), + (0x10794, 'M', 'ʛ'), + (0x10795, 'M', 'ħ'), + (0x10796, 'M', 'ʜ'), + (0x10797, 'M', 'ɧ'), + (0x10798, 'M', 'ʄ'), + (0x10799, 'M', 'ʪ'), + (0x1079A, 'M', 'ʫ'), + (0x1079B, 'M', 'ɬ'), + (0x1079C, 'M', '𝼄'), + (0x1079D, 'M', 'ꞎ'), + (0x1079E, 'M', 'ɮ'), + (0x1079F, 'M', '𝼅'), + (0x107A0, 'M', 'ʎ'), + (0x107A1, 'M', '𝼆'), + (0x107A2, 'M', 'ø'), + (0x107A3, 'M', 'ɶ'), + (0x107A4, 'M', 'ɷ'), + (0x107A5, 'M', 'q'), + (0x107A6, 'M', 'ɺ'), + (0x107A7, 'M', '𝼈'), + (0x107A8, 'M', 'ɽ'), + (0x107A9, 'M', 'ɾ'), + (0x107AA, 'M', 'ʀ'), + (0x107AB, 'M', 'ʨ'), + (0x107AC, 'M', 'ʦ'), + (0x107AD, 'M', 'ꭧ'), + (0x107AE, 'M', 'ʧ'), + (0x107AF, 'M', 'ʈ'), + (0x107B0, 'M', 'ⱱ'), + (0x107B1, 'X'), + (0x107B2, 'M', 'ʏ'), + (0x107B3, 'M', 'ʡ'), + (0x107B4, 'M', 'ʢ'), + (0x107B5, 'M', 'ʘ'), + (0x107B6, 'M', 'ǀ'), + (0x107B7, 'M', 'ǁ'), + (0x107B8, 'M', 'ǂ'), + (0x107B9, 'M', '𝼊'), + (0x107BA, 'M', '𝼞'), + (0x107BB, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x1089F, 'X'), + (0x108A7, 'V'), + (0x108B0, 'X'), + (0x108E0, 'V'), + (0x108F3, 'X'), + (0x108F4, 'V'), + (0x108F6, 'X'), + (0x108FB, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BC, 'V'), + (0x109D0, 'X'), + (0x109D2, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A36, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A49, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10AA0, 'X'), + (0x10AC0, 'V'), + ] + +def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10AE7, 'X'), + (0x10AEB, 'V'), + (0x10AF7, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B92, 'X'), + (0x10B99, 'V'), + (0x10B9D, 'X'), + (0x10BA9, 'V'), + (0x10BB0, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10C80, 'M', '𐳀'), + (0x10C81, 'M', '𐳁'), + (0x10C82, 'M', '𐳂'), + (0x10C83, 'M', '𐳃'), + (0x10C84, 'M', '𐳄'), + (0x10C85, 'M', '𐳅'), + (0x10C86, 'M', '𐳆'), + (0x10C87, 'M', '𐳇'), + (0x10C88, 'M', '𐳈'), + (0x10C89, 'M', '𐳉'), + (0x10C8A, 'M', '𐳊'), + (0x10C8B, 'M', '𐳋'), + (0x10C8C, 'M', '𐳌'), + (0x10C8D, 'M', '𐳍'), + (0x10C8E, 'M', '𐳎'), + (0x10C8F, 'M', '𐳏'), + (0x10C90, 'M', '𐳐'), + (0x10C91, 'M', '𐳑'), + (0x10C92, 'M', '𐳒'), + (0x10C93, 'M', '𐳓'), + (0x10C94, 'M', '𐳔'), + (0x10C95, 'M', '𐳕'), + (0x10C96, 'M', '𐳖'), + (0x10C97, 'M', '𐳗'), + (0x10C98, 'M', '𐳘'), + (0x10C99, 'M', '𐳙'), + (0x10C9A, 'M', '𐳚'), + (0x10C9B, 'M', '𐳛'), + (0x10C9C, 'M', '𐳜'), + (0x10C9D, 'M', '𐳝'), + (0x10C9E, 'M', '𐳞'), + (0x10C9F, 'M', '𐳟'), + (0x10CA0, 'M', '𐳠'), + (0x10CA1, 'M', '𐳡'), + (0x10CA2, 'M', '𐳢'), + (0x10CA3, 'M', '𐳣'), + (0x10CA4, 'M', '𐳤'), + (0x10CA5, 'M', '𐳥'), + (0x10CA6, 'M', '𐳦'), + (0x10CA7, 'M', '𐳧'), + (0x10CA8, 'M', '𐳨'), + (0x10CA9, 'M', '𐳩'), + (0x10CAA, 'M', '𐳪'), + (0x10CAB, 'M', '𐳫'), + (0x10CAC, 'M', '𐳬'), + (0x10CAD, 'M', '𐳭'), + (0x10CAE, 'M', '𐳮'), + (0x10CAF, 'M', '𐳯'), + (0x10CB0, 'M', '𐳰'), + (0x10CB1, 'M', '𐳱'), + (0x10CB2, 'M', '𐳲'), + (0x10CB3, 'X'), + (0x10CC0, 'V'), + (0x10CF3, 'X'), + (0x10CFA, 'V'), + (0x10D28, 'X'), + (0x10D30, 'V'), + (0x10D3A, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x10E80, 'V'), + (0x10EAA, 'X'), + (0x10EAB, 'V'), + (0x10EAE, 'X'), + (0x10EB0, 'V'), + (0x10EB2, 'X'), + (0x10F00, 'V'), + (0x10F28, 'X'), + (0x10F30, 'V'), + (0x10F5A, 'X'), + (0x10F70, 'V'), + (0x10F8A, 'X'), + (0x10FB0, 'V'), + (0x10FCC, 'X'), + (0x10FE0, 'V'), + (0x10FF7, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11076, 'X'), + (0x1107F, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + ] + +def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x110C3, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11148, 'X'), + (0x11150, 'V'), + (0x11177, 'X'), + (0x11180, 'V'), + (0x111E0, 'X'), + (0x111E1, 'V'), + (0x111F5, 'X'), + (0x11200, 'V'), + (0x11212, 'X'), + (0x11213, 'V'), + (0x1123F, 'X'), + (0x11280, 'V'), + (0x11287, 'X'), + (0x11288, 'V'), + (0x11289, 'X'), + (0x1128A, 'V'), + (0x1128E, 'X'), + (0x1128F, 'V'), + (0x1129E, 'X'), + (0x1129F, 'V'), + (0x112AA, 'X'), + (0x112B0, 'V'), + (0x112EB, 'X'), + (0x112F0, 'V'), + (0x112FA, 'X'), + (0x11300, 'V'), + (0x11304, 'X'), + (0x11305, 'V'), + (0x1130D, 'X'), + (0x1130F, 'V'), + (0x11311, 'X'), + (0x11313, 'V'), + (0x11329, 'X'), + (0x1132A, 'V'), + (0x11331, 'X'), + (0x11332, 'V'), + (0x11334, 'X'), + (0x11335, 'V'), + (0x1133A, 'X'), + (0x1133B, 'V'), + (0x11345, 'X'), + (0x11347, 'V'), + (0x11349, 'X'), + (0x1134B, 'V'), + (0x1134E, 'X'), + (0x11350, 'V'), + (0x11351, 'X'), + (0x11357, 'V'), + (0x11358, 'X'), + (0x1135D, 'V'), + (0x11364, 'X'), + (0x11366, 'V'), + (0x1136D, 'X'), + (0x11370, 'V'), + (0x11375, 'X'), + (0x11400, 'V'), + (0x1145C, 'X'), + (0x1145D, 'V'), + (0x11462, 'X'), + (0x11480, 'V'), + (0x114C8, 'X'), + (0x114D0, 'V'), + (0x114DA, 'X'), + (0x11580, 'V'), + (0x115B6, 'X'), + (0x115B8, 'V'), + (0x115DE, 'X'), + (0x11600, 'V'), + (0x11645, 'X'), + (0x11650, 'V'), + (0x1165A, 'X'), + (0x11660, 'V'), + (0x1166D, 'X'), + (0x11680, 'V'), + (0x116BA, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x11700, 'V'), + (0x1171B, 'X'), + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), + (0x11747, 'X'), + (0x11800, 'V'), + (0x1183C, 'X'), + (0x118A0, 'M', '𑣀'), + (0x118A1, 'M', '𑣁'), + (0x118A2, 'M', '𑣂'), + (0x118A3, 'M', '𑣃'), + (0x118A4, 'M', '𑣄'), + (0x118A5, 'M', '𑣅'), + (0x118A6, 'M', '𑣆'), + ] + +def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x118A7, 'M', '𑣇'), + (0x118A8, 'M', '𑣈'), + (0x118A9, 'M', '𑣉'), + (0x118AA, 'M', '𑣊'), + (0x118AB, 'M', '𑣋'), + (0x118AC, 'M', '𑣌'), + (0x118AD, 'M', '𑣍'), + (0x118AE, 'M', '𑣎'), + (0x118AF, 'M', '𑣏'), + (0x118B0, 'M', '𑣐'), + (0x118B1, 'M', '𑣑'), + (0x118B2, 'M', '𑣒'), + (0x118B3, 'M', '𑣓'), + (0x118B4, 'M', '𑣔'), + (0x118B5, 'M', '𑣕'), + (0x118B6, 'M', '𑣖'), + (0x118B7, 'M', '𑣗'), + (0x118B8, 'M', '𑣘'), + (0x118B9, 'M', '𑣙'), + (0x118BA, 'M', '𑣚'), + (0x118BB, 'M', '𑣛'), + (0x118BC, 'M', '𑣜'), + (0x118BD, 'M', '𑣝'), + (0x118BE, 'M', '𑣞'), + (0x118BF, 'M', '𑣟'), + (0x118C0, 'V'), + (0x118F3, 'X'), + (0x118FF, 'V'), + (0x11907, 'X'), + (0x11909, 'V'), + (0x1190A, 'X'), + (0x1190C, 'V'), + (0x11914, 'X'), + (0x11915, 'V'), + (0x11917, 'X'), + (0x11918, 'V'), + (0x11936, 'X'), + (0x11937, 'V'), + (0x11939, 'X'), + (0x1193B, 'V'), + (0x11947, 'X'), + (0x11950, 'V'), + (0x1195A, 'X'), + (0x119A0, 'V'), + (0x119A8, 'X'), + (0x119AA, 'V'), + (0x119D8, 'X'), + (0x119DA, 'V'), + (0x119E5, 'X'), + (0x11A00, 'V'), + (0x11A48, 'X'), + (0x11A50, 'V'), + (0x11AA3, 'X'), + (0x11AB0, 'V'), + (0x11AF9, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), + (0x11C0A, 'V'), + (0x11C37, 'X'), + (0x11C38, 'V'), + (0x11C46, 'X'), + (0x11C50, 'V'), + (0x11C6D, 'X'), + (0x11C70, 'V'), + (0x11C90, 'X'), + (0x11C92, 'V'), + (0x11CA8, 'X'), + (0x11CA9, 'V'), + (0x11CB7, 'X'), + (0x11D00, 'V'), + (0x11D07, 'X'), + (0x11D08, 'V'), + (0x11D0A, 'X'), + (0x11D0B, 'V'), + (0x11D37, 'X'), + (0x11D3A, 'V'), + (0x11D3B, 'X'), + (0x11D3C, 'V'), + (0x11D3E, 'X'), + (0x11D3F, 'V'), + (0x11D48, 'X'), + (0x11D50, 'V'), + (0x11D5A, 'X'), + (0x11D60, 'V'), + (0x11D66, 'X'), + (0x11D67, 'V'), + (0x11D69, 'X'), + (0x11D6A, 'V'), + (0x11D8F, 'X'), + (0x11D90, 'V'), + (0x11D92, 'X'), + (0x11D93, 'V'), + (0x11D99, 'X'), + (0x11DA0, 'V'), + (0x11DAA, 'X'), + (0x11EE0, 'V'), + (0x11EF9, 'X'), + (0x11FB0, 'V'), + (0x11FB1, 'X'), + (0x11FC0, 'V'), + ] + +def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x11FF2, 'X'), + (0x11FFF, 'V'), + (0x1239A, 'X'), + (0x12400, 'V'), + (0x1246F, 'X'), + (0x12470, 'V'), + (0x12475, 'X'), + (0x12480, 'V'), + (0x12544, 'X'), + (0x12F90, 'V'), + (0x12FF3, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + (0x14400, 'V'), + (0x14647, 'X'), + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16A40, 'V'), + (0x16A5F, 'X'), + (0x16A60, 'V'), + (0x16A6A, 'X'), + (0x16A6E, 'V'), + (0x16ABF, 'X'), + (0x16AC0, 'V'), + (0x16ACA, 'X'), + (0x16AD0, 'V'), + (0x16AEE, 'X'), + (0x16AF0, 'V'), + (0x16AF6, 'X'), + (0x16B00, 'V'), + (0x16B46, 'X'), + (0x16B50, 'V'), + (0x16B5A, 'X'), + (0x16B5B, 'V'), + (0x16B62, 'X'), + (0x16B63, 'V'), + (0x16B78, 'X'), + (0x16B7D, 'V'), + (0x16B90, 'X'), + (0x16E40, 'M', '𖹠'), + (0x16E41, 'M', '𖹡'), + (0x16E42, 'M', '𖹢'), + (0x16E43, 'M', '𖹣'), + (0x16E44, 'M', '𖹤'), + (0x16E45, 'M', '𖹥'), + (0x16E46, 'M', '𖹦'), + (0x16E47, 'M', '𖹧'), + (0x16E48, 'M', '𖹨'), + (0x16E49, 'M', '𖹩'), + (0x16E4A, 'M', '𖹪'), + (0x16E4B, 'M', '𖹫'), + (0x16E4C, 'M', '𖹬'), + (0x16E4D, 'M', '𖹭'), + (0x16E4E, 'M', '𖹮'), + (0x16E4F, 'M', '𖹯'), + (0x16E50, 'M', '𖹰'), + (0x16E51, 'M', '𖹱'), + (0x16E52, 'M', '𖹲'), + (0x16E53, 'M', '𖹳'), + (0x16E54, 'M', '𖹴'), + (0x16E55, 'M', '𖹵'), + (0x16E56, 'M', '𖹶'), + (0x16E57, 'M', '𖹷'), + (0x16E58, 'M', '𖹸'), + (0x16E59, 'M', '𖹹'), + (0x16E5A, 'M', '𖹺'), + (0x16E5B, 'M', '𖹻'), + (0x16E5C, 'M', '𖹼'), + (0x16E5D, 'M', '𖹽'), + (0x16E5E, 'M', '𖹾'), + (0x16E5F, 'M', '𖹿'), + (0x16E60, 'V'), + (0x16E9B, 'X'), + (0x16F00, 'V'), + (0x16F4B, 'X'), + (0x16F4F, 'V'), + (0x16F88, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x16FE0, 'V'), + (0x16FE5, 'X'), + (0x16FF0, 'V'), + (0x16FF2, 'X'), + (0x17000, 'V'), + (0x187F8, 'X'), + (0x18800, 'V'), + (0x18CD6, 'X'), + (0x18D00, 'V'), + (0x18D09, 'X'), + (0x1AFF0, 'V'), + (0x1AFF4, 'X'), + (0x1AFF5, 'V'), + (0x1AFFC, 'X'), + (0x1AFFD, 'V'), + (0x1AFFF, 'X'), + (0x1B000, 'V'), + (0x1B123, 'X'), + (0x1B150, 'V'), + (0x1B153, 'X'), + (0x1B164, 'V'), + ] + +def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1B168, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), + (0x1BC00, 'V'), + (0x1BC6B, 'X'), + (0x1BC70, 'V'), + (0x1BC7D, 'X'), + (0x1BC80, 'V'), + (0x1BC89, 'X'), + (0x1BC90, 'V'), + (0x1BC9A, 'X'), + (0x1BC9C, 'V'), + (0x1BCA0, 'I'), + (0x1BCA4, 'X'), + (0x1CF00, 'V'), + (0x1CF2E, 'X'), + (0x1CF30, 'V'), + (0x1CF47, 'X'), + (0x1CF50, 'V'), + (0x1CFC4, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), + (0x1D127, 'X'), + (0x1D129, 'V'), + (0x1D15E, 'M', '𝅗𝅥'), + (0x1D15F, 'M', '𝅘𝅥'), + (0x1D160, 'M', '𝅘𝅥𝅮'), + (0x1D161, 'M', '𝅘𝅥𝅯'), + (0x1D162, 'M', '𝅘𝅥𝅰'), + (0x1D163, 'M', '𝅘𝅥𝅱'), + (0x1D164, 'M', '𝅘𝅥𝅲'), + (0x1D165, 'V'), + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', '𝆹𝅥'), + (0x1D1BC, 'M', '𝆺𝅥'), + (0x1D1BD, 'M', '𝆹𝅥𝅮'), + (0x1D1BE, 'M', '𝆺𝅥𝅮'), + (0x1D1BF, 'M', '𝆹𝅥𝅯'), + (0x1D1C0, 'M', '𝆺𝅥𝅯'), + (0x1D1C1, 'V'), + (0x1D1EB, 'X'), + (0x1D200, 'V'), + (0x1D246, 'X'), + (0x1D2E0, 'V'), + (0x1D2F4, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D379, 'X'), + (0x1D400, 'M', 'a'), + (0x1D401, 'M', 'b'), + (0x1D402, 'M', 'c'), + (0x1D403, 'M', 'd'), + (0x1D404, 'M', 'e'), + (0x1D405, 'M', 'f'), + (0x1D406, 'M', 'g'), + (0x1D407, 'M', 'h'), + (0x1D408, 'M', 'i'), + (0x1D409, 'M', 'j'), + (0x1D40A, 'M', 'k'), + (0x1D40B, 'M', 'l'), + (0x1D40C, 'M', 'm'), + (0x1D40D, 'M', 'n'), + (0x1D40E, 'M', 'o'), + (0x1D40F, 'M', 'p'), + (0x1D410, 'M', 'q'), + (0x1D411, 'M', 'r'), + (0x1D412, 'M', 's'), + (0x1D413, 'M', 't'), + (0x1D414, 'M', 'u'), + (0x1D415, 'M', 'v'), + (0x1D416, 'M', 'w'), + (0x1D417, 'M', 'x'), + (0x1D418, 'M', 'y'), + (0x1D419, 'M', 'z'), + (0x1D41A, 'M', 'a'), + (0x1D41B, 'M', 'b'), + (0x1D41C, 'M', 'c'), + (0x1D41D, 'M', 'd'), + (0x1D41E, 'M', 'e'), + (0x1D41F, 'M', 'f'), + (0x1D420, 'M', 'g'), + (0x1D421, 'M', 'h'), + (0x1D422, 'M', 'i'), + (0x1D423, 'M', 'j'), + (0x1D424, 'M', 'k'), + (0x1D425, 'M', 'l'), + (0x1D426, 'M', 'm'), + (0x1D427, 'M', 'n'), + (0x1D428, 'M', 'o'), + (0x1D429, 'M', 'p'), + (0x1D42A, 'M', 'q'), + (0x1D42B, 'M', 'r'), + (0x1D42C, 'M', 's'), + (0x1D42D, 'M', 't'), + (0x1D42E, 'M', 'u'), + (0x1D42F, 'M', 'v'), + (0x1D430, 'M', 'w'), + ] + +def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D431, 'M', 'x'), + (0x1D432, 'M', 'y'), + (0x1D433, 'M', 'z'), + (0x1D434, 'M', 'a'), + (0x1D435, 'M', 'b'), + (0x1D436, 'M', 'c'), + (0x1D437, 'M', 'd'), + (0x1D438, 'M', 'e'), + (0x1D439, 'M', 'f'), + (0x1D43A, 'M', 'g'), + (0x1D43B, 'M', 'h'), + (0x1D43C, 'M', 'i'), + (0x1D43D, 'M', 'j'), + (0x1D43E, 'M', 'k'), + (0x1D43F, 'M', 'l'), + (0x1D440, 'M', 'm'), + (0x1D441, 'M', 'n'), + (0x1D442, 'M', 'o'), + (0x1D443, 'M', 'p'), + (0x1D444, 'M', 'q'), + (0x1D445, 'M', 'r'), + (0x1D446, 'M', 's'), + (0x1D447, 'M', 't'), + (0x1D448, 'M', 'u'), + (0x1D449, 'M', 'v'), + (0x1D44A, 'M', 'w'), + (0x1D44B, 'M', 'x'), + (0x1D44C, 'M', 'y'), + (0x1D44D, 'M', 'z'), + (0x1D44E, 'M', 'a'), + (0x1D44F, 'M', 'b'), + (0x1D450, 'M', 'c'), + (0x1D451, 'M', 'd'), + (0x1D452, 'M', 'e'), + (0x1D453, 'M', 'f'), + (0x1D454, 'M', 'g'), + (0x1D455, 'X'), + (0x1D456, 'M', 'i'), + (0x1D457, 'M', 'j'), + (0x1D458, 'M', 'k'), + (0x1D459, 'M', 'l'), + (0x1D45A, 'M', 'm'), + (0x1D45B, 'M', 'n'), + (0x1D45C, 'M', 'o'), + (0x1D45D, 'M', 'p'), + (0x1D45E, 'M', 'q'), + (0x1D45F, 'M', 'r'), + (0x1D460, 'M', 's'), + (0x1D461, 'M', 't'), + (0x1D462, 'M', 'u'), + (0x1D463, 'M', 'v'), + (0x1D464, 'M', 'w'), + (0x1D465, 'M', 'x'), + (0x1D466, 'M', 'y'), + (0x1D467, 'M', 'z'), + (0x1D468, 'M', 'a'), + (0x1D469, 'M', 'b'), + (0x1D46A, 'M', 'c'), + (0x1D46B, 'M', 'd'), + (0x1D46C, 'M', 'e'), + (0x1D46D, 'M', 'f'), + (0x1D46E, 'M', 'g'), + (0x1D46F, 'M', 'h'), + (0x1D470, 'M', 'i'), + (0x1D471, 'M', 'j'), + (0x1D472, 'M', 'k'), + (0x1D473, 'M', 'l'), + (0x1D474, 'M', 'm'), + (0x1D475, 'M', 'n'), + (0x1D476, 'M', 'o'), + (0x1D477, 'M', 'p'), + (0x1D478, 'M', 'q'), + (0x1D479, 'M', 'r'), + (0x1D47A, 'M', 's'), + (0x1D47B, 'M', 't'), + (0x1D47C, 'M', 'u'), + (0x1D47D, 'M', 'v'), + (0x1D47E, 'M', 'w'), + (0x1D47F, 'M', 'x'), + (0x1D480, 'M', 'y'), + (0x1D481, 'M', 'z'), + (0x1D482, 'M', 'a'), + (0x1D483, 'M', 'b'), + (0x1D484, 'M', 'c'), + (0x1D485, 'M', 'd'), + (0x1D486, 'M', 'e'), + (0x1D487, 'M', 'f'), + (0x1D488, 'M', 'g'), + (0x1D489, 'M', 'h'), + (0x1D48A, 'M', 'i'), + (0x1D48B, 'M', 'j'), + (0x1D48C, 'M', 'k'), + (0x1D48D, 'M', 'l'), + (0x1D48E, 'M', 'm'), + (0x1D48F, 'M', 'n'), + (0x1D490, 'M', 'o'), + (0x1D491, 'M', 'p'), + (0x1D492, 'M', 'q'), + (0x1D493, 'M', 'r'), + (0x1D494, 'M', 's'), + ] + +def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D495, 'M', 't'), + (0x1D496, 'M', 'u'), + (0x1D497, 'M', 'v'), + (0x1D498, 'M', 'w'), + (0x1D499, 'M', 'x'), + (0x1D49A, 'M', 'y'), + (0x1D49B, 'M', 'z'), + (0x1D49C, 'M', 'a'), + (0x1D49D, 'X'), + (0x1D49E, 'M', 'c'), + (0x1D49F, 'M', 'd'), + (0x1D4A0, 'X'), + (0x1D4A2, 'M', 'g'), + (0x1D4A3, 'X'), + (0x1D4A5, 'M', 'j'), + (0x1D4A6, 'M', 'k'), + (0x1D4A7, 'X'), + (0x1D4A9, 'M', 'n'), + (0x1D4AA, 'M', 'o'), + (0x1D4AB, 'M', 'p'), + (0x1D4AC, 'M', 'q'), + (0x1D4AD, 'X'), + (0x1D4AE, 'M', 's'), + (0x1D4AF, 'M', 't'), + (0x1D4B0, 'M', 'u'), + (0x1D4B1, 'M', 'v'), + (0x1D4B2, 'M', 'w'), + (0x1D4B3, 'M', 'x'), + (0x1D4B4, 'M', 'y'), + (0x1D4B5, 'M', 'z'), + (0x1D4B6, 'M', 'a'), + (0x1D4B7, 'M', 'b'), + (0x1D4B8, 'M', 'c'), + (0x1D4B9, 'M', 'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', 'f'), + (0x1D4BC, 'X'), + (0x1D4BD, 'M', 'h'), + (0x1D4BE, 'M', 'i'), + (0x1D4BF, 'M', 'j'), + (0x1D4C0, 'M', 'k'), + (0x1D4C1, 'M', 'l'), + (0x1D4C2, 'M', 'm'), + (0x1D4C3, 'M', 'n'), + (0x1D4C4, 'X'), + (0x1D4C5, 'M', 'p'), + (0x1D4C6, 'M', 'q'), + (0x1D4C7, 'M', 'r'), + (0x1D4C8, 'M', 's'), + (0x1D4C9, 'M', 't'), + (0x1D4CA, 'M', 'u'), + (0x1D4CB, 'M', 'v'), + (0x1D4CC, 'M', 'w'), + (0x1D4CD, 'M', 'x'), + (0x1D4CE, 'M', 'y'), + (0x1D4CF, 'M', 'z'), + (0x1D4D0, 'M', 'a'), + (0x1D4D1, 'M', 'b'), + (0x1D4D2, 'M', 'c'), + (0x1D4D3, 'M', 'd'), + (0x1D4D4, 'M', 'e'), + (0x1D4D5, 'M', 'f'), + (0x1D4D6, 'M', 'g'), + (0x1D4D7, 'M', 'h'), + (0x1D4D8, 'M', 'i'), + (0x1D4D9, 'M', 'j'), + (0x1D4DA, 'M', 'k'), + (0x1D4DB, 'M', 'l'), + (0x1D4DC, 'M', 'm'), + (0x1D4DD, 'M', 'n'), + (0x1D4DE, 'M', 'o'), + (0x1D4DF, 'M', 'p'), + (0x1D4E0, 'M', 'q'), + (0x1D4E1, 'M', 'r'), + (0x1D4E2, 'M', 's'), + (0x1D4E3, 'M', 't'), + (0x1D4E4, 'M', 'u'), + (0x1D4E5, 'M', 'v'), + (0x1D4E6, 'M', 'w'), + (0x1D4E7, 'M', 'x'), + (0x1D4E8, 'M', 'y'), + (0x1D4E9, 'M', 'z'), + (0x1D4EA, 'M', 'a'), + (0x1D4EB, 'M', 'b'), + (0x1D4EC, 'M', 'c'), + (0x1D4ED, 'M', 'd'), + (0x1D4EE, 'M', 'e'), + (0x1D4EF, 'M', 'f'), + (0x1D4F0, 'M', 'g'), + (0x1D4F1, 'M', 'h'), + (0x1D4F2, 'M', 'i'), + (0x1D4F3, 'M', 'j'), + (0x1D4F4, 'M', 'k'), + (0x1D4F5, 'M', 'l'), + (0x1D4F6, 'M', 'm'), + (0x1D4F7, 'M', 'n'), + (0x1D4F8, 'M', 'o'), + (0x1D4F9, 'M', 'p'), + (0x1D4FA, 'M', 'q'), + (0x1D4FB, 'M', 'r'), + ] + +def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D4FC, 'M', 's'), + (0x1D4FD, 'M', 't'), + (0x1D4FE, 'M', 'u'), + (0x1D4FF, 'M', 'v'), + (0x1D500, 'M', 'w'), + (0x1D501, 'M', 'x'), + (0x1D502, 'M', 'y'), + (0x1D503, 'M', 'z'), + (0x1D504, 'M', 'a'), + (0x1D505, 'M', 'b'), + (0x1D506, 'X'), + (0x1D507, 'M', 'd'), + (0x1D508, 'M', 'e'), + (0x1D509, 'M', 'f'), + (0x1D50A, 'M', 'g'), + (0x1D50B, 'X'), + (0x1D50D, 'M', 'j'), + (0x1D50E, 'M', 'k'), + (0x1D50F, 'M', 'l'), + (0x1D510, 'M', 'm'), + (0x1D511, 'M', 'n'), + (0x1D512, 'M', 'o'), + (0x1D513, 'M', 'p'), + (0x1D514, 'M', 'q'), + (0x1D515, 'X'), + (0x1D516, 'M', 's'), + (0x1D517, 'M', 't'), + (0x1D518, 'M', 'u'), + (0x1D519, 'M', 'v'), + (0x1D51A, 'M', 'w'), + (0x1D51B, 'M', 'x'), + (0x1D51C, 'M', 'y'), + (0x1D51D, 'X'), + (0x1D51E, 'M', 'a'), + (0x1D51F, 'M', 'b'), + (0x1D520, 'M', 'c'), + (0x1D521, 'M', 'd'), + (0x1D522, 'M', 'e'), + (0x1D523, 'M', 'f'), + (0x1D524, 'M', 'g'), + (0x1D525, 'M', 'h'), + (0x1D526, 'M', 'i'), + (0x1D527, 'M', 'j'), + (0x1D528, 'M', 'k'), + (0x1D529, 'M', 'l'), + (0x1D52A, 'M', 'm'), + (0x1D52B, 'M', 'n'), + (0x1D52C, 'M', 'o'), + (0x1D52D, 'M', 'p'), + (0x1D52E, 'M', 'q'), + (0x1D52F, 'M', 'r'), + (0x1D530, 'M', 's'), + (0x1D531, 'M', 't'), + (0x1D532, 'M', 'u'), + (0x1D533, 'M', 'v'), + (0x1D534, 'M', 'w'), + (0x1D535, 'M', 'x'), + (0x1D536, 'M', 'y'), + (0x1D537, 'M', 'z'), + (0x1D538, 'M', 'a'), + (0x1D539, 'M', 'b'), + (0x1D53A, 'X'), + (0x1D53B, 'M', 'd'), + (0x1D53C, 'M', 'e'), + (0x1D53D, 'M', 'f'), + (0x1D53E, 'M', 'g'), + (0x1D53F, 'X'), + (0x1D540, 'M', 'i'), + (0x1D541, 'M', 'j'), + (0x1D542, 'M', 'k'), + (0x1D543, 'M', 'l'), + (0x1D544, 'M', 'm'), + (0x1D545, 'X'), + (0x1D546, 'M', 'o'), + (0x1D547, 'X'), + (0x1D54A, 'M', 's'), + (0x1D54B, 'M', 't'), + (0x1D54C, 'M', 'u'), + (0x1D54D, 'M', 'v'), + (0x1D54E, 'M', 'w'), + (0x1D54F, 'M', 'x'), + (0x1D550, 'M', 'y'), + (0x1D551, 'X'), + (0x1D552, 'M', 'a'), + (0x1D553, 'M', 'b'), + (0x1D554, 'M', 'c'), + (0x1D555, 'M', 'd'), + (0x1D556, 'M', 'e'), + (0x1D557, 'M', 'f'), + (0x1D558, 'M', 'g'), + (0x1D559, 'M', 'h'), + (0x1D55A, 'M', 'i'), + (0x1D55B, 'M', 'j'), + (0x1D55C, 'M', 'k'), + (0x1D55D, 'M', 'l'), + (0x1D55E, 'M', 'm'), + (0x1D55F, 'M', 'n'), + (0x1D560, 'M', 'o'), + (0x1D561, 'M', 'p'), + (0x1D562, 'M', 'q'), + ] + +def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D563, 'M', 'r'), + (0x1D564, 'M', 's'), + (0x1D565, 'M', 't'), + (0x1D566, 'M', 'u'), + (0x1D567, 'M', 'v'), + (0x1D568, 'M', 'w'), + (0x1D569, 'M', 'x'), + (0x1D56A, 'M', 'y'), + (0x1D56B, 'M', 'z'), + (0x1D56C, 'M', 'a'), + (0x1D56D, 'M', 'b'), + (0x1D56E, 'M', 'c'), + (0x1D56F, 'M', 'd'), + (0x1D570, 'M', 'e'), + (0x1D571, 'M', 'f'), + (0x1D572, 'M', 'g'), + (0x1D573, 'M', 'h'), + (0x1D574, 'M', 'i'), + (0x1D575, 'M', 'j'), + (0x1D576, 'M', 'k'), + (0x1D577, 'M', 'l'), + (0x1D578, 'M', 'm'), + (0x1D579, 'M', 'n'), + (0x1D57A, 'M', 'o'), + (0x1D57B, 'M', 'p'), + (0x1D57C, 'M', 'q'), + (0x1D57D, 'M', 'r'), + (0x1D57E, 'M', 's'), + (0x1D57F, 'M', 't'), + (0x1D580, 'M', 'u'), + (0x1D581, 'M', 'v'), + (0x1D582, 'M', 'w'), + (0x1D583, 'M', 'x'), + (0x1D584, 'M', 'y'), + (0x1D585, 'M', 'z'), + (0x1D586, 'M', 'a'), + (0x1D587, 'M', 'b'), + (0x1D588, 'M', 'c'), + (0x1D589, 'M', 'd'), + (0x1D58A, 'M', 'e'), + (0x1D58B, 'M', 'f'), + (0x1D58C, 'M', 'g'), + (0x1D58D, 'M', 'h'), + (0x1D58E, 'M', 'i'), + (0x1D58F, 'M', 'j'), + (0x1D590, 'M', 'k'), + (0x1D591, 'M', 'l'), + (0x1D592, 'M', 'm'), + (0x1D593, 'M', 'n'), + (0x1D594, 'M', 'o'), + (0x1D595, 'M', 'p'), + (0x1D596, 'M', 'q'), + (0x1D597, 'M', 'r'), + (0x1D598, 'M', 's'), + (0x1D599, 'M', 't'), + (0x1D59A, 'M', 'u'), + (0x1D59B, 'M', 'v'), + (0x1D59C, 'M', 'w'), + (0x1D59D, 'M', 'x'), + (0x1D59E, 'M', 'y'), + (0x1D59F, 'M', 'z'), + (0x1D5A0, 'M', 'a'), + (0x1D5A1, 'M', 'b'), + (0x1D5A2, 'M', 'c'), + (0x1D5A3, 'M', 'd'), + (0x1D5A4, 'M', 'e'), + (0x1D5A5, 'M', 'f'), + (0x1D5A6, 'M', 'g'), + (0x1D5A7, 'M', 'h'), + (0x1D5A8, 'M', 'i'), + (0x1D5A9, 'M', 'j'), + (0x1D5AA, 'M', 'k'), + (0x1D5AB, 'M', 'l'), + (0x1D5AC, 'M', 'm'), + (0x1D5AD, 'M', 'n'), + (0x1D5AE, 'M', 'o'), + (0x1D5AF, 'M', 'p'), + (0x1D5B0, 'M', 'q'), + (0x1D5B1, 'M', 'r'), + (0x1D5B2, 'M', 's'), + (0x1D5B3, 'M', 't'), + (0x1D5B4, 'M', 'u'), + (0x1D5B5, 'M', 'v'), + (0x1D5B6, 'M', 'w'), + (0x1D5B7, 'M', 'x'), + (0x1D5B8, 'M', 'y'), + (0x1D5B9, 'M', 'z'), + (0x1D5BA, 'M', 'a'), + (0x1D5BB, 'M', 'b'), + (0x1D5BC, 'M', 'c'), + (0x1D5BD, 'M', 'd'), + (0x1D5BE, 'M', 'e'), + (0x1D5BF, 'M', 'f'), + (0x1D5C0, 'M', 'g'), + (0x1D5C1, 'M', 'h'), + (0x1D5C2, 'M', 'i'), + (0x1D5C3, 'M', 'j'), + (0x1D5C4, 'M', 'k'), + (0x1D5C5, 'M', 'l'), + (0x1D5C6, 'M', 'm'), + ] + +def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D5C7, 'M', 'n'), + (0x1D5C8, 'M', 'o'), + (0x1D5C9, 'M', 'p'), + (0x1D5CA, 'M', 'q'), + (0x1D5CB, 'M', 'r'), + (0x1D5CC, 'M', 's'), + (0x1D5CD, 'M', 't'), + (0x1D5CE, 'M', 'u'), + (0x1D5CF, 'M', 'v'), + (0x1D5D0, 'M', 'w'), + (0x1D5D1, 'M', 'x'), + (0x1D5D2, 'M', 'y'), + (0x1D5D3, 'M', 'z'), + (0x1D5D4, 'M', 'a'), + (0x1D5D5, 'M', 'b'), + (0x1D5D6, 'M', 'c'), + (0x1D5D7, 'M', 'd'), + (0x1D5D8, 'M', 'e'), + (0x1D5D9, 'M', 'f'), + (0x1D5DA, 'M', 'g'), + (0x1D5DB, 'M', 'h'), + (0x1D5DC, 'M', 'i'), + (0x1D5DD, 'M', 'j'), + (0x1D5DE, 'M', 'k'), + (0x1D5DF, 'M', 'l'), + (0x1D5E0, 'M', 'm'), + (0x1D5E1, 'M', 'n'), + (0x1D5E2, 'M', 'o'), + (0x1D5E3, 'M', 'p'), + (0x1D5E4, 'M', 'q'), + (0x1D5E5, 'M', 'r'), + (0x1D5E6, 'M', 's'), + (0x1D5E7, 'M', 't'), + (0x1D5E8, 'M', 'u'), + (0x1D5E9, 'M', 'v'), + (0x1D5EA, 'M', 'w'), + (0x1D5EB, 'M', 'x'), + (0x1D5EC, 'M', 'y'), + (0x1D5ED, 'M', 'z'), + (0x1D5EE, 'M', 'a'), + (0x1D5EF, 'M', 'b'), + (0x1D5F0, 'M', 'c'), + (0x1D5F1, 'M', 'd'), + (0x1D5F2, 'M', 'e'), + (0x1D5F3, 'M', 'f'), + (0x1D5F4, 'M', 'g'), + (0x1D5F5, 'M', 'h'), + (0x1D5F6, 'M', 'i'), + (0x1D5F7, 'M', 'j'), + (0x1D5F8, 'M', 'k'), + (0x1D5F9, 'M', 'l'), + (0x1D5FA, 'M', 'm'), + (0x1D5FB, 'M', 'n'), + (0x1D5FC, 'M', 'o'), + (0x1D5FD, 'M', 'p'), + (0x1D5FE, 'M', 'q'), + (0x1D5FF, 'M', 'r'), + (0x1D600, 'M', 's'), + (0x1D601, 'M', 't'), + (0x1D602, 'M', 'u'), + (0x1D603, 'M', 'v'), + (0x1D604, 'M', 'w'), + (0x1D605, 'M', 'x'), + (0x1D606, 'M', 'y'), + (0x1D607, 'M', 'z'), + (0x1D608, 'M', 'a'), + (0x1D609, 'M', 'b'), + (0x1D60A, 'M', 'c'), + (0x1D60B, 'M', 'd'), + (0x1D60C, 'M', 'e'), + (0x1D60D, 'M', 'f'), + (0x1D60E, 'M', 'g'), + (0x1D60F, 'M', 'h'), + (0x1D610, 'M', 'i'), + (0x1D611, 'M', 'j'), + (0x1D612, 'M', 'k'), + (0x1D613, 'M', 'l'), + (0x1D614, 'M', 'm'), + (0x1D615, 'M', 'n'), + (0x1D616, 'M', 'o'), + (0x1D617, 'M', 'p'), + (0x1D618, 'M', 'q'), + (0x1D619, 'M', 'r'), + (0x1D61A, 'M', 's'), + (0x1D61B, 'M', 't'), + (0x1D61C, 'M', 'u'), + (0x1D61D, 'M', 'v'), + (0x1D61E, 'M', 'w'), + (0x1D61F, 'M', 'x'), + (0x1D620, 'M', 'y'), + (0x1D621, 'M', 'z'), + (0x1D622, 'M', 'a'), + (0x1D623, 'M', 'b'), + (0x1D624, 'M', 'c'), + (0x1D625, 'M', 'd'), + (0x1D626, 'M', 'e'), + (0x1D627, 'M', 'f'), + (0x1D628, 'M', 'g'), + (0x1D629, 'M', 'h'), + (0x1D62A, 'M', 'i'), + ] + +def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D62B, 'M', 'j'), + (0x1D62C, 'M', 'k'), + (0x1D62D, 'M', 'l'), + (0x1D62E, 'M', 'm'), + (0x1D62F, 'M', 'n'), + (0x1D630, 'M', 'o'), + (0x1D631, 'M', 'p'), + (0x1D632, 'M', 'q'), + (0x1D633, 'M', 'r'), + (0x1D634, 'M', 's'), + (0x1D635, 'M', 't'), + (0x1D636, 'M', 'u'), + (0x1D637, 'M', 'v'), + (0x1D638, 'M', 'w'), + (0x1D639, 'M', 'x'), + (0x1D63A, 'M', 'y'), + (0x1D63B, 'M', 'z'), + (0x1D63C, 'M', 'a'), + (0x1D63D, 'M', 'b'), + (0x1D63E, 'M', 'c'), + (0x1D63F, 'M', 'd'), + (0x1D640, 'M', 'e'), + (0x1D641, 'M', 'f'), + (0x1D642, 'M', 'g'), + (0x1D643, 'M', 'h'), + (0x1D644, 'M', 'i'), + (0x1D645, 'M', 'j'), + (0x1D646, 'M', 'k'), + (0x1D647, 'M', 'l'), + (0x1D648, 'M', 'm'), + (0x1D649, 'M', 'n'), + (0x1D64A, 'M', 'o'), + (0x1D64B, 'M', 'p'), + (0x1D64C, 'M', 'q'), + (0x1D64D, 'M', 'r'), + (0x1D64E, 'M', 's'), + (0x1D64F, 'M', 't'), + (0x1D650, 'M', 'u'), + (0x1D651, 'M', 'v'), + (0x1D652, 'M', 'w'), + (0x1D653, 'M', 'x'), + (0x1D654, 'M', 'y'), + (0x1D655, 'M', 'z'), + (0x1D656, 'M', 'a'), + (0x1D657, 'M', 'b'), + (0x1D658, 'M', 'c'), + (0x1D659, 'M', 'd'), + (0x1D65A, 'M', 'e'), + (0x1D65B, 'M', 'f'), + (0x1D65C, 'M', 'g'), + (0x1D65D, 'M', 'h'), + (0x1D65E, 'M', 'i'), + (0x1D65F, 'M', 'j'), + (0x1D660, 'M', 'k'), + (0x1D661, 'M', 'l'), + (0x1D662, 'M', 'm'), + (0x1D663, 'M', 'n'), + (0x1D664, 'M', 'o'), + (0x1D665, 'M', 'p'), + (0x1D666, 'M', 'q'), + (0x1D667, 'M', 'r'), + (0x1D668, 'M', 's'), + (0x1D669, 'M', 't'), + (0x1D66A, 'M', 'u'), + (0x1D66B, 'M', 'v'), + (0x1D66C, 'M', 'w'), + (0x1D66D, 'M', 'x'), + (0x1D66E, 'M', 'y'), + (0x1D66F, 'M', 'z'), + (0x1D670, 'M', 'a'), + (0x1D671, 'M', 'b'), + (0x1D672, 'M', 'c'), + (0x1D673, 'M', 'd'), + (0x1D674, 'M', 'e'), + (0x1D675, 'M', 'f'), + (0x1D676, 'M', 'g'), + (0x1D677, 'M', 'h'), + (0x1D678, 'M', 'i'), + (0x1D679, 'M', 'j'), + (0x1D67A, 'M', 'k'), + (0x1D67B, 'M', 'l'), + (0x1D67C, 'M', 'm'), + (0x1D67D, 'M', 'n'), + (0x1D67E, 'M', 'o'), + (0x1D67F, 'M', 'p'), + (0x1D680, 'M', 'q'), + (0x1D681, 'M', 'r'), + (0x1D682, 'M', 's'), + (0x1D683, 'M', 't'), + (0x1D684, 'M', 'u'), + (0x1D685, 'M', 'v'), + (0x1D686, 'M', 'w'), + (0x1D687, 'M', 'x'), + (0x1D688, 'M', 'y'), + (0x1D689, 'M', 'z'), + (0x1D68A, 'M', 'a'), + (0x1D68B, 'M', 'b'), + (0x1D68C, 'M', 'c'), + (0x1D68D, 'M', 'd'), + (0x1D68E, 'M', 'e'), + ] + +def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D68F, 'M', 'f'), + (0x1D690, 'M', 'g'), + (0x1D691, 'M', 'h'), + (0x1D692, 'M', 'i'), + (0x1D693, 'M', 'j'), + (0x1D694, 'M', 'k'), + (0x1D695, 'M', 'l'), + (0x1D696, 'M', 'm'), + (0x1D697, 'M', 'n'), + (0x1D698, 'M', 'o'), + (0x1D699, 'M', 'p'), + (0x1D69A, 'M', 'q'), + (0x1D69B, 'M', 'r'), + (0x1D69C, 'M', 's'), + (0x1D69D, 'M', 't'), + (0x1D69E, 'M', 'u'), + (0x1D69F, 'M', 'v'), + (0x1D6A0, 'M', 'w'), + (0x1D6A1, 'M', 'x'), + (0x1D6A2, 'M', 'y'), + (0x1D6A3, 'M', 'z'), + (0x1D6A4, 'M', 'ı'), + (0x1D6A5, 'M', 'ȷ'), + (0x1D6A6, 'X'), + (0x1D6A8, 'M', 'α'), + (0x1D6A9, 'M', 'β'), + (0x1D6AA, 'M', 'γ'), + (0x1D6AB, 'M', 'δ'), + (0x1D6AC, 'M', 'ε'), + (0x1D6AD, 'M', 'ζ'), + (0x1D6AE, 'M', 'η'), + (0x1D6AF, 'M', 'θ'), + (0x1D6B0, 'M', 'ι'), + (0x1D6B1, 'M', 'κ'), + (0x1D6B2, 'M', 'λ'), + (0x1D6B3, 'M', 'μ'), + (0x1D6B4, 'M', 'ν'), + (0x1D6B5, 'M', 'ξ'), + (0x1D6B6, 'M', 'ο'), + (0x1D6B7, 'M', 'π'), + (0x1D6B8, 'M', 'ρ'), + (0x1D6B9, 'M', 'θ'), + (0x1D6BA, 'M', 'σ'), + (0x1D6BB, 'M', 'τ'), + (0x1D6BC, 'M', 'υ'), + (0x1D6BD, 'M', 'φ'), + (0x1D6BE, 'M', 'χ'), + (0x1D6BF, 'M', 'ψ'), + (0x1D6C0, 'M', 'ω'), + (0x1D6C1, 'M', '∇'), + (0x1D6C2, 'M', 'α'), + (0x1D6C3, 'M', 'β'), + (0x1D6C4, 'M', 'γ'), + (0x1D6C5, 'M', 'δ'), + (0x1D6C6, 'M', 'ε'), + (0x1D6C7, 'M', 'ζ'), + (0x1D6C8, 'M', 'η'), + (0x1D6C9, 'M', 'θ'), + (0x1D6CA, 'M', 'ι'), + (0x1D6CB, 'M', 'κ'), + (0x1D6CC, 'M', 'λ'), + (0x1D6CD, 'M', 'μ'), + (0x1D6CE, 'M', 'ν'), + (0x1D6CF, 'M', 'ξ'), + (0x1D6D0, 'M', 'ο'), + (0x1D6D1, 'M', 'π'), + (0x1D6D2, 'M', 'ρ'), + (0x1D6D3, 'M', 'σ'), + (0x1D6D5, 'M', 'τ'), + (0x1D6D6, 'M', 'υ'), + (0x1D6D7, 'M', 'φ'), + (0x1D6D8, 'M', 'χ'), + (0x1D6D9, 'M', 'ψ'), + (0x1D6DA, 'M', 'ω'), + (0x1D6DB, 'M', '∂'), + (0x1D6DC, 'M', 'ε'), + (0x1D6DD, 'M', 'θ'), + (0x1D6DE, 'M', 'κ'), + (0x1D6DF, 'M', 'φ'), + (0x1D6E0, 'M', 'ρ'), + (0x1D6E1, 'M', 'π'), + (0x1D6E2, 'M', 'α'), + (0x1D6E3, 'M', 'β'), + (0x1D6E4, 'M', 'γ'), + (0x1D6E5, 'M', 'δ'), + (0x1D6E6, 'M', 'ε'), + (0x1D6E7, 'M', 'ζ'), + (0x1D6E8, 'M', 'η'), + (0x1D6E9, 'M', 'θ'), + (0x1D6EA, 'M', 'ι'), + (0x1D6EB, 'M', 'κ'), + (0x1D6EC, 'M', 'λ'), + (0x1D6ED, 'M', 'μ'), + (0x1D6EE, 'M', 'ν'), + (0x1D6EF, 'M', 'ξ'), + (0x1D6F0, 'M', 'ο'), + (0x1D6F1, 'M', 'π'), + (0x1D6F2, 'M', 'ρ'), + (0x1D6F3, 'M', 'θ'), + (0x1D6F4, 'M', 'σ'), + ] + +def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D6F5, 'M', 'τ'), + (0x1D6F6, 'M', 'υ'), + (0x1D6F7, 'M', 'φ'), + (0x1D6F8, 'M', 'χ'), + (0x1D6F9, 'M', 'ψ'), + (0x1D6FA, 'M', 'ω'), + (0x1D6FB, 'M', '∇'), + (0x1D6FC, 'M', 'α'), + (0x1D6FD, 'M', 'β'), + (0x1D6FE, 'M', 'γ'), + (0x1D6FF, 'M', 'δ'), + (0x1D700, 'M', 'ε'), + (0x1D701, 'M', 'ζ'), + (0x1D702, 'M', 'η'), + (0x1D703, 'M', 'θ'), + (0x1D704, 'M', 'ι'), + (0x1D705, 'M', 'κ'), + (0x1D706, 'M', 'λ'), + (0x1D707, 'M', 'μ'), + (0x1D708, 'M', 'ν'), + (0x1D709, 'M', 'ξ'), + (0x1D70A, 'M', 'ο'), + (0x1D70B, 'M', 'π'), + (0x1D70C, 'M', 'ρ'), + (0x1D70D, 'M', 'σ'), + (0x1D70F, 'M', 'τ'), + (0x1D710, 'M', 'υ'), + (0x1D711, 'M', 'φ'), + (0x1D712, 'M', 'χ'), + (0x1D713, 'M', 'ψ'), + (0x1D714, 'M', 'ω'), + (0x1D715, 'M', '∂'), + (0x1D716, 'M', 'ε'), + (0x1D717, 'M', 'θ'), + (0x1D718, 'M', 'κ'), + (0x1D719, 'M', 'φ'), + (0x1D71A, 'M', 'ρ'), + (0x1D71B, 'M', 'π'), + (0x1D71C, 'M', 'α'), + (0x1D71D, 'M', 'β'), + (0x1D71E, 'M', 'γ'), + (0x1D71F, 'M', 'δ'), + (0x1D720, 'M', 'ε'), + (0x1D721, 'M', 'ζ'), + (0x1D722, 'M', 'η'), + (0x1D723, 'M', 'θ'), + (0x1D724, 'M', 'ι'), + (0x1D725, 'M', 'κ'), + (0x1D726, 'M', 'λ'), + (0x1D727, 'M', 'μ'), + (0x1D728, 'M', 'ν'), + (0x1D729, 'M', 'ξ'), + (0x1D72A, 'M', 'ο'), + (0x1D72B, 'M', 'π'), + (0x1D72C, 'M', 'ρ'), + (0x1D72D, 'M', 'θ'), + (0x1D72E, 'M', 'σ'), + (0x1D72F, 'M', 'τ'), + (0x1D730, 'M', 'υ'), + (0x1D731, 'M', 'φ'), + (0x1D732, 'M', 'χ'), + (0x1D733, 'M', 'ψ'), + (0x1D734, 'M', 'ω'), + (0x1D735, 'M', '∇'), + (0x1D736, 'M', 'α'), + (0x1D737, 'M', 'β'), + (0x1D738, 'M', 'γ'), + (0x1D739, 'M', 'δ'), + (0x1D73A, 'M', 'ε'), + (0x1D73B, 'M', 'ζ'), + (0x1D73C, 'M', 'η'), + (0x1D73D, 'M', 'θ'), + (0x1D73E, 'M', 'ι'), + (0x1D73F, 'M', 'κ'), + (0x1D740, 'M', 'λ'), + (0x1D741, 'M', 'μ'), + (0x1D742, 'M', 'ν'), + (0x1D743, 'M', 'ξ'), + (0x1D744, 'M', 'ο'), + (0x1D745, 'M', 'π'), + (0x1D746, 'M', 'ρ'), + (0x1D747, 'M', 'σ'), + (0x1D749, 'M', 'τ'), + (0x1D74A, 'M', 'υ'), + (0x1D74B, 'M', 'φ'), + (0x1D74C, 'M', 'χ'), + (0x1D74D, 'M', 'ψ'), + (0x1D74E, 'M', 'ω'), + (0x1D74F, 'M', '∂'), + (0x1D750, 'M', 'ε'), + (0x1D751, 'M', 'θ'), + (0x1D752, 'M', 'κ'), + (0x1D753, 'M', 'φ'), + (0x1D754, 'M', 'ρ'), + (0x1D755, 'M', 'π'), + (0x1D756, 'M', 'α'), + (0x1D757, 'M', 'β'), + (0x1D758, 'M', 'γ'), + (0x1D759, 'M', 'δ'), + (0x1D75A, 'M', 'ε'), + ] + +def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D75B, 'M', 'ζ'), + (0x1D75C, 'M', 'η'), + (0x1D75D, 'M', 'θ'), + (0x1D75E, 'M', 'ι'), + (0x1D75F, 'M', 'κ'), + (0x1D760, 'M', 'λ'), + (0x1D761, 'M', 'μ'), + (0x1D762, 'M', 'ν'), + (0x1D763, 'M', 'ξ'), + (0x1D764, 'M', 'ο'), + (0x1D765, 'M', 'π'), + (0x1D766, 'M', 'ρ'), + (0x1D767, 'M', 'θ'), + (0x1D768, 'M', 'σ'), + (0x1D769, 'M', 'τ'), + (0x1D76A, 'M', 'υ'), + (0x1D76B, 'M', 'φ'), + (0x1D76C, 'M', 'χ'), + (0x1D76D, 'M', 'ψ'), + (0x1D76E, 'M', 'ω'), + (0x1D76F, 'M', '∇'), + (0x1D770, 'M', 'α'), + (0x1D771, 'M', 'β'), + (0x1D772, 'M', 'γ'), + (0x1D773, 'M', 'δ'), + (0x1D774, 'M', 'ε'), + (0x1D775, 'M', 'ζ'), + (0x1D776, 'M', 'η'), + (0x1D777, 'M', 'θ'), + (0x1D778, 'M', 'ι'), + (0x1D779, 'M', 'κ'), + (0x1D77A, 'M', 'λ'), + (0x1D77B, 'M', 'μ'), + (0x1D77C, 'M', 'ν'), + (0x1D77D, 'M', 'ξ'), + (0x1D77E, 'M', 'ο'), + (0x1D77F, 'M', 'π'), + (0x1D780, 'M', 'ρ'), + (0x1D781, 'M', 'σ'), + (0x1D783, 'M', 'τ'), + (0x1D784, 'M', 'υ'), + (0x1D785, 'M', 'φ'), + (0x1D786, 'M', 'χ'), + (0x1D787, 'M', 'ψ'), + (0x1D788, 'M', 'ω'), + (0x1D789, 'M', '∂'), + (0x1D78A, 'M', 'ε'), + (0x1D78B, 'M', 'θ'), + (0x1D78C, 'M', 'κ'), + (0x1D78D, 'M', 'φ'), + (0x1D78E, 'M', 'ρ'), + (0x1D78F, 'M', 'π'), + (0x1D790, 'M', 'α'), + (0x1D791, 'M', 'β'), + (0x1D792, 'M', 'γ'), + (0x1D793, 'M', 'δ'), + (0x1D794, 'M', 'ε'), + (0x1D795, 'M', 'ζ'), + (0x1D796, 'M', 'η'), + (0x1D797, 'M', 'θ'), + (0x1D798, 'M', 'ι'), + (0x1D799, 'M', 'κ'), + (0x1D79A, 'M', 'λ'), + (0x1D79B, 'M', 'μ'), + (0x1D79C, 'M', 'ν'), + (0x1D79D, 'M', 'ξ'), + (0x1D79E, 'M', 'ο'), + (0x1D79F, 'M', 'π'), + (0x1D7A0, 'M', 'ρ'), + (0x1D7A1, 'M', 'θ'), + (0x1D7A2, 'M', 'σ'), + (0x1D7A3, 'M', 'τ'), + (0x1D7A4, 'M', 'υ'), + (0x1D7A5, 'M', 'φ'), + (0x1D7A6, 'M', 'χ'), + (0x1D7A7, 'M', 'ψ'), + (0x1D7A8, 'M', 'ω'), + (0x1D7A9, 'M', '∇'), + (0x1D7AA, 'M', 'α'), + (0x1D7AB, 'M', 'β'), + (0x1D7AC, 'M', 'γ'), + (0x1D7AD, 'M', 'δ'), + (0x1D7AE, 'M', 'ε'), + (0x1D7AF, 'M', 'ζ'), + (0x1D7B0, 'M', 'η'), + (0x1D7B1, 'M', 'θ'), + (0x1D7B2, 'M', 'ι'), + (0x1D7B3, 'M', 'κ'), + (0x1D7B4, 'M', 'λ'), + (0x1D7B5, 'M', 'μ'), + (0x1D7B6, 'M', 'ν'), + (0x1D7B7, 'M', 'ξ'), + (0x1D7B8, 'M', 'ο'), + (0x1D7B9, 'M', 'π'), + (0x1D7BA, 'M', 'ρ'), + (0x1D7BB, 'M', 'σ'), + (0x1D7BD, 'M', 'τ'), + (0x1D7BE, 'M', 'υ'), + (0x1D7BF, 'M', 'φ'), + (0x1D7C0, 'M', 'χ'), + ] + +def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D7C1, 'M', 'ψ'), + (0x1D7C2, 'M', 'ω'), + (0x1D7C3, 'M', '∂'), + (0x1D7C4, 'M', 'ε'), + (0x1D7C5, 'M', 'θ'), + (0x1D7C6, 'M', 'κ'), + (0x1D7C7, 'M', 'φ'), + (0x1D7C8, 'M', 'ρ'), + (0x1D7C9, 'M', 'π'), + (0x1D7CA, 'M', 'ϝ'), + (0x1D7CC, 'X'), + (0x1D7CE, 'M', '0'), + (0x1D7CF, 'M', '1'), + (0x1D7D0, 'M', '2'), + (0x1D7D1, 'M', '3'), + (0x1D7D2, 'M', '4'), + (0x1D7D3, 'M', '5'), + (0x1D7D4, 'M', '6'), + (0x1D7D5, 'M', '7'), + (0x1D7D6, 'M', '8'), + (0x1D7D7, 'M', '9'), + (0x1D7D8, 'M', '0'), + (0x1D7D9, 'M', '1'), + (0x1D7DA, 'M', '2'), + (0x1D7DB, 'M', '3'), + (0x1D7DC, 'M', '4'), + (0x1D7DD, 'M', '5'), + (0x1D7DE, 'M', '6'), + (0x1D7DF, 'M', '7'), + (0x1D7E0, 'M', '8'), + (0x1D7E1, 'M', '9'), + (0x1D7E2, 'M', '0'), + (0x1D7E3, 'M', '1'), + (0x1D7E4, 'M', '2'), + (0x1D7E5, 'M', '3'), + (0x1D7E6, 'M', '4'), + (0x1D7E7, 'M', '5'), + (0x1D7E8, 'M', '6'), + (0x1D7E9, 'M', '7'), + (0x1D7EA, 'M', '8'), + (0x1D7EB, 'M', '9'), + (0x1D7EC, 'M', '0'), + (0x1D7ED, 'M', '1'), + (0x1D7EE, 'M', '2'), + (0x1D7EF, 'M', '3'), + (0x1D7F0, 'M', '4'), + (0x1D7F1, 'M', '5'), + (0x1D7F2, 'M', '6'), + (0x1D7F3, 'M', '7'), + (0x1D7F4, 'M', '8'), + (0x1D7F5, 'M', '9'), + (0x1D7F6, 'M', '0'), + (0x1D7F7, 'M', '1'), + (0x1D7F8, 'M', '2'), + (0x1D7F9, 'M', '3'), + (0x1D7FA, 'M', '4'), + (0x1D7FB, 'M', '5'), + (0x1D7FC, 'M', '6'), + (0x1D7FD, 'M', '7'), + (0x1D7FE, 'M', '8'), + (0x1D7FF, 'M', '9'), + (0x1D800, 'V'), + (0x1DA8C, 'X'), + (0x1DA9B, 'V'), + (0x1DAA0, 'X'), + (0x1DAA1, 'V'), + (0x1DAB0, 'X'), + (0x1DF00, 'V'), + (0x1DF1F, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), + (0x1E019, 'X'), + (0x1E01B, 'V'), + (0x1E022, 'X'), + (0x1E023, 'V'), + (0x1E025, 'X'), + (0x1E026, 'V'), + (0x1E02B, 'X'), + (0x1E100, 'V'), + (0x1E12D, 'X'), + (0x1E130, 'V'), + (0x1E13E, 'X'), + (0x1E140, 'V'), + (0x1E14A, 'X'), + (0x1E14E, 'V'), + (0x1E150, 'X'), + (0x1E290, 'V'), + (0x1E2AF, 'X'), + (0x1E2C0, 'V'), + (0x1E2FA, 'X'), + (0x1E2FF, 'V'), + (0x1E300, 'X'), + (0x1E7E0, 'V'), + (0x1E7E7, 'X'), + (0x1E7E8, 'V'), + (0x1E7EC, 'X'), + (0x1E7ED, 'V'), + (0x1E7EF, 'X'), + (0x1E7F0, 'V'), + ] + +def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E7FF, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), + (0x1E8C7, 'V'), + (0x1E8D7, 'X'), + (0x1E900, 'M', '𞤢'), + (0x1E901, 'M', '𞤣'), + (0x1E902, 'M', '𞤤'), + (0x1E903, 'M', '𞤥'), + (0x1E904, 'M', '𞤦'), + (0x1E905, 'M', '𞤧'), + (0x1E906, 'M', '𞤨'), + (0x1E907, 'M', '𞤩'), + (0x1E908, 'M', '𞤪'), + (0x1E909, 'M', '𞤫'), + (0x1E90A, 'M', '𞤬'), + (0x1E90B, 'M', '𞤭'), + (0x1E90C, 'M', '𞤮'), + (0x1E90D, 'M', '𞤯'), + (0x1E90E, 'M', '𞤰'), + (0x1E90F, 'M', '𞤱'), + (0x1E910, 'M', '𞤲'), + (0x1E911, 'M', '𞤳'), + (0x1E912, 'M', '𞤴'), + (0x1E913, 'M', '𞤵'), + (0x1E914, 'M', '𞤶'), + (0x1E915, 'M', '𞤷'), + (0x1E916, 'M', '𞤸'), + (0x1E917, 'M', '𞤹'), + (0x1E918, 'M', '𞤺'), + (0x1E919, 'M', '𞤻'), + (0x1E91A, 'M', '𞤼'), + (0x1E91B, 'M', '𞤽'), + (0x1E91C, 'M', '𞤾'), + (0x1E91D, 'M', '𞤿'), + (0x1E91E, 'M', '𞥀'), + (0x1E91F, 'M', '𞥁'), + (0x1E920, 'M', '𞥂'), + (0x1E921, 'M', '𞥃'), + (0x1E922, 'V'), + (0x1E94C, 'X'), + (0x1E950, 'V'), + (0x1E95A, 'X'), + (0x1E95E, 'V'), + (0x1E960, 'X'), + (0x1EC71, 'V'), + (0x1ECB5, 'X'), + (0x1ED01, 'V'), + (0x1ED3E, 'X'), + (0x1EE00, 'M', 'ا'), + (0x1EE01, 'M', 'ب'), + (0x1EE02, 'M', 'ج'), + (0x1EE03, 'M', 'د'), + (0x1EE04, 'X'), + (0x1EE05, 'M', 'و'), + (0x1EE06, 'M', 'ز'), + (0x1EE07, 'M', 'ح'), + (0x1EE08, 'M', 'ط'), + (0x1EE09, 'M', 'ي'), + (0x1EE0A, 'M', 'ك'), + (0x1EE0B, 'M', 'ل'), + (0x1EE0C, 'M', 'م'), + (0x1EE0D, 'M', 'ن'), + (0x1EE0E, 'M', 'س'), + (0x1EE0F, 'M', 'ع'), + (0x1EE10, 'M', 'ف'), + (0x1EE11, 'M', 'ص'), + (0x1EE12, 'M', 'ق'), + (0x1EE13, 'M', 'ر'), + (0x1EE14, 'M', 'ش'), + (0x1EE15, 'M', 'ت'), + (0x1EE16, 'M', 'ث'), + (0x1EE17, 'M', 'خ'), + (0x1EE18, 'M', 'ذ'), + (0x1EE19, 'M', 'ض'), + (0x1EE1A, 'M', 'ظ'), + (0x1EE1B, 'M', 'غ'), + (0x1EE1C, 'M', 'ٮ'), + (0x1EE1D, 'M', 'ں'), + (0x1EE1E, 'M', 'ڡ'), + (0x1EE1F, 'M', 'ٯ'), + (0x1EE20, 'X'), + (0x1EE21, 'M', 'ب'), + (0x1EE22, 'M', 'ج'), + (0x1EE23, 'X'), + (0x1EE24, 'M', 'ه'), + (0x1EE25, 'X'), + (0x1EE27, 'M', 'ح'), + (0x1EE28, 'X'), + (0x1EE29, 'M', 'ي'), + (0x1EE2A, 'M', 'ك'), + (0x1EE2B, 'M', 'ل'), + (0x1EE2C, 'M', 'م'), + (0x1EE2D, 'M', 'ن'), + (0x1EE2E, 'M', 'س'), + (0x1EE2F, 'M', 'ع'), + (0x1EE30, 'M', 'ف'), + (0x1EE31, 'M', 'ص'), + (0x1EE32, 'M', 'ق'), + (0x1EE33, 'X'), + ] + +def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EE34, 'M', 'ش'), + (0x1EE35, 'M', 'ت'), + (0x1EE36, 'M', 'ث'), + (0x1EE37, 'M', 'خ'), + (0x1EE38, 'X'), + (0x1EE39, 'M', 'ض'), + (0x1EE3A, 'X'), + (0x1EE3B, 'M', 'غ'), + (0x1EE3C, 'X'), + (0x1EE42, 'M', 'ج'), + (0x1EE43, 'X'), + (0x1EE47, 'M', 'ح'), + (0x1EE48, 'X'), + (0x1EE49, 'M', 'ي'), + (0x1EE4A, 'X'), + (0x1EE4B, 'M', 'ل'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', 'ن'), + (0x1EE4E, 'M', 'س'), + (0x1EE4F, 'M', 'ع'), + (0x1EE50, 'X'), + (0x1EE51, 'M', 'ص'), + (0x1EE52, 'M', 'ق'), + (0x1EE53, 'X'), + (0x1EE54, 'M', 'ش'), + (0x1EE55, 'X'), + (0x1EE57, 'M', 'خ'), + (0x1EE58, 'X'), + (0x1EE59, 'M', 'ض'), + (0x1EE5A, 'X'), + (0x1EE5B, 'M', 'غ'), + (0x1EE5C, 'X'), + (0x1EE5D, 'M', 'ں'), + (0x1EE5E, 'X'), + (0x1EE5F, 'M', 'ٯ'), + (0x1EE60, 'X'), + (0x1EE61, 'M', 'ب'), + (0x1EE62, 'M', 'ج'), + (0x1EE63, 'X'), + (0x1EE64, 'M', 'ه'), + (0x1EE65, 'X'), + (0x1EE67, 'M', 'ح'), + (0x1EE68, 'M', 'ط'), + (0x1EE69, 'M', 'ي'), + (0x1EE6A, 'M', 'ك'), + (0x1EE6B, 'X'), + (0x1EE6C, 'M', 'م'), + (0x1EE6D, 'M', 'ن'), + (0x1EE6E, 'M', 'س'), + (0x1EE6F, 'M', 'ع'), + (0x1EE70, 'M', 'ف'), + (0x1EE71, 'M', 'ص'), + (0x1EE72, 'M', 'ق'), + (0x1EE73, 'X'), + (0x1EE74, 'M', 'ش'), + (0x1EE75, 'M', 'ت'), + (0x1EE76, 'M', 'ث'), + (0x1EE77, 'M', 'خ'), + (0x1EE78, 'X'), + (0x1EE79, 'M', 'ض'), + (0x1EE7A, 'M', 'ظ'), + (0x1EE7B, 'M', 'غ'), + (0x1EE7C, 'M', 'ٮ'), + (0x1EE7D, 'X'), + (0x1EE7E, 'M', 'ڡ'), + (0x1EE7F, 'X'), + (0x1EE80, 'M', 'ا'), + (0x1EE81, 'M', 'ب'), + (0x1EE82, 'M', 'ج'), + (0x1EE83, 'M', 'د'), + (0x1EE84, 'M', 'ه'), + (0x1EE85, 'M', 'و'), + (0x1EE86, 'M', 'ز'), + (0x1EE87, 'M', 'ح'), + (0x1EE88, 'M', 'ط'), + (0x1EE89, 'M', 'ي'), + (0x1EE8A, 'X'), + (0x1EE8B, 'M', 'ل'), + (0x1EE8C, 'M', 'م'), + (0x1EE8D, 'M', 'ن'), + (0x1EE8E, 'M', 'س'), + (0x1EE8F, 'M', 'ع'), + (0x1EE90, 'M', 'ف'), + (0x1EE91, 'M', 'ص'), + (0x1EE92, 'M', 'ق'), + (0x1EE93, 'M', 'ر'), + (0x1EE94, 'M', 'ش'), + (0x1EE95, 'M', 'ت'), + (0x1EE96, 'M', 'ث'), + (0x1EE97, 'M', 'خ'), + (0x1EE98, 'M', 'ذ'), + (0x1EE99, 'M', 'ض'), + (0x1EE9A, 'M', 'ظ'), + (0x1EE9B, 'M', 'غ'), + (0x1EE9C, 'X'), + (0x1EEA1, 'M', 'ب'), + (0x1EEA2, 'M', 'ج'), + (0x1EEA3, 'M', 'د'), + (0x1EEA4, 'X'), + (0x1EEA5, 'M', 'و'), + ] + +def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EEA6, 'M', 'ز'), + (0x1EEA7, 'M', 'ح'), + (0x1EEA8, 'M', 'ط'), + (0x1EEA9, 'M', 'ي'), + (0x1EEAA, 'X'), + (0x1EEAB, 'M', 'ل'), + (0x1EEAC, 'M', 'م'), + (0x1EEAD, 'M', 'ن'), + (0x1EEAE, 'M', 'س'), + (0x1EEAF, 'M', 'ع'), + (0x1EEB0, 'M', 'ف'), + (0x1EEB1, 'M', 'ص'), + (0x1EEB2, 'M', 'ق'), + (0x1EEB3, 'M', 'ر'), + (0x1EEB4, 'M', 'ش'), + (0x1EEB5, 'M', 'ت'), + (0x1EEB6, 'M', 'ث'), + (0x1EEB7, 'M', 'خ'), + (0x1EEB8, 'M', 'ذ'), + (0x1EEB9, 'M', 'ض'), + (0x1EEBA, 'M', 'ظ'), + (0x1EEBB, 'M', 'غ'), + (0x1EEBC, 'X'), + (0x1EEF0, 'V'), + (0x1EEF2, 'X'), + (0x1F000, 'V'), + (0x1F02C, 'X'), + (0x1F030, 'V'), + (0x1F094, 'X'), + (0x1F0A0, 'V'), + (0x1F0AF, 'X'), + (0x1F0B1, 'V'), + (0x1F0C0, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0F6, 'X'), + (0x1F101, '3', '0,'), + (0x1F102, '3', '1,'), + (0x1F103, '3', '2,'), + (0x1F104, '3', '3,'), + (0x1F105, '3', '4,'), + (0x1F106, '3', '5,'), + (0x1F107, '3', '6,'), + (0x1F108, '3', '7,'), + (0x1F109, '3', '8,'), + (0x1F10A, '3', '9,'), + (0x1F10B, 'V'), + (0x1F110, '3', '(a)'), + (0x1F111, '3', '(b)'), + (0x1F112, '3', '(c)'), + (0x1F113, '3', '(d)'), + (0x1F114, '3', '(e)'), + (0x1F115, '3', '(f)'), + (0x1F116, '3', '(g)'), + (0x1F117, '3', '(h)'), + (0x1F118, '3', '(i)'), + (0x1F119, '3', '(j)'), + (0x1F11A, '3', '(k)'), + (0x1F11B, '3', '(l)'), + (0x1F11C, '3', '(m)'), + (0x1F11D, '3', '(n)'), + (0x1F11E, '3', '(o)'), + (0x1F11F, '3', '(p)'), + (0x1F120, '3', '(q)'), + (0x1F121, '3', '(r)'), + (0x1F122, '3', '(s)'), + (0x1F123, '3', '(t)'), + (0x1F124, '3', '(u)'), + (0x1F125, '3', '(v)'), + (0x1F126, '3', '(w)'), + (0x1F127, '3', '(x)'), + (0x1F128, '3', '(y)'), + (0x1F129, '3', '(z)'), + (0x1F12A, 'M', '〔s〕'), + (0x1F12B, 'M', 'c'), + (0x1F12C, 'M', 'r'), + (0x1F12D, 'M', 'cd'), + (0x1F12E, 'M', 'wz'), + (0x1F12F, 'V'), + (0x1F130, 'M', 'a'), + (0x1F131, 'M', 'b'), + (0x1F132, 'M', 'c'), + (0x1F133, 'M', 'd'), + (0x1F134, 'M', 'e'), + (0x1F135, 'M', 'f'), + (0x1F136, 'M', 'g'), + (0x1F137, 'M', 'h'), + (0x1F138, 'M', 'i'), + (0x1F139, 'M', 'j'), + (0x1F13A, 'M', 'k'), + (0x1F13B, 'M', 'l'), + (0x1F13C, 'M', 'm'), + (0x1F13D, 'M', 'n'), + (0x1F13E, 'M', 'o'), + (0x1F13F, 'M', 'p'), + (0x1F140, 'M', 'q'), + (0x1F141, 'M', 'r'), + (0x1F142, 'M', 's'), + (0x1F143, 'M', 't'), + ] + +def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F144, 'M', 'u'), + (0x1F145, 'M', 'v'), + (0x1F146, 'M', 'w'), + (0x1F147, 'M', 'x'), + (0x1F148, 'M', 'y'), + (0x1F149, 'M', 'z'), + (0x1F14A, 'M', 'hv'), + (0x1F14B, 'M', 'mv'), + (0x1F14C, 'M', 'sd'), + (0x1F14D, 'M', 'ss'), + (0x1F14E, 'M', 'ppv'), + (0x1F14F, 'M', 'wc'), + (0x1F150, 'V'), + (0x1F16A, 'M', 'mc'), + (0x1F16B, 'M', 'md'), + (0x1F16C, 'M', 'mr'), + (0x1F16D, 'V'), + (0x1F190, 'M', 'dj'), + (0x1F191, 'V'), + (0x1F1AE, 'X'), + (0x1F1E6, 'V'), + (0x1F200, 'M', 'ほか'), + (0x1F201, 'M', 'ココ'), + (0x1F202, 'M', 'サ'), + (0x1F203, 'X'), + (0x1F210, 'M', '手'), + (0x1F211, 'M', '字'), + (0x1F212, 'M', '双'), + (0x1F213, 'M', 'デ'), + (0x1F214, 'M', '二'), + (0x1F215, 'M', '多'), + (0x1F216, 'M', '解'), + (0x1F217, 'M', '天'), + (0x1F218, 'M', '交'), + (0x1F219, 'M', '映'), + (0x1F21A, 'M', '無'), + (0x1F21B, 'M', '料'), + (0x1F21C, 'M', '前'), + (0x1F21D, 'M', '後'), + (0x1F21E, 'M', '再'), + (0x1F21F, 'M', '新'), + (0x1F220, 'M', '初'), + (0x1F221, 'M', '終'), + (0x1F222, 'M', '生'), + (0x1F223, 'M', '販'), + (0x1F224, 'M', '声'), + (0x1F225, 'M', '吹'), + (0x1F226, 'M', '演'), + (0x1F227, 'M', '投'), + (0x1F228, 'M', '捕'), + (0x1F229, 'M', '一'), + (0x1F22A, 'M', '三'), + (0x1F22B, 'M', '遊'), + (0x1F22C, 'M', '左'), + (0x1F22D, 'M', '中'), + (0x1F22E, 'M', '右'), + (0x1F22F, 'M', '指'), + (0x1F230, 'M', '走'), + (0x1F231, 'M', '打'), + (0x1F232, 'M', '禁'), + (0x1F233, 'M', '空'), + (0x1F234, 'M', '合'), + (0x1F235, 'M', '満'), + (0x1F236, 'M', '有'), + (0x1F237, 'M', '月'), + (0x1F238, 'M', '申'), + (0x1F239, 'M', '割'), + (0x1F23A, 'M', '営'), + (0x1F23B, 'M', '配'), + (0x1F23C, 'X'), + (0x1F240, 'M', '〔本〕'), + (0x1F241, 'M', '〔三〕'), + (0x1F242, 'M', '〔二〕'), + (0x1F243, 'M', '〔安〕'), + (0x1F244, 'M', '〔点〕'), + (0x1F245, 'M', '〔打〕'), + (0x1F246, 'M', '〔盗〕'), + (0x1F247, 'M', '〔勝〕'), + (0x1F248, 'M', '〔敗〕'), + (0x1F249, 'X'), + (0x1F250, 'M', '得'), + (0x1F251, 'M', '可'), + (0x1F252, 'X'), + (0x1F260, 'V'), + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D8, 'X'), + (0x1F6DD, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6FD, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x1F780, 'V'), + (0x1F7D9, 'X'), + (0x1F7E0, 'V'), + (0x1F7EC, 'X'), + (0x1F7F0, 'V'), + (0x1F7F1, 'X'), + (0x1F800, 'V'), + ] + +def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), + (0x1F850, 'V'), + (0x1F85A, 'X'), + (0x1F860, 'V'), + (0x1F888, 'X'), + (0x1F890, 'V'), + (0x1F8AE, 'X'), + (0x1F8B0, 'V'), + (0x1F8B2, 'X'), + (0x1F900, 'V'), + (0x1FA54, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), + (0x1FA70, 'V'), + (0x1FA75, 'X'), + (0x1FA78, 'V'), + (0x1FA7D, 'X'), + (0x1FA80, 'V'), + (0x1FA87, 'X'), + (0x1FA90, 'V'), + (0x1FAAD, 'X'), + (0x1FAB0, 'V'), + (0x1FABB, 'X'), + (0x1FAC0, 'V'), + (0x1FAC6, 'X'), + (0x1FAD0, 'V'), + (0x1FADA, 'X'), + (0x1FAE0, 'V'), + (0x1FAE8, 'X'), + (0x1FAF0, 'V'), + (0x1FAF7, 'X'), + (0x1FB00, 'V'), + (0x1FB93, 'X'), + (0x1FB94, 'V'), + (0x1FBCB, 'X'), + (0x1FBF0, 'M', '0'), + (0x1FBF1, 'M', '1'), + (0x1FBF2, 'M', '2'), + (0x1FBF3, 'M', '3'), + (0x1FBF4, 'M', '4'), + (0x1FBF5, 'M', '5'), + (0x1FBF6, 'M', '6'), + (0x1FBF7, 'M', '7'), + (0x1FBF8, 'M', '8'), + (0x1FBF9, 'M', '9'), + (0x1FBFA, 'X'), + (0x20000, 'V'), + (0x2A6E0, 'X'), + (0x2A700, 'V'), + (0x2B739, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2B820, 'V'), + (0x2CEA2, 'X'), + (0x2CEB0, 'V'), + (0x2EBE1, 'X'), + (0x2F800, 'M', '丽'), + (0x2F801, 'M', '丸'), + (0x2F802, 'M', '乁'), + (0x2F803, 'M', '𠄢'), + (0x2F804, 'M', '你'), + (0x2F805, 'M', '侮'), + (0x2F806, 'M', '侻'), + (0x2F807, 'M', '倂'), + (0x2F808, 'M', '偺'), + (0x2F809, 'M', '備'), + (0x2F80A, 'M', '僧'), + (0x2F80B, 'M', '像'), + (0x2F80C, 'M', '㒞'), + (0x2F80D, 'M', '𠘺'), + (0x2F80E, 'M', '免'), + (0x2F80F, 'M', '兔'), + (0x2F810, 'M', '兤'), + (0x2F811, 'M', '具'), + (0x2F812, 'M', '𠔜'), + (0x2F813, 'M', '㒹'), + (0x2F814, 'M', '內'), + (0x2F815, 'M', '再'), + (0x2F816, 'M', '𠕋'), + (0x2F817, 'M', '冗'), + (0x2F818, 'M', '冤'), + (0x2F819, 'M', '仌'), + (0x2F81A, 'M', '冬'), + (0x2F81B, 'M', '况'), + (0x2F81C, 'M', '𩇟'), + (0x2F81D, 'M', '凵'), + (0x2F81E, 'M', '刃'), + (0x2F81F, 'M', '㓟'), + (0x2F820, 'M', '刻'), + (0x2F821, 'M', '剆'), + (0x2F822, 'M', '割'), + (0x2F823, 'M', '剷'), + (0x2F824, 'M', '㔕'), + (0x2F825, 'M', '勇'), + (0x2F826, 'M', '勉'), + (0x2F827, 'M', '勤'), + (0x2F828, 'M', '勺'), + (0x2F829, 'M', '包'), + ] + +def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F82A, 'M', '匆'), + (0x2F82B, 'M', '北'), + (0x2F82C, 'M', '卉'), + (0x2F82D, 'M', '卑'), + (0x2F82E, 'M', '博'), + (0x2F82F, 'M', '即'), + (0x2F830, 'M', '卽'), + (0x2F831, 'M', '卿'), + (0x2F834, 'M', '𠨬'), + (0x2F835, 'M', '灰'), + (0x2F836, 'M', '及'), + (0x2F837, 'M', '叟'), + (0x2F838, 'M', '𠭣'), + (0x2F839, 'M', '叫'), + (0x2F83A, 'M', '叱'), + (0x2F83B, 'M', '吆'), + (0x2F83C, 'M', '咞'), + (0x2F83D, 'M', '吸'), + (0x2F83E, 'M', '呈'), + (0x2F83F, 'M', '周'), + (0x2F840, 'M', '咢'), + (0x2F841, 'M', '哶'), + (0x2F842, 'M', '唐'), + (0x2F843, 'M', '啓'), + (0x2F844, 'M', '啣'), + (0x2F845, 'M', '善'), + (0x2F847, 'M', '喙'), + (0x2F848, 'M', '喫'), + (0x2F849, 'M', '喳'), + (0x2F84A, 'M', '嗂'), + (0x2F84B, 'M', '圖'), + (0x2F84C, 'M', '嘆'), + (0x2F84D, 'M', '圗'), + (0x2F84E, 'M', '噑'), + (0x2F84F, 'M', '噴'), + (0x2F850, 'M', '切'), + (0x2F851, 'M', '壮'), + (0x2F852, 'M', '城'), + (0x2F853, 'M', '埴'), + (0x2F854, 'M', '堍'), + (0x2F855, 'M', '型'), + (0x2F856, 'M', '堲'), + (0x2F857, 'M', '報'), + (0x2F858, 'M', '墬'), + (0x2F859, 'M', '𡓤'), + (0x2F85A, 'M', '売'), + (0x2F85B, 'M', '壷'), + (0x2F85C, 'M', '夆'), + (0x2F85D, 'M', '多'), + (0x2F85E, 'M', '夢'), + (0x2F85F, 'M', '奢'), + (0x2F860, 'M', '𡚨'), + (0x2F861, 'M', '𡛪'), + (0x2F862, 'M', '姬'), + (0x2F863, 'M', '娛'), + (0x2F864, 'M', '娧'), + (0x2F865, 'M', '姘'), + (0x2F866, 'M', '婦'), + (0x2F867, 'M', '㛮'), + (0x2F868, 'X'), + (0x2F869, 'M', '嬈'), + (0x2F86A, 'M', '嬾'), + (0x2F86C, 'M', '𡧈'), + (0x2F86D, 'M', '寃'), + (0x2F86E, 'M', '寘'), + (0x2F86F, 'M', '寧'), + (0x2F870, 'M', '寳'), + (0x2F871, 'M', '𡬘'), + (0x2F872, 'M', '寿'), + (0x2F873, 'M', '将'), + (0x2F874, 'X'), + (0x2F875, 'M', '尢'), + (0x2F876, 'M', '㞁'), + (0x2F877, 'M', '屠'), + (0x2F878, 'M', '屮'), + (0x2F879, 'M', '峀'), + (0x2F87A, 'M', '岍'), + (0x2F87B, 'M', '𡷤'), + (0x2F87C, 'M', '嵃'), + (0x2F87D, 'M', '𡷦'), + (0x2F87E, 'M', '嵮'), + (0x2F87F, 'M', '嵫'), + (0x2F880, 'M', '嵼'), + (0x2F881, 'M', '巡'), + (0x2F882, 'M', '巢'), + (0x2F883, 'M', '㠯'), + (0x2F884, 'M', '巽'), + (0x2F885, 'M', '帨'), + (0x2F886, 'M', '帽'), + (0x2F887, 'M', '幩'), + (0x2F888, 'M', '㡢'), + (0x2F889, 'M', '𢆃'), + (0x2F88A, 'M', '㡼'), + (0x2F88B, 'M', '庰'), + (0x2F88C, 'M', '庳'), + (0x2F88D, 'M', '庶'), + (0x2F88E, 'M', '廊'), + (0x2F88F, 'M', '𪎒'), + (0x2F890, 'M', '廾'), + (0x2F891, 'M', '𢌱'), + ] + +def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F893, 'M', '舁'), + (0x2F894, 'M', '弢'), + (0x2F896, 'M', '㣇'), + (0x2F897, 'M', '𣊸'), + (0x2F898, 'M', '𦇚'), + (0x2F899, 'M', '形'), + (0x2F89A, 'M', '彫'), + (0x2F89B, 'M', '㣣'), + (0x2F89C, 'M', '徚'), + (0x2F89D, 'M', '忍'), + (0x2F89E, 'M', '志'), + (0x2F89F, 'M', '忹'), + (0x2F8A0, 'M', '悁'), + (0x2F8A1, 'M', '㤺'), + (0x2F8A2, 'M', '㤜'), + (0x2F8A3, 'M', '悔'), + (0x2F8A4, 'M', '𢛔'), + (0x2F8A5, 'M', '惇'), + (0x2F8A6, 'M', '慈'), + (0x2F8A7, 'M', '慌'), + (0x2F8A8, 'M', '慎'), + (0x2F8A9, 'M', '慌'), + (0x2F8AA, 'M', '慺'), + (0x2F8AB, 'M', '憎'), + (0x2F8AC, 'M', '憲'), + (0x2F8AD, 'M', '憤'), + (0x2F8AE, 'M', '憯'), + (0x2F8AF, 'M', '懞'), + (0x2F8B0, 'M', '懲'), + (0x2F8B1, 'M', '懶'), + (0x2F8B2, 'M', '成'), + (0x2F8B3, 'M', '戛'), + (0x2F8B4, 'M', '扝'), + (0x2F8B5, 'M', '抱'), + (0x2F8B6, 'M', '拔'), + (0x2F8B7, 'M', '捐'), + (0x2F8B8, 'M', '𢬌'), + (0x2F8B9, 'M', '挽'), + (0x2F8BA, 'M', '拼'), + (0x2F8BB, 'M', '捨'), + (0x2F8BC, 'M', '掃'), + (0x2F8BD, 'M', '揤'), + (0x2F8BE, 'M', '𢯱'), + (0x2F8BF, 'M', '搢'), + (0x2F8C0, 'M', '揅'), + (0x2F8C1, 'M', '掩'), + (0x2F8C2, 'M', '㨮'), + (0x2F8C3, 'M', '摩'), + (0x2F8C4, 'M', '摾'), + (0x2F8C5, 'M', '撝'), + (0x2F8C6, 'M', '摷'), + (0x2F8C7, 'M', '㩬'), + (0x2F8C8, 'M', '敏'), + (0x2F8C9, 'M', '敬'), + (0x2F8CA, 'M', '𣀊'), + (0x2F8CB, 'M', '旣'), + (0x2F8CC, 'M', '書'), + (0x2F8CD, 'M', '晉'), + (0x2F8CE, 'M', '㬙'), + (0x2F8CF, 'M', '暑'), + (0x2F8D0, 'M', '㬈'), + (0x2F8D1, 'M', '㫤'), + (0x2F8D2, 'M', '冒'), + (0x2F8D3, 'M', '冕'), + (0x2F8D4, 'M', '最'), + (0x2F8D5, 'M', '暜'), + (0x2F8D6, 'M', '肭'), + (0x2F8D7, 'M', '䏙'), + (0x2F8D8, 'M', '朗'), + (0x2F8D9, 'M', '望'), + (0x2F8DA, 'M', '朡'), + (0x2F8DB, 'M', '杞'), + (0x2F8DC, 'M', '杓'), + (0x2F8DD, 'M', '𣏃'), + (0x2F8DE, 'M', '㭉'), + (0x2F8DF, 'M', '柺'), + (0x2F8E0, 'M', '枅'), + (0x2F8E1, 'M', '桒'), + (0x2F8E2, 'M', '梅'), + (0x2F8E3, 'M', '𣑭'), + (0x2F8E4, 'M', '梎'), + (0x2F8E5, 'M', '栟'), + (0x2F8E6, 'M', '椔'), + (0x2F8E7, 'M', '㮝'), + (0x2F8E8, 'M', '楂'), + (0x2F8E9, 'M', '榣'), + (0x2F8EA, 'M', '槪'), + (0x2F8EB, 'M', '檨'), + (0x2F8EC, 'M', '𣚣'), + (0x2F8ED, 'M', '櫛'), + (0x2F8EE, 'M', '㰘'), + (0x2F8EF, 'M', '次'), + (0x2F8F0, 'M', '𣢧'), + (0x2F8F1, 'M', '歔'), + (0x2F8F2, 'M', '㱎'), + (0x2F8F3, 'M', '歲'), + (0x2F8F4, 'M', '殟'), + (0x2F8F5, 'M', '殺'), + (0x2F8F6, 'M', '殻'), + (0x2F8F7, 'M', '𣪍'), + ] + +def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F8F8, 'M', '𡴋'), + (0x2F8F9, 'M', '𣫺'), + (0x2F8FA, 'M', '汎'), + (0x2F8FB, 'M', '𣲼'), + (0x2F8FC, 'M', '沿'), + (0x2F8FD, 'M', '泍'), + (0x2F8FE, 'M', '汧'), + (0x2F8FF, 'M', '洖'), + (0x2F900, 'M', '派'), + (0x2F901, 'M', '海'), + (0x2F902, 'M', '流'), + (0x2F903, 'M', '浩'), + (0x2F904, 'M', '浸'), + (0x2F905, 'M', '涅'), + (0x2F906, 'M', '𣴞'), + (0x2F907, 'M', '洴'), + (0x2F908, 'M', '港'), + (0x2F909, 'M', '湮'), + (0x2F90A, 'M', '㴳'), + (0x2F90B, 'M', '滋'), + (0x2F90C, 'M', '滇'), + (0x2F90D, 'M', '𣻑'), + (0x2F90E, 'M', '淹'), + (0x2F90F, 'M', '潮'), + (0x2F910, 'M', '𣽞'), + (0x2F911, 'M', '𣾎'), + (0x2F912, 'M', '濆'), + (0x2F913, 'M', '瀹'), + (0x2F914, 'M', '瀞'), + (0x2F915, 'M', '瀛'), + (0x2F916, 'M', '㶖'), + (0x2F917, 'M', '灊'), + (0x2F918, 'M', '災'), + (0x2F919, 'M', '灷'), + (0x2F91A, 'M', '炭'), + (0x2F91B, 'M', '𠔥'), + (0x2F91C, 'M', '煅'), + (0x2F91D, 'M', '𤉣'), + (0x2F91E, 'M', '熜'), + (0x2F91F, 'X'), + (0x2F920, 'M', '爨'), + (0x2F921, 'M', '爵'), + (0x2F922, 'M', '牐'), + (0x2F923, 'M', '𤘈'), + (0x2F924, 'M', '犀'), + (0x2F925, 'M', '犕'), + (0x2F926, 'M', '𤜵'), + (0x2F927, 'M', '𤠔'), + (0x2F928, 'M', '獺'), + (0x2F929, 'M', '王'), + (0x2F92A, 'M', '㺬'), + (0x2F92B, 'M', '玥'), + (0x2F92C, 'M', '㺸'), + (0x2F92E, 'M', '瑇'), + (0x2F92F, 'M', '瑜'), + (0x2F930, 'M', '瑱'), + (0x2F931, 'M', '璅'), + (0x2F932, 'M', '瓊'), + (0x2F933, 'M', '㼛'), + (0x2F934, 'M', '甤'), + (0x2F935, 'M', '𤰶'), + (0x2F936, 'M', '甾'), + (0x2F937, 'M', '𤲒'), + (0x2F938, 'M', '異'), + (0x2F939, 'M', '𢆟'), + (0x2F93A, 'M', '瘐'), + (0x2F93B, 'M', '𤾡'), + (0x2F93C, 'M', '𤾸'), + (0x2F93D, 'M', '𥁄'), + (0x2F93E, 'M', '㿼'), + (0x2F93F, 'M', '䀈'), + (0x2F940, 'M', '直'), + (0x2F941, 'M', '𥃳'), + (0x2F942, 'M', '𥃲'), + (0x2F943, 'M', '𥄙'), + (0x2F944, 'M', '𥄳'), + (0x2F945, 'M', '眞'), + (0x2F946, 'M', '真'), + (0x2F948, 'M', '睊'), + (0x2F949, 'M', '䀹'), + (0x2F94A, 'M', '瞋'), + (0x2F94B, 'M', '䁆'), + (0x2F94C, 'M', '䂖'), + (0x2F94D, 'M', '𥐝'), + (0x2F94E, 'M', '硎'), + (0x2F94F, 'M', '碌'), + (0x2F950, 'M', '磌'), + (0x2F951, 'M', '䃣'), + (0x2F952, 'M', '𥘦'), + (0x2F953, 'M', '祖'), + (0x2F954, 'M', '𥚚'), + (0x2F955, 'M', '𥛅'), + (0x2F956, 'M', '福'), + (0x2F957, 'M', '秫'), + (0x2F958, 'M', '䄯'), + (0x2F959, 'M', '穀'), + (0x2F95A, 'M', '穊'), + (0x2F95B, 'M', '穏'), + (0x2F95C, 'M', '𥥼'), + (0x2F95D, 'M', '𥪧'), + ] + +def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F95F, 'X'), + (0x2F960, 'M', '䈂'), + (0x2F961, 'M', '𥮫'), + (0x2F962, 'M', '篆'), + (0x2F963, 'M', '築'), + (0x2F964, 'M', '䈧'), + (0x2F965, 'M', '𥲀'), + (0x2F966, 'M', '糒'), + (0x2F967, 'M', '䊠'), + (0x2F968, 'M', '糨'), + (0x2F969, 'M', '糣'), + (0x2F96A, 'M', '紀'), + (0x2F96B, 'M', '𥾆'), + (0x2F96C, 'M', '絣'), + (0x2F96D, 'M', '䌁'), + (0x2F96E, 'M', '緇'), + (0x2F96F, 'M', '縂'), + (0x2F970, 'M', '繅'), + (0x2F971, 'M', '䌴'), + (0x2F972, 'M', '𦈨'), + (0x2F973, 'M', '𦉇'), + (0x2F974, 'M', '䍙'), + (0x2F975, 'M', '𦋙'), + (0x2F976, 'M', '罺'), + (0x2F977, 'M', '𦌾'), + (0x2F978, 'M', '羕'), + (0x2F979, 'M', '翺'), + (0x2F97A, 'M', '者'), + (0x2F97B, 'M', '𦓚'), + (0x2F97C, 'M', '𦔣'), + (0x2F97D, 'M', '聠'), + (0x2F97E, 'M', '𦖨'), + (0x2F97F, 'M', '聰'), + (0x2F980, 'M', '𣍟'), + (0x2F981, 'M', '䏕'), + (0x2F982, 'M', '育'), + (0x2F983, 'M', '脃'), + (0x2F984, 'M', '䐋'), + (0x2F985, 'M', '脾'), + (0x2F986, 'M', '媵'), + (0x2F987, 'M', '𦞧'), + (0x2F988, 'M', '𦞵'), + (0x2F989, 'M', '𣎓'), + (0x2F98A, 'M', '𣎜'), + (0x2F98B, 'M', '舁'), + (0x2F98C, 'M', '舄'), + (0x2F98D, 'M', '辞'), + (0x2F98E, 'M', '䑫'), + (0x2F98F, 'M', '芑'), + (0x2F990, 'M', '芋'), + (0x2F991, 'M', '芝'), + (0x2F992, 'M', '劳'), + (0x2F993, 'M', '花'), + (0x2F994, 'M', '芳'), + (0x2F995, 'M', '芽'), + (0x2F996, 'M', '苦'), + (0x2F997, 'M', '𦬼'), + (0x2F998, 'M', '若'), + (0x2F999, 'M', '茝'), + (0x2F99A, 'M', '荣'), + (0x2F99B, 'M', '莭'), + (0x2F99C, 'M', '茣'), + (0x2F99D, 'M', '莽'), + (0x2F99E, 'M', '菧'), + (0x2F99F, 'M', '著'), + (0x2F9A0, 'M', '荓'), + (0x2F9A1, 'M', '菊'), + (0x2F9A2, 'M', '菌'), + (0x2F9A3, 'M', '菜'), + (0x2F9A4, 'M', '𦰶'), + (0x2F9A5, 'M', '𦵫'), + (0x2F9A6, 'M', '𦳕'), + (0x2F9A7, 'M', '䔫'), + (0x2F9A8, 'M', '蓱'), + (0x2F9A9, 'M', '蓳'), + (0x2F9AA, 'M', '蔖'), + (0x2F9AB, 'M', '𧏊'), + (0x2F9AC, 'M', '蕤'), + (0x2F9AD, 'M', '𦼬'), + (0x2F9AE, 'M', '䕝'), + (0x2F9AF, 'M', '䕡'), + (0x2F9B0, 'M', '𦾱'), + (0x2F9B1, 'M', '𧃒'), + (0x2F9B2, 'M', '䕫'), + (0x2F9B3, 'M', '虐'), + (0x2F9B4, 'M', '虜'), + (0x2F9B5, 'M', '虧'), + (0x2F9B6, 'M', '虩'), + (0x2F9B7, 'M', '蚩'), + (0x2F9B8, 'M', '蚈'), + (0x2F9B9, 'M', '蜎'), + (0x2F9BA, 'M', '蛢'), + (0x2F9BB, 'M', '蝹'), + (0x2F9BC, 'M', '蜨'), + (0x2F9BD, 'M', '蝫'), + (0x2F9BE, 'M', '螆'), + (0x2F9BF, 'X'), + (0x2F9C0, 'M', '蟡'), + (0x2F9C1, 'M', '蠁'), + (0x2F9C2, 'M', '䗹'), + ] + +def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F9C3, 'M', '衠'), + (0x2F9C4, 'M', '衣'), + (0x2F9C5, 'M', '𧙧'), + (0x2F9C6, 'M', '裗'), + (0x2F9C7, 'M', '裞'), + (0x2F9C8, 'M', '䘵'), + (0x2F9C9, 'M', '裺'), + (0x2F9CA, 'M', '㒻'), + (0x2F9CB, 'M', '𧢮'), + (0x2F9CC, 'M', '𧥦'), + (0x2F9CD, 'M', '䚾'), + (0x2F9CE, 'M', '䛇'), + (0x2F9CF, 'M', '誠'), + (0x2F9D0, 'M', '諭'), + (0x2F9D1, 'M', '變'), + (0x2F9D2, 'M', '豕'), + (0x2F9D3, 'M', '𧲨'), + (0x2F9D4, 'M', '貫'), + (0x2F9D5, 'M', '賁'), + (0x2F9D6, 'M', '贛'), + (0x2F9D7, 'M', '起'), + (0x2F9D8, 'M', '𧼯'), + (0x2F9D9, 'M', '𠠄'), + (0x2F9DA, 'M', '跋'), + (0x2F9DB, 'M', '趼'), + (0x2F9DC, 'M', '跰'), + (0x2F9DD, 'M', '𠣞'), + (0x2F9DE, 'M', '軔'), + (0x2F9DF, 'M', '輸'), + (0x2F9E0, 'M', '𨗒'), + (0x2F9E1, 'M', '𨗭'), + (0x2F9E2, 'M', '邔'), + (0x2F9E3, 'M', '郱'), + (0x2F9E4, 'M', '鄑'), + (0x2F9E5, 'M', '𨜮'), + (0x2F9E6, 'M', '鄛'), + (0x2F9E7, 'M', '鈸'), + (0x2F9E8, 'M', '鋗'), + (0x2F9E9, 'M', '鋘'), + (0x2F9EA, 'M', '鉼'), + (0x2F9EB, 'M', '鏹'), + (0x2F9EC, 'M', '鐕'), + (0x2F9ED, 'M', '𨯺'), + (0x2F9EE, 'M', '開'), + (0x2F9EF, 'M', '䦕'), + (0x2F9F0, 'M', '閷'), + (0x2F9F1, 'M', '𨵷'), + (0x2F9F2, 'M', '䧦'), + (0x2F9F3, 'M', '雃'), + (0x2F9F4, 'M', '嶲'), + (0x2F9F5, 'M', '霣'), + (0x2F9F6, 'M', '𩅅'), + (0x2F9F7, 'M', '𩈚'), + (0x2F9F8, 'M', '䩮'), + (0x2F9F9, 'M', '䩶'), + (0x2F9FA, 'M', '韠'), + (0x2F9FB, 'M', '𩐊'), + (0x2F9FC, 'M', '䪲'), + (0x2F9FD, 'M', '𩒖'), + (0x2F9FE, 'M', '頋'), + (0x2FA00, 'M', '頩'), + (0x2FA01, 'M', '𩖶'), + (0x2FA02, 'M', '飢'), + (0x2FA03, 'M', '䬳'), + (0x2FA04, 'M', '餩'), + (0x2FA05, 'M', '馧'), + (0x2FA06, 'M', '駂'), + (0x2FA07, 'M', '駾'), + (0x2FA08, 'M', '䯎'), + (0x2FA09, 'M', '𩬰'), + (0x2FA0A, 'M', '鬒'), + (0x2FA0B, 'M', '鱀'), + (0x2FA0C, 'M', '鳽'), + (0x2FA0D, 'M', '䳎'), + (0x2FA0E, 'M', '䳭'), + (0x2FA0F, 'M', '鵧'), + (0x2FA10, 'M', '𪃎'), + (0x2FA11, 'M', '䳸'), + (0x2FA12, 'M', '𪄅'), + (0x2FA13, 'M', '𪈎'), + (0x2FA14, 'M', '𪊑'), + (0x2FA15, 'M', '麻'), + (0x2FA16, 'M', '䵖'), + (0x2FA17, 'M', '黹'), + (0x2FA18, 'M', '黾'), + (0x2FA19, 'M', '鼅'), + (0x2FA1A, 'M', '鼏'), + (0x2FA1B, 'M', '鼖'), + (0x2FA1C, 'M', '鼻'), + (0x2FA1D, 'M', '𪘀'), + (0x2FA1E, 'X'), + (0x30000, 'V'), + (0x3134B, 'X'), + (0xE0100, 'I'), + (0xE01F0, 'X'), + ] + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() + + _seg_79() + + _seg_80() +) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__init__.py new file mode 100644 index 0000000..53a5b42 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__init__.py @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- + +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. +Basic GET usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> b'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('https://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key1": "value1", + "key2": "value2" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at . + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +import urllib3 +import warnings +from .exceptions import RequestsDependencyWarning + +try: + from charset_normalizer import __version__ as charset_normalizer_version +except ImportError: + charset_normalizer_version = None + +try: + from chardet import __version__ as chardet_version +except ImportError: + chardet_version = None + +def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version): + urllib3_version = urllib3_version.split('.') + assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append('0') + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1, <= 1.26 + assert major == 1 + assert minor >= 21 + assert minor <= 26 + + # Check charset_normalizer for compatibility. + if chardet_version: + major, minor, patch = chardet_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet_version >= 3.0.2, < 5.0.0 + assert (3, 0, 2) <= (major, minor, patch) < (5, 0, 0) + elif charset_normalizer_version: + major, minor, patch = charset_normalizer_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # charset_normalizer >= 2.0.0 < 3.0.0 + assert (2, 0, 0) <= (major, minor, patch) < (3, 0, 0) + else: + raise Exception("You need either charset_normalizer or chardet installed") + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split('.'))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) + warnings.warn(warning, RequestsDependencyWarning) + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet_version, charset_normalizer_version) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet_version, charset_normalizer_version), + RequestsDependencyWarning) + +# Attempt to enable urllib3's fallback for SNI support +# if the standard library doesn't support SNI or the +# 'ssl' library isn't available. +try: + try: + import ssl + except ImportError: + ssl = None + + if not getattr(ssl, "HAS_SNI", False): + from urllib3.contrib import pyopenssl + pyopenssl.inject_into_urllib3() + + # Check cryptography version + from cryptography import __version__ as cryptography_version + _check_cryptography(cryptography_version) +except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from urllib3.exceptions import DependencyWarning +warnings.simplefilter('ignore', DependencyWarning) + +from .__version__ import __title__, __description__, __url__, __version__ +from .__version__ import __build__, __author__, __author_email__, __license__ +from .__version__ import __copyright__, __cake__ + +from . import utils +from . import packages +from .models import Request, Response, PreparedRequest +from .api import request, get, head, post, patch, put, delete, options +from .sessions import session, Session +from .status_codes import codes +from .exceptions import ( + RequestException, Timeout, URLRequired, + TooManyRedirects, HTTPError, ConnectionError, + FileModeWarning, ConnectTimeout, ReadTimeout, JSONDecodeError +) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0f689bb022b0c57ee787230b32f29a165137e44 GIT binary patch literal 3905 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/_internal_utils.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/_internal_utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9260996b3b7b5eaa3b18bcc03698fe76e67726ff GIT binary patch literal 1297 zcmZ8hPmkO*6t|PipN8FPskm@KJ`$-+VB6CQAy6q$Bv8e+Ld+%WiQjBY6Fb<>4p|Kx zpdX|hxo|>!3BEzDocIbL0ng3^O5ey&e$Mmz^Lsy!K0Zzf%I#mCZ9Yl}`OO>8ON_?5 zxa!^v>ag(eQO2iG3h}l!Ro{70wJSFS7Se}zCz5XdR@Kp!a*;OHx z1EY9dbWYYb{q}#7rVow2k^(IApQY>Bwo|2(T3O~Q?ie?~O0>EL1e;>jJ=^r`vqO$_ zSIM$s0$NalX~p1cXP^P}+QQCTp#WAv-GZ^~b=#pkw-~o+xy#buDK?qK!(7^;?N5i7 zHl3`URE2eBh`pL|TS{3*=r@T+$gg|2>?tZo_QcWeBXeUwI|QwJ^g`> zCuk-ASsA_l^+S0DigAWnq`G8!^Cgt-HZyR^ji|v|rnk)XE%-Cn8N`L-t~FpmIqs1{ zkCdSVybf`sLKB!mhbx$Zk6}QSTKHTX(GqYlb`=;1VHA{@mYaUX9#s<4Sr5Kt@15U! z@PKtH6yb#LkZne3DJ2|K;o4X2Yw;PS{0e1?{Fl-bWD>t$;tGSm zi<@cicJVR!j$SWu$dSO2Q}Q_xNP~p9xPO%r|NDZ7_?+xWmR$e*J|Ho%Jz#Q+xMH*7 z-%)9W>_y%?j(8rRFDq_%iFfQO4S=7uc+mLivhL8w*^7akW@QEClNI}cI;sQlAW>(40th)^vrn9oUx78b+}+=*zltdvc$}BWALwom<6ig*5k2(`<`8J z-xzH&IxMHU!eB>r?A=ce{TBG-!rOWcPp!xL<|3jgozo*+(ck7}Jo+@FA#b)A7DXX+ uSro&3e7u2RBh^AJK0>(jTtd$&6S6MfZnWrXc*oDs`XMIKE6X%KI{62_sd5JZ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/adapters.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/adapters.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2435d01eb8f094b5b934f3abdde062117de4acae GIT binary patch literal 16961 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e799eec245fccaf89797fe9dbabf033d1510f002 GIT binary patch literal 6644 zcmeHMO>Y~=8QvvnNv35xaa=b|KQM;^6a$*;kDdruh%70U6GIXr3Pn^G+TqSn9BaAD z&J4}aReEWF-r8GFMd1Lw_z(2j_HXdoLy>bXMKA61&MqlZmL0`#02jy_yPBPuednF$ zecq3u(~B3&9D$f9J$^#G<%}k$KFyBrc=1fYux0O|;I7E8;E8DvNVFUiI4J zKbN)qRbLuw>b$4QznQwqB>H?mm9H)WMX84t@L=*k+*8hNXhQsTV3DWS!eB3 zV>vCEkd~|1)XQJ^fS~G+7K}7TrHP3O=onumG!}4wh}+!7!+KBr&%Hmq^=a{__^=>~ zN8XVy{67_r3V-o`@BiE@c%o49O5SgazPIDu^vpX0-}mU>$GAlSkd*kp&wJh~ma@7Z zVYfUHP%;r{u|^bgV;W(;dv+&pEQi2=;cE1_=3Umso>S4t|GIqx6h3Z#Zg z9AQ8*J!Ak?B?l8#PT)DKxZswbarIiZwu7OqVtGAQhjOAphVWRiu|lm>44wWk%nS8+ zXwqaxj}`X8&ekS&sTGgaW8Q*$Y!6}aBsbDvoLg`-FJ`~@r1P`T=v#=*M;$=3e9kO z)SMpBph~`T`-M|#tP-V(MdaJJ!=9|*lVfIStnibs^?8j&ePh$^er{{0!Js1%^?*{o z(sj2Iwt@J|bElasDr8$F1OZt*|A5g4V>TbCM>26cbipeOXIF$+&ICN!dCAz|B#38n zxezMzc$OOpffRp_ibm^SJ07#2x2SHCuh0Kjf#Rbb%4ARtU5R{Vy|HK zj6AElGVN1RISxV_>40^4f?y({G~zM@54f@ut>BoCq@H*O#gWMdS`tY{GC-7(sKz)! z+ys# ztg|)Q=I|niRv0#QUrzFbQ}r1=T3CEq(Vk8}IW2tTUf$)s9zlv}HjUDl;3tAo=AkTs zCP^61m=|VJ?ct1d*AdHLJkDr+Y`#YEdeBi(2R?03hgipXoyG>;$g`L{kSvolF%Lxq zS~8&Dq=@QvVNGZr51B{@2?alyhrgUjw7rw! zcU-=$G1`T52otj?RtRPejVwqk)qApAt+RV=)}&-!V@nkhRzc`Hl*39DpDUdkPD|U@ z$cM+NCf69XP}YJYWU)PCk0yFGK*qex98b#%rd`7iWTTP2Ft)tBOqFJeNI(7{2cJgJ z#eO;&sOK}5D)0x=wPS71G=hNswp3D2^+9kTZKXOZB7d9c%YJd|#*JStyY6aXG?x`` zqaq5Y&8J?qsHx-}&F^Ft=x9D)wp!9f3}`AsM{|b*t`E#;KCe^tIU1tJf11HASZIPo zMQPAQghc>4khcSwJTigpz-LS=Y6U%4M%=F7yb%~><#klahXBX~V>AL(>2;La z^AP<8ZZn5Rxpvk6@qb<4=1hT13X*G0f;DqJL;}u)^H9~nlD;JEu1TdZ!GJH>imV9Uv_m>3WmGhe3p9`(|5k`;v zC+joA5OVao`+rNdquwVawsFX=W!3E@`+sU%FHCSl%O9eq!lDY z%f^|ZYFr^ZMH7J5MChmmv)!~m+s;l3OM_oR#o%cs2 zDq9iC%g{Yn$~l^T6ZSjlTvySzhue??Enc|dYwC$8bdE0?p;+#IXLuWpv3ngMgo*-w zUnu5IR^)%5vOd*juh_?4+e0y(k{M~|$_!+ZuYJybIbwe!LAnH9TM(#38yb~pZ!VG` z=Mxw7cj-YyI5k{TqE)zExPE(4)BAJNvc7;(B;dbI^Je#3+MN04nb(Lm#a`cL+;C|p zPwS2>r{x~}_UnCu+vT2Xi<;iQk|+O|<_R77z6~&E{UPr)V#+xj$fC|MSM)ou{mIPq z1N8ll`oB*PdV6kVqAz0GVMdee|`VRrf9|<=qhc&%b z{mp7&bF+G3G{3(u(rABwj~4D^|3R`0 bzw`{14yD3kd7)Uov2bZ&v3!~SEnfZ~AeF@v literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/auth.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/auth.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55184c8b3429cf1ecabcb87fe5845c9f5244a5ec GIT binary patch literal 8087 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 V52EwJPycGYx_)h&-bmKJ{{UTI!|?zB literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/compat.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/compat.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..472caa3148c9d3012103fbe1b143193b55112616 GIT binary patch literal 1819 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 H>e2rOJH_OT literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/exceptions.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8248184519bba54145c30182b1779953ac0b79d5 GIT binary patch literal 5226 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 W&c+4(SH1&V%YVoJh3_CGZvO|o4Hzl_ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/hooks.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/hooks.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9debd59bc8619988f34ab84bd2df1e000b967821 GIT binary patch literal 984 zcmY*Y&u`N(6t?rDErCsA2)H400I3orLz6g6(*$A%q)8j1gTtgLbz?WRn#QT^7IjJy z(st&;KQJUN9J%nvI+An0}#*M-bA z?{;?r0(K0fON^vE=ZYH6NMFejp=7}v232cWl)!*D%#QvBT(3i5F!BX5Xdj(p7}Y&Y z@Jg{Q^}svedJ}>`B|7!zxWp;?=8T;V`iYdSYCDw^ZdE>?^4!!&9sYfcK4`9Vl#4`0 zBasWxAm!T;&!;*v1Cgh?C#hmlCVEjZGXt4#hcC7wEewBN&}2wcuA`;;QLRf@%&K6Q ziNqvwRP5QlwC!ONojqo}PbZm)uL^fFnb1t{h1b<>T={R0jt)B4OXcq-!DPgwtMz+U+99GWB`|k)|Z0Vv4za3nh}`;m~q ztXEcqT4=OrsxEnG$A18!`!2|%r8y|hAZ ak5JWLXzgD8N_+M$YOB2GG;X)tJB|N6lK(US literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/models.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3619b1437680501c571fd8a3712eccdc63db590b GIT binary patch literal 24231 zcmdUXdvILWdEeg0KCxJUAPDg#>XH&AE=4XWN|t4qra|)|QIR1FXPnMdb<$32 zr%vSu`}=+8-iuv;bmB~B(t^Ba&pG$p^Zd^DKBqH0Tu9;X$k*1deCzF0>YGgT|D}Vfv>vQJ*m|h?kd!N- z+`;O@5+7+k(mGT<)GAlYk{)dyZarFkv~{F}Z>8Lw-o=|%^#!DNxx10xE$NRTy~o{)^j_~{cz+4$``vv= z@AFRK<^A2+g7U7dcz)nlS{>JG`i0L7{uK%{iw)nw%ax|* z%yrs9z0vlaV9|4yRijl`t4`<2k~bGHuO2wdog1EVF2$7=-X&~JmyNI(<(+SMO&951 zUV9EL)>&(@IMyLG(tB^cYIR0YWUs+!6sK9eCE_+H!ybB0V;pMRF&DYV5 z+G3}3)kntmGj-p)(DuEy-v}Dly|azEfaRWvaTjBOOe9-Wg>Z&%c zI<1UT-$s z7cV^*j-OdvX@hn~Qw z_Gd3&oR%C6Y=nuvSuUI5Xwa#(F-zCInja{%5st338?s^zzgG9>8jW%xEG+9y-EPmjHh$G!fH3Co7{AOd$^Wz>Y`JHxcC72KMSZ2IMf5IJ@&bh168nDWS+Xz<6 z!(r}Bz1gf^X?kJy`TFuQ2bb3i)@)n}3+VMqTiOkCi2KXUMiAx^(-0e47(|%9vKpZI z3?^fF^+cGRTdXVB3&No*D-8g2o3j=ct^kho^r>AM)@=3^Q=aBj`tR;TZXXaRBbQqTCOee4B}}wBk`=8#rDpH0>Flsvw*8FQ`mbkDeLpbvI;_eU@zuErSkV9^0sJ3+@;@x97>#WGs)M{uibsFt*I<$SSIj=sz!p5?i#IHJu;GLA3!q0mz9edID zlz)uibgb2AH-J+XyvL7u?d$%rU=b_rU+G|>j$xsXEw2WPo%Z9E$BrMvHusJ$*XOR* z7d-zMA(kldm_~_}<<&69P7xn{7|r+-2yDAxW=z|#4gFg%@Xzetf43R0#9wcj`W$MK zssAb>oc6#7%z5*ssq($lY3|V7t7W*kdx}!lKat~o#fi{vb@(S z*Y*Utox zWe%IypI>PdHf3mw^HLds0bChc?ie8|G>? z!AZ60_tHQ@N1vME4tG1gcdeWc3k@K5Kd86oJaq)itd1fGvx{}V9t27`%zBK$2brJI z)1e+kf&kCy3p2o!AW)%kH8ijLp>bWnT?eQ6RjH;wt4Zhm8RYrEDydQ)@JSfOGir<* z86$^(wlRT!<{kTv`MUYTV%j#l58f4S2Wy=Jic0=Q5lf)=ZvmzBQa+#x&}zJC1V#^V z4Cop`j>#NAtO>X@mUlD&wSZPY_VONy18xDIrvSzFS{h%b`K5m}uzNsmh#l{x0mbQF z8l?`eWqKLc1{8l1B{Kr=rvv1n&I}-i`*6T$U~ zYY+5NsM|#kvTLY)Er%yB-xPu&*^Re?BHM5?S54LJWl*xPHq_n|^~)&CwAX#*Eu>A0&7&?B}+!h#(m3wD$chfO3n@XxYwN&S82$Jnz!=8o0H z|F7)V8L+KUb*=iUbH&?02Zv%N=7_@>nA-9Y=kW-;I9uNy5oQ=n*y^%ZP7ng-^NBy( zH~4$#Qg?z3DQ$!~Y$UER_AMMa&(hMZRC z5WdTO`mTjQok0K=+9r3Vo<$^vE!x>EI3>6Bt0!&0k$wNC_4>~ncE zOtX)^?r)*(-2j6Lp#j`h^o#dMhZcA`MV>`H$I8t40M8>S1+>Y zR1yf{9F9?(G}*yR|78SrAqSiZOlcMk{4-xKeibU`>KKp;Ru zz~KgvAF}js zfEvD95Jnob5ZyF;#>Z2@&87>k=^bObZ0ddWFbYH3GAqYJW3g|k1UB<07reIj+Oj(J ztE`wUn6K|mbx&-W;7U9!5n(GQn~;H<{;5h*!E`wrrbWC}A4fGCjSJHun;M+QYrp~S zJC-77glQReX!EPhJsTcq@0Zy-LQ=uPF2G(X82b$SPWOR7rJr+~!6M-&$R>4%lBES_ z$_0H1+{I-~bYQMRKg55pfV;Syx{)ed-Nsoj?iAK`S$WqRofW@t#lgYJiYK`Gk{7Hf z=rU&1ibr0NIt`X^yw?aKSpD;uM0o{dyMdl(&X+9}aEic|wK~^5J*C%?vw5CIz>-D) zCoA)7DB~9qnCVgQVnsaWo$mgv^R(%^>2g{vvHq(JnhaJMe44@3U?3Zui0mtP{0xFz zDrXdj6!Yfr4E%8krttU`1REQ>YURzm>E>lmLC(~YWi{<)-P~KLYDUyYg)kfSy#8qb z=V{7x>gXI;V$7a1IoAXSKRFu}aZW~&Q?rrADB>+3u|YcQaLK^DdRV;p%NKNxo7Au= zzBt^x%(Cq9d4ngg5!~sEF@yf5x&T>X$ zwgU_i*+LO8AVC8sHk(OJ0SLIW+^o-e12aV}$E3qhcuX$JkL;~;2pdr5iejE{py&a4 zoCFz13{tcdTF%i+C2=i!ayCS95YGm*4VAypnV>do(xJl8S**9+CP)uPc!*o&h{(8Q zy$S=I(5ovw5Uyu+wvoT;2SjWd?7s6R7ajQ_}GC+z`-L{5OmU z^;&1}_+LW+K{5p~DzlJ+k|PaK(w1~d($r&FlAdVry#<9yM$-Evoq=GPm-NGu&OeR_x^v4wFqNn`9Gip#SPM1m%+AAcgX%R}c%+P&%}Hp#)(j;`^u? zQxyNzs|?8Us}l&qjNUP!O@M^HQbSL9Sctv)49nf^+t2dF>kQstK(Z(G3CpdS?K#LdgCFuSedICj9>|KS)qcRrSnFW(`sG0LEJUI$@I-YZ z*MAM1>Jqzwm0iNRV%1YiSkon}hMtkqauk9UEPde44 zn`U19B=W$sX&FMRPN_Z}{FnJ(cCkAWLqpV$cM8+VUpc#p6AH7nn%kMH)zq78^m7c@ zRA2K`Omg*A55d2}6A3=HVeWG~8#p@}#`>T##)8zhY%N^QNJ8kt7d_9!}vNgGTA0c|6BncA1e^$oKnXszt+=QVjF_{=7{G^Ww z;lG4LFSQP&OW6@INRhqFZ4hO|&B%2oZ20#=F8ht+* zb%qvi?38xU0Kh9vzqG=D`3o?e(ufgTMJg1*OA$h=X=)t~#c3M8M&d*yPi$mFvlWi<)J?>U7y0V>7|iXAtrq)UX?0OXfdSU6V}vC z)CRVuJFyk+Nx9WqZ2WG(LG1f1x}iRg$lbu<9%LIRQj={e^&+wj(`L`8Y0_=fgnWa& zGt>?cYHQuT4JHtfZq#5+Lk=|eh-;#5fO#WfH^9D;xEo;L026vQ6a*`8-V!z~|7sMi zt6L0YV+a@Z1tx!r!Bi5+l>ap(pXZd1A)*a7yP+ze;fAK0?)c_uXA=Xq8IGES>kJ+- z0|^rfxL*S2gprQH0)hCtN!As6TJ$Q^t$;asAgWzMw}#?AnHgYg=`rp`jOHmspm$6)!GLv# zH48>ke9K%nX~kTFmWY-~8!NbEt-?=;{{s6>16rc=v_el(Vx3zF{3o6ibvdnU4Hv@v z1-w%)Aqevq&Q71!{u0F(wQqvWkpGpb_&zFz!B#66hhWq-U7)%(qg@CrMRO8N zacu%IE%^ZA^$d(k@EqtF*HfyDboO=%CNkLbeWU;ed2$!s;h?}TKABy!XpmdWz$lhm z%fFOrZ-eS>X!U6$wFX|cn}+eLur&OI)SGbrS}S~}a062ePl1=+^x6TGJfyCo`YFgio#hoJhfZX!eHJa=}D!ALPYi z55{@C%P(LIdL84HDwn!@@3mQ}_6Tj*qMv%tm;}s1)}HR3ja+|3zxC; z-HyQ7MRx9r^Ma=q>&w2g+F607tPZ^zzlX^F>Eml3?mGRo98^*T;XJ9JyNfO!FmHpS zgE~PRZyfmBc+Cn_-Nxb2s3>mZ_lzm^Bz|QRcGCy_hY$MYomw?51}1JrRY4GDBL^X| zIfa=fZC)_&H0f*>7QlF_z^AHSi?CFbD`E__ogdqEwLseulvwpZ5p5}AR<(!0-(>I$ z3}p9<*<>G+Wdsnp1+R%S=*iL&@t2unQw_4=i30nYsxP#_6@-Qd9lH2jW!hc< zm3&x$4lT0KZ$cjGi>Pann4*nHAzL)Y&73un&H&+?)^1Q-*pgm{#onSFKWEY|mCKky ziD6^9L%UQC?=*=R1(tzW1!TMRUkN1(uu#!vWt%%urn_e|CW?_UxRL?7Lf$IjucnZQ z6(K!C?Ii-bO*{H_vGfDb!AF@;iU5sJ<*{S{C0RF(lc{S3(wd0gIQIhKhzkP2Nh?a< zTC1_f*g*zdNW78-qQWE0=r0r*zc4MT%+0g>GkEpuoaIqOIA54W%m?P{dmyYa>5CQ4 zF+UTVXy*u6@n0U11QmY~b-KnHd}5(oGW-)zD3Q*daLu)J7f1jchgivO!N&pUZA@$! zV0PEwJKN2`7Xti+o4#cNmBNqVGZ~^%%$9gEpf-Cw<7R*^>>w*1IN6&f(R+{&;GYl_ z=k1$jF||O{lI>;H&!9$7Mx=6RtAw_Iii6R4YxNb4P|-&26>vE~sH}4v)L}UwYTf5g z0~OorW4A#?YuoYt2)-W=cFdcr-3T2|h%~T0s=-um1oydlLGC&A)4|SOjy%QEF1K(p z)qcvQ6=#=QMEpe0R9^<_+YLV4xJ}3ad1+4ocD{<-J>=8T8yOe8K7L6?It<&{S2(L} z(=B0cQ|o)Ri&-zNe$yRc-7p;fCY5PuW%MNcm(cI~1-7Emhb7i_a3WYIz z3B@Dy7&X@CVGz$l%Iw^L4VJ!o*@(FpL?zb0&q2AEP?F0n(VO!$A z(89R2iC--KudoPNXY~k!hgc-fdNprUIt>S=1{|q$T5(T=S#Uw(*z}M2$rmK+!bSZ- z_Tpt7$-ut?qItM|x)WSr_lPkg7gcqfABqmM!5DFJI1%F{Dk@Nx9-f##;it=ajRl@% zX;FKgU`$wT+Wg@&<%M~8YJzOQ`xNv;e>=re5}ao2O9+08$f1geodt3*ZOb&rG?E4K zEm$y-16_<6nIGC|6Ubu>2$x8C)HLl9&`8lTe_*HSB7iu)9up)?=K&yNvxM&<%*I4} z3z{KR4&Ynz@O*^bW3R|iQBnb0!Tk*rx!Mk19y=fKZ@T75!K#FQq=9j;H_CjoZqr2* z-=@@~U?(<}mEDr=o{Dx0%nbb?8kx5o`m(wXl#a2et7TY$dG>r-eGNSXg}0!W5AA2p zojw~H$AO^OsfuPmfAJp z^>qNgXT}#q8BA|XP&z1o*K<94DH~}OL3LJ~)VER+fR)JjI#QTO%TnuQP*ejJPz{L}Os6%@h7tP{84Y zk0X+^3nYvXSwJGKk~M1C-?=yJvc`ME?pf4Fm<^02I&DC}0G77eX<~bkK((w5HTq5X zvck24Q0~xZvIJA}22_`=dJg@&7h2bPlFc5ca)4oer7ea~?aZOka;&7J7Jhd2j95fw zXJdF5#U(U3kt)uKG&+$k2Ies;Aax4f#1-c(ya-@^OmZIa9cm*N+DAlBq?wbXGSR0- zDo(fvBizjaXVE*hj_SjnQoNljz$G-xn))gRNX(=}QIUM=y?8Xih(l*zndx4G^g2x|51b(mE3^@{!8uZr&-4`0<=N|S{~bEby0tb zCEjH4lMJY!Q`B53Dtr{ts+O(3$Qb!ju43oGj))jTz`QsYfma z$!6Rf6I0Dt&dLp$8OTHV+{X(;xn~Q*xrySqXy4{gc;JtCehQEOKN0ksZx-M=^tb8Q zBF86SxRIk1aBR^IE?Ky~(14SR3^}DD|-Wh?tG;L;R3imiSKh zu=^-l-G#g(?or9x?N;1l$lK!{cOS#=UiU%h^Bxa#u{EH(I0LnGyzk>&8e;SzoWw6D zcB&z#C5OH0vMse!4X~Pu%?ot4XlsX>h$qln69>OcU+2KoLJ5;O)=g^6&$cmZM!f?k8| zA7Ns=Ks>j=9N6>`LV%(ZI%36Oc)dh63GoqmH!4+Sdx$m-je zr;!ZvH7GX0UDRr~*a1A)m))_xhN9O4EwLCMB53h_gAkXx4W;acA&JMKnm8>H>ydvE zMK?DNCI{3IOwJeMwu{EVAobgUrejbc7VsSeZ$s&=N-oQM)nkV88P#GA<)J^M4<~2AW#@OSf)uK)HC<0-F)e zxkyPIRz${SGuhM9_Zjv3s0Y(TbxxS|wZvGqMIZ>%GI-JBsIQ{HW>CO@@I^F3zrX>J zw2e|uvqp`9A#Ic!SXTlD*Oo&{j8Y>BD%5@?Abql=Hv z6kFrN*1pZT2V0BX_Ks1%itNp9sFPgF$=N=%Dc*PyuLOkq#PQ>iMccujaJT$KKS;V;~@eAbcd$C_Elo>bVAl4jCLV@=a zwWdChrOATMp{HF^8I7QQ?H?gC7d7a>E-ekAL2}1`}Mp}^@zdl$Z4vow6-3L2FF57k&0<_q=g68u7liG-hCaP^T3CkSBntH-8w63u3tqb z1QFBN2g>U}gs?jQ{Du=g_HJAo=cw-7fT~q=o{$2?60JNJ zE*J1m63?VL@fMG#@r)@xf^MP%(+_mKJZ^gE%BnL--PPo56r_6n=qVI_mevRb-b6x z(|udMufUdhv*LN%+dpr^dft|xqgukr+-Ux$?mmB=c7pd|rib?wkvCl9=|kkxi8vl{ zMSUBMKv|azP(6-}aGMC%a>)?0rX#AF41c3vrVY(`y`XNSs*CE-g z?)TymWUTIRG6KHY(&1zUM^R%y4Jm2IK*2*ld7;koHDb4&X@i6&zuP`JtjHXaGu&ap^L+jsTlPee+(U*%r5~-4&o; z`bIpoQLDQ<8QPX&iZtl_fKHW6GWkS~*zY3veCqQsdTaiA&3fBdf-yEQ@T(7XZKrVd zrtvne3V^2XA-utnE?9jY3UK~5$i5A3JURxJ<2OjdS_BR=wU(B;U=tHpZk+j59}M!n z%-e7@;MrhclXU%0FpdjC@?ewU0Uen|>~gtnLhA<|=Ovyp*Cv4v>FvW)Bsg8(X7L1> zM9>rQDfR1}hD#Z^&g(ez>S#6`$1w2e8~~{eGTg$+Al!`tw3<}ZgdLiWV!9VNu?`jo z3Om|=93P8H2qe?gUTIz73eQLWm(T}lm&l|hw%*^2RE4kcpDIOM0s_PbkN~!0h1%S~ z3O$|^q1Sj{RrDSvlBBv4%#&y}!DaRz>_|#WXKT{g_;4y}rP+zyAy7_p4>_mxNfI{6 z4B_sQN@D#b&ZfXWlc0}&x*o54VB>oFH!1)pjPbVm*tq^Ri}*&&2hDjL1=XiY!Pq7j z5!`_DDh{$KJ;VL$Dq{hC!PW;c@$i8wCq<&#Y(6Hurp|92D+(@0w)w+VKCpMb6UT?@%B?)%eu*0x$3{4w6 z?i@B>@`rsOMrz`6pQ6+oKttF-KtWK$pYM(`&h4dLs36j%*T7xMQN>Xhe@}vIvsP)S zhQQnv<17umF4CVdZWwr*UVSoo3scCZx7pQm$y>P1^}oH5%1cky^KYkM_(iM!3vHNB zr0u6&^KGM6h(tzsT?h!!Z>tndY{a_4K=KTRCE}#|K4Zj0ikyZ@GuXj^GMAcQaE1Y; zXK+4gSvK`cNWEi*g$>x&W~nI_J&hpD#p?O*5I||8%#q(F=Xd8z6$sh|L8`6%dT*56$ggcMke= z_~&4>^80t#SDbY2G}V2KTKG!+Q_18GRR>t|0R+&Ni{XtzX)>X)hYc1QdU54Jj&N(z z8$TS@^B*TOI$Mk7cUUW@N&OE5-{cH&rc2w#CNfYp(+-+3OK?~LyV$R8=%0z{Ins{! zk75MVgk=Bc5xfDeQ7miFJn-1>EfawHemTZNJJC37{^|Qb8G07HP|~2XaA{l10GQJB zNFh~F@5hlIYgY=t={U|bZ~CRR?n!)-Dx&>xFCqm0 zt3l!uALVkKN`*uNr@OQ&A+qYC8zdzPoHQ;-0dDu}^U)DMY8`koiQuEs2;RMeKPYbq z08rk@eMtrR;jsPCTJ9{vSv-L``6$do+u3Ll3~=5=<9_u+sX>2*3j}b6U6vrWGqp3%yg2>Q+T{z?b9ZBZg_HaM zXPxM^U}t~=al65taVuv`h_^nEaYed}sPhApj8B2|qe-4e1Y1oeh6b=D!;dCeoEP-u zk0ak&GrL1D$fE={Kg>0^tTh8pzSx4GKX8$PYto6xHAzZI8FS5eMat0aw;lpYf7HB3 z$ZwE@Cu4~jbE03eGe=mxJLW9~X1LCU(CJL+*1>~f@$c2svJE?}JknnIS~trr_C&$O5*>82$I zk-;ToL_z7}UNK5US_C@6*!K{GL(jp~zp^ZzNJ1cE8|pV%M823}OaehWaQAvGc%GoY z8!zk<>@Gkr1*p(X`uG$^zdM?>P4l~b0wKQ`fPRuR3QixzCBpc-#uu;?WFKT#kH)$+I`(15=<>NO zCG)E859fj@q8p+vNwou{W zcOP&;ki;=AQXc+Iiq47%QK+L|frFhVHTjiIR~b(7@Hcy$AW!Z4*MWEd0+&?DYB>(* z1SonmTp8jtwvFY+?A3#-+qaI}NPY}=>8J*SV2gY91hX&4y6rcfZCvcG50;pY@ z@4FOrep83TY>UF%f)`pXe<8GRw2=hVkBuW4J$1St3t$K! zHPn6pFacKIH8%wQ>hd0mkt5^jDzle{|LNUl}8f)f$3%yhO5n$&FyYb72hei{N!}`>ItU+kus)NmwhI?XD zf1Q&yiVuo5+^5Oa%T*@eT1yEjkZJ~I2On*mPWcriNYu0^ncRTpba_@Nx+HPUjJ$vC z)d%!;joxv7OnB7V@X1B#HJoL^Z`y`J8W!DIoG(ylrtQl9qDBf_@b9EIUo@MswOsNAEV#T}RkFEb-Jr&7%i? z4O>au-ltefg42xAE#w`p`#waV&Ng^4OA%6wc_(A-#`^Du|0mf>Fp;|wDA=qr9{>o9 zY-77Tfdm!+7D|NTAP=LcV0UdIr6t)VhTnTRd&Pw4 zVn5awfD-$V_~B^^3(n<@L%Lck33}c3P#z2c_@SshTwVm%>IM`%mBUG2!XmaUM@9#V z_B0Ti$gs2stN+L#GNH=`KE(B%Vy*U1WOX#2<+(rPcd&JkU{<%3BnrC4A2MeVlr9}veiwyU^4H)g*43JYiTIxhi0QA ze&hOT37+8PfgWCtu!6m>-DzIuC&LWhU?Bc8;?OsWBu>>N)L+}K##m@O0}3iy1w@^M zs72IH#&$8l;lNZlg4-&=t=Y z`PwX#7PAa)xa(jyhv^RXwF<|e*TrEZTuQWInE5WN`VN9{;_SKer(b+-rk2>Pp1bh; zg&8%DNl>^7J*ECR%f636he40Q+YAUgec(C84h&%Se0Gdv z(vE^Vg!?riFoa=E2yO}Ge}rIj4+GY?qBZH1k@wJT{xZG7JMHjMUI<+6eh^EZkB(Gv z#86?X^jgwI^^kN2z45Owx;F zgtDjIieiY}U2Vyw6xCa6|IM^4gnBJRA%yu6(B2{uxydheaLzM@;-Br_vUD?!d3`O8 zwUZTTl1Xi6Tq^C})FicK6y2065lSw&8f!0(^JI$E4dWc4i4|C8Ns8Y}_e)Y<3mN zCcC?OUsVr>t)eW8>qLmPj*=iqVlNzyWXBrhKrRPJ92-d-Bu)?@&OiC1fCLDH7}^-I z0UL0V1)|OG_g+;WdLEqF%jv_3EA9{e6%A_;@~p-|RowTluLllle9uhJQ95 zUc(ip9{@Xt<#m$GGA;y(R#A-WXq{It*0ta$+Ge0)2(MJ&$OPc zJllG%@?7ir%JZ_k)I8HVTRAK96U}n#g~|&uKZ!P8ti0Hot<1L0RnE2MDs!#*%6#j5 z<$UX<%1g4&RP*K5E0tGdei~!^Smk3{#?v?cgnMXH7Y}<`&)E2Q<<%d}v?t7r_lfOq zX&L^Z^pllW-^#SjE#{5Nt6pwZb7$Pc?`o9=nLpwlMgC8II^!O5kH4F7k9!w(jmkwl zpKwp&`J{Id&zIa&?&)_kl^=5TyP5J6y}y_j-aB0{2!px63xbB<4)R~x|I6o>)*FG- z^4)IJb2`Gm*KobSsX2GmCyu|e;nhPY^qp3%U0d^{qhBZ7CZVA^Do_n=X4?h5C zWl%OzU8x0)dX+6ygHV*S@tA71*;t9KMo{f+zY^!VqPgKW+OdsHrzQd~&b?9VbTF*4 z86Q#~Y}7<`Rrsx{i}vFq-u+P2>R~k*WHt1ws1Z-yN!II%9Q+4>t7SCK+@3uER_gcH|yXfYc5WYaE-wwTYc-0#! z#i$NlsRiDRcHp&x2FJ#&;ZD82v~>HjTkC|LDCgn=VayM`YF9MkLu+1G_1gCu!f#iT zEsskqYY0 zl(aaD0RyJAxYS?ryGxgsZp2x9_R7n3gP@lDEZj|8S8xR#BoRnfHzTYlb2k%#L?K^{ zw7Z!QZ$fQX7e|oGFc%z?b@Wh=v|aq|7?H7O;3>1KJuw>drc0 zZ4+DNG}^$xTD|Uf+hN|pFI@K=?|!G*s5km}==g1v*TTWqL{`>J5EacNkCGnDIX70F znryCLfw)gB0lBD&ZS=qHZ97|yX46^m9ElBR(Z^=3d&21k9NRMMSL;n|=dx^Uu}&0D zf7}Kx{aswaDI{xH*thea*LSoXJ<{C_mL5y{=k#|#w;pPX4>N#&eeQg$ZN}O?QN|ZC z`S7jzHv>Tae7jNi=dp|pEZCa&$~+)0m=D)6lwifL33nd!VZO5+uKVp*=3Y8K5BT-Y zb!zoZkgs4qS=nGdC5m&M?KppdNLKe-olBqLFm)uSGQFo1`X`GsccJOmYt7&iGHGoP zrF;Xc5QMdM-4o=V;xLlf>ULagZk$Eut)OfXfaR7}lh)#iWB~nw{9qm9l3MEiyRo+4 z_DB(e*g!g16>*NeC3Grj`ehUaPav@^Q?qqkrv8zw>)$oaqF&ObOjs{)wLZWPMN*xM7o9Jj0fFd% z$9ZQKoX@?zBOzC|Bv;Z|5ngRG=(9E1l>@Q|QrX;|Q(zn0X&a#024GyS5TJ29-MfT> zr#mMf#mBHv`!}SZAV*gC5w0d7;|R9n2)3iBi;H-y;~M#K`Cr2odM?czgO? zoLg56PvkJT*z(A{JTZd@Y>XLr&DGfCwuv7?(f)0a94T$88rDEB!WGmDibyOwubH{L zhE(gFebh?Lktyx_d<0=A5BJ&1&)|XVgDe7fU9tjWLyOD}ZPO5wF4#+CZ0N2IBzhh> z?CHG>awf`5S!SXv%QEgCYv7%+X^@p{=&Xml6`FhU+08xB-Q23alZ&k2hOC{#w>S7r zBy+NrZ0BY~Xs~{4v5 zhhe9ze{dT!UW~JR3d(xpmqGRyuP>G@F@_hhz3vBLyVmkzE1(48#b(DBp*V_{VgX6n z7S~uY=R+PK$IrFBEt$!)L`rjRoM&N@FV@#zq2!Zo^qzktfE;M_`r=ZZvrm5n zRO0?7uHZFb-cNx4?c_-|BZv<>g%G521F*7T>=dKI*ER73unnTb&Ulo^K1&fJ%2TiU zN&Ps!saidhZa|lUCUMBjgmyR<=2wmFPbz%^?+P15Qj7OAEd#wm+scIFD7AJ$m^VtB zS#dL*aI<@pe0rdP#9Qy_U%`EE>H+kTsIWH;$kK$1k!c*+PRX_R4uvyOY2z^3D6EkZ zaNGsFn}{X=vtxkXdr=YB#Kw`R=;q(Uo3_PwB4UcUP3#@TtO|HK7JMx{&bGr7Y-3m7 zDYQ+MN4qmDi^i)Eu=Y+y82JMoqtZ4`g{L>3!1d&+eoqs>?sP_=dCh zR5S$|g}U#2%hmDy(=6SYj;8mX0(F#c!e>zSYy@dzqp)jeneaLJoY{DOmwk-yo#8Wu zI`n-OeFMXQU75Xde;nf*FSvSF^MA`7kEZWsI=|(Xc;7h`9TLAAz8H<~^6PO(Hn#XM z(m#t8Z97=$*+^g2AP|~SHnO4|_GjXKD;oQG?WeUJ4dcQX*oPX|06HR#EkuO?a|6w# zW;faU)c2veYhK$EwGhZV&*zu z-04&AV6Lo*PvVoFK0p7Vwh&W6vsXoJtpy%hHa;vRTEw}VUVANE?-kSMrR|RQ;nb3- zwS!epoJ)0&*iuTCsGw2tIV2E~Ea0YBYsERLhJH7Ut$UtmtZv69M5{2)rMkjIt=aUq z`h+1zt9Y8>fO7t;c& zW^qaCVj#X$3H`QshOL1Ix83rLB<13|>>lEhcpEwK1twJ{%S>uW;?j1*!%P#ADu_!p zrA<~hx4@qRFc)l;sI%%6#&@sbVz9->XM94$;{OW-%;FnJ5@eAl!fj>{URp`$%r zN1FVZ|3kN}|2|pB8~a2O;9%Gib! zS03nih6(Q?$l!)4PKDXX+|}A(K@dc;B!8j|c40+XrT->`$>@FXqm<28JZgpM0#bm0 z=2(LkS!+u}lH|bBFhu!V34so^ekz+%5_j-R;DeT@+C9JFI!y@hY`Bh=`5`p1IY(Kq zB+^hv_L|KGs9y+eLrE_|zdb4%!08TDW(unS=b_#q5eb;TV8dzvCvyBxp&n6>nmV<6JTU7`j9^kaiK_@I^62I*tLd5=9{Kr*NSQxaw+W#i zLJD9Zy9-e?ftaHTLVEcSa1fctVflbcZ|&qDmW)Fz$!*UmfyC8Sxe`SpODse=u@Ks1 zgS$FgxsZvnU~ES1Z$p3_-cjM5^I*a1LXi%n;eupo+W`SzZLD>{;y{F)6-yd8(u%4h>tl+?xPm)HW%>R2<)bUzr=xlGkv{#sObd}f}1Z$ z`%u4P@6aRKe5fxjmd6wb+;bC%$mA zKrlv7hO!fNXo)gEhD<_G^$jfq356^?L9m9-Hvy7qfUL5d8s5pI{Nzx17UgG9&hO61 za**a~s$YNQe~Y9lMM$EEk{~Gg5kwOr)ZZQXdZ5&jm|6x4gY z2A(U1Xr1}`waZsyb~%2?oeRoHes5ocFnr*z}2)E~>{ zeiHXH{AQH#3V53`=eS#vrkOJa)Gfe$b6<4F z-4ZN5WA21IiSoQV4OX;6Cj>>gS=?vb=iKLUKkS}y&*FZ>ExRw^e$*|1K+nawWFKl@ z##UYKs}rdOFQFA62+ED5R?MtfnTd>g6s)fOZ@FGF1p-)VV4vt#DBgVilgN0-yb8~YP zBb?w5I2wLiE-LEyML9B)82z;h{_kYB;@ zus7uz;q-1ss`h*`(RYSJo1)h<}I?6X{|Sz0Nz~s*?|@2Dqq1BkeAS&F3uvO$j&eJbA8$qk5%DVgZHRf z{aKEH+{e^a%-y@s zx&K_+b8%#b>g9-0nHtA9E;+-$iwqfL$86A?3`vqq5`MJ_8k1o{(!(tNEW*Y{1`?qT zgAlco96V{64I8?K8I+OB1?6xI<#`%b!@_Qc+Q zu7%~>qpn})!oGq_%M|PqOoywE#t$h3g6}FdL|MlhAr%m(V8kGwO z0GkA1P7wl0Atb7QliwXvXg|;Q1kiX)nV>#X6GBo2+C~JyR>&_Ud35;5t_0;0nxLfD zUk)M8c41l);&1Tv-(>Q)n9!@HMnPw%8p=iHxS1E`HxE_Kv0`BbiBRhk@Ce zlrsI1&K7ZTHKkTa$HtxpEYqRwT*TkSRSTW+7YH;AfAp2om0U0 z0!oZ%dc%wgFmRTli3eF2OUGc+*5B86W}+DwxeqCm>xLCguWD#-Mw&$rM~9_Wcz^6M zcz6)v8EGOnC~)8wSH8uz%ZCBLrM{^Y^!tpy&+>seD(vMTHYibZ0lrMy=@R|TgO_sa zAbzB65CiyIPzVJx)q>Rb=N*q@J_Q$orU5IQ*9#Bey$!SG72 zIt+wyURTb^ezytz8=dU;ol1iH2Rh^W^@-H}HT#2gB?;z%jtEL{v4c4*FP~u*DoJpp z_c!mH+OS|*MR;%t`6KYO5ZcrLT!wI`!(L680ucB$_W%S@L>=jxb_gdV$Z)2Jt!UCh z!^Ok^kQ>=DsSM0tg?%pw=dZw|27{s81GaLYuf&Bg(%tL+7R-3G5&1Aif(Ne@_(%75bfAS5C}#V+ zNem$)%?}|&OU2xQ{`#R`_nRDUKMz9OZ;oJ-I)*tmQb3yB5`zW1N#ZeBGnpf36&yn& zeZyQuTLYVDv=B+iP%4;xU4N@h;FImbE-phtMmm?eTN|R+RTY*8!DShJqrR@}cYrK*BK&4R=eev5!=Y+vWGtM#0zSw_ zOE>RIvrJ=^MscXh60j7Renb~7pa7{n?1Hs$eY9EHGOt{AR$zru_ylv={s|K(FkeR+ zm>^|h8AclEFUf2w17bD|1Vb2_*CBV^-alk=UoxFh>nZnfFj1xL%Z3_jZK72l8XzOX zr-o1gAXnR+$Mg~5hUk$|;GyLzSt2kRwd}IFR&CRBw*4-4hF1Q>v2d^3q&HO2m5~WT zc|X@^pTp43wHhuL>g*eh@Qt!l3qwSU!B7nJVSH<{b0cu#>}!hgNr;E@R=Z8dMKC13 zlF?$oxqDvI??@XoQ5e(X(s}k0@QdFYYT@T1whiSV_wE zay)VXUtk$KRc3*2GPlndAO-ZFzzc+;Kv0bBRJ(%56>>=8f|Op&eFC_k#Qv{RpA8D&Jyyz5*ArhOt|9lstB@2R0HpR|C)YU-VP~`9N;_UyGEc*EuKL3L9*)BM@ z5^)q>m9;Kmo$dxOt>xup%FAGKz|SEU+V=-OxtUAiFJny}>hQ69VZy-VW;`?$c+~Ma zw$woOZ`uOh9oDg~T;QTTqxA~uR>0Wz*liI15Y@5FAEe8C>-N%(TZ?!9s4sP#OC~D* z5f(uFV9Hh*ZV{QtYsctEQk zFxo^k{lQbgzk)4?g|=^Df{mKYsGJ?pzrjoKD|odZX%TlBgdYc#NyG7pLaz^Jd~v|H z+2=;b(AEIXV9wVY2p8!?S$7!9-uz=AOSP3BI7r0C?KhXyp8qp!(Zj^UN=~Rs9|Z(P zryE`Y4E!Fh%(47{6QcaFARzuZDkCyuYj~?KFI{>4k15LkEBueMx4Gbh?H2!n`@D}Y zXXTNyTi9Fi>v-K8PdSM!e=JW97@s^q@gX5o?|mobAXl&5ytZ`h4{gVP@aSZz844oP zBc&b-2NiL6>vLFMNkV7rUMXE*^=f2==|o^mm1Nd`2B@P%dJ6Lo7-&oZpYc>m#OITN zCxh=?_{0$2{EUpbLc|rytzCqWxaI}KRN-uzjk9U9;h3A<)ey9;@8w;K2LTvnvR7~! zQjTb?jUs$wnGFUMBX}FZ*cN@SJSafln6$A=Wn#ycKH1!{%+6Ri6^*%L?`e@;oemGV zdD!{wRU?In9Xql&W<Qj{Ps-4SDv1p7b<{cz55bTM zvr}*jZV_kZ3i7;Mv8^K{zKHPg2T^hF1OlsVxk|;oJOak;sE85GL`Lwdy{YizpfwzI z$$=fodBDGHS5G1GYz&cSr?-DaMV=)QXJ+tg7|#<}cN@ynMDGUS8oHA@X?J_nnKx|m zPr{uN4JMd7pdIg5FKgKI-ZO9cUD$!zh_Zn_Dqvsx`UvKfW&@8FNj5^Ma{+>|q0z|@ zzym&91C`|IIr^aF={a);lAk&;Hy{L%5ne!rM{2M16#Z-py_1<9OdIM5AjkKpgKYv( zn-O0@QhrkWGV}XX>1SES2`j(4bgNO-kMo~J#GVSJ7Wes{N|zh*X7Z@mfZCQ zSX&Kbl=#X)dtBW`R4e5e0SuQM+-~+qhzUTXFPw5($zYIX9#OwD$mJ0;JgJ+;j6Mkq zfoT+V2B$Ip_i4E5OrAPH#4l_IeNl}&Rj1=J{qa}{Re~$H0-8a98yWE`XoZFd-6H4# zjR=g}CH~{kLu9$edpyvP+cS7p^=%%)w0Fi((*%Z&5$oPL7MZTu%>*yv&Qr0khS?1Z zEg{yo^YJ8ak;;G?k%oaD!GoW}(T2>%7(MsM)3=^So^?ov3dkcyl!^-ChjZ_nz(c$D zg}#;P%DPwIls3X4vygP(sl$6Ps7h}~;J0WmRfo5BN z6i?r|_9JgzySsF^dgXHUQ*SO_y?HGzU4i*|@QiRZ89X9ETLQ*1K1HmJ^ao2=ei8-Z zB_>3SSoZ?}t2*|qyuX8Q`*A2Rq+R0|M0kZZ`|ybaj0e`~WYt+F`@rp&Q1h%6@};L@b@QrV;+He^fGi zhtk~`B8876_!6rbK`^xZ7Rf%B9C(U2Y+#Yzd+`cSpuiSL%e-Jzr9ApFqB#(32tEd`fZ>voLS(+0 zxsdtOnN`psSAW;$d?eq;IeIBckXiu1A`^$vkc%Mcyo2~KY3SU#ul@iw6HKpbjER+dSfh;lY7ROl=_!7x389K)FA# zC7c==k;FO4gNrz~g`kLCq+dmV+vdooQKWkNHgmGezlPkmQ^?F` zabyJ%(Zl;HyFRc0+*4iwjRJ$+{A#+JfK2R|v3TIa9O}!JJAn+uNuJn4Wv&{|9%gop zzaUTkC-G=;4u}BFSa09#2c3#&0t3iGV$N#V2QY7 z4%pzK;SMU5ON;7<&}sg}pJx{gMnu5W&oTd3nd~8nbJeQr*Q-_W9Tt6y$wMZ8oe7;g z(k`Xsy??^Tf6C<7nEXp7|C-6aVe(}rWMhJKQj#G-xD@||$$w=cCpAbU=sv)Us~TqY zGBP$IAnj?}vM$*cD)`)hZ~KJS1gWgYdruMP-m*8VP((MFP|Fk~6o~MZ)GIdWf<;t9pUnvHOK&RIlk63-E)C%fUK>{~Uz)aRjKA@W}Yr7_ckI1i9m9D~9voEl^= zr8OkO$DuBGJ=1gIaQ7f4qKnu@&w<_7OBN#a^CZhA2MpTCy?E3nQx}q*{I?Xbt)loH zR4%_Jew*L?2PCl(;6GuQjG%~Z_Qjl18wvRDKy_MI z5GE+|hgt0ilcOxndpKt+y=H+tQmSMO(nxhC6-P=LcZ$UfgbXBCT zF(Gl0=P|{z$i>B>1EhgGpCO)Sxs9_xA;6}EV`!dO#lcTRK10g+4ZbX020?7BbVH@R z$-}Ks$v(lRFS3HAqJZQ{2epCRm`CoSeL_f?6dFIGo4H4VSGMa0KAYc0$xlTftS#wz<1KSfSYJD@G`m_ z_-=X+@V&GJcm-_*Zlm`BT^a;>Gz2UW0R@$T6&h~LB60o+9&0Dh2m1Fxd1fqQ5#@I&-r;5BqD@H+a4o@q-)FuI;@xY6Fi z=|;L~ueBvBvU@DsqMJ8ay|;KXnPn9=4-02-uoRMr2M3*S=t@ya91>+2h}iL*s#mMY zpyHIHu1hpv4{&v=p@5JMov(#ib$3`9~!W`!tqKa z5yx`K7mkpSi5w5clO&Qu^#rzH3Ivj+M23MEjTK}fs&QYTaQ05GTJy!ab%lb1-@w3t zBdfJAN}Nb+uZuW|Tl6NOFP-y><*)!j7;_^*GQzT!Z%c*O^q>3|N_~m&YGIOc*RDF{ zEu^kkzBMd1Y_0C^FBCR~Rbf`@411%(sn-2O!fO*KtUe%TC`^W(daWj+mFd_Ici^?; z#ljgCQH*6H3grS~(+IB@3CHub81*^lAV9)|Vns7sec{O9;MC}n3-t(76&l$D-y1_p zVFb=ak%(&{95G3np1IU@2P^3-Ok%TJy|yY`6ow=9+6E+Kk_;(d3WG!jbulRnVNSe5 zCZ%B%hg*xnBrJt~JXvn&gOX-Es7zKGq|&e`jnqOJB$MNs#8gK;l5P@)t{(;!HMfyK zcRF?QAuZabSU94%UXaRRJuXIh^8_V*tArtqXONhB1{%-Yxo`4eGjCfd5?&%`@)0x6 z>sqX7!lRnN)Vv@JT(6!Chmk}j%TeLVpd6~jho?tX$b`YnuHlsY^i3xfh#AUGCp;C zKGsaS@by-~QlBx5Hd%GCQ%SBso{{G6mVRkClt`FdsTmnHs~V09a#5{SFTm3LF_le8 zI>akwpHa`2!+Jons7Fk-$3nQMauKO)`jGubtRn~$w;GZxOH94W5ZmF0uA7}>a&<$@ z)Ki1FMiVn?_My92bxqMypHzE`AlEk3TAsHyznXK>L=Ancm<<6(R330zFNER*y)zpV8cm znpY2EwAi%d-6}HWxye{fs9A^5Rbh%P_Z#gc4cn;u$O|eW%|?t^#$~Cat(xI!3aFmL z%E<%9*V$rc4Tp|NhFP`zteI*C_91*r4;z(hJUgZ9O_Al@#>$+kjLqq#r!}=HKc{(2 z&8-JWr|z@bKi33Jb-sZrKX2^h{IE2FkbJ?Y&N2?UBx)i+ftJQpVd`Dp)0!ZRNT9aS zu6!S>L1C%(deETCFB-Y-daV+9BwDFgZ4HY2l9A|{p6-@dv=Mzte!1b2J_*onblWmV zyUI67@+(GW{xJHQh+K3MpW>GNGLu^?0 zXuQh@3}@+(36?vg*#U(+Vi#Q+@on_&2uGcobqGm5X!IAOU5uj4)2yHexW1@B6FoVG z8>;gSL;0*$vQ+G2l+~U(J{{kS{fiHWb}v ze|Xs#SU8*{HMen}G5e>vA63V6o;+v_%^&q5>0#BLABS!rDk08BTnObWhCf$gN0-a8 zl!hiwaGygnc-73dUa`OV<Fb`@zsFD+HW7QHdxyh zZDqTxUG{{H_nuuWVM%6!O;~#}wl%@_bFvTE@e)JbpFLn1&i2A~PK+{pt?R5LM^@dA zPREnaw}|g=yT&S~A7*>=Nj|am!15kgnQwWJ+@wF{(r0hm#$I;N-g?k3mJp5B51#~9 z7XMB7$4dcZ@3+iki9KN*0jIUOT{iIvYr-zGc@XW*ZX9PToI?zy>(z!90Iq`f+uEQA zwRzU%_zc<3$c8c-&kYVP!`H{gdvq1DzJ6r~(X~)X;o!F7Whl(J7|2pstja)QOI5_0 zq6kLgVxljg@lfbRRP^Ogu{MU2G+5KOs=pZHBVuLED~+IL;$pL@6sKpauQsOI*H=V< zUL6g@nDSZu;mdZnt&VfD(OH+fE&UpTKXBn+?mc?+LUy19j$~7th zV_gy|n|?1%EhxGkQ>YB=MRwmgl}8&3FY$KvA}_EP z_zdA6AfASvw4?d6mozG{Jd;$9#KZ5<0FJyn= zN3uWjMeI-9VSnI9vETEf+3)xWRH^4{Dp`0?!L`~>zh zzJfi?SF)e-KK2t{WIyKp>?yvAJ;_(IC-@rnIA6;i<0rC5`AO^%elmNQpTZvEr?MaM zb-5q%)7TIAdiH&OI(v{0um|`V?0$YG`yM}weV1=w_wlpYclbH%+x%SiEq)&RCO@Bj bgI~bzmTrQ literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/structures.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/structures.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75c4e9623d09262fdbbe45a3c99127bfd1d9d8f6 GIT binary patch literal 4443 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/utils.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e88ee98e195001fe9d4561446136f533719d76d GIT binary patch literal 24374 zcmc(Hdu$xndf(1tcZbX6L)2ULwa2n$iZUO1_#xAhEQz9Q*)k;$r zXNHovcX{J$x$R%hMS}hn1SyrY$#t3pXq%)(8>B^$6fIJu=^qKu0rE!^6s?04Es`KX zR9~yV-*;w~+_mn_4bZfdb{=QWIdkSa-~0Q{Y4r8wQurJF)s4CDeLI!TvB~;hz;{3Gt4eu$OU-h2$T%0Gp(A)1l`>9cQ&3n!}fRYp5 z^WHGdCw+72ly}e@`80LkD7@|+@?JpcX>ZgU!}*Li?oHr));sJS!FdY(9QBT&pL5=e z-b*N%_Fnd0!TG#*+B||-c@fF zrSEyG-Zk$%jO)60-FqJ;?|XN=8(sk=H@v&vP45=23f_la5zjvGZhIx1Z+deZx4beS z`Jw-z=j})pia7f?-}dIc1=J{ci(UoiId92Z#<`4{@VqKo_;OXl)x1~t8hEzgt#}{d zyyz(}z`5d?S5qVRntwm1{Et@sAPmM=!%8*CeXHXymz!Oz1a7V2tyX<^MK$hJJU?(* zwGytm^Q-l8SZUM)H(V@*Zb|v>YT$eB-AcGvsk>L=u5<0DrE1V%mHE}GJKs>Qe=qb^ zy;OC}=w!9F!p_EXUyw>?MvSQUlJb1zd*>?U5V!eSY1uC>`Xv+wxbImhslYF;s_GX8 zT6~TM#o`@2LodZ5Dx}N43R!b7Y!vIIuyV&Q2BE6d7f?2!TQ7#;O0ilA!jb+c{n2V8 z^dkp7%EKrK4YDG`OX!{gid!Ziq^`OG<70}sH?n3=esao-_UAY+b#n*2NAftivm8$?jdi0=UYx3$>&Ep|J!hvvYi+lY;=dayV)ors^NE(RVYiH>v}Zjq*Ud14 z`)tef><8fMd%;iEt+*tuOV;hUFK6v!XJ0K#oo(5{IriMLH+sCx17qE8+2>NX4y~tK zX)g;d_rB+}Qg;mXK6qsh>ZLbwp5x{4Zq&eaua|FM_jwMl!`_X2E8R+ky-R%$EVZgz ze)P7`X8(*LK+ZQ`yV{r!?}D~&zEdfyMu5AU*D*VdyTQ$=Ri%J0?`fRBc>!pqFgNa1 zKMVotpwN4n_&HtYR2KT=<`O7Gfs7v-uQjtLs*Q4~dMYx;XPf5D@yIyTG{+A;G+rO+ zS3B|gD1*6C{z8;3#uvR8YAX#D3Qk1XODlf;ZGSD=_U7BuH;Pl&u3VX(nJr$sI(;Rw zfb>!R-Bn+$y;rKP`qTGN{i<%44pzWGqO9^)s-?0YnaYpSwNhAKjEoB-8DLWbq;m)Z zC=8Nz_)(kRBxI9(liVcV6xkrx@bi><6-^($H*qZhWG3pBa$}-asaL>q7W`uqptN9u z9BLt$Ym}5XQLW5PtgMBLjry_iBZntIIsVv6sk~fT@PmnjK~4yR9A8atxF`ax9Z~M&?l_zH%PrP1ZnNBbRne$8gXh zFaHLmt!=8;&}9d05G|mwXxi9?i!gORrLv*X0#;v5g{D4_7|ox!;)koM?#`-Jf7Gqa zgH8J`LF)#Kjn%5>&iSrpUA{M-%enF2)S_Qr4#@8Bt+_#rO721lt-*|4vK#4X3&)b) zgB8DAnXmZXXuB)$c)l}%(Rlm8h^2O8=!)Z)PaH86At*Da50kvzhQo*W1>^{s3?O7m z+1DUq;kj@N4UrZ!t^20xX{9!d2dVW`D+PIHHYYSh0=HCmHDW>d1e8a0T^6%u@scTP^lAm5!jmHbqzHdWb+~3MT)JmF;Zp}VOt0}g0CFqRy=1$<|z2mI=EnA_;}G9kE=0ZhVsv*_{fNsoQ# z(L|5i&|`l%fc|dk{#xL^tA;AHFxDHX`U~irEgiO$XDRfs9b*~?o)HgY3>NNRIK_C_K}5C zl$nPpt2ZKJu5u8tQH>g_ zp|lyE8+PZbr3I;nF|pdnxT{sJ(wbX^fOf-%#?^8ItiBv}4Sd|au&HOc$Hotjy20uS z88qHht&+f%Uu)bU*@6~1%AjLd<7AoDYGen#zx)N+%E*v9iIY0R!&w|6v(kumT!Vrp z9s3@bzJfB)zH^`-E0I=dOiqC;O#+JB+Me4pA|WfVAL*x$mW%LioKuX z;Rs)my>Ll-P}97#YNdN4c4Rc7eAoy}Rn9SHDH<$mc~@L%P`hc=WqjRq*n@#W*Fu{B zods{_Ofc9X!?w*Y^O>A&gE^ZS`>%32mJb?E8nr(*9}YRDnMeI08)anD zmTmN#>KeK`UnZcEzkXb_srVG|E(CpUK+AxZU_#?CK`H$$a~>K;J?mMX{VC}4oM<4; zbuaB@s&>s@w`=M3G&BHnJ=4O|ThFX#n+|#+&1TV)6H~Ucc08eJ(vQ}5q+Upfm}Js0*u>&SyzKWODPsEruwxmM3o|HeQo_W-uGjlo`BvZF6iRb@Q}f^y*TH3Z4Z685(y zzPV2OBLkX&Rs!yCjvtPU`LAKxi3QO4y%lxpU$S$)!Tfkns`(7mcda8AIoxrrWd*0k z+x11aL%(SmbTlwS#riVM86kr|0~VzwqjV`KS1Kxv8+9IsksXTI9A#t48(DZ!)GHrc zJb&Th^i}l%>)vD~dj$eJ%3*k=x(Ay}MGiDIO{W?E9(0yKRDWakh~184^UWdq=|)B zg>Xm)$!{dvJUpvlX;Ka>z)+{D?F%2TmuhW+q$!~>w*(0Rj?PC~Kt421eDMf>4~g5fy2DpgI=y%NS%vS@lm)77&T@<~{(= zgg!g?mHH+MI)Fq=u5Hcz1#UElY^A`jU^PK!CC9XQe-kzxxTc|??~scUEP=j;y%s;W zT2}CEeZZrIXSK`)_?x=hs6AnN12!L8zbbD?gOB14cAE(s&Urvv?Yunc*~mdNNz40e z*kk4fJbvJUCOui}nRpzq`GPg@O>o5TY+DCUhV5o=^tJGAt;u+n4IXpfg07RfnmUpS z!n@FL`0oaOEE}<#zj;MlJZ`-K#sL}xMY%-$*o9JsQSVkO%RZ-h4YGUQhXxH5z^(bU zIb1^nDY?zciYU@0RbB)S6s1D&BB3s+R;PPKmC7N6f4Q-;mS`_w306=z>eByG4SeZo zX%$9+($)eI47xvEJ)Vrsg_~!wR9~QxKojAiF`@2Y7H422w(&>#DABCKUTRe8Q5K^V z$_IZbCfC_QW#v5CfkX76+a+?KV8<0PEZ%q(74?G4)GFm7H7Pg<6x8s@R#1pW9F4Bo z_~WCDhD?-M0kkUjA_wo%EXN9KD^Y(N2t{Ftd5)=w&+)3@QeEi1Bd*NxuK1p`2>u)& z7L4PNPuu1ov;puD!?gO1!G}4AdPN@hj#Q%_XaD;%GzRO)q6|mE8b=02!^%NE+t4)qEy2H+r-q<2$`{Lr``> zsHPM2t2;oxi4Np5KqgR}bv=saFt_%mMo#qBOQXO@eFC@1NTxY+wY|<0s&XBD*qhSYYbaF}C{z zhbUWH1|8H^;(0|MtN`Kb$>jH)1z(!JM;{VZPPC^!JCcqZ4p6E(u^&N2{h0D1T$E*1 zS%H`Wa^YU;^z!QQ)2=?nF!tg@f<3q}Ki-GAG>v{pjVB)sVs^pUASI+$$9(eBX_ijm zCkR5L6ABjs17vAXvB3F5E41fnq-_t=kP5~p23%24#J~=$QWlEIES#EztLEOgg3b>o z1|bifoK|}UT0bg?E)OIJmnKQWrYQ+IZd$G5?zK7;d}#Q(MZFO|rd6<7UK~w`y;PSz zwm4cxU4MLGd{nywCMP%D0;f)$5=E=H?5`E!O%$)`!4D1&<9>M59Y)dc$gL6Sk8EN~ zpFg11<9i*}p3~vY-e$qc{5d#f+=DfGFklRkcfxyBb*m+~ZztO?9v|QIGicWn)saa8 zkq{BTBSfc2%Pp>JK07)lT4vDh>+!?;rhN0H{^s?~LH^)RmQE)Xoxqb@p(Eup4`28j zjBg~XM21seQ++r@_FSV;RTI3-ZGN<(=KDE3;g}qF;=0(~Ht`&9oz7uWK@M%4A=?Pg}V&}r?cq3lMF0Q-WI69n;OP3 zzuT^;sS-^Tx2${xKORvrzogvSYBj9TNf1_Q91KKh8Oj6XsE&p)W(gmk$WR5JSUikb zz%kZ+g-x}=er6ufa!!1L<70pYBI5!>b9V2i{3z)P~hEa(X0)rS}9zv*XSS7*P_#-EY zRW(&TC}~J(GV18MrOCb zCfX5)Pvh}Xfmnr-$C;~phz9<2r|TFo%)N>FwqS+rHN6ZSn+~pZ4y&aZv1f+fcuN zf)0*Azf7AW+`~;}D@QoCZo;)}!W`V@fyP_r3DUQ@!88!-feEeKV)!881h}#__lSAM z3tk#L+&>C}R44a?kKKh= zI6+-vJGB;MVvsi2fxMk@CAnaQ08VEg$r|HAng>U;Rs^Yr9*OjEpTi@guDq6I?H5CF z)MNm$4WtGa!J~R31`A!+CBlh{ZQ|FyJp&W^>-5<1b(G&sMu5j%BV0_2B7?i0OuFoF z{fDPUzUlVg3N^B4_Xkp=yjwt@=#wmwf``V*Ed;547WfYG`Z=7$I#=Iifi3i=ex9ZO zn1{zXdt!oP&oR}0OoH2i`u46o%p=A%2Ziu*FoD%C;X#LIoXRJOZwkMFQM^`4jZs;I z=mkNw#qOYIfrQ5D7W^de25piU2+x4C492aOAxR<9Zn1|ATrq}@a}SA>Z9rbR=6}1U zlQhV{V=gL;1`_Jv6-H|U#QQ*VF~bx_+`*A=9El*IxKx5|g=$w+d4HOu|j~J9dBmFLz{ja8ijb z9o*DHL3>ge#vwOtrJ!3m)UB4t@ysOyJP+v?m=vS=apKMw8lI2|*&1t=fO5&5l7yDG zN~%+0m6s+rA0<{Y;1j!Qpr0@gCJ<@a39L3r#1If9hj=o}OHr?GCTTNKM&EP+CE6~S zFE)~{fMlCrBarCCv9k^x#isgY0*IKN{PCJV60D~!1?7{mdB!b`=5K5QV=DPzE$JT* zogV}YKmne6@_#)(s%Bv$27;FN`hk4rq}K`lmc}>FzsAo+qzlG+d7Wp!;otj=;$|>Q`{;z$#)?8>?n<6C!Z$!GH1qx;Q=L z9y}>b=J^Z`V!5~5_js~lducd#nbHIA$^&4aKJQMotmKOFw^>cVpJX3t#ED}`aa1@~ zeY-%fBgT`^>*=2n?P&`dcJ`;i*Zhaj^OO7$9i3&6qFq&IZY3{G1Y4{>kGto=HEIpY zLVC}rN;jbQLBG{Htu_kanJcdbOnGzhzY+wizWeOaqc6Wa?j95-76)FFl#fQ8%DC2- z8wmM~k2Ie-QA1o{{Lt(0@DrC*S;-zO!lu^Q|u75DlI4p`Ggx(RCd$Rxk2F7RJ#E{C(s>L zgb$GEIg+aLmHKr&?7&`9d0WH$3EYT?Vz>d(9}2n+B%v_=qcuZQJh|YTz*?k-G2D9? zVc!gE@vPoN=r)5|*>wk{rpEwqPpijsApXwcnceE4INUH=#QJP2gJ;%mXr^0AotA?D zZg#_ZkOD8>!?4FZSx`^&XA>GoFpsiDtR>+YOqA%L3N4wmVie0QT{IaJig1Ot#h~M~ z>>G9p#pKssL%s@xWu8rJ%FZ1rtH{bwBe^J}hZtqVCW9+F9);v!B3Qt81yQd)YcbF-nyX~+NRMfG7+KIF zwFDi&8~l64#(WW3BFJU^8dAk}&(>GP+QlCesVFUT&OV4$1Pp*q%o77*AsJy8f(Pcu zj-h@VRXR|MlB6w77yA@4Fg8N3FpN#RxvNVBj>oNewkVBg!Cr z!5JN$|1*p*#RT0n2&Y6=>Lk-og$O+a(M~`IjwMJW_?=2s-K$ayXo+yLlk^=KO00+| z8`nVQ_2O!M88Q4j-2i_I(~c1$NW*u4GY2ck20#`!vot;bNkW};Vt&l5InoH-(6lcQ zfd81Gd0anIe}F0-&?k+wp-;Epw*eD6?U(}-^x|wR8)`s10>PFg$L_wdoKlBiq+?!M z#_kl^Ct=OISCIR*Su5Dt4#`_h_ksWwF$7o?ZUAfqsG(Pt62(Ed7BWaAi3)g_A&Ww4 zbzbTw=}Z>Vn7YB!OPCgQm*a%RpuhqlMZkh-OOCPQEA?Oa_24M&KYl&6(kc7`GRLjz zlQ=+uTT8aMF->)#nGKo$2RFxkWbH^mFuV4g4hTYpac|L~!79jHkPkmmo%SCB}y>iau~Ksow5}N_pIN z7U>aQ?C3Z$?#9eRtJLvZg|UcCIXaHOB_c*L4EhJ-$f3)^cudj-!{(4fv1IEszM4Pt zShX&0u9--J*KK#j|7)#I2U!0TP+=susbHypjsjs_>Ob;I;zvwgit^Vq0ZM|9`kX~Q zv*5>a58nEpSuy}LMp!)I6M_0YcJeru`dDBbCqnN>6FaXpD?5|3Y-Hs01GW31U77X} zqv*`E`LC$fJbUKs)Vb;NZ@hWot+y|}Gjr+kyH~ExUVHEQ`!@=uxw7ZaFDzD;maDaT zW91_igsXS%-dk%PK63Qfi!Z(W%JEmn#*5$TAQS2l?NmK#aht+41fxLeGz95=6HNFW zvW^zmL87y*TX<^S$MP+>D&8f7evne{f;f<9+p@g$eZ+QU2>}yYGixu$(eMy_t zLegQV;LO#j3m3FS6vtH)r+VU-N~HWl;8wCBXC~dXD<9&0LwrN`&{O&lRsu&#HA4B5eS9YL$qp zT^K}0B{Hz&pxlkZLy5C`wGE^aahLt(GDC2B?SSixxC*rmnW6h2q=t}Rs{RxeIxwz- zF*AhCY89)%q`6I7q0j^IwSEQo%MxDO*kPF zm=m`@wCMl~kUA^kPBm5+7BPQ`e`!K|U~YM>EZH7{3ka92O3VqU0*|ZoDlr@eR3NS4 z_y>}~j?{sSgo(#-fn>&;JDz#=xdYD+9~?RK!sx{0YbRen{lTqoHMgU*yAWE49hByM z@R?q~NWiEFY!v(toT6=fDh}IXjN;Lbb`ib1acTEN_EG{NGKEEAl{L;F8J>--9n7AM zY+qyns=q){hboapL0gzsagzvBouY>2LZDgl2Y4NjIU^AQd$UfMMurDO?S0T_To=h@ z+M9tM&_b8C(x++dnLNXS!*QARnce)KVz;*^5)=sUqPx~urCYGf#Tm>B!4zJ&jP#Cb z16kF4QgV@E$tW69z~^wOh1c}GQVlMHNf0sDf&{V{M6ya&5D_@?>e2BdFCQO2GJZtU zG-U18(!&!+Ulf!O1C58IoAa=Lbau)Q(a+(-3Ivj8|6fyjYB<{d10)VMP-x!nXRqg5~i@WMNT$$Y1qy=3ot9RL{y z)B^)K{Cc%w%;fPk7Qcp8%5o|=fU~`9t6`R6#Us;#lOB*R9K!@QJYZrkW!7GA!$f*v zE7*YV30&U8x;r>W&dj^z)iolcp82&LqsVw{GQXTs+69^Afydp>W%bW+= zg8dm&JS3clK?}^=+-2D5{x5lNTMEnSI~h3fjcQ&Qzo3Z&Epepg(H=C_P@K^Vc+z3a zyB1tz&Apy11Go;c3!BiARK92R)02XAEi0*;Slp<2BCh#LQWLY;t_O?AZ2k^bE(+wg ztd~PzQ$yPwMyX^d4wK56M7Qb>YZAT6oC~-^?^GJAfewX^x@#4`>WvDs#%$8P9KgEQ zzTnQfFh=o!tB?dCIQM_e2;!+n3^pDIML(mWqpsIrAdG7!XFy(W0j8?R!)+Y2>p*{n zc9iwWXB44RGHW>MX;eKOf9;;|US@a1qxuiYbi)w_39a)kxp0n#Z@=k$Np}EN;9!S@ z>et?Df(J9~x?zTQGczE0C^EJ|Ym8hpE0d-*kq?VPBVYI9!c)E^Ux@Jl_JY7XmFuE|2(c+6W?vmgEf{umJeA4%QH%EAt)f8v!hJ$#WGN|+hKVst(|b}efG4<2%SB3nMj zoPd9sNEmM({Od-VtTTFOxaz;N8)LL-O@4Fz{K$Y_#N%*T?`C4P@L@_UVUD7yKwu+7 zLtRH}diuP8i4j6fvY=M|5r-|3-a&$qmYO|kiKV;HQPe|EsfdawpMa}~r3B(j$F2{N zBM%`-qkax1*4FvXSNP71MxAaBu=BB>{)Yq;!$RN$HtC-0_TY9kGZq#`Kgvm&US6F; znfX2Q%S=xON|^)E!25if>v-rc1BgF<@=H4lr@N`1#g}yG`kY>3rSJ}Vd+8vgu=vbW zP6bmN8uxJo8$Yv!GTf55yXo`W%2E>y>(sE?Vd&2dfh16b!%#GTaovV+H)OVJ*R<>k zA%I7e`)Lbsp`$sUfkPCYyzcMeGyddz=m=~XE7oSd69pjno&k=yo16}JjG4lsp;ZDt zh@3jK#6&ZLE1bcANT`Y{14Pcj4v|hrGBRmV zHhy`sVF*l%oOH{)VJw7|YsMnEMF@jPUD{4Q5D00adVw>$AMbOp$UO)DLO&E8CfL|t z+FbUouTAqy+g4+ob<}VFQ3AGSJ;aSxcN8Q`-O%|NOIREZg%lpFB@=UqMmPib8Br9fyR1#KNLeMCfICQ@ZqB3`~qy zgz**|Sjd324ar6VTY}h0zC%2pqRharFke|%)eDPdhAZ_IE|hLi#c5Qb3SkixkcJ3B zRaRCpC4wmSSxE?8JQUa>roDB6^u|>W=waqk@$!{R@84j*R7h81?Cf}bkO(x5k?}C; zoYsrOfm4^^I7YIo7Z?3)pk$2Up~BiM>PVCBSy;?I?0&>fkTy&}Bmx>=BlSAik^ZJG zCw7|~%?LA6&k?(y#{mnggcS+Sa~*)jd7DeeG{YjZiE_}`;CL+|O>?A&J9r34)ImP$ zX^&NRCB2C7=&k#A6CM@~#5^-8P%rRpUBodE&w5g6n)E>iJ=mK8eK2gwwK+qO30!}r zUPK=c2XyY^SUjqrLz<()W+atg31=(V{k*wLGx$p~iCXmmrf72o$Oo;OOKu2m@~`;g znG=SrLYNS56nITUwRWM@U`>^8rXQYoKNa3YHhgS*YY zHl6Q48GVTNvE_$$H2fqqT<~7I`Krdp*ddodV;m!cTLrGYVEi%L1nEIrhb9g+bIZQJ zG6q8o3$5&C?ixlnc7~tY95^Gp`HW4+yZJ;JT@dA_8uhx)a)*KN1jZ)Ak9Na6S_7Bm zKRWl3ih(CuorXi--ar)nfl;ACpJr>C3AbFV*oVrFd#tBNU(Py~<;C{?rNmN)3Z93B z7>^5XKSz%c&i_fW;uhAKVu8VSNuBFy{#qLynM+N+2d={{wyKr-a-1@#87!28m}|*C z6BqG((mlcbm?kH%AZh{;Ghph{iobB`H6V5Mq!hd+dA-O0t^xTb_;mkh+(=q6PPVlX z?_XmytfNV%zSGVNZ(8o~eryEg9y+0(Cqgj%BI>KKhi3Z3DO8Yzj*+y4>?PMnr>SnR z?&mmQHOWuogv<_nQV{jU5jz@}SYmF$($vi6w^#}5N$Sh$-?8n#=b?+K3<>m-giq;k zl_+)yb>S5@p<{xV3?d@6gEl90$9@Yd$Hmi6XTvTl4}L>K4;pw%eaKgw$KeZf(utBR zXzP`~iyI`d8ai*B<^$~={LFbKYasoV7AT%e{tn8S4*P_*OHnGRuPB9&c?p}kpv8!n zWs8kW$jl&UamWlZ)r+$6l!;a4rkaud*cNFZA)iipIe81WBit;Vq1{K@7&Yd%jG+hj zH@&{31*23U%jUiQIN4yJxwC`IBy4Zy3x0Pq!=#L3N7Wg?s@WqM8e>6aLFcH-!y_+i zr|<8uy3{!G@)*`Q6HD6nRbO8oJBml`%c_rP(C?#Ols|jvo#M6G^T&=BFHUd0J3AdY z@w4OY@*^*At%bX@)2bH(jMByWDt1A^&Sp3rjnBsrxwo+mPzj2kIMJgXKGyE8F3gG- z#xozKh>zV!uqvPBYGLd)V(h_>Qj1z0@A-4MCjqP$u}x+$kPh2~p%BI*rtk}@IK;^d znD3ietV#e&TF)>?47p(@ybHNjF4*15wy?v=dXC-%#Tq5Gu*xKq zL^JD(H9a&=&j@FM(oXbKi##ymr-pDC=@lNq4Jqyx^`O+#0Joxs64~6^LR;+nSU86k z+zSvMR4g)PCLvy|d+eHZ?BFM#9QRqQ%p+dlW8M6};r!EM;2>IWI9AgRbWjRBGpGW-gI;d7Vf@Py8d=39m=-rSf;(GjM zGK1VCMZmjd7Z0Y4GOH5M#-cJTh19zRa0c3INpvn>oTNu3g)W9sh87VN=??WC1Pd6& zPp|xdX-iLqo|TL?r3O#{Ybovr9)q|e*+WD;5YQb&3zgY%K+Nu_tbT?5BSaxZ(jZ2!<*`6{nnx9S|2{w9Ox?OmIlgSb-74RSETB=6p+rr7&S`6{YO~ z|jb9zcfSfnXg= z{GbM5B|I%aW~~C<*qh{Jj|x*d5X``onaAYmh0%M8Qx~Vt%oN|8K67sRO7Y6{8`JL> z&)%4wj&?up$<^5_>LoV*1`mIP19A}YCNP%YV2P;lqL5hFPof(;cS?9RQ81vJR6Hy? z{8M7+KD2hS@KzBw!4KfQ!geY2b7vkQymYghACU96xj&T*%@1y7h>8jKZ<)b1@NR5w z!!l&OQ;R^(Jd;0xu!3-Sj%`gmJLc=@=5?9ut*k*OC+Yc&`CSrWkPVlBEOEvq_0R9e zgcY>hSjnU3NmIV1{gW9bTlr{ioYgcg=AkfZa$H3PPF-OaS9$27`#w-QtOJaW#GeI` zN;q~$#lP2#^bH>giU5CxhoQo4-?Rvo-O*;6ubsixF5J?0x(BdvZvk&jNGj?t@_KUv zHX5ONFQ_BDdKw4B`UWW%=^jCTr*t0mNHcCS*FCXF(cmzo-#wgGvhseL2{znnMUw7q zMGie;oEJy?h=H_K^%6^#xC5ZqC>M)b9n6s_LXcrcPxS@|^cD{<^6*zYFmkPajE7Hn zpodv~3kR+TLTZz6y+AfiDCB`~=;oMgjI2PxDXm$MCbeX9*l++z0+?@P&_eIS4$6uc z#{}9M*+Y(%e~t&qYZ2cHw`X8pD_~I`APP@iTdM-sFmulER}4YB0EXQ zf_+(|tA2@1zRSZe^YAM?{5lUzg4aokO!Jj&SIGyAdSJ9Rk)4Fy(*A@`{*;Hm;K9P+ zB)vf5^g8OnK;fq6O1!4xCKAVlcoD>sLqas289t+R*v*WGw|JmFE^3kK%(&JLXSIzvv*JRlp+ r+Rh$lmptjU_n`jH+({>&+n0O7>B0GV8H44x&Np(~@YHg4=C}PH^3ZN> literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__version__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__version__.py new file mode 100644 index 0000000..e973b03 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'https://requests.readthedocs.io' +__version__ = '2.27.1' +__build__ = 0x022701 +__author__ = 'Kenneth Reitz' +__author_email__ = 'me@kennethreitz.org' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2022 Kenneth Reitz' +__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/_internal_utils.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/_internal_utils.py new file mode 100644 index 0000000..759d9a5 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/_internal_utils.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" + +from .compat import is_py2, builtin_str, str + + +def to_native_string(string, encoding='ascii'): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + if is_py2: + out = string.encode(encoding) + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode('ascii') + return True + except UnicodeEncodeError: + return False diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/adapters.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/adapters.py new file mode 100644 index 0000000..fe22ff4 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/adapters.py @@ -0,0 +1,538 @@ +# -*- coding: utf-8 -*- + +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import os.path +import socket + +from urllib3.poolmanager import PoolManager, proxy_from_url +from urllib3.response import HTTPResponse +from urllib3.util import parse_url +from urllib3.util import Timeout as TimeoutSauce +from urllib3.util.retry import Retry +from urllib3.exceptions import ClosedPoolError +from urllib3.exceptions import ConnectTimeoutError +from urllib3.exceptions import HTTPError as _HTTPError +from urllib3.exceptions import InvalidHeader as _InvalidHeader +from urllib3.exceptions import MaxRetryError +from urllib3.exceptions import NewConnectionError +from urllib3.exceptions import ProxyError as _ProxyError +from urllib3.exceptions import ProtocolError +from urllib3.exceptions import ReadTimeoutError +from urllib3.exceptions import SSLError as _SSLError +from urllib3.exceptions import ResponseError +from urllib3.exceptions import LocationValueError + +from .models import Response +from .compat import urlparse, basestring +from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, + get_encoding_from_headers, prepend_scheme_if_needed, + get_auth_from_url, urldefragauth, select_proxy) +from .structures import CaseInsensitiveDict +from .cookies import extract_cookies_to_jar +from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + ProxyError, RetryError, InvalidSchema, InvalidProxyURL, + InvalidURL, InvalidHeader) +from .auth import _basic_auth_str + +try: + from urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") + +DEFAULT_POOLBLOCK = False +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None + + +class BaseAdapter(object): + """The Base Transport Adapter""" + + def __init__(self): + super(BaseAdapter, self).__init__() + + def send(self, request, stream=False, timeout=None, verify=True, + cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + raise NotImplementedError + + def close(self): + """Cleans up adapter specific items.""" + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session ` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', + '_pool_block'] + + def __init__(self, pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super(HTTPAdapter, self).__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager(self._pool_connections, self._pool_maxsize, + block=self._pool_block) + + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, + block=block, strict=True, **pool_kwargs) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith('socks'): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs) + + return manager + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith('https') and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + + if not cert_loc or not os.path.exists(cert_loc): + raise IOError("Could not find a suitable TLS CA certificate bundle, " + "invalid path: {}".format(cert_loc)) + + conn.cert_reqs = 'CERT_REQUIRED' + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise IOError("Could not find the TLS certificate file, " + "invalid path: {}".format(conn.cert_file)) + if conn.key_file and not os.path.exists(conn.key_file): + raise IOError("Could not find the TLS key file, " + "invalid path: {}".format(conn.key_file)) + + def build_response(self, req, resp): + """Builds a :class:`Response ` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter ` + + :param req: The :class:`PreparedRequest ` used to generate the response. + :param resp: The urllib3 response object. + :rtype: requests.Response + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, 'status', None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode('utf-8') + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def get_connection(self, url, proxies=None): + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + proxy = select_proxy(url, proxies) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL("Please check proxy URL. It is malformed" + " and could be missing the host.") + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. + """ + self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + + is_proxied_http_request = (proxy and scheme != 'https') + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith('socks') + + url = request.path_url + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter `. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers['Proxy-Authorization'] = _basic_auth_str(username, + password) + + return headers + + def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + try: + conn = self.get_connection(request.url, proxies) + except LocationValueError as e: + raise InvalidURL(e, request=request) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) + + chunked = not (request.body is None or 'Content-Length' in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + if not chunked: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout + ) + + # Send the request. + else: + if hasattr(conn, 'proxy_pool'): + conn = conn.proxy_pool + + low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) + + try: + skip_host = 'Host' in request.headers + low_conn.putrequest(request.method, + url, + skip_accept_encoding=True, + skip_host=skip_host) + + for header, value in request.headers.items(): + low_conn.putheader(header, value) + + low_conn.endheaders() + + for i in request.body: + low_conn.send(hex(len(i))[2:].encode('utf-8')) + low_conn.send(b'\r\n') + low_conn.send(i) + low_conn.send(b'\r\n') + low_conn.send(b'0\r\n\r\n') + + # Receive the response from the server + try: + # For Python 2.7, use buffering of HTTP responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 3.3+ + r = low_conn.getresponse() + + resp = HTTPResponse.from_httplib( + r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + except: + # If we hit any problems here, clean up the connection. + # Then, reraise so that we can handle the actual exception. + low_conn.close() + raise + + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + elif isinstance(e, _InvalidHeader): + raise InvalidHeader(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/api.py new file mode 100644 index 0000000..4cba90e --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/api.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- + +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request `. + + :param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the query string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response ` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'https://httpbin.org/get') + >>> req + + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the query string for the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('get', url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('options', url, **kwargs) + + +def head(url, **kwargs): + r"""Sends a HEAD request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. If + `allow_redirects` is not provided, it will be set to `False` (as + opposed to the default :meth:`request` behavior). + :return: :class:`Response ` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('post', url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('patch', url, data=data, **kwargs) + + +def delete(url, **kwargs): + r"""Sends a DELETE request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('delete', url, **kwargs) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/auth.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/auth.py new file mode 100644 index 0000000..eeface3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/auth.py @@ -0,0 +1,305 @@ +# -*- coding: utf-8 -*- + +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import os +import re +import time +import hashlib +import threading +import warnings + +from base64 import b64encode + +from .compat import urlparse, str, basestring +from .cookies import extract_cookies_to_jar +from ._internal_utils import to_native_string +from .utils import parse_dict_header + +CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' +CONTENT_TYPE_MULTI_PART = 'multipart/form-data' + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(type(password)), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode('latin1') + + if isinstance(password, str): + password = password.encode('latin1') + + authstr = 'Basic ' + to_native_string( + b64encode(b':'.join((username, password))).strip() + ) + + return authstr + + +class AuthBase(object): + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError('Auth hooks must be callable.') + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers['Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, 'init'): + self._thread_local.init = True + self._thread_local.last_nonce = '' + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal['realm'] + nonce = self._thread_local.chal['nonce'] + qop = self._thread_local.chal.get('qop') + algorithm = self._thread_local.chal.get('algorithm') + opaque = self._thread_local.chal.get('opaque') + hash_utf8 = None + + if algorithm is None: + _algorithm = 'MD5' + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': + def md5_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.md5(x).hexdigest() + hash_utf8 = md5_utf8 + elif _algorithm == 'SHA': + def sha_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha1(x).hexdigest() + hash_utf8 = sha_utf8 + elif _algorithm == 'SHA-256': + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha256(x).hexdigest() + hash_utf8 = sha256_utf8 + elif _algorithm == 'SHA-512': + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha512(x).hexdigest() + hash_utf8 = sha512_utf8 + + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += '?' + p_parsed.query + + A1 = '%s:%s:%s' % (self.username, realm, self.password) + A2 = '%s:%s' % (method, path) + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = '%08x' % self._thread_local.nonce_count + s = str(self._thread_local.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + if _algorithm == 'MD5-SESS': + HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) + + if not qop: + respdig = KD(HA1, "%s:%s" % (nonce, HA2)) + elif qop == 'auth' or 'auth' in qop.split(','): + noncebit = "%s:%s:%s:%s:%s" % ( + nonce, ncvalue, cnonce, 'auth', HA2 + ) + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (self.username, realm, nonce, path, respdig) + if opaque: + base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm + if entdig: + base += ', digest="%s"' % entdig + if qop: + base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) + + return 'Digest %s' % (base) + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/psf/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get('www-authenticate', '') + + if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: + + self._thread_local.num_401_calls += 1 + pat = re.compile(r'digest ', flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/certs.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/certs.py new file mode 100644 index 0000000..d1a378d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/certs.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" +from certifi import where + +if __name__ == '__main__': + print(where()) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/compat.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/compat.py new file mode 100644 index 0000000..029ae62 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/compat.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- + +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module handles import compatibility issues between Python 2 and +Python 3. +""" + +try: + import chardet +except ImportError: + import charset_normalizer as chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +has_simplejson = False +try: + import simplejson as json + has_simplejson = True +except ImportError: + import json + +# --------- +# Specifics +# --------- + +if is_py2: + from urllib import ( + quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, + proxy_bypass, proxy_bypass_environment, getproxies_environment) + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag + from urllib2 import parse_http_list + import cookielib + from Cookie import Morsel + from StringIO import StringIO + # Keep OrderedDict for backwards compatibility. + from collections import Callable, Mapping, MutableMapping, OrderedDict + + builtin_str = str + bytes = str + str = unicode + basestring = basestring + numeric_types = (int, long, float) + integer_types = (int, long) + JSONDecodeError = ValueError + +elif is_py3: + from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag + from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment + from http import cookiejar as cookielib + from http.cookies import Morsel + from io import StringIO + # Keep OrderedDict for backwards compatibility. + from collections import OrderedDict + from collections.abc import Callable, Mapping, MutableMapping + if has_simplejson: + from simplejson import JSONDecodeError + else: + from json import JSONDecodeError + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) + integer_types = (int,) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/cookies.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/cookies.py new file mode 100644 index 0000000..56fccd9 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/cookies.py @@ -0,0 +1,549 @@ +# -*- coding: utf-8 -*- + +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import copy +import time +import calendar + +from ._internal_utils import to_native_string +from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest(object): + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get('Host'): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers['Host'], encoding='utf-8') + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse([ + parsed.scheme, host, parsed.path, parsed.params, parsed.query, + parsed.fragment + ]) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse(object): + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, '_original_response') and + response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get('Cookie') + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if ( + (domain is None or cookie.domain == domain) and + (path is None or cookie.path == path) + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super(RequestsCookieJar, self).__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): + cookie.value = cookie.value.replace('\\"', '') + return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super(RequestsCookieJar, self).update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: # if there are multiple cookies that meet passed in criteria + raise CookieConflictError('There are multiple cookies with name, %r' % (name)) + toReturn = cookie.value # we will eventually return this as long as no cookie conflict + + if toReturn: + return toReturn + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop('_cookies_lock') + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if '_cookies_lock' not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.set_policy(self.get_policy()) + new_cj.update(self) + return new_cj + + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, 'copy'): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = { + 'version': 0, + 'name': name, + 'value': value, + 'port': None, + 'domain': '', + 'path': '/', + 'secure': False, + 'expires': None, + 'discard': True, + 'comment': None, + 'comment_url': None, + 'rest': {'HttpOnly': None}, + 'rfc2109': False, + } + + badargs = set(kwargs) - set(result) + if badargs: + err = 'create_cookie() got unexpected keyword arguments: %s' + raise TypeError(err % list(badargs)) + + result.update(kwargs) + result['port_specified'] = bool(result['port']) + result['domain_specified'] = bool(result['domain']) + result['domain_initial_dot'] = result['domain'].startswith('.') + result['path_specified'] = bool(result['path']) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel['max-age']: + try: + expires = int(time.time() + int(morsel['max-age'])) + except ValueError: + raise TypeError('max-age: %s must be integer' % morsel['max-age']) + elif morsel['expires']: + time_template = '%a, %d-%b-%Y %H:%M:%S GMT' + expires = calendar.timegm( + time.strptime(morsel['expires'], time_template) + ) + return create_cookie( + comment=morsel['comment'], + comment_url=bool(morsel['comment']), + discard=False, + domain=morsel['domain'], + expires=expires, + name=morsel.key, + path=morsel['path'], + port=None, + rest={'HttpOnly': morsel['httponly']}, + rfc2109=False, + secure=bool(morsel['secure']), + value=morsel.value, + version=morsel['version'] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + :rtype: CookieJar + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError('You can only merge into CookieJar') + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/exceptions.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/exceptions.py new file mode 100644 index 0000000..7969763 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/exceptions.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from urllib3.exceptions import HTTPError as BaseHTTPError + +from .compat import JSONDecodeError as CompatJSONDecodeError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop('response', None) + self.response = response + self.request = kwargs.pop('request', None) + if (response is not None and not self.request and + hasattr(response, 'request')): + self.request = self.response.request + super(RequestException, self).__init__(*args, **kwargs) + + +class InvalidJSONError(RequestException): + """A JSON error occurred.""" + + +class JSONDecodeError(InvalidJSONError, CompatJSONDecodeError): + """Couldn't decode the text into json""" + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL scheme (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """The URL scheme provided is either invalid or unsupported.""" + + +class InvalidURL(RequestException, ValueError): + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class InvalidProxyURL(InvalidURL): + """The proxy URL provided is invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content.""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed.""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body.""" + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/help.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/help.py new file mode 100644 index 0000000..4cd6389 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/help.py @@ -0,0 +1,135 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +import idna +import urllib3 + +from . import __version__ as requests_version + +try: + import charset_normalizer +except ImportError: + charset_normalizer = None + +try: + import chardet +except ImportError: + chardet = None + +try: + from urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import OpenSSL + import cryptography + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 2.7.5 it will return + {'name': 'CPython', 'version': '2.7.5'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == 'CPython': + implementation_version = platform.python_version() + elif implementation == 'PyPy': + implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + implementation_version = ''.join([ + implementation_version, sys.pypy_version_info.releaselevel + ]) + elif implementation == 'Jython': + implementation_version = platform.python_version() # Complete Guess + elif implementation == 'IronPython': + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = 'Unknown' + + return {'name': implementation, 'version': implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + 'system': platform.system(), + 'release': platform.release(), + } + except IOError: + platform_info = { + 'system': 'Unknown', + 'release': 'Unknown', + } + + implementation_info = _implementation() + urllib3_info = {'version': urllib3.__version__} + charset_normalizer_info = {'version': None} + chardet_info = {'version': None} + if charset_normalizer: + charset_normalizer_info = {'version': charset_normalizer.__version__} + if chardet: + chardet_info = {'version': chardet.__version__} + + pyopenssl_info = { + 'version': None, + 'openssl_version': '', + } + if OpenSSL: + pyopenssl_info = { + 'version': OpenSSL.__version__, + 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, + } + cryptography_info = { + 'version': getattr(cryptography, '__version__', ''), + } + idna_info = { + 'version': getattr(idna, '__version__', ''), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'using_charset_normalizer': chardet is None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'charset_normalizer': charset_normalizer_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/hooks.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/hooks.py new file mode 100644 index 0000000..7a51f21 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/hooks.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ['response'] + + +def default_hooks(): + return {event: [] for event in HOOKS} + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or {} + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, '__call__'): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/models.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/models.py new file mode 100644 index 0000000..dfbea85 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/models.py @@ -0,0 +1,973 @@ +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import datetime +import sys + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/psf/requests/issues/3578. +import encodings.idna + +from urllib3.fields import RequestField +from urllib3.filepost import encode_multipart_formdata +from urllib3.util import parse_url +from urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) + +from io import UnsupportedOperation +from .hooks import default_hooks +from .structures import CaseInsensitiveDict + +from .auth import HTTPBasicAuth +from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar +from .exceptions import ( + HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, + ContentDecodingError, ConnectionError, StreamConsumedError, + InvalidJSONError) +from .exceptions import JSONDecodeError as RequestsJSONDecodeError +from ._internal_utils import to_native_string, unicode_is_ascii +from .utils import ( + guess_filename, get_auth_from_url, requote_uri, + stream_decode_response_unicode, to_key_val_list, parse_header_links, + iter_slices, guess_json_utf, super_len, check_header_validity) +from .compat import ( + Callable, Mapping, + cookielib, urlunparse, urlsplit, urlencode, str, bytes, + is_py2, chardet, builtin_str, basestring, JSONDecodeError) +from .compat import json as complexjson +from .status_codes import codes + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin(object): + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = '/' + + url.append(path) + + query = p.query + if query: + url.append('?') + url.append(query) + + return ''.join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, 'read'): + return data + elif hasattr(data, '__iter__'): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): + vs = [vs] + for v in vs: + if v is not None: + result.append( + (k.encode('utf-8') if isinstance(k, str) else k, + v.encode('utf-8') if isinstance(v, str) else v)) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if (not files): + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, '__iter__'): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + (field.decode('utf-8') if isinstance(field, bytes) else field, + v.encode('utf-8') if isinstance(v, str) else v)) + + for (k, v) in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + elif hasattr(fp, 'read'): + fdata = fp.read() + elif fp is None: + continue + else: + fdata = fp + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin(object): + def register_hook(self, event, hook): + """Properly register a hook.""" + + if event not in self.hooks: + raise ValueError('Unsupported event specified, with event name "%s"' % (event)) + + if isinstance(hook, Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request ` object. + + Used to prepare a :class:`PreparedRequest `, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> req.prepare() + + """ + + def __init__(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return '' % (self.method) + + def prepare(self): + """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest ` object, + containing the exact bytes that will be sent to the server. + + Instances are generated from a :class:`Request ` object, and + should not be instantiated manually; doing so may produce undesirable + effects. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> r = req.prepare() + >>> r + + + >>> s = requests.Session() + >>> s.send(r) + + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return '' % (self.method) + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + import idna + + try: + host = idna.encode(host, uts46=True).decode('utf-8') + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/psf/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode('utf8') + else: + url = unicode(url) if is_py2 else str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ':' in url and not url.lower().startswith('http'): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + error = ("Invalid URL {0!r}: No scheme supplied. Perhaps you meant http://{0}?") + error = error.format(to_native_string(url, 'utf8')) + + raise MissingSchema(error) + + if not host: + raise InvalidURL("Invalid URL %r: No host supplied" % url) + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL('URL has an invalid label.') + elif host.startswith((u'*', u'.')): + raise InvalidURL('URL has an invalid label.') + + # Carefully reconstruct the network location + netloc = auth or '' + if netloc: + netloc += '@' + netloc += host + if port: + netloc += ':' + str(port) + + # Bare domains aren't valid URLs. + if not path: + path = '/' + + if is_py2: + if isinstance(scheme, str): + scheme = scheme.encode('utf-8') + if isinstance(netloc, str): + netloc = netloc.encode('utf-8') + if isinstance(path, str): + path = path.encode('utf-8') + if isinstance(query, str): + query = query.encode('utf-8') + if isinstance(fragment, str): + fragment = fragment.encode('utf-8') + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = '%s&%s' % (query, enc_params) + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = 'application/json' + + try: + body = complexjson.dumps(json, allow_nan=False) + except ValueError as ve: + raise InvalidJSONError(ve, request=self) + + if not isinstance(body, bytes): + body = body.encode('utf-8') + + is_stream = all([ + hasattr(data, '__iter__'), + not isinstance(data, (basestring, list, tuple, Mapping)) + ]) + + if is_stream: + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + body = data + + if getattr(body, 'tell', None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError('Streamed bodies and files are mutually exclusive.') + + if length: + self.headers['Content-Length'] = builtin_str(length) + else: + self.headers['Transfer-Encoding'] = 'chunked' + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, 'read'): + content_type = None + else: + content_type = 'application/x-www-form-urlencoded' + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ('content-type' not in self.headers): + self.headers['Content-Type'] = content_type + + self.body = body + + def prepare_content_length(self, body): + """Prepare Content-Length header based on request method and body""" + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers['Content-Length'] = builtin_str(length) + elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers['Content-Length'] = '0' + + def prepare_auth(self, auth, url=''): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data. + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest ` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response(object): + """The :class:`Response ` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + '_content', 'status_code', 'headers', 'url', 'history', + 'encoding', 'reason', 'cookies', 'elapsed', 'request' + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + #: This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response ` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest ` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, '_content_consumed', True) + setattr(self, 'raw', None) + + def __repr__(self): + return '' % (self.status_code) + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400, False if not. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return ('location' in self.headers and self.status_code in REDIRECT_STATI) + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the charset_normalizer or chardet libraries.""" + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, 'stream'): + try: + for chunk in self.raw.stream(chunk_size, decode_content=True): + yield chunk + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``charset_normalizer`` or ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises requests.exceptions.JSONDecodeError: If the response body does not + contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using charset_normalizer to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads( + self.content.decode(encoding), **kwargs + ) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + + try: + return complexjson.loads(self.text, **kwargs) + except JSONDecodeError as e: + # Catch JSON-related errors and raise as requests.JSONDecodeError + # This aliases json.JSONDecodeError and simplejson.JSONDecodeError + if is_py2: # e is a ValueError + raise RequestsJSONDecodeError(e.message) + else: + raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get('link') + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode('utf-8') + except UnicodeDecodeError: + reason = self.reason.decode('iso-8859-1') + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) + + elif 500 <= self.status_code < 600: + http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, 'release_conn', None) + if release_conn is not None: + release_conn() diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/packages.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/packages.py new file mode 100644 index 0000000..00196bf --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/packages.py @@ -0,0 +1,26 @@ +import sys + +try: + import chardet +except ImportError: + import charset_normalizer as chardet + import warnings + + warnings.filterwarnings('ignore', 'Trying to detect', module='charset_normalizer') + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna'): + locals()[package] = __import__(package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == package or mod.startswith(package + '.'): + sys.modules['requests.packages.' + mod] = sys.modules[mod] + +target = chardet.__name__ +for mod in list(sys.modules): + if mod == target or mod.startswith(target + '.'): + sys.modules['requests.packages.' + target.replace(target, 'chardet')] = sys.modules[mod] +# Kinda cool, though, right? diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/sessions.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/sessions.py new file mode 100644 index 0000000..3f59cab --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/sessions.py @@ -0,0 +1,771 @@ +# -*- coding: utf-8 -*- + +""" +requests.sessions +~~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import sys +import time +from datetime import timedelta +from collections import OrderedDict + +from .auth import _basic_auth_str +from .compat import cookielib, is_py3, urljoin, urlparse, Mapping +from .cookies import ( + cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) +from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT +from .hooks import default_hooks, dispatch_hook +from ._internal_utils import to_native_string +from .utils import to_key_val_list, default_headers, DEFAULT_PORTS +from .exceptions import ( + TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) + +from .structures import CaseInsensitiveDict +from .adapters import HTTPAdapter + +from .utils import ( + requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, + get_auth_from_url, rewind_body, resolve_proxies +) + +from .status_codes import codes + +# formerly defined here, reexposed here for backward compatibility +from .models import REDIRECT_STATI + +# Preferred clock, based on which one is more accurate on a given system. +if sys.platform == 'win32': + try: # Python 3.4+ + preferred_clock = time.perf_counter + except AttributeError: # Earlier than Python 3. + preferred_clock = time.clock +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and + isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get('response') == []: + return request_hooks + + if request_hooks is None or request_hooks.get('response') == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin(object): + + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers['location'] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + if is_py3: + location = location.encode('latin1') + return to_native_string(location, 'utf8') + return None + + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) + and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if (not changed_scheme and old_parsed.port in default_port + and new_parsed.port in default_port): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + previous_fragment = urlparse(req.url).fragment + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects('Exceeded {} redirects.'.format(self.max_redirects), response=resp) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = ':'.join([to_native_string(parsed_rurl.scheme), url]) + + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) + parsed = urlparse(url) + if parsed.fragment == '' and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/psf/requests/issues/1084 + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): + # https://github.com/psf/requests/issues/3490 + purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + headers.pop('Cookie', None) + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = ( + prepared_request._body_position is not None and + ('Content-Length' in headers or 'Transfer-Encoding' in headers) + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): + # If we get redirected to a new host, we should strip out any + # authentication headers. + del headers['Authorization'] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + headers = prepared_request.headers + scheme = urlparse(prepared_request.url).scheme + new_proxies = resolve_proxies(prepared_request, proxies, self.trust_env) + + if 'Proxy-Authorization' in headers: + del headers['Proxy-Authorization'] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # https://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != 'HEAD': + method = 'GET' + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != 'HEAD': + method = 'GET' + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == 'POST': + method = 'GET' + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('https://httpbin.org/get') + + + Or as a context manager:: + + >>> with requests.Session() as s: + ... s.get('https://httpbin.org/get') + + """ + + __attrs__ = [ + 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'cert', 'adapters', 'stream', 'trust_env', + 'max_redirects', + ] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request ` sent from this + #: :class:`Session `. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request `. + self.auth = None + + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request `. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request `. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + #: Defaults to `True`, requiring requests to verify the TLS certificate at the + #: remote end. + #: If verify is set to `False`, requests will accept any TLS certificate + #: presented by the server, and will ignore hostname mismatches and/or + #: expired certificates, which will make your application vulnerable to + #: man-in-the-middle (MitM) attacks. + #: Only set this to `False` for testing. + self.verify = True + + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Trust environment settings for proxy configuration, default + #: authentication and similar. + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar `, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount('https://', HTTPAdapter()) + self.mount('http://', HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest ` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request ` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request(self, method, url, + params=None, data=None, headers=None, cookies=None, files=None, + auth=None, timeout=None, allow_redirects=True, proxies=None, + hooks=None, stream=None, verify=None, cert=None, json=None): + """Constructs a :class:`Request `, prepares it and sends it. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. When set to + ``False``, requests will accept any TLS certificate presented by + the server, and will ignore hostname mismatches and/or expired + certificates, which will make your application vulnerable to + man-in-the-middle (MitM) attacks. Setting verify to ``False`` + may be useful during local development or testing. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + 'timeout': timeout, + 'allow_redirects': allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('POST', url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + if 'proxies' not in kwargs: + kwargs['proxies'] = resolve_proxies( + request, self.proxies, self.trust_env + ) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError('You can only send PreparedRequests.') + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Resolve redirects if allowed. + if allow_redirects: + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + history = [resp for resp in gen] + else: + history = [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get('no_proxy') if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix.lower()): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for {!r}".format(url)) + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + + :rtype: Session + """ + return Session() diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/status_codes.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/status_codes.py new file mode 100644 index 0000000..d80a7cd --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/status_codes.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- + +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +Example:: + + >>> import requests + >>> requests.codes['temporary_redirect'] + 307 + >>> requests.codes.teapot + 418 + >>> requests.codes['\o/'] + 200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + +from .structures import LookupDict + +_codes = { + + # Informational. + 100: ('continue',), + 101: ('switching_protocols',), + 102: ('processing',), + 103: ('checkpoint',), + 122: ('uri_too_long', 'request_uri_too_long'), + 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), + 201: ('created',), + 202: ('accepted',), + 203: ('non_authoritative_info', 'non_authoritative_information'), + 204: ('no_content',), + 205: ('reset_content', 'reset'), + 206: ('partial_content', 'partial'), + 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), + 208: ('already_reported',), + 226: ('im_used',), + + # Redirection. + 300: ('multiple_choices',), + 301: ('moved_permanently', 'moved', '\\o-'), + 302: ('found',), + 303: ('see_other', 'other'), + 304: ('not_modified',), + 305: ('use_proxy',), + 306: ('switch_proxy',), + 307: ('temporary_redirect', 'temporary_moved', 'temporary'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 + + # Client Error. + 400: ('bad_request', 'bad'), + 401: ('unauthorized',), + 402: ('payment_required', 'payment'), + 403: ('forbidden',), + 404: ('not_found', '-o-'), + 405: ('method_not_allowed', 'not_allowed'), + 406: ('not_acceptable',), + 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), + 408: ('request_timeout', 'timeout'), + 409: ('conflict',), + 410: ('gone',), + 411: ('length_required',), + 412: ('precondition_failed', 'precondition'), + 413: ('request_entity_too_large',), + 414: ('request_uri_too_large',), + 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), + 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), + 417: ('expectation_failed',), + 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 421: ('misdirected_request',), + 422: ('unprocessable_entity', 'unprocessable'), + 423: ('locked',), + 424: ('failed_dependency', 'dependency'), + 425: ('unordered_collection', 'unordered'), + 426: ('upgrade_required', 'upgrade'), + 428: ('precondition_required', 'precondition'), + 429: ('too_many_requests', 'too_many'), + 431: ('header_fields_too_large', 'fields_too_large'), + 444: ('no_response', 'none'), + 449: ('retry_with', 'retry'), + 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 451: ('unavailable_for_legal_reasons', 'legal_reasons'), + 499: ('client_closed_request',), + + # Server Error. + 500: ('internal_server_error', 'server_error', '/o\\', '✗'), + 501: ('not_implemented',), + 502: ('bad_gateway',), + 503: ('service_unavailable', 'unavailable'), + 504: ('gateway_timeout',), + 505: ('http_version_not_supported', 'http_version'), + 506: ('variant_also_negotiates',), + 507: ('insufficient_storage',), + 509: ('bandwidth_limit_exceeded', 'bandwidth'), + 510: ('not_extended',), + 511: ('network_authentication_required', 'network_auth', 'network_authentication'), +} + +codes = LookupDict(name='status_codes') + +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) + + def doc(code): + names = ', '.join('``%s``' % n for n in _codes[code]) + return '* %d: %s' % (code, names) + + global __doc__ + __doc__ = (__doc__ + '\n' + + '\n'.join(doc(code) for code in sorted(_codes)) + if __doc__ is not None else None) + +_init() diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/structures.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/structures.py new file mode 100644 index 0000000..8ee0ba7 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/structures.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- + +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +from collections import OrderedDict + +from .compat import Mapping, MutableMapping + + +class CaseInsensitiveDict(MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ( + (lowerkey, keyval[1]) + for (lowerkey, keyval) + in self._store.items() + ) + + def __eq__(self, other): + if isinstance(other, Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super(LookupDict, self).__init__() + + def __repr__(self): + return '' % (self.name) + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/utils.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/utils.py new file mode 100644 index 0000000..153776c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/requests/utils.py @@ -0,0 +1,1060 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import codecs +import contextlib +import io +import os +import re +import socket +import struct +import sys +import tempfile +import warnings +import zipfile +from collections import OrderedDict +from urllib3.util import make_headers +from urllib3.util import parse_url + +from .__version__ import __version__ +from . import certs +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import to_native_string +from .compat import parse_http_list as _parse_list_header +from .compat import ( + quote, urlparse, bytes, str, unquote, getproxies, + proxy_bypass, urlunparse, basestring, integer_types, is_py3, + proxy_bypass_environment, getproxies_environment, Mapping) +from .cookies import cookiejar_from_dict +from .structures import CaseInsensitiveDict +from .exceptions import ( + InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + +DEFAULT_PORTS = {'http': 80, 'https': 443} + +# Ensure that ', ' is used to preserve previous delimiter behavior. +DEFAULT_ACCEPT_ENCODING = ", ".join( + re.split(r",\s*", make_headers(accept_encoding=True)["accept-encoding"]) +) + + +if sys.platform == 'win32': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + if is_py3: + import winreg + else: + import _winreg as winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0]) + # ProxyOverride is almost always a string + proxyOverride = winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0] + except OSError: + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + # now check if we match one of the registry values. + for test in proxyOverride: + if test == '': + if '.' not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if hasattr(o, '__len__'): + total_length = len(o) + + elif hasattr(o, 'len'): + total_length = o.len + + elif hasattr(o, 'fileno'): + try: + fileno = o.fileno() + except (io.UnsupportedOperation, AttributeError): + # AttributeError is a surprising exception, seeing as how we've just checked + # that `hasattr(o, 'fileno')`. It happens for objects obtained via + # `Tarfile.extractfile()`, per issue 5229. + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if 'b' not in o.mode: + warnings.warn(( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode."), + FileModeWarning + ) + + if hasattr(o, 'tell'): + try: + current_position = o.tell() + except (OSError, IOError): + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, 'seek') and total_length is None: + # StringIO and BytesIO have seek but no usable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except (OSError, IOError): + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + netrc_file = os.environ.get('NETRC') + if netrc_file is not None: + netrc_locations = (netrc_file,) + else: + netrc_locations = ('~/{}'.format(f) for f in NETRC_FILES) + + try: + from netrc import netrc, NetrcParseError + + netrc_path = None + + for f in netrc_locations: + try: + loc = os.path.expanduser(f) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See https://bugs.python.org/issue20164 & + # https://github.com/psf/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b':' + if isinstance(url, str): + splitstr = splitstr.decode('ascii') + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # App Engine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if (name and isinstance(name, basestring) and name[0] != '<' and + name[-1] != '>'): + return os.path.basename(name) + + +def extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + if not prefix: + # If we don't check for an empty prefix after the split (in other words, archive remains unchanged after the split), + # we _can_ end up in an infinite loop on a rare corner case affecting a small number of users + break + member = '/'.join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, member.split('/')[-1]) + if not os.path.exists(extracted_path): + # use read + write to avoid the creating nested folders, we only want the file, avoids mkdir racing condition + with atomic_open(extracted_path) as file_handler: + file_handler.write(zip_file.read(member)) + return extracted_path + + +@contextlib.contextmanager +def atomic_open(filename): + """Write a file to the disk in an atomic fashion""" + replacer = os.rename if sys.version_info[0] == 2 else os.replace + tmp_descriptor, tmp_name = tempfile.mkstemp(dir=os.path.dirname(filename)) + try: + with os.fdopen(tmp_descriptor, 'wb') as tmp_handler: + yield tmp_handler + replacer(tmp_name, filename) + except BaseException: + os.remove(tmp_name) + raise + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + Traceback (most recent call last): + ... + ValueError: cannot encode objects that are not 2-tuples + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + Traceback (most recent call last): + ... + ValueError: cannot encode objects that are not 2-tuples + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + charset_re = re.compile(r']', flags=re.I) + pragma_re = re.compile(r']', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return (charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content)) + + +def _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(';') + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1:].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = _parse_content_type_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + if 'application/json' in content_type: + # Assume UTF-8 based on RFC 4627: https://www.ietf.org/rfc/rfc4627.txt since the charset was unset + return 'utf-8' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b'', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] + netaddr, bits = net.split('/') + netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xffffffff ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack('>I', bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except socket.error: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count('/') == 1: + try: + mask = int(string_network.split('/')[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split('/')[0]) + except socket.error: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy('no_proxy') + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the hostname, both with and without the port. + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) + + if is_ipv4_address(parsed.hostname): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): + return True + elif parsed.hostname == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += ':{}'.format(parsed.port) + + for host in no_proxy: + if parsed.hostname.endswith(host) or host_with_port.endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + with set_environ('no_proxy', no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get('all')) + + proxy_keys = [ + urlparts.scheme + '://' + urlparts.hostname, + urlparts.scheme, + 'all://' + urlparts.hostname, + 'all', + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def resolve_proxies(request, proxies, trust_env=True): + """This method takes proxy information from a request and configuration + input to resolve a mapping of target proxies. This will consider settings + such a NO_PROXY to strip proxy configurations. + + :param request: Request or PreparedRequest + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + :param trust_env: Boolean declaring whether to trust environment configs + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + url = request.url + scheme = urlparse(url).scheme + no_proxy = proxies.get('no_proxy') + new_proxies = proxies.copy() + + if trust_env and not should_bypass_proxies(url, no_proxy=no_proxy): + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get('all')) + + if proxy: + new_proxies.setdefault(scheme, proxy) + return new_proxies + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return '%s/%s' % (name, __version__) + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict({ + 'User-Agent': default_user_agent(), + 'Accept-Encoding': DEFAULT_ACCEPT_ENCODING, + 'Accept': '*/*', + 'Connection': 'keep-alive', + }) + + +def parse_header_links(value): + """Return a list of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = ' \'"' + + value = value.strip(replace_chars) + if not value: + return links + + for val in re.split(', *<', value): + try: + url, params = val.split(';', 1) + except ValueError: + url, params = val, '' + + link = {'url': url.strip('<> \'"')} + + for param in params.split(';'): + try: + key, value = param.split('=') + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + parsed = parse_url(url) + scheme, auth, host, port, path, query, fragment = parsed + + # A defect in urlparse determines that there isn't a netloc present in some + # urls. We previously assumed parsing was overly cautious, and swapped the + # netloc and path. Due to a lack of tests on the original defect, this is + # maintained with parse_url for backwards compatibility. + netloc = parsed.netloc + if not netloc: + netloc, path = path, netloc + + if auth: + # parse_url doesn't provide the netloc with auth + # so we'll add it ourselves. + netloc = '@'.join([auth, netloc]) + if scheme is None: + scheme = new_scheme + if path is None: + path = '' + + return urlunparse((scheme, netloc, path, '', query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ('', '') + + return auth + + +# Moved outside of function to avoid recompile every call +_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') +_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + + +def check_header_validity(header): + """Verifies that header value is a string which doesn't contain + leading whitespace or return characters. This prevents unintended + header injection. + + :param header: tuple, in the format (name, value). + """ + name, value = header + + if isinstance(value, bytes): + pat = _CLEAN_HEADER_REGEX_BYTE + else: + pat = _CLEAN_HEADER_REGEX_STR + try: + if not pat.match(value): + raise InvalidHeader("Invalid return character or leading space in header: %s" % name) + except TypeError: + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, 'seek', None) + if body_seek is not None and isinstance(prepared_request._body_position, integer_types): + try: + body_seek(prepared_request._body_position) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect.") + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/six.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/six.py new file mode 100644 index 0000000..4e15675 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/six.py @@ -0,0 +1,998 @@ +# Copyright (c) 2010-2020 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""Utilities for writing code that runs on Python 2 and 3""" + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.16.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + +if PY34: + from importlib.util import spec_from_loader +else: + spec_from_loader = None + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def find_spec(self, fullname, path, target=None): + if fullname in self.known_modules: + return spec_from_loader(fullname, self) + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + + def create_module(self, spec): + return self.load_module(spec.name) + + def exec_module(self, module): + pass + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("collections_abc", "collections", "collections.abc" if sys.version_info >= (3, 3) else "collections"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys.version_info < (3, 9) else "_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + del io + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + _assertNotRegex = "assertNotRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" + _assertNotRegex = "assertNotRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + _assertNotRegex = "assertNotRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +def assertNotRegex(self, *args, **kwargs): + return getattr(self, _assertNotRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + try: + raise tp, value, tb + finally: + tb = None +""") + + +if sys.version_info[:2] > (3,): + exec_("""def raise_from(value, from_value): + try: + raise value from from_value + finally: + value = None +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + # This does exactly the same what the :func:`py3:functools.update_wrapper` + # function does on Python versions after 3.2. It sets the ``__wrapped__`` + # attribute on ``wrapper`` object and it doesn't raise an error if any of + # the attributes mentioned in ``assigned`` and ``updated`` are missing on + # ``wrapped`` object. + def _update_wrapper(wrapper, wrapped, + assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + for attr in assigned: + try: + value = getattr(wrapped, attr) + except AttributeError: + continue + else: + setattr(wrapper, attr, value) + for attr in updated: + getattr(wrapper, attr).update(getattr(wrapped, attr, {})) + wrapper.__wrapped__ = wrapped + return wrapper + _update_wrapper.__doc__ = functools.update_wrapper.__doc__ + + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + return functools.partial(_update_wrapper, wrapped=wrapped, + assigned=assigned, updated=updated) + wraps.__doc__ = functools.wraps.__doc__ + +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(type): + + def __new__(cls, name, this_bases, d): + if sys.version_info[:2] >= (3, 7): + # This version introduced PEP 560 that requires a bit + # of extra care (we mimic what is done by __build_class__). + resolved_bases = types.resolve_bases(bases) + if resolved_bases is not bases: + d['__orig_bases__'] = bases + else: + resolved_bases = bases + return meta(name, resolved_bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + if hasattr(cls, '__qualname__'): + orig_vars['__qualname__'] = cls.__qualname__ + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def ensure_binary(s, encoding='utf-8', errors='strict'): + """Coerce **s** to six.binary_type. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> encoded to `bytes` + - `bytes` -> `bytes` + """ + if isinstance(s, binary_type): + return s + if isinstance(s, text_type): + return s.encode(encoding, errors) + raise TypeError("not expecting type '%s'" % type(s)) + + +def ensure_str(s, encoding='utf-8', errors='strict'): + """Coerce *s* to `str`. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + # Optimization: Fast return for the common case. + if type(s) is str: + return s + if PY2 and isinstance(s, text_type): + return s.encode(encoding, errors) + elif PY3 and isinstance(s, binary_type): + return s.decode(encoding, errors) + elif not isinstance(s, (text_type, binary_type)): + raise TypeError("not expecting type '%s'" % type(s)) + return s + + +def ensure_text(s, encoding='utf-8', errors='strict'): + """Coerce *s* to six.text_type. + + For Python 2: + - `unicode` -> `unicode` + - `str` -> `unicode` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if isinstance(s, binary_type): + return s.decode(encoding, errors) + elif isinstance(s, text_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + +def python_2_unicode_compatible(klass): + """ + A class decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d7573c713ea2488395f2c78a97c75f05081b44e GIT binary patch literal 188 zcmd1j<>g`k0{^WGl0fuh5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;x_~erR!OQL%nr zW^%rMZf0I)T7FS_s+?a!zJyUWtBuJkX$$_;|g7%3B;Zx%nxjIjMFai;J0n1PcQI D_@pqz literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/api_client.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/api_client.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7009eee7dad370f0559d82e2172cc2c0e5f86272 GIT binary patch literal 19225 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 O;R^5i4ks~_*8c;RHEier literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/configuration.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/configuration.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd07d87d16af61a0afd9f0f5cbbdb58c222d4609 GIT binary patch literal 5065 zcma)A&2QYs73Yv#E|>cu#geQzsS4JPQEwYda@;n7U=()Z+A$KyM&zW$A_YtB%xWof zm+Kj>9c?9`Kyv9JJ@nE;3sgG#P@tCr{R8?p^uR-V=qZ=>(3{hy{kHKa#!de$bZ(-kUxEmu#khfeG3?3Y)@Me`7NvZ>Pg%_w9j!5bU||#HC@v5yr#?P%ZC?^3|?KN zeY~Q1uj;kGrnOOPRiO=)%3(WA&`XpOKg`IbUV}3VD9%b%O2}%3N+(D?+(?s&jIX(;3QGX|^?1=RJ z{CxHN8kY7&EI=%&f%4_Hd`=JrOeM>;+22ttv>+ z4uiIkX;vW`bTB`2ahkj}haD1|j;{AS*MowhflS&^px$YFFbvwsu%EV;+eyDKpz)+1 z43Z=cdf_K38i}lg@t^FqE~v00f_68QicX`o2O`5>)68ro;!b8^F%Ge_rVF8AuO z*fw44;~%xD=u1wByHA%2APRV3066J_2W438SY_qH9kn)catWWasuJn3tNsKGMG~=r z3$q)T8Z`qn1Ugh`5C3#P2u^7I=YN0L6@KnAKKa3_=lR9&UdKfgsq`7~0HLDOl;vnJ1qo!Zof_8tF87!SpU zKiPb~Kf0T%<3%^py#WS6)|iF&E8)sg)3EDD8F#XZQ$gX2ajAj>5*EP{5H05 z@`M+_`vpqwiRID4j4!Y1i7)oSE@n>o;7Z|xusHn88~d4^mUa;kz^iJUrR80h0toG0 zAqkh=4@(*u)uz7FuuKW&3yErBUnUYlXD-<;k;*=e>Xf{~Q zT(pV)Ps9Iq0xf?23QvL1e>5Zl)!vMIQ(%zmAa9+BZAqdAxr6NIi7=VU2!$m+W-w!95?bh=1j2ly?0* zp!1^+8L@fVY!OF75_KXW^LJ>{_mhr~@b5jbH)TR8(xL3RJx2%R*^>MaAH{p$t=W*vVj)3J~6z>^70$RaPs}1&~LVkiR0Lm&RGPm zf5IF^_t7bPxF0qEQy0_za&&ptOI{%1)Rh_=%7@q#Im@nw56+g!Z1ysg|2aD>aR3TJ z5qqSx5$L-6+o6iu{;Wp)t_Tr-`&aVYF=LUlm77b^0%t`{l>3}*0DwI`GN3_OooFJX zkv2oqkrXav_Arg&tkw%3A=1|SP?B&(zC?s>#aZ_)TO?ggga_L2f5vDY3x{ixwAUC#+r6!Q$&`TQD6J0Bmh7FdeIFeaQ*bA|B7LXd>*m6X)=?!%>I}C)kzQ|`;F(EQW_zMRvP&_XS;}*c1;xg!{BrJ zSA;d%*6PAt^pWk*g$!eV`p9%`^&3P<+lw?N1^xR%Yj|qxaU3vu{6MEJ{?_gH{M$Oh z_&`tC@a}JI_&-IqbKn(2K0-PKO@lkwLmEfz1Fv8b(9lK!TpRuytLq-gdyuEf{&?aw z%B?BEfY?@LECuFpazkd8Lc;3~;xHvfRxZ{#(zoM565lK`-G$B(FhM3xdbPQ0MAFpi?6G8iZ!mc8qkiC*V|Eev>#Z z63YSd(>)!QXAZfCkovio^m^p(^ggv75c!D610-{j?Oi0#TI5-K%-kEfhQ3b`l*Z@Uylc8}ef?+F*rN4c)XOiy literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/rest.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/rest.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf554d37782d9c4afeb370830ff0b201f10ca60e GIT binary patch literal 6957 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/rest_client_base.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/rest_client_base.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b796b49c57179ac8c429bcd1f83e8554dba45b70 GIT binary patch literal 55201 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 Q%E?9VKv%x2ZLt0S0mWon0{{R3 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/rest_client_pe.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/__pycache__/rest_client_pe.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff58d6212946101bc5ec447cefd0ffee7bdf452b GIT binary patch literal 67362 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b12ffdb955e78c6b51c5ec352b22fed395b8aca GIT binary patch literal 192 zcmYj~K?=e!5JgkzLIe-u!j96dh$qm6xDH7=wu5aFGEwMl+>ncJ@edyZC&s{F$v7Cu(%FR;Ye0Krh#lFM zwNs&io;3I|cFxw-dId}omtL8RYB4Qp8IYqiJ)w=DJb{$ySd_Bz<7>JZTyyPlo1gO} Gp%h=t5Hc|U literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__init__.py new file mode 100644 index 0000000..dd8df87 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__init__.py @@ -0,0 +1,46 @@ +from .o_auth_2_config_template_controller_api import OAuth2ConfigTemplateControllerApi +from .asset_controller_api import AssetControllerApi +from .asset_controller_api import AssetControllerApi +from .rule_chain_controller_api import RuleChainControllerApi +from .auth_controller_api import AuthControllerApi +from .event_controller_api import EventControllerApi +from .telemetry_controller_api import TelemetryControllerApi +from .alarm_controller_api import AlarmControllerApi +from .edge_controller_api import EdgeControllerApi +from .edge_controller_api import EdgeControllerApi +from .rpc_v_2_controller_api import RpcV2ControllerApi +from .rpc_v_2_controller_api import RpcV2ControllerApi +from .edge_event_controller_api import EdgeEventControllerApi +from .edge_event_controller_api import EdgeEventControllerApi +from .customer_controller_api import CustomerControllerApi +from .customer_controller_api import CustomerControllerApi +from .user_controller_api import UserControllerApi +from .user_controller_api import UserControllerApi +from .queue_controller_api import QueueControllerApi +from .rpc_v_1_controller_api import RpcV1ControllerApi +from .device_controller_api import DeviceControllerApi +from .device_controller_api import DeviceControllerApi +from .entity_relation_controller_api import EntityRelationControllerApi +from .entity_view_controller_api import EntityViewControllerApi +from .entity_view_controller_api import EntityViewControllerApi +from .admin_controller_api import AdminControllerApi +from .admin_controller_api import AdminControllerApi +from .sign_up_controller_api import SignUpControllerApi +from .sign_up_controller_api import SignUpControllerApi +from .tb_resource_controller_api import TbResourceControllerApi +from .o_auth_2_controller_api import OAuth2ControllerApi +from .tenant_profile_controller_api import TenantProfileControllerApi +from .widgets_bundle_controller_api import WidgetsBundleControllerApi +from .device_profile_controller_api import DeviceProfileControllerApi +from .dashboard_controller_api import DashboardControllerApi +from .dashboard_controller_api import DashboardControllerApi +from .entity_query_controller_api import EntityQueryControllerApi +from .widget_type_controller_api import WidgetTypeControllerApi +from .audit_log_controller_api import AuditLogControllerApi +from .lwm_2m_controller_api import Lwm2mControllerApi +from .lwm_2m_controller_api import Lwm2mControllerApi +from .component_descriptor_controller_api import ComponentDescriptorControllerApi +from .tenant_controller_api import TenantControllerApi +from .tenant_controller_api import TenantControllerApi +from .ota_package_controller_api import OtaPackageControllerApi +from .ota_package_controller_api import OtaPackageControllerApi diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06b5971cd1236fa49e825b9d8fd2cbd49e7f3d00 GIT binary patch literal 2658 zcmcIl$#UC95GA!Qq$KW}cG*@GTY^c&aU8FVq?;>pWZ9{jO4Sqyj3^}C00Io9;@{+& zTQ2z-UvtVY*86I-lB zco|l4jjg5d3asM>+n{&>HgSt>rEn3pafj_td>ohH4&G&VDL#(Na1VFcF2yVG1@5su z!d3VZ@3Z@aYw!T~**@Vq9H7N4!VP$cZPrfVCUo$S9a6jnU*RM6i0~?WjgQ%5!fWsi zK4DK%cpbjQr|c=kH{cmQXU|i36JFp;_LAcN;jOosz3soV>fG#QKWv?L2lBFW6!;fj z|6E`QwiN14Mgf3`x}m2;#cmu6X-2DO0}w}-w&$BnLFY7s#gi-Hr<0ru5GZ6cOzFE| zM`%V1CvHDIzq8PJuh;O&tgBjjYthQlAeI4&$Q)957pH^89|mG@d(F0)pmZ#*JSQb? zo%qs|!!x0}>jkNP)e`!>C$7ze#jcC#2AAG?eg9o(ifiY+GZ6=aC_RJH$9?{!N6mBL z+rE4g1s9&$OrwL%A3fDV8GkqM-CNjXt)CfNJ+|Y^USLPAnYEs*R&_PK>9wTd`7lgP zrqUg_o_rnj&3whz*VsuNl+B|6!@yTZ?pVZ5TvT8cgQkajy$99N3G>{=tcV3%*wVlj!8{wsu3yoa7Ww6#A$YgghF#&=eK4s5uf{DKDCW zq85~GZAg z5L>?I1eV%-?;?o$;?NTQRcy&i&+o_dptHd1S>aG#2L9ne`=J$kQtXe4C?V~?@-29( sftGqk=pT24#ktBUIX?)8ALgE6;HoFX3;lkMe^QrRCYSwxzAM>(0Y!B`wEzGB literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/admin_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/admin_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1547c6dc1e378620d9b4582de6d31a59525ff8ce GIT binary patch literal 14768 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/asset_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/asset_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5953120bd4944991a8a50ee93a2bcf71982fd6f8 GIT binary patch literal 41801 zcmeHQO>7)TcAh^DdxpOvDN59z+qS$SWr>vSwb$lKvM7m`WXqIn(SNkP!{$_z8hJQF zR}Up~Jj`a--fWWnNq`)JAV44|K@cIi1p#sh7RfP(z2p!ConsON3uKXC6$F7U&i7vb zOn0-JGo&a=q)1|_s=K>Z6*%R5~8J5ECsT{bfv~_0}(vQ;JAliw(7E z=i{+hR>j}s^+IXRI9t}FP~RTEHmQzXy_Dsg*UC~Yl#Gg8%vTEKlA&HN-%=}ORa>lF zFUvwzSEc^xqHa_Sb)l$hhOXW$7=?;@Qd6%>efHFm>y^sF=*UQgYnY)Lh708pQO+A9 z$k(M_%IioOmE+n%VdThZr+O8aEY9ntibnOS3)-B1azr~ltg26|rShlRs5<`QiRY|F zURlsfXt8Q6=y~;~E)Co_a_<{?1Ntaqh7wXK?s7ehs z(Bip5<@(~xaK1c0V%*Z^=5)y|bkg~<(C75hFfPmf0qZd&O}v zjCeqdh!cqSiRZ-gi1&*Z#5WNi5HE_C5FZrZ5-%e@Bwi7th@TMO7AFy_;*>az_(}1q zID_~pF(%F;ep;Lp=Mf(k8ol~r=NLuiFTEmGp?cs5?$zw(t0JJ;svk(|F4BxvA! z1HZec5r}v#DH11RwdC!XNPZQUy|vg4>XpQ7qJXo18vkkhT5RRHY`q)=Psv>qgHDpu9tdcQDU4Q zqbG7Jr{?kBrCDZE`?b*^06xVS?|lKqrDH2^w8}O3Zd9G%aTFhji3~=~*D5U{OV^47=Uqi! z!p@sSUK`~VV#^AC8NNRzXRP~c8PR?+#`nc!(Yg=kI!?ysV#`@v--fsyafiq(cVfgz z-)GFjpze>*d9Y?7@ZAcP>C1(n{)LN&gIbH>uB`=u5ZCFd;BFvFffKdB!+G)`C3< zH!(6zRC8|@FkY7C-0_#h1oVFh9K8Y=J?$A2r`226^%9TlbjNfP6--w@YE%JAVG+5W z(#@>Xyi3At<&rLmdCN6qwDKCdrS?sdI?e9X3<*tV%2Wkt%lZ{%|)bxAB+dezA1 zc0tQ#>gttilV-~pHF5Gz)=bTm#nMz8$@v`jkzuyX7K*wt)d3m40Eg#MO9aj?Bc;ag%;l!y#Dxt*N zab0_y()dT5MyPz9PEl;%@5TzQ&2qWvUscEXMXy;X2L?}{jP~l&vJDRejriH1Y#A4G z`Zmypbv%Yw6XxU1*MjY8M`1k9=@Hs2Q>scjGxIt$^ha3xWl_On2<%T{VsnM680h){ zMc%O$+*Z45EGa~cFMBBO$AjrQW)KT`EA-6V>+`sX2B>H_~zf1y5Js zZ&a`|fUUJ;Gfj0}5^^8)*nSEQP;d~zy{A}7q6lSU<8Y)ZRP{4b1*`^q0+EO4hb#O*>^?yzyEHpZQ@j97KxSs0H3?$jx|Y6>Gy9l)O2 zMK|!L6woC+CC7w6(Q!)b0`5d9JYlU>^f2z!tL=S^$BY1x4?0Y}GlVe2t~O9>KDvLk zCYqfms`-slM4~I14%0=dhy8$!b$bx13D-utg2UtnDk5VT&)^6UyE~0U8pwWQn8JZ4 z)&WgizOTVJz*)Yr*{k!&Gk6wgF8@J8G{B^a&ed)~Y{F{2Jqu*b&RM4(=}~2(T&mAL zT1=1d!OpF%L>C4lJ1;;-@+`mUZ&gh~ zK!>pPhE~xoI(&MA!g_;Z>kV)rV!c6u-q6W3J58cuTkK~H|0f~%Yk2vDJ0e}xf@O=e0wdUT!6}bgI<`3{%<_M zY@sC1F1Tvo6GRVQ=jWGmP1j`py48bJ?WoGF3H6w9JYb3i zqw*o&{juwz^3Y`Uk*Hn_(3680JW2czi5TpSD(z1|ZI?`V%?7LX9XKl%zwIzEN zlD&r|d)Aihy)4=Lw6C`5K3irC<*#PvLoiIjj80FHvcET3n^KzVg8hGBJ+E&*93^wWSwRwhHO9i;o z){F{p3I0I}8uB&uNsX=L>Q>hf_~m}DRX3Wc#` zxCF2IEiWBtX#m-$TT4Vx*FSu-^mv`D!n!d)TcNVz(CS5KuE2OMMBQ2aULP%oNsSg1 zzU^r_@Dd(<@$nEyy8*a*b?uhd>Xg}pBblS525qp_3l0?~)q%RXH9~w^M_uLn5ExS# zcQp6-c!dg@4{-TSSJ0eUGfM`DF%Mzl{w0wji9_Ba26=}8lfn8TATROT)|$j!xnU=ySYODO8rOEzVH=4-o>L zU|ipEiS`&Kfqn^))=<)N3Wx+j2kM*@DCuV)aDx}}b!6k+@ow^x3Y*G|EWk(BG(X`u zMH&Bw1Hg|URFE{5w88y}QkHWRr7!_#pJV4Jc8N-|OH@*{cwC}V%PnwzO28#*7%ow8 zgtA?t;3ic|!6iz?a^99xF}O3O@oPn$yc7>HFR>G?%k5yMmfLBeFrb+c833AqI~n?H zxxtI!u@I1)oZ4xD9VRY2;Ist?DojyQOs-B8CwZ!pQfP54Eu5*!pKoU-3=kWH>h|Z! zu;opbr}a7}A0v5ZqK+k6SYfwEcrl~0%&PV>VCWyD8qXc_v>{=JbzE?$(=$+PpySYo zsO2ANB$-4a1%JzE#~~XATUT&;M$SdPc^?+> zN|v3dzSC$r(j84A?ctThPERR(8)R2dspzjO6~^bUI#(^TY9Zgoqk9bDA$#JGdt{?0 z4nIa+gBa@8=w3|gpL?ve&udxv9JbbDl`%NLEqT%toIlc}=$O}foJE4hFt*lHmKh`a z$XcfzglfszBy9Fn-DVG-g)!5@YpD*RE6^Zk?G%svga>U^<-^%^z@CXD@WrcxxY@LP zns#H$8QA^JN^Xu?;%UJe_7ZZNI?AoSMqAdczWWf}VO`wdLQ-2tRSI2r+p~#LMgOdV z{T9fZ3m4(Q^6Uz`)WBYG*mk1~pMwe~eE@Ip+^Jrw=*3Zq9Db`7_SxN6v0HhuR;Lf5ka_kb|eN>!H@i zJH;t+2+nboqUCZK@dP`^soJr}N-PAp)xS%V%dI<7Vn<3u?WA|7 z)!O+-$G9oUCCyBcL^azy^3&|_Nk}uxhb#f3_5R8A>HVuqCvNLR^*fDh0JoHa2(tp* z>`)OnEvYja?^EUS*Ltd;u5P?X1XZz~(g)~menLSJftjuAKXRToAt zsZh0~sReDJkJuJ+dM{+BELOljf0ZccSiR0;-rD$p>pA9B!wJixGIw1Ks!bmI>dvmZ zHo`B7Db`X$HV}`^qd$H`>Iv;@qwHP{k9GE$3dZ$?on(E5{TRtzi$!*RUCL2FLiltg zuVE%<@T^$q*&QN3w}(l!V@;6^h}`sbD_K(y-;z4E(k$`NSAglH0B;4>oS6q#E#a47 zLwOyyRZld<_MXapEbcXjWPw;*)t-19SUm6wb~Ixfa_}M~TL?edWR90Nh+`u$?JFCh z+j>~mR%<`lP_@=mzOB(V+>(qGGR74f>zuyQS($CP5|~O~W5IqsR+j0lkOC_gC?LI6 zeoBF)z`tWz_5DW5D&YM4P*gj7imFFRl@)4CV1@BboKpaT%S9xruda1W4~%BMAwEot zd)*r1$FW@-SG83&INE8>0>nM^R^J)XrPs|wIJix;J*c$}UIUQYZQ^5te_K1L7D^TD zrm6v0r(LT7lv8>VNp~c-B@tbS{f+I*kn&#?il)0|*h1|g?1)0zTPSq~Sarw-(0Ttu z7i5V>&e_*6wBQ>UJ}h6ueity0@-+-Cz&C1m6+=UX^U)4Y4*YtfaB^VdE>6A|X!srn z4Hp9*oO~a02HYGATmLyD==(#kb+c(~{eX?F9|X33$b+rpBSSuH{mDpd{V5-|{xoCj zhqVv3vs4N2?T(O{=iRU$QCML62^s8T6Oa)ueru_`jM8T7GSyTZu^DZstkc~#RD5vr zCaP~WGE(^FaNIq#T-!Lg)~H-plM1sTB1&e%WTKgp*HGvw((mgpC(JHYvW_&%$M>>?W0@A{_hkXm44o}JcPR(K@8VPWZ{WXfb9(`ABg;NonZrsIOSeDfSqhzj@MXQjmyXc5c&Z%$?zKSL~ zU8AI%bH2wpyO2|NEb8H$pK?wwa(di*6wdiW&gnxAT5LNBwQ|1WT z*^p@y{V-(qz>smi<+c}Ql=oY1`|NMI(LyudH{Ha37&3H*oP-o{fDM_0+P^U5-@4iTlKWrM}P1fnHqOCp3@7qa68jwdG_1*c#O8r%DwC28y z3Nz4a?~)Cpz+pFfg<_Z|jI{>A(agQ^nzi(^>yYJvLD0ACixhQNSwDjV_`v*%B)m^q z-=ez$_z2qCPZiH)FJ&s>gN~cCazNwteN>;lqHzMr(0LO_spXga@DuLgOKg0I$ej14{%va7^AoAmaYNCm#KE+*FO)K_KErA6I%&BKbYy z%7fZJZ+ET?bo~y%KnqS?ZrRpMD!)%`7KtFNbK!pkr`g~^!`1(;kZ7b*c!m!fH@Mmi zFtMg$*9jS13e#iO@2VJ_?UP^7dkZ)y(o&ayp<(b#BtpOR7&KZu9T*q{e8xzafo;OT zHnf{t_FH1qc6;{AQcM@hMrAXD?WR9jjp1N<$@#rZ{yq>#7FN?5#MT-j{+3s zW2>;SJ`D|cv4pna!^T|4YqC6lZtH&W+Ibdx{GY|s)VI{Iq=EHmGk3?R%>-G=FP-TC zAL0nxX5|qBSYK|sHv?oBxj>Xm{2+@dcl!XY#k0Zq8`LEMcs6uv z@gL*Dza$RkZ&u>nmUK0)>4vPVA@P00m?x%F`5tirH5w$3LpbpWhXU$8PnUA%X6PJQ$$RiKsG&+M z70;%X7NuXg!oS_hMP;{g9>2@@QTn3Nr;KsDUzt(pcTl;m>{CAEb5_jPw)b<{SV{DI zD4F_ob`h+Gew7%OV`f6?{DthPfyzuy!a*RHFBb5*&0%e!U?(M(_{Ge0dFF#~ ze%gh(Nl2Mhbib#vhtBS~2*;kSkO(btAGg6#>0Z<#CB>9TotPS=m=P5X{HuV4P$smFs#-e_4()L3^~R#m@iNe6e#>rc#`;wD_Q z@sO%Jk9I8E=QdV^3tY9DmNZ>U=u2z!I#t*~jaO>!YI|v}YB$QxJ#%Hnl3c?mU$up` zVm0SbEdLJ-hccu3qvn!h*W0dT)EX^Yy4P_ncfM7-Sg)ZWRVvl{m&D0A{G19BOR1XNVHTP+Ih5AC;^|~cdt{F45gp zOAni^Q?nx!Q==vA6=^o+f^oQHV`yC6f-Jr%cxJZO25|Vn_&trlaRUV3&gr9P(`m)Rb zctepI4)1iz&pMbpX%zT5G;$7!c?h#v#{NBERM5ta$Bu*<{>b@e94^%nfDKAjxB)sHuvWDxgsXtP0 zDTA)Ar@b`hPRjf)I&Z~tqk1?O)-JXk*KSzyni%vlhWfF0Y$S9&~z^`Cd29MjEF@Gnb2@>+hUdlx-`% z`|R1Xn2OReg?>h-&PG#=cqANSY0apH%`s}iXgg4Z2Fjf5xe7rTTEl_13$n9)(q=Y@ z!|`*7lhg~-!k#Wbf2Iv*>*jCK!`%&>OD1>k5AC&CrRVhq$Rpyd+v&> zI?uJfMJjshJA%Sn6m+eZT*I+USzVpi>EssY2i4ty_A{UyT9$O7Q|WXeJbTaLwiK2O z%HE)Cf5BSQ)g9NwgWX!gLP5$eB0H#{)f8bd%JGmBMh>T9z{(o-NWz_leSS z+Y*b(0%pJ^(>0^lATB{e%753ES?7hbo-`_y9@doJ`CDI`-F#yp!r{Ba#Wb2aap6UO z5_6lXV$k|z2vo(eoAot67f*aBwIt@6|M?-OxN#3FT<|zr8D}yw3!UK?dgh&H&H zqO6~J@t!GH96v=hV7(b6IlA@4kdlv)f+AB#o6M_|>SQ9NcFsgSyJ3kM_I2H$2Y2Dg z^kY4!W0_ciCj5m;8V!0d@jz7-&OsxFxm27>Q_fYfh-BQv{iK%>nQ7&LdP#Y1{9B3j z?7HSt!dESJdyRp5|q|>}loBQ7V5%5jelAIu~%JO)DaYh3Sf$7I`Ww z3XClPD}>l0up(n6#-0aO3b7?%BZSqI^&EbAezqc8!Lz-*7(I>ltrx@??p5S>yaL*| z3+ULivdnE2` zia5NYu8-067c`-ZBVOJsctvm2D|sX0sE7WzpQF*{BgUGKDRJyUf^!&YFDD-P;V4$Q z@iyR&0%B`IF`A6gELSm#^A$az>1m3-76*MuZ5(9d_xQaMc* zioK?%+((ykbcroYxj#6M3`u!_&aSxYZt5(Z> zXY}ijoe%jCW-B`F!0#i6uMCIJDM$4zzZ~VRiS?Ji+^y|wZ$0^hYd9MlxwB!dW_#*0 z8&!uh>wfa;SY7n63i}8M6fzM);Y!4a3**lTPg=KL^)X;@5Ee z9QEL3DQ)TJziQUoL7pA($^?9IJkVH$n`TMFt9+P-8{p4MH0=woJ4u#EM|78KSaG zeL~zp*9MlOI6a5o+doF4?ajl9r~gc1Qq|N%@c(Y=-FzyeYKgp>cvnmGA5)1`LQ{(> zrQ^8ky?<0Pg>o6B+Pj$)9YY!MQNt7REIaeB&eI>r%I-54s%bPa`Xk?g&dKO@t{?&V zkY@5B9g+`wx-^5AT26s}NcYnZz1P<>UWN&Xw>Ft(mz!?QUHh2O4_I%|n2qE^c#Ry> zSv@ZB5%CZ`m6;DKL+|nyWIJ*U^Um8|z#`Wp8V}q6?n<%0t zoP{nm0bLhU6O;?63Cac31m(KaM3$+E>;`H=Th9><5mOUdNKNEGSZGX5pgdC(S*9is zP#8c>5VqhUyfA>8AnbWyo2Usf>Je54HX7d70&OuC(iVBR@CDEoSvdONMj6QU3St)= z_yS-1ejpFm#+k|}irswuCteY)o&dT#A_c@AMqXoN63Cty*~`eU8JPmIH%6uz`7I;+ zfK128en$Sp$N?bxW8@$se`Vwlkb^N&V&w0P90n2-7TgPp{1+qW5$cPW$|!-#7(qXb zg34gZ0#t_1R7Oc0K~Ee7m9Z?c6Qmp zWtW!ySax37XC36V1q8;|wu8VJu*Pv6uWwB%^t_l``}_ms+~$7h7+aAF@vRRjg*tj` zDer?Ki7V8#3vM%|)v0XN7LxLC&8Xx9v1F}RK!XKNQ!saQnoq=#$Rm^xF(QvrLX?O+ zMhTH2@)1gi2$9Dr`4lB5C^<>V43f^b`^k<#Qu*bs^!4cELts7Rqg0bmBUzNQlzkk@ z%y_^S40?Bn%9CH9cozX;$D_&GmEqD?)F z#~(2Ok>~#*dH+v+05i64jolD%>)m)D3+M%G8)$5@LTGoz$HZrEqbVCb_VCI_G;{mj>u481HZ0gtP*`*Y{V)6c=Fs`lZAL=e81Z)KcUg@Cy<=-%Yn3Q4~7nQ3&J2`-z?p3kKigg?ItaF7m(>Z8NH2L?QGjL z)O{Mhisdc-qgY$C+1DXg1@X2d$J>%%O~Db$-BG-4Ie}PPa$~Hmdu=`Cr8v%ZtZ()F z|KHr(-OU@naR1E>ys^-ot+>IC-Ea#-yejo zfe|Uf7JzMvNFkb{;g>^XB`-?Yl&i=UFOOP{pmc9kh7gyLF(7eN2AgCF`7R^lKz2p( z8pNLn`4J-%Kzid(g#3(=Ng%!PCqiClWC}<({-p8K-ehDN2;yJi=GOuvzh?yb?zUKp zn4w)o97~88jZkC=5u<$^F)E1th!`C}#E3V=V)N@kamdT@_SX??fGvr`*aVvnBSv(j zh!GuALPx}iauhMr#1W1d9W|f$_-g*XH}GVvlXn(^oo_PuW2A@vCSykX;Ev8yAK1}} zwK`YkdgtaaegS{Ww1smJKR66jJTuILhkqt**W6C;!szoZwtI8sV1Ht4;DWx5!G)*L zO@C3b;p= zQ&MU^qouWj+NyR)v*}noz-2&S+&~Gc({dYMTcJ)8n{*UEAuah?WGd4ezweymZ#(&$ q(%>W0jJ@;%wzBfm235t^P6w?$i$PT!+JBx(6!X{wnk*(JlK%$xoI)@F literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/auth_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/auth_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1918c6f49623499ad66e62f27a50a738c59cec28 GIT binary patch literal 19546 zcmeHP%X8bt83#y^1SwK4%TDaP;74N1u|?;u^s1S+O^pjbcbbl25cnyb536n|^lUb}Puf$3*na<rqZOMM!GC0#N zp1D-i<}SRI5qI9OxK^pz4sVp5idD0GwR+VwY*V{d zu`7;t+|ZV}xp?B>vg6ce^La-+VS%17Q?c^QD%*M7H@R6Wn>e$bqei`wKX|hJcnw7w zD`w3x=($?mSTc|2jgvE)wqL7RSB+Wi%uC0f^E!FHZr0Fa&90ke?V8DL)R@(tpE)Lm zaLPg>WoH)SShQXXcSIC8Yt~F|I408;R%bQpu#FxsRh;FErXinXd)YqZJJ^190QnSq znmvPjCp*XvA>YMfV4TD5#2lud=*q2X)#Mmr^OuG5#WS`zpM)BbuzeS7R_E3dH&$l6IX!J*njOt#U?!^MwYg%{8b-CcIwL0TqPe))`4aUC z%?8jw_d>TXJDK#%b2v4473fi)o#Xxr%L8 z7kLslZb@84cDs@PjtxG{*D7Tzzf!4H7A?MHzK}O-*X(Xt$X6>1`T8nksrJImbI0-! z9rI}2C|?1)qu_#0lHornPXZ#IYvxJ(^l~r(Ixf%DS6x-t@hnHzpF}5Y>X0fY<&50i z(=%Z+?V=%CkcOe-9UPy}B4KhX#$v~%R_unv;x}bJ*^(}UCW~?f*M2VlNWLURudKye zq+b+cKgbHnt6YO{5k30JuCIP_TbE{@GZ0*fr@j_eAKt?rY zE*g!hGouwPQC>4@VqU2&V^GB-Z3R^)<`l(1-K!^xykQ2lPo6vpZsVrGv=bT;wcUNa zf&L?bp497>?HpRL*y@o;Gt;4VFm>o8+VL8kSu&kN(;jnEM`!B>xV_VYwqRM+paK6b z6fdqbsHJvCE_&)#J4AZ7!cEqBs9%TL(QLEEbiWR?p}t~Ns z;TXDAtFF4~V45IhaS+fw*rr2tLiFp<*Is?n^S2b90{glOQO`|Yxo+?!+f}G(A)#K9 zrXr6HYH~mB+GLT{v5Y(^PsS9vdAL`Q22~FU))<3od5$f`NK`z*k|lAb z+?4&ZL~xd*Ge?FpQk>Y0cuQfa-O^3@wDi&Bhq1N9TC$aB#jnZyn4>VYmDnYHDt}*Y zC0j}>aa_8(kIJ7QK~}EG_Urg1@0M5^3hoUj!7@~~BCVxxs7umXn#E8~;@@kf(XSDd zj_sBfW7Gqb$e_ds@+?cQFaW>IXTj^G&m1~W(vTU+7+EQ+0NXdv?@$&@RaT9&Q9nhhbVpBgHgL2tvJpbS- zmk2L^t!wU{uHhtvrKx`Ek>_xWXOXz$dYzk9%V5IB0=waguf24qvSL~dhfktl^X;?1 zC`L_d)Xa|oJ_$o!F;}l!z|l}R0>5eppSBMYWcHQkAazk_o;z2u$-o54lGHnpFU*AL zzv{9tRt^@oPqvYc!0Jx&iCt-^*gb#8=zD za(+krnvo(Ex>FLNQ?FMbhU^52j>Q2cWN_eKM_ zcchoC2R9JnOP2ox{MFuMgmaR1@j2t1+Wf|h!Cus@L?Us9ENvn(uZ{bx`1^%1gx7f zl7Mw#4&8>U#=$%i;n8~z?ZTwp(!%dq*Z`DuK!FFn-rYR(8ayq9=J`7TUxOQ*=Z}!~ zA$JnrP01c4x5wT;N(zM>rvh~~AN8C%1hB$0!yiNWQl_JMi~I>{W-lerQbK;F&MKCF z13!O^!(K#^#DaBL!#~LACpR|wuWUv;MmRsDEc=;#MJNKZe8q>bX3@F=;JY17KL*kE z#Q^!zFns$@E}=HC_HNu8ms0qd9p{oq;(o5BHWauI-l1L$aJ0O<9!VpdHtoBDM#G~P zT7>Tiq)5nAMla=XL9|qUuy?! zInwseAm1^6g`{yHNVsq(AYnZTE;K*d2q=WrOw?bqzHXT><=WMSF7BX+=7Ij+m{9RG zH-7d^kv|Tacz6NMn0-Vba%J-alsrwzGn5>pg!YK|AxaKYLQAY^-@zd$OI|L1gp#9_ z%utf2M5E*wCC^dvJS8ts@**WKQPR&pL3>L7!}0k%lFh)BZvTYmn;60?@#fwK_%fUH{{l^pg&yQ}{llo#Qv zHY6G8Dm)mEJho25Z-4e;xcV*ub8>;ikoa~|5a@2($vHgW1Cs66aMCg#>^QZV-s^XZ%1& z0$3W%kFW)VUeKB6pQkefBly=4j^GDj#6=KBoF%%v^2%BQ;TACjVa&iQkI)N02m^r` zEd@asS_|b*PzXg5M+(nWk*ASokdLs`S{7oLxRGS4SUsm%TCARFO`W)$Vi|;Dq{R9; zi+~9P{~>51j?fAUwV<3<(Uiwo4y$K6Lw{RIHY!%nW5%BzDq)Q<tz zkt%d8OrPwwp`=B_=0Moa(qyl8^H-?p!7J20i_=@9U5e!{u1n8A6Z{TBVi$3uU;}Wl z``p_vZ@bNhUW=Z(6V(;r)HhibQgy9PWqs!27imPglc6MyZ)_K-VA?xPv(7r_i z`Zgtz9a>s)Wn*`2Vusj{ePI|;k8nju^81;T8<2{swS)vj{D0v5x4){$3vIDIMaekTv-uWMHdU6IyEdwnMyE6|x;E zVLMX(0xRV&uu@oHjR@P3@)uZHVLNihuO28Vi7?4MupIY6Xa-x3Q=7LOJu*=6%*A-e zTzEx9V2@`irqvCWKEak;Uwd*6vSg4wDd1#tOO_48d7mFb$|Fn?+EE}EBOPS(+Ht&7 zq(i*7moAd8y}e9)ef12zowNqvEY#Qb&=niR1b?`B!#%uA7n=G; zo0I)s&>H>$^PNcHrq=CL?KeT)IAW+EpJ_719YoPDhWI>+{Du(4JWe(foYQuOc3vDB zA~@%rUW_q3ts*iL(zpG<$KRoLLuA~Ra3cgWJRik1|h+!A5Keuzha z(>erk$?zzW$gbJuk@ zqw6acYgFkxtLs&;RXz){%kmBUuq=bT*_;E@o#+aX?WR8-vl+gYz zf0q*Bk|37}CkG0@KnVdKevuNQUYFxOcqxPvsGwK6Y=Tg#q{x}1noxJC=hdC+yExty z$CNs!ddCU+o!u$wO{e*Ls6``NY~X)RFftCCA-OSbim2?;?(kpz%!t4F5q~e_{ohd1 j60hKj*7|kNRgZf#qrVoBZ2A)eC6>*oF*TlzO~wBYTLy
    JaO0 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 EAC=79djJ3c literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/dashboard_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/dashboard_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33d6e5afd0965cd728ae53b6a7cda8fc77c1296e GIT binary patch literal 52878 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/device_profile_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/device_profile_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d41b39ab080a8fe3fb4da275a6e39b99231d4d42 GIT binary patch literal 23913 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/edge_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/edge_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..822c361abd7f249396bb2c8735b0ed6bab4715e6 GIT binary patch literal 47760 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 Jr(=Wh{|D_WM-Ko1 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/edge_event_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/edge_event_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52fdf78a362a621ce2d579b08e56d988e4be392c GIT binary patch literal 5127 zcmeHL&2JmW72jR1mdh{8a%|a3(qt01uw}@k(x4YXmOmBO2r8=)TNFgo^@=kj*Iw?@ zGfT;$S13^XnD*YAT@(d^9*f@l5A+|{YfruQ*o*sn!zJ|*sY!sIijdgdH}l@S_h#Ok z_ufogtCbD>9{%;!_NBKC;~&&G{Ik)xg-6kg8!dyI+zQRU)v`>23t^#E&|kY{<7KY@HRh98 zvLI549JZ4njuh*~yDW*BKTLYD3`T-U@pLFuqSzo5z7lLFP(i|0eb$qrbK^=cNd_y8 zMxrHblZ1K@H+bAu4d8_oQCk2~$#s7aG_I^o#50f#`yxtwlFJ5uSFAStwK`*$Srk9@ zSJ?WGmOmOR`EVd2Xw1|=wAqf33L{q759`Z%3U^~LX(ua~M<>2@R1r;ZUqnLsiQsH| zZ-tS<3L1BVq&M8Ix8r_8?fTuWkXpkD+>W{Eil`2<@;_k?W6{iJ{cRP8!$f#Ne-O)L z1AV32gWzr$U?OdzI{Yi3aSM;ShL>+G1fX^g2SRTXw0+kM?*gh_v(7}J`mMyQ;J@Pfz;8c+&w+5;BlpY&HONb~ zT+t9Pf+xrdUVCZ=56JppFLON)5);pR52`3q%QYRdY>wVP*>?2_eVcaqHn&!d)P7~~!fR8WPmRa4JXTuh6aw`B(fpmcWt`NzKa=49HFBk!HF%&DK4&)=Eiv@>4h*2Yp+X4r(0f()1{`c*KTjb> zjlrd3ycdr!hmD~*n2)6p|Er7RT|nBe418>h0}gCEj>9Q~9E&iCy#k>DU(vt=&aP5? z45Z)(;&SRBN)A+9(cl&Z)UO{gCjKvkq(~y3C7u$#Z1+}lV@ty)>8uc|JnZ~|kO?9n zH8=CtspPTbLXK%45_p`DW~UM#jFX@*KuB;C;7Noc;yD?hqeN09Ly2g<31i;#6MyQo zQ$A!K{d>^SK`QrG3W11Hi0X$uFWg)D>cFuKrAO!KY~lt};$}7vuOwYO$`BrhE?yjk zds%7fvWP+j_)T{8ROj?|kyXYFC>t$0vWQKc6?3o2N>iWBYyvaq$*wQEDzizR4r}9A ziH0qlD(5oA3o0hu3uSZOoVRRqv^-t9BT3`*opdA;&4C#`Iubbu)m_A*KbRC#5Q(hU zrfFyhF)4@aDKtY+Vj_?`iS??GI^0<>UYqxf&(HnR+Ar?AX)&GIG39b%^I}?@H(r>( zF;h2n(&DP|^h2V*VQ{o}Omzn>cfsH#B!^Fu8D1t@UeUNs;3_$;30zgnBRUy^EKqJ(+cKzcFet_=gNtzA-~WVz{ESp%xTQ; zHRc>Jb5qP)8uKTOISt8zny<~Y%HLfz`1iWz{#ojO?DF^c`)N6?q}6mbt)*u;OEJ?| zC9re+WZZE%Cg-W6dbs407pbd6UAnT8bR0r^Qb5TCY8UfLX;iq@xRyD$ z+ifvOMzg=Temg&z>vQwybA4bTH5$*y%Ir7vkwrbfIZ-=kUa~+QN)q9H5OU`5IR?c8Xi$yw2M+h38mz6!Q zAM;^IaMkmk;vyo)6g>}DMxH0B?3L%~MGJFivFK7jQsFG=NKLzJTp}B`S$5o+>btss zu_PNnk)+NL^*$s?x|zr#=5~_!%v~MNVGZ|h ShN56?Th%hGQm9(z3;zLI8t?i5 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/entity_query_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/entity_query_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6621ef9f41a6f86057ae06446d8aa4af4234f855 GIT binary patch literal 10779 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/entity_relation_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/entity_relation_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cc0cbacc77afa048aad1769ff3a754a15be9c5a GIT binary patch literal 31797 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/entity_view_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/entity_view_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b7bab18d580bf60de2d44c36c52fb20588c0e68 GIT binary patch literal 41930 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/o_auth_2_config_template_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/o_auth_2_config_template_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..067b0281c3c4d23670c44908267be78acf1c562a GIT binary patch literal 8959 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/o_auth_2_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/o_auth_2_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99b3b0e6a7d59b130a8e470050b50755324ef25e GIT binary patch literal 9375 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/queue_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/queue_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d967adca304ff13b5c8371d15ab75dfcb6920e9 GIT binary patch literal 3947 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 C-m)G5 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/rpc_v_2_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/rpc_v_2_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8cacc3c3d1f1d06981b7d4ad960fb4af3132d96 GIT binary patch literal 14374 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 OmQ8ChEuM`H$Nvv4(06YD literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/rule_chain_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/rule_chain_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98dcc7ae7ff79606b00dc8383282fbddb12238a8 GIT binary patch literal 41618 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/sign_up_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/sign_up_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da60dde9146afd99e1f96c766880e572a19276b9 GIT binary patch literal 16862 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 POT@CO5>w*Y*l_%R;Muda literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/tb_resource_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/tb_resource_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a0f681412a76b618664b978ed28df687df27c71 GIT binary patch literal 19535 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 CjZ3Zo literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/telemetry_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/telemetry_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5aeee62db9d4faefe56a5c578a44d85b1253afbf GIT binary patch literal 45686 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 XhjYNiF})i}D$$*l5>m1|F_ip&*Z%5- literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/tenant_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/tenant_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52efadb13ebfd27fdb030d9ebfc392689da317bd GIT binary patch literal 14676 zcmeHO-*4N-9VaD9rYOmFY{#wBv}J!SQI=R~vv#fLxcTKK=?~kjwW0Mk(6o-WmB^xU zq?}l#AGYRo1@^p`q!=(51BSiqalrnK@nsKt8ZdOg@-QG9mVLfQN}^b)cG7lfj7Z?! zk#{^E@4i1i_x*lp=kuC`-~1nLt^8|QlKx63(Vv2oGdLVdn6xA@nI)?7Mq();Q#n~p zE+s{-EGfv9YHB0Bl$NE75=*i4O^Kzgflrc4DoZX(g#q(|EJ>Pg(KEJ$+=|b?Z~bqAQ-TLQj~i*hOZSog(TjZq>>bN{)NNtXGOhW?GNe(WJ3q z)m)RFtJlpnYr1I8OzQdzdd z8=aKhDZIz3eWrULqQOP0W^vQCn7*<#rPF{NjCif$t~XXD%l1amxo)nlSzL^;RW94i zTC-}CXr}!Q%OMqHf5=>M>}tccjLJsc=I$J>WzNMHI`nlwt!+y(ulFS%zuI2UwQnkgF`u29amj5F19Wu>))bd6tc` zG2}URkc}hHvnSY-$OqX3JA{0QJ;e?qA7%*rD?u9}Xcqkwg{b-Z_b!gP1t(!)v7X;NCXAe=h4*SNVc8LZL;8w=;^76WE= z6%w4*!Ph{3Mp-OWA>k{IRbAz2RP0DxMRxak@rMp5t5~a)?czqIR#~?K%YTJjRNB$m7_^AS(F zf_Yh$E4cP+`BQmOieK4IdL%Uz^Y4%v%&JYyf%$Ri0wZcdiIDAB%T*}K?f2wfe(LG0ovMD6mLOymz{N!*rYNtD1gVM%G1QdDwf z2pPpq+)8>1OHW9*oOpugDaj%6hmAV7s$8tUt5QHB0YR9Fo{=p+%w+01*NgI*IGcZHcn1 zUthOsLKsr}<^H`c`)Y94Wp;Py!xLvibStpu-EpC(gZkpft#;df`oiqHv!&V6j^-;X zHrrat)@|r^F%rj5tyZd*vy_LXr~^1#hPzd_{5%0?!?9eK5O-%b`8dt%6Ev?QWrAP= zZW{m@8>Z_NGJe{u1LZP5U9}}5I^5)o#oe|SS{W< z&C-}#CqrVi#-_;)F&%!ECMvAu&!Xp;oaZEbU&rArAxRHuKsxkKC&pz}P6YpZ$~{d< z%W6WC6Zh1Fg1;)~WXkbJp2lBkwQlDsdeB5K>3=p)m+nhJ#Kc3FzKFsrp2e^MlKuf% z356IuN z39%?x8k-8@G{4Y)3S$JthtWR93;v=0w|mt5Ad=olr~i#zlp94lcg7!Sq(d0z7WTz! zGBAtAa?=vax3Q1P2H8*-_8At~Clg|y3~hpdcrr|32L$%XumJmv2<$Uz{&!#VbBq`t zv$sPg3feFRW(g7=G5FI_*bfYH`ZMWQ0XhA9UFKv9xtlyzJm#m*mdjS%Yg^}#v`fo zY5pI+-Y0WV3p(|h%NU9ERQ}KI(#M~{IspPW6)()rbWwE_2JlzWZ(-ET!hnhq z1YPf6s*bJ1qoMg80+H{c{ocR-E&eX#J=gr`f%o~lbRFnH{u(jR_bDMI*nBFw%O|Fd zZ1p+qNSCw@GXx5flP$fcf;)|h`6N%PzTFldZ0%jBeJ{Zc5j?fEk}fjKZK?D=G( zBzyj7V7>Pes|i^2lTnL)^xC%KDZ-}zyEwNykM@3**3XITSIK>7IB-|OUx4EOXV=<( z=#+TqB6&-D+4hB1MJI0n-4Qh2rJ-xxaA8F`wAMSic;1c}(nM}Oe zc0f=ma6nKga6nM0-*{T63wF4(aiiZUC2eXFMpdZ zW$2Pnvc5_WA(Rk@rspEi^fDovkKgR{d_3BxI1#-aZ*?XL+W~?dS@?q5jv(2c;lMG} zCWAm77BEbHjFRtCa-0&Kk`t6nQc|SkBqc9X@(LxroI7VwF)u@1-atVe-HUT4>f|9e z&j=hi-ABji^EKInV$>HCeOE++}F*n(yqUh)ER2HGA*QmOE;;IgIeqYNad! zUW->8yVlH+KN(TICn&HqaFJyrYS>p6<`+x+4G5(`lNPdjh!){LK>MXb-613N%?lnR z0%UnRaHJ51sdi-F*Jy}X#4t`kK02!?>^%Ub6JbiRq!f5U0VsPkJG`-XDIDW8PG*L} z0s0iEh9GCd@HNBOuvw!@<(y$$!zWZ>&46Lx%Q?f~^g#q4qlCmb{~je2cf-kH$jL#; zFHmxZk`E{$#KTLJ(DX#`kU&QC6$U2&LqW<8eT<|^imav8lzLFTfa8)lCe#mA9Jzy{ zZ6U)yLQ5L&Y6G8;V7wgDF8K*=iIAeDiSAFLCdKDa;xnw^yR5Xmas}Z_U literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/tenant_profile_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/tenant_profile_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43eead1326d7ef0f7e6c29bc0e1f94cf49d96ffe GIT binary patch literal 19499 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 literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/user_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/user_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e235ef32d43e5cf1865b77b3f8f3a1517a3eabd0 GIT binary patch literal 26361 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 KYCIR4i2pxH`Ff!M literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/widget_type_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/__pycache__/widget_type_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6b9653c37343aa5791391c339acc0f20de3939a GIT binary patch literal 17905 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 VFrSi3J13P?LDy1Rx{#Vk{~tZ6_x%6> literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/admin_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/admin_controller_api.py new file mode 100644 index 0000000..91ee367 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/admin_controller_api.py @@ -0,0 +1,676 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class AdminControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def check_updates_using_get(self, **kwargs): # noqa: E501 + """checkUpdates # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_updates_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: UpdateMessage + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.check_updates_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.check_updates_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def check_updates_using_get_with_http_info(self, **kwargs): # noqa: E501 + """checkUpdates # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_updates_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: UpdateMessage + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method check_updates_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/updates', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='UpdateMessage', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_admin_settings_using_get(self, key, **kwargs): # noqa: E501 + """getAdminSettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_admin_settings_using_get(key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str key: key (required) + :return: AdminSettings + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_admin_settings_using_get_with_http_info(key, **kwargs) # noqa: E501 + else: + (data) = self.get_admin_settings_using_get_with_http_info(key, **kwargs) # noqa: E501 + return data + + def get_admin_settings_using_get_with_http_info(self, key, **kwargs): # noqa: E501 + """getAdminSettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_admin_settings_using_get_with_http_info(key, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str key: key (required) + :return: AdminSettings + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['key'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_admin_settings_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'key' is set + if ('key' not in params or + params['key'] is None): + raise ValueError("Missing the required parameter `key` when calling `get_admin_settings_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'key' in params: + path_params['key'] = params['key'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/settings/{key}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='AdminSettings', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_security_settings_using_get(self, **kwargs): # noqa: E501 + """getSecuritySettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_security_settings_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: SecuritySettings + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_security_settings_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_security_settings_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_security_settings_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getSecuritySettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_security_settings_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: SecuritySettings + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_security_settings_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/securitySettings', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SecuritySettings', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_admin_settings_using_post(self, body, **kwargs): # noqa: E501 + """saveAdminSettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_admin_settings_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AdminSettings body: adminSettings (required) + :return: AdminSettings + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_admin_settings_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_admin_settings_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_admin_settings_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveAdminSettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_admin_settings_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AdminSettings body: adminSettings (required) + :return: AdminSettings + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_admin_settings_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_admin_settings_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/settings', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='AdminSettings', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_security_settings_using_post(self, body, **kwargs): # noqa: E501 + """saveSecuritySettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_security_settings_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SecuritySettings body: securitySettings (required) + :return: SecuritySettings + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_security_settings_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_security_settings_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_security_settings_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveSecuritySettings # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_security_settings_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SecuritySettings body: securitySettings (required) + :return: SecuritySettings + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_security_settings_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_security_settings_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/securitySettings', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='SecuritySettings', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def send_test_mail_using_post(self, body, **kwargs): # noqa: E501 + """sendTestMail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_test_mail_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AdminSettings body: adminSettings (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.send_test_mail_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.send_test_mail_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def send_test_mail_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """sendTestMail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_test_mail_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AdminSettings body: adminSettings (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method send_test_mail_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `send_test_mail_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/settings/testMail', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def send_test_sms_using_post(self, body, **kwargs): # noqa: E501 + """sendTestSms # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_test_sms_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param TestSmsRequest body: testSmsRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.send_test_sms_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.send_test_sms_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def send_test_sms_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """sendTestSms # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_test_sms_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param TestSmsRequest body: testSmsRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method send_test_sms_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `send_test_sms_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/admin/settings/testSms', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/alarm_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/alarm_controller_api.py new file mode 100644 index 0000000..c6f0833 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/alarm_controller_api.py @@ -0,0 +1,978 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class AlarmControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def ack_alarm_using_post(self, alarm_id, **kwargs): # noqa: E501 + """ackAlarm # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.ack_alarm_using_post(alarm_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str alarm_id: alarmId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.ack_alarm_using_post_with_http_info(alarm_id, **kwargs) # noqa: E501 + else: + (data) = self.ack_alarm_using_post_with_http_info(alarm_id, **kwargs) # noqa: E501 + return data + + def ack_alarm_using_post_with_http_info(self, alarm_id, **kwargs): # noqa: E501 + """ackAlarm # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.ack_alarm_using_post_with_http_info(alarm_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str alarm_id: alarmId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['alarm_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method ack_alarm_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'alarm_id' is set + if ('alarm_id' not in params or + params['alarm_id'] is None): + raise ValueError("Missing the required parameter `alarm_id` when calling `ack_alarm_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'alarm_id' in params: + path_params['alarmId'] = params['alarm_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/alarm/{alarmId}/ack', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def clear_alarm_using_post(self, alarm_id, **kwargs): # noqa: E501 + """clearAlarm # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.clear_alarm_using_post(alarm_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str alarm_id: alarmId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.clear_alarm_using_post_with_http_info(alarm_id, **kwargs) # noqa: E501 + else: + (data) = self.clear_alarm_using_post_with_http_info(alarm_id, **kwargs) # noqa: E501 + return data + + def clear_alarm_using_post_with_http_info(self, alarm_id, **kwargs): # noqa: E501 + """clearAlarm # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.clear_alarm_using_post_with_http_info(alarm_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str alarm_id: alarmId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['alarm_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method clear_alarm_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'alarm_id' is set + if ('alarm_id' not in params or + params['alarm_id'] is None): + raise ValueError("Missing the required parameter `alarm_id` when calling `clear_alarm_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'alarm_id' in params: + path_params['alarmId'] = params['alarm_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/alarm/{alarmId}/clear', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_alarm_using_delete(self, alarm_id, **kwargs): # noqa: E501 + """deleteAlarm # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_alarm_using_delete(alarm_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str alarm_id: alarmId (required) + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_alarm_using_delete_with_http_info(alarm_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_alarm_using_delete_with_http_info(alarm_id, **kwargs) # noqa: E501 + return data + + def delete_alarm_using_delete_with_http_info(self, alarm_id, **kwargs): # noqa: E501 + """deleteAlarm # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_alarm_using_delete_with_http_info(alarm_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str alarm_id: alarmId (required) + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['alarm_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_alarm_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'alarm_id' is set + if ('alarm_id' not in params or + params['alarm_id'] is None): + raise ValueError("Missing the required parameter `alarm_id` when calling `delete_alarm_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'alarm_id' in params: + path_params['alarmId'] = params['alarm_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/alarm/{alarmId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_alarm_by_id_using_get(self, alarm_id, **kwargs): # noqa: E501 + """getAlarmById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_alarm_by_id_using_get(alarm_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str alarm_id: alarmId (required) + :return: Alarm + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_alarm_by_id_using_get_with_http_info(alarm_id, **kwargs) # noqa: E501 + else: + (data) = self.get_alarm_by_id_using_get_with_http_info(alarm_id, **kwargs) # noqa: E501 + return data + + def get_alarm_by_id_using_get_with_http_info(self, alarm_id, **kwargs): # noqa: E501 + """getAlarmById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_alarm_by_id_using_get_with_http_info(alarm_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str alarm_id: alarmId (required) + :return: Alarm + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['alarm_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_alarm_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'alarm_id' is set + if ('alarm_id' not in params or + params['alarm_id'] is None): + raise ValueError("Missing the required parameter `alarm_id` when calling `get_alarm_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'alarm_id' in params: + path_params['alarmId'] = params['alarm_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/alarm/{alarmId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Alarm', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_alarm_info_by_id_using_get(self, alarm_id, **kwargs): # noqa: E501 + """getAlarmInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_alarm_info_by_id_using_get(alarm_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str alarm_id: alarmId (required) + :return: AlarmInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_alarm_info_by_id_using_get_with_http_info(alarm_id, **kwargs) # noqa: E501 + else: + (data) = self.get_alarm_info_by_id_using_get_with_http_info(alarm_id, **kwargs) # noqa: E501 + return data + + def get_alarm_info_by_id_using_get_with_http_info(self, alarm_id, **kwargs): # noqa: E501 + """getAlarmInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_alarm_info_by_id_using_get_with_http_info(alarm_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str alarm_id: alarmId (required) + :return: AlarmInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['alarm_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_alarm_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'alarm_id' is set + if ('alarm_id' not in params or + params['alarm_id'] is None): + raise ValueError("Missing the required parameter `alarm_id` when calling `get_alarm_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'alarm_id' in params: + path_params['alarmId'] = params['alarm_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/alarm/info/{alarmId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='AlarmInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_alarms_using_get(self, entity_type, entity_id, page_size, page, **kwargs): # noqa: E501 + """getAlarms # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_alarms_using_get(entity_type, entity_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str search_status: searchStatus + :param str status: status + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :param bool fetch_originator: fetchOriginator + :return: PageDataAlarmInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_alarms_using_get_with_http_info(entity_type, entity_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_alarms_using_get_with_http_info(entity_type, entity_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_alarms_using_get_with_http_info(self, entity_type, entity_id, page_size, page, **kwargs): # noqa: E501 + """getAlarms # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_alarms_using_get_with_http_info(entity_type, entity_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str search_status: searchStatus + :param str status: status + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :param bool fetch_originator: fetchOriginator + :return: PageDataAlarmInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id', 'page_size', 'page', 'search_status', 'status', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time', 'fetch_originator'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_alarms_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_alarms_using_get`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_alarms_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_alarms_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_alarms_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + if 'search_status' in params: + query_params.append(('searchStatus', params['search_status'])) # noqa: E501 + if 'status' in params: + query_params.append(('status', params['status'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + if 'fetch_originator' in params: + query_params.append(('fetchOriginator', params['fetch_originator'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/alarm/{entityType}/{entityId}{?searchStatus,status,pageSize,page,textSearch,sortProperty,sortOrder,startTime,endTime,fetchOriginator}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAlarmInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_all_alarms_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getAllAlarms # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_all_alarms_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int page_size: pageSize (required) + :param int page: page (required) + :param str search_status: searchStatus + :param str status: status + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :param bool fetch_originator: fetchOriginator + :return: PageDataAlarmInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_all_alarms_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_all_alarms_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_all_alarms_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getAllAlarms # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_all_alarms_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int page_size: pageSize (required) + :param int page: page (required) + :param str search_status: searchStatus + :param str status: status + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :param bool fetch_originator: fetchOriginator + :return: PageDataAlarmInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'search_status', 'status', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time', 'fetch_originator'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_all_alarms_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_all_alarms_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_all_alarms_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'search_status' in params: + query_params.append(('searchStatus', params['search_status'])) # noqa: E501 + if 'status' in params: + query_params.append(('status', params['status'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + if 'fetch_originator' in params: + query_params.append(('fetchOriginator', params['fetch_originator'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/alarms{?searchStatus,status,pageSize,page,textSearch,sortProperty,sortOrder,startTime,endTime,fetchOriginator}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAlarmInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_highest_alarm_severity_using_get(self, entity_type, entity_id, **kwargs): # noqa: E501 + """getHighestAlarmSeverity # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_highest_alarm_severity_using_get(entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str search_status: searchStatus + :param str status: status + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_highest_alarm_severity_using_get_with_http_info(entity_type, entity_id, **kwargs) # noqa: E501 + else: + (data) = self.get_highest_alarm_severity_using_get_with_http_info(entity_type, entity_id, **kwargs) # noqa: E501 + return data + + def get_highest_alarm_severity_using_get_with_http_info(self, entity_type, entity_id, **kwargs): # noqa: E501 + """getHighestAlarmSeverity # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_highest_alarm_severity_using_get_with_http_info(entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str search_status: searchStatus + :param str status: status + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id', 'search_status', 'status'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_highest_alarm_severity_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_highest_alarm_severity_using_get`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_highest_alarm_severity_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + if 'search_status' in params: + query_params.append(('searchStatus', params['search_status'])) # noqa: E501 + if 'status' in params: + query_params.append(('status', params['status'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/alarm/highestSeverity/{entityType}/{entityId}{?searchStatus,status}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_alarm_using_post(self, body, **kwargs): # noqa: E501 + """saveAlarm # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_alarm_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Alarm body: alarm (required) + :return: Alarm + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_alarm_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_alarm_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_alarm_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveAlarm # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_alarm_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Alarm body: alarm (required) + :return: Alarm + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_alarm_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_alarm_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/alarm', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Alarm', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/asset_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/asset_controller_api.py new file mode 100644 index 0000000..142ed97 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/asset_controller_api.py @@ -0,0 +1,1879 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class AssetControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def assign_asset_to_customer_using_post(self, customer_id, asset_id, **kwargs): # noqa: E501 + """assignAssetToCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_asset_to_customer_using_post(customer_id, asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_asset_to_customer_using_post_with_http_info(customer_id, asset_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_asset_to_customer_using_post_with_http_info(customer_id, asset_id, **kwargs) # noqa: E501 + return data + + def assign_asset_to_customer_using_post_with_http_info(self, customer_id, asset_id, **kwargs): # noqa: E501 + """assignAssetToCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_asset_to_customer_using_post_with_http_info(customer_id, asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'asset_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_asset_to_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `assign_asset_to_customer_using_post`") # noqa: E501 + # verify the required parameter 'asset_id' is set + if ('asset_id' not in params or + params['asset_id'] is None): + raise ValueError("Missing the required parameter `asset_id` when calling `assign_asset_to_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + if 'asset_id' in params: + path_params['assetId'] = params['asset_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/asset/{assetId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Asset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_asset_to_edge_using_post(self, edge_id, asset_id, **kwargs): # noqa: E501 + """assignAssetToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_asset_to_edge_using_post(edge_id, asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_asset_to_edge_using_post_with_http_info(edge_id, asset_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_asset_to_edge_using_post_with_http_info(edge_id, asset_id, **kwargs) # noqa: E501 + return data + + def assign_asset_to_edge_using_post_with_http_info(self, edge_id, asset_id, **kwargs): # noqa: E501 + """assignAssetToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_asset_to_edge_using_post_with_http_info(edge_id, asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'asset_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_asset_to_edge_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `assign_asset_to_edge_using_post`") # noqa: E501 + # verify the required parameter 'asset_id' is set + if ('asset_id' not in params or + params['asset_id'] is None): + raise ValueError("Missing the required parameter `asset_id` when calling `assign_asset_to_edge_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'asset_id' in params: + path_params['assetId'] = params['asset_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/asset/{assetId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Asset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_asset_to_public_customer_using_post(self, asset_id, **kwargs): # noqa: E501 + """assignAssetToPublicCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_asset_to_public_customer_using_post(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_asset_to_public_customer_using_post_with_http_info(asset_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_asset_to_public_customer_using_post_with_http_info(asset_id, **kwargs) # noqa: E501 + return data + + def assign_asset_to_public_customer_using_post_with_http_info(self, asset_id, **kwargs): # noqa: E501 + """assignAssetToPublicCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_asset_to_public_customer_using_post_with_http_info(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['asset_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_asset_to_public_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'asset_id' is set + if ('asset_id' not in params or + params['asset_id'] is None): + raise ValueError("Missing the required parameter `asset_id` when calling `assign_asset_to_public_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'asset_id' in params: + path_params['assetId'] = params['asset_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/public/asset/{assetId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Asset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_asset_using_delete(self, asset_id, **kwargs): # noqa: E501 + """deleteAsset # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_asset_using_delete(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_asset_using_delete_with_http_info(asset_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_asset_using_delete_with_http_info(asset_id, **kwargs) # noqa: E501 + return data + + def delete_asset_using_delete_with_http_info(self, asset_id, **kwargs): # noqa: E501 + """deleteAsset # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_asset_using_delete_with_http_info(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['asset_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_asset_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'asset_id' is set + if ('asset_id' not in params or + params['asset_id'] is None): + raise ValueError("Missing the required parameter `asset_id` when calling `delete_asset_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'asset_id' in params: + path_params['assetId'] = params['asset_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/asset/{assetId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_query_using_post(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AssetSearchQuery body: query (required) + :return: list[Asset] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_query_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.find_by_query_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def find_by_query_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AssetSearchQuery body: query (required) + :return: list[Asset] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_query_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_by_query_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/assets', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Asset]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_asset_by_id_using_get(self, asset_id, **kwargs): # noqa: E501 + """getAssetById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_asset_by_id_using_get(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_asset_by_id_using_get_with_http_info(asset_id, **kwargs) # noqa: E501 + else: + (data) = self.get_asset_by_id_using_get_with_http_info(asset_id, **kwargs) # noqa: E501 + return data + + def get_asset_by_id_using_get_with_http_info(self, asset_id, **kwargs): # noqa: E501 + """getAssetById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_asset_by_id_using_get_with_http_info(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['asset_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_asset_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'asset_id' is set + if ('asset_id' not in params or + params['asset_id'] is None): + raise ValueError("Missing the required parameter `asset_id` when calling `get_asset_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'asset_id' in params: + path_params['assetId'] = params['asset_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/asset/{assetId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Asset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_asset_info_by_id_using_get(self, asset_id, **kwargs): # noqa: E501 + """getAssetInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_asset_info_by_id_using_get(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: AssetInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_asset_info_by_id_using_get_with_http_info(asset_id, **kwargs) # noqa: E501 + else: + (data) = self.get_asset_info_by_id_using_get_with_http_info(asset_id, **kwargs) # noqa: E501 + return data + + def get_asset_info_by_id_using_get_with_http_info(self, asset_id, **kwargs): # noqa: E501 + """getAssetInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_asset_info_by_id_using_get_with_http_info(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: AssetInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['asset_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_asset_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'asset_id' is set + if ('asset_id' not in params or + params['asset_id'] is None): + raise ValueError("Missing the required parameter `asset_id` when calling `get_asset_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'asset_id' in params: + path_params['assetId'] = params['asset_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/asset/info/{assetId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='AssetInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_asset_types_using_get(self, **kwargs): # noqa: E501 + """getAssetTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_asset_types_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_asset_types_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_asset_types_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_asset_types_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getAssetTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_asset_types_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_asset_types_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/asset/types', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntitySubtype]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_assets_by_ids_using_get(self, asset_ids, **kwargs): # noqa: E501 + """getAssetsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_assets_by_ids_using_get(asset_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_ids: assetIds (required) + :return: list[Asset] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_assets_by_ids_using_get_with_http_info(asset_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_assets_by_ids_using_get_with_http_info(asset_ids, **kwargs) # noqa: E501 + return data + + def get_assets_by_ids_using_get_with_http_info(self, asset_ids, **kwargs): # noqa: E501 + """getAssetsByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_assets_by_ids_using_get_with_http_info(asset_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_ids: assetIds (required) + :return: list[Asset] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['asset_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_assets_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'asset_ids' is set + if ('asset_ids' not in params or + params['asset_ids'] is None): + raise ValueError("Missing the required parameter `asset_ids` when calling `get_assets_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'asset_ids' in params: + query_params.append(('assetIds', params['asset_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/assets{?assetIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Asset]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_asset_infos_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerAssetInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_asset_infos_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAssetInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_asset_infos_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_asset_infos_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_asset_infos_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerAssetInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_asset_infos_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAssetInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_asset_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_asset_infos_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_asset_infos_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_asset_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/assetInfos{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAssetInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_assets_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerAssets # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_assets_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_assets_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_assets_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_assets_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerAssets # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_assets_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_assets_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_assets_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_assets_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_assets_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/assets{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAsset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edge_assets_using_get(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeAssets # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_assets_using_get(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_assets_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_edge_assets_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_edge_assets_using_get_with_http_info(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeAssets # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_assets_using_get_with_http_info(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_assets_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_edge_assets_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_edge_assets_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_edge_assets_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/assets{?type,textSearch,sortProperty,sortOrder,startTime,endTime,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAsset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_asset_infos_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantAssetInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_asset_infos_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAssetInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_asset_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_asset_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_asset_infos_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantAssetInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_asset_infos_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAssetInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_asset_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_asset_infos_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_asset_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/assetInfos{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAssetInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_asset_using_get(self, asset_name, **kwargs): # noqa: E501 + """getTenantAsset # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_asset_using_get(asset_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_name: assetName (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_asset_using_get_with_http_info(asset_name, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_asset_using_get_with_http_info(asset_name, **kwargs) # noqa: E501 + return data + + def get_tenant_asset_using_get_with_http_info(self, asset_name, **kwargs): # noqa: E501 + """getTenantAsset # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_asset_using_get_with_http_info(asset_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_name: assetName (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['asset_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_asset_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'asset_name' is set + if ('asset_name' not in params or + params['asset_name'] is None): + raise ValueError("Missing the required parameter `asset_name` when calling `get_tenant_asset_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'asset_name' in params: + query_params.append(('assetName', params['asset_name'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/assets{?assetName}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Asset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_assets_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantAssets # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_assets_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_assets_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_assets_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_assets_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantAssets # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_assets_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataAsset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_assets_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_assets_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_assets_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/assets{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAsset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_asset_using_post(self, body, **kwargs): # noqa: E501 + """saveAsset # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_asset_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Asset body: asset (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_asset_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_asset_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_asset_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveAsset # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_asset_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Asset body: asset (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_asset_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_asset_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/asset', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Asset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_asset_from_customer_using_delete(self, asset_id, **kwargs): # noqa: E501 + """unassignAssetFromCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_asset_from_customer_using_delete(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_asset_from_customer_using_delete_with_http_info(asset_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_asset_from_customer_using_delete_with_http_info(asset_id, **kwargs) # noqa: E501 + return data + + def unassign_asset_from_customer_using_delete_with_http_info(self, asset_id, **kwargs): # noqa: E501 + """unassignAssetFromCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_asset_from_customer_using_delete_with_http_info(asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['asset_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_asset_from_customer_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'asset_id' is set + if ('asset_id' not in params or + params['asset_id'] is None): + raise ValueError("Missing the required parameter `asset_id` when calling `unassign_asset_from_customer_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'asset_id' in params: + path_params['assetId'] = params['asset_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/asset/{assetId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Asset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_asset_from_edge_using_delete(self, edge_id, asset_id, **kwargs): # noqa: E501 + """unassignAssetFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_asset_from_edge_using_delete(edge_id, asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_asset_from_edge_using_delete_with_http_info(edge_id, asset_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_asset_from_edge_using_delete_with_http_info(edge_id, asset_id, **kwargs) # noqa: E501 + return data + + def unassign_asset_from_edge_using_delete_with_http_info(self, edge_id, asset_id, **kwargs): # noqa: E501 + """unassignAssetFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_asset_from_edge_using_delete_with_http_info(edge_id, asset_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str asset_id: assetId (required) + :return: Asset + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'asset_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_asset_from_edge_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `unassign_asset_from_edge_using_delete`") # noqa: E501 + # verify the required parameter 'asset_id' is set + if ('asset_id' not in params or + params['asset_id'] is None): + raise ValueError("Missing the required parameter `asset_id` when calling `unassign_asset_from_edge_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'asset_id' in params: + path_params['assetId'] = params['asset_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/asset/{assetId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Asset', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/audit_log_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/audit_log_controller_api.py new file mode 100644 index 0000000..b90874d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/audit_log_controller_api.py @@ -0,0 +1,565 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class AuditLogControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_audit_logs_by_customer_id_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getAuditLogsByCustomerId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_audit_logs_by_customer_id_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :param str action_types: actionTypes + :return: PageDataAuditLog + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_audit_logs_by_customer_id_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_audit_logs_by_customer_id_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_audit_logs_by_customer_id_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getAuditLogsByCustomerId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_audit_logs_by_customer_id_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :param str action_types: actionTypes + :return: PageDataAuditLog + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time', 'action_types'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_audit_logs_by_customer_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_audit_logs_by_customer_id_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_audit_logs_by_customer_id_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_audit_logs_by_customer_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + if 'action_types' in params: + query_params.append(('actionTypes', params['action_types'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/audit/logs/customer/{customerId}{?textSearch,sortProperty,sortOrder,startTime,endTime,actionTypes,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAuditLog', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_audit_logs_by_entity_id_using_get(self, entity_type, entity_id, page_size, page, **kwargs): # noqa: E501 + """getAuditLogsByEntityId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_audit_logs_by_entity_id_using_get(entity_type, entity_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :param str action_types: actionTypes + :return: PageDataAuditLog + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_audit_logs_by_entity_id_using_get_with_http_info(entity_type, entity_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_audit_logs_by_entity_id_using_get_with_http_info(entity_type, entity_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_audit_logs_by_entity_id_using_get_with_http_info(self, entity_type, entity_id, page_size, page, **kwargs): # noqa: E501 + """getAuditLogsByEntityId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_audit_logs_by_entity_id_using_get_with_http_info(entity_type, entity_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :param str action_types: actionTypes + :return: PageDataAuditLog + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time', 'action_types'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_audit_logs_by_entity_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_audit_logs_by_entity_id_using_get`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_audit_logs_by_entity_id_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_audit_logs_by_entity_id_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_audit_logs_by_entity_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + if 'action_types' in params: + query_params.append(('actionTypes', params['action_types'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/audit/logs/entity/{entityType}/{entityId}{?textSearch,sortProperty,sortOrder,startTime,endTime,actionTypes,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAuditLog', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_audit_logs_by_user_id_using_get(self, user_id, page_size, page, **kwargs): # noqa: E501 + """getAuditLogsByUserId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_audit_logs_by_user_id_using_get(user_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :param str action_types: actionTypes + :return: PageDataAuditLog + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_audit_logs_by_user_id_using_get_with_http_info(user_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_audit_logs_by_user_id_using_get_with_http_info(user_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_audit_logs_by_user_id_using_get_with_http_info(self, user_id, page_size, page, **kwargs): # noqa: E501 + """getAuditLogsByUserId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_audit_logs_by_user_id_using_get_with_http_info(user_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :param str action_types: actionTypes + :return: PageDataAuditLog + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time', 'action_types'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_audit_logs_by_user_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_id' is set + if ('user_id' not in params or + params['user_id'] is None): + raise ValueError("Missing the required parameter `user_id` when calling `get_audit_logs_by_user_id_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_audit_logs_by_user_id_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_audit_logs_by_user_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'user_id' in params: + path_params['userId'] = params['user_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + if 'action_types' in params: + query_params.append(('actionTypes', params['action_types'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/audit/logs/user/{userId}{?textSearch,sortProperty,sortOrder,startTime,endTime,actionTypes,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAuditLog', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_audit_logs_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getAuditLogs # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_audit_logs_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :param str action_types: actionTypes + :return: PageDataAuditLog + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_audit_logs_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_audit_logs_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_audit_logs_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getAuditLogs # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_audit_logs_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :param str action_types: actionTypes + :return: PageDataAuditLog + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time', 'action_types'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_audit_logs_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_audit_logs_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_audit_logs_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + if 'action_types' in params: + query_params.append(('actionTypes', params['action_types'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/audit/logs{?textSearch,sortProperty,sortOrder,startTime,endTime,actionTypes,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAuditLog', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/auth_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/auth_controller_api.py new file mode 100644 index 0000000..4bbd260 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/auth_controller_api.py @@ -0,0 +1,858 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class AuthControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def activate_user_using_post(self, body, **kwargs): # noqa: E501 + """activateUser # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_user_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: activateRequest (required) + :param bool send_activation_mail: sendActivationMail + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.activate_user_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.activate_user_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def activate_user_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """activateUser # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_user_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: activateRequest (required) + :param bool send_activation_mail: sendActivationMail + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'send_activation_mail'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method activate_user_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `activate_user_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'send_activation_mail' in params: + query_params.append(('sendActivationMail', params['send_activation_mail'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/activate{?sendActivationMail}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def change_password_using_post(self, body, **kwargs): # noqa: E501 + """changePassword # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.change_password_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: changePasswordRequest (required) + :return: ObjectNode + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.change_password_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.change_password_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def change_password_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """changePassword # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.change_password_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: changePasswordRequest (required) + :return: ObjectNode + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method change_password_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `change_password_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/auth/changePassword', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='ObjectNode', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def check_activate_token_using_get(self, activate_token, **kwargs): # noqa: E501 + """checkActivateToken # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_activate_token_using_get(activate_token, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str activate_token: activateToken (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.check_activate_token_using_get_with_http_info(activate_token, **kwargs) # noqa: E501 + else: + (data) = self.check_activate_token_using_get_with_http_info(activate_token, **kwargs) # noqa: E501 + return data + + def check_activate_token_using_get_with_http_info(self, activate_token, **kwargs): # noqa: E501 + """checkActivateToken # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_activate_token_using_get_with_http_info(activate_token, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str activate_token: activateToken (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['activate_token'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method check_activate_token_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'activate_token' is set + if ('activate_token' not in params or + params['activate_token'] is None): + raise ValueError("Missing the required parameter `activate_token` when calling `check_activate_token_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'activate_token' in params: + query_params.append(('activateToken', params['activate_token'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/activate{?activateToken}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def check_reset_token_using_get(self, reset_token, **kwargs): # noqa: E501 + """checkResetToken # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_reset_token_using_get(reset_token, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str reset_token: resetToken (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.check_reset_token_using_get_with_http_info(reset_token, **kwargs) # noqa: E501 + else: + (data) = self.check_reset_token_using_get_with_http_info(reset_token, **kwargs) # noqa: E501 + return data + + def check_reset_token_using_get_with_http_info(self, reset_token, **kwargs): # noqa: E501 + """checkResetToken # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_reset_token_using_get_with_http_info(reset_token, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str reset_token: resetToken (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['reset_token'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method check_reset_token_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'reset_token' is set + if ('reset_token' not in params or + params['reset_token'] is None): + raise ValueError("Missing the required parameter `reset_token` when calling `check_reset_token_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'reset_token' in params: + query_params.append(('resetToken', params['reset_token'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/resetPassword{?resetToken}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_password_policy_using_get(self, **kwargs): # noqa: E501 + """getUserPasswordPolicy # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_password_policy_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: UserPasswordPolicy + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_password_policy_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_user_password_policy_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_user_password_policy_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getUserPasswordPolicy # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_password_policy_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: UserPasswordPolicy + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_password_policy_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/userPasswordPolicy', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='UserPasswordPolicy', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_using_get(self, **kwargs): # noqa: E501 + """getUser # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: User + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_user_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_user_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getUser # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: User + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/auth/user', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='User', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def logout_using_post(self, **kwargs): # noqa: E501 + """logout # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.logout_using_post(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.logout_using_post_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.logout_using_post_with_http_info(**kwargs) # noqa: E501 + return data + + def logout_using_post_with_http_info(self, **kwargs): # noqa: E501 + """logout # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.logout_using_post_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method logout_using_post" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/auth/logout', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def request_reset_password_by_email_using_post(self, body, **kwargs): # noqa: E501 + """requestResetPasswordByEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.request_reset_password_by_email_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: resetPasswordByEmailRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.request_reset_password_by_email_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.request_reset_password_by_email_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def request_reset_password_by_email_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """requestResetPasswordByEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.request_reset_password_by_email_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: resetPasswordByEmailRequest (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method request_reset_password_by_email_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `request_reset_password_by_email_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/resetPasswordByEmail', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def reset_password_using_post(self, body, **kwargs): # noqa: E501 + """resetPassword # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.reset_password_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: resetPasswordRequest (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.reset_password_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.reset_password_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def reset_password_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """resetPassword # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.reset_password_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: resetPasswordRequest (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method reset_password_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `reset_password_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/resetPassword', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/component_descriptor_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/component_descriptor_controller_api.py new file mode 100644 index 0000000..42e6068 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/component_descriptor_controller_api.py @@ -0,0 +1,320 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class ComponentDescriptorControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_component_descriptor_by_clazz_using_get(self, component_descriptor_clazz, **kwargs): # noqa: E501 + """getComponentDescriptorByClazz # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_component_descriptor_by_clazz_using_get(component_descriptor_clazz, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str component_descriptor_clazz: componentDescriptorClazz (required) + :return: ComponentDescriptor + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_component_descriptor_by_clazz_using_get_with_http_info(component_descriptor_clazz, **kwargs) # noqa: E501 + else: + (data) = self.get_component_descriptor_by_clazz_using_get_with_http_info(component_descriptor_clazz, **kwargs) # noqa: E501 + return data + + def get_component_descriptor_by_clazz_using_get_with_http_info(self, component_descriptor_clazz, **kwargs): # noqa: E501 + """getComponentDescriptorByClazz # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_component_descriptor_by_clazz_using_get_with_http_info(component_descriptor_clazz, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str component_descriptor_clazz: componentDescriptorClazz (required) + :return: ComponentDescriptor + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['component_descriptor_clazz'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_component_descriptor_by_clazz_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'component_descriptor_clazz' is set + if ('component_descriptor_clazz' not in params or + params['component_descriptor_clazz'] is None): + raise ValueError("Missing the required parameter `component_descriptor_clazz` when calling `get_component_descriptor_by_clazz_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'component_descriptor_clazz' in params: + path_params['componentDescriptorClazz'] = params['component_descriptor_clazz'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/component/{componentDescriptorClazz}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='ComponentDescriptor', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_component_descriptors_by_type_using_get(self, component_type, **kwargs): # noqa: E501 + """getComponentDescriptorsByType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_component_descriptors_by_type_using_get(component_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str component_type: componentType (required) + :param str rule_chain_type: ruleChainType + :return: list[ComponentDescriptor] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_component_descriptors_by_type_using_get_with_http_info(component_type, **kwargs) # noqa: E501 + else: + (data) = self.get_component_descriptors_by_type_using_get_with_http_info(component_type, **kwargs) # noqa: E501 + return data + + def get_component_descriptors_by_type_using_get_with_http_info(self, component_type, **kwargs): # noqa: E501 + """getComponentDescriptorsByType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_component_descriptors_by_type_using_get_with_http_info(component_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str component_type: componentType (required) + :param str rule_chain_type: ruleChainType + :return: list[ComponentDescriptor] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['component_type', 'rule_chain_type'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_component_descriptors_by_type_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'component_type' is set + if ('component_type' not in params or + params['component_type'] is None): + raise ValueError("Missing the required parameter `component_type` when calling `get_component_descriptors_by_type_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'component_type' in params: + path_params['componentType'] = params['component_type'] # noqa: E501 + + query_params = [] + if 'rule_chain_type' in params: + query_params.append(('ruleChainType', params['rule_chain_type'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/components/{componentType}{?ruleChainType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[ComponentDescriptor]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_component_descriptors_by_types_using_get(self, component_types, **kwargs): # noqa: E501 + """getComponentDescriptorsByTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_component_descriptors_by_types_using_get(component_types, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str component_types: componentTypes (required) + :param str rule_chain_type: ruleChainType + :return: list[ComponentDescriptor] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_component_descriptors_by_types_using_get_with_http_info(component_types, **kwargs) # noqa: E501 + else: + (data) = self.get_component_descriptors_by_types_using_get_with_http_info(component_types, **kwargs) # noqa: E501 + return data + + def get_component_descriptors_by_types_using_get_with_http_info(self, component_types, **kwargs): # noqa: E501 + """getComponentDescriptorsByTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_component_descriptors_by_types_using_get_with_http_info(component_types, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str component_types: componentTypes (required) + :param str rule_chain_type: ruleChainType + :return: list[ComponentDescriptor] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['component_types', 'rule_chain_type'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_component_descriptors_by_types_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'component_types' is set + if ('component_types' not in params or + params['component_types'] is None): + raise ValueError("Missing the required parameter `component_types` when calling `get_component_descriptors_by_types_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'rule_chain_type' in params: + query_params.append(('ruleChainType', params['rule_chain_type'])) # noqa: E501 + if 'component_types' in params: + query_params.append(('componentTypes', params['component_types'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/components{?ruleChainType,componentTypes}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[ComponentDescriptor]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/customer_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/customer_controller_api.py new file mode 100644 index 0000000..c57eefd --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/customer_controller_api.py @@ -0,0 +1,704 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class CustomerControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_customer_using_delete(self, customer_id, **kwargs): # noqa: E501 + """deleteCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_customer_using_delete(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_customer_using_delete_with_http_info(customer_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_customer_using_delete_with_http_info(customer_id, **kwargs) # noqa: E501 + return data + + def delete_customer_using_delete_with_http_info(self, customer_id, **kwargs): # noqa: E501 + """deleteCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_customer_using_delete_with_http_info(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_customer_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `delete_customer_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_by_id_using_get(self, customer_id, **kwargs): # noqa: E501 + """getCustomerById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_by_id_using_get(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: Customer + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_by_id_using_get_with_http_info(customer_id, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_by_id_using_get_with_http_info(customer_id, **kwargs) # noqa: E501 + return data + + def get_customer_by_id_using_get_with_http_info(self, customer_id, **kwargs): # noqa: E501 + """getCustomerById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_by_id_using_get_with_http_info(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: Customer + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Customer', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_title_by_id_using_get(self, customer_id, **kwargs): # noqa: E501 + """getCustomerTitleById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_title_by_id_using_get(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_title_by_id_using_get_with_http_info(customer_id, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_title_by_id_using_get_with_http_info(customer_id, **kwargs) # noqa: E501 + return data + + def get_customer_title_by_id_using_get_with_http_info(self, customer_id, **kwargs): # noqa: E501 + """getCustomerTitleById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_title_by_id_using_get_with_http_info(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_title_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_title_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/text']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/title', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customers_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getCustomers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customers_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataCustomer + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customers_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customers_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_customers_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getCustomers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customers_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataCustomer + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customers_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customers_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customers_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customers{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataCustomer', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_short_customer_info_by_id_using_get(self, customer_id, **kwargs): # noqa: E501 + """getShortCustomerInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_short_customer_info_by_id_using_get(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_short_customer_info_by_id_using_get_with_http_info(customer_id, **kwargs) # noqa: E501 + else: + (data) = self.get_short_customer_info_by_id_using_get_with_http_info(customer_id, **kwargs) # noqa: E501 + return data + + def get_short_customer_info_by_id_using_get_with_http_info(self, customer_id, **kwargs): # noqa: E501 + """getShortCustomerInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_short_customer_info_by_id_using_get_with_http_info(customer_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_short_customer_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_short_customer_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/shortInfo', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_customer_using_get(self, customer_title, **kwargs): # noqa: E501 + """getTenantCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_customer_using_get(customer_title, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_title: customerTitle (required) + :return: Customer + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_customer_using_get_with_http_info(customer_title, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_customer_using_get_with_http_info(customer_title, **kwargs) # noqa: E501 + return data + + def get_tenant_customer_using_get_with_http_info(self, customer_title, **kwargs): # noqa: E501 + """getTenantCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_customer_using_get_with_http_info(customer_title, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_title: customerTitle (required) + :return: Customer + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_title'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_customer_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_title' is set + if ('customer_title' not in params or + params['customer_title'] is None): + raise ValueError("Missing the required parameter `customer_title` when calling `get_tenant_customer_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'customer_title' in params: + query_params.append(('customerTitle', params['customer_title'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/customers{?customerTitle}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Customer', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_customer_using_post(self, body, **kwargs): # noqa: E501 + """saveCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_customer_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Customer body: customer (required) + :return: Customer + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_customer_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_customer_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_customer_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_customer_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Customer body: customer (required) + :return: Customer + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Customer', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/dashboard_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/dashboard_controller_api.py new file mode 100644 index 0000000..f57af7d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/dashboard_controller_api.py @@ -0,0 +1,2316 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class DashboardControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def add_dashboard_customers_using_post(self, body, dashboard_id, **kwargs): # noqa: E501 + """addDashboardCustomers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.add_dashboard_customers_using_post(body, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param list[str] body: strCustomerIds (required) + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.add_dashboard_customers_using_post_with_http_info(body, dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.add_dashboard_customers_using_post_with_http_info(body, dashboard_id, **kwargs) # noqa: E501 + return data + + def add_dashboard_customers_using_post_with_http_info(self, body, dashboard_id, **kwargs): # noqa: E501 + """addDashboardCustomers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.add_dashboard_customers_using_post_with_http_info(body, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param list[str] body: strCustomerIds (required) + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method add_dashboard_customers_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `add_dashboard_customers_using_post`") # noqa: E501 + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `add_dashboard_customers_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/{dashboardId}/customers/add', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_dashboard_to_customer_using_post(self, customer_id, dashboard_id, **kwargs): # noqa: E501 + """assignDashboardToCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_dashboard_to_customer_using_post(customer_id, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_dashboard_to_customer_using_post_with_http_info(customer_id, dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_dashboard_to_customer_using_post_with_http_info(customer_id, dashboard_id, **kwargs) # noqa: E501 + return data + + def assign_dashboard_to_customer_using_post_with_http_info(self, customer_id, dashboard_id, **kwargs): # noqa: E501 + """assignDashboardToCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_dashboard_to_customer_using_post_with_http_info(customer_id, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_dashboard_to_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `assign_dashboard_to_customer_using_post`") # noqa: E501 + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `assign_dashboard_to_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/dashboard/{dashboardId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_dashboard_to_edge_using_post(self, edge_id, dashboard_id, **kwargs): # noqa: E501 + """assignDashboardToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_dashboard_to_edge_using_post(edge_id, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_dashboard_to_edge_using_post_with_http_info(edge_id, dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_dashboard_to_edge_using_post_with_http_info(edge_id, dashboard_id, **kwargs) # noqa: E501 + return data + + def assign_dashboard_to_edge_using_post_with_http_info(self, edge_id, dashboard_id, **kwargs): # noqa: E501 + """assignDashboardToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_dashboard_to_edge_using_post_with_http_info(edge_id, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_dashboard_to_edge_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `assign_dashboard_to_edge_using_post`") # noqa: E501 + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `assign_dashboard_to_edge_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/dashboard/{dashboardId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_dashboard_to_public_customer_using_post(self, dashboard_id, **kwargs): # noqa: E501 + """assignDashboardToPublicCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_dashboard_to_public_customer_using_post(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_dashboard_to_public_customer_using_post_with_http_info(dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_dashboard_to_public_customer_using_post_with_http_info(dashboard_id, **kwargs) # noqa: E501 + return data + + def assign_dashboard_to_public_customer_using_post_with_http_info(self, dashboard_id, **kwargs): # noqa: E501 + """assignDashboardToPublicCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_dashboard_to_public_customer_using_post_with_http_info(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_dashboard_to_public_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `assign_dashboard_to_public_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/public/dashboard/{dashboardId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_dashboard_using_delete(self, dashboard_id, **kwargs): # noqa: E501 + """deleteDashboard # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_dashboard_using_delete(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_dashboard_using_delete_with_http_info(dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_dashboard_using_delete_with_http_info(dashboard_id, **kwargs) # noqa: E501 + return data + + def delete_dashboard_using_delete_with_http_info(self, dashboard_id, **kwargs): # noqa: E501 + """deleteDashboard # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_dashboard_using_delete_with_http_info(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_dashboard_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `delete_dashboard_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/{dashboardId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_dashboards_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_dashboards_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param bool mobile: mobile + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_dashboards_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_dashboards_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_dashboards_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_dashboards_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param bool mobile: mobile + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'mobile', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_dashboards_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_dashboards_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_dashboards_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_dashboards_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'mobile' in params: + query_params.append(('mobile', params['mobile'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/dashboards{?mobile,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_dashboard_by_id_using_get(self, dashboard_id, **kwargs): # noqa: E501 + """getDashboardById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_dashboard_by_id_using_get(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_dashboard_by_id_using_get_with_http_info(dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.get_dashboard_by_id_using_get_with_http_info(dashboard_id, **kwargs) # noqa: E501 + return data + + def get_dashboard_by_id_using_get_with_http_info(self, dashboard_id, **kwargs): # noqa: E501 + """getDashboardById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_dashboard_by_id_using_get_with_http_info(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_dashboard_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `get_dashboard_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/{dashboardId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_dashboard_info_by_id_using_get(self, dashboard_id, **kwargs): # noqa: E501 + """getDashboardInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_dashboard_info_by_id_using_get(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: DashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_dashboard_info_by_id_using_get_with_http_info(dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.get_dashboard_info_by_id_using_get_with_http_info(dashboard_id, **kwargs) # noqa: E501 + return data + + def get_dashboard_info_by_id_using_get_with_http_info(self, dashboard_id, **kwargs): # noqa: E501 + """getDashboardInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_dashboard_info_by_id_using_get_with_http_info(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: DashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_dashboard_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `get_dashboard_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/info/{dashboardId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edge_dashboards_using_get(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_dashboards_using_get(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_dashboards_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_edge_dashboards_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_edge_dashboards_using_get_with_http_info(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_dashboards_using_get_with_http_info(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_dashboards_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_edge_dashboards_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_edge_dashboards_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_edge_dashboards_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/dashboards{?textSearch,sortProperty,sortOrder,startTime,endTime,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_home_dashboard_info_using_get(self, **kwargs): # noqa: E501 + """getHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_home_dashboard_info_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_home_dashboard_info_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_home_dashboard_info_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_home_dashboard_info_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_home_dashboard_info_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_home_dashboard_info_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/home/info', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='HomeDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_home_dashboard_using_get(self, **kwargs): # noqa: E501 + """getHomeDashboard # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_home_dashboard_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_home_dashboard_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_home_dashboard_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_home_dashboard_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getHomeDashboard # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_home_dashboard_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_home_dashboard_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/home', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='HomeDashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_max_datapoints_limit_using_get(self, **kwargs): # noqa: E501 + """getMaxDatapointsLimit # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_max_datapoints_limit_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: int + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_max_datapoints_limit_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_max_datapoints_limit_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_max_datapoints_limit_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getMaxDatapointsLimit # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_max_datapoints_limit_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: int + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_max_datapoints_limit_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/maxDatapointsLimit', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='int', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_server_time_using_get(self, **kwargs): # noqa: E501 + """getServerTime # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_server_time_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: int + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_server_time_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_server_time_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_server_time_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getServerTime # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_server_time_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: int + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_server_time_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/serverTime', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='int', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_dashboards_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_dashboards_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param bool mobile: mobile + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_dashboards_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_dashboards_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_dashboards_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_dashboards_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param bool mobile: mobile + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'mobile', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_dashboards_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_dashboards_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_dashboards_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'mobile' in params: + query_params.append(('mobile', params['mobile'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/dashboards{?mobile,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_dashboards_using_get1(self, tenant_id, page_size, page, **kwargs): # noqa: E501 + """getTenantDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_dashboards_using_get1(tenant_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_dashboards_using_get1_with_http_info(tenant_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_dashboards_using_get1_with_http_info(tenant_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_dashboards_using_get1_with_http_info(self, tenant_id, page_size, page, **kwargs): # noqa: E501 + """getTenantDashboards # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_dashboards_using_get1_with_http_info(tenant_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_dashboards_using_get1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `get_tenant_dashboards_using_get1`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_dashboards_using_get1`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_dashboards_using_get1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_id' in params: + path_params['tenantId'] = params['tenant_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/{tenantId}/dashboards{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_home_dashboard_info_using_get(self, **kwargs): # noqa: E501 + """getTenantHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_home_dashboard_info_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_home_dashboard_info_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_tenant_home_dashboard_info_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_tenant_home_dashboard_info_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getTenantHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_home_dashboard_info_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: HomeDashboardInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_home_dashboard_info_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/dashboard/home/info', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='HomeDashboardInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def remove_dashboard_customers_using_post(self, body, dashboard_id, **kwargs): # noqa: E501 + """removeDashboardCustomers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.remove_dashboard_customers_using_post(body, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param list[str] body: strCustomerIds (required) + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.remove_dashboard_customers_using_post_with_http_info(body, dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.remove_dashboard_customers_using_post_with_http_info(body, dashboard_id, **kwargs) # noqa: E501 + return data + + def remove_dashboard_customers_using_post_with_http_info(self, body, dashboard_id, **kwargs): # noqa: E501 + """removeDashboardCustomers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.remove_dashboard_customers_using_post_with_http_info(body, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param list[str] body: strCustomerIds (required) + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method remove_dashboard_customers_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `remove_dashboard_customers_using_post`") # noqa: E501 + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `remove_dashboard_customers_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/{dashboardId}/customers/remove', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_dashboard_using_post(self, body, **kwargs): # noqa: E501 + """saveDashboard # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_dashboard_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Dashboard body: dashboard (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_dashboard_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_dashboard_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_dashboard_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveDashboard # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_dashboard_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Dashboard body: dashboard (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_dashboard_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_dashboard_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_tenant_home_dashboard_info_using_post(self, body, **kwargs): # noqa: E501 + """setTenantHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_tenant_home_dashboard_info_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param HomeDashboardInfo body: homeDashboardInfo (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_tenant_home_dashboard_info_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.set_tenant_home_dashboard_info_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def set_tenant_home_dashboard_info_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """setTenantHomeDashboardInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_tenant_home_dashboard_info_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param HomeDashboardInfo body: homeDashboardInfo (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_tenant_home_dashboard_info_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `set_tenant_home_dashboard_info_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/dashboard/home/info', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_dashboard_from_customer_using_delete(self, customer_id, dashboard_id, **kwargs): # noqa: E501 + """unassignDashboardFromCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_dashboard_from_customer_using_delete(customer_id, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_dashboard_from_customer_using_delete_with_http_info(customer_id, dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_dashboard_from_customer_using_delete_with_http_info(customer_id, dashboard_id, **kwargs) # noqa: E501 + return data + + def unassign_dashboard_from_customer_using_delete_with_http_info(self, customer_id, dashboard_id, **kwargs): # noqa: E501 + """unassignDashboardFromCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_dashboard_from_customer_using_delete_with_http_info(customer_id, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_dashboard_from_customer_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `unassign_dashboard_from_customer_using_delete`") # noqa: E501 + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `unassign_dashboard_from_customer_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/dashboard/{dashboardId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_dashboard_from_edge_using_delete(self, edge_id, dashboard_id, **kwargs): # noqa: E501 + """unassignDashboardFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_dashboard_from_edge_using_delete(edge_id, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_dashboard_from_edge_using_delete_with_http_info(edge_id, dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_dashboard_from_edge_using_delete_with_http_info(edge_id, dashboard_id, **kwargs) # noqa: E501 + return data + + def unassign_dashboard_from_edge_using_delete_with_http_info(self, edge_id, dashboard_id, **kwargs): # noqa: E501 + """unassignDashboardFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_dashboard_from_edge_using_delete_with_http_info(edge_id, dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_dashboard_from_edge_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `unassign_dashboard_from_edge_using_delete`") # noqa: E501 + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `unassign_dashboard_from_edge_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/dashboard/{dashboardId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_dashboard_from_public_customer_using_delete(self, dashboard_id, **kwargs): # noqa: E501 + """unassignDashboardFromPublicCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_dashboard_from_public_customer_using_delete(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_dashboard_from_public_customer_using_delete_with_http_info(dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_dashboard_from_public_customer_using_delete_with_http_info(dashboard_id, **kwargs) # noqa: E501 + return data + + def unassign_dashboard_from_public_customer_using_delete_with_http_info(self, dashboard_id, **kwargs): # noqa: E501 + """unassignDashboardFromPublicCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_dashboard_from_public_customer_using_delete_with_http_info(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['dashboard_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_dashboard_from_public_customer_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `unassign_dashboard_from_public_customer_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/public/dashboard/{dashboardId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def update_dashboard_customers_using_post(self, dashboard_id, **kwargs): # noqa: E501 + """updateDashboardCustomers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.update_dashboard_customers_using_post(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :param list[str] body: strCustomerIds + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.update_dashboard_customers_using_post_with_http_info(dashboard_id, **kwargs) # noqa: E501 + else: + (data) = self.update_dashboard_customers_using_post_with_http_info(dashboard_id, **kwargs) # noqa: E501 + return data + + def update_dashboard_customers_using_post_with_http_info(self, dashboard_id, **kwargs): # noqa: E501 + """updateDashboardCustomers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.update_dashboard_customers_using_post_with_http_info(dashboard_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str dashboard_id: dashboardId (required) + :param list[str] body: strCustomerIds + :return: Dashboard + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['dashboard_id', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method update_dashboard_customers_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'dashboard_id' is set + if ('dashboard_id' not in params or + params['dashboard_id'] is None): + raise ValueError("Missing the required parameter `dashboard_id` when calling `update_dashboard_customers_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'dashboard_id' in params: + path_params['dashboardId'] = params['dashboard_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/dashboard/{dashboardId}/customers', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Dashboard', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/device_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/device_controller_api.py new file mode 100644 index 0000000..759c682 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/device_controller_api.py @@ -0,0 +1,2477 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class DeviceControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def assign_device_to_customer_using_post(self, customer_id, device_id, **kwargs): # noqa: E501 + """assignDeviceToCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_device_to_customer_using_post(customer_id, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_device_to_customer_using_post_with_http_info(customer_id, device_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_device_to_customer_using_post_with_http_info(customer_id, device_id, **kwargs) # noqa: E501 + return data + + def assign_device_to_customer_using_post_with_http_info(self, customer_id, device_id, **kwargs): # noqa: E501 + """assignDeviceToCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_device_to_customer_using_post_with_http_info(customer_id, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_device_to_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `assign_device_to_customer_using_post`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `assign_device_to_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/device/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_device_to_edge_using_post(self, edge_id, device_id, **kwargs): # noqa: E501 + """assignDeviceToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_device_to_edge_using_post(edge_id, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_device_to_edge_using_post_with_http_info(edge_id, device_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_device_to_edge_using_post_with_http_info(edge_id, device_id, **kwargs) # noqa: E501 + return data + + def assign_device_to_edge_using_post_with_http_info(self, edge_id, device_id, **kwargs): # noqa: E501 + """assignDeviceToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_device_to_edge_using_post_with_http_info(edge_id, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_device_to_edge_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `assign_device_to_edge_using_post`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `assign_device_to_edge_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/device/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_device_to_public_customer_using_post(self, device_id, **kwargs): # noqa: E501 + """assignDeviceToPublicCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_device_to_public_customer_using_post(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_device_to_public_customer_using_post_with_http_info(device_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_device_to_public_customer_using_post_with_http_info(device_id, **kwargs) # noqa: E501 + return data + + def assign_device_to_public_customer_using_post_with_http_info(self, device_id, **kwargs): # noqa: E501 + """assignDeviceToPublicCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_device_to_public_customer_using_post_with_http_info(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_device_to_public_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `assign_device_to_public_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/public/device/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_device_to_tenant_using_post(self, tenant_id, device_id, **kwargs): # noqa: E501 + """assignDeviceToTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_device_to_tenant_using_post(tenant_id, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_device_to_tenant_using_post_with_http_info(tenant_id, device_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_device_to_tenant_using_post_with_http_info(tenant_id, device_id, **kwargs) # noqa: E501 + return data + + def assign_device_to_tenant_using_post_with_http_info(self, tenant_id, device_id, **kwargs): # noqa: E501 + """assignDeviceToTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_device_to_tenant_using_post_with_http_info(tenant_id, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_id', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_device_to_tenant_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `assign_device_to_tenant_using_post`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `assign_device_to_tenant_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_id' in params: + path_params['tenantId'] = params['tenant_id'] # noqa: E501 + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/{tenantId}/device/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def claim_device_using_post(self, device_name, **kwargs): # noqa: E501 + """claimDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.claim_device_using_post(device_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_name: deviceName (required) + :param ClaimRequest body: claimRequest + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.claim_device_using_post_with_http_info(device_name, **kwargs) # noqa: E501 + else: + (data) = self.claim_device_using_post_with_http_info(device_name, **kwargs) # noqa: E501 + return data + + def claim_device_using_post_with_http_info(self, device_name, **kwargs): # noqa: E501 + """claimDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.claim_device_using_post_with_http_info(device_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_name: deviceName (required) + :param ClaimRequest body: claimRequest + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_name', 'body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method claim_device_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_name' is set + if ('device_name' not in params or + params['device_name'] is None): + raise ValueError("Missing the required parameter `device_name` when calling `claim_device_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_name' in params: + path_params['deviceName'] = params['device_name'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/device/{deviceName}/claim', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def count_by_device_profile_and_empty_ota_package_using_get(self, ota_package_type, device_profile_id, **kwargs): # noqa: E501 + """countByDeviceProfileAndEmptyOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.count_by_device_profile_and_empty_ota_package_using_get(ota_package_type, device_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_type: otaPackageType (required) + :param str device_profile_id: deviceProfileId (required) + :return: int + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.count_by_device_profile_and_empty_ota_package_using_get_with_http_info(ota_package_type, device_profile_id, **kwargs) # noqa: E501 + else: + (data) = self.count_by_device_profile_and_empty_ota_package_using_get_with_http_info(ota_package_type, device_profile_id, **kwargs) # noqa: E501 + return data + + def count_by_device_profile_and_empty_ota_package_using_get_with_http_info(self, ota_package_type, device_profile_id, **kwargs): # noqa: E501 + """countByDeviceProfileAndEmptyOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.count_by_device_profile_and_empty_ota_package_using_get_with_http_info(ota_package_type, device_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_type: otaPackageType (required) + :param str device_profile_id: deviceProfileId (required) + :return: int + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['ota_package_type', 'device_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method count_by_device_profile_and_empty_ota_package_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'ota_package_type' is set + if ('ota_package_type' not in params or + params['ota_package_type'] is None): + raise ValueError("Missing the required parameter `ota_package_type` when calling `count_by_device_profile_and_empty_ota_package_using_get`") # noqa: E501 + # verify the required parameter 'device_profile_id' is set + if ('device_profile_id' not in params or + params['device_profile_id'] is None): + raise ValueError("Missing the required parameter `device_profile_id` when calling `count_by_device_profile_and_empty_ota_package_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_type' in params: + path_params['otaPackageType'] = params['ota_package_type'] # noqa: E501 + if 'device_profile_id' in params: + path_params['deviceProfileId'] = params['device_profile_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/devices/count/{otaPackageType}/{deviceProfileId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='int', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_device_using_delete(self, device_id, **kwargs): # noqa: E501 + """deleteDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_device_using_delete(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_device_using_delete_with_http_info(device_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_device_using_delete_with_http_info(device_id, **kwargs) # noqa: E501 + return data + + def delete_device_using_delete_with_http_info(self, device_id, **kwargs): # noqa: E501 + """deleteDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_device_using_delete_with_http_info(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_device_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `delete_device_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device/{deviceId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_query_using_post1(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post1(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DeviceSearchQuery body: query (required) + :return: list[Device] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_query_using_post1_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.find_by_query_using_post1_with_http_info(body, **kwargs) # noqa: E501 + return data + + def find_by_query_using_post1_with_http_info(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post1_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DeviceSearchQuery body: query (required) + :return: list[Device] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_query_using_post1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_by_query_using_post1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/devices', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Device]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_device_infos_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerDeviceInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_device_infos_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str device_profile_id: deviceProfileId + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDeviceInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_device_infos_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_device_infos_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_device_infos_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerDeviceInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_device_infos_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str device_profile_id: deviceProfileId + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDeviceInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'type', 'device_profile_id', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_device_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_device_infos_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_device_infos_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_device_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'device_profile_id' in params: + query_params.append(('deviceProfileId', params['device_profile_id'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/deviceInfos{?type,deviceProfileId,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDeviceInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_devices_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerDevices # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_devices_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_devices_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_devices_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_devices_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerDevices # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_devices_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_devices_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_devices_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_devices_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_devices_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/devices{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDevice', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_device_by_id_using_get(self, device_id, **kwargs): # noqa: E501 + """getDeviceById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_by_id_using_get(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_device_by_id_using_get_with_http_info(device_id, **kwargs) # noqa: E501 + else: + (data) = self.get_device_by_id_using_get_with_http_info(device_id, **kwargs) # noqa: E501 + return data + + def get_device_by_id_using_get_with_http_info(self, device_id, **kwargs): # noqa: E501 + """getDeviceById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_by_id_using_get_with_http_info(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_device_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `get_device_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device/{deviceId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_device_credentials_by_device_id_using_get(self, device_id, **kwargs): # noqa: E501 + """getDeviceCredentialsByDeviceId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_credentials_by_device_id_using_get(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: DeviceCredentials + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_device_credentials_by_device_id_using_get_with_http_info(device_id, **kwargs) # noqa: E501 + else: + (data) = self.get_device_credentials_by_device_id_using_get_with_http_info(device_id, **kwargs) # noqa: E501 + return data + + def get_device_credentials_by_device_id_using_get_with_http_info(self, device_id, **kwargs): # noqa: E501 + """getDeviceCredentialsByDeviceId # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_credentials_by_device_id_using_get_with_http_info(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: DeviceCredentials + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_device_credentials_by_device_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `get_device_credentials_by_device_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device/{deviceId}/credentials', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeviceCredentials', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_device_info_by_id_using_get(self, device_id, **kwargs): # noqa: E501 + """getDeviceInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_info_by_id_using_get(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: DeviceInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_device_info_by_id_using_get_with_http_info(device_id, **kwargs) # noqa: E501 + else: + (data) = self.get_device_info_by_id_using_get_with_http_info(device_id, **kwargs) # noqa: E501 + return data + + def get_device_info_by_id_using_get_with_http_info(self, device_id, **kwargs): # noqa: E501 + """getDeviceInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_info_by_id_using_get_with_http_info(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: DeviceInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_device_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `get_device_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device/info/{deviceId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeviceInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_device_types_using_get(self, **kwargs): # noqa: E501 + """getDeviceTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_types_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_device_types_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_device_types_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_device_types_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getDeviceTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_types_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_device_types_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device/types', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntitySubtype]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_devices_by_ids_using_get(self, device_ids, **kwargs): # noqa: E501 + """getDevicesByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_devices_by_ids_using_get(device_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_ids: deviceIds (required) + :return: list[Device] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_devices_by_ids_using_get_with_http_info(device_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_devices_by_ids_using_get_with_http_info(device_ids, **kwargs) # noqa: E501 + return data + + def get_devices_by_ids_using_get_with_http_info(self, device_ids, **kwargs): # noqa: E501 + """getDevicesByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_devices_by_ids_using_get_with_http_info(device_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_ids: deviceIds (required) + :return: list[Device] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_devices_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_ids' is set + if ('device_ids' not in params or + params['device_ids'] is None): + raise ValueError("Missing the required parameter `device_ids` when calling `get_devices_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'device_ids' in params: + query_params.append(('deviceIds', params['device_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/devices{?deviceIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Device]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edge_devices_using_get(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeDevices # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_devices_using_get(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_devices_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_edge_devices_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_edge_devices_using_get_with_http_info(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeDevices # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_devices_using_get_with_http_info(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_devices_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_edge_devices_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_edge_devices_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_edge_devices_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/devices{?type,textSearch,sortProperty,sortOrder,startTime,endTime,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDevice', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_device_infos_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantDeviceInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_device_infos_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str device_profile_id: deviceProfileId + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDeviceInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_device_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_device_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_device_infos_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantDeviceInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_device_infos_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str device_profile_id: deviceProfileId + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDeviceInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'device_profile_id', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_device_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_device_infos_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_device_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'device_profile_id' in params: + query_params.append(('deviceProfileId', params['device_profile_id'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/deviceInfos{?type,deviceProfileId,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDeviceInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_device_using_get(self, device_name, **kwargs): # noqa: E501 + """getTenantDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_device_using_get(device_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_name: deviceName (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_device_using_get_with_http_info(device_name, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_device_using_get_with_http_info(device_name, **kwargs) # noqa: E501 + return data + + def get_tenant_device_using_get_with_http_info(self, device_name, **kwargs): # noqa: E501 + """getTenantDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_device_using_get_with_http_info(device_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_name: deviceName (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_device_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_name' is set + if ('device_name' not in params or + params['device_name'] is None): + raise ValueError("Missing the required parameter `device_name` when calling `get_tenant_device_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'device_name' in params: + query_params.append(('deviceName', params['device_name'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/devices{?deviceName}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_devices_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantDevices # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_devices_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_devices_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_devices_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_devices_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantDevices # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_devices_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDevice + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_devices_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_devices_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_devices_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/devices{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDevice', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def re_claim_device_using_delete(self, device_name, **kwargs): # noqa: E501 + """reClaimDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.re_claim_device_using_delete(device_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_name: deviceName (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.re_claim_device_using_delete_with_http_info(device_name, **kwargs) # noqa: E501 + else: + (data) = self.re_claim_device_using_delete_with_http_info(device_name, **kwargs) # noqa: E501 + return data + + def re_claim_device_using_delete_with_http_info(self, device_name, **kwargs): # noqa: E501 + """reClaimDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.re_claim_device_using_delete_with_http_info(device_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_name: deviceName (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method re_claim_device_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_name' is set + if ('device_name' not in params or + params['device_name'] is None): + raise ValueError("Missing the required parameter `device_name` when calling `re_claim_device_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_name' in params: + path_params['deviceName'] = params['device_name'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/device/{deviceName}/claim', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_device_credentials_using_post(self, body, **kwargs): # noqa: E501 + """saveDeviceCredentials # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_credentials_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DeviceCredentials body: deviceCredentials (required) + :return: DeviceCredentials + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_device_credentials_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_device_credentials_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_device_credentials_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveDeviceCredentials # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_credentials_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DeviceCredentials body: deviceCredentials (required) + :return: DeviceCredentials + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_device_credentials_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_device_credentials_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device/credentials', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeviceCredentials', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_device_using_post(self, body, **kwargs): # noqa: E501 + """saveDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Device body: device (required) + :param str access_token: accessToken + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_device_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_device_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_device_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Device body: device (required) + :param str access_token: accessToken + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'access_token'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_device_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_device_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'access_token' in params: + query_params.append(('accessToken', params['access_token'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/device{?accessToken}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_device_from_customer_using_delete(self, device_id, **kwargs): # noqa: E501 + """unassignDeviceFromCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_device_from_customer_using_delete(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_device_from_customer_using_delete_with_http_info(device_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_device_from_customer_using_delete_with_http_info(device_id, **kwargs) # noqa: E501 + return data + + def unassign_device_from_customer_using_delete_with_http_info(self, device_id, **kwargs): # noqa: E501 + """unassignDeviceFromCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_device_from_customer_using_delete_with_http_info(device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_device_from_customer_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `unassign_device_from_customer_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/device/{deviceId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_device_from_edge_using_delete(self, edge_id, device_id, **kwargs): # noqa: E501 + """unassignDeviceFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_device_from_edge_using_delete(edge_id, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_device_from_edge_using_delete_with_http_info(edge_id, device_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_device_from_edge_using_delete_with_http_info(edge_id, device_id, **kwargs) # noqa: E501 + return data + + def unassign_device_from_edge_using_delete_with_http_info(self, edge_id, device_id, **kwargs): # noqa: E501 + """unassignDeviceFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_device_from_edge_using_delete_with_http_info(edge_id, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str device_id: deviceId (required) + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_device_from_edge_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `unassign_device_from_edge_using_delete`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `unassign_device_from_edge_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/device/{deviceId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/device_profile_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/device_profile_controller_api.py new file mode 100644 index 0000000..04a6cc7 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/device_profile_controller_api.py @@ -0,0 +1,991 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class DeviceProfileControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_device_profile_using_delete(self, device_profile_id, **kwargs): # noqa: E501 + """deleteDeviceProfile # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_device_profile_using_delete(device_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_device_profile_using_delete_with_http_info(device_profile_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_device_profile_using_delete_with_http_info(device_profile_id, **kwargs) # noqa: E501 + return data + + def delete_device_profile_using_delete_with_http_info(self, device_profile_id, **kwargs): # noqa: E501 + """deleteDeviceProfile # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_device_profile_using_delete_with_http_info(device_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_device_profile_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_profile_id' is set + if ('device_profile_id' not in params or + params['device_profile_id'] is None): + raise ValueError("Missing the required parameter `device_profile_id` when calling `delete_device_profile_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_profile_id' in params: + path_params['deviceProfileId'] = params['device_profile_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceProfile/{deviceProfileId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_attributes_keys_using_get(self, **kwargs): # noqa: E501 + """getAttributesKeys # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_attributes_keys_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId + :return: list[str] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_attributes_keys_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_attributes_keys_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_attributes_keys_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getAttributesKeys # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_attributes_keys_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId + :return: list[str] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_attributes_keys_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'device_profile_id' in params: + query_params.append(('deviceProfileId', params['device_profile_id'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceProfile/devices/keys/attributes{?deviceProfileId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[str]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_default_device_profile_info_using_get(self, **kwargs): # noqa: E501 + """getDefaultDeviceProfileInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_default_device_profile_info_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: DeviceProfileInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_default_device_profile_info_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_default_device_profile_info_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_default_device_profile_info_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getDefaultDeviceProfileInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_default_device_profile_info_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: DeviceProfileInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_default_device_profile_info_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceProfileInfo/default', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeviceProfileInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_device_profile_by_id_using_get(self, device_profile_id, **kwargs): # noqa: E501 + """getDeviceProfileById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_profile_by_id_using_get(device_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId (required) + :return: DeviceProfile + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_device_profile_by_id_using_get_with_http_info(device_profile_id, **kwargs) # noqa: E501 + else: + (data) = self.get_device_profile_by_id_using_get_with_http_info(device_profile_id, **kwargs) # noqa: E501 + return data + + def get_device_profile_by_id_using_get_with_http_info(self, device_profile_id, **kwargs): # noqa: E501 + """getDeviceProfileById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_profile_by_id_using_get_with_http_info(device_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId (required) + :return: DeviceProfile + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_device_profile_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_profile_id' is set + if ('device_profile_id' not in params or + params['device_profile_id'] is None): + raise ValueError("Missing the required parameter `device_profile_id` when calling `get_device_profile_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_profile_id' in params: + path_params['deviceProfileId'] = params['device_profile_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceProfile/{deviceProfileId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeviceProfile', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_device_profile_info_by_id_using_get(self, device_profile_id, **kwargs): # noqa: E501 + """getDeviceProfileInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_profile_info_by_id_using_get(device_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId (required) + :return: DeviceProfileInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_device_profile_info_by_id_using_get_with_http_info(device_profile_id, **kwargs) # noqa: E501 + else: + (data) = self.get_device_profile_info_by_id_using_get_with_http_info(device_profile_id, **kwargs) # noqa: E501 + return data + + def get_device_profile_info_by_id_using_get_with_http_info(self, device_profile_id, **kwargs): # noqa: E501 + """getDeviceProfileInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_profile_info_by_id_using_get_with_http_info(device_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId (required) + :return: DeviceProfileInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_device_profile_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_profile_id' is set + if ('device_profile_id' not in params or + params['device_profile_id'] is None): + raise ValueError("Missing the required parameter `device_profile_id` when calling `get_device_profile_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_profile_id' in params: + path_params['deviceProfileId'] = params['device_profile_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceProfileInfo/{deviceProfileId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeviceProfileInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_device_profile_infos_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getDeviceProfileInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_profile_infos_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param str transport_type: transportType + :return: PageDataDeviceProfileInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_device_profile_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_device_profile_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_device_profile_infos_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getDeviceProfileInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_profile_infos_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param str transport_type: transportType + :return: PageDataDeviceProfileInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order', 'transport_type'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_device_profile_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_device_profile_infos_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_device_profile_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'transport_type' in params: + query_params.append(('transportType', params['transport_type'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceProfileInfos{?textSearch,sortProperty,sortOrder,transportType,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDeviceProfileInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_device_profiles_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getDeviceProfiles # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_profiles_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDeviceProfile + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_device_profiles_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_device_profiles_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_device_profiles_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getDeviceProfiles # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_device_profiles_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataDeviceProfile + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_device_profiles_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_device_profiles_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_device_profiles_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceProfiles{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataDeviceProfile', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_timeseries_keys_using_get(self, **kwargs): # noqa: E501 + """getTimeseriesKeys # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_timeseries_keys_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId + :return: list[str] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_timeseries_keys_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_timeseries_keys_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_timeseries_keys_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getTimeseriesKeys # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_timeseries_keys_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId + :return: list[str] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_timeseries_keys_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'device_profile_id' in params: + query_params.append(('deviceProfileId', params['device_profile_id'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceProfile/devices/keys/timeseries{?deviceProfileId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[str]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_device_profile_using_post(self, body, **kwargs): # noqa: E501 + """saveDeviceProfile # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_profile_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DeviceProfile body: deviceProfile (required) + :return: DeviceProfile + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_device_profile_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_device_profile_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_device_profile_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveDeviceProfile # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_profile_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DeviceProfile body: deviceProfile (required) + :return: DeviceProfile + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_device_profile_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_device_profile_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceProfile', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeviceProfile', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_default_device_profile_using_post(self, device_profile_id, **kwargs): # noqa: E501 + """setDefaultDeviceProfile # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_default_device_profile_using_post(device_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId (required) + :return: DeviceProfile + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_default_device_profile_using_post_with_http_info(device_profile_id, **kwargs) # noqa: E501 + else: + (data) = self.set_default_device_profile_using_post_with_http_info(device_profile_id, **kwargs) # noqa: E501 + return data + + def set_default_device_profile_using_post_with_http_info(self, device_profile_id, **kwargs): # noqa: E501 + """setDefaultDeviceProfile # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_default_device_profile_using_post_with_http_info(device_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId (required) + :return: DeviceProfile + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_default_device_profile_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_profile_id' is set + if ('device_profile_id' not in params or + params['device_profile_id'] is None): + raise ValueError("Missing the required parameter `device_profile_id` when calling `set_default_device_profile_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_profile_id' in params: + path_params['deviceProfileId'] = params['device_profile_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/deviceProfile/{deviceProfileId}/default', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeviceProfile', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/edge_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/edge_controller_api.py new file mode 100644 index 0000000..e18abf3 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/edge_controller_api.py @@ -0,0 +1,2223 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class EdgeControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def activate_instance_using_post(self, license_secret, release_date, **kwargs): # noqa: E501 + """activateInstance # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_instance_using_post(license_secret, release_date, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str license_secret: licenseSecret (required) + :param str release_date: releaseDate (required) + :return: object + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.activate_instance_using_post_with_http_info(license_secret, release_date, **kwargs) # noqa: E501 + else: + (data) = self.activate_instance_using_post_with_http_info(license_secret, release_date, **kwargs) # noqa: E501 + return data + + def activate_instance_using_post_with_http_info(self, license_secret, release_date, **kwargs): # noqa: E501 + """activateInstance # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_instance_using_post_with_http_info(license_secret, release_date, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str license_secret: licenseSecret (required) + :param str release_date: releaseDate (required) + :return: object + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['license_secret', 'release_date'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method activate_instance_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'license_secret' is set + if ('license_secret' not in params or + params['license_secret'] is None): + raise ValueError("Missing the required parameter `license_secret` when calling `activate_instance_using_post`") # noqa: E501 + # verify the required parameter 'release_date' is set + if ('release_date' not in params or + params['release_date'] is None): + raise ValueError("Missing the required parameter `release_date` when calling `activate_instance_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'license_secret' in params: + query_params.append(('licenseSecret', params['license_secret'])) # noqa: E501 + if 'release_date' in params: + query_params.append(('releaseDate', params['release_date'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/license/activateInstance{?licenseSecret,releaseDate}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='object', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_edge_to_customer_using_post(self, customer_id, edge_id, **kwargs): # noqa: E501 + """assignEdgeToCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_edge_to_customer_using_post(customer_id, edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str edge_id: edgeId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_edge_to_customer_using_post_with_http_info(customer_id, edge_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_edge_to_customer_using_post_with_http_info(customer_id, edge_id, **kwargs) # noqa: E501 + return data + + def assign_edge_to_customer_using_post_with_http_info(self, customer_id, edge_id, **kwargs): # noqa: E501 + """assignEdgeToCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_edge_to_customer_using_post_with_http_info(customer_id, edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str edge_id: edgeId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_edge_to_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `assign_edge_to_customer_using_post`") # noqa: E501 + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `assign_edge_to_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/edge/{edgeId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Edge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_edge_to_public_customer_using_post(self, edge_id, **kwargs): # noqa: E501 + """assignEdgeToPublicCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_edge_to_public_customer_using_post(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_edge_to_public_customer_using_post_with_http_info(edge_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_edge_to_public_customer_using_post_with_http_info(edge_id, **kwargs) # noqa: E501 + return data + + def assign_edge_to_public_customer_using_post_with_http_info(self, edge_id, **kwargs): # noqa: E501 + """assignEdgeToPublicCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_edge_to_public_customer_using_post_with_http_info(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_edge_to_public_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `assign_edge_to_public_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/public/edge/{edgeId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Edge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def check_instance_using_post(self, body, **kwargs): # noqa: E501 + """checkInstance # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_instance_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param object body: request (required) + :return: object + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.check_instance_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.check_instance_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def check_instance_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """checkInstance # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.check_instance_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param object body: request (required) + :return: object + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method check_instance_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `check_instance_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/license/checkInstance', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='object', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_edge_using_delete(self, edge_id, **kwargs): # noqa: E501 + """deleteEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_edge_using_delete(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_edge_using_delete_with_http_info(edge_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_edge_using_delete_with_http_info(edge_id, **kwargs) # noqa: E501 + return data + + def delete_edge_using_delete_with_http_info(self, edge_id, **kwargs): # noqa: E501 + """deleteEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_edge_using_delete_with_http_info(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_edge_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `delete_edge_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_query_using_post2(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post2(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EdgeSearchQuery body: query (required) + :return: list[Edge] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_query_using_post2_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.find_by_query_using_post2_with_http_info(body, **kwargs) # noqa: E501 + return data + + def find_by_query_using_post2_with_http_info(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post2_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EdgeSearchQuery body: query (required) + :return: list[Edge] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_query_using_post2" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_by_query_using_post2`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edges', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Edge]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_missing_to_related_rule_chains_using_get(self, edge_id, **kwargs): # noqa: E501 + """findMissingToRelatedRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_missing_to_related_rule_chains_using_get(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_missing_to_related_rule_chains_using_get_with_http_info(edge_id, **kwargs) # noqa: E501 + else: + (data) = self.find_missing_to_related_rule_chains_using_get_with_http_info(edge_id, **kwargs) # noqa: E501 + return data + + def find_missing_to_related_rule_chains_using_get_with_http_info(self, edge_id, **kwargs): # noqa: E501 + """findMissingToRelatedRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_missing_to_related_rule_chains_using_get_with_http_info(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_missing_to_related_rule_chains_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `find_missing_to_related_rule_chains_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/missingToRelatedRuleChains/{edgeId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_edge_infos_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerEdgeInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_edge_infos_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdgeInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_edge_infos_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_edge_infos_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_edge_infos_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerEdgeInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_edge_infos_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdgeInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_edge_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_edge_infos_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_edge_infos_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_edge_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/edgeInfos{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEdgeInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_edges_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_edges_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_edges_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_edges_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_edges_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_edges_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_edges_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_edges_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_edges_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_edges_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/edges{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEdge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edge_by_id_using_get(self, edge_id, **kwargs): # noqa: E501 + """getEdgeById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_by_id_using_get(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_by_id_using_get_with_http_info(edge_id, **kwargs) # noqa: E501 + else: + (data) = self.get_edge_by_id_using_get_with_http_info(edge_id, **kwargs) # noqa: E501 + return data + + def get_edge_by_id_using_get_with_http_info(self, edge_id, **kwargs): # noqa: E501 + """getEdgeById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_by_id_using_get_with_http_info(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_edge_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Edge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edge_info_by_id_using_get(self, edge_id, **kwargs): # noqa: E501 + """getEdgeInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_info_by_id_using_get(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: EdgeInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_info_by_id_using_get_with_http_info(edge_id, **kwargs) # noqa: E501 + else: + (data) = self.get_edge_info_by_id_using_get_with_http_info(edge_id, **kwargs) # noqa: E501 + return data + + def get_edge_info_by_id_using_get_with_http_info(self, edge_id, **kwargs): # noqa: E501 + """getEdgeInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_info_by_id_using_get_with_http_info(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: EdgeInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_edge_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/info/{edgeId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EdgeInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edge_types_using_get(self, **kwargs): # noqa: E501 + """getEdgeTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_types_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_types_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_edge_types_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_edge_types_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getEdgeTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_types_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_types_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/types', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntitySubtype]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edges_by_ids_using_get(self, edge_ids, **kwargs): # noqa: E501 + """getEdgesByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edges_by_ids_using_get(edge_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_ids: edgeIds (required) + :return: list[Edge] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edges_by_ids_using_get_with_http_info(edge_ids, **kwargs) # noqa: E501 + else: + (data) = self.get_edges_by_ids_using_get_with_http_info(edge_ids, **kwargs) # noqa: E501 + return data + + def get_edges_by_ids_using_get_with_http_info(self, edge_ids, **kwargs): # noqa: E501 + """getEdgesByIds # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edges_by_ids_using_get_with_http_info(edge_ids, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_ids: edgeIds (required) + :return: list[Edge] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edges_by_ids_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_ids' is set + if ('edge_ids' not in params or + params['edge_ids'] is None): + raise ValueError("Missing the required parameter `edge_ids` when calling `get_edges_by_ids_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'edge_ids' in params: + query_params.append(('edgeIds', params['edge_ids'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edges{?edgeIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[Edge]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edges_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edges_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edges_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_edges_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_edges_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edges_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edges_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_edges_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_edges_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edges{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEdge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_edge_infos_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantEdgeInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_edge_infos_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdgeInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_edge_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_edge_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_edge_infos_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantEdgeInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_edge_infos_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdgeInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_edge_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_edge_infos_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_edge_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/edgeInfos{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEdgeInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_edge_using_get(self, edge_name, **kwargs): # noqa: E501 + """getTenantEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_edge_using_get(edge_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_name: edgeName (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_edge_using_get_with_http_info(edge_name, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_edge_using_get_with_http_info(edge_name, **kwargs) # noqa: E501 + return data + + def get_tenant_edge_using_get_with_http_info(self, edge_name, **kwargs): # noqa: E501 + """getTenantEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_edge_using_get_with_http_info(edge_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_name: edgeName (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_edge_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_name' is set + if ('edge_name' not in params or + params['edge_name'] is None): + raise ValueError("Missing the required parameter `edge_name` when calling `get_tenant_edge_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'edge_name' in params: + query_params.append(('edgeName', params['edge_name'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/edges{?edgeName}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Edge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_edges_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_edges_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_edges_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_edges_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_edges_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantEdges # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_edges_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEdge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_edges_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_edges_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_edges_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/edges{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEdge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def is_edges_support_enabled_using_get(self, **kwargs): # noqa: E501 + """isEdgesSupportEnabled # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_edges_support_enabled_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.is_edges_support_enabled_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.is_edges_support_enabled_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def is_edges_support_enabled_using_get_with_http_info(self, **kwargs): # noqa: E501 + """isEdgesSupportEnabled # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_edges_support_enabled_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method is_edges_support_enabled_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edges/enabled', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_edge_using_post(self, body, **kwargs): # noqa: E501 + """saveEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_edge_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Edge body: edge (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_edge_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_edge_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_edge_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_edge_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Edge body: edge (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_edge_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_edge_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Edge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_root_rule_chain_using_post(self, edge_id, rule_chain_id, **kwargs): # noqa: E501 + """setRootRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_root_rule_chain_using_post(edge_id, rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str rule_chain_id: ruleChainId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_root_rule_chain_using_post_with_http_info(edge_id, rule_chain_id, **kwargs) # noqa: E501 + else: + (data) = self.set_root_rule_chain_using_post_with_http_info(edge_id, rule_chain_id, **kwargs) # noqa: E501 + return data + + def set_root_rule_chain_using_post_with_http_info(self, edge_id, rule_chain_id, **kwargs): # noqa: E501 + """setRootRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_root_rule_chain_using_post_with_http_info(edge_id, rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str rule_chain_id: ruleChainId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'rule_chain_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_root_rule_chain_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `set_root_rule_chain_using_post`") # noqa: E501 + # verify the required parameter 'rule_chain_id' is set + if ('rule_chain_id' not in params or + params['rule_chain_id'] is None): + raise ValueError("Missing the required parameter `rule_chain_id` when calling `set_root_rule_chain_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'rule_chain_id' in params: + path_params['ruleChainId'] = params['rule_chain_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/{ruleChainId}/root', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Edge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def sync_edge_using_post(self, edge_id, **kwargs): # noqa: E501 + """syncEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.sync_edge_using_post(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.sync_edge_using_post_with_http_info(edge_id, **kwargs) # noqa: E501 + else: + (data) = self.sync_edge_using_post_with_http_info(edge_id, **kwargs) # noqa: E501 + return data + + def sync_edge_using_post_with_http_info(self, edge_id, **kwargs): # noqa: E501 + """syncEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.sync_edge_using_post_with_http_info(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method sync_edge_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `sync_edge_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/sync/{edgeId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_edge_from_customer_using_delete(self, edge_id, **kwargs): # noqa: E501 + """unassignEdgeFromCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_edge_from_customer_using_delete(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_edge_from_customer_using_delete_with_http_info(edge_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_edge_from_customer_using_delete_with_http_info(edge_id, **kwargs) # noqa: E501 + return data + + def unassign_edge_from_customer_using_delete_with_http_info(self, edge_id, **kwargs): # noqa: E501 + """unassignEdgeFromCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_edge_from_customer_using_delete_with_http_info(edge_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :return: Edge + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_edge_from_customer_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `unassign_edge_from_customer_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/edge/{edgeId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Edge', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/edge_event_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/edge_event_controller_api.py new file mode 100644 index 0000000..013999a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/edge_event_controller_api.py @@ -0,0 +1,162 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class EdgeEventControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_edge_events_using_get(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_events_using_get(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataEdgeEvent + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_events_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_edge_events_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_edge_events_using_get_with_http_info(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_events_using_get_with_http_info(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataEdgeEvent + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_events_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_edge_events_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_edge_events_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_edge_events_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/events{?pageSize,page,textSearch,sortProperty,sortOrder,startTime,endTime}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEdgeEvent', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/entity_query_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/entity_query_controller_api.py new file mode 100644 index 0000000..a678e62 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/entity_query_controller_api.py @@ -0,0 +1,437 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class EntityQueryControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def count_entities_by_query_using_post(self, body, **kwargs): # noqa: E501 + """countEntitiesByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.count_entities_by_query_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityCountQuery body: query (required) + :return: int + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.count_entities_by_query_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.count_entities_by_query_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def count_entities_by_query_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """countEntitiesByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.count_entities_by_query_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityCountQuery body: query (required) + :return: int + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method count_entities_by_query_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `count_entities_by_query_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entitiesQuery/count', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='int', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_alarm_data_by_query_using_post(self, body, **kwargs): # noqa: E501 + """findAlarmDataByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_alarm_data_by_query_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AlarmDataQuery body: query (required) + :return: PageDataAlarmData + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_alarm_data_by_query_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.find_alarm_data_by_query_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def find_alarm_data_by_query_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """findAlarmDataByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_alarm_data_by_query_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param AlarmDataQuery body: query (required) + :return: PageDataAlarmData + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_alarm_data_by_query_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_alarm_data_by_query_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/alarmsQuery/find', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataAlarmData', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_entity_data_by_query_using_post(self, body, **kwargs): # noqa: E501 + """findEntityDataByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_entity_data_by_query_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityDataQuery body: query (required) + :return: PageDataEntityData + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_entity_data_by_query_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.find_entity_data_by_query_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def find_entity_data_by_query_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """findEntityDataByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_entity_data_by_query_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityDataQuery body: query (required) + :return: PageDataEntityData + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_entity_data_by_query_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_entity_data_by_query_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entitiesQuery/find', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEntityData', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_entity_timeseries_and_attributes_keys_by_query_using_post(self, body, timeseries, attributes, **kwargs): # noqa: E501 + """findEntityTimeseriesAndAttributesKeysByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_entity_timeseries_and_attributes_keys_by_query_using_post(body, timeseries, attributes, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityDataQuery body: query (required) + :param bool timeseries: timeseries (required) + :param bool attributes: attributes (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_entity_timeseries_and_attributes_keys_by_query_using_post_with_http_info(body, timeseries, attributes, **kwargs) # noqa: E501 + else: + (data) = self.find_entity_timeseries_and_attributes_keys_by_query_using_post_with_http_info(body, timeseries, attributes, **kwargs) # noqa: E501 + return data + + def find_entity_timeseries_and_attributes_keys_by_query_using_post_with_http_info(self, body, timeseries, attributes, **kwargs): # noqa: E501 + """findEntityTimeseriesAndAttributesKeysByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_entity_timeseries_and_attributes_keys_by_query_using_post_with_http_info(body, timeseries, attributes, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityDataQuery body: query (required) + :param bool timeseries: timeseries (required) + :param bool attributes: attributes (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'timeseries', 'attributes'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_entity_timeseries_and_attributes_keys_by_query_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_entity_timeseries_and_attributes_keys_by_query_using_post`") # noqa: E501 + # verify the required parameter 'timeseries' is set + if ('timeseries' not in params or + params['timeseries'] is None): + raise ValueError("Missing the required parameter `timeseries` when calling `find_entity_timeseries_and_attributes_keys_by_query_using_post`") # noqa: E501 + # verify the required parameter 'attributes' is set + if ('attributes' not in params or + params['attributes'] is None): + raise ValueError("Missing the required parameter `attributes` when calling `find_entity_timeseries_and_attributes_keys_by_query_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'timeseries' in params: + query_params.append(('timeseries', params['timeseries'])) # noqa: E501 + if 'attributes' in params: + query_params.append(('attributes', params['attributes'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entitiesQuery/find/keys{?timeseries,attributes}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/entity_relation_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/entity_relation_controller_api.py new file mode 100644 index 0000000..8fec5b1 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/entity_relation_controller_api.py @@ -0,0 +1,1333 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class EntityRelationControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_relation_using_delete(self, from_id, from_type, relation_type, to_id, to_type, **kwargs): # noqa: E501 + """deleteRelation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_relation_using_delete(from_id, from_type, relation_type, to_id, to_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str from_id: fromId (required) + :param str from_type: fromType (required) + :param str relation_type: relationType (required) + :param str to_id: toId (required) + :param str to_type: toType (required) + :param str relation_type_group: relationTypeGroup + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_relation_using_delete_with_http_info(from_id, from_type, relation_type, to_id, to_type, **kwargs) # noqa: E501 + else: + (data) = self.delete_relation_using_delete_with_http_info(from_id, from_type, relation_type, to_id, to_type, **kwargs) # noqa: E501 + return data + + def delete_relation_using_delete_with_http_info(self, from_id, from_type, relation_type, to_id, to_type, **kwargs): # noqa: E501 + """deleteRelation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_relation_using_delete_with_http_info(from_id, from_type, relation_type, to_id, to_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str from_id: fromId (required) + :param str from_type: fromType (required) + :param str relation_type: relationType (required) + :param str to_id: toId (required) + :param str to_type: toType (required) + :param str relation_type_group: relationTypeGroup + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['from_id', 'from_type', 'relation_type', 'to_id', 'to_type', 'relation_type_group'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_relation_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'from_id' is set + if ('from_id' not in params or + params['from_id'] is None): + raise ValueError("Missing the required parameter `from_id` when calling `delete_relation_using_delete`") # noqa: E501 + # verify the required parameter 'from_type' is set + if ('from_type' not in params or + params['from_type'] is None): + raise ValueError("Missing the required parameter `from_type` when calling `delete_relation_using_delete`") # noqa: E501 + # verify the required parameter 'relation_type' is set + if ('relation_type' not in params or + params['relation_type'] is None): + raise ValueError("Missing the required parameter `relation_type` when calling `delete_relation_using_delete`") # noqa: E501 + # verify the required parameter 'to_id' is set + if ('to_id' not in params or + params['to_id'] is None): + raise ValueError("Missing the required parameter `to_id` when calling `delete_relation_using_delete`") # noqa: E501 + # verify the required parameter 'to_type' is set + if ('to_type' not in params or + params['to_type'] is None): + raise ValueError("Missing the required parameter `to_type` when calling `delete_relation_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'relation_type_group' in params: + query_params.append(('relationTypeGroup', params['relation_type_group'])) # noqa: E501 + if 'from_id' in params: + query_params.append(('fromId', params['from_id'])) # noqa: E501 + if 'from_type' in params: + query_params.append(('fromType', params['from_type'])) # noqa: E501 + if 'relation_type' in params: + query_params.append(('relationType', params['relation_type'])) # noqa: E501 + if 'to_id' in params: + query_params.append(('toId', params['to_id'])) # noqa: E501 + if 'to_type' in params: + query_params.append(('toType', params['to_type'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/relation{?relationTypeGroup,fromId,fromType,relationType,toId,toType}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_relations_using_delete(self, entity_id, entity_type, id, type, **kwargs): # noqa: E501 + """deleteRelations # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_relations_using_delete(entity_id, entity_type, id, type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_id: entityId (required) + :param str entity_type: entityType (required) + :param str id: (required) + :param str type: (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_relations_using_delete_with_http_info(entity_id, entity_type, id, type, **kwargs) # noqa: E501 + else: + (data) = self.delete_relations_using_delete_with_http_info(entity_id, entity_type, id, type, **kwargs) # noqa: E501 + return data + + def delete_relations_using_delete_with_http_info(self, entity_id, entity_type, id, type, **kwargs): # noqa: E501 + """deleteRelations # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_relations_using_delete_with_http_info(entity_id, entity_type, id, type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_id: entityId (required) + :param str entity_type: entityType (required) + :param str id: (required) + :param str type: (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_id', 'entity_type', 'id', 'type'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_relations_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `delete_relations_using_delete`") # noqa: E501 + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `delete_relations_using_delete`") # noqa: E501 + # verify the required parameter 'id' is set + if ('id' not in params or + params['id'] is None): + raise ValueError("Missing the required parameter `id` when calling `delete_relations_using_delete`") # noqa: E501 + # verify the required parameter 'type' is set + if ('type' not in params or + params['type'] is None): + raise ValueError("Missing the required parameter `type` when calling `delete_relations_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'entity_id' in params: + query_params.append(('entityId', params['entity_id'])) # noqa: E501 + if 'entity_type' in params: + query_params.append(('entityType', params['entity_type'])) # noqa: E501 + if 'id' in params: + query_params.append(('id', params['id'])) # noqa: E501 + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/relations{?entityId,entityType,id,type}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_from_using_get(self, from_id, from_type, relation_type, **kwargs): # noqa: E501 + """findByFrom # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_from_using_get(from_id, from_type, relation_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str from_id: fromId (required) + :param str from_type: fromType (required) + :param str relation_type: relationType (required) + :param str relation_type_group: relationTypeGroup + :return: list[EntityRelation] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_from_using_get_with_http_info(from_id, from_type, relation_type, **kwargs) # noqa: E501 + else: + (data) = self.find_by_from_using_get_with_http_info(from_id, from_type, relation_type, **kwargs) # noqa: E501 + return data + + def find_by_from_using_get_with_http_info(self, from_id, from_type, relation_type, **kwargs): # noqa: E501 + """findByFrom # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_from_using_get_with_http_info(from_id, from_type, relation_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str from_id: fromId (required) + :param str from_type: fromType (required) + :param str relation_type: relationType (required) + :param str relation_type_group: relationTypeGroup + :return: list[EntityRelation] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['from_id', 'from_type', 'relation_type', 'relation_type_group'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_from_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'from_id' is set + if ('from_id' not in params or + params['from_id'] is None): + raise ValueError("Missing the required parameter `from_id` when calling `find_by_from_using_get`") # noqa: E501 + # verify the required parameter 'from_type' is set + if ('from_type' not in params or + params['from_type'] is None): + raise ValueError("Missing the required parameter `from_type` when calling `find_by_from_using_get`") # noqa: E501 + # verify the required parameter 'relation_type' is set + if ('relation_type' not in params or + params['relation_type'] is None): + raise ValueError("Missing the required parameter `relation_type` when calling `find_by_from_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'relation_type_group' in params: + query_params.append(('relationTypeGroup', params['relation_type_group'])) # noqa: E501 + if 'from_id' in params: + query_params.append(('fromId', params['from_id'])) # noqa: E501 + if 'from_type' in params: + query_params.append(('fromType', params['from_type'])) # noqa: E501 + if 'relation_type' in params: + query_params.append(('relationType', params['relation_type'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/relations{?relationTypeGroup,fromId,fromType,relationType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityRelation]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_from_using_get1(self, from_id, from_type, **kwargs): # noqa: E501 + """findByFrom # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_from_using_get1(from_id, from_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str from_id: fromId (required) + :param str from_type: fromType (required) + :param str relation_type_group: relationTypeGroup + :return: list[EntityRelation] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_from_using_get1_with_http_info(from_id, from_type, **kwargs) # noqa: E501 + else: + (data) = self.find_by_from_using_get1_with_http_info(from_id, from_type, **kwargs) # noqa: E501 + return data + + def find_by_from_using_get1_with_http_info(self, from_id, from_type, **kwargs): # noqa: E501 + """findByFrom # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_from_using_get1_with_http_info(from_id, from_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str from_id: fromId (required) + :param str from_type: fromType (required) + :param str relation_type_group: relationTypeGroup + :return: list[EntityRelation] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['from_id', 'from_type', 'relation_type_group'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_from_using_get1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'from_id' is set + if ('from_id' not in params or + params['from_id'] is None): + raise ValueError("Missing the required parameter `from_id` when calling `find_by_from_using_get1`") # noqa: E501 + # verify the required parameter 'from_type' is set + if ('from_type' not in params or + params['from_type'] is None): + raise ValueError("Missing the required parameter `from_type` when calling `find_by_from_using_get1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'relation_type_group' in params: + query_params.append(('relationTypeGroup', params['relation_type_group'])) # noqa: E501 + if 'from_id' in params: + query_params.append(('fromId', params['from_id'])) # noqa: E501 + if 'from_type' in params: + query_params.append(('fromType', params['from_type'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/relations{?relationTypeGroup,fromId,fromType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityRelation]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_query_using_post3(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post3(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityRelationsQuery body: query (required) + :return: list[EntityRelation] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_query_using_post3_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.find_by_query_using_post3_with_http_info(body, **kwargs) # noqa: E501 + return data + + def find_by_query_using_post3_with_http_info(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post3_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityRelationsQuery body: query (required) + :return: list[EntityRelation] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_query_using_post3" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_by_query_using_post3`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/relations', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityRelation]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_to_using_get(self, to_id, to_type, relation_type, **kwargs): # noqa: E501 + """findByTo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_to_using_get(to_id, to_type, relation_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str to_id: toId (required) + :param str to_type: toType (required) + :param str relation_type: relationType (required) + :param str relation_type_group: relationTypeGroup + :return: list[EntityRelation] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_to_using_get_with_http_info(to_id, to_type, relation_type, **kwargs) # noqa: E501 + else: + (data) = self.find_by_to_using_get_with_http_info(to_id, to_type, relation_type, **kwargs) # noqa: E501 + return data + + def find_by_to_using_get_with_http_info(self, to_id, to_type, relation_type, **kwargs): # noqa: E501 + """findByTo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_to_using_get_with_http_info(to_id, to_type, relation_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str to_id: toId (required) + :param str to_type: toType (required) + :param str relation_type: relationType (required) + :param str relation_type_group: relationTypeGroup + :return: list[EntityRelation] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['to_id', 'to_type', 'relation_type', 'relation_type_group'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_to_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'to_id' is set + if ('to_id' not in params or + params['to_id'] is None): + raise ValueError("Missing the required parameter `to_id` when calling `find_by_to_using_get`") # noqa: E501 + # verify the required parameter 'to_type' is set + if ('to_type' not in params or + params['to_type'] is None): + raise ValueError("Missing the required parameter `to_type` when calling `find_by_to_using_get`") # noqa: E501 + # verify the required parameter 'relation_type' is set + if ('relation_type' not in params or + params['relation_type'] is None): + raise ValueError("Missing the required parameter `relation_type` when calling `find_by_to_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'relation_type_group' in params: + query_params.append(('relationTypeGroup', params['relation_type_group'])) # noqa: E501 + if 'to_id' in params: + query_params.append(('toId', params['to_id'])) # noqa: E501 + if 'to_type' in params: + query_params.append(('toType', params['to_type'])) # noqa: E501 + if 'relation_type' in params: + query_params.append(('relationType', params['relation_type'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/relations{?relationTypeGroup,toId,toType,relationType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityRelation]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_to_using_get1(self, to_id, to_type, **kwargs): # noqa: E501 + """findByTo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_to_using_get1(to_id, to_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str to_id: toId (required) + :param str to_type: toType (required) + :param str relation_type_group: relationTypeGroup + :return: list[EntityRelation] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_to_using_get1_with_http_info(to_id, to_type, **kwargs) # noqa: E501 + else: + (data) = self.find_by_to_using_get1_with_http_info(to_id, to_type, **kwargs) # noqa: E501 + return data + + def find_by_to_using_get1_with_http_info(self, to_id, to_type, **kwargs): # noqa: E501 + """findByTo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_to_using_get1_with_http_info(to_id, to_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str to_id: toId (required) + :param str to_type: toType (required) + :param str relation_type_group: relationTypeGroup + :return: list[EntityRelation] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['to_id', 'to_type', 'relation_type_group'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_to_using_get1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'to_id' is set + if ('to_id' not in params or + params['to_id'] is None): + raise ValueError("Missing the required parameter `to_id` when calling `find_by_to_using_get1`") # noqa: E501 + # verify the required parameter 'to_type' is set + if ('to_type' not in params or + params['to_type'] is None): + raise ValueError("Missing the required parameter `to_type` when calling `find_by_to_using_get1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'relation_type_group' in params: + query_params.append(('relationTypeGroup', params['relation_type_group'])) # noqa: E501 + if 'to_id' in params: + query_params.append(('toId', params['to_id'])) # noqa: E501 + if 'to_type' in params: + query_params.append(('toType', params['to_type'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/relations{?relationTypeGroup,toId,toType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityRelation]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_info_by_from_using_get(self, from_id, from_type, **kwargs): # noqa: E501 + """findInfoByFrom # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_info_by_from_using_get(from_id, from_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str from_id: fromId (required) + :param str from_type: fromType (required) + :param str relation_type_group: relationTypeGroup + :return: list[EntityRelationInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_info_by_from_using_get_with_http_info(from_id, from_type, **kwargs) # noqa: E501 + else: + (data) = self.find_info_by_from_using_get_with_http_info(from_id, from_type, **kwargs) # noqa: E501 + return data + + def find_info_by_from_using_get_with_http_info(self, from_id, from_type, **kwargs): # noqa: E501 + """findInfoByFrom # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_info_by_from_using_get_with_http_info(from_id, from_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str from_id: fromId (required) + :param str from_type: fromType (required) + :param str relation_type_group: relationTypeGroup + :return: list[EntityRelationInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['from_id', 'from_type', 'relation_type_group'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_info_by_from_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'from_id' is set + if ('from_id' not in params or + params['from_id'] is None): + raise ValueError("Missing the required parameter `from_id` when calling `find_info_by_from_using_get`") # noqa: E501 + # verify the required parameter 'from_type' is set + if ('from_type' not in params or + params['from_type'] is None): + raise ValueError("Missing the required parameter `from_type` when calling `find_info_by_from_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'relation_type_group' in params: + query_params.append(('relationTypeGroup', params['relation_type_group'])) # noqa: E501 + if 'from_id' in params: + query_params.append(('fromId', params['from_id'])) # noqa: E501 + if 'from_type' in params: + query_params.append(('fromType', params['from_type'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/relations/info{?relationTypeGroup,fromId,fromType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityRelationInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_info_by_query_using_post(self, body, **kwargs): # noqa: E501 + """findInfoByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_info_by_query_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityRelationsQuery body: query (required) + :return: list[EntityRelationInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_info_by_query_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.find_info_by_query_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def find_info_by_query_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """findInfoByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_info_by_query_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityRelationsQuery body: query (required) + :return: list[EntityRelationInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_info_by_query_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_info_by_query_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/relations/info', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityRelationInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_info_by_to_using_get(self, to_id, to_type, **kwargs): # noqa: E501 + """findInfoByTo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_info_by_to_using_get(to_id, to_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str to_id: toId (required) + :param str to_type: toType (required) + :param str relation_type_group: relationTypeGroup + :return: list[EntityRelationInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_info_by_to_using_get_with_http_info(to_id, to_type, **kwargs) # noqa: E501 + else: + (data) = self.find_info_by_to_using_get_with_http_info(to_id, to_type, **kwargs) # noqa: E501 + return data + + def find_info_by_to_using_get_with_http_info(self, to_id, to_type, **kwargs): # noqa: E501 + """findInfoByTo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_info_by_to_using_get_with_http_info(to_id, to_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str to_id: toId (required) + :param str to_type: toType (required) + :param str relation_type_group: relationTypeGroup + :return: list[EntityRelationInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['to_id', 'to_type', 'relation_type_group'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_info_by_to_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'to_id' is set + if ('to_id' not in params or + params['to_id'] is None): + raise ValueError("Missing the required parameter `to_id` when calling `find_info_by_to_using_get`") # noqa: E501 + # verify the required parameter 'to_type' is set + if ('to_type' not in params or + params['to_type'] is None): + raise ValueError("Missing the required parameter `to_type` when calling `find_info_by_to_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'relation_type_group' in params: + query_params.append(('relationTypeGroup', params['relation_type_group'])) # noqa: E501 + if 'to_id' in params: + query_params.append(('toId', params['to_id'])) # noqa: E501 + if 'to_type' in params: + query_params.append(('toType', params['to_type'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/relations/info{?relationTypeGroup,toId,toType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityRelationInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_relation_using_get(self, from_id, from_type, relation_type, to_id, to_type, **kwargs): # noqa: E501 + """getRelation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_relation_using_get(from_id, from_type, relation_type, to_id, to_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str from_id: fromId (required) + :param str from_type: fromType (required) + :param str relation_type: relationType (required) + :param str to_id: toId (required) + :param str to_type: toType (required) + :param str relation_type_group: relationTypeGroup + :return: EntityRelation + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_relation_using_get_with_http_info(from_id, from_type, relation_type, to_id, to_type, **kwargs) # noqa: E501 + else: + (data) = self.get_relation_using_get_with_http_info(from_id, from_type, relation_type, to_id, to_type, **kwargs) # noqa: E501 + return data + + def get_relation_using_get_with_http_info(self, from_id, from_type, relation_type, to_id, to_type, **kwargs): # noqa: E501 + """getRelation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_relation_using_get_with_http_info(from_id, from_type, relation_type, to_id, to_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str from_id: fromId (required) + :param str from_type: fromType (required) + :param str relation_type: relationType (required) + :param str to_id: toId (required) + :param str to_type: toType (required) + :param str relation_type_group: relationTypeGroup + :return: EntityRelation + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['from_id', 'from_type', 'relation_type', 'to_id', 'to_type', 'relation_type_group'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_relation_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'from_id' is set + if ('from_id' not in params or + params['from_id'] is None): + raise ValueError("Missing the required parameter `from_id` when calling `get_relation_using_get`") # noqa: E501 + # verify the required parameter 'from_type' is set + if ('from_type' not in params or + params['from_type'] is None): + raise ValueError("Missing the required parameter `from_type` when calling `get_relation_using_get`") # noqa: E501 + # verify the required parameter 'relation_type' is set + if ('relation_type' not in params or + params['relation_type'] is None): + raise ValueError("Missing the required parameter `relation_type` when calling `get_relation_using_get`") # noqa: E501 + # verify the required parameter 'to_id' is set + if ('to_id' not in params or + params['to_id'] is None): + raise ValueError("Missing the required parameter `to_id` when calling `get_relation_using_get`") # noqa: E501 + # verify the required parameter 'to_type' is set + if ('to_type' not in params or + params['to_type'] is None): + raise ValueError("Missing the required parameter `to_type` when calling `get_relation_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'relation_type_group' in params: + query_params.append(('relationTypeGroup', params['relation_type_group'])) # noqa: E501 + if 'from_id' in params: + query_params.append(('fromId', params['from_id'])) # noqa: E501 + if 'from_type' in params: + query_params.append(('fromType', params['from_type'])) # noqa: E501 + if 'relation_type' in params: + query_params.append(('relationType', params['relation_type'])) # noqa: E501 + if 'to_id' in params: + query_params.append(('toId', params['to_id'])) # noqa: E501 + if 'to_type' in params: + query_params.append(('toType', params['to_type'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/relation{?relationTypeGroup,fromId,fromType,relationType,toId,toType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityRelation', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_relation_using_post(self, body, **kwargs): # noqa: E501 + """saveRelation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_relation_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityRelation body: relation (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_relation_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_relation_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_relation_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveRelation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_relation_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityRelation body: relation (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_relation_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_relation_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/relation', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/entity_view_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/entity_view_controller_api.py new file mode 100644 index 0000000..fb328dd --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/entity_view_controller_api.py @@ -0,0 +1,1786 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class EntityViewControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def assign_entity_view_to_customer_using_post(self, customer_id, entity_view_id, **kwargs): # noqa: E501 + """assignEntityViewToCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_entity_view_to_customer_using_post(customer_id, entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_entity_view_to_customer_using_post_with_http_info(customer_id, entity_view_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_entity_view_to_customer_using_post_with_http_info(customer_id, entity_view_id, **kwargs) # noqa: E501 + return data + + def assign_entity_view_to_customer_using_post_with_http_info(self, customer_id, entity_view_id, **kwargs): # noqa: E501 + """assignEntityViewToCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_entity_view_to_customer_using_post_with_http_info(customer_id, entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'entity_view_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_entity_view_to_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `assign_entity_view_to_customer_using_post`") # noqa: E501 + # verify the required parameter 'entity_view_id' is set + if ('entity_view_id' not in params or + params['entity_view_id'] is None): + raise ValueError("Missing the required parameter `entity_view_id` when calling `assign_entity_view_to_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + if 'entity_view_id' in params: + path_params['entityViewId'] = params['entity_view_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/entityView/{entityViewId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_entity_view_to_edge_using_post(self, edge_id, entity_view_id, **kwargs): # noqa: E501 + """assignEntityViewToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_entity_view_to_edge_using_post(edge_id, entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_entity_view_to_edge_using_post_with_http_info(edge_id, entity_view_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_entity_view_to_edge_using_post_with_http_info(edge_id, entity_view_id, **kwargs) # noqa: E501 + return data + + def assign_entity_view_to_edge_using_post_with_http_info(self, edge_id, entity_view_id, **kwargs): # noqa: E501 + """assignEntityViewToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_entity_view_to_edge_using_post_with_http_info(edge_id, entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'entity_view_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_entity_view_to_edge_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `assign_entity_view_to_edge_using_post`") # noqa: E501 + # verify the required parameter 'entity_view_id' is set + if ('entity_view_id' not in params or + params['entity_view_id'] is None): + raise ValueError("Missing the required parameter `entity_view_id` when calling `assign_entity_view_to_edge_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'entity_view_id' in params: + path_params['entityViewId'] = params['entity_view_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/entityView/{entityViewId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def assign_entity_view_to_public_customer_using_post(self, entity_view_id, **kwargs): # noqa: E501 + """assignEntityViewToPublicCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_entity_view_to_public_customer_using_post(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_entity_view_to_public_customer_using_post_with_http_info(entity_view_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_entity_view_to_public_customer_using_post_with_http_info(entity_view_id, **kwargs) # noqa: E501 + return data + + def assign_entity_view_to_public_customer_using_post_with_http_info(self, entity_view_id, **kwargs): # noqa: E501 + """assignEntityViewToPublicCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_entity_view_to_public_customer_using_post_with_http_info(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_view_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_entity_view_to_public_customer_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_view_id' is set + if ('entity_view_id' not in params or + params['entity_view_id'] is None): + raise ValueError("Missing the required parameter `entity_view_id` when calling `assign_entity_view_to_public_customer_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_view_id' in params: + path_params['entityViewId'] = params['entity_view_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/public/entityView/{entityViewId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_entity_view_using_delete(self, entity_view_id, **kwargs): # noqa: E501 + """deleteEntityView # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_view_using_delete(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_entity_view_using_delete_with_http_info(entity_view_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_entity_view_using_delete_with_http_info(entity_view_id, **kwargs) # noqa: E501 + return data + + def delete_entity_view_using_delete_with_http_info(self, entity_view_id, **kwargs): # noqa: E501 + """deleteEntityView # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_view_using_delete_with_http_info(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_view_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_entity_view_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_view_id' is set + if ('entity_view_id' not in params or + params['entity_view_id'] is None): + raise ValueError("Missing the required parameter `entity_view_id` when calling `delete_entity_view_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_view_id' in params: + path_params['entityViewId'] = params['entity_view_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityView/{entityViewId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def find_by_query_using_post4(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post4(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityViewSearchQuery body: query (required) + :return: list[EntityView] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.find_by_query_using_post4_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.find_by_query_using_post4_with_http_info(body, **kwargs) # noqa: E501 + return data + + def find_by_query_using_post4_with_http_info(self, body, **kwargs): # noqa: E501 + """findByQuery # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.find_by_query_using_post4_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityViewSearchQuery body: query (required) + :return: list[EntityView] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method find_by_query_using_post4" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `find_by_query_using_post4`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityViews', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntityView]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_entity_view_infos_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerEntityViewInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_entity_view_infos_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityViewInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_entity_view_infos_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_entity_view_infos_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_entity_view_infos_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerEntityViewInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_entity_view_infos_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityViewInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_entity_view_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_entity_view_infos_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_entity_view_infos_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_entity_view_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/entityViewInfos{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEntityViewInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_entity_views_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerEntityViews # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_entity_views_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_entity_views_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_entity_views_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_entity_views_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerEntityViews # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_entity_views_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_entity_views_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_entity_views_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_entity_views_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_entity_views_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/entityViews{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edge_entity_views_using_get(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeEntityViews # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_entity_views_using_get(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_entity_views_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_edge_entity_views_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_edge_entity_views_using_get_with_http_info(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeEntityViews # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_entity_views_using_get_with_http_info(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_entity_views_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_edge_entity_views_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_edge_entity_views_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_edge_entity_views_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/entityViews{?type,textSearch,sortProperty,sortOrder,startTime,endTime,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_view_by_id_using_get(self, entity_view_id, **kwargs): # noqa: E501 + """getEntityViewById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_view_by_id_using_get(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_view_by_id_using_get_with_http_info(entity_view_id, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_view_by_id_using_get_with_http_info(entity_view_id, **kwargs) # noqa: E501 + return data + + def get_entity_view_by_id_using_get_with_http_info(self, entity_view_id, **kwargs): # noqa: E501 + """getEntityViewById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_view_by_id_using_get_with_http_info(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_view_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_view_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_view_id' is set + if ('entity_view_id' not in params or + params['entity_view_id'] is None): + raise ValueError("Missing the required parameter `entity_view_id` when calling `get_entity_view_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_view_id' in params: + path_params['entityViewId'] = params['entity_view_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityView/{entityViewId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_view_info_by_id_using_get(self, entity_view_id, **kwargs): # noqa: E501 + """getEntityViewInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_view_info_by_id_using_get(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: EntityViewInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_view_info_by_id_using_get_with_http_info(entity_view_id, **kwargs) # noqa: E501 + else: + (data) = self.get_entity_view_info_by_id_using_get_with_http_info(entity_view_id, **kwargs) # noqa: E501 + return data + + def get_entity_view_info_by_id_using_get_with_http_info(self, entity_view_id, **kwargs): # noqa: E501 + """getEntityViewInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_view_info_by_id_using_get_with_http_info(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: EntityViewInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_view_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_view_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_view_id' is set + if ('entity_view_id' not in params or + params['entity_view_id'] is None): + raise ValueError("Missing the required parameter `entity_view_id` when calling `get_entity_view_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_view_id' in params: + path_params['entityViewId'] = params['entity_view_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityView/info/{entityViewId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityViewInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_entity_view_types_using_get(self, **kwargs): # noqa: E501 + """getEntityViewTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_view_types_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_entity_view_types_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_entity_view_types_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_entity_view_types_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getEntityViewTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_entity_view_types_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[EntitySubtype] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_entity_view_types_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityView/types', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[EntitySubtype]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_entity_view_infos_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantEntityViewInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_entity_view_infos_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityViewInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_entity_view_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_entity_view_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_entity_view_infos_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantEntityViewInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_entity_view_infos_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityViewInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_entity_view_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_entity_view_infos_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_entity_view_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/entityViewInfos{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEntityViewInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_entity_view_using_get(self, entity_view_name, **kwargs): # noqa: E501 + """getTenantEntityView # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_entity_view_using_get(entity_view_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_name: entityViewName (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_entity_view_using_get_with_http_info(entity_view_name, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_entity_view_using_get_with_http_info(entity_view_name, **kwargs) # noqa: E501 + return data + + def get_tenant_entity_view_using_get_with_http_info(self, entity_view_name, **kwargs): # noqa: E501 + """getTenantEntityView # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_entity_view_using_get_with_http_info(entity_view_name, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_name: entityViewName (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_view_name'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_entity_view_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_view_name' is set + if ('entity_view_name' not in params or + params['entity_view_name'] is None): + raise ValueError("Missing the required parameter `entity_view_name` when calling `get_tenant_entity_view_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'entity_view_name' in params: + query_params.append(('entityViewName', params['entity_view_name'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/entityViews{?entityViewName}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_entity_views_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantEntityViews # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_entity_views_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_entity_views_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_entity_views_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_entity_views_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantEntityViews # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_entity_views_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_entity_views_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_entity_views_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_entity_views_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/entityViews{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_entity_view_using_post(self, body, **kwargs): # noqa: E501 + """saveEntityView # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_view_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityView body: entityView (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_entity_view_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_entity_view_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_entity_view_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveEntityView # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_view_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EntityView body: entityView (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_entity_view_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_entity_view_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/entityView', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_entity_view_from_customer_using_delete(self, entity_view_id, **kwargs): # noqa: E501 + """unassignEntityViewFromCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_entity_view_from_customer_using_delete(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_entity_view_from_customer_using_delete_with_http_info(entity_view_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_entity_view_from_customer_using_delete_with_http_info(entity_view_id, **kwargs) # noqa: E501 + return data + + def unassign_entity_view_from_customer_using_delete_with_http_info(self, entity_view_id, **kwargs): # noqa: E501 + """unassignEntityViewFromCustomer # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_entity_view_from_customer_using_delete_with_http_info(entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_view_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_entity_view_from_customer_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_view_id' is set + if ('entity_view_id' not in params or + params['entity_view_id'] is None): + raise ValueError("Missing the required parameter `entity_view_id` when calling `unassign_entity_view_from_customer_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_view_id' in params: + path_params['entityViewId'] = params['entity_view_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/entityView/{entityViewId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_entity_view_from_edge_using_delete(self, edge_id, entity_view_id, **kwargs): # noqa: E501 + """unassignEntityViewFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_entity_view_from_edge_using_delete(edge_id, entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_entity_view_from_edge_using_delete_with_http_info(edge_id, entity_view_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_entity_view_from_edge_using_delete_with_http_info(edge_id, entity_view_id, **kwargs) # noqa: E501 + return data + + def unassign_entity_view_from_edge_using_delete_with_http_info(self, edge_id, entity_view_id, **kwargs): # noqa: E501 + """unassignEntityViewFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_entity_view_from_edge_using_delete_with_http_info(edge_id, entity_view_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str entity_view_id: entityViewId (required) + :return: EntityView + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'entity_view_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_entity_view_from_edge_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `unassign_entity_view_from_edge_using_delete`") # noqa: E501 + # verify the required parameter 'entity_view_id' is set + if ('entity_view_id' not in params or + params['entity_view_id'] is None): + raise ValueError("Missing the required parameter `entity_view_id` when calling `unassign_entity_view_from_edge_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'entity_view_id' in params: + path_params['entityViewId'] = params['entity_view_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/entityView/{entityViewId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityView', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/event_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/event_controller_api.py new file mode 100644 index 0000000..d11f0ee --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/event_controller_api.py @@ -0,0 +1,488 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class EventControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_events_using_get(self, entity_type, entity_id, event_type, tenant_id, page_size, page, **kwargs): # noqa: E501 + """getEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_events_using_get(entity_type, entity_id, event_type, tenant_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str event_type: eventType (required) + :param str tenant_id: tenantId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataEvent + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_events_using_get_with_http_info(entity_type, entity_id, event_type, tenant_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_events_using_get_with_http_info(entity_type, entity_id, event_type, tenant_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_events_using_get_with_http_info(self, entity_type, entity_id, event_type, tenant_id, page_size, page, **kwargs): # noqa: E501 + """getEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_events_using_get_with_http_info(entity_type, entity_id, event_type, tenant_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str event_type: eventType (required) + :param str tenant_id: tenantId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataEvent + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id', 'event_type', 'tenant_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_events_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_events_using_get`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_events_using_get`") # noqa: E501 + # verify the required parameter 'event_type' is set + if ('event_type' not in params or + params['event_type'] is None): + raise ValueError("Missing the required parameter `event_type` when calling `get_events_using_get`") # noqa: E501 + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `get_events_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_events_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_events_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + if 'event_type' in params: + path_params['eventType'] = params['event_type'] # noqa: E501 + + query_params = [] + if 'tenant_id' in params: + query_params.append(('tenantId', params['tenant_id'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/events/{entityType}/{entityId}/{eventType}{?tenantId,pageSize,page,textSearch,sortProperty,sortOrder,startTime,endTime}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEvent', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_events_using_get1(self, entity_type, entity_id, tenant_id, page_size, page, **kwargs): # noqa: E501 + """getEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_events_using_get1(entity_type, entity_id, tenant_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str tenant_id: tenantId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataEvent + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_events_using_get1_with_http_info(entity_type, entity_id, tenant_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_events_using_get1_with_http_info(entity_type, entity_id, tenant_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_events_using_get1_with_http_info(self, entity_type, entity_id, tenant_id, page_size, page, **kwargs): # noqa: E501 + """getEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_events_using_get1_with_http_info(entity_type, entity_id, tenant_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str tenant_id: tenantId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataEvent + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id', 'tenant_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_events_using_get1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_events_using_get1`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_events_using_get1`") # noqa: E501 + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `get_events_using_get1`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_events_using_get1`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_events_using_get1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + if 'tenant_id' in params: + query_params.append(('tenantId', params['tenant_id'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/events/{entityType}/{entityId}{?tenantId,pageSize,page,textSearch,sortProperty,sortOrder,startTime,endTime}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEvent', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_events_using_post(self, body, tenant_id, page_size, page, entity_type, entity_id, **kwargs): # noqa: E501 + """getEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_events_using_post(body, tenant_id, page_size, page, entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EventFilter body: eventFilter (required) + :param str tenant_id: tenantId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataEvent + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_events_using_post_with_http_info(body, tenant_id, page_size, page, entity_type, entity_id, **kwargs) # noqa: E501 + else: + (data) = self.get_events_using_post_with_http_info(body, tenant_id, page_size, page, entity_type, entity_id, **kwargs) # noqa: E501 + return data + + def get_events_using_post_with_http_info(self, body, tenant_id, page_size, page, entity_type, entity_id, **kwargs): # noqa: E501 + """getEvents # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_events_using_post_with_http_info(body, tenant_id, page_size, page, entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param EventFilter body: eventFilter (required) + :param str tenant_id: tenantId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :param int start_time: startTime + :param int end_time: endTime + :return: PageDataEvent + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'tenant_id', 'page_size', 'page', 'entity_type', 'entity_id', 'text_search', 'sort_property', 'sort_order', 'start_time', 'end_time'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_events_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `get_events_using_post`") # noqa: E501 + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `get_events_using_post`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_events_using_post`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_events_using_post`") # noqa: E501 + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_events_using_post`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_events_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + if 'tenant_id' in params: + query_params.append(('tenantId', params['tenant_id'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'start_time' in params: + query_params.append(('startTime', params['start_time'])) # noqa: E501 + if 'end_time' in params: + query_params.append(('endTime', params['end_time'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/events/{entityType}/{entityId}{?tenantId,pageSize,page,textSearch,sortProperty,sortOrder,startTime,endTime}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEvent', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/lwm_2m_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/lwm_2m_controller_api.py new file mode 100644 index 0000000..fe8548a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/lwm_2m_controller_api.py @@ -0,0 +1,219 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class Lwm2mControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_lwm2m_bootstrap_security_info_using_get(self, is_bootstrap_server, **kwargs): # noqa: E501 + """getLwm2mBootstrapSecurityInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_lwm2m_bootstrap_security_info_using_get(is_bootstrap_server, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param bool is_bootstrap_server: isBootstrapServer (required) + :return: ServerSecurityConfig + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_lwm2m_bootstrap_security_info_using_get_with_http_info(is_bootstrap_server, **kwargs) # noqa: E501 + else: + (data) = self.get_lwm2m_bootstrap_security_info_using_get_with_http_info(is_bootstrap_server, **kwargs) # noqa: E501 + return data + + def get_lwm2m_bootstrap_security_info_using_get_with_http_info(self, is_bootstrap_server, **kwargs): # noqa: E501 + """getLwm2mBootstrapSecurityInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_lwm2m_bootstrap_security_info_using_get_with_http_info(is_bootstrap_server, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param bool is_bootstrap_server: isBootstrapServer (required) + :return: ServerSecurityConfig + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['is_bootstrap_server'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_lwm2m_bootstrap_security_info_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'is_bootstrap_server' is set + if ('is_bootstrap_server' not in params or + params['is_bootstrap_server'] is None): + raise ValueError("Missing the required parameter `is_bootstrap_server` when calling `get_lwm2m_bootstrap_security_info_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'is_bootstrap_server' in params: + path_params['isBootstrapServer'] = params['is_bootstrap_server'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/lwm2m/deviceProfile/bootstrap/{isBootstrapServer}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='ServerSecurityConfig', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_device_with_credentials_using_post(self, **kwargs): # noqa: E501 + """saveDeviceWithCredentials # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_with_credentials_using_post(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param dict(str, object) body: deviceWithDeviceCredentials + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_device_with_credentials_using_post_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.save_device_with_credentials_using_post_with_http_info(**kwargs) # noqa: E501 + return data + + def save_device_with_credentials_using_post_with_http_info(self, **kwargs): # noqa: E501 + """saveDeviceWithCredentials # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_with_credentials_using_post_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param dict(str, object) body: deviceWithDeviceCredentials + :return: Device + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_device_with_credentials_using_post" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/lwm2m/device-credentials', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Device', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/o_auth_2_config_template_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/o_auth_2_config_template_controller_api.py new file mode 100644 index 0000000..559726b --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/o_auth_2_config_template_controller_api.py @@ -0,0 +1,304 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class OAuth2ConfigTemplateControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_client_registration_template_using_delete(self, client_registration_template_id, **kwargs): # noqa: E501 + """deleteClientRegistrationTemplate # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_client_registration_template_using_delete(client_registration_template_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str client_registration_template_id: clientRegistrationTemplateId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_client_registration_template_using_delete_with_http_info(client_registration_template_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_client_registration_template_using_delete_with_http_info(client_registration_template_id, **kwargs) # noqa: E501 + return data + + def delete_client_registration_template_using_delete_with_http_info(self, client_registration_template_id, **kwargs): # noqa: E501 + """deleteClientRegistrationTemplate # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_client_registration_template_using_delete_with_http_info(client_registration_template_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str client_registration_template_id: clientRegistrationTemplateId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['client_registration_template_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_client_registration_template_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'client_registration_template_id' is set + if ('client_registration_template_id' not in params or + params['client_registration_template_id'] is None): + raise ValueError("Missing the required parameter `client_registration_template_id` when calling `delete_client_registration_template_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'client_registration_template_id' in params: + path_params['clientRegistrationTemplateId'] = params['client_registration_template_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/oauth2/config/template/{clientRegistrationTemplateId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_client_registration_templates_using_get(self, **kwargs): # noqa: E501 + """getClientRegistrationTemplates # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_client_registration_templates_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[OAuth2ClientRegistrationTemplate] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_client_registration_templates_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_client_registration_templates_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_client_registration_templates_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getClientRegistrationTemplates # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_client_registration_templates_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[OAuth2ClientRegistrationTemplate] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_client_registration_templates_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/oauth2/config/template', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[OAuth2ClientRegistrationTemplate]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_client_registration_template_using_post(self, body, **kwargs): # noqa: E501 + """saveClientRegistrationTemplate # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_client_registration_template_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param OAuth2ClientRegistrationTemplate body: clientRegistrationTemplate (required) + :return: OAuth2ClientRegistrationTemplate + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_client_registration_template_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_client_registration_template_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_client_registration_template_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveClientRegistrationTemplate # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_client_registration_template_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param OAuth2ClientRegistrationTemplate body: clientRegistrationTemplate (required) + :return: OAuth2ClientRegistrationTemplate + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_client_registration_template_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_client_registration_template_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/oauth2/config/template', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='OAuth2ClientRegistrationTemplate', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/o_auth_2_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/o_auth_2_controller_api.py new file mode 100644 index 0000000..ef74d3d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/o_auth_2_controller_api.py @@ -0,0 +1,393 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class OAuth2ControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_current_o_auth2_info_using_get(self, **kwargs): # noqa: E501 + """getCurrentOAuth2Info # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_current_o_auth2_info_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: OAuth2Info + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_current_o_auth2_info_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_current_o_auth2_info_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_current_o_auth2_info_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getCurrentOAuth2Info # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_current_o_auth2_info_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: OAuth2Info + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_current_o_auth2_info_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/oauth2/config', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='OAuth2Info', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_login_processing_url_using_get(self, **kwargs): # noqa: E501 + """getLoginProcessingUrl # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_login_processing_url_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_login_processing_url_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_login_processing_url_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_login_processing_url_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getLoginProcessingUrl # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_login_processing_url_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_login_processing_url_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/oauth2/loginProcessingUrl', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_o_auth2_clients_using_post(self, **kwargs): # noqa: E501 + """getOAuth2Clients # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_o_auth2_clients_using_post(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str pkg_name: pkgName + :param str platform: platform + :return: list[OAuth2ClientInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_o_auth2_clients_using_post_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_o_auth2_clients_using_post_with_http_info(**kwargs) # noqa: E501 + return data + + def get_o_auth2_clients_using_post_with_http_info(self, **kwargs): # noqa: E501 + """getOAuth2Clients # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_o_auth2_clients_using_post_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str pkg_name: pkgName + :param str platform: platform + :return: list[OAuth2ClientInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['pkg_name', 'platform'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_o_auth2_clients_using_post" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'pkg_name' in params: + query_params.append(('pkgName', params['pkg_name'])) # noqa: E501 + if 'platform' in params: + query_params.append(('platform', params['platform'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/oauth2Clients{?pkgName,platform}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[OAuth2ClientInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_o_auth2_info_using_post(self, body, **kwargs): # noqa: E501 + """saveOAuth2Info # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_o_auth2_info_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param OAuth2Info body: oauth2Info (required) + :return: OAuth2Info + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_o_auth2_info_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_o_auth2_info_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_o_auth2_info_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveOAuth2Info # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_o_auth2_info_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param OAuth2Info body: oauth2Info (required) + :return: OAuth2Info + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_o_auth2_info_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_o_auth2_info_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/oauth2/config', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='OAuth2Info', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/ota_package_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/ota_package_controller_api.py new file mode 100644 index 0000000..8fe8c0f --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/ota_package_controller_api.py @@ -0,0 +1,857 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class OtaPackageControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_ota_package_using_delete(self, ota_package_id, **kwargs): # noqa: E501 + """deleteOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_ota_package_using_delete(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_ota_package_using_delete_with_http_info(ota_package_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_ota_package_using_delete_with_http_info(ota_package_id, **kwargs) # noqa: E501 + return data + + def delete_ota_package_using_delete_with_http_info(self, ota_package_id, **kwargs): # noqa: E501 + """deleteOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_ota_package_using_delete_with_http_info(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['ota_package_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_ota_package_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'ota_package_id' is set + if ('ota_package_id' not in params or + params['ota_package_id'] is None): + raise ValueError("Missing the required parameter `ota_package_id` when calling `delete_ota_package_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_id' in params: + path_params['otaPackageId'] = params['ota_package_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackage/{otaPackageId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def download_ota_package_using_get(self, ota_package_id, **kwargs): # noqa: E501 + """downloadOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.download_ota_package_using_get(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: Resource + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.download_ota_package_using_get_with_http_info(ota_package_id, **kwargs) # noqa: E501 + else: + (data) = self.download_ota_package_using_get_with_http_info(ota_package_id, **kwargs) # noqa: E501 + return data + + def download_ota_package_using_get_with_http_info(self, ota_package_id, **kwargs): # noqa: E501 + """downloadOtaPackage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.download_ota_package_using_get_with_http_info(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: Resource + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['ota_package_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method download_ota_package_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'ota_package_id' is set + if ('ota_package_id' not in params or + params['ota_package_id'] is None): + raise ValueError("Missing the required parameter `ota_package_id` when calling `download_ota_package_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_id' in params: + path_params['otaPackageId'] = params['ota_package_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackage/{otaPackageId}/download', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Resource', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_ota_package_by_id_using_get(self, ota_package_id, **kwargs): # noqa: E501 + """getOtaPackageById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_package_by_id_using_get(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: OtaPackage + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_ota_package_by_id_using_get_with_http_info(ota_package_id, **kwargs) # noqa: E501 + else: + (data) = self.get_ota_package_by_id_using_get_with_http_info(ota_package_id, **kwargs) # noqa: E501 + return data + + def get_ota_package_by_id_using_get_with_http_info(self, ota_package_id, **kwargs): # noqa: E501 + """getOtaPackageById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_package_by_id_using_get_with_http_info(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: OtaPackage + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['ota_package_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_ota_package_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'ota_package_id' is set + if ('ota_package_id' not in params or + params['ota_package_id'] is None): + raise ValueError("Missing the required parameter `ota_package_id` when calling `get_ota_package_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_id' in params: + path_params['otaPackageId'] = params['ota_package_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackage/{otaPackageId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='OtaPackage', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_ota_package_info_by_id_using_get(self, ota_package_id, **kwargs): # noqa: E501 + """getOtaPackageInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_package_info_by_id_using_get(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: OtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_ota_package_info_by_id_using_get_with_http_info(ota_package_id, **kwargs) # noqa: E501 + else: + (data) = self.get_ota_package_info_by_id_using_get_with_http_info(ota_package_id, **kwargs) # noqa: E501 + return data + + def get_ota_package_info_by_id_using_get_with_http_info(self, ota_package_id, **kwargs): # noqa: E501 + """getOtaPackageInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_package_info_by_id_using_get_with_http_info(ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str ota_package_id: otaPackageId (required) + :return: OtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['ota_package_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_ota_package_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'ota_package_id' is set + if ('ota_package_id' not in params or + params['ota_package_id'] is None): + raise ValueError("Missing the required parameter `ota_package_id` when calling `get_ota_package_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_id' in params: + path_params['otaPackageId'] = params['ota_package_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackage/info/{otaPackageId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='OtaPackageInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_ota_packages_using_get(self, device_profile_id, type, page_size, page, **kwargs): # noqa: E501 + """getOtaPackages # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_packages_using_get(device_profile_id, type, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId (required) + :param str type: type (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataOtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_ota_packages_using_get_with_http_info(device_profile_id, type, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_ota_packages_using_get_with_http_info(device_profile_id, type, page_size, page, **kwargs) # noqa: E501 + return data + + def get_ota_packages_using_get_with_http_info(self, device_profile_id, type, page_size, page, **kwargs): # noqa: E501 + """getOtaPackages # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_packages_using_get_with_http_info(device_profile_id, type, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_profile_id: deviceProfileId (required) + :param str type: type (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataOtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_profile_id', 'type', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_ota_packages_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_profile_id' is set + if ('device_profile_id' not in params or + params['device_profile_id'] is None): + raise ValueError("Missing the required parameter `device_profile_id` when calling `get_ota_packages_using_get`") # noqa: E501 + # verify the required parameter 'type' is set + if ('type' not in params or + params['type'] is None): + raise ValueError("Missing the required parameter `type` when calling `get_ota_packages_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_ota_packages_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_ota_packages_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_profile_id' in params: + path_params['deviceProfileId'] = params['device_profile_id'] # noqa: E501 + if 'type' in params: + path_params['type'] = params['type'] # noqa: E501 + + query_params = [] + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackages/{deviceProfileId}/{type}{?pageSize,page,textSearch,sortProperty,sortOrder}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataOtaPackageInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_ota_packages_using_get1(self, page_size, page, **kwargs): # noqa: E501 + """getOtaPackages # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_packages_using_get1(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataOtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_ota_packages_using_get1_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_ota_packages_using_get1_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_ota_packages_using_get1_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getOtaPackages # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_ota_packages_using_get1_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataOtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_ota_packages_using_get1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_ota_packages_using_get1`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_ota_packages_using_get1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackages{?pageSize,page,textSearch,sortProperty,sortOrder}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataOtaPackageInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_ota_package_data_using_post(self, file, checksum_algorithm, ota_package_id, **kwargs): # noqa: E501 + """saveOtaPackageData # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_ota_package_data_using_post(file, checksum_algorithm, ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str file: (required) + :param str checksum_algorithm: checksumAlgorithm (required) + :param str ota_package_id: otaPackageId (required) + :param str checksum: checksum + :return: OtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_ota_package_data_using_post_with_http_info(file, checksum_algorithm, ota_package_id, **kwargs) # noqa: E501 + else: + (data) = self.save_ota_package_data_using_post_with_http_info(file, checksum_algorithm, ota_package_id, **kwargs) # noqa: E501 + return data + + def save_ota_package_data_using_post_with_http_info(self, file, checksum_algorithm, ota_package_id, **kwargs): # noqa: E501 + """saveOtaPackageData # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_ota_package_data_using_post_with_http_info(file, checksum_algorithm, ota_package_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str file: (required) + :param str checksum_algorithm: checksumAlgorithm (required) + :param str ota_package_id: otaPackageId (required) + :param str checksum: checksum + :return: OtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['file', 'checksum_algorithm', 'ota_package_id', 'checksum'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_ota_package_data_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'file' is set + if ('file' not in params or + params['file'] is None): + raise ValueError("Missing the required parameter `file` when calling `save_ota_package_data_using_post`") # noqa: E501 + # verify the required parameter 'checksum_algorithm' is set + if ('checksum_algorithm' not in params or + params['checksum_algorithm'] is None): + raise ValueError("Missing the required parameter `checksum_algorithm` when calling `save_ota_package_data_using_post`") # noqa: E501 + # verify the required parameter 'ota_package_id' is set + if ('ota_package_id' not in params or + params['ota_package_id'] is None): + raise ValueError("Missing the required parameter `ota_package_id` when calling `save_ota_package_data_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'ota_package_id' in params: + path_params['otaPackageId'] = params['ota_package_id'] # noqa: E501 + + query_params = [] + if 'checksum' in params: + query_params.append(('checksum', params['checksum'])) # noqa: E501 + if 'checksum_algorithm' in params: + query_params.append(('checksumAlgorithm', params['checksum_algorithm'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + if 'file' in params: + local_var_files['file'] = params['file'] # noqa: E501 + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['multipart/form-data']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackage/{otaPackageId}{?checksum,checksumAlgorithm}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='OtaPackageInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_ota_package_info_using_post(self, body, **kwargs): # noqa: E501 + """saveOtaPackageInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_ota_package_info_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SaveOtaPackageInfoRequest body: otaPackageInfo (required) + :return: OtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_ota_package_info_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_ota_package_info_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_ota_package_info_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveOtaPackageInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_ota_package_info_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SaveOtaPackageInfoRequest body: otaPackageInfo (required) + :return: OtaPackageInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_ota_package_info_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_ota_package_info_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/otaPackage', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='OtaPackageInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/queue_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/queue_controller_api.py new file mode 100644 index 0000000..3f12b1c --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/queue_controller_api.py @@ -0,0 +1,126 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class QueueControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def get_tenant_queues_by_service_type_using_get(self, service_type, **kwargs): # noqa: E501 + """getTenantQueuesByServiceType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_queues_by_service_type_using_get(service_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str service_type: serviceType (required) + :return: list[str] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_queues_by_service_type_using_get_with_http_info(service_type, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_queues_by_service_type_using_get_with_http_info(service_type, **kwargs) # noqa: E501 + return data + + def get_tenant_queues_by_service_type_using_get_with_http_info(self, service_type, **kwargs): # noqa: E501 + """getTenantQueuesByServiceType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_queues_by_service_type_using_get_with_http_info(service_type, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str service_type: serviceType (required) + :return: list[str] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['service_type'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_queues_by_service_type_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'service_type' is set + if ('service_type' not in params or + params['service_type'] is None): + raise ValueError("Missing the required parameter `service_type` when calling `get_tenant_queues_by_service_type_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'service_type' in params: + query_params.append(('serviceType', params['service_type'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/queues{?serviceType}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[str]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/rpc_v_1_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/rpc_v_1_controller_api.py new file mode 100644 index 0000000..8cd4ab5 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/rpc_v_1_controller_api.py @@ -0,0 +1,243 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class RpcV1ControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def handle_one_way_device_rpc_request_using_post(self, body, device_id, **kwargs): # noqa: E501 + """handleOneWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_one_way_device_rpc_request_using_post(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.handle_one_way_device_rpc_request_using_post_with_http_info(body, device_id, **kwargs) # noqa: E501 + else: + (data) = self.handle_one_way_device_rpc_request_using_post_with_http_info(body, device_id, **kwargs) # noqa: E501 + return data + + def handle_one_way_device_rpc_request_using_post_with_http_info(self, body, device_id, **kwargs): # noqa: E501 + """handleOneWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_one_way_device_rpc_request_using_post_with_http_info(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method handle_one_way_device_rpc_request_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `handle_one_way_device_rpc_request_using_post`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `handle_one_way_device_rpc_request_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/rpc/oneway/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def handle_two_way_device_rpc_request_using_post(self, body, device_id, **kwargs): # noqa: E501 + """handleTwoWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_two_way_device_rpc_request_using_post(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.handle_two_way_device_rpc_request_using_post_with_http_info(body, device_id, **kwargs) # noqa: E501 + else: + (data) = self.handle_two_way_device_rpc_request_using_post_with_http_info(body, device_id, **kwargs) # noqa: E501 + return data + + def handle_two_way_device_rpc_request_using_post_with_http_info(self, body, device_id, **kwargs): # noqa: E501 + """handleTwoWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_two_way_device_rpc_request_using_post_with_http_info(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method handle_two_way_device_rpc_request_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `handle_two_way_device_rpc_request_using_post`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `handle_two_way_device_rpc_request_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/rpc/twoway/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/rpc_v_2_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/rpc_v_2_controller_api.py new file mode 100644 index 0000000..812babd --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/rpc_v_2_controller_api.py @@ -0,0 +1,554 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class RpcV2ControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_resource_using_delete(self, rpc_id, **kwargs): # noqa: E501 + """deleteResource # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_resource_using_delete(rpc_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rpc_id: rpcId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_resource_using_delete_with_http_info(rpc_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_resource_using_delete_with_http_info(rpc_id, **kwargs) # noqa: E501 + return data + + def delete_resource_using_delete_with_http_info(self, rpc_id, **kwargs): # noqa: E501 + """deleteResource # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_resource_using_delete_with_http_info(rpc_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rpc_id: rpcId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['rpc_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_resource_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'rpc_id' is set + if ('rpc_id' not in params or + params['rpc_id'] is None): + raise ValueError("Missing the required parameter `rpc_id` when calling `delete_resource_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'rpc_id' in params: + path_params['rpcId'] = params['rpc_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rpc/persistent/{rpcId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_persisted_rpc_by_device_using_get(self, device_id, page_size, page, rpc_status, **kwargs): # noqa: E501 + """getPersistedRpcByDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_persisted_rpc_by_device_using_get(device_id, page_size, page, rpc_status, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str rpc_status: rpcStatus (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataRpc + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_persisted_rpc_by_device_using_get_with_http_info(device_id, page_size, page, rpc_status, **kwargs) # noqa: E501 + else: + (data) = self.get_persisted_rpc_by_device_using_get_with_http_info(device_id, page_size, page, rpc_status, **kwargs) # noqa: E501 + return data + + def get_persisted_rpc_by_device_using_get_with_http_info(self, device_id, page_size, page, rpc_status, **kwargs): # noqa: E501 + """getPersistedRpcByDevice # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_persisted_rpc_by_device_using_get_with_http_info(device_id, page_size, page, rpc_status, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :param int page_size: pageSize (required) + :param int page: page (required) + :param str rpc_status: rpcStatus (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataRpc + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_id', 'page_size', 'page', 'rpc_status', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_persisted_rpc_by_device_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `get_persisted_rpc_by_device_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_persisted_rpc_by_device_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_persisted_rpc_by_device_using_get`") # noqa: E501 + # verify the required parameter 'rpc_status' is set + if ('rpc_status' not in params or + params['rpc_status'] is None): + raise ValueError("Missing the required parameter `rpc_status` when calling `get_persisted_rpc_by_device_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'rpc_status' in params: + query_params.append(('rpcStatus', params['rpc_status'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rpc/persistent/device/{deviceId}{?pageSize,page,rpcStatus,textSearch,sortProperty,sortOrder}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataRpc', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_persisted_rpc_using_get(self, rpc_id, **kwargs): # noqa: E501 + """getPersistedRpc # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_persisted_rpc_using_get(rpc_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rpc_id: rpcId (required) + :return: Rpc + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_persisted_rpc_using_get_with_http_info(rpc_id, **kwargs) # noqa: E501 + else: + (data) = self.get_persisted_rpc_using_get_with_http_info(rpc_id, **kwargs) # noqa: E501 + return data + + def get_persisted_rpc_using_get_with_http_info(self, rpc_id, **kwargs): # noqa: E501 + """getPersistedRpc # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_persisted_rpc_using_get_with_http_info(rpc_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rpc_id: rpcId (required) + :return: Rpc + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['rpc_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_persisted_rpc_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'rpc_id' is set + if ('rpc_id' not in params or + params['rpc_id'] is None): + raise ValueError("Missing the required parameter `rpc_id` when calling `get_persisted_rpc_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'rpc_id' in params: + path_params['rpcId'] = params['rpc_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rpc/persistent/{rpcId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Rpc', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def handle_one_way_device_rpc_request_using_post1(self, body, device_id, **kwargs): # noqa: E501 + """handleOneWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_one_way_device_rpc_request_using_post1(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.handle_one_way_device_rpc_request_using_post1_with_http_info(body, device_id, **kwargs) # noqa: E501 + else: + (data) = self.handle_one_way_device_rpc_request_using_post1_with_http_info(body, device_id, **kwargs) # noqa: E501 + return data + + def handle_one_way_device_rpc_request_using_post1_with_http_info(self, body, device_id, **kwargs): # noqa: E501 + """handleOneWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_one_way_device_rpc_request_using_post1_with_http_info(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method handle_one_way_device_rpc_request_using_post1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `handle_one_way_device_rpc_request_using_post1`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `handle_one_way_device_rpc_request_using_post1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rpc/oneway/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def handle_two_way_device_rpc_request_using_post1(self, body, device_id, **kwargs): # noqa: E501 + """handleTwoWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_two_way_device_rpc_request_using_post1(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.handle_two_way_device_rpc_request_using_post1_with_http_info(body, device_id, **kwargs) # noqa: E501 + else: + (data) = self.handle_two_way_device_rpc_request_using_post1_with_http_info(body, device_id, **kwargs) # noqa: E501 + return data + + def handle_two_way_device_rpc_request_using_post1_with_http_info(self, body, device_id, **kwargs): # noqa: E501 + """handleTwoWayDeviceRPCRequest # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.handle_two_way_device_rpc_request_using_post1_with_http_info(body, device_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str device_id: deviceId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'device_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method handle_two_way_device_rpc_request_using_post1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `handle_two_way_device_rpc_request_using_post1`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `handle_two_way_device_rpc_request_using_post1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/rpc/twoway/{deviceId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/rule_chain_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/rule_chain_controller_api.py new file mode 100644 index 0000000..27b3d27 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/rule_chain_controller_api.py @@ -0,0 +1,1876 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class RuleChainControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def assign_rule_chain_to_edge_using_post(self, edge_id, rule_chain_id, **kwargs): # noqa: E501 + """assignRuleChainToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_rule_chain_to_edge_using_post(edge_id, rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.assign_rule_chain_to_edge_using_post_with_http_info(edge_id, rule_chain_id, **kwargs) # noqa: E501 + else: + (data) = self.assign_rule_chain_to_edge_using_post_with_http_info(edge_id, rule_chain_id, **kwargs) # noqa: E501 + return data + + def assign_rule_chain_to_edge_using_post_with_http_info(self, edge_id, rule_chain_id, **kwargs): # noqa: E501 + """assignRuleChainToEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.assign_rule_chain_to_edge_using_post_with_http_info(edge_id, rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'rule_chain_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method assign_rule_chain_to_edge_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `assign_rule_chain_to_edge_using_post`") # noqa: E501 + # verify the required parameter 'rule_chain_id' is set + if ('rule_chain_id' not in params or + params['rule_chain_id'] is None): + raise ValueError("Missing the required parameter `rule_chain_id` when calling `assign_rule_chain_to_edge_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'rule_chain_id' in params: + path_params['ruleChainId'] = params['rule_chain_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/ruleChain/{ruleChainId}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='RuleChain', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_rule_chain_using_delete(self, rule_chain_id, **kwargs): # noqa: E501 + """deleteRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_rule_chain_using_delete(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_rule_chain_using_delete_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_rule_chain_using_delete_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + return data + + def delete_rule_chain_using_delete_with_http_info(self, rule_chain_id, **kwargs): # noqa: E501 + """deleteRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_rule_chain_using_delete_with_http_info(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['rule_chain_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_rule_chain_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'rule_chain_id' is set + if ('rule_chain_id' not in params or + params['rule_chain_id'] is None): + raise ValueError("Missing the required parameter `rule_chain_id` when calling `delete_rule_chain_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'rule_chain_id' in params: + path_params['ruleChainId'] = params['rule_chain_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChain/{ruleChainId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def export_rule_chains_using_get(self, limit, **kwargs): # noqa: E501 + """exportRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.export_rule_chains_using_get(limit, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str limit: limit (required) + :return: RuleChainData + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.export_rule_chains_using_get_with_http_info(limit, **kwargs) # noqa: E501 + else: + (data) = self.export_rule_chains_using_get_with_http_info(limit, **kwargs) # noqa: E501 + return data + + def export_rule_chains_using_get_with_http_info(self, limit, **kwargs): # noqa: E501 + """exportRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.export_rule_chains_using_get_with_http_info(limit, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str limit: limit (required) + :return: RuleChainData + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['limit'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method export_rule_chains_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'limit' is set + if ('limit' not in params or + params['limit'] is None): + raise ValueError("Missing the required parameter `limit` when calling `export_rule_chains_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'limit' in params: + query_params.append(('limit', params['limit'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChains/export{?limit}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='RuleChainData', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_auto_assign_to_edge_rule_chains_using_get(self, **kwargs): # noqa: E501 + """getAutoAssignToEdgeRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_auto_assign_to_edge_rule_chains_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[RuleChain] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_auto_assign_to_edge_rule_chains_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_auto_assign_to_edge_rule_chains_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_auto_assign_to_edge_rule_chains_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getAutoAssignToEdgeRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_auto_assign_to_edge_rule_chains_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[RuleChain] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_auto_assign_to_edge_rule_chains_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChain/autoAssignToEdgeRuleChains', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[RuleChain]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_edge_rule_chains_using_get(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_rule_chains_using_get(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataRuleChain + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_edge_rule_chains_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_edge_rule_chains_using_get_with_http_info(edge_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_edge_rule_chains_using_get_with_http_info(self, edge_id, page_size, page, **kwargs): # noqa: E501 + """getEdgeRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_edge_rule_chains_using_get_with_http_info(edge_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataRuleChain + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_edge_rule_chains_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `get_edge_rule_chains_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_edge_rule_chains_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_edge_rule_chains_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/ruleChains{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataRuleChain', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_latest_rule_node_debug_input_using_get(self, rule_node_id, **kwargs): # noqa: E501 + """getLatestRuleNodeDebugInput # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_latest_rule_node_debug_input_using_get(rule_node_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_node_id: ruleNodeId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_latest_rule_node_debug_input_using_get_with_http_info(rule_node_id, **kwargs) # noqa: E501 + else: + (data) = self.get_latest_rule_node_debug_input_using_get_with_http_info(rule_node_id, **kwargs) # noqa: E501 + return data + + def get_latest_rule_node_debug_input_using_get_with_http_info(self, rule_node_id, **kwargs): # noqa: E501 + """getLatestRuleNodeDebugInput # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_latest_rule_node_debug_input_using_get_with_http_info(rule_node_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_node_id: ruleNodeId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['rule_node_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_latest_rule_node_debug_input_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'rule_node_id' is set + if ('rule_node_id' not in params or + params['rule_node_id'] is None): + raise ValueError("Missing the required parameter `rule_node_id` when calling `get_latest_rule_node_debug_input_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'rule_node_id' in params: + path_params['ruleNodeId'] = params['rule_node_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleNode/{ruleNodeId}/debugIn', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_rule_chain_by_id_using_get(self, rule_chain_id, **kwargs): # noqa: E501 + """getRuleChainById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_rule_chain_by_id_using_get(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_rule_chain_by_id_using_get_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + else: + (data) = self.get_rule_chain_by_id_using_get_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + return data + + def get_rule_chain_by_id_using_get_with_http_info(self, rule_chain_id, **kwargs): # noqa: E501 + """getRuleChainById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_rule_chain_by_id_using_get_with_http_info(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['rule_chain_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_rule_chain_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'rule_chain_id' is set + if ('rule_chain_id' not in params or + params['rule_chain_id'] is None): + raise ValueError("Missing the required parameter `rule_chain_id` when calling `get_rule_chain_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'rule_chain_id' in params: + path_params['ruleChainId'] = params['rule_chain_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChain/{ruleChainId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='RuleChain', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_rule_chain_meta_data_using_get(self, rule_chain_id, **kwargs): # noqa: E501 + """getRuleChainMetaData # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_rule_chain_meta_data_using_get(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: RuleChainMetaData + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_rule_chain_meta_data_using_get_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + else: + (data) = self.get_rule_chain_meta_data_using_get_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + return data + + def get_rule_chain_meta_data_using_get_with_http_info(self, rule_chain_id, **kwargs): # noqa: E501 + """getRuleChainMetaData # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_rule_chain_meta_data_using_get_with_http_info(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: RuleChainMetaData + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['rule_chain_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_rule_chain_meta_data_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'rule_chain_id' is set + if ('rule_chain_id' not in params or + params['rule_chain_id'] is None): + raise ValueError("Missing the required parameter `rule_chain_id` when calling `get_rule_chain_meta_data_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'rule_chain_id' in params: + path_params['ruleChainId'] = params['rule_chain_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChain/{ruleChainId}/metadata', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='RuleChainMetaData', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_rule_chains_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_rule_chains_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataRuleChain + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_rule_chains_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_rule_chains_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_rule_chains_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_rule_chains_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str type: type + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataRuleChain + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'type', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_rule_chains_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_rule_chains_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_rule_chains_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'type' in params: + query_params.append(('type', params['type'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChains{?type,textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataRuleChain', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def import_rule_chains_using_post(self, body, **kwargs): # noqa: E501 + """importRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.import_rule_chains_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param RuleChainData body: ruleChainData (required) + :param bool overwrite: overwrite + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.import_rule_chains_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.import_rule_chains_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def import_rule_chains_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """importRuleChains # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.import_rule_chains_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param RuleChainData body: ruleChainData (required) + :param bool overwrite: overwrite + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'overwrite'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method import_rule_chains_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `import_rule_chains_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'overwrite' in params: + query_params.append(('overwrite', params['overwrite'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChains/import{?overwrite}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_rule_chain_meta_data_using_post(self, body, **kwargs): # noqa: E501 + """saveRuleChainMetaData # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_rule_chain_meta_data_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param RuleChainMetaData body: ruleChainMetaData (required) + :return: RuleChainMetaData + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_rule_chain_meta_data_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_rule_chain_meta_data_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_rule_chain_meta_data_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveRuleChainMetaData # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_rule_chain_meta_data_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param RuleChainMetaData body: ruleChainMetaData (required) + :return: RuleChainMetaData + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_rule_chain_meta_data_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_rule_chain_meta_data_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChain/metadata', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='RuleChainMetaData', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_rule_chain_using_post(self, body, **kwargs): # noqa: E501 + """saveRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_rule_chain_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DefaultRuleChainCreateRequest body: request (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_rule_chain_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_rule_chain_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_rule_chain_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_rule_chain_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param DefaultRuleChainCreateRequest body: request (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_rule_chain_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_rule_chain_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChain/device/default', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='RuleChain', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_rule_chain_using_post1(self, body, **kwargs): # noqa: E501 + """saveRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_rule_chain_using_post1(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param RuleChain body: ruleChain (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_rule_chain_using_post1_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_rule_chain_using_post1_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_rule_chain_using_post1_with_http_info(self, body, **kwargs): # noqa: E501 + """saveRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_rule_chain_using_post1_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param RuleChain body: ruleChain (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_rule_chain_using_post1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_rule_chain_using_post1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChain', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='RuleChain', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_auto_assign_to_edge_rule_chain_using_post(self, rule_chain_id, **kwargs): # noqa: E501 + """setAutoAssignToEdgeRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_auto_assign_to_edge_rule_chain_using_post(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_auto_assign_to_edge_rule_chain_using_post_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + else: + (data) = self.set_auto_assign_to_edge_rule_chain_using_post_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + return data + + def set_auto_assign_to_edge_rule_chain_using_post_with_http_info(self, rule_chain_id, **kwargs): # noqa: E501 + """setAutoAssignToEdgeRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_auto_assign_to_edge_rule_chain_using_post_with_http_info(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['rule_chain_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_auto_assign_to_edge_rule_chain_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'rule_chain_id' is set + if ('rule_chain_id' not in params or + params['rule_chain_id'] is None): + raise ValueError("Missing the required parameter `rule_chain_id` when calling `set_auto_assign_to_edge_rule_chain_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'rule_chain_id' in params: + path_params['ruleChainId'] = params['rule_chain_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChain/{ruleChainId}/autoAssignToEdge', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='RuleChain', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_edge_template_root_rule_chain_using_post(self, rule_chain_id, **kwargs): # noqa: E501 + """setEdgeTemplateRootRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_edge_template_root_rule_chain_using_post(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_edge_template_root_rule_chain_using_post_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + else: + (data) = self.set_edge_template_root_rule_chain_using_post_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + return data + + def set_edge_template_root_rule_chain_using_post_with_http_info(self, rule_chain_id, **kwargs): # noqa: E501 + """setEdgeTemplateRootRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_edge_template_root_rule_chain_using_post_with_http_info(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['rule_chain_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_edge_template_root_rule_chain_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'rule_chain_id' is set + if ('rule_chain_id' not in params or + params['rule_chain_id'] is None): + raise ValueError("Missing the required parameter `rule_chain_id` when calling `set_edge_template_root_rule_chain_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'rule_chain_id' in params: + path_params['ruleChainId'] = params['rule_chain_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChain/{ruleChainId}/edgeTemplateRoot', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='RuleChain', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_root_rule_chain_using_post1(self, rule_chain_id, **kwargs): # noqa: E501 + """setRootRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_root_rule_chain_using_post1(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_root_rule_chain_using_post1_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + else: + (data) = self.set_root_rule_chain_using_post1_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + return data + + def set_root_rule_chain_using_post1_with_http_info(self, rule_chain_id, **kwargs): # noqa: E501 + """setRootRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_root_rule_chain_using_post1_with_http_info(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['rule_chain_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_root_rule_chain_using_post1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'rule_chain_id' is set + if ('rule_chain_id' not in params or + params['rule_chain_id'] is None): + raise ValueError("Missing the required parameter `rule_chain_id` when calling `set_root_rule_chain_using_post1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'rule_chain_id' in params: + path_params['ruleChainId'] = params['rule_chain_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChain/{ruleChainId}/root', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='RuleChain', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def test_script_using_post(self, body, **kwargs): # noqa: E501 + """testScript # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.test_script_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: inputParams (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.test_script_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.test_script_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def test_script_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """testScript # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.test_script_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: inputParams (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method test_script_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `test_script_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChain/testScript', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unassign_rule_chain_from_edge_using_delete(self, edge_id, rule_chain_id, **kwargs): # noqa: E501 + """unassignRuleChainFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_rule_chain_from_edge_using_delete(edge_id, rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unassign_rule_chain_from_edge_using_delete_with_http_info(edge_id, rule_chain_id, **kwargs) # noqa: E501 + else: + (data) = self.unassign_rule_chain_from_edge_using_delete_with_http_info(edge_id, rule_chain_id, **kwargs) # noqa: E501 + return data + + def unassign_rule_chain_from_edge_using_delete_with_http_info(self, edge_id, rule_chain_id, **kwargs): # noqa: E501 + """unassignRuleChainFromEdge # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unassign_rule_chain_from_edge_using_delete_with_http_info(edge_id, rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str edge_id: edgeId (required) + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['edge_id', 'rule_chain_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unassign_rule_chain_from_edge_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'edge_id' is set + if ('edge_id' not in params or + params['edge_id'] is None): + raise ValueError("Missing the required parameter `edge_id` when calling `unassign_rule_chain_from_edge_using_delete`") # noqa: E501 + # verify the required parameter 'rule_chain_id' is set + if ('rule_chain_id' not in params or + params['rule_chain_id'] is None): + raise ValueError("Missing the required parameter `rule_chain_id` when calling `unassign_rule_chain_from_edge_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'edge_id' in params: + path_params['edgeId'] = params['edge_id'] # noqa: E501 + if 'rule_chain_id' in params: + path_params['ruleChainId'] = params['rule_chain_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/edge/{edgeId}/ruleChain/{ruleChainId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='RuleChain', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def unset_auto_assign_to_edge_rule_chain_using_delete(self, rule_chain_id, **kwargs): # noqa: E501 + """unsetAutoAssignToEdgeRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unset_auto_assign_to_edge_rule_chain_using_delete(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.unset_auto_assign_to_edge_rule_chain_using_delete_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + else: + (data) = self.unset_auto_assign_to_edge_rule_chain_using_delete_with_http_info(rule_chain_id, **kwargs) # noqa: E501 + return data + + def unset_auto_assign_to_edge_rule_chain_using_delete_with_http_info(self, rule_chain_id, **kwargs): # noqa: E501 + """unsetAutoAssignToEdgeRuleChain # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.unset_auto_assign_to_edge_rule_chain_using_delete_with_http_info(rule_chain_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str rule_chain_id: ruleChainId (required) + :return: RuleChain + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['rule_chain_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method unset_auto_assign_to_edge_rule_chain_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'rule_chain_id' is set + if ('rule_chain_id' not in params or + params['rule_chain_id'] is None): + raise ValueError("Missing the required parameter `rule_chain_id` when calling `unset_auto_assign_to_edge_rule_chain_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'rule_chain_id' in params: + path_params['ruleChainId'] = params['rule_chain_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/ruleChain/{ruleChainId}/autoAssignToEdge', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='RuleChain', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/sign_up_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/sign_up_controller_api.py new file mode 100644 index 0000000..1247ee1 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/sign_up_controller_api.py @@ -0,0 +1,741 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class SignUpControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def accept_privacy_policy_using_post(self, **kwargs): # noqa: E501 + """acceptPrivacyPolicy # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.accept_privacy_policy_using_post(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.accept_privacy_policy_using_post_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.accept_privacy_policy_using_post_with_http_info(**kwargs) # noqa: E501 + return data + + def accept_privacy_policy_using_post_with_http_info(self, **kwargs): # noqa: E501 + """acceptPrivacyPolicy # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.accept_privacy_policy_using_post_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method accept_privacy_policy_using_post" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/signup/acceptPrivacyPolicy', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def activate_email_using_get(self, email_code, **kwargs): # noqa: E501 + """activateEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_email_using_get(email_code, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email_code: emailCode (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.activate_email_using_get_with_http_info(email_code, **kwargs) # noqa: E501 + else: + (data) = self.activate_email_using_get_with_http_info(email_code, **kwargs) # noqa: E501 + return data + + def activate_email_using_get_with_http_info(self, email_code, **kwargs): # noqa: E501 + """activateEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_email_using_get_with_http_info(email_code, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email_code: emailCode (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['email_code'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method activate_email_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'email_code' is set + if ('email_code' not in params or + params['email_code'] is None): + raise ValueError("Missing the required parameter `email_code` when calling `activate_email_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'email_code' in params: + query_params.append(('emailCode', params['email_code'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/activateEmail{?emailCode}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def activate_user_by_email_code_using_post(self, email_code, **kwargs): # noqa: E501 + """activateUserByEmailCode # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_user_by_email_code_using_post(email_code, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email_code: emailCode (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.activate_user_by_email_code_using_post_with_http_info(email_code, **kwargs) # noqa: E501 + else: + (data) = self.activate_user_by_email_code_using_post_with_http_info(email_code, **kwargs) # noqa: E501 + return data + + def activate_user_by_email_code_using_post_with_http_info(self, email_code, **kwargs): # noqa: E501 + """activateUserByEmailCode # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.activate_user_by_email_code_using_post_with_http_info(email_code, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email_code: emailCode (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['email_code'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method activate_user_by_email_code_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'email_code' is set + if ('email_code' not in params or + params['email_code'] is None): + raise ValueError("Missing the required parameter `email_code` when calling `activate_user_by_email_code_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'email_code' in params: + query_params.append(('emailCode', params['email_code'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/activateByEmailCode{?emailCode}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_tenant_account_using_delete(self, **kwargs): # noqa: E501 + """deleteTenantAccount # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_tenant_account_using_delete(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_tenant_account_using_delete_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.delete_tenant_account_using_delete_with_http_info(**kwargs) # noqa: E501 + return data + + def delete_tenant_account_using_delete_with_http_info(self, **kwargs): # noqa: E501 + """deleteTenantAccount # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_tenant_account_using_delete_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_tenant_account_using_delete" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/signup/tenantAccount', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_recaptcha_public_key_using_get(self, **kwargs): # noqa: E501 + """getRecaptchaPublicKey # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_recaptcha_public_key_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_recaptcha_public_key_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_recaptcha_public_key_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_recaptcha_public_key_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getRecaptchaPublicKey # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_recaptcha_public_key_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_recaptcha_public_key_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/signup/recaptchaPublicKey', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def privacy_policy_accepted_using_get(self, **kwargs): # noqa: E501 + """privacyPolicyAccepted # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.privacy_policy_accepted_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.privacy_policy_accepted_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.privacy_policy_accepted_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def privacy_policy_accepted_using_get_with_http_info(self, **kwargs): # noqa: E501 + """privacyPolicyAccepted # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.privacy_policy_accepted_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method privacy_policy_accepted_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/signup/privacyPolicyAccepted', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def resend_email_activation_using_post(self, email, **kwargs): # noqa: E501 + """resendEmailActivation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.resend_email_activation_using_post(email, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email: email (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.resend_email_activation_using_post_with_http_info(email, **kwargs) # noqa: E501 + else: + (data) = self.resend_email_activation_using_post_with_http_info(email, **kwargs) # noqa: E501 + return data + + def resend_email_activation_using_post_with_http_info(self, email, **kwargs): # noqa: E501 + """resendEmailActivation # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.resend_email_activation_using_post_with_http_info(email, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email: email (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['email'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method resend_email_activation_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'email' is set + if ('email' not in params or + params['email'] is None): + raise ValueError("Missing the required parameter `email` when calling `resend_email_activation_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'email' in params: + query_params.append(('email', params['email'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/resendEmailActivation{?email}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def sign_up_using_post(self, body, **kwargs): # noqa: E501 + """signUp # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.sign_up_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SignUpRequest body: signUpRequest (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.sign_up_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.sign_up_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def sign_up_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """signUp # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.sign_up_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param SignUpRequest body: signUpRequest (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method sign_up_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `sign_up_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = [] # noqa: E501 + + return self.api_client.call_api( + '/api/noauth/signup', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/tb_resource_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/tb_resource_controller_api.py new file mode 100644 index 0000000..02ea341 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/tb_resource_controller_api.py @@ -0,0 +1,830 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class TbResourceControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_resource_using_delete1(self, resource_id, **kwargs): # noqa: E501 + """deleteResource # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_resource_using_delete1(resource_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str resource_id: resourceId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_resource_using_delete1_with_http_info(resource_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_resource_using_delete1_with_http_info(resource_id, **kwargs) # noqa: E501 + return data + + def delete_resource_using_delete1_with_http_info(self, resource_id, **kwargs): # noqa: E501 + """deleteResource # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_resource_using_delete1_with_http_info(resource_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str resource_id: resourceId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['resource_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_resource_using_delete1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'resource_id' is set + if ('resource_id' not in params or + params['resource_id'] is None): + raise ValueError("Missing the required parameter `resource_id` when calling `delete_resource_using_delete1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'resource_id' in params: + path_params['resourceId'] = params['resource_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/resource/{resourceId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def download_resource_using_get(self, resource_id, **kwargs): # noqa: E501 + """downloadResource # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.download_resource_using_get(resource_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str resource_id: resourceId (required) + :return: Resource + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.download_resource_using_get_with_http_info(resource_id, **kwargs) # noqa: E501 + else: + (data) = self.download_resource_using_get_with_http_info(resource_id, **kwargs) # noqa: E501 + return data + + def download_resource_using_get_with_http_info(self, resource_id, **kwargs): # noqa: E501 + """downloadResource # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.download_resource_using_get_with_http_info(resource_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str resource_id: resourceId (required) + :return: Resource + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['resource_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method download_resource_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'resource_id' is set + if ('resource_id' not in params or + params['resource_id'] is None): + raise ValueError("Missing the required parameter `resource_id` when calling `download_resource_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'resource_id' in params: + path_params['resourceId'] = params['resource_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/resource/{resourceId}/download', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Resource', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_lwm2m_list_objects_page_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getLwm2mListObjectsPage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_lwm2m_list_objects_page_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: list[LwM2mObject] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_lwm2m_list_objects_page_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_lwm2m_list_objects_page_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_lwm2m_list_objects_page_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getLwm2mListObjectsPage # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_lwm2m_list_objects_page_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: list[LwM2mObject] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_lwm2m_list_objects_page_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_lwm2m_list_objects_page_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_lwm2m_list_objects_page_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/resource/lwm2m/page{?pageSize,page,textSearch,sortProperty,sortOrder}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[LwM2mObject]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_lwm2m_list_objects_using_get(self, sort_order, sort_property, **kwargs): # noqa: E501 + """getLwm2mListObjects # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_lwm2m_list_objects_using_get(sort_order, sort_property, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str sort_order: sortOrder (required) + :param str sort_property: sortProperty (required) + :param list[str] object_ids: objectIds + :return: list[LwM2mObject] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_lwm2m_list_objects_using_get_with_http_info(sort_order, sort_property, **kwargs) # noqa: E501 + else: + (data) = self.get_lwm2m_list_objects_using_get_with_http_info(sort_order, sort_property, **kwargs) # noqa: E501 + return data + + def get_lwm2m_list_objects_using_get_with_http_info(self, sort_order, sort_property, **kwargs): # noqa: E501 + """getLwm2mListObjects # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_lwm2m_list_objects_using_get_with_http_info(sort_order, sort_property, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str sort_order: sortOrder (required) + :param str sort_property: sortProperty (required) + :param list[str] object_ids: objectIds + :return: list[LwM2mObject] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['sort_order', 'sort_property', 'object_ids'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_lwm2m_list_objects_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'sort_order' is set + if ('sort_order' not in params or + params['sort_order'] is None): + raise ValueError("Missing the required parameter `sort_order` when calling `get_lwm2m_list_objects_using_get`") # noqa: E501 + # verify the required parameter 'sort_property' is set + if ('sort_property' not in params or + params['sort_property'] is None): + raise ValueError("Missing the required parameter `sort_property` when calling `get_lwm2m_list_objects_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'object_ids' in params: + query_params.append(('objectIds', params['object_ids'])) # noqa: E501 + collection_formats['objectIds'] = 'multi' # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/resource/lwm2m{?sortOrder,sortProperty,objectIds}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[LwM2mObject]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_resource_by_id_using_get(self, resource_id, **kwargs): # noqa: E501 + """getResourceById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_resource_by_id_using_get(resource_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str resource_id: resourceId (required) + :return: TbResource + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_resource_by_id_using_get_with_http_info(resource_id, **kwargs) # noqa: E501 + else: + (data) = self.get_resource_by_id_using_get_with_http_info(resource_id, **kwargs) # noqa: E501 + return data + + def get_resource_by_id_using_get_with_http_info(self, resource_id, **kwargs): # noqa: E501 + """getResourceById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_resource_by_id_using_get_with_http_info(resource_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str resource_id: resourceId (required) + :return: TbResource + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['resource_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_resource_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'resource_id' is set + if ('resource_id' not in params or + params['resource_id'] is None): + raise ValueError("Missing the required parameter `resource_id` when calling `get_resource_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'resource_id' in params: + path_params['resourceId'] = params['resource_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/resource/{resourceId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='TbResource', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_resource_info_by_id_using_get(self, resource_id, **kwargs): # noqa: E501 + """getResourceInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_resource_info_by_id_using_get(resource_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str resource_id: resourceId (required) + :return: TbResourceInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_resource_info_by_id_using_get_with_http_info(resource_id, **kwargs) # noqa: E501 + else: + (data) = self.get_resource_info_by_id_using_get_with_http_info(resource_id, **kwargs) # noqa: E501 + return data + + def get_resource_info_by_id_using_get_with_http_info(self, resource_id, **kwargs): # noqa: E501 + """getResourceInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_resource_info_by_id_using_get_with_http_info(resource_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str resource_id: resourceId (required) + :return: TbResourceInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['resource_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_resource_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'resource_id' is set + if ('resource_id' not in params or + params['resource_id'] is None): + raise ValueError("Missing the required parameter `resource_id` when calling `get_resource_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'resource_id' in params: + path_params['resourceId'] = params['resource_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/resource/info/{resourceId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='TbResourceInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_resources_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getResources # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_resources_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataTbResourceInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_resources_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_resources_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_resources_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getResources # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_resources_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param int page_size: pageSize (required) + :param int page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataTbResourceInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_resources_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_resources_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_resources_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/resource{?pageSize,page,textSearch,sortProperty,sortOrder}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataTbResourceInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_resource_using_post(self, body, **kwargs): # noqa: E501 + """saveResource # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_resource_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param TbResource body: resource (required) + :return: TbResource + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_resource_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_resource_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_resource_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveResource # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_resource_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param TbResource body: resource (required) + :return: TbResource + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_resource_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_resource_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/resource', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='TbResource', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/telemetry_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/telemetry_controller_api.py new file mode 100644 index 0000000..1836f8d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/telemetry_controller_api.py @@ -0,0 +1,1772 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class TelemetryControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_entity_attributes_using_delete(self, device_id, scope, keys, **kwargs): # noqa: E501 + """deleteEntityAttributes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_attributes_using_delete(device_id, scope, keys, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :param str scope: scope (required) + :param str keys: keys (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_entity_attributes_using_delete_with_http_info(device_id, scope, keys, **kwargs) # noqa: E501 + else: + (data) = self.delete_entity_attributes_using_delete_with_http_info(device_id, scope, keys, **kwargs) # noqa: E501 + return data + + def delete_entity_attributes_using_delete_with_http_info(self, device_id, scope, keys, **kwargs): # noqa: E501 + """deleteEntityAttributes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_attributes_using_delete_with_http_info(device_id, scope, keys, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str device_id: deviceId (required) + :param str scope: scope (required) + :param str keys: keys (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['device_id', 'scope', 'keys'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_entity_attributes_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `delete_entity_attributes_using_delete`") # noqa: E501 + # verify the required parameter 'scope' is set + if ('scope' not in params or + params['scope'] is None): + raise ValueError("Missing the required parameter `scope` when calling `delete_entity_attributes_using_delete`") # noqa: E501 + # verify the required parameter 'keys' is set + if ('keys' not in params or + params['keys'] is None): + raise ValueError("Missing the required parameter `keys` when calling `delete_entity_attributes_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + if 'scope' in params: + path_params['scope'] = params['scope'] # noqa: E501 + + query_params = [] + if 'keys' in params: + query_params.append(('keys', params['keys'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{deviceId}/{scope}{?keys}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_entity_attributes_using_delete1(self, entity_type, entity_id, scope, keys, **kwargs): # noqa: E501 + """deleteEntityAttributes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_attributes_using_delete1(entity_type, entity_id, scope, keys, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :param str keys: keys (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_entity_attributes_using_delete1_with_http_info(entity_type, entity_id, scope, keys, **kwargs) # noqa: E501 + else: + (data) = self.delete_entity_attributes_using_delete1_with_http_info(entity_type, entity_id, scope, keys, **kwargs) # noqa: E501 + return data + + def delete_entity_attributes_using_delete1_with_http_info(self, entity_type, entity_id, scope, keys, **kwargs): # noqa: E501 + """deleteEntityAttributes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_attributes_using_delete1_with_http_info(entity_type, entity_id, scope, keys, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :param str keys: keys (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id', 'scope', 'keys'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_entity_attributes_using_delete1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `delete_entity_attributes_using_delete1`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `delete_entity_attributes_using_delete1`") # noqa: E501 + # verify the required parameter 'scope' is set + if ('scope' not in params or + params['scope'] is None): + raise ValueError("Missing the required parameter `scope` when calling `delete_entity_attributes_using_delete1`") # noqa: E501 + # verify the required parameter 'keys' is set + if ('keys' not in params or + params['keys'] is None): + raise ValueError("Missing the required parameter `keys` when calling `delete_entity_attributes_using_delete1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + if 'scope' in params: + path_params['scope'] = params['scope'] # noqa: E501 + + query_params = [] + if 'keys' in params: + query_params.append(('keys', params['keys'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/{scope}{?keys}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def delete_entity_timeseries_using_delete(self, entity_type, entity_id, keys, **kwargs): # noqa: E501 + """deleteEntityTimeseries # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_timeseries_using_delete(entity_type, entity_id, keys, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str keys: keys (required) + :param bool delete_all_data_for_keys: deleteAllDataForKeys + :param int start_ts: startTs + :param int end_ts: endTs + :param bool rewrite_latest_if_deleted: rewriteLatestIfDeleted + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_entity_timeseries_using_delete_with_http_info(entity_type, entity_id, keys, **kwargs) # noqa: E501 + else: + (data) = self.delete_entity_timeseries_using_delete_with_http_info(entity_type, entity_id, keys, **kwargs) # noqa: E501 + return data + + def delete_entity_timeseries_using_delete_with_http_info(self, entity_type, entity_id, keys, **kwargs): # noqa: E501 + """deleteEntityTimeseries # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_entity_timeseries_using_delete_with_http_info(entity_type, entity_id, keys, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str keys: keys (required) + :param bool delete_all_data_for_keys: deleteAllDataForKeys + :param int start_ts: startTs + :param int end_ts: endTs + :param bool rewrite_latest_if_deleted: rewriteLatestIfDeleted + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id', 'keys', 'delete_all_data_for_keys', 'start_ts', 'end_ts', 'rewrite_latest_if_deleted'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_entity_timeseries_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `delete_entity_timeseries_using_delete`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `delete_entity_timeseries_using_delete`") # noqa: E501 + # verify the required parameter 'keys' is set + if ('keys' not in params or + params['keys'] is None): + raise ValueError("Missing the required parameter `keys` when calling `delete_entity_timeseries_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + if 'keys' in params: + query_params.append(('keys', params['keys'])) # noqa: E501 + if 'delete_all_data_for_keys' in params: + query_params.append(('deleteAllDataForKeys', params['delete_all_data_for_keys'])) # noqa: E501 + if 'start_ts' in params: + query_params.append(('startTs', params['start_ts'])) # noqa: E501 + if 'end_ts' in params: + query_params.append(('endTs', params['end_ts'])) # noqa: E501 + if 'rewrite_latest_if_deleted' in params: + query_params.append(('rewriteLatestIfDeleted', params['rewrite_latest_if_deleted'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/timeseries/delete{?keys,deleteAllDataForKeys,startTs,endTs,rewriteLatestIfDeleted}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_attribute_keys_by_scope_using_get(self, entity_type, entity_id, scope, **kwargs): # noqa: E501 + """getAttributeKeysByScope # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_attribute_keys_by_scope_using_get(entity_type, entity_id, scope, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_attribute_keys_by_scope_using_get_with_http_info(entity_type, entity_id, scope, **kwargs) # noqa: E501 + else: + (data) = self.get_attribute_keys_by_scope_using_get_with_http_info(entity_type, entity_id, scope, **kwargs) # noqa: E501 + return data + + def get_attribute_keys_by_scope_using_get_with_http_info(self, entity_type, entity_id, scope, **kwargs): # noqa: E501 + """getAttributeKeysByScope # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_attribute_keys_by_scope_using_get_with_http_info(entity_type, entity_id, scope, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id', 'scope'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_attribute_keys_by_scope_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_attribute_keys_by_scope_using_get`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_attribute_keys_by_scope_using_get`") # noqa: E501 + # verify the required parameter 'scope' is set + if ('scope' not in params or + params['scope'] is None): + raise ValueError("Missing the required parameter `scope` when calling `get_attribute_keys_by_scope_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + if 'scope' in params: + path_params['scope'] = params['scope'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/keys/attributes/{scope}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_attribute_keys_using_get(self, entity_type, entity_id, **kwargs): # noqa: E501 + """getAttributeKeys # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_attribute_keys_using_get(entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_attribute_keys_using_get_with_http_info(entity_type, entity_id, **kwargs) # noqa: E501 + else: + (data) = self.get_attribute_keys_using_get_with_http_info(entity_type, entity_id, **kwargs) # noqa: E501 + return data + + def get_attribute_keys_using_get_with_http_info(self, entity_type, entity_id, **kwargs): # noqa: E501 + """getAttributeKeys # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_attribute_keys_using_get_with_http_info(entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_attribute_keys_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_attribute_keys_using_get`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_attribute_keys_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/keys/attributes', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_attributes_by_scope_using_get(self, entity_type, entity_id, scope, **kwargs): # noqa: E501 + """getAttributesByScope # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_attributes_by_scope_using_get(entity_type, entity_id, scope, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :param str keys: keys + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_attributes_by_scope_using_get_with_http_info(entity_type, entity_id, scope, **kwargs) # noqa: E501 + else: + (data) = self.get_attributes_by_scope_using_get_with_http_info(entity_type, entity_id, scope, **kwargs) # noqa: E501 + return data + + def get_attributes_by_scope_using_get_with_http_info(self, entity_type, entity_id, scope, **kwargs): # noqa: E501 + """getAttributesByScope # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_attributes_by_scope_using_get_with_http_info(entity_type, entity_id, scope, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :param str keys: keys + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id', 'scope', 'keys'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_attributes_by_scope_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_attributes_by_scope_using_get`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_attributes_by_scope_using_get`") # noqa: E501 + # verify the required parameter 'scope' is set + if ('scope' not in params or + params['scope'] is None): + raise ValueError("Missing the required parameter `scope` when calling `get_attributes_by_scope_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + if 'scope' in params: + path_params['scope'] = params['scope'] # noqa: E501 + + query_params = [] + if 'keys' in params: + query_params.append(('keys', params['keys'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/values/attributes/{scope}{?keys}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_attributes_using_get(self, entity_type, entity_id, **kwargs): # noqa: E501 + """getAttributes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_attributes_using_get(entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str keys: keys + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_attributes_using_get_with_http_info(entity_type, entity_id, **kwargs) # noqa: E501 + else: + (data) = self.get_attributes_using_get_with_http_info(entity_type, entity_id, **kwargs) # noqa: E501 + return data + + def get_attributes_using_get_with_http_info(self, entity_type, entity_id, **kwargs): # noqa: E501 + """getAttributes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_attributes_using_get_with_http_info(entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str keys: keys + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id', 'keys'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_attributes_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_attributes_using_get`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_attributes_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + if 'keys' in params: + query_params.append(('keys', params['keys'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/values/attributes{?keys}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_latest_timeseries_using_get(self, entity_type, entity_id, **kwargs): # noqa: E501 + """getLatestTimeseries # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_latest_timeseries_using_get(entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str keys: keys + :param bool use_strict_data_types: useStrictDataTypes + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_latest_timeseries_using_get_with_http_info(entity_type, entity_id, **kwargs) # noqa: E501 + else: + (data) = self.get_latest_timeseries_using_get_with_http_info(entity_type, entity_id, **kwargs) # noqa: E501 + return data + + def get_latest_timeseries_using_get_with_http_info(self, entity_type, entity_id, **kwargs): # noqa: E501 + """getLatestTimeseries # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_latest_timeseries_using_get_with_http_info(entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str keys: keys + :param bool use_strict_data_types: useStrictDataTypes + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id', 'keys', 'use_strict_data_types'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_latest_timeseries_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_latest_timeseries_using_get`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_latest_timeseries_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + if 'keys' in params: + query_params.append(('keys', params['keys'])) # noqa: E501 + if 'use_strict_data_types' in params: + query_params.append(('useStrictDataTypes', params['use_strict_data_types'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries{?keys,useStrictDataTypes}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_timeseries_keys_using_get1(self, entity_type, entity_id, **kwargs): # noqa: E501 + """getTimeseriesKeys # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_timeseries_keys_using_get1(entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_timeseries_keys_using_get1_with_http_info(entity_type, entity_id, **kwargs) # noqa: E501 + else: + (data) = self.get_timeseries_keys_using_get1_with_http_info(entity_type, entity_id, **kwargs) # noqa: E501 + return data + + def get_timeseries_keys_using_get1_with_http_info(self, entity_type, entity_id, **kwargs): # noqa: E501 + """getTimeseriesKeys # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_timeseries_keys_using_get1_with_http_info(entity_type, entity_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_timeseries_keys_using_get1" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_timeseries_keys_using_get1`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_timeseries_keys_using_get1`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/keys/timeseries', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_timeseries_using_get(self, entity_type, entity_id, keys, start_ts, end_ts, **kwargs): # noqa: E501 + """getTimeseries # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_timeseries_using_get(entity_type, entity_id, keys, start_ts, end_ts, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str keys: keys (required) + :param str start_ts: startTs (required) + :param str end_ts: endTs (required) + :param int interval: interval + :param int limit: limit + :param str agg: agg + :param str order_by: orderBy + :param bool use_strict_data_types: useStrictDataTypes + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_timeseries_using_get_with_http_info(entity_type, entity_id, keys, start_ts, end_ts, **kwargs) # noqa: E501 + else: + (data) = self.get_timeseries_using_get_with_http_info(entity_type, entity_id, keys, start_ts, end_ts, **kwargs) # noqa: E501 + return data + + def get_timeseries_using_get_with_http_info(self, entity_type, entity_id, keys, start_ts, end_ts, **kwargs): # noqa: E501 + """getTimeseries # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_timeseries_using_get_with_http_info(entity_type, entity_id, keys, start_ts, end_ts, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str keys: keys (required) + :param str start_ts: startTs (required) + :param str end_ts: endTs (required) + :param int interval: interval + :param int limit: limit + :param str agg: agg + :param str order_by: orderBy + :param bool use_strict_data_types: useStrictDataTypes + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['entity_type', 'entity_id', 'keys', 'start_ts', 'end_ts', 'interval', 'limit', 'agg', 'order_by', 'use_strict_data_types'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_timeseries_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `get_timeseries_using_get`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `get_timeseries_using_get`") # noqa: E501 + # verify the required parameter 'keys' is set + if ('keys' not in params or + params['keys'] is None): + raise ValueError("Missing the required parameter `keys` when calling `get_timeseries_using_get`") # noqa: E501 + # verify the required parameter 'start_ts' is set + if ('start_ts' not in params or + params['start_ts'] is None): + raise ValueError("Missing the required parameter `start_ts` when calling `get_timeseries_using_get`") # noqa: E501 + # verify the required parameter 'end_ts' is set + if ('end_ts' not in params or + params['end_ts'] is None): + raise ValueError("Missing the required parameter `end_ts` when calling `get_timeseries_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + + query_params = [] + if 'interval' in params: + query_params.append(('interval', params['interval'])) # noqa: E501 + if 'limit' in params: + query_params.append(('limit', params['limit'])) # noqa: E501 + if 'agg' in params: + query_params.append(('agg', params['agg'])) # noqa: E501 + if 'order_by' in params: + query_params.append(('orderBy', params['order_by'])) # noqa: E501 + if 'use_strict_data_types' in params: + query_params.append(('useStrictDataTypes', params['use_strict_data_types'])) # noqa: E501 + if 'keys' in params: + query_params.append(('keys', params['keys'])) # noqa: E501 + if 'start_ts' in params: + query_params.append(('startTs', params['start_ts'])) # noqa: E501 + if 'end_ts' in params: + query_params.append(('endTs', params['end_ts'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/values/timeseries{?interval,limit,agg,orderBy,useStrictDataTypes,keys,startTs,endTs}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_device_attributes_using_post(self, body, device_id, scope, **kwargs): # noqa: E501 + """saveDeviceAttributes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_attributes_using_post(body, device_id, scope, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: request (required) + :param str device_id: deviceId (required) + :param str scope: scope (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_device_attributes_using_post_with_http_info(body, device_id, scope, **kwargs) # noqa: E501 + else: + (data) = self.save_device_attributes_using_post_with_http_info(body, device_id, scope, **kwargs) # noqa: E501 + return data + + def save_device_attributes_using_post_with_http_info(self, body, device_id, scope, **kwargs): # noqa: E501 + """saveDeviceAttributes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_device_attributes_using_post_with_http_info(body, device_id, scope, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: request (required) + :param str device_id: deviceId (required) + :param str scope: scope (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'device_id', 'scope'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_device_attributes_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_device_attributes_using_post`") # noqa: E501 + # verify the required parameter 'device_id' is set + if ('device_id' not in params or + params['device_id'] is None): + raise ValueError("Missing the required parameter `device_id` when calling `save_device_attributes_using_post`") # noqa: E501 + # verify the required parameter 'scope' is set + if ('scope' not in params or + params['scope'] is None): + raise ValueError("Missing the required parameter `scope` when calling `save_device_attributes_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'device_id' in params: + path_params['deviceId'] = params['device_id'] # noqa: E501 + if 'scope' in params: + path_params['scope'] = params['scope'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{deviceId}/{scope}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_entity_attributes_v1_using_post(self, body, entity_type, entity_id, scope, **kwargs): # noqa: E501 + """saveEntityAttributesV1 # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_attributes_v1_using_post(body, entity_type, entity_id, scope, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: request (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_entity_attributes_v1_using_post_with_http_info(body, entity_type, entity_id, scope, **kwargs) # noqa: E501 + else: + (data) = self.save_entity_attributes_v1_using_post_with_http_info(body, entity_type, entity_id, scope, **kwargs) # noqa: E501 + return data + + def save_entity_attributes_v1_using_post_with_http_info(self, body, entity_type, entity_id, scope, **kwargs): # noqa: E501 + """saveEntityAttributesV1 # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_attributes_v1_using_post_with_http_info(body, entity_type, entity_id, scope, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: request (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_type', 'entity_id', 'scope'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_entity_attributes_v1_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_entity_attributes_v1_using_post`") # noqa: E501 + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `save_entity_attributes_v1_using_post`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `save_entity_attributes_v1_using_post`") # noqa: E501 + # verify the required parameter 'scope' is set + if ('scope' not in params or + params['scope'] is None): + raise ValueError("Missing the required parameter `scope` when calling `save_entity_attributes_v1_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + if 'scope' in params: + path_params['scope'] = params['scope'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/{scope}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_entity_attributes_v2_using_post(self, body, entity_type, entity_id, scope, **kwargs): # noqa: E501 + """saveEntityAttributesV2 # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_attributes_v2_using_post(body, entity_type, entity_id, scope, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: request (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_entity_attributes_v2_using_post_with_http_info(body, entity_type, entity_id, scope, **kwargs) # noqa: E501 + else: + (data) = self.save_entity_attributes_v2_using_post_with_http_info(body, entity_type, entity_id, scope, **kwargs) # noqa: E501 + return data + + def save_entity_attributes_v2_using_post_with_http_info(self, body, entity_type, entity_id, scope, **kwargs): # noqa: E501 + """saveEntityAttributesV2 # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_attributes_v2_using_post_with_http_info(body, entity_type, entity_id, scope, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: request (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_type', 'entity_id', 'scope'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_entity_attributes_v2_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_entity_attributes_v2_using_post`") # noqa: E501 + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `save_entity_attributes_v2_using_post`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `save_entity_attributes_v2_using_post`") # noqa: E501 + # verify the required parameter 'scope' is set + if ('scope' not in params or + params['scope'] is None): + raise ValueError("Missing the required parameter `scope` when calling `save_entity_attributes_v2_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + if 'scope' in params: + path_params['scope'] = params['scope'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/attributes/{scope}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_entity_telemetry_using_post(self, body, entity_type, entity_id, scope, **kwargs): # noqa: E501 + """saveEntityTelemetry # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_telemetry_using_post(body, entity_type, entity_id, scope, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_entity_telemetry_using_post_with_http_info(body, entity_type, entity_id, scope, **kwargs) # noqa: E501 + else: + (data) = self.save_entity_telemetry_using_post_with_http_info(body, entity_type, entity_id, scope, **kwargs) # noqa: E501 + return data + + def save_entity_telemetry_using_post_with_http_info(self, body, entity_type, entity_id, scope, **kwargs): # noqa: E501 + """saveEntityTelemetry # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_telemetry_using_post_with_http_info(body, entity_type, entity_id, scope, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_type', 'entity_id', 'scope'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_entity_telemetry_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_entity_telemetry_using_post`") # noqa: E501 + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `save_entity_telemetry_using_post`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `save_entity_telemetry_using_post`") # noqa: E501 + # verify the required parameter 'scope' is set + if ('scope' not in params or + params['scope'] is None): + raise ValueError("Missing the required parameter `scope` when calling `save_entity_telemetry_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + if 'scope' in params: + path_params['scope'] = params['scope'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/timeseries/{scope}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_entity_telemetry_with_ttl_using_post(self, body, entity_type, entity_id, scope, ttl, **kwargs): # noqa: E501 + """saveEntityTelemetryWithTTL # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_telemetry_with_ttl_using_post(body, entity_type, entity_id, scope, ttl, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :param int ttl: ttl (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_entity_telemetry_with_ttl_using_post_with_http_info(body, entity_type, entity_id, scope, ttl, **kwargs) # noqa: E501 + else: + (data) = self.save_entity_telemetry_with_ttl_using_post_with_http_info(body, entity_type, entity_id, scope, ttl, **kwargs) # noqa: E501 + return data + + def save_entity_telemetry_with_ttl_using_post_with_http_info(self, body, entity_type, entity_id, scope, ttl, **kwargs): # noqa: E501 + """saveEntityTelemetryWithTTL # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_entity_telemetry_with_ttl_using_post_with_http_info(body, entity_type, entity_id, scope, ttl, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str body: requestBody (required) + :param str entity_type: entityType (required) + :param str entity_id: entityId (required) + :param str scope: scope (required) + :param int ttl: ttl (required) + :return: DeferredResultResponseEntity + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'entity_type', 'entity_id', 'scope', 'ttl'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_entity_telemetry_with_ttl_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_entity_telemetry_with_ttl_using_post`") # noqa: E501 + # verify the required parameter 'entity_type' is set + if ('entity_type' not in params or + params['entity_type'] is None): + raise ValueError("Missing the required parameter `entity_type` when calling `save_entity_telemetry_with_ttl_using_post`") # noqa: E501 + # verify the required parameter 'entity_id' is set + if ('entity_id' not in params or + params['entity_id'] is None): + raise ValueError("Missing the required parameter `entity_id` when calling `save_entity_telemetry_with_ttl_using_post`") # noqa: E501 + # verify the required parameter 'scope' is set + if ('scope' not in params or + params['scope'] is None): + raise ValueError("Missing the required parameter `scope` when calling `save_entity_telemetry_with_ttl_using_post`") # noqa: E501 + # verify the required parameter 'ttl' is set + if ('ttl' not in params or + params['ttl'] is None): + raise ValueError("Missing the required parameter `ttl` when calling `save_entity_telemetry_with_ttl_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'entity_type' in params: + path_params['entityType'] = params['entity_type'] # noqa: E501 + if 'entity_id' in params: + path_params['entityId'] = params['entity_id'] # noqa: E501 + if 'scope' in params: + path_params['scope'] = params['scope'] # noqa: E501 + if 'ttl' in params: + path_params['ttl'] = params['ttl'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/plugins/telemetry/{entityType}/{entityId}/timeseries/{scope}/{ttl}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='DeferredResultResponseEntity', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/tenant_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/tenant_controller_api.py new file mode 100644 index 0000000..ff74f3d --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/tenant_controller_api.py @@ -0,0 +1,631 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class TenantControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_tenant_using_delete(self, tenant_id, **kwargs): # noqa: E501 + """deleteTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_tenant_using_delete(tenant_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_tenant_using_delete_with_http_info(tenant_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_tenant_using_delete_with_http_info(tenant_id, **kwargs) # noqa: E501 + return data + + def delete_tenant_using_delete_with_http_info(self, tenant_id, **kwargs): # noqa: E501 + """deleteTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_tenant_using_delete_with_http_info(tenant_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_tenant_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `delete_tenant_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_id' in params: + path_params['tenantId'] = params['tenant_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/{tenantId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_by_id_using_get(self, tenant_id, **kwargs): # noqa: E501 + """getTenantById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_by_id_using_get(tenant_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :return: Tenant + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_by_id_using_get_with_http_info(tenant_id, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_by_id_using_get_with_http_info(tenant_id, **kwargs) # noqa: E501 + return data + + def get_tenant_by_id_using_get_with_http_info(self, tenant_id, **kwargs): # noqa: E501 + """getTenantById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_by_id_using_get_with_http_info(tenant_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :return: Tenant + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `get_tenant_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_id' in params: + path_params['tenantId'] = params['tenant_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/{tenantId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Tenant', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_info_by_id_using_get(self, tenant_id, **kwargs): # noqa: E501 + """getTenantInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_info_by_id_using_get(tenant_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :return: TenantInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_info_by_id_using_get_with_http_info(tenant_id, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_info_by_id_using_get_with_http_info(tenant_id, **kwargs) # noqa: E501 + return data + + def get_tenant_info_by_id_using_get_with_http_info(self, tenant_id, **kwargs): # noqa: E501 + """getTenantInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_info_by_id_using_get_with_http_info(tenant_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :return: TenantInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `get_tenant_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_id' in params: + path_params['tenantId'] = params['tenant_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/info/{tenantId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='TenantInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_infos_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_infos_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataTenantInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_infos_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_infos_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataTenantInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_infos_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenantInfos{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataTenantInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenants_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenants # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenants_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataTenant + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenants_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenants_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenants_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenants # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenants_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataTenant + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenants_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenants_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenants_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenants{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataTenant', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_tenant_using_post(self, body, **kwargs): # noqa: E501 + """saveTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_tenant_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Tenant body: tenant (required) + :return: Tenant + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_tenant_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_tenant_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_tenant_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveTenant # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_tenant_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param Tenant body: tenant (required) + :return: Tenant + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_tenant_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_tenant_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='Tenant', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/tenant_profile_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/tenant_profile_controller_api.py new file mode 100644 index 0000000..75dce3a --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/tenant_profile_controller_api.py @@ -0,0 +1,809 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class TenantProfileControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_tenant_profile_using_delete(self, tenant_profile_id, **kwargs): # noqa: E501 + """deleteTenantProfile # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_tenant_profile_using_delete(tenant_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_profile_id: tenantProfileId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_tenant_profile_using_delete_with_http_info(tenant_profile_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_tenant_profile_using_delete_with_http_info(tenant_profile_id, **kwargs) # noqa: E501 + return data + + def delete_tenant_profile_using_delete_with_http_info(self, tenant_profile_id, **kwargs): # noqa: E501 + """deleteTenantProfile # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_tenant_profile_using_delete_with_http_info(tenant_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_profile_id: tenantProfileId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_tenant_profile_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_profile_id' is set + if ('tenant_profile_id' not in params or + params['tenant_profile_id'] is None): + raise ValueError("Missing the required parameter `tenant_profile_id` when calling `delete_tenant_profile_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_profile_id' in params: + path_params['tenantProfileId'] = params['tenant_profile_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenantProfile/{tenantProfileId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_default_tenant_profile_info_using_get(self, **kwargs): # noqa: E501 + """getDefaultTenantProfileInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_default_tenant_profile_info_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: EntityInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_default_tenant_profile_info_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_default_tenant_profile_info_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def get_default_tenant_profile_info_using_get_with_http_info(self, **kwargs): # noqa: E501 + """getDefaultTenantProfileInfo # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_default_tenant_profile_info_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: EntityInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_default_tenant_profile_info_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenantProfileInfo/default', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_profile_by_id_using_get(self, tenant_profile_id, **kwargs): # noqa: E501 + """getTenantProfileById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_profile_by_id_using_get(tenant_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_profile_id: tenantProfileId (required) + :return: TenantProfile + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_profile_by_id_using_get_with_http_info(tenant_profile_id, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_profile_by_id_using_get_with_http_info(tenant_profile_id, **kwargs) # noqa: E501 + return data + + def get_tenant_profile_by_id_using_get_with_http_info(self, tenant_profile_id, **kwargs): # noqa: E501 + """getTenantProfileById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_profile_by_id_using_get_with_http_info(tenant_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_profile_id: tenantProfileId (required) + :return: TenantProfile + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_profile_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_profile_id' is set + if ('tenant_profile_id' not in params or + params['tenant_profile_id'] is None): + raise ValueError("Missing the required parameter `tenant_profile_id` when calling `get_tenant_profile_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_profile_id' in params: + path_params['tenantProfileId'] = params['tenant_profile_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenantProfile/{tenantProfileId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='TenantProfile', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_profile_info_by_id_using_get(self, tenant_profile_id, **kwargs): # noqa: E501 + """getTenantProfileInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_profile_info_by_id_using_get(tenant_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_profile_id: tenantProfileId (required) + :return: EntityInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_profile_info_by_id_using_get_with_http_info(tenant_profile_id, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_profile_info_by_id_using_get_with_http_info(tenant_profile_id, **kwargs) # noqa: E501 + return data + + def get_tenant_profile_info_by_id_using_get_with_http_info(self, tenant_profile_id, **kwargs): # noqa: E501 + """getTenantProfileInfoById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_profile_info_by_id_using_get_with_http_info(tenant_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_profile_id: tenantProfileId (required) + :return: EntityInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_profile_info_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_profile_id' is set + if ('tenant_profile_id' not in params or + params['tenant_profile_id'] is None): + raise ValueError("Missing the required parameter `tenant_profile_id` when calling `get_tenant_profile_info_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_profile_id' in params: + path_params['tenantProfileId'] = params['tenant_profile_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenantProfileInfo/{tenantProfileId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='EntityInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_profile_infos_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantProfileInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_profile_infos_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityInfo + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_profile_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_profile_infos_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_profile_infos_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantProfileInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_profile_infos_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataEntityInfo + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_profile_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_profile_infos_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_profile_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenantProfileInfos{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataEntityInfo', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_profiles_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getTenantProfiles # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_profiles_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataTenantProfile + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_profiles_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_profiles_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_profiles_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getTenantProfiles # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_profiles_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataTenantProfile + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_profiles_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_profiles_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_profiles_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenantProfiles{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataTenantProfile', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_tenant_profile_using_post(self, body, **kwargs): # noqa: E501 + """saveTenantProfile # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_tenant_profile_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param TenantProfile body: tenantProfile (required) + :return: TenantProfile + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_tenant_profile_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_tenant_profile_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_tenant_profile_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveTenantProfile # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_tenant_profile_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param TenantProfile body: tenantProfile (required) + :return: TenantProfile + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_tenant_profile_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_tenant_profile_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenantProfile', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='TenantProfile', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_default_tenant_profile_using_post(self, tenant_profile_id, **kwargs): # noqa: E501 + """setDefaultTenantProfile # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_default_tenant_profile_using_post(tenant_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_profile_id: tenantProfileId (required) + :return: TenantProfile + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_default_tenant_profile_using_post_with_http_info(tenant_profile_id, **kwargs) # noqa: E501 + else: + (data) = self.set_default_tenant_profile_using_post_with_http_info(tenant_profile_id, **kwargs) # noqa: E501 + return data + + def set_default_tenant_profile_using_post_with_http_info(self, tenant_profile_id, **kwargs): # noqa: E501 + """setDefaultTenantProfile # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_default_tenant_profile_using_post_with_http_info(tenant_profile_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_profile_id: tenantProfileId (required) + :return: TenantProfile + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_profile_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_default_tenant_profile_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_profile_id' is set + if ('tenant_profile_id' not in params or + params['tenant_profile_id'] is None): + raise ValueError("Missing the required parameter `tenant_profile_id` when calling `set_default_tenant_profile_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_profile_id' in params: + path_params['tenantProfileId'] = params['tenant_profile_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenantProfile/{tenantProfileId}/default', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='TenantProfile', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/user_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/user_controller_api.py new file mode 100644 index 0000000..c746998 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/user_controller_api.py @@ -0,0 +1,1124 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class UserControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_user_using_delete(self, user_id, **kwargs): # noqa: E501 + """deleteUser # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_user_using_delete(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_user_using_delete_with_http_info(user_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_user_using_delete_with_http_info(user_id, **kwargs) # noqa: E501 + return data + + def delete_user_using_delete_with_http_info(self, user_id, **kwargs): # noqa: E501 + """deleteUser # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_user_using_delete_with_http_info(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_user_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_id' is set + if ('user_id' not in params or + params['user_id'] is None): + raise ValueError("Missing the required parameter `user_id` when calling `delete_user_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'user_id' in params: + path_params['userId'] = params['user_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/{userId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_activation_link_using_get(self, user_id, **kwargs): # noqa: E501 + """getActivationLink # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_activation_link_using_get(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_activation_link_using_get_with_http_info(user_id, **kwargs) # noqa: E501 + else: + (data) = self.get_activation_link_using_get_with_http_info(user_id, **kwargs) # noqa: E501 + return data + + def get_activation_link_using_get_with_http_info(self, user_id, **kwargs): # noqa: E501 + """getActivationLink # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_activation_link_using_get_with_http_info(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_activation_link_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_id' is set + if ('user_id' not in params or + params['user_id'] is None): + raise ValueError("Missing the required parameter `user_id` when calling `get_activation_link_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'user_id' in params: + path_params['userId'] = params['user_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['text/plain']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/{userId}/activationLink', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_customer_users_using_get(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerUsers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_users_using_get(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_customer_users_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_customer_users_using_get_with_http_info(customer_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_customer_users_using_get_with_http_info(self, customer_id, page_size, page, **kwargs): # noqa: E501 + """getCustomerUsers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_customer_users_using_get_with_http_info(customer_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str customer_id: customerId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['customer_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_customer_users_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'customer_id' is set + if ('customer_id' not in params or + params['customer_id'] is None): + raise ValueError("Missing the required parameter `customer_id` when calling `get_customer_users_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_customer_users_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_customer_users_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'customer_id' in params: + path_params['customerId'] = params['customer_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/customer/{customerId}/users{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataUser', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_tenant_admins_using_get(self, tenant_id, page_size, page, **kwargs): # noqa: E501 + """getTenantAdmins # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_admins_using_get(tenant_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_tenant_admins_using_get_with_http_info(tenant_id, page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_tenant_admins_using_get_with_http_info(tenant_id, page_size, page, **kwargs) # noqa: E501 + return data + + def get_tenant_admins_using_get_with_http_info(self, tenant_id, page_size, page, **kwargs): # noqa: E501 + """getTenantAdmins # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_tenant_admins_using_get_with_http_info(tenant_id, page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str tenant_id: tenantId (required) + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['tenant_id', 'page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_tenant_admins_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'tenant_id' is set + if ('tenant_id' not in params or + params['tenant_id'] is None): + raise ValueError("Missing the required parameter `tenant_id` when calling `get_tenant_admins_using_get`") # noqa: E501 + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_tenant_admins_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_tenant_admins_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'tenant_id' in params: + path_params['tenantId'] = params['tenant_id'] # noqa: E501 + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/tenant/{tenantId}/users{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataUser', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_by_id_using_get(self, user_id, **kwargs): # noqa: E501 + """getUserById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_by_id_using_get(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: User + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_by_id_using_get_with_http_info(user_id, **kwargs) # noqa: E501 + else: + (data) = self.get_user_by_id_using_get_with_http_info(user_id, **kwargs) # noqa: E501 + return data + + def get_user_by_id_using_get_with_http_info(self, user_id, **kwargs): # noqa: E501 + """getUserById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_by_id_using_get_with_http_info(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: User + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_id' is set + if ('user_id' not in params or + params['user_id'] is None): + raise ValueError("Missing the required parameter `user_id` when calling `get_user_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'user_id' in params: + path_params['userId'] = params['user_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/{userId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='User', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_user_token_using_get(self, user_id, **kwargs): # noqa: E501 + """getUserToken # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_token_using_get(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_user_token_using_get_with_http_info(user_id, **kwargs) # noqa: E501 + else: + (data) = self.get_user_token_using_get_with_http_info(user_id, **kwargs) # noqa: E501 + return data + + def get_user_token_using_get_with_http_info(self, user_id, **kwargs): # noqa: E501 + """getUserToken # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_user_token_using_get_with_http_info(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :return: str + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_user_token_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_id' is set + if ('user_id' not in params or + params['user_id'] is None): + raise ValueError("Missing the required parameter `user_id` when calling `get_user_token_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'user_id' in params: + path_params['userId'] = params['user_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/{userId}/token', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='str', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_users_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getUsers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_users_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_users_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_users_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_users_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getUsers # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_users_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataUser + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_users_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_users_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_users_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/users{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataUser', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def is_user_token_access_enabled_using_get(self, **kwargs): # noqa: E501 + """isUserTokenAccessEnabled # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_user_token_access_enabled_using_get(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.is_user_token_access_enabled_using_get_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.is_user_token_access_enabled_using_get_with_http_info(**kwargs) # noqa: E501 + return data + + def is_user_token_access_enabled_using_get_with_http_info(self, **kwargs): # noqa: E501 + """isUserTokenAccessEnabled # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.is_user_token_access_enabled_using_get_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: bool + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method is_user_token_access_enabled_using_get" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/tokenAccessEnabled', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='bool', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_user_using_post(self, body, **kwargs): # noqa: E501 + """saveUser # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_user_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param User body: user (required) + :param bool send_activation_mail: sendActivationMail + :return: User + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_user_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_user_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_user_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveUser # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_user_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param User body: user (required) + :param bool send_activation_mail: sendActivationMail + :return: User + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body', 'send_activation_mail'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_user_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_user_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'send_activation_mail' in params: + query_params.append(('sendActivationMail', params['send_activation_mail'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user{?sendActivationMail}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='User', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def send_activation_email_using_post(self, email, **kwargs): # noqa: E501 + """sendActivationEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_activation_email_using_post(email, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email: email (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.send_activation_email_using_post_with_http_info(email, **kwargs) # noqa: E501 + else: + (data) = self.send_activation_email_using_post_with_http_info(email, **kwargs) # noqa: E501 + return data + + def send_activation_email_using_post_with_http_info(self, email, **kwargs): # noqa: E501 + """sendActivationEmail # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.send_activation_email_using_post_with_http_info(email, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str email: email (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['email'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method send_activation_email_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'email' is set + if ('email' not in params or + params['email'] is None): + raise ValueError("Missing the required parameter `email` when calling `send_activation_email_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'email' in params: + query_params.append(('email', params['email'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/sendActivationMail{?email}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def set_user_credentials_enabled_using_post(self, user_id, **kwargs): # noqa: E501 + """setUserCredentialsEnabled # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_user_credentials_enabled_using_post(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :param bool user_credentials_enabled: userCredentialsEnabled + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.set_user_credentials_enabled_using_post_with_http_info(user_id, **kwargs) # noqa: E501 + else: + (data) = self.set_user_credentials_enabled_using_post_with_http_info(user_id, **kwargs) # noqa: E501 + return data + + def set_user_credentials_enabled_using_post_with_http_info(self, user_id, **kwargs): # noqa: E501 + """setUserCredentialsEnabled # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.set_user_credentials_enabled_using_post_with_http_info(user_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str user_id: userId (required) + :param bool user_credentials_enabled: userCredentialsEnabled + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['user_id', 'user_credentials_enabled'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method set_user_credentials_enabled_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'user_id' is set + if ('user_id' not in params or + params['user_id'] is None): + raise ValueError("Missing the required parameter `user_id` when calling `set_user_credentials_enabled_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'user_id' in params: + path_params['userId'] = params['user_id'] # noqa: E501 + + query_params = [] + if 'user_credentials_enabled' in params: + query_params.append(('userCredentialsEnabled', params['user_credentials_enabled'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/user/{userId}/userCredentialsEnabled{?userCredentialsEnabled}', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/widget_type_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/widget_type_controller_api.py new file mode 100644 index 0000000..9637301 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/widget_type_controller_api.py @@ -0,0 +1,724 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class WidgetTypeControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_widget_type_using_delete(self, widget_type_id, **kwargs): # noqa: E501 + """deleteWidgetType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_widget_type_using_delete(widget_type_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str widget_type_id: widgetTypeId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_widget_type_using_delete_with_http_info(widget_type_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_widget_type_using_delete_with_http_info(widget_type_id, **kwargs) # noqa: E501 + return data + + def delete_widget_type_using_delete_with_http_info(self, widget_type_id, **kwargs): # noqa: E501 + """deleteWidgetType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_widget_type_using_delete_with_http_info(widget_type_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str widget_type_id: widgetTypeId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['widget_type_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_widget_type_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'widget_type_id' is set + if ('widget_type_id' not in params or + params['widget_type_id'] is None): + raise ValueError("Missing the required parameter `widget_type_id` when calling `delete_widget_type_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'widget_type_id' in params: + path_params['widgetTypeId'] = params['widget_type_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/widgetType/{widgetTypeId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_bundle_widget_types_details_using_get(self, is_system, bundle_alias, **kwargs): # noqa: E501 + """getBundleWidgetTypesDetails # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_bundle_widget_types_details_using_get(is_system, bundle_alias, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str is_system: isSystem (required) + :param str bundle_alias: bundleAlias (required) + :return: list[WidgetTypeDetails] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_bundle_widget_types_details_using_get_with_http_info(is_system, bundle_alias, **kwargs) # noqa: E501 + else: + (data) = self.get_bundle_widget_types_details_using_get_with_http_info(is_system, bundle_alias, **kwargs) # noqa: E501 + return data + + def get_bundle_widget_types_details_using_get_with_http_info(self, is_system, bundle_alias, **kwargs): # noqa: E501 + """getBundleWidgetTypesDetails # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_bundle_widget_types_details_using_get_with_http_info(is_system, bundle_alias, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str is_system: isSystem (required) + :param str bundle_alias: bundleAlias (required) + :return: list[WidgetTypeDetails] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['is_system', 'bundle_alias'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_bundle_widget_types_details_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'is_system' is set + if ('is_system' not in params or + params['is_system'] is None): + raise ValueError("Missing the required parameter `is_system` when calling `get_bundle_widget_types_details_using_get`") # noqa: E501 + # verify the required parameter 'bundle_alias' is set + if ('bundle_alias' not in params or + params['bundle_alias'] is None): + raise ValueError("Missing the required parameter `bundle_alias` when calling `get_bundle_widget_types_details_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'is_system' in params: + query_params.append(('isSystem', params['is_system'])) # noqa: E501 + if 'bundle_alias' in params: + query_params.append(('bundleAlias', params['bundle_alias'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/widgetTypesDetails{?isSystem,bundleAlias}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[WidgetTypeDetails]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_bundle_widget_types_infos_using_get(self, is_system, bundle_alias, **kwargs): # noqa: E501 + """getBundleWidgetTypesInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_bundle_widget_types_infos_using_get(is_system, bundle_alias, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str is_system: isSystem (required) + :param str bundle_alias: bundleAlias (required) + :return: list[WidgetTypeInfo] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_bundle_widget_types_infos_using_get_with_http_info(is_system, bundle_alias, **kwargs) # noqa: E501 + else: + (data) = self.get_bundle_widget_types_infos_using_get_with_http_info(is_system, bundle_alias, **kwargs) # noqa: E501 + return data + + def get_bundle_widget_types_infos_using_get_with_http_info(self, is_system, bundle_alias, **kwargs): # noqa: E501 + """getBundleWidgetTypesInfos # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_bundle_widget_types_infos_using_get_with_http_info(is_system, bundle_alias, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str is_system: isSystem (required) + :param str bundle_alias: bundleAlias (required) + :return: list[WidgetTypeInfo] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['is_system', 'bundle_alias'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_bundle_widget_types_infos_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'is_system' is set + if ('is_system' not in params or + params['is_system'] is None): + raise ValueError("Missing the required parameter `is_system` when calling `get_bundle_widget_types_infos_using_get`") # noqa: E501 + # verify the required parameter 'bundle_alias' is set + if ('bundle_alias' not in params or + params['bundle_alias'] is None): + raise ValueError("Missing the required parameter `bundle_alias` when calling `get_bundle_widget_types_infos_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'is_system' in params: + query_params.append(('isSystem', params['is_system'])) # noqa: E501 + if 'bundle_alias' in params: + query_params.append(('bundleAlias', params['bundle_alias'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/widgetTypesInfos{?isSystem,bundleAlias}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[WidgetTypeInfo]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_bundle_widget_types_using_get(self, is_system, bundle_alias, **kwargs): # noqa: E501 + """getBundleWidgetTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_bundle_widget_types_using_get(is_system, bundle_alias, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str is_system: isSystem (required) + :param str bundle_alias: bundleAlias (required) + :return: list[WidgetType] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_bundle_widget_types_using_get_with_http_info(is_system, bundle_alias, **kwargs) # noqa: E501 + else: + (data) = self.get_bundle_widget_types_using_get_with_http_info(is_system, bundle_alias, **kwargs) # noqa: E501 + return data + + def get_bundle_widget_types_using_get_with_http_info(self, is_system, bundle_alias, **kwargs): # noqa: E501 + """getBundleWidgetTypes # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_bundle_widget_types_using_get_with_http_info(is_system, bundle_alias, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str is_system: isSystem (required) + :param str bundle_alias: bundleAlias (required) + :return: list[WidgetType] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['is_system', 'bundle_alias'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_bundle_widget_types_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'is_system' is set + if ('is_system' not in params or + params['is_system'] is None): + raise ValueError("Missing the required parameter `is_system` when calling `get_bundle_widget_types_using_get`") # noqa: E501 + # verify the required parameter 'bundle_alias' is set + if ('bundle_alias' not in params or + params['bundle_alias'] is None): + raise ValueError("Missing the required parameter `bundle_alias` when calling `get_bundle_widget_types_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'is_system' in params: + query_params.append(('isSystem', params['is_system'])) # noqa: E501 + if 'bundle_alias' in params: + query_params.append(('bundleAlias', params['bundle_alias'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/widgetTypes{?isSystem,bundleAlias}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[WidgetType]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_widget_type_by_id_using_get(self, widget_type_id, **kwargs): # noqa: E501 + """getWidgetTypeById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_widget_type_by_id_using_get(widget_type_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str widget_type_id: widgetTypeId (required) + :return: WidgetTypeDetails + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_widget_type_by_id_using_get_with_http_info(widget_type_id, **kwargs) # noqa: E501 + else: + (data) = self.get_widget_type_by_id_using_get_with_http_info(widget_type_id, **kwargs) # noqa: E501 + return data + + def get_widget_type_by_id_using_get_with_http_info(self, widget_type_id, **kwargs): # noqa: E501 + """getWidgetTypeById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_widget_type_by_id_using_get_with_http_info(widget_type_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str widget_type_id: widgetTypeId (required) + :return: WidgetTypeDetails + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['widget_type_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_widget_type_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'widget_type_id' is set + if ('widget_type_id' not in params or + params['widget_type_id'] is None): + raise ValueError("Missing the required parameter `widget_type_id` when calling `get_widget_type_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'widget_type_id' in params: + path_params['widgetTypeId'] = params['widget_type_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/widgetType/{widgetTypeId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='WidgetTypeDetails', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_widget_type_using_get(self, is_system, bundle_alias, alias, **kwargs): # noqa: E501 + """getWidgetType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_widget_type_using_get(is_system, bundle_alias, alias, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str is_system: isSystem (required) + :param str bundle_alias: bundleAlias (required) + :param str alias: alias (required) + :return: WidgetType + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_widget_type_using_get_with_http_info(is_system, bundle_alias, alias, **kwargs) # noqa: E501 + else: + (data) = self.get_widget_type_using_get_with_http_info(is_system, bundle_alias, alias, **kwargs) # noqa: E501 + return data + + def get_widget_type_using_get_with_http_info(self, is_system, bundle_alias, alias, **kwargs): # noqa: E501 + """getWidgetType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_widget_type_using_get_with_http_info(is_system, bundle_alias, alias, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str is_system: isSystem (required) + :param str bundle_alias: bundleAlias (required) + :param str alias: alias (required) + :return: WidgetType + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['is_system', 'bundle_alias', 'alias'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_widget_type_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'is_system' is set + if ('is_system' not in params or + params['is_system'] is None): + raise ValueError("Missing the required parameter `is_system` when calling `get_widget_type_using_get`") # noqa: E501 + # verify the required parameter 'bundle_alias' is set + if ('bundle_alias' not in params or + params['bundle_alias'] is None): + raise ValueError("Missing the required parameter `bundle_alias` when calling `get_widget_type_using_get`") # noqa: E501 + # verify the required parameter 'alias' is set + if ('alias' not in params or + params['alias'] is None): + raise ValueError("Missing the required parameter `alias` when calling `get_widget_type_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'is_system' in params: + query_params.append(('isSystem', params['is_system'])) # noqa: E501 + if 'bundle_alias' in params: + query_params.append(('bundleAlias', params['bundle_alias'])) # noqa: E501 + if 'alias' in params: + query_params.append(('alias', params['alias'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/widgetType{?isSystem,bundleAlias,alias}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='WidgetType', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_widget_type_using_post(self, body, **kwargs): # noqa: E501 + """saveWidgetType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_widget_type_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param WidgetTypeDetails body: widgetTypeDetails (required) + :return: WidgetTypeDetails + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_widget_type_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_widget_type_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_widget_type_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveWidgetType # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_widget_type_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param WidgetTypeDetails body: widgetTypeDetails (required) + :return: WidgetTypeDetails + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_widget_type_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_widget_type_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/widgetType', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='WidgetTypeDetails', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/widgets_bundle_controller_api.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/widgets_bundle_controller_api.py new file mode 100644 index 0000000..32cf0c4 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_ce/widgets_bundle_controller_api.py @@ -0,0 +1,510 @@ +# coding: utf-8 + +""" + ThingsBoard REST API + + For instructions how to authorize requests please visit REST API documentation page. # noqa: E501 + + OpenAPI spec version: 2.0 + Contact: info@thingsboard.io + Generated by: https://github.com/swagger-api/swagger-codegen.git +""" + +from __future__ import absolute_import + +import re # noqa: F401 + +# python 2 and python 3 compatibility library +import six + +from tb_rest_client.api_client import ApiClient + + +class WidgetsBundleControllerApi(object): + """NOTE: This class is auto generated by the swagger code generator program. + + Do not edit the class manually. + Ref: https://github.com/swagger-api/swagger-codegen + """ + + def __init__(self, api_client=None): + if api_client is None: + api_client = ApiClient() + self.api_client = api_client + + def delete_widgets_bundle_using_delete(self, widgets_bundle_id, **kwargs): # noqa: E501 + """deleteWidgetsBundle # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_widgets_bundle_using_delete(widgets_bundle_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str widgets_bundle_id: widgetsBundleId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.delete_widgets_bundle_using_delete_with_http_info(widgets_bundle_id, **kwargs) # noqa: E501 + else: + (data) = self.delete_widgets_bundle_using_delete_with_http_info(widgets_bundle_id, **kwargs) # noqa: E501 + return data + + def delete_widgets_bundle_using_delete_with_http_info(self, widgets_bundle_id, **kwargs): # noqa: E501 + """deleteWidgetsBundle # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.delete_widgets_bundle_using_delete_with_http_info(widgets_bundle_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str widgets_bundle_id: widgetsBundleId (required) + :return: None + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['widgets_bundle_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method delete_widgets_bundle_using_delete" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'widgets_bundle_id' is set + if ('widgets_bundle_id' not in params or + params['widgets_bundle_id'] is None): + raise ValueError("Missing the required parameter `widgets_bundle_id` when calling `delete_widgets_bundle_using_delete`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'widgets_bundle_id' in params: + path_params['widgetsBundleId'] = params['widgets_bundle_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/widgetsBundle/{widgetsBundleId}', 'DELETE', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type=None, # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_widgets_bundle_by_id_using_get(self, widgets_bundle_id, **kwargs): # noqa: E501 + """getWidgetsBundleById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_widgets_bundle_by_id_using_get(widgets_bundle_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str widgets_bundle_id: widgetsBundleId (required) + :return: WidgetsBundle + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_widgets_bundle_by_id_using_get_with_http_info(widgets_bundle_id, **kwargs) # noqa: E501 + else: + (data) = self.get_widgets_bundle_by_id_using_get_with_http_info(widgets_bundle_id, **kwargs) # noqa: E501 + return data + + def get_widgets_bundle_by_id_using_get_with_http_info(self, widgets_bundle_id, **kwargs): # noqa: E501 + """getWidgetsBundleById # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_widgets_bundle_by_id_using_get_with_http_info(widgets_bundle_id, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str widgets_bundle_id: widgetsBundleId (required) + :return: WidgetsBundle + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['widgets_bundle_id'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_widgets_bundle_by_id_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'widgets_bundle_id' is set + if ('widgets_bundle_id' not in params or + params['widgets_bundle_id'] is None): + raise ValueError("Missing the required parameter `widgets_bundle_id` when calling `get_widgets_bundle_by_id_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + if 'widgets_bundle_id' in params: + path_params['widgetsBundleId'] = params['widgets_bundle_id'] # noqa: E501 + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/widgetsBundle/{widgetsBundleId}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='WidgetsBundle', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_widgets_bundles_using_get(self, page_size, page, **kwargs): # noqa: E501 + """getWidgetsBundles # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_widgets_bundles_using_get(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataWidgetsBundle + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_widgets_bundles_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + else: + (data) = self.get_widgets_bundles_using_get_with_http_info(page_size, page, **kwargs) # noqa: E501 + return data + + def get_widgets_bundles_using_get_with_http_info(self, page_size, page, **kwargs): # noqa: E501 + """getWidgetsBundles # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_widgets_bundles_using_get_with_http_info(page_size, page, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param str page_size: pageSize (required) + :param str page: page (required) + :param str text_search: textSearch + :param str sort_property: sortProperty + :param str sort_order: sortOrder + :return: PageDataWidgetsBundle + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['page_size', 'page', 'text_search', 'sort_property', 'sort_order'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_widgets_bundles_using_get" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'page_size' is set + if ('page_size' not in params or + params['page_size'] is None): + raise ValueError("Missing the required parameter `page_size` when calling `get_widgets_bundles_using_get`") # noqa: E501 + # verify the required parameter 'page' is set + if ('page' not in params or + params['page'] is None): + raise ValueError("Missing the required parameter `page` when calling `get_widgets_bundles_using_get`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + if 'text_search' in params: + query_params.append(('textSearch', params['text_search'])) # noqa: E501 + if 'sort_property' in params: + query_params.append(('sortProperty', params['sort_property'])) # noqa: E501 + if 'sort_order' in params: + query_params.append(('sortOrder', params['sort_order'])) # noqa: E501 + if 'page_size' in params: + query_params.append(('pageSize', params['page_size'])) # noqa: E501 + if 'page' in params: + query_params.append(('page', params['page'])) # noqa: E501 + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/widgetsBundles{?textSearch,sortProperty,sortOrder,pageSize,page}', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='PageDataWidgetsBundle', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def get_widgets_bundles_using_get1(self, **kwargs): # noqa: E501 + """getWidgetsBundles # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_widgets_bundles_using_get1(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[WidgetsBundle] + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.get_widgets_bundles_using_get1_with_http_info(**kwargs) # noqa: E501 + else: + (data) = self.get_widgets_bundles_using_get1_with_http_info(**kwargs) # noqa: E501 + return data + + def get_widgets_bundles_using_get1_with_http_info(self, **kwargs): # noqa: E501 + """getWidgetsBundles # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.get_widgets_bundles_using_get1_with_http_info(async_req=True) + >>> result = thread.get() + + :param async_req bool + :return: list[WidgetsBundle] + If the method is called asynchronously, + returns the request thread. + """ + + all_params = [] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method get_widgets_bundles_using_get1" % key + ) + params[key] = val + del params['kwargs'] + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/widgetsBundles', 'GET', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='list[WidgetsBundle]', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) + + def save_widgets_bundle_using_post(self, body, **kwargs): # noqa: E501 + """saveWidgetsBundle # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_widgets_bundle_using_post(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param WidgetsBundle body: widgetsBundle (required) + :return: WidgetsBundle + If the method is called asynchronously, + returns the request thread. + """ + kwargs['_return_http_data_only'] = True + if kwargs.get('async_req'): + return self.save_widgets_bundle_using_post_with_http_info(body, **kwargs) # noqa: E501 + else: + (data) = self.save_widgets_bundle_using_post_with_http_info(body, **kwargs) # noqa: E501 + return data + + def save_widgets_bundle_using_post_with_http_info(self, body, **kwargs): # noqa: E501 + """saveWidgetsBundle # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + >>> thread = api.save_widgets_bundle_using_post_with_http_info(body, async_req=True) + >>> result = thread.get() + + :param async_req bool + :param WidgetsBundle body: widgetsBundle (required) + :return: WidgetsBundle + If the method is called asynchronously, + returns the request thread. + """ + + all_params = ['body'] # noqa: E501 + all_params.append('async_req') + all_params.append('_return_http_data_only') + all_params.append('_preload_content') + all_params.append('_request_timeout') + + params = locals() + for key, val in six.iteritems(params['kwargs']): + if key not in all_params: + raise TypeError( + "Got an unexpected keyword argument '%s'" + " to method save_widgets_bundle_using_post" % key + ) + params[key] = val + del params['kwargs'] + # verify the required parameter 'body' is set + if ('body' not in params or + params['body'] is None): + raise ValueError("Missing the required parameter `body` when calling `save_widgets_bundle_using_post`") # noqa: E501 + + collection_formats = {} + + path_params = {} + + query_params = [] + + header_params = {} + + form_params = [] + local_var_files = {} + + body_params = None + if 'body' in params: + body_params = params['body'] + # HTTP header `Accept` + header_params['Accept'] = self.api_client.select_header_accept( + ['*/*']) # noqa: E501 + + # HTTP header `Content-Type` + header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 + ['application/json']) # noqa: E501 + + # Authentication setting + auth_settings = ['X-Authorization'] # noqa: E501 + + return self.api_client.call_api( + '/api/widgetsBundle', 'POST', + path_params, + query_params, + header_params, + body=body_params, + post_params=form_params, + files=local_var_files, + response_type='WidgetsBundle', # noqa: E501 + auth_settings=auth_settings, + async_req=params.get('async_req'), + _return_http_data_only=params.get('_return_http_data_only'), + _preload_content=params.get('_preload_content', True), + _request_timeout=params.get('_request_timeout'), + collection_formats=collection_formats) diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__init__.py b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__init__.py new file mode 100644 index 0000000..36b2220 --- /dev/null +++ b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__init__.py @@ -0,0 +1,52 @@ +from .self_registration_controller_api import SelfRegistrationControllerApi +from .http_integration_controller_api import HttpIntegrationControllerApi +from .asset_controller_api import AssetControllerApi +from .asset_controller_api import AssetControllerApi +from .device_group_ota_package_controller_api import DeviceGroupOtaPackageControllerApi +from .edge_controller_api import EdgeControllerApi +from .edge_controller_api import EdgeControllerApi +from .ocean_connect_integration_controller_api import OceanConnectIntegrationControllerApi +from .user_permissions_controller_api import UserPermissionsControllerApi +from .owner_controller_api import OwnerControllerApi +from .rpc_v_2_controller_api import RpcV2ControllerApi +from .rpc_v_2_controller_api import RpcV2ControllerApi +from .edge_event_controller_api import EdgeEventControllerApi +from .edge_event_controller_api import EdgeEventControllerApi +from .customer_controller_api import CustomerControllerApi +from .customer_controller_api import CustomerControllerApi +from .user_controller_api import UserControllerApi +from .user_controller_api import UserControllerApi +from .group_permission_controller_api import GroupPermissionControllerApi +from .device_controller_api import DeviceControllerApi +from .device_controller_api import DeviceControllerApi +from .converter_controller_api import ConverterControllerApi +from .entity_view_controller_api import EntityViewControllerApi +from .entity_view_controller_api import EntityViewControllerApi +from .rule_engine_controller_api import RuleEngineControllerApi +from .admin_controller_api import AdminControllerApi +from .admin_controller_api import AdminControllerApi +from .t_mobile_iot_cdp_integration_controller_api import TMobileIotCdpIntegrationControllerApi +from .sign_up_controller_api import SignUpControllerApi +from .sign_up_controller_api import SignUpControllerApi +from .trail_controller_api import TrailControllerApi +from .thing_park_integration_controller_api import ThingParkIntegrationControllerApi +from .sig_fox_integration_controller_api import SigFoxIntegrationControllerApi +from .scheduler_event_controller_api import SchedulerEventControllerApi +from .report_controller_api import ReportControllerApi +from .dashboard_controller_api import DashboardControllerApi +from .dashboard_controller_api import DashboardControllerApi +from .integration_controller_api import IntegrationControllerApi +from .custom_menu_controller_api import CustomMenuControllerApi +from .lwm_2m_controller_api import Lwm2mControllerApi +from .lwm_2m_controller_api import Lwm2mControllerApi +from .custom_translation_controller_api import CustomTranslationControllerApi +from .role_controller_api import RoleControllerApi +from .blob_entity_controller_api import BlobEntityControllerApi +from .loriot_integration_controller_api import LoriotIntegrationControllerApi +from .tenant_controller_api import TenantControllerApi +from .tenant_controller_api import TenantControllerApi +from .chirp_stack_integration_controller_api import ChirpStackIntegrationControllerApi +from .white_labeling_controller_api import WhiteLabelingControllerApi +from .ota_package_controller_api import OtaPackageControllerApi +from .ota_package_controller_api import OtaPackageControllerApi +from .entity_group_controller_api import EntityGroupControllerApi diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/__init__.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..987a49cdc17b500ea3bb6243b471ad0da1e3c4a5 GIT binary patch literal 3285 zcmcIm*-{%v6qVRF0osLDBoIpojDa|g;}r`T6XQSucB=ZNYcy)43AbmaW(HyYCa?K` z{ET1okjgLQDScZakRCE`5hZbS&*|>leQzI)9g9sx#OwICUs`|6L?XZAm;0|F@#VF6 zd%i&JNIMD<9wpHz;vpE~!(>?EVHn|~WHf+BV2qEGaTyVD&q;L@g=epz)4u2m;^n6$MP1|bNmhajC z%-wTLAt=7{edo~fS?6IsvFCZrS4Y+MSAsj7Ih9SklX8%)PE zEN1v23l~3n%spW)H$6|}?WvO|j;}4|2BN2q@o7hmW-yUvk6D3@q#IYBZ}Z?paa>-V zrzkgkmz2sU`^Tb&Ga}Gqt{X=sGToZe3ZU!n@KmTC2 zOkjt$-)M)GGO;DrN^R8)iPIUJ&q*i4y<6HZ4h@x<2bXi;M$bGO3 z$y4UoZlF4ueckJ}Y~5|EY2`xJ%Jysefmv7Tu*A_d-{ESs+#ewJZ+Yn_q9?q9y7$b28vnQj)g9BtA2w3y3df-4on@%1VN|7b^bM67L29)v&4YH( zJ*e&L)am<&svbpkl8L*kGGoZB+2|xlp_PPXG>-DhmAKK=xpNeC(g{?hY_t`XnnWt& zItK009hJm~0kR;|Wau#}KaG6W7#NMpiU$a>Ntv5++A(A*{ZqP2TOB`(s`TJUl^N!c z%ZXs$ebk}zNasby!h&c|c#tZHOMxq{EoIV)R6zm-DIM)drIJW(_>@aiqT)7CqaE5e zDIAgUggH^s7s^)BawYL2W`as(kgEIWQ=*gH%dk$!qP8a1pcnS%FkudbW$)It=!2DA zKvCM2-lb-hM=saCH87PfAe|4nMMWv-cMavj%hVZ4a&frkbcd^48M*3UusF0^UsH7z z)Fs99K;VWgB9m_khZCij4WbmJDwhE1b72QrLtWaJZl^B4gxrdOmPbAGys(LuQCzx4 z=c6#NK6S!6YVskLvVwxbU`PF{rR-}}D1ME&YvP~$`0Hm49|b(kG7Vc3jc#7pZinq^ z%<6fX>^e{WL}_5QH0Q?e+ScyY_9M*`iEa*@O$b}USv_$Fz!a-%!cFll>`0?x)22`9 emUHuE;yJhRSMnu3zIk2oF%y}I{{MgT(Z2!rfhLFm literal 0 HcmV?d00001 diff --git a/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/admin_controller_api.cpython-310.pyc b/AWS Lambda Layer/python/lib/python3.9/site-packages/tb_rest_client/api/api_pe/__pycache__/admin_controller_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d0ce5025640816d947a76271c4a5acda1702f3b GIT binary patch literal 14974 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