├── .dockerignore ├── constants.py ├── .streamlit └── config.toml ├── test_firebase_utils.py ├── render_auth.py ├── .github └── workflows │ ├── black.yml │ └── eb-deploy.yml ├── .env.sample ├── Pipfile ├── .pre-commit-config.yaml ├── debugger.py ├── config.yaml ├── content └── overview.md ├── test_load_conversations.py ├── test_firestore.py ├── .devcontainer ├── Dockerfile └── devcontainer.json ├── render_my_conversations.py ├── test_decoding_firestore_creds.py ├── render_body.py ├── custom_js.py ├── Dockerfile ├── firebase_utils.py ├── README.md ├── render_conversation.py ├── firestore_utils.py ├── render_chat_form.py ├── openai_mock.py ├── pages └── share.py ├── chat_utils.py ├── .gitignore ├── chat.py ├── google_utils.py ├── utils.py ├── sample-stream.json └── Pipfile.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | .venv 2 | .env* -------------------------------------------------------------------------------- /constants.py: -------------------------------------------------------------------------------- 1 | DEFAULT_CONVERSATION = {} 2 | -------------------------------------------------------------------------------- /.streamlit/config.toml: -------------------------------------------------------------------------------- 1 | [browser] 2 | gatherUsageStats = false 3 | -------------------------------------------------------------------------------- /test_firebase_utils.py: -------------------------------------------------------------------------------- 1 | from firebase_utils import list_users_by_page, firebase_init 2 | from dotenv import load_dotenv 3 | 4 | load_dotenv() 5 | 6 | firebase_init() 7 | 8 | list_users_by_page() 9 | -------------------------------------------------------------------------------- /render_auth.py: -------------------------------------------------------------------------------- 1 | from google_utils import auth_with_google, update_authentication_status 2 | from firebase_utils import firebase_init 3 | 4 | 5 | def render_auth(st): 6 | firebase_init() 7 | auth_with_google(st) 8 | update_authentication_status(st) 9 | -------------------------------------------------------------------------------- /.github/workflows/black.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | - main 8 | 9 | jobs: 10 | lint: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v3 14 | - uses: psf/black@stable 15 | -------------------------------------------------------------------------------- /.env.sample: -------------------------------------------------------------------------------- 1 | OPENAI_ORG_ID="" 2 | OPENAI_API_KEY="" 3 | GOOGLE_CLIENT_ID="" 4 | GOOGLE_CLIENT_SECRET="" 5 | REDIRECT_URI="http://localhost:8501/component/streamlit_oauth.authorize_button/index.html" 6 | FIRESTORE_CREDENTIALS_BASE64="" 7 | PROMPTLAYER_API_KEY="" # optional, but get your own dev key if needed -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | openai = "==0.27.5" 8 | streamlit = "==1.22.0" 9 | python-dotenv = "*" 10 | watchdog = "*" 11 | google-cloud-firestore = "*" 12 | firebase-admin = "*" 13 | streamlit-oauth = "*" 14 | promptlayer = "*" 15 | 16 | [dev-packages] 17 | pre-commit = "*" 18 | 19 | [requires] 20 | python_version = "3.10" 21 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/psf/black 3 | rev: 23.3.0 4 | hooks: 5 | - id: black 6 | # It is recommended to specify the latest version of Python 7 | # supported by your project here, or alternatively use 8 | # pre-commit's default_language_version, see 9 | # https://pre-commit.com/#top_level-default_language_version 10 | language_version: python3.10 -------------------------------------------------------------------------------- /debugger.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | 3 | 4 | def debugger(): 5 | with st.expander("Debug"): 6 | col1, col2 = st.columns(2) 7 | col1.write("Session State (w/o conversation, user_info))") 8 | # exclude conversation from session_state 9 | session_state = { 10 | k: v for k, v in st.session_state.items() if k != "conversation" 11 | } 12 | col1.write(session_state) 13 | col2.write("Conversation") 14 | col2.write(st.session_state.get("conversation")) 15 | -------------------------------------------------------------------------------- /config.yaml: -------------------------------------------------------------------------------- 1 | credentials: 2 | usernames: 3 | harley: 4 | email: harley@coderpush.com 5 | name: Harley Trung 6 | password: $2b$12$JS2LBHI.O2ghkgy7Lf7mZ.ekBD9YCiooWZnvFqcSHFnj.2t1oY75S 7 | long: 8 | email: long@coderpush.com 9 | name: Long Vu 10 | password: $2b$12$JS2LBHI.O2ghkgy7Lf7mZ.ekBD9YCiooWZnvFqcSHFnj.2t1oY75S 11 | cookie: 12 | expiry_days: 30 13 | key: BzdOJIZYhsdEakQXkXec3dCSRe2uI5cD # Must be string 14 | name: 74rALcazxy 15 | preauthorized: 16 | emails: 17 | - harley@coderpush.com -------------------------------------------------------------------------------- /content/overview.md: -------------------------------------------------------------------------------- 1 | ## Welcome! 2 | 3 | Thanks for trying this out. It's super alpha, but each person can log in via Google and resume their past chat with GPT. 4 | 5 | Limitations: 6 | 7 | - **you have to log in again if you reload** the page (streamlit's limitation; work around later) 8 | - openai api response can be slow, with rate limit errors sometimes (chat.openai.com has advantage) 9 | - can only delete all chat history, not individual conversation yet (contribution welcome!) 10 | 11 | How to help: 12 | 13 | - report bugs to Hien or myself. 14 | - run your code locally https://github.com/CoderPush/chatlit by asking me for .env file -------------------------------------------------------------------------------- /test_load_conversations.py: -------------------------------------------------------------------------------- 1 | from firestore_utils import firestore_save, get_firestore_db 2 | 3 | db = get_firestore_db() 4 | 5 | collection_ref = db.collection("conversations") 6 | 7 | cid = "ZwpCs09yX28DdSlLjLLX" 8 | conversation = collection_ref.document(cid).get().to_dict() 9 | # display conversation 10 | print(conversation["messages"]) 11 | 12 | # Usage: python test_load_conversations.py 13 | # ❯ python test_load_conversations.py 14 | # [{'role': 'system', 'content': 'You are a helpful assistant.'}, {'role': 'user', 'content': 'tell me a joke'}, {'role': 'assistant', 'content': 'Why did the tomato turn red?\nBecause it saw the salad dressing!'}] 15 | -------------------------------------------------------------------------------- /test_firestore.py: -------------------------------------------------------------------------------- 1 | # Usage: python test_firestore.py 2 | from firestore_utils import firestore_save 3 | from dotenv import load_dotenv 4 | 5 | load_dotenv() 6 | 7 | messages = [ 8 | {"role": "system", "content": "You are a helpful assistant."}, 9 | {"role": "user", "content": "Hello"}, 10 | {"role": "assistant", "content": "Hi, how can I help you?"}, 11 | {"role": "user", "content": "I need help with my taxes."}, 12 | ] 13 | usage = { 14 | "model_name": "GPT-3.5", 15 | "total_tokens": 100, 16 | "prompt_tokens": 10, 17 | "completion_tokens": 90, 18 | } 19 | cid = None 20 | conversation = { 21 | "messages": messages, 22 | "usage": usage, 23 | } 24 | 25 | result = firestore_save(cid, conversation) 26 | -------------------------------------------------------------------------------- /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | # See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.209.6/containers/python-3/.devcontainer/base.Dockerfile 2 | 3 | # [Choice] Python version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.10, 3.9, 3.8, 3.7, 3.6, 3-bullseye, 3.10-bullseye, 3.9-bullseye, 3.8-bullseye, 3.7-bullseye, 3.6-bullseye, 3-buster, 3.10-buster, 3.9-buster, 3.8-buster, 3.7-buster, 3.6-buster 4 | ARG VARIANT="3.10-bullseye" 5 | FROM mcr.microsoft.com/vscode/devcontainers/python:0-${VARIANT} 6 | 7 | ENV PATH="/home/vscode/.local/bin:${PATH}" 8 | 9 | RUN pip install pipenv 10 | 11 | # [Optional] Uncomment this section to install additional OS packages. 12 | # RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ 13 | # && apt-get -y install --no-install-recommends -------------------------------------------------------------------------------- /render_my_conversations.py: -------------------------------------------------------------------------------- 1 | from firestore_utils import get_firestore_db 2 | from utils import button_row, get_cid_from_session, get_oauth_uid 3 | 4 | 5 | def render_my_conversations(st, sidebar): 6 | db = get_firestore_db() 7 | uid = get_oauth_uid(st) 8 | cid_from_params = get_cid_from_session(st) 9 | model_name = st.session_state["model"] 10 | if uid: 11 | # load only conversations that belong to the user, newest first 12 | conversations = ( 13 | db.collection("conversations") 14 | .where("uid", "==", uid) 15 | .where("model_name", "==", model_name) 16 | .order_by("created", direction="DESCENDING") 17 | .stream() 18 | ) 19 | else: 20 | conversations = [] 21 | 22 | for c in conversations: 23 | selected = c.id == cid_from_params 24 | conversation = c.to_dict() 25 | button_row(st, c.id, conversation, selected=selected) 26 | -------------------------------------------------------------------------------- /test_decoding_firestore_creds.py: -------------------------------------------------------------------------------- 1 | import os 2 | import base64 3 | from dotenv import load_dotenv 4 | 5 | load_dotenv() 6 | 7 | # function to encode json to base64 string 8 | 9 | 10 | def encode_firestore_credentials(): 11 | # open json file 12 | with open("creds/chatlit-dev-firebase.json") as f: 13 | data = f.read() 14 | # encode json to base64 string 15 | encoded = base64.b64encode(data.encode("utf-8")) 16 | print(encoded) 17 | 18 | 19 | def decode_firestore_credentials(): 20 | raw = os.environ["FIRESTORE_CREDENTIALS_BASE64"] 21 | # decode base64 string to json 22 | firebase_credentials = base64.b64decode(raw).decode("utf-8") 23 | print(firebase_credentials) 24 | 25 | 26 | if __name__ == "__main__": 27 | print("Test encoding:") 28 | encode_firestore_credentials() 29 | 30 | print("========================================") 31 | print("Test decoding from ENV variable:") 32 | decode_firestore_credentials() 33 | -------------------------------------------------------------------------------- /render_body.py: -------------------------------------------------------------------------------- 1 | from render_conversation import render_conversation 2 | from render_chat_form import render_chat_stream 3 | from utils import get_expander_text 4 | 5 | 6 | def load_conversation_from_session_state(st): 7 | return st.session_state.get("conversation", {}) 8 | 9 | 10 | def render_body(st): 11 | if st.session_state.get("user_info"): 12 | messages_holder = st.expander( 13 | get_expander_text(st), expanded=st.session_state["conversation_expanded"] 14 | ) 15 | with messages_holder: 16 | # load_conversation from session_state 17 | conversation = load_conversation_from_session_state(st) 18 | if conversation: 19 | render_conversation(st, conversation) 20 | 21 | with st.container(): 22 | render_chat_stream(st) 23 | else: 24 | # load homepage.md into a string 25 | with open("content/overview.md", "r") as f: 26 | overview = f.read() 27 | st.write(overview) 28 | -------------------------------------------------------------------------------- /.github/workflows/eb-deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Backend to Elastic Beanstalk 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Checkout code 14 | uses: actions/checkout@master 15 | 16 | - name: Zip the application 17 | run: | 18 | zip -r chatlit.zip * .[^.]* -x "*.git*" -x "__pycache__" 19 | 20 | - name: Deploy to Elastic Beanstalk 21 | uses: einaregilsson/beanstalk-deploy@v21 22 | with: 23 | aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }} 24 | aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 25 | application_name: ${{ secrets.BEANSTALK_APP_NAME }} 26 | environment_name: ${{ secrets.BEANSTALK_ENV_NAME }} 27 | version_label: ${{ github.sha }} 28 | region: ${{ secrets.AWS_REGION }} 29 | deployment_package: chatlit.zip 30 | existing_bucket_name: ${{ secrets.BEANSTALK_BUCKET_NAME }} 31 | use_existing_version_if_available: true 32 | -------------------------------------------------------------------------------- /custom_js.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | import streamlit.components.v1 as components 3 | import time 4 | 5 | 6 | def delayed_execution(delay, function): 7 | time.sleep(delay) 8 | function() 9 | 10 | 11 | def render_copy_shared_convo_link(shared_cid=None): 12 | model = st.session_state.get("model", "gpt-3.5-turbo") 13 | 14 | if shared_cid is not None: 15 | js = f""" 16 | 28 | """ 29 | 30 | components.html(js, width=0, height=0) 31 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.10-slim as base 2 | 3 | # Setup env 4 | ENV LANG C.UTF-8 5 | ENV LC_ALL C.UTF-8 6 | ENV PYTHONDONTWRITEBYTECODE 1 7 | ENV PYTHONFAULTHANDLER 1 8 | 9 | FROM base AS python-deps 10 | 11 | RUN apt-get update && apt-get install -y \ 12 | build-essential \ 13 | curl \ 14 | software-properties-common \ 15 | git \ 16 | && rm -rf /var/lib/apt/lists/* 17 | 18 | RUN pip install pipenv 19 | 20 | # Install python dependencies in /.venv 21 | COPY Pipfile . 22 | COPY Pipfile.lock . 23 | RUN PIPENV_VENV_IN_PROJECT=1 pipenv install --deploy 24 | 25 | FROM base AS runtime 26 | 27 | # Copy virtual env from python-deps stage 28 | COPY --from=python-deps /.venv /.venv 29 | ENV PATH="/.venv/bin:$PATH" 30 | 31 | # Create and switch to a new user 32 | RUN useradd --create-home appuser 33 | WORKDIR /home/appuser 34 | USER appuser 35 | 36 | 37 | # Install application into container 38 | COPY . . 39 | 40 | # disables lag in stdout/stderr output 41 | ENV PYTHONUNBUFFERED 1 42 | ENV PYTHONDONTWRITEBYTECODE 1 43 | 44 | EXPOSE 80 45 | 46 | HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health 47 | 48 | ENTRYPOINT ["streamlit", "run", "chat.py", "--server.port=80", "--server.address=0.0.0.0", "–-server.enableCORS=false"] -------------------------------------------------------------------------------- /firebase_utils.py: -------------------------------------------------------------------------------- 1 | from firebase_admin import auth, credentials, initialize_app 2 | from firestore_utils import decode_firestore_credentials 3 | import streamlit as st 4 | 5 | 6 | @st.cache_resource 7 | def firebase_init(): 8 | json_content = decode_firestore_credentials() 9 | cred = credentials.Certificate(json_content) 10 | initialize_app(cred) 11 | 12 | 13 | def create_user_in_firebase_if_not_exists(user_info): 14 | try: 15 | # Try to get the user by email 16 | user = auth.get_user_by_email(user_info["email"]) 17 | print("User already exists: ", user.uid) 18 | except auth.UserNotFoundError: 19 | # If user does not exist, create a new one 20 | user = auth.create_user( 21 | uid=user_info["id"], 22 | email=user_info["email"], 23 | email_verified=user_info["verified_email"], 24 | display_name=user_info["name"], 25 | photo_url=user_info["picture"], 26 | ) 27 | print("User created: ", user.uid) 28 | 29 | 30 | def list_users(): 31 | auth.list_users().iterate_all() 32 | 33 | 34 | def list_users_by_page(): 35 | page = auth.list_users() 36 | while page: 37 | for user in page.users: 38 | print("User: ", user.uid) 39 | # Get next batch of users. 40 | page = page.get_next_page() 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Chatlit 2 | 3 | Chatlit is an open-source web application powered by Streamlit, designed to provide an extensible chat interface with individual chat histories and multiple chat models. This project is licensed under the MIT license. 4 | 5 | ## Getting Started 6 | 7 | These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. 8 | 9 | ### Prerequisites 10 | 11 | - Python 3.10 12 | - Google account for authentication 13 | - pipenv 14 | 15 | ### Setup 16 | 17 | 1. Clone the repository: 18 | 19 | ```bash 20 | git clone https://github.com/CoderPush/chatlit.git 21 | cd chatlit 22 | ``` 23 | 24 | 2. Install dependencies: 25 | 26 | ```bash 27 | pipenv install 28 | ``` 29 | 30 | ### Running Locally 31 | 32 | Before running the application in the development mode, you need to set up your environment variables. We use a `.env` file, which is gitignored. In production, these are loaded from Stream secrets. 33 | 34 | Run the app: 35 | 36 | streamlit run chat.py 37 | 38 | ## Contributing 39 | 40 | We use a trunk-based development workflow, meaning new work is created on a new branch, which is then created as a pull request against the "main" branch. Merging the PR to main will auto deploy the app. 41 | 42 | ## License 43 | 44 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. 45 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.209.6/containers/python-3 3 | { 4 | "name": "Python 3", 5 | "build": { 6 | "dockerfile": "Dockerfile", 7 | "context": "..", 8 | "args": { 9 | // Update 'VARIANT' to pick a Python version: 3, 3.10, 3.9, 3.8, 3.7, 3.6 10 | // Append -bullseye or -buster to pin to an OS version. 11 | // Use -bullseye variants on local on arm64/Apple Silicon. 12 | "VARIANT": "3.10", 13 | } 14 | }, 15 | // Set *default* container specific settings.json values on container create. 16 | "settings": { 17 | "python.defaultInterpreterPath": "/usr/local/bin/python", 18 | }, 19 | // Add the IDs of extensions you want installed when the container is created. 20 | "extensions": [ 21 | "ms-python.python", 22 | "ms-python.vscode-pylance" 23 | ], 24 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 25 | "forwardPorts": [ 26 | 8501 27 | ], 28 | // Use 'postCreateCommand' to run commands after the container is created. 29 | // Install NPM dependencies. 30 | "postCreateCommand": "pipenv install", 31 | "postStartCommand": "streamlit run chat.py", 32 | // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. 33 | "remoteUser": "vscode", 34 | "features": { 35 | "git": "latest", 36 | "github-cli": "latest" 37 | } 38 | } -------------------------------------------------------------------------------- /render_conversation.py: -------------------------------------------------------------------------------- 1 | from firestore_utils import get_firestore_db 2 | 3 | 4 | def render_message(st, message, profile_url, role): 5 | css = """ 6 | 11 | """ 12 | 13 | st.markdown(css, unsafe_allow_html=True) 14 | 15 | user_message = "" 16 | if role == "user": 17 | user_message = f""" 18 |
19 |

{message}

20 |
Profile Picture
21 |
22 | """ 23 | elif role == "assistant": 24 | user_message = f""" 25 |
26 |
🤖
27 |
{message}
28 |
29 | """ 30 | 31 | st.markdown(user_message, unsafe_allow_html=True) 32 | 33 | 34 | def render_messages(st, messages): 35 | user_picture_url = st.session_state.get("user_info", {}).get("picture", None) 36 | 37 | for _, message in enumerate(messages): 38 | message_content = message.get("content") 39 | if message.get("role") == "user": 40 | render_message(st, message_content, user_picture_url, "user") 41 | elif message.get("role") == "assistant": 42 | render_message(st, message_content, "", "assistant") 43 | elif message.get("role") == "system": 44 | # don't render system messages 45 | pass 46 | 47 | 48 | def render_conversation(st, conversation): 49 | messages = conversation["messages"] 50 | render_messages(st, messages) 51 | -------------------------------------------------------------------------------- /firestore_utils.py: -------------------------------------------------------------------------------- 1 | from google.cloud import firestore 2 | import os 3 | import base64 4 | import json 5 | import streamlit as st 6 | 7 | 8 | @st.cache_resource 9 | def get_firestore_db(): 10 | json_content = decode_firestore_credentials() 11 | db = firestore.Client.from_service_account_info(json_content) 12 | return db 13 | 14 | 15 | def load_conversation_by_id(cid): 16 | if cid and len(cid) > 0: 17 | db = get_firestore_db() 18 | return db.collection("conversations").document(cid).get() 19 | 20 | 21 | def firestore_save(cid, conversation_record): 22 | db = get_firestore_db() 23 | if cid: 24 | # get conversation fromm cid 25 | conversation = db.collection("conversations").document(cid).get() 26 | # update conversation with the new messages and usage value 27 | conversation.reference.update(conversation_record) 28 | return conversation 29 | else: 30 | collection_ref = db.collection("conversations") 31 | # q: what does collection_ref.add(conversation_record) return and how do i get the id from the new record? 32 | # set created in conversation_record 33 | conversation_record["created"] = firestore.SERVER_TIMESTAMP 34 | _, record = collection_ref.add(conversation_record) 35 | return record 36 | 37 | 38 | def decode_firestore_credentials(): 39 | raw = os.environ["FIRESTORE_CREDENTIALS_BASE64"] 40 | # decode base64 string to json 41 | firebase_credentials = base64.b64decode(raw).decode("utf-8") 42 | json_data = json.loads(firebase_credentials) 43 | return json_data 44 | 45 | 46 | def clear_user_history(uid): 47 | # delete all conversations that belong to the user 48 | db = get_firestore_db() 49 | conversations = db.collection("conversations").where("uid", "==", uid).stream() 50 | for c in conversations: 51 | c.reference.delete() 52 | 53 | 54 | def delete_convo(convo_id): 55 | db = get_firestore_db() 56 | document_ref = db.collection("conversations").document(convo_id) 57 | document_ref.delete() 58 | print(f"Deleted document with ID: {convo_id}") 59 | 60 | 61 | def edit_convo(convo_id, new_label): 62 | try: 63 | db = get_firestore_db() 64 | document_ref = db.collection("conversations").document(convo_id) 65 | document_ref.update({"title": new_label}) 66 | print(f"Updated document with ID: {convo_id}") 67 | except firestore.NotFound as e: 68 | print(f"Document with ID {convo_id} not found") 69 | -------------------------------------------------------------------------------- /render_chat_form.py: -------------------------------------------------------------------------------- 1 | from firestore_utils import firestore_save 2 | from utils import get_oauth_uid 3 | from chat_utils import generate_conversation_title, generate_stream 4 | 5 | 6 | def save_messages_to_firestore(st, usage=None): 7 | messages = st.session_state["messages"] 8 | model = st.session_state["model"] 9 | 10 | if len(messages) > 0: 11 | conversation = st.session_state.get("conversation", {}) 12 | title = conversation.get("title", None) 13 | if title is None: 14 | title = generate_conversation_title(messages) 15 | # get google uid from user_info object 16 | uid = get_oauth_uid(st) 17 | 18 | conversation_record = { 19 | "messages": messages, 20 | "usage": usage, 21 | "model_name": model, 22 | "title": title, 23 | "uid": uid, 24 | } 25 | 26 | cid = st.session_state.get("cid", None) 27 | 28 | # store conversations to firestore 29 | new_conversation = firestore_save(cid, conversation_record) 30 | print(new_conversation) 31 | return new_conversation 32 | 33 | 34 | def render_chat_stream(st): 35 | if "chat_form_user_input" not in st.session_state: 36 | st.session_state["chat_form_user_input"] = "" 37 | 38 | def get_input(): 39 | st.session_state["chat_form_user_input"] = st.session_state.text_area_stream 40 | st.session_state.text_area_stream = "" 41 | 42 | with st.container(): 43 | # generate response stream here 44 | stream_holder = st.empty() 45 | 46 | st.text_area( 47 | f"You:", 48 | key="text_area_stream", 49 | label_visibility="collapsed", 50 | on_change=get_input, 51 | ) 52 | submit_holder = st.empty() 53 | generating = st.session_state.get("generating", False) 54 | if generating: 55 | submit_button = submit_holder.button(label="Generating...", disabled=True) 56 | else: 57 | submit_button = submit_holder.button(label="Send") 58 | 59 | if submit_button or st.session_state["chat_form_user_input"]: 60 | st.session_state["generating"] = True 61 | submit_holder.empty() 62 | st.session_state["conversation_expanded"] = False 63 | generate_stream(st, stream_holder, st.session_state["chat_form_user_input"]) 64 | new_conversation = save_messages_to_firestore(st) 65 | st.session_state["chat_form_user_input"] = "" 66 | st.session_state["generating"] = False 67 | if new_conversation is not None: 68 | st.session_state["cid"] = new_conversation.id 69 | st.experimental_rerun() 70 | -------------------------------------------------------------------------------- /openai_mock.py: -------------------------------------------------------------------------------- 1 | # mock_openai.py 2 | 3 | import time 4 | from collections import namedtuple 5 | import random 6 | 7 | 8 | def start_choice(): 9 | return {"delta": {"role": "assistant"}, "finish_reason": None, "index": 0} 10 | 11 | 12 | def stop_choice(): 13 | return {"delta": {}, "finish_reason": "stop", "index": 0} 14 | 15 | 16 | class MockChatCompletion: 17 | @classmethod 18 | def create(cls, model, messages, stream=False, pl_tags=None): 19 | response_template = { 20 | "id": "mocked_openai_id", 21 | "object": "chat.completion", 22 | "created": int(time.time()), 23 | "model": model, 24 | "usage": { 25 | "prompt_tokens": len(messages), 26 | "completion_tokens": len(messages), 27 | }, 28 | "choices": [ 29 | {"delta": {"role": "assistant", "content": "This is a mock response."}} 30 | ], 31 | } 32 | 33 | if stream: 34 | mock_response = "You're seeing a mock response so that we can avoid paying API fees under development." 35 | 36 | # generate mock_responses to be an array of words from full_response 37 | mock_chunks = mock_response.split() 38 | 39 | response_template["choices"][0] = start_choice() 40 | yield response_template 41 | 42 | for content in mock_chunks: 43 | time.sleep(0.4) # simulate delay 44 | response_template["choices"][0]["delta"]["content"] = ( 45 | content + " " 46 | ) # Set 'delta' content 47 | yield response_template 48 | 49 | response_template["choices"][0] = stop_choice() 50 | yield response_template 51 | else: 52 | time.sleep(0.5) # simulate delay 53 | yield namedtuple("Struct", response_template.keys())( 54 | *response_template.values() 55 | ) 56 | 57 | 58 | class MockCompletion: 59 | @classmethod 60 | def create(cls, engine, prompt, temperature, max_tokens): 61 | # generate a mock title with a random number 62 | mock_title = f"Convo {random.randint(0, 1000)}" 63 | response = { 64 | "id": "mocked_openai_id", 65 | "object": "text.completion", 66 | "created": int(time.time()), 67 | "model": engine, 68 | "usage": { 69 | "prompt_tokens": len(prompt.split()), 70 | "completion_tokens": max_tokens, 71 | }, 72 | "choices": [{"text": mock_title}], 73 | } 74 | return response 75 | 76 | 77 | class MockOpenAI: 78 | ChatCompletion = MockChatCompletion 79 | Completion = MockCompletion 80 | -------------------------------------------------------------------------------- /pages/share.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | from firestore_utils import load_conversation_by_id 3 | from render_conversation import render_conversation 4 | from render_auth import render_auth 5 | from render_chat_form import render_chat_stream, save_messages_to_firestore 6 | from google_utils import decode_token_from_params 7 | from render_body import render_body 8 | from debugger import debugger 9 | import time 10 | 11 | 12 | def is_authenticated(st): 13 | if "token" not in st.session_state: 14 | return False 15 | else: 16 | token = st.session_state["token"] 17 | expires_at = token.get("expires_at") 18 | if expires_at and expires_at < time.time(): 19 | return False 20 | else: 21 | return True 22 | 23 | 24 | def controller(): 25 | st.session_state["conversation_expanded"] = True 26 | 27 | token_dict = decode_token_from_params(st, "token") 28 | if token_dict: 29 | st.session_state["token"] = token_dict 30 | 31 | 32 | def show_readonly_shared_conversation(st, cid, model): 33 | # get the conversation from the cid 34 | conversation = load_conversation_by_id(cid).to_dict() 35 | st.title(conversation["title"]) 36 | # show messages for the conversation 37 | render_conversation(st, conversation) 38 | 39 | continue_convo_holder = st.empty() 40 | continue_convo_btn = continue_convo_holder.button("Continue the chat") 41 | if continue_convo_btn: 42 | if not is_authenticated(st): 43 | continue_convo_holder.write( 44 | "You must be logged in to continue the conversation" 45 | ) 46 | else: 47 | continue_convo_holder.empty() 48 | with st.container(): 49 | # Save conversation to firestore 50 | st.session_state["messages"] = conversation["messages"] 51 | st.session_state["model"] = model 52 | st.session_state["conversation"] = conversation 53 | # save the state 54 | st.session_state[f"edit_shared_conversation_{cid}"] = True 55 | # rerun the app 56 | st.experimental_rerun() 57 | 58 | 59 | def main(): 60 | st.set_page_config( 61 | page_title="PushGPT Share", page_icon=":robot_face:", layout="wide" 62 | ) 63 | controller() 64 | try: 65 | # get query cid from the queryStr 66 | queryStr = st.experimental_get_query_params() 67 | cid = queryStr["cid"][0] 68 | model = queryStr["model"][0] 69 | 70 | # render auth 71 | render_auth(st) 72 | 73 | # render body 74 | isEdit = st.session_state.get(f"edit_shared_conversation_{cid}", False) 75 | if not isEdit: 76 | show_readonly_shared_conversation(st, cid, model) 77 | else: 78 | render_body(st) 79 | 80 | except Exception as e: 81 | st.title("No conversation found") 82 | 83 | 84 | if __name__ == "__main__": 85 | main() 86 | debugger() 87 | -------------------------------------------------------------------------------- /chat_utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | import promptlayer 3 | import openai as openai_orig 4 | import openai_mock 5 | 6 | env = os.environ.get("APP_DEV") 7 | 8 | if env == "dev": 9 | openai = openai_mock.MockOpenAI 10 | else: 11 | promptlayer.api_key = os.environ.get("PROMPTLAYER_API_KEY") 12 | if promptlayer.api_key is None: 13 | openai = openai_orig 14 | else: 15 | openai = promptlayer.openai 16 | openai.api_key = os.environ.get("OPENAI_API_KEY") 17 | 18 | 19 | def extract_messages(st): 20 | default = [ 21 | { 22 | "role": "system", 23 | "content": "You are a helpful assistant. Please use concise language to save bandwidth and token usage. Avoid 'AI language model' disclaimer whenever possible.", 24 | } 25 | ] 26 | 27 | conversation = st.session_state.get("conversation", {}) 28 | messages = conversation.get("messages", default) 29 | 30 | return messages 31 | 32 | 33 | # see sample-stream.json to know how to parse it 34 | def generate_stream(st, holder, user_input): 35 | model = st.session_state["model"] 36 | messages = extract_messages(st) 37 | messages.append({"role": "user", "content": user_input}) 38 | 39 | print("openai.ChatCompletion.create with", openai, model, messages) 40 | completion = openai.ChatCompletion.create( 41 | model=model, messages=messages, stream=True 42 | ) 43 | 44 | # first chunk should be 45 | # { 46 | # "choices": [ 47 | # { 48 | # "delta": { 49 | # "role": "assistant" 50 | # }, 51 | # "finish_reason": null, 52 | # "index": 0 53 | # } 54 | # ], 55 | # "created": 1684389483, 56 | # "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 57 | # "model": "gpt-3.5-turbo-0301", 58 | # "object": "chat.completion.chunk" 59 | # } 60 | 61 | # middle chunks are content: 62 | with holder.container(): 63 | content = "" 64 | for chunk in completion: 65 | delta = chunk["choices"][0].get("delta", {}) 66 | if "content" in delta: 67 | content += delta["content"] 68 | holder.info(content, icon="🤖") 69 | 70 | # last chunk should be 71 | # { 72 | # "choices": [ 73 | # { 74 | # "delta": {}, 75 | # "finish_reason": "stop", 76 | # "index": 0 77 | # } 78 | # ], 79 | # "created": 1684389483, 80 | # "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 81 | # "model": "gpt-3.5-turbo-0301", 82 | # "object": "chat.completion.chunk" 83 | # } 84 | 85 | messages.append({"role": "assistant", "content": content}) 86 | st.session_state["messages"] = messages 87 | 88 | # No usage info in stream mode yet 89 | # https://community.openai.com/t/usage-info-in-api-responses/18862 90 | 91 | return messages 92 | 93 | 94 | def generate_conversation_title(messages): 95 | user_messages = [m["content"] for m in messages if m["role"] == "user"] 96 | conversation = " ".join(user_messages) 97 | 98 | # Generate a prompt for the model 99 | prompt = f""" 100 | Based on the following user chat messages ---: 101 | 102 | --- 103 | {conversation} 104 | --- 105 | 106 | A title in 5 words or less, without quotes, for this conversation is: """ 107 | 108 | # Use the OpenAI API to generate a response 109 | response = openai.Completion.create( 110 | engine="text-davinci-002", prompt=prompt, temperature=0.3, max_tokens=60 111 | ) 112 | 113 | # Extract the generated title 114 | title = response["choices"][0]["text"].strip() 115 | # remove surrounding quotes 116 | title = title.replace('"', "") 117 | 118 | return title 119 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/python 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=python 3 | 4 | ### Python ### 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | *$py.class 9 | 10 | # C extensions 11 | *.so 12 | 13 | # Distribution / packaging 14 | .Python 15 | build/ 16 | develop-eggs/ 17 | dist/ 18 | downloads/ 19 | eggs/ 20 | .eggs/ 21 | lib/ 22 | lib64/ 23 | parts/ 24 | sdist/ 25 | var/ 26 | wheels/ 27 | share/python-wheels/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | MANIFEST 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .nox/ 47 | .coverage 48 | .coverage.* 49 | .cache 50 | nosetests.xml 51 | coverage.xml 52 | *.cover 53 | *.py,cover 54 | .hypothesis/ 55 | .pytest_cache/ 56 | cover/ 57 | 58 | # Translations 59 | *.mo 60 | *.pot 61 | 62 | # Django stuff: 63 | *.log 64 | local_settings.py 65 | db.sqlite3 66 | db.sqlite3-journal 67 | 68 | # Flask stuff: 69 | instance/ 70 | .webassets-cache 71 | 72 | # Scrapy stuff: 73 | .scrapy 74 | 75 | # Sphinx documentation 76 | docs/_build/ 77 | 78 | # PyBuilder 79 | .pybuilder/ 80 | target/ 81 | 82 | # Jupyter Notebook 83 | .ipynb_checkpoints 84 | 85 | # IPython 86 | profile_default/ 87 | ipython_config.py 88 | 89 | # pyenv 90 | # For a library or package, you might want to ignore these files since the code is 91 | # intended to run in multiple environments; otherwise, check them in: 92 | # .python-version 93 | 94 | # pipenv 95 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 96 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 97 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 98 | # install all needed dependencies. 99 | #Pipfile.lock 100 | 101 | # poetry 102 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 103 | # This is especially recommended for binary packages to ensure reproducibility, and is more 104 | # commonly ignored for libraries. 105 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 106 | #poetry.lock 107 | 108 | # pdm 109 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 110 | #pdm.lock 111 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 112 | # in version control. 113 | # https://pdm.fming.dev/#use-with-ide 114 | .pdm.toml 115 | 116 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 117 | __pypackages__/ 118 | 119 | # Celery stuff 120 | celerybeat-schedule 121 | celerybeat.pid 122 | 123 | # SageMath parsed files 124 | *.sage.py 125 | 126 | # Environments 127 | .env 128 | .env.production 129 | .venv 130 | env/ 131 | venv/ 132 | ENV/ 133 | env.bak/ 134 | venv.bak/ 135 | 136 | # Spyder project settings 137 | .spyderproject 138 | .spyproject 139 | 140 | # Rope project settings 141 | .ropeproject 142 | 143 | # mkdocs documentation 144 | /site 145 | 146 | # mypy 147 | .mypy_cache/ 148 | .dmypy.json 149 | dmypy.json 150 | 151 | # Pyre type checker 152 | .pyre/ 153 | 154 | # pytype static type analyzer 155 | .pytype/ 156 | 157 | # Cython debug symbols 158 | cython_debug/ 159 | 160 | # PyCharm 161 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 162 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 163 | # and can be added to the global gitignore or merged into this file. For a more nuclear 164 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 165 | .idea/ 166 | 167 | ### Python Patch ### 168 | # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration 169 | poetry.toml 170 | 171 | # ruff 172 | .ruff_cache/ 173 | 174 | # LSP config files 175 | pyrightconfig.json 176 | 177 | # End of https://www.toptal.com/developers/gitignore/api/python 178 | 179 | .python-version 180 | # Elastic Beanstalk Files 181 | .elasticbeanstalk/* 182 | !.elasticbeanstalk/*.cfg.yml 183 | !.elasticbeanstalk/*.global.yml 184 | 185 | creds/* -------------------------------------------------------------------------------- /chat.py: -------------------------------------------------------------------------------- 1 | from firestore_utils import load_conversation_by_id 2 | from utils import get_key_from_params 3 | from render_auth import render_auth 4 | from render_body import render_body 5 | from render_my_conversations import render_my_conversations 6 | import streamlit as st 7 | from firestore_utils import clear_user_history 8 | from utils import get_cid_from_session 9 | from debugger import debugger 10 | from google_utils import sign_out_google, decode_token_from_params 11 | from constants import DEFAULT_CONVERSATION 12 | 13 | from dotenv import load_dotenv 14 | 15 | load_dotenv() 16 | 17 | 18 | DEFAULT_MODEL = "gpt-3.5-turbo" 19 | 20 | 21 | def get_model_from_conversation(conversation: dict) -> str: 22 | """Extracts the model name from a conversation dictionary""" 23 | return conversation.get("model_name") 24 | 25 | 26 | def load_and_store_conversation(st, cid: str): 27 | """Loads a conversation and stores it in the session state""" 28 | conversation = load_conversation_by_id(cid).to_dict() 29 | if conversation: 30 | st.session_state["conversation"] = conversation 31 | st.session_state["model"] = get_model_from_conversation(conversation) 32 | 33 | 34 | def controller(): 35 | st.session_state["conversation_expanded"] = True 36 | 37 | token_dict = decode_token_from_params(st, "token") 38 | if token_dict: 39 | st.session_state["token"] = token_dict 40 | 41 | # TODO: save params to session if applicable 42 | 43 | # set model in session if specified in params 44 | model_from_param = get_key_from_params(st, "model") 45 | if model_from_param: 46 | st.session_state["model"] = model_from_param 47 | 48 | # load conversation if cid is specified in session 49 | cid = get_cid_from_session(st) 50 | if cid: 51 | load_and_store_conversation(st, cid) 52 | 53 | # set default model if no model specified 54 | if "model" not in st.session_state: 55 | st.session_state["model"] = DEFAULT_MODEL 56 | 57 | 58 | def render_new_chat(sidebar): 59 | button_models = {"GPT-3.5 Chat": "gpt-3.5-turbo", "GPT-4 Chat": "gpt-4"} 60 | for button_text, model_type in button_models.items(): 61 | # if model in session_state is the same as the button, prefix button_text with a checked emoji 62 | if st.session_state.get("model") == model_type: 63 | button_text = "✓ " + button_text 64 | button_type = "primary" 65 | else: 66 | button_type = "secondary" 67 | 68 | if sidebar.button( 69 | button_text, 70 | key=f"button_{model_type}", 71 | use_container_width=True, 72 | type=button_type, 73 | ): 74 | reinitialize_chat(model_type) 75 | 76 | 77 | def reinitialize_chat(model: str): 78 | st.session_state["conversation"] = DEFAULT_CONVERSATION 79 | st.session_state["model"] = model 80 | st.session_state["cid"] = None 81 | st.experimental_rerun() 82 | 83 | 84 | def render_history_menu(sidebar): 85 | sidebar.write("## Chat History") 86 | sidebar.markdown( 87 | """ 88 | 93 | """, 94 | unsafe_allow_html=True, 95 | ) 96 | 97 | render_my_conversations(st, sidebar) 98 | 99 | 100 | def render_profile(sidebar): 101 | authentication_status = st.session_state.get( 102 | "authentication_status", "Not Authenticated" 103 | ) 104 | if authentication_status == "Authenticated": 105 | user_info = st.session_state.get("user_info") 106 | if not user_info: 107 | return 108 | 109 | status = f"Signed in as {user_info.get('email')}" 110 | login_container = sidebar.empty() 111 | with login_container.expander(status): 112 | st.image(user_info.get("picture"), width=50) 113 | sign_out = st.button("Sign out", key="button_sign_out", type="secondary") 114 | 115 | placeholder = st.empty() 116 | with placeholder: 117 | clear_history = st.button( 118 | "Clear History", key="button_clear_history", type="secondary" 119 | ) 120 | 121 | if clear_history: 122 | clear_user_history(user_info["id"]) 123 | placeholder.info("Chat history cleared", icon="✅") 124 | st.snow() 125 | st.write( 126 | "While it's useful to resume past conversations, sometimes you may want to clear your chat history." 127 | ) 128 | 129 | if sign_out: 130 | sign_out_google(st, login_container) 131 | st.experimental_set_query_params() 132 | del st.session_state["token"] 133 | del st.session_state["user_info"] 134 | st.session_state["authentication_status"] = "Not Authenticated" 135 | 136 | 137 | def render_sidebar(sidebar): 138 | render_new_chat(sidebar) 139 | sidebar.divider() 140 | render_auth(st) 141 | render_profile(sidebar) 142 | sidebar.divider() 143 | render_history_menu(sidebar) 144 | 145 | 146 | def main(): 147 | st.set_page_config( 148 | page_title="PushGPT Chat", page_icon=":robot_face:", layout="wide" 149 | ) 150 | controller() 151 | render_sidebar(st.sidebar) 152 | render_body(st) 153 | 154 | 155 | if __name__ == "__main__": 156 | main() 157 | debugger() 158 | -------------------------------------------------------------------------------- /google_utils.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import os 3 | from streamlit_oauth import OAuth2Component 4 | from firebase_utils import create_user_in_firebase_if_not_exists 5 | from utils import get_key_from_params 6 | import base64 7 | import json 8 | import time 9 | 10 | from dotenv import load_dotenv 11 | 12 | load_dotenv() 13 | 14 | 15 | # Set environment variables 16 | AUTHORIZE_URL = "https://accounts.google.com/o/oauth2/v2/auth" 17 | TOKEN_URL = "https://oauth2.googleapis.com/token" 18 | REFRESH_TOKEN_URL = "https://oauth2.googleapis.com/token" 19 | REVOKE_TOKEN_URL = "https://oauth2.googleapis.com/revoke" 20 | SCOPE = "openid profile email" 21 | 22 | CLIENT_ID = os.environ["GOOGLE_CLIENT_ID"] 23 | CLIENT_SECRET = os.environ["GOOGLE_CLIENT_SECRET"] 24 | REDIRECT_URI = os.environ["REDIRECT_URI"] 25 | 26 | WHITELISTED_DOMAINS = os.getenv("WHITELISTED_DOMAINS", "coderpush.com") 27 | WHITELISTED_DOMAINS_SET = set(WHITELISTED_DOMAINS.split(",")) 28 | 29 | 30 | def is_whitelisted_email_domain(email): 31 | return email.split("@")[1] in WHITELISTED_DOMAINS_SET 32 | 33 | 34 | # convert json to base64 string 35 | # INPUT: 36 | # { 37 | # "access_token": "", 38 | # "expires_in": 3599, 39 | # "scope": "https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email openid", 40 | # "token_type": "Bearer", 41 | # "id_token": "", 42 | # "expires_at": 1684836588 43 | # } 44 | # OUTPUT: 45 | # eyJhY2Nlc3NfdG9rZW4iOiIiLCJleHBpcmVzX2luIjozNTk5LCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvdXNlcm5hbWUucHJvZmlsZSBodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9hdXRoL3VzZXJpbmZvLmVtYWlsIG9wZW5pZCB0eXBlIjoiQmVhcmVyIiwiaWRfdG9rZW4iOiIiLCJleHBpcmVzX2F0IjoxNjg0ODM2NTg4fQ== 46 | def dict_to_base64(token): 47 | json_data = json.dumps(token) 48 | encoded = base64.b64encode(json_data.encode("utf-8")) 49 | return encoded 50 | 51 | 52 | def auth_with_google(st): 53 | # Create OAuth2Component instance 54 | oauth2 = OAuth2Component( 55 | CLIENT_ID, 56 | CLIENT_SECRET, 57 | AUTHORIZE_URL, 58 | TOKEN_URL, 59 | REFRESH_TOKEN_URL, 60 | REVOKE_TOKEN_URL, 61 | ) 62 | 63 | sign_in_holder = st.empty() 64 | # Check if token exists in session state 65 | if "token" not in st.session_state: 66 | with sign_in_holder.container(): 67 | # If not, show authorize button 68 | result = oauth2.authorize_button("Sign in with Google", REDIRECT_URI, SCOPE) 69 | if result and "token" in result: 70 | # If authorization successful, save token in session state 71 | token = result["token"] 72 | st.session_state["token"] = token 73 | base64_token = dict_to_base64(token) 74 | other_queries = st.experimental_get_query_params() 75 | if "cid" in other_queries and "model" in other_queries: 76 | cid = other_queries["cid"][0] 77 | model = other_queries["model"][0] 78 | st.experimental_set_query_params( 79 | token=base64_token, 80 | cid=cid, 81 | model=model, 82 | ) 83 | else: 84 | st.experimental_set_query_params(token=base64_token) 85 | sign_in_holder.empty() 86 | else: 87 | token = st.session_state["token"] 88 | expires_at = token.get("expires_at") 89 | if expires_at and expires_at < time.time(): 90 | try: 91 | token = oauth2.refresh_token(token) 92 | st.session_state.token = token 93 | print.log("Refreshed token at ", expires_at) 94 | st.session_state.token = token 95 | st.experimental_rerun() 96 | except Exception as e: 97 | st.experimental_set_query_params() 98 | st.error(e) 99 | 100 | 101 | def update_authentication_status(st): 102 | # get access_token from st.session_state["token"]["access_token"] with error handling 103 | try: 104 | access_token = st.session_state["token"]["access_token"] 105 | if access_token: 106 | user_info = get_user_info(access_token) 107 | 108 | if user_info and is_whitelisted_email_domain(user_info["email"]): 109 | create_user_in_firebase_if_not_exists(user_info) 110 | st.session_state["authentication_status"] = "Authenticated" 111 | st.session_state["name"] = user_info["name"] 112 | st.session_state["user_info"] = user_info 113 | 114 | else: 115 | st.experimental_set_query_params() 116 | 117 | message = "Failed to get user info. Reload?" 118 | 119 | if user_info and not is_whitelisted_email_domain(user_info["email"]): 120 | message = "This site is limited to whitelisted domains. Reload?" 121 | 122 | st.markdown( 123 | message, 124 | unsafe_allow_html=True, 125 | ) 126 | del st.session_state["token"] 127 | st.session_state["authentication_status"] = "Not Authenticated" 128 | except KeyError: 129 | st.session_state["authentication_status"] = "Token Missing" 130 | 131 | 132 | def get_user_info(access_token): 133 | response = requests.get( 134 | "https://www.googleapis.com/oauth2/v1/userinfo", 135 | headers={"Authorization": f"Bearer {access_token}"}, 136 | ) 137 | 138 | if response.status_code == 200: 139 | user_info = response.json() 140 | return user_info 141 | else: 142 | return None 143 | 144 | 145 | # log out google using access_token 146 | def sign_out_google(st, login_placeholder): 147 | access_token = st.session_state.get("token", {}).get("access_token") 148 | 149 | if not access_token: 150 | st.error("Error with access token") 151 | return 152 | 153 | response = requests.post( 154 | REVOKE_TOKEN_URL, 155 | params={"token": access_token}, 156 | ) 157 | 158 | if response.status_code == 200: 159 | login_placeholder.empty() 160 | st.sidebar.markdown( 161 | "Successfully logged out. Reload?", 162 | unsafe_allow_html=True, 163 | ) 164 | else: 165 | st.error("Failed to log out") 166 | print("Failed to log out:") 167 | print(response) 168 | 169 | 170 | def decode_token_from_params(st, key): 171 | try: 172 | base64_token = get_key_from_params(st, key) 173 | if base64_token: 174 | # decode token 175 | str_data = base64.b64decode(base64_token.encode("utf-8")).decode("utf-8") 176 | # convert to dict 177 | dict_data = json.loads(str_data) 178 | return dict_data 179 | except UnicodeDecodeError as e: 180 | st.error(e) 181 | -------------------------------------------------------------------------------- /utils.py: -------------------------------------------------------------------------------- 1 | from firestore_utils import delete_convo, edit_convo 2 | from custom_js import render_copy_shared_convo_link 3 | from constants import DEFAULT_CONVERSATION 4 | 5 | 6 | def link_button(st, text, path): 7 | st.write( 8 | f""" 9 | 10 | 15 | 16 | """, 17 | unsafe_allow_html=True, 18 | ) 19 | 20 | 21 | def link_row(st, text, path, selected=False): 22 | if selected: 23 | class_name = "selected link-row" 24 | else: 25 | class_name = "link-row" 26 | 27 | st.write( 28 | f""" 29 | 30 | 31 |
32 | {text} 33 |
34 |
35 | """, 36 | unsafe_allow_html=True, 37 | ) 38 | 39 | 40 | def button_row(st, cid, conversation, selected=False): 41 | title = conversation.get("title", cid) 42 | container = st.sidebar.container() 43 | 44 | if "title_button" not in st.session_state: 45 | st.session_state["title_button"] = {} 46 | if cid not in st.session_state["title_button"]: 47 | st.session_state["title_button"][cid] = False 48 | 49 | with container: 50 | col1, col2, col3, col4 = st.columns([6, 1, 1, 1], gap="small") 51 | is_edit = st.session_state.get(f"edit_convo_button_{cid}", False) 52 | 53 | with col1: 54 | is_edit = st.session_state.get(f"edit_convo_button_{cid}", False) 55 | 56 | if is_edit: 57 | st.text_input( 58 | "Edit Label", 59 | title, 60 | key=f"new_title_{cid}", 61 | max_chars=30, 62 | label_visibility="collapsed", 63 | ) 64 | else: 65 | convo_button = st.button( 66 | title, 67 | key=f"title_{cid}", 68 | disabled=selected, 69 | use_container_width=True, 70 | ) 71 | if convo_button: 72 | for key in st.session_state["title_button"]: 73 | st.session_state["title_button"][key] = False 74 | 75 | st.session_state["title_button"][cid] = True 76 | st.session_state["cid"] = cid 77 | st.experimental_rerun() 78 | 79 | new_title = st.session_state.get(f"new_title_{cid}", "") 80 | if new_title and new_title != title: 81 | edit_convo(cid, new_label=new_title) 82 | st.session_state[f"new_title_{cid}"] = "" 83 | st.experimental_rerun() 84 | 85 | if st.session_state["title_button"][cid]: 86 | with col2: 87 | st.button( 88 | ":outbox_tray:", 89 | key=f"share_convo_button_{cid}", 90 | disabled=False, 91 | use_container_width=True, 92 | on_click=lambda: render_copy_shared_convo_link(cid), 93 | ) 94 | 95 | with col3: 96 | st.button( 97 | ":pencil2:", 98 | key=f"edit_convo_button_{cid}", 99 | disabled=False, 100 | use_container_width=True, 101 | ) 102 | 103 | with col4: 104 | delete_button = st.button( 105 | ":wastebasket:", 106 | key=f"delete_convo_button_{cid}", 107 | disabled=False, 108 | use_container_width=True, 109 | ) 110 | if delete_button: 111 | delete_convo(cid) 112 | st.session_state["cid"] = None 113 | st.session_state["conversation"] = DEFAULT_CONVERSATION 114 | st.experimental_rerun() 115 | else: 116 | with col4: 117 | open_button = st.button( 118 | "📂", key=f"open_convo{cid}", use_container_width=True 119 | ) 120 | if open_button: 121 | st.session_state["cid"] = cid 122 | st.experimental_rerun() 123 | 124 | css = """ 125 | 168 | """ 169 | 170 | st.sidebar.markdown(css, unsafe_allow_html=True) 171 | 172 | 173 | def get_key_from_params(st, key): 174 | params = st.experimental_get_query_params() 175 | if key in params: 176 | return params[key][0] 177 | else: 178 | return None 179 | 180 | 181 | def get_cid_from_params(st): 182 | return get_key_from_params(st, "cid") 183 | 184 | 185 | def get_cid_from_session(st): 186 | return st.session_state.get("cid", None) 187 | 188 | 189 | def get_oauth_uid(st): 190 | user_info = st.session_state.get("user_info", {}) 191 | return user_info.get("id", None) 192 | 193 | 194 | def get_expander_text(st): 195 | user = st.session_state.get("user_info", {}).get("name", None) 196 | model = st.session_state.get("model") 197 | messages = st.session_state.get("conversation", {}).get("messages", []) 198 | user_messages = [m for m in messages if m.get("role") == "user"] 199 | if user: 200 | text = f"### {model} with {user}" 201 | else: 202 | text = f"### {model}" 203 | 204 | if len(messages) > 0: 205 | text += f" ({len(user_messages)} messages)" 206 | return text 207 | -------------------------------------------------------------------------------- /sample-stream.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "choices": [ 4 | { 5 | "delta": { 6 | "role": "assistant" 7 | }, 8 | "finish_reason": null, 9 | "index": 0 10 | } 11 | ], 12 | "created": 1684389483, 13 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 14 | "model": "gpt-3.5-turbo-0301", 15 | "object": "chat.completion.chunk" 16 | }, 17 | { 18 | "choices": [ 19 | { 20 | "delta": { 21 | "content": "Sure" 22 | }, 23 | "finish_reason": null, 24 | "index": 0 25 | } 26 | ], 27 | "created": 1684389483, 28 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 29 | "model": "gpt-3.5-turbo-0301", 30 | "object": "chat.completion.chunk" 31 | }, 32 | { 33 | "choices": [ 34 | { 35 | "delta": { 36 | "content": "," 37 | }, 38 | "finish_reason": null, 39 | "index": 0 40 | } 41 | ], 42 | "created": 1684389483, 43 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 44 | "model": "gpt-3.5-turbo-0301", 45 | "object": "chat.completion.chunk" 46 | }, 47 | { 48 | "choices": [ 49 | { 50 | "delta": { 51 | "content": " here" 52 | }, 53 | "finish_reason": null, 54 | "index": 0 55 | } 56 | ], 57 | "created": 1684389483, 58 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 59 | "model": "gpt-3.5-turbo-0301", 60 | "object": "chat.completion.chunk" 61 | }, 62 | { 63 | "choices": [ 64 | { 65 | "delta": { 66 | "content": "'s" 67 | }, 68 | "finish_reason": null, 69 | "index": 0 70 | } 71 | ], 72 | "created": 1684389483, 73 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 74 | "model": "gpt-3.5-turbo-0301", 75 | "object": "chat.completion.chunk" 76 | }, 77 | { 78 | "choices": [ 79 | { 80 | "delta": { 81 | "content": " a" 82 | }, 83 | "finish_reason": null, 84 | "index": 0 85 | } 86 | ], 87 | "created": 1684389483, 88 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 89 | "model": "gpt-3.5-turbo-0301", 90 | "object": "chat.completion.chunk" 91 | }, 92 | { 93 | "choices": [ 94 | { 95 | "delta": { 96 | "content": " joke" 97 | }, 98 | "finish_reason": null, 99 | "index": 0 100 | } 101 | ], 102 | "created": 1684389483, 103 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 104 | "model": "gpt-3.5-turbo-0301", 105 | "object": "chat.completion.chunk" 106 | }, 107 | { 108 | "choices": [ 109 | { 110 | "delta": { 111 | "content": " for" 112 | }, 113 | "finish_reason": null, 114 | "index": 0 115 | } 116 | ], 117 | "created": 1684389483, 118 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 119 | "model": "gpt-3.5-turbo-0301", 120 | "object": "chat.completion.chunk" 121 | }, 122 | { 123 | "choices": [ 124 | { 125 | "delta": { 126 | "content": " you" 127 | }, 128 | "finish_reason": null, 129 | "index": 0 130 | } 131 | ], 132 | "created": 1684389483, 133 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 134 | "model": "gpt-3.5-turbo-0301", 135 | "object": "chat.completion.chunk" 136 | }, 137 | { 138 | "choices": [ 139 | { 140 | "delta": { 141 | "content": ":" 142 | }, 143 | "finish_reason": null, 144 | "index": 0 145 | } 146 | ], 147 | "created": 1684389483, 148 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 149 | "model": "gpt-3.5-turbo-0301", 150 | "object": "chat.completion.chunk" 151 | }, 152 | { 153 | "choices": [ 154 | { 155 | "delta": { 156 | "content": " Why" 157 | }, 158 | "finish_reason": null, 159 | "index": 0 160 | } 161 | ], 162 | "created": 1684389483, 163 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 164 | "model": "gpt-3.5-turbo-0301", 165 | "object": "chat.completion.chunk" 166 | }, 167 | { 168 | "choices": [ 169 | { 170 | "delta": { 171 | "content": " did" 172 | }, 173 | "finish_reason": null, 174 | "index": 0 175 | } 176 | ], 177 | "created": 1684389483, 178 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 179 | "model": "gpt-3.5-turbo-0301", 180 | "object": "chat.completion.chunk" 181 | }, 182 | { 183 | "choices": [ 184 | { 185 | "delta": { 186 | "content": " the" 187 | }, 188 | "finish_reason": null, 189 | "index": 0 190 | } 191 | ], 192 | "created": 1684389483, 193 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 194 | "model": "gpt-3.5-turbo-0301", 195 | "object": "chat.completion.chunk" 196 | }, 197 | { 198 | "choices": [ 199 | { 200 | "delta": { 201 | "content": " scare" 202 | }, 203 | "finish_reason": null, 204 | "index": 0 205 | } 206 | ], 207 | "created": 1684389483, 208 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 209 | "model": "gpt-3.5-turbo-0301", 210 | "object": "chat.completion.chunk" 211 | }, 212 | { 213 | "choices": [ 214 | { 215 | "delta": { 216 | "content": "crow" 217 | }, 218 | "finish_reason": null, 219 | "index": 0 220 | } 221 | ], 222 | "created": 1684389483, 223 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 224 | "model": "gpt-3.5-turbo-0301", 225 | "object": "chat.completion.chunk" 226 | }, 227 | { 228 | "choices": [ 229 | { 230 | "delta": { 231 | "content": " win" 232 | }, 233 | "finish_reason": null, 234 | "index": 0 235 | } 236 | ], 237 | "created": 1684389483, 238 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 239 | "model": "gpt-3.5-turbo-0301", 240 | "object": "chat.completion.chunk" 241 | }, 242 | { 243 | "choices": [ 244 | { 245 | "delta": { 246 | "content": " an" 247 | }, 248 | "finish_reason": null, 249 | "index": 0 250 | } 251 | ], 252 | "created": 1684389483, 253 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 254 | "model": "gpt-3.5-turbo-0301", 255 | "object": "chat.completion.chunk" 256 | }, 257 | { 258 | "choices": [ 259 | { 260 | "delta": { 261 | "content": " award" 262 | }, 263 | "finish_reason": null, 264 | "index": 0 265 | } 266 | ], 267 | "created": 1684389483, 268 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 269 | "model": "gpt-3.5-turbo-0301", 270 | "object": "chat.completion.chunk" 271 | }, 272 | { 273 | "choices": [ 274 | { 275 | "delta": { 276 | "content": "?" 277 | }, 278 | "finish_reason": null, 279 | "index": 0 280 | } 281 | ], 282 | "created": 1684389483, 283 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 284 | "model": "gpt-3.5-turbo-0301", 285 | "object": "chat.completion.chunk" 286 | }, 287 | { 288 | "choices": [ 289 | { 290 | "delta": { 291 | "content": " Because" 292 | }, 293 | "finish_reason": null, 294 | "index": 0 295 | } 296 | ], 297 | "created": 1684389483, 298 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 299 | "model": "gpt-3.5-turbo-0301", 300 | "object": "chat.completion.chunk" 301 | }, 302 | { 303 | "choices": [ 304 | { 305 | "delta": { 306 | "content": " he" 307 | }, 308 | "finish_reason": null, 309 | "index": 0 310 | } 311 | ], 312 | "created": 1684389483, 313 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 314 | "model": "gpt-3.5-turbo-0301", 315 | "object": "chat.completion.chunk" 316 | }, 317 | { 318 | "choices": [ 319 | { 320 | "delta": { 321 | "content": " was" 322 | }, 323 | "finish_reason": null, 324 | "index": 0 325 | } 326 | ], 327 | "created": 1684389483, 328 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 329 | "model": "gpt-3.5-turbo-0301", 330 | "object": "chat.completion.chunk" 331 | }, 332 | { 333 | "choices": [ 334 | { 335 | "delta": { 336 | "content": " outstanding" 337 | }, 338 | "finish_reason": null, 339 | "index": 0 340 | } 341 | ], 342 | "created": 1684389483, 343 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 344 | "model": "gpt-3.5-turbo-0301", 345 | "object": "chat.completion.chunk" 346 | }, 347 | { 348 | "choices": [ 349 | { 350 | "delta": { 351 | "content": " in" 352 | }, 353 | "finish_reason": null, 354 | "index": 0 355 | } 356 | ], 357 | "created": 1684389483, 358 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 359 | "model": "gpt-3.5-turbo-0301", 360 | "object": "chat.completion.chunk" 361 | }, 362 | { 363 | "choices": [ 364 | { 365 | "delta": { 366 | "content": " his" 367 | }, 368 | "finish_reason": null, 369 | "index": 0 370 | } 371 | ], 372 | "created": 1684389483, 373 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 374 | "model": "gpt-3.5-turbo-0301", 375 | "object": "chat.completion.chunk" 376 | }, 377 | { 378 | "choices": [ 379 | { 380 | "delta": { 381 | "content": " field" 382 | }, 383 | "finish_reason": null, 384 | "index": 0 385 | } 386 | ], 387 | "created": 1684389483, 388 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 389 | "model": "gpt-3.5-turbo-0301", 390 | "object": "chat.completion.chunk" 391 | }, 392 | { 393 | "choices": [ 394 | { 395 | "delta": { 396 | "content": "!" 397 | }, 398 | "finish_reason": null, 399 | "index": 0 400 | } 401 | ], 402 | "created": 1684389483, 403 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 404 | "model": "gpt-3.5-turbo-0301", 405 | "object": "chat.completion.chunk" 406 | }, 407 | { 408 | "choices": [ 409 | { 410 | "delta": {}, 411 | "finish_reason": "stop", 412 | "index": 0 413 | } 414 | ], 415 | "created": 1684389483, 416 | "id": "chatcmpl-7HQwF5QPvTrDtYPOvBZbzFfDb9tcI", 417 | "model": "gpt-3.5-turbo-0301", 418 | "object": "chat.completion.chunk" 419 | } 420 | ] 421 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "c8c2610ea6cf8a550e350124e0833a4b4a2f51757b3b81990aa5074552a1969e" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.10" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "aiohttp": { 20 | "hashes": [ 21 | "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14", 22 | "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391", 23 | "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2", 24 | "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e", 25 | "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9", 26 | "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd", 27 | "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4", 28 | "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b", 29 | "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41", 30 | "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567", 31 | "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275", 32 | "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54", 33 | "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a", 34 | "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef", 35 | "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99", 36 | "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da", 37 | "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4", 38 | "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e", 39 | "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699", 40 | "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04", 41 | "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719", 42 | "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131", 43 | "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e", 44 | "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f", 45 | "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd", 46 | "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f", 47 | "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e", 48 | "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1", 49 | "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed", 50 | "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4", 51 | "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1", 52 | "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777", 53 | "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531", 54 | "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b", 55 | "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab", 56 | "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8", 57 | "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074", 58 | "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc", 59 | "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643", 60 | "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01", 61 | "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36", 62 | "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24", 63 | "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654", 64 | "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d", 65 | "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241", 66 | "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51", 67 | "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f", 68 | "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2", 69 | "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15", 70 | "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf", 71 | "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b", 72 | "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71", 73 | "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05", 74 | "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52", 75 | "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3", 76 | "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6", 77 | "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a", 78 | "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519", 79 | "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a", 80 | "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333", 81 | "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6", 82 | "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d", 83 | "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57", 84 | "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c", 85 | "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9", 86 | "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea", 87 | "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332", 88 | "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5", 89 | "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622", 90 | "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71", 91 | "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb", 92 | "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a", 93 | "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff", 94 | "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945", 95 | "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480", 96 | "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6", 97 | "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9", 98 | "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd", 99 | "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f", 100 | "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a", 101 | "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a", 102 | "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949", 103 | "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc", 104 | "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75", 105 | "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f", 106 | "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10", 107 | "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f" 108 | ], 109 | "markers": "python_version >= '3.6'", 110 | "version": "==3.8.4" 111 | }, 112 | "aiosignal": { 113 | "hashes": [ 114 | "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", 115 | "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17" 116 | ], 117 | "markers": "python_version >= '3.7'", 118 | "version": "==1.3.1" 119 | }, 120 | "altair": { 121 | "hashes": [ 122 | "sha256:39399a267c49b30d102c10411e67ab26374156a84b1aeb9fcd15140429ba49c5", 123 | "sha256:8b45ebeaf8557f2d760c5c77b79f02ae12aee7c46c27c06014febab6f849bc87" 124 | ], 125 | "markers": "python_version >= '3.7'", 126 | "version": "==4.2.2" 127 | }, 128 | "anyio": { 129 | "hashes": [ 130 | "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce", 131 | "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0" 132 | ], 133 | "markers": "python_version >= '3.7'", 134 | "version": "==3.7.0" 135 | }, 136 | "async-timeout": { 137 | "hashes": [ 138 | "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15", 139 | "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c" 140 | ], 141 | "markers": "python_version >= '3.6'", 142 | "version": "==4.0.2" 143 | }, 144 | "attrs": { 145 | "hashes": [ 146 | "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", 147 | "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" 148 | ], 149 | "markers": "python_version >= '3.7'", 150 | "version": "==23.1.0" 151 | }, 152 | "blinker": { 153 | "hashes": [ 154 | "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213", 155 | "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0" 156 | ], 157 | "markers": "python_version >= '3.7'", 158 | "version": "==1.6.2" 159 | }, 160 | "cachecontrol": { 161 | "hashes": [ 162 | "sha256:95dedbec849f46dda3137866dc28b9d133fc9af55f5b805ab1291833e4457aa4", 163 | "sha256:f012366b79d2243a6118309ce73151bf52a38d4a5dac8ea57f09bd29087e506b" 164 | ], 165 | "markers": "python_version >= '3.7'", 166 | "version": "==0.13.1" 167 | }, 168 | "cachetools": { 169 | "hashes": [ 170 | "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590", 171 | "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b" 172 | ], 173 | "markers": "python_version >= '3.7'", 174 | "version": "==5.3.1" 175 | }, 176 | "certifi": { 177 | "hashes": [ 178 | "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7", 179 | "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" 180 | ], 181 | "markers": "python_version >= '3.6'", 182 | "version": "==2023.5.7" 183 | }, 184 | "cffi": { 185 | "hashes": [ 186 | "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", 187 | "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", 188 | "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", 189 | "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", 190 | "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", 191 | "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", 192 | "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", 193 | "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", 194 | "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", 195 | "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", 196 | "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", 197 | "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", 198 | "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", 199 | "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", 200 | "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", 201 | "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", 202 | "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", 203 | "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", 204 | "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", 205 | "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", 206 | "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", 207 | "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", 208 | "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", 209 | "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", 210 | "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", 211 | "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", 212 | "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", 213 | "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", 214 | "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", 215 | "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", 216 | "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", 217 | "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", 218 | "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", 219 | "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", 220 | "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", 221 | "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", 222 | "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", 223 | "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", 224 | "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", 225 | "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", 226 | "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", 227 | "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", 228 | "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", 229 | "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", 230 | "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", 231 | "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", 232 | "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", 233 | "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", 234 | "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", 235 | "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", 236 | "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", 237 | "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", 238 | "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", 239 | "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", 240 | "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", 241 | "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", 242 | "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", 243 | "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", 244 | "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", 245 | "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", 246 | "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", 247 | "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", 248 | "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", 249 | "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" 250 | ], 251 | "version": "==1.15.1" 252 | }, 253 | "charset-normalizer": { 254 | "hashes": [ 255 | "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6", 256 | "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1", 257 | "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e", 258 | "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373", 259 | "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62", 260 | "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230", 261 | "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be", 262 | "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c", 263 | "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0", 264 | "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448", 265 | "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f", 266 | "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649", 267 | "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d", 268 | "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0", 269 | "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", 270 | "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a", 271 | "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59", 272 | "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23", 273 | "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5", 274 | "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb", 275 | "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e", 276 | "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e", 277 | "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c", 278 | "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28", 279 | "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d", 280 | "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41", 281 | "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974", 282 | "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce", 283 | "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f", 284 | "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1", 285 | "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d", 286 | "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8", 287 | "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017", 288 | "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31", 289 | "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7", 290 | "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8", 291 | "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e", 292 | "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14", 293 | "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd", 294 | "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d", 295 | "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795", 296 | "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b", 297 | "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b", 298 | "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b", 299 | "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203", 300 | "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f", 301 | "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19", 302 | "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1", 303 | "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a", 304 | "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac", 305 | "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9", 306 | "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0", 307 | "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137", 308 | "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f", 309 | "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6", 310 | "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5", 311 | "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909", 312 | "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f", 313 | "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0", 314 | "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324", 315 | "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755", 316 | "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb", 317 | "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854", 318 | "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c", 319 | "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60", 320 | "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84", 321 | "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0", 322 | "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b", 323 | "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1", 324 | "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531", 325 | "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1", 326 | "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11", 327 | "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326", 328 | "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", 329 | "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" 330 | ], 331 | "markers": "python_full_version >= '3.7.0'", 332 | "version": "==3.1.0" 333 | }, 334 | "click": { 335 | "hashes": [ 336 | "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", 337 | "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" 338 | ], 339 | "markers": "python_version >= '3.7'", 340 | "version": "==8.1.3" 341 | }, 342 | "cryptography": { 343 | "hashes": [ 344 | "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db", 345 | "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a", 346 | "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039", 347 | "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c", 348 | "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3", 349 | "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485", 350 | "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c", 351 | "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca", 352 | "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5", 353 | "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5", 354 | "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3", 355 | "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb", 356 | "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43", 357 | "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31", 358 | "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc", 359 | "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b", 360 | "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006", 361 | "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a", 362 | "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699" 363 | ], 364 | "version": "==41.0.1" 365 | }, 366 | "dataclasses-json": { 367 | "hashes": [ 368 | "sha256:6572ac08ad9340abcb74fd8c4c8e9752db2a182a402c8e871d0a8aa119e3804e", 369 | "sha256:65b167c15fdf9bde27569c09ac18dd39bf1cc5b7998525024cb4678d2653946c" 370 | ], 371 | "markers": "python_version >= '3.6'", 372 | "version": "==0.5.8" 373 | }, 374 | "decorator": { 375 | "hashes": [ 376 | "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", 377 | "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" 378 | ], 379 | "markers": "python_version >= '3.5'", 380 | "version": "==5.1.1" 381 | }, 382 | "entrypoints": { 383 | "hashes": [ 384 | "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4", 385 | "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f" 386 | ], 387 | "markers": "python_version >= '3.6'", 388 | "version": "==0.4" 389 | }, 390 | "exceptiongroup": { 391 | "hashes": [ 392 | "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", 393 | "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" 394 | ], 395 | "markers": "python_version < '3.11'", 396 | "version": "==1.1.1" 397 | }, 398 | "firebase-admin": { 399 | "hashes": [ 400 | "sha256:3daa806d16a35d83a809a70a325f973ba9dc242601fe69cd68e6f54a6ffdcd57", 401 | "sha256:52e13e393c9d3dc6237f2c376b8e55aacdaaeebe455c0b7e8cfbf35b6491e19d" 402 | ], 403 | "index": "pypi", 404 | "version": "==6.1.0" 405 | }, 406 | "frozenlist": { 407 | "hashes": [ 408 | "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c", 409 | "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f", 410 | "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a", 411 | "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784", 412 | "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27", 413 | "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d", 414 | "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3", 415 | "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678", 416 | "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a", 417 | "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483", 418 | "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8", 419 | "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf", 420 | "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99", 421 | "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c", 422 | "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48", 423 | "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5", 424 | "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56", 425 | "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e", 426 | "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1", 427 | "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401", 428 | "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4", 429 | "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e", 430 | "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649", 431 | "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a", 432 | "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d", 433 | "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0", 434 | "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6", 435 | "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d", 436 | "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b", 437 | "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6", 438 | "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf", 439 | "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef", 440 | "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7", 441 | "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842", 442 | "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba", 443 | "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420", 444 | "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b", 445 | "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d", 446 | "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332", 447 | "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936", 448 | "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816", 449 | "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91", 450 | "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420", 451 | "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448", 452 | "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411", 453 | "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4", 454 | "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32", 455 | "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b", 456 | "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0", 457 | "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530", 458 | "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669", 459 | "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7", 460 | "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1", 461 | "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5", 462 | "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce", 463 | "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4", 464 | "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e", 465 | "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2", 466 | "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d", 467 | "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9", 468 | "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642", 469 | "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0", 470 | "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703", 471 | "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb", 472 | "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1", 473 | "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13", 474 | "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab", 475 | "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38", 476 | "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb", 477 | "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb", 478 | "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81", 479 | "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8", 480 | "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd", 481 | "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4" 482 | ], 483 | "markers": "python_version >= '3.7'", 484 | "version": "==1.3.3" 485 | }, 486 | "gitdb": { 487 | "hashes": [ 488 | "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a", 489 | "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7" 490 | ], 491 | "markers": "python_version >= '3.7'", 492 | "version": "==4.0.10" 493 | }, 494 | "gitpython": { 495 | "hashes": [ 496 | "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573", 497 | "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d" 498 | ], 499 | "markers": "python_version >= '3.7'", 500 | "version": "==3.1.31" 501 | }, 502 | "google-api-core": { 503 | "extras": [ 504 | "grpc" 505 | ], 506 | "hashes": [ 507 | "sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a", 508 | "sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a" 509 | ], 510 | "markers": "platform_python_implementation != 'PyPy'", 511 | "version": "==2.11.1" 512 | }, 513 | "google-api-python-client": { 514 | "hashes": [ 515 | "sha256:0b0c9503df2da92692ffceee88423ca593cbf0b939d879e2c46fbdc1a39cf091", 516 | "sha256:272ff339928ac35b1e117d30e5db444fb701803bb748bb29e7bb520be29dea36" 517 | ], 518 | "markers": "python_version >= '3.7'", 519 | "version": "==2.89.0" 520 | }, 521 | "google-auth": { 522 | "hashes": [ 523 | "sha256:030af34138909ccde0fbce611afc178f1d65d32fbff281f25738b1fe1c6f3eaa", 524 | "sha256:23b7b0950fcda519bfb6692bf0d5289d2ea49fc143717cc7188458ec620e63fa" 525 | ], 526 | "markers": "python_version >= '3.6'", 527 | "version": "==2.20.0" 528 | }, 529 | "google-auth-httplib2": { 530 | "hashes": [ 531 | "sha256:31e49c36c6b5643b57e82617cb3e021e3e1d2df9da63af67252c02fa9c1f4a10", 532 | "sha256:a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac" 533 | ], 534 | "version": "==0.1.0" 535 | }, 536 | "google-cloud-core": { 537 | "hashes": [ 538 | "sha256:8417acf6466be2fa85123441696c4badda48db314c607cf1e5d543fa8bdc22fe", 539 | "sha256:b9529ee7047fd8d4bf4a2182de619154240df17fbe60ead399078c1ae152af9a" 540 | ], 541 | "markers": "python_version >= '3.7'", 542 | "version": "==2.3.2" 543 | }, 544 | "google-cloud-firestore": { 545 | "hashes": [ 546 | "sha256:7f7dfa86567c8d66c66c8dba8bc5ef85677c8532b4206055a339413f8071525d", 547 | "sha256:833019175b6c82727da71e2db2fdea9bf203d0b8239c696492f7e2b24566bb3e" 548 | ], 549 | "index": "pypi", 550 | "version": "==2.11.1" 551 | }, 552 | "google-cloud-storage": { 553 | "hashes": [ 554 | "sha256:83a90447f23d5edd045e0037982c270302e3aeb45fc1288d2c2ca713d27bad94", 555 | "sha256:9b6ae7b509fc294bdacb84d0f3ea8e20e2c54a8b4bbe39c5707635fec214eff3" 556 | ], 557 | "markers": "python_version >= '3.7'", 558 | "version": "==2.9.0" 559 | }, 560 | "google-crc32c": { 561 | "hashes": [ 562 | "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a", 563 | "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876", 564 | "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c", 565 | "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289", 566 | "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298", 567 | "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02", 568 | "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f", 569 | "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2", 570 | "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a", 571 | "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb", 572 | "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210", 573 | "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5", 574 | "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee", 575 | "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c", 576 | "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a", 577 | "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314", 578 | "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd", 579 | "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65", 580 | "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37", 581 | "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4", 582 | "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13", 583 | "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894", 584 | "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31", 585 | "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e", 586 | "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709", 587 | "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740", 588 | "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc", 589 | "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d", 590 | "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c", 591 | "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c", 592 | "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d", 593 | "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906", 594 | "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61", 595 | "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57", 596 | "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c", 597 | "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a", 598 | "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438", 599 | "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946", 600 | "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7", 601 | "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96", 602 | "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091", 603 | "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae", 604 | "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d", 605 | "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88", 606 | "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2", 607 | "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd", 608 | "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541", 609 | "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728", 610 | "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178", 611 | "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968", 612 | "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346", 613 | "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8", 614 | "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93", 615 | "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7", 616 | "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273", 617 | "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462", 618 | "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94", 619 | "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd", 620 | "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e", 621 | "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57", 622 | "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b", 623 | "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9", 624 | "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a", 625 | "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100", 626 | "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325", 627 | "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183", 628 | "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556", 629 | "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4" 630 | ], 631 | "markers": "python_version >= '3.7'", 632 | "version": "==1.5.0" 633 | }, 634 | "google-resumable-media": { 635 | "hashes": [ 636 | "sha256:218931e8e2b2a73a58eb354a288e03a0fd5fb1c4583261ac6e4c078666468c93", 637 | "sha256:da1bd943e2e114a56d85d6848497ebf9be6a14d3db23e9fc57581e7c3e8170ec" 638 | ], 639 | "markers": "python_version >= '3.7'", 640 | "version": "==2.5.0" 641 | }, 642 | "googleapis-common-protos": { 643 | "hashes": [ 644 | "sha256:0cbedb6fb68f1c07e18eb4c48256320777707e7d0c55063ae56c15db3224a61e", 645 | "sha256:b35d530fe825fb4227857bc47ad84c33c809ac96f312e13182bdeaa2abe1178a" 646 | ], 647 | "markers": "python_version >= '3.7'", 648 | "version": "==1.59.1" 649 | }, 650 | "greenlet": { 651 | "hashes": [ 652 | "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a", 653 | "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a", 654 | "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43", 655 | "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33", 656 | "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8", 657 | "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088", 658 | "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca", 659 | "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343", 660 | "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645", 661 | "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db", 662 | "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df", 663 | "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3", 664 | "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86", 665 | "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2", 666 | "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a", 667 | "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf", 668 | "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7", 669 | "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394", 670 | "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40", 671 | "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3", 672 | "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6", 673 | "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74", 674 | "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0", 675 | "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3", 676 | "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91", 677 | "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5", 678 | "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9", 679 | "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8", 680 | "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b", 681 | "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6", 682 | "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb", 683 | "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73", 684 | "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b", 685 | "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df", 686 | "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9", 687 | "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f", 688 | "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0", 689 | "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857", 690 | "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a", 691 | "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249", 692 | "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30", 693 | "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292", 694 | "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b", 695 | "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d", 696 | "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b", 697 | "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c", 698 | "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca", 699 | "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7", 700 | "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75", 701 | "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae", 702 | "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b", 703 | "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470", 704 | "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564", 705 | "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9", 706 | "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099", 707 | "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0", 708 | "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5", 709 | "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19", 710 | "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1", 711 | "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526" 712 | ], 713 | "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", 714 | "version": "==2.0.2" 715 | }, 716 | "grpcio": { 717 | "hashes": [ 718 | "sha256:0212e2f7fdf7592e4b9d365087da30cb4d71e16a6f213120c89b4f8fb35a3ab3", 719 | "sha256:09d4bfd84686cd36fd11fd45a0732c7628308d094b14d28ea74a81db0bce2ed3", 720 | "sha256:1e623e0cf99a0ac114f091b3083a1848dbc64b0b99e181473b5a4a68d4f6f821", 721 | "sha256:2288d76e4d4aa7ef3fe7a73c1c470b66ea68e7969930e746a8cd8eca6ef2a2ea", 722 | "sha256:2296356b5c9605b73ed6a52660b538787094dae13786ba53080595d52df13a98", 723 | "sha256:2a1e601ee31ef30a9e2c601d0867e236ac54c922d32ed9f727b70dd5d82600d5", 724 | "sha256:2be88c081e33f20630ac3343d8ad9f1125f32987968e9c8c75c051c9800896e8", 725 | "sha256:33d40954199bddbb6a78f8f6f2b2082660f381cd2583ec860a6c2fa7c8400c08", 726 | "sha256:40e1cbf69d6741b40f750f3cccc64326f927ac6145a9914d33879e586002350c", 727 | "sha256:46a057329938b08e5f0e12ea3d7aed3ecb20a0c34c4a324ef34e00cecdb88a12", 728 | "sha256:4864f99aac207e3e45c5e26c6cbb0ad82917869abc2f156283be86c05286485c", 729 | "sha256:4c44e1a765b31e175c391f22e8fc73b2a2ece0e5e6ff042743d8109b5d2eff9f", 730 | "sha256:4cb283f630624ebb16c834e5ac3d7880831b07cbe76cb08ab7a271eeaeb8943e", 731 | "sha256:5008964885e8d23313c8e5ea0d44433be9bfd7e24482574e8cc43c02c02fc796", 732 | "sha256:50a9f075eeda5097aa9a182bb3877fe1272875e45370368ac0ee16ab9e22d019", 733 | "sha256:51630c92591d6d3fe488a7c706bd30a61594d144bac7dee20c8e1ce78294f474", 734 | "sha256:5cc928cfe6c360c1df636cf7991ab96f059666ac7b40b75a769410cc6217df9c", 735 | "sha256:61f7203e2767800edee7a1e1040aaaf124a35ce0c7fe0883965c6b762defe598", 736 | "sha256:66233ccd2a9371158d96e05d082043d47dadb18cbb294dc5accfdafc2e6b02a7", 737 | "sha256:70fcac7b94f4c904152809a050164650ac81c08e62c27aa9f156ac518029ebbe", 738 | "sha256:714242ad0afa63a2e6dabd522ae22e1d76e07060b5af2ddda5474ba4f14c2c94", 739 | "sha256:782f4f8662a2157c4190d0f99eaaebc602899e84fb1e562a944e5025929e351c", 740 | "sha256:7fc2b4edb938c8faa4b3c3ea90ca0dd89b7565a049e8e4e11b77e60e4ed2cc05", 741 | "sha256:881d058c5ccbea7cc2c92085a11947b572498a27ef37d3eef4887f499054dca8", 742 | "sha256:89dde0ac72a858a44a2feb8e43dc68c0c66f7857a23f806e81e1b7cc7044c9cf", 743 | "sha256:8cdbcbd687e576d48f7886157c95052825ca9948c0ed2afdc0134305067be88b", 744 | "sha256:8d6192c37a30a115f4663592861f50e130caed33efc4eec24d92ec881c92d771", 745 | "sha256:96a41817d2c763b1d0b32675abeb9179aa2371c72aefdf74b2d2b99a1b92417b", 746 | "sha256:9bdbb7624d65dc0ed2ed8e954e79ab1724526f09b1efa88dcd9a1815bf28be5f", 747 | "sha256:9bf88004fe086c786dc56ef8dd6cb49c026833fdd6f42cb853008bce3f907148", 748 | "sha256:a08920fa1a97d4b8ee5db2f31195de4a9def1a91bc003544eb3c9e6b8977960a", 749 | "sha256:a2f5a1f1080ccdc7cbaf1171b2cf384d852496fe81ddedeb882d42b85727f610", 750 | "sha256:b04202453941a63b36876a7172b45366dc0cde10d5fd7855c0f4a4e673c0357a", 751 | "sha256:b38b3de8cff5bc70f8f9c615f51b48eff7313fc9aca354f09f81b73036e7ddfa", 752 | "sha256:b52d00d1793d290c81ad6a27058f5224a7d5f527867e5b580742e1bd211afeee", 753 | "sha256:b74ae837368cfffeb3f6b498688a123e6b960951be4dec0e869de77e7fa0439e", 754 | "sha256:be48496b0e00460717225e7680de57c38be1d8629dc09dadcd1b3389d70d942b", 755 | "sha256:c0e3155fc5335ec7b3b70f15230234e529ca3607b20a562b6c75fb1b1218874c", 756 | "sha256:c2392f5b5d84b71d853918687d806c1aa4308109e5ca158a16e16a6be71041eb", 757 | "sha256:c72956972e4b508dd39fdc7646637a791a9665b478e768ffa5f4fe42123d5de1", 758 | "sha256:dc80c9c6b608bf98066a038e0172013a49cfa9a08d53335aefefda2c64fc68f4", 759 | "sha256:e416c8baf925b5a1aff31f7f5aecc0060b25d50cce3a5a7255dc5cf2f1d4e5eb", 760 | "sha256:f8da84bbc61a4e92af54dc96344f328e5822d574f767e9b08e1602bb5ddc254a", 761 | "sha256:f900ed4ad7a0f1f05d35f955e0943944d5a75f607a836958c6b8ab2a81730ef2", 762 | "sha256:fd6c6c29717724acf9fc1847c4515d57e4dc12762452457b9cb37461f30a81bb" 763 | ], 764 | "version": "==1.54.2" 765 | }, 766 | "grpcio-status": { 767 | "hashes": [ 768 | "sha256:2c33bbdbe20188b2953f46f31af669263b6ee2a9b2d38fa0d36ee091532e21bf", 769 | "sha256:53695f45da07437b7c344ee4ef60d370fd2850179f5a28bb26d8e2aa1102ec11" 770 | ], 771 | "version": "==1.48.2" 772 | }, 773 | "h11": { 774 | "hashes": [ 775 | "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", 776 | "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" 777 | ], 778 | "markers": "python_version >= '3.7'", 779 | "version": "==0.14.0" 780 | }, 781 | "httpcore": { 782 | "hashes": [ 783 | "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb", 784 | "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0" 785 | ], 786 | "markers": "python_version >= '3.7'", 787 | "version": "==0.16.3" 788 | }, 789 | "httplib2": { 790 | "hashes": [ 791 | "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc", 792 | "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81" 793 | ], 794 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 795 | "version": "==0.22.0" 796 | }, 797 | "httpx": { 798 | "hashes": [ 799 | "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9", 800 | "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6" 801 | ], 802 | "markers": "python_version >= '3.7'", 803 | "version": "==0.23.3" 804 | }, 805 | "httpx-oauth": { 806 | "hashes": [ 807 | "sha256:11a2c79111e61a7bd70624606ad6a3013b6756ce4817dd5d5b44f70bacb45940", 808 | "sha256:690e4d0a03b1974b9e600436a6d7a8c064e0707a3d86a41a12153cc797244ac6" 809 | ], 810 | "markers": "python_version >= '3.7'", 811 | "version": "==0.11.2" 812 | }, 813 | "idna": { 814 | "hashes": [ 815 | "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", 816 | "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" 817 | ], 818 | "markers": "python_version >= '3.5'", 819 | "version": "==3.4" 820 | }, 821 | "importlib-metadata": { 822 | "hashes": [ 823 | "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", 824 | "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5" 825 | ], 826 | "markers": "python_version >= '3.7'", 827 | "version": "==6.7.0" 828 | }, 829 | "jinja2": { 830 | "hashes": [ 831 | "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", 832 | "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" 833 | ], 834 | "markers": "python_version >= '3.7'", 835 | "version": "==3.1.2" 836 | }, 837 | "jsonschema": { 838 | "hashes": [ 839 | "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d", 840 | "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6" 841 | ], 842 | "markers": "python_version >= '3.7'", 843 | "version": "==4.17.3" 844 | }, 845 | "langchain": { 846 | "hashes": [ 847 | "sha256:1ea8cfa641a1fc5dbc40d543f4b4fe6f308d0db6460ffb24267f434789bde30d", 848 | "sha256:f6423dcc95d6feaa5e78aeaedd6e1b3ef7a03be0a02c2508dffaab26c83ae858" 849 | ], 850 | "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", 851 | "version": "==0.0.204" 852 | }, 853 | "langchainplus-sdk": { 854 | "hashes": [ 855 | "sha256:e50679309a31d9526f467aa13d4dbcfba0dc00a295cea72ffcc9972865ecac1b", 856 | "sha256:fbe3482ffe253e439ec8386a2904594a875b590e29e4adcbd938452a69a6c7c6" 857 | ], 858 | "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", 859 | "version": "==0.0.11" 860 | }, 861 | "markdown-it-py": { 862 | "hashes": [ 863 | "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", 864 | "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" 865 | ], 866 | "markers": "python_version >= '3.8'", 867 | "version": "==3.0.0" 868 | }, 869 | "markupsafe": { 870 | "hashes": [ 871 | "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", 872 | "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", 873 | "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", 874 | "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", 875 | "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", 876 | "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", 877 | "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", 878 | "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", 879 | "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", 880 | "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", 881 | "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", 882 | "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", 883 | "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", 884 | "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", 885 | "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", 886 | "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", 887 | "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", 888 | "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", 889 | "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", 890 | "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", 891 | "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", 892 | "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", 893 | "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", 894 | "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", 895 | "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", 896 | "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", 897 | "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", 898 | "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", 899 | "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", 900 | "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", 901 | "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", 902 | "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", 903 | "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", 904 | "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", 905 | "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", 906 | "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", 907 | "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc", 908 | "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", 909 | "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48", 910 | "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", 911 | "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e", 912 | "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b", 913 | "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", 914 | "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5", 915 | "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", 916 | "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", 917 | "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", 918 | "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", 919 | "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", 920 | "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2" 921 | ], 922 | "markers": "python_version >= '3.7'", 923 | "version": "==2.1.3" 924 | }, 925 | "marshmallow": { 926 | "hashes": [ 927 | "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78", 928 | "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b" 929 | ], 930 | "markers": "python_version >= '3.7'", 931 | "version": "==3.19.0" 932 | }, 933 | "marshmallow-enum": { 934 | "hashes": [ 935 | "sha256:38e697e11f45a8e64b4a1e664000897c659b60aa57bfa18d44e226a9920b6e58", 936 | "sha256:57161ab3dbfde4f57adeb12090f39592e992b9c86d206d02f6bd03ebec60f072" 937 | ], 938 | "version": "==1.5.1" 939 | }, 940 | "mdurl": { 941 | "hashes": [ 942 | "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", 943 | "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" 944 | ], 945 | "markers": "python_version >= '3.7'", 946 | "version": "==0.1.2" 947 | }, 948 | "msgpack": { 949 | "hashes": [ 950 | "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164", 951 | "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b", 952 | "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c", 953 | "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf", 954 | "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd", 955 | "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d", 956 | "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c", 957 | "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a", 958 | "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e", 959 | "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd", 960 | "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025", 961 | "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5", 962 | "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705", 963 | "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a", 964 | "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d", 965 | "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb", 966 | "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11", 967 | "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f", 968 | "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c", 969 | "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d", 970 | "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea", 971 | "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba", 972 | "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87", 973 | "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a", 974 | "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c", 975 | "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080", 976 | "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198", 977 | "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9", 978 | "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a", 979 | "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b", 980 | "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f", 981 | "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437", 982 | "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f", 983 | "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7", 984 | "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2", 985 | "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0", 986 | "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48", 987 | "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898", 988 | "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0", 989 | "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57", 990 | "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8", 991 | "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282", 992 | "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1", 993 | "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82", 994 | "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc", 995 | "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb", 996 | "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6", 997 | "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7", 998 | "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9", 999 | "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c", 1000 | "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1", 1001 | "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed", 1002 | "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c", 1003 | "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c", 1004 | "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77", 1005 | "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81", 1006 | "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a", 1007 | "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3", 1008 | "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086", 1009 | "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9", 1010 | "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f", 1011 | "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b", 1012 | "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d" 1013 | ], 1014 | "version": "==1.0.5" 1015 | }, 1016 | "multidict": { 1017 | "hashes": [ 1018 | "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9", 1019 | "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8", 1020 | "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03", 1021 | "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710", 1022 | "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161", 1023 | "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664", 1024 | "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569", 1025 | "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067", 1026 | "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313", 1027 | "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706", 1028 | "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2", 1029 | "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636", 1030 | "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49", 1031 | "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93", 1032 | "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603", 1033 | "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0", 1034 | "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60", 1035 | "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4", 1036 | "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e", 1037 | "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1", 1038 | "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60", 1039 | "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951", 1040 | "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc", 1041 | "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe", 1042 | "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95", 1043 | "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d", 1044 | "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8", 1045 | "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed", 1046 | "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2", 1047 | "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775", 1048 | "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87", 1049 | "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c", 1050 | "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2", 1051 | "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98", 1052 | "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3", 1053 | "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe", 1054 | "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78", 1055 | "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660", 1056 | "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176", 1057 | "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e", 1058 | "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988", 1059 | "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c", 1060 | "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c", 1061 | "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0", 1062 | "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449", 1063 | "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f", 1064 | "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde", 1065 | "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5", 1066 | "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d", 1067 | "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac", 1068 | "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a", 1069 | "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9", 1070 | "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca", 1071 | "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11", 1072 | "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35", 1073 | "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063", 1074 | "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b", 1075 | "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982", 1076 | "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258", 1077 | "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1", 1078 | "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52", 1079 | "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480", 1080 | "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7", 1081 | "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461", 1082 | "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d", 1083 | "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc", 1084 | "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779", 1085 | "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a", 1086 | "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547", 1087 | "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0", 1088 | "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171", 1089 | "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf", 1090 | "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d", 1091 | "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba" 1092 | ], 1093 | "markers": "python_version >= '3.7'", 1094 | "version": "==6.0.4" 1095 | }, 1096 | "mypy-extensions": { 1097 | "hashes": [ 1098 | "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", 1099 | "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" 1100 | ], 1101 | "markers": "python_version >= '3.5'", 1102 | "version": "==1.0.0" 1103 | }, 1104 | "numexpr": { 1105 | "hashes": [ 1106 | "sha256:059546e8f6283ccdb47c683101a890844f667fa6d56258d48ae2ecf1b3875957", 1107 | "sha256:17ac9cfe6d0078c5fc06ba1c1bbd20b8783f28c6f475bbabd3cad53683075cab", 1108 | "sha256:3f039321d1c17962c33079987b675fb251b273dbec0f51aac0934e932446ccc3", 1109 | "sha256:5538b30199bfc68886d2be18fcef3abd11d9271767a7a69ff3688defe782800a", 1110 | "sha256:655d84eb09adfee3c09ecf4a89a512225da153fdb7de13c447404b7d0523a9a7", 1111 | "sha256:6931b1e9d4f629f43c14b21d44f3f77997298bea43790cfcdb4dd98804f90783", 1112 | "sha256:6c368aa35ae9b18840e78b05f929d3a7b3abccdba9630a878c7db74ca2368339", 1113 | "sha256:6ee9db7598dd4001138b482342b96d78110dd77cefc051ec75af3295604dde6a", 1114 | "sha256:77898fdf3da6bb96aa8a4759a8231d763a75d848b2f2e5c5279dad0b243c8dfe", 1115 | "sha256:7bca95f4473b444428061d4cda8e59ac564dc7dc6a1dea3015af9805c6bc2946", 1116 | "sha256:7d71add384adc9119568d7e9ffa8a35b195decae81e0abf54a2b7779852f0637", 1117 | "sha256:845a6aa0ed3e2a53239b89c1ebfa8cf052d3cc6e053c72805e8153300078c0b1", 1118 | "sha256:90f12cc851240f7911a47c91aaf223dba753e98e46dff3017282e633602e76a7", 1119 | "sha256:9400781553541f414f82eac056f2b4c965373650df9694286b9bd7e8d413f8d8", 1120 | "sha256:9e34931089a6bafc77aaae21f37ad6594b98aa1085bb8b45d5b3cd038c3c17d9", 1121 | "sha256:9f096d707290a6a00b6ffdaf581ee37331109fb7b6c8744e9ded7c779a48e517", 1122 | "sha256:a38664e699526cb1687aefd9069e2b5b9387da7feac4545de446141f1ef86f46", 1123 | "sha256:a6d2d7740ae83ba5f3531e83afc4b626daa71df1ef903970947903345c37bd03", 1124 | "sha256:a75967d46b6bd56455dd32da6285e5ffabe155d0ee61eef685bbfb8dafb2e484", 1125 | "sha256:b076db98ca65eeaf9bd224576e3ac84c05e451c0bd85b13664b7e5f7b62e2c70", 1126 | "sha256:b318541bf3d8326682ebada087ba0050549a16d8b3fa260dd2585d73a83d20a7", 1127 | "sha256:b96334fc1748e9ec4f93d5fadb1044089d73fb08208fdb8382ed77c893f0be01", 1128 | "sha256:c867cc36cf815a3ec9122029874e00d8fbcef65035c4a5901e9b120dd5d626a2", 1129 | "sha256:d5432537418d18691b9115d615d6daa17ee8275baef3edf1afbbf8bc69806147", 1130 | "sha256:db93cf1842f068247de631bfc8af20118bf1f9447cd929b531595a5e0efc9346", 1131 | "sha256:df35324666b693f13a016bc7957de7cc4d8801b746b81060b671bf78a52b9037", 1132 | "sha256:df3a1f6b24214a1ab826e9c1c99edf1686c8e307547a9aef33910d586f626d01", 1133 | "sha256:eaec59e9bf70ff05615c34a8b8d6c7bd042bd9f55465d7b495ea5436f45319d0", 1134 | "sha256:f3a920bfac2645017110b87ddbe364c9c7a742870a4d2f6120b8786c25dc6db3", 1135 | "sha256:ff5835e8af9a212e8480003d731aad1727aaea909926fd009e8ae6a1cba7f141" 1136 | ], 1137 | "markers": "python_version >= '3.7'", 1138 | "version": "==2.8.4" 1139 | }, 1140 | "numpy": { 1141 | "hashes": [ 1142 | "sha256:0ac6edfb35d2a99aaf102b509c8e9319c499ebd4978df4971b94419a116d0790", 1143 | "sha256:26815c6c8498dc49d81faa76d61078c4f9f0859ce7817919021b9eba72b425e3", 1144 | "sha256:4aedd08f15d3045a4e9c648f1e04daca2ab1044256959f1f95aafeeb3d794c16", 1145 | "sha256:4c69fe5f05eea336b7a740e114dec995e2f927003c30702d896892403df6dbf0", 1146 | "sha256:5177310ac2e63d6603f659fadc1e7bab33dd5a8db4e0596df34214eeab0fee3b", 1147 | "sha256:5aa48bebfb41f93043a796128854b84407d4df730d3fb6e5dc36402f5cd594c0", 1148 | "sha256:5b1b90860bf7d8a8c313b372d4f27343a54f415b20fb69dd601b7efe1029c91e", 1149 | "sha256:6c284907e37f5e04d2412950960894b143a648dea3f79290757eb878b91acbd1", 1150 | "sha256:6d183b5c58513f74225c376643234c369468e02947b47942eacbb23c1671f25d", 1151 | "sha256:7412125b4f18aeddca2ecd7219ea2d2708f697943e6f624be41aa5f8a9852cc4", 1152 | "sha256:7cd981ccc0afe49b9883f14761bb57c964df71124dcd155b0cba2b591f0d64b9", 1153 | "sha256:85cdae87d8c136fd4da4dad1e48064d700f63e923d5af6c8c782ac0df8044542", 1154 | "sha256:8aa130c3042052d656751df5e81f6d61edff3e289b5994edcf77f54118a8d9f4", 1155 | "sha256:95367ccd88c07af21b379be1725b5322362bb83679d36691f124a16357390153", 1156 | "sha256:9c7211d7920b97aeca7b3773a6783492b5b93baba39e7c36054f6e749fc7490c", 1157 | "sha256:9e3f2b96e3b63c978bc29daaa3700c028fe3f049ea3031b58aa33fe2a5809d24", 1158 | "sha256:b76aa836a952059d70a2788a2d98cb2a533ccd46222558b6970348939e55fc24", 1159 | "sha256:b792164e539d99d93e4e5e09ae10f8cbe5466de7d759fc155e075237e0c274e4", 1160 | "sha256:c0dc071017bc00abb7d7201bac06fa80333c6314477b3d10b52b58fa6a6e38f6", 1161 | "sha256:cc3fda2b36482891db1060f00f881c77f9423eead4c3579629940a3e12095fe8", 1162 | "sha256:d6b267f349a99d3908b56645eebf340cb58f01bd1e773b4eea1a905b3f0e4208", 1163 | "sha256:d76a84998c51b8b68b40448ddd02bd1081bb33abcdc28beee6cd284fe11036c6", 1164 | "sha256:e559c6afbca484072a98a51b6fa466aae785cfe89b69e8b856c3191bc8872a82", 1165 | "sha256:ecc68f11404930e9c7ecfc937aa423e1e50158317bf67ca91736a9864eae0232", 1166 | "sha256:f1accae9a28dc3cda46a91de86acf69de0d1b5f4edd44a9b0c3ceb8036dfff19" 1167 | ], 1168 | "markers": "python_version >= '3.9'", 1169 | "version": "==1.25.0" 1170 | }, 1171 | "openai": { 1172 | "hashes": [ 1173 | "sha256:5b2121d8c0a4350626096fa482306d12e246a83b992530d54fd474f309f2882c", 1174 | "sha256:75778ca05759c77dde704985ee16976ba58804212f10e61f44356e68ffb8390e" 1175 | ], 1176 | "index": "pypi", 1177 | "version": "==0.27.5" 1178 | }, 1179 | "openapi-schema-pydantic": { 1180 | "hashes": [ 1181 | "sha256:3e22cf58b74a69f752cc7e5f1537f6e44164282db2700cbbcd3bb99ddd065196", 1182 | "sha256:a932ecc5dcbb308950282088956e94dea069c9823c84e507d64f6b622222098c" 1183 | ], 1184 | "markers": "python_full_version >= '3.6.1'", 1185 | "version": "==1.2.4" 1186 | }, 1187 | "packaging": { 1188 | "hashes": [ 1189 | "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", 1190 | "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" 1191 | ], 1192 | "markers": "python_version >= '3.7'", 1193 | "version": "==23.1" 1194 | }, 1195 | "pandas": { 1196 | "hashes": [ 1197 | "sha256:02755de164da6827764ceb3bbc5f64b35cb12394b1024fdf88704d0fa06e0e2f", 1198 | "sha256:0a1e0576611641acde15c2322228d138258f236d14b749ad9af498ab69089e2d", 1199 | "sha256:1eb09a242184092f424b2edd06eb2b99d06dc07eeddff9929e8667d4ed44e181", 1200 | "sha256:30a89d0fec4263ccbf96f68592fd668939481854d2ff9da709d32a047689393b", 1201 | "sha256:50e451932b3011b61d2961b4185382c92cc8c6ee4658dcd4f320687bb2d000ee", 1202 | "sha256:51a93d422fbb1bd04b67639ba4b5368dffc26923f3ea32a275d2cc450f1d1c86", 1203 | "sha256:598e9020d85a8cdbaa1815eb325a91cfff2bb2b23c1442549b8a3668e36f0f77", 1204 | "sha256:66d00300f188fa5de73f92d5725ced162488f6dc6ad4cecfe4144ca29debe3b8", 1205 | "sha256:69167693cb8f9b3fc060956a5d0a0a8dbfed5f980d9fd2c306fb5b9c855c814c", 1206 | "sha256:6d6d10c2142d11d40d6e6c0a190b1f89f525bcf85564707e31b0a39e3b398e08", 1207 | "sha256:713f2f70abcdade1ddd68fc91577cb090b3544b07ceba78a12f799355a13ee44", 1208 | "sha256:7376e13d28eb16752c398ca1d36ccfe52bf7e887067af9a0474de6331dd948d2", 1209 | "sha256:77550c8909ebc23e56a89f91b40ad01b50c42cfbfab49b3393694a50549295ea", 1210 | "sha256:7b21cb72958fc49ad757685db1919021d99650d7aaba676576c9e88d3889d456", 1211 | "sha256:9ebb9f1c22ddb828e7fd017ea265a59d80461d5a79154b49a4207bd17514d122", 1212 | "sha256:a18e5c72b989ff0f7197707ceddc99828320d0ca22ab50dd1b9e37db45b010c0", 1213 | "sha256:a6b5f14cd24a2ed06e14255ff40fe2ea0cfaef79a8dd68069b7ace74bd6acbba", 1214 | "sha256:b42b120458636a981077cfcfa8568c031b3e8709701315e2bfa866324a83efa8", 1215 | "sha256:c4af689352c4fe3d75b2834933ee9d0ccdbf5d7a8a7264f0ce9524e877820c08", 1216 | "sha256:c7319b6e68de14e6209460f72a8d1ef13c09fb3d3ef6c37c1e65b35d50b5c145", 1217 | "sha256:cf3f0c361a4270185baa89ec7ab92ecaa355fe783791457077473f974f654df5", 1218 | "sha256:dd46bde7309088481b1cf9c58e3f0e204b9ff9e3244f441accd220dd3365ce7c", 1219 | "sha256:dd5476b6c3fe410ee95926873f377b856dbc4e81a9c605a0dc05aaccc6a7c6c6", 1220 | "sha256:e69140bc2d29a8556f55445c15f5794490852af3de0f609a24003ef174528b79", 1221 | "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774" 1222 | ], 1223 | "markers": "python_version >= '3.8'", 1224 | "version": "==2.0.2" 1225 | }, 1226 | "pillow": { 1227 | "hashes": [ 1228 | "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1", 1229 | "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba", 1230 | "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a", 1231 | "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799", 1232 | "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51", 1233 | "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb", 1234 | "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5", 1235 | "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270", 1236 | "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6", 1237 | "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47", 1238 | "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf", 1239 | "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e", 1240 | "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b", 1241 | "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66", 1242 | "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865", 1243 | "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec", 1244 | "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c", 1245 | "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1", 1246 | "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38", 1247 | "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906", 1248 | "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705", 1249 | "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef", 1250 | "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc", 1251 | "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f", 1252 | "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf", 1253 | "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392", 1254 | "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d", 1255 | "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe", 1256 | "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32", 1257 | "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5", 1258 | "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7", 1259 | "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44", 1260 | "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d", 1261 | "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3", 1262 | "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625", 1263 | "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e", 1264 | "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829", 1265 | "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089", 1266 | "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3", 1267 | "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78", 1268 | "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96", 1269 | "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964", 1270 | "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597", 1271 | "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99", 1272 | "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a", 1273 | "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140", 1274 | "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7", 1275 | "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16", 1276 | "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903", 1277 | "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1", 1278 | "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296", 1279 | "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572", 1280 | "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115", 1281 | "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a", 1282 | "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd", 1283 | "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4", 1284 | "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1", 1285 | "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb", 1286 | "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa", 1287 | "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a", 1288 | "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569", 1289 | "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c", 1290 | "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf", 1291 | "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082", 1292 | "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062", 1293 | "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579" 1294 | ], 1295 | "markers": "python_version >= '3.7'", 1296 | "version": "==9.5.0" 1297 | }, 1298 | "promptlayer": { 1299 | "hashes": [ 1300 | "sha256:a7ed3875416d4f29c07a3f5ffe803b42ed9745d741f79cd4ed164deb3f312f3e" 1301 | ], 1302 | "index": "pypi", 1303 | "version": "==0.1.89" 1304 | }, 1305 | "proto-plus": { 1306 | "hashes": [ 1307 | "sha256:0e8cda3d5a634d9895b75c573c9352c16486cb75deb0e078b5fda34db4243165", 1308 | "sha256:de34e52d6c9c6fcd704192f09767cb561bb4ee64e70eede20b0834d841f0be4d" 1309 | ], 1310 | "markers": "python_version >= '3.6'", 1311 | "version": "==1.22.2" 1312 | }, 1313 | "protobuf": { 1314 | "hashes": [ 1315 | "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7", 1316 | "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c", 1317 | "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2", 1318 | "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b", 1319 | "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050", 1320 | "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9", 1321 | "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7", 1322 | "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454", 1323 | "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480", 1324 | "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469", 1325 | "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c", 1326 | "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e", 1327 | "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db", 1328 | "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905", 1329 | "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b", 1330 | "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86", 1331 | "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4", 1332 | "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402", 1333 | "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7", 1334 | "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4", 1335 | "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99", 1336 | "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee" 1337 | ], 1338 | "markers": "python_version >= '3.7'", 1339 | "version": "==3.20.3" 1340 | }, 1341 | "pyarrow": { 1342 | "hashes": [ 1343 | "sha256:051f9f5ccf585f12d7de836e50965b3c235542cc896959320d9776ab93f3b33d", 1344 | "sha256:1887bdae17ec3b4c046fcf19951e71b6a619f39fa674f9881216173566c8f718", 1345 | "sha256:2d3c4cbbf81e6dd23fe921bc91dc4619ea3b79bc58ef10bce0f49bdafb103daf", 1346 | "sha256:345e1828efdbd9aa4d4de7d5676778aba384a2c3add896d995b23d368e60e5af", 1347 | "sha256:3de26da901216149ce086920547dfff5cd22818c9eab67ebc41e863a5883bac7", 1348 | "sha256:43364daec02f69fec89d2315f7fbfbeec956e0d991cbbef471681bd77875c40f", 1349 | "sha256:459a1c0ed2d68671188b2118c63bac91eaef6fc150c77ddd8a583e3c795737bf", 1350 | "sha256:6251e38470da97a5b2e00de5c6a049149f7b2bd62f12fa5dbb9ac674119ba71a", 1351 | "sha256:6895b5fb74289d055c43db3af0de6e16b07586c45763cb5e558d38b86a91e3a7", 1352 | "sha256:6d288029a94a9bb5407ceebdd7110ba398a00412c5b0155ee9813a40d246c5df", 1353 | "sha256:749be7fd2ff260683f9cc739cb862fb11be376de965a2a8ccbf2693b098db6c7", 1354 | "sha256:85e705e33eaf666bbe508a16fd5ba27ca061e177916b7a317ba5a51bee43384c", 1355 | "sha256:8d6009fdf8986332b2169314da482baed47ac053311c8934ac6651e614deacd6", 1356 | "sha256:9120c3eb2b1f6f516a3b7a9714ed860882d9ef98c4b17edcdc91d95b7528db60", 1357 | "sha256:a3c63124fc26bf5f95f508f5d04e1ece8cc23a8b0af2a1e6ab2b1ec3fdc91b24", 1358 | "sha256:b13329f79fa4472324f8d32dc1b1216616d09bd1e77cfb13104dec5463632c36", 1359 | "sha256:bb656150d3d12ec1396f6dde542db1675a95c0cc8366d507347b0beed96e87ca", 1360 | "sha256:be2757e9275875d2a9c6e6052ac7957fbbfc7bc7370e4a036a9b893e96fedaba", 1361 | "sha256:c780f4dc40460015d80fcd6a6140de80b615349ed68ef9adb653fe351778c9b3", 1362 | "sha256:cce317fc96e5b71107bf1f9f184d5e54e2bd14bbf3f9a3d62819961f0af86fec", 1363 | "sha256:cdacf515ec276709ac8042c7d9bd5be83b4f5f39c6c037a17a60d7ebfd92c890", 1364 | "sha256:ce4aebdf412bd0eeb800d8e47db854f9f9f7e2f5a0220440acf219ddfddd4f63", 1365 | "sha256:cf812306d66f40f69e684300f7af5111c11f6e0d89d6b733e05a3de44961529d", 1366 | "sha256:e0d8730c7f6e893f6db5d5b86eda42c0a130842d101992b581e2138e4d5663d3", 1367 | "sha256:e2c9cb8eeabbadf5fcfc3d1ddea616c7ce893db2ce4dcef0ac13b099ad7ca082" 1368 | ], 1369 | "markers": "python_version >= '3.7'", 1370 | "version": "==12.0.1" 1371 | }, 1372 | "pyasn1": { 1373 | "hashes": [ 1374 | "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57", 1375 | "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde" 1376 | ], 1377 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", 1378 | "version": "==0.5.0" 1379 | }, 1380 | "pyasn1-modules": { 1381 | "hashes": [ 1382 | "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c", 1383 | "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d" 1384 | ], 1385 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", 1386 | "version": "==0.3.0" 1387 | }, 1388 | "pycparser": { 1389 | "hashes": [ 1390 | "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", 1391 | "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" 1392 | ], 1393 | "version": "==2.21" 1394 | }, 1395 | "pydantic": { 1396 | "hashes": [ 1397 | "sha256:07293ab08e7b4d3c9d7de4949a0ea571f11e4557d19ea24dd3ae0c524c0c334d", 1398 | "sha256:0a2aabdc73c2a5960e87c3ffebca6ccde88665616d1fd6d3db3178ef427b267a", 1399 | "sha256:0da48717dc9495d3a8f215e0d012599db6b8092db02acac5e0d58a65248ec5bc", 1400 | "sha256:128d9453d92e6e81e881dd7e2484e08d8b164da5507f62d06ceecf84bf2e21d3", 1401 | "sha256:2196c06484da2b3fded1ab6dbe182bdabeb09f6318b7fdc412609ee2b564c49a", 1402 | "sha256:2e9aec8627a1a6823fc62fb96480abe3eb10168fd0d859ee3d3b395105ae19a7", 1403 | "sha256:3283b574b01e8dbc982080d8287c968489d25329a463b29a90d4157de4f2baaf", 1404 | "sha256:3c52eb595db83e189419bf337b59154bdcca642ee4b2a09e5d7797e41ace783f", 1405 | "sha256:4b466a23009ff5cdd7076eb56aca537c745ca491293cc38e72bf1e0e00de5b91", 1406 | "sha256:517a681919bf880ce1dac7e5bc0c3af1e58ba118fd774da2ffcd93c5f96eaece", 1407 | "sha256:5f8bbaf4013b9a50e8100333cc4e3fa2f81214033e05ac5aa44fa24a98670a29", 1408 | "sha256:6257bb45ad78abacda13f15bde5886efd6bf549dd71085e64b8dcf9919c38b60", 1409 | "sha256:67195274fd27780f15c4c372f4ba9a5c02dad6d50647b917b6a92bf00b3d301a", 1410 | "sha256:6cafde02f6699ce4ff643417d1a9223716ec25e228ddc3b436fe7e2d25a1f305", 1411 | "sha256:73ef93e5e1d3c8e83f1ff2e7fdd026d9e063c7e089394869a6e2985696693766", 1412 | "sha256:7845b31959468bc5b78d7b95ec52fe5be32b55d0d09983a877cca6aedc51068f", 1413 | "sha256:7847ca62e581e6088d9000f3c497267868ca2fa89432714e21a4fb33a04d52e8", 1414 | "sha256:7e1d5290044f620f80cf1c969c542a5468f3656de47b41aa78100c5baa2b8276", 1415 | "sha256:7ee829b86ce984261d99ff2fd6e88f2230068d96c2a582f29583ed602ef3fc2c", 1416 | "sha256:83fcff3c7df7adff880622a98022626f4f6dbce6639a88a15a3ce0f96466cb60", 1417 | "sha256:939328fd539b8d0edf244327398a667b6b140afd3bf7e347cf9813c736211896", 1418 | "sha256:95c70da2cd3b6ddf3b9645ecaa8d98f3d80c606624b6d245558d202cd23ea3be", 1419 | "sha256:963671eda0b6ba6926d8fc759e3e10335e1dc1b71ff2a43ed2efd6996634dafb", 1420 | "sha256:970b1bdc6243ef663ba5c7e36ac9ab1f2bfecb8ad297c9824b542d41a750b298", 1421 | "sha256:9863b9420d99dfa9c064042304868e8ba08e89081428a1c471858aa2af6f57c4", 1422 | "sha256:ad428e92ab68798d9326bb3e5515bc927444a3d71a93b4a2ca02a8a5d795c572", 1423 | "sha256:b48d3d634bca23b172f47f2335c617d3fcb4b3ba18481c96b7943a4c634f5c8d", 1424 | "sha256:b9cd67fb763248cbe38f0593cd8611bfe4b8ad82acb3bdf2b0898c23415a1f82", 1425 | "sha256:d111a21bbbfd85c17248130deac02bbd9b5e20b303338e0dbe0faa78330e37e0", 1426 | "sha256:e1aa5c2410769ca28aa9a7841b80d9d9a1c5f223928ca8bec7e7c9a34d26b1d4", 1427 | "sha256:e692dec4a40bfb40ca530e07805b1208c1de071a18d26af4a2a0d79015b352ca", 1428 | "sha256:e7c9900b43ac14110efa977be3da28931ffc74c27e96ee89fbcaaf0b0fe338e1", 1429 | "sha256:eec39224b2b2e861259d6f3c8b6290d4e0fbdce147adb797484a42278a1a486f", 1430 | "sha256:f0b7628fb8efe60fe66fd4adadd7ad2304014770cdc1f4934db41fe46cc8825f", 1431 | "sha256:f50e1764ce9353be67267e7fd0da08349397c7db17a562ad036aa7c8f4adfdb6", 1432 | "sha256:fab81a92f42d6d525dd47ced310b0c3e10c416bbfae5d59523e63ea22f82b31e" 1433 | ], 1434 | "markers": "python_version >= '3.7'", 1435 | "version": "==1.10.9" 1436 | }, 1437 | "pydeck": { 1438 | "hashes": [ 1439 | "sha256:9e0a67890ab061b8c6080e06f8c780934c00355a7114291c884f055f3fc0dc25", 1440 | "sha256:c89b3dd76f9991140a33b886b336c762105e9c9def8e842e891bc72dbce8a4ce" 1441 | ], 1442 | "markers": "python_version >= '3.7'", 1443 | "version": "==0.8.1b0" 1444 | }, 1445 | "pygments": { 1446 | "hashes": [ 1447 | "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c", 1448 | "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1" 1449 | ], 1450 | "markers": "python_version >= '3.7'", 1451 | "version": "==2.15.1" 1452 | }, 1453 | "pyjwt": { 1454 | "extras": [ 1455 | "crypto" 1456 | ], 1457 | "hashes": [ 1458 | "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1", 1459 | "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074" 1460 | ], 1461 | "markers": "python_version >= '3.7'", 1462 | "version": "==2.7.0" 1463 | }, 1464 | "pympler": { 1465 | "hashes": [ 1466 | "sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa", 1467 | "sha256:d260dda9ae781e1eab6ea15bacb84015849833ba5555f141d2d9b7b7473b307d" 1468 | ], 1469 | "markers": "python_version >= '3.6'", 1470 | "version": "==1.0.1" 1471 | }, 1472 | "pyparsing": { 1473 | "hashes": [ 1474 | "sha256:d554a96d1a7d3ddaf7183104485bc19fd80543ad6ac5bdb6426719d766fb06c1", 1475 | "sha256:edb662d6fe322d6e990b1594b5feaeadf806803359e3d4d42f11e295e588f0ea" 1476 | ], 1477 | "markers": "python_version >= '3.1'", 1478 | "version": "==3.1.0" 1479 | }, 1480 | "pyrsistent": { 1481 | "hashes": [ 1482 | "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8", 1483 | "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440", 1484 | "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a", 1485 | "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c", 1486 | "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3", 1487 | "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393", 1488 | "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9", 1489 | "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da", 1490 | "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf", 1491 | "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64", 1492 | "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a", 1493 | "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3", 1494 | "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98", 1495 | "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2", 1496 | "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8", 1497 | "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf", 1498 | "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc", 1499 | "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7", 1500 | "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28", 1501 | "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2", 1502 | "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b", 1503 | "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a", 1504 | "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64", 1505 | "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19", 1506 | "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1", 1507 | "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9", 1508 | "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c" 1509 | ], 1510 | "markers": "python_version >= '3.7'", 1511 | "version": "==0.19.3" 1512 | }, 1513 | "python-dateutil": { 1514 | "hashes": [ 1515 | "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", 1516 | "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" 1517 | ], 1518 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1519 | "version": "==2.8.2" 1520 | }, 1521 | "python-dotenv": { 1522 | "hashes": [ 1523 | "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba", 1524 | "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a" 1525 | ], 1526 | "index": "pypi", 1527 | "version": "==1.0.0" 1528 | }, 1529 | "pytz": { 1530 | "hashes": [ 1531 | "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", 1532 | "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb" 1533 | ], 1534 | "version": "==2023.3" 1535 | }, 1536 | "pyyaml": { 1537 | "hashes": [ 1538 | "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", 1539 | "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", 1540 | "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", 1541 | "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", 1542 | "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", 1543 | "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", 1544 | "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", 1545 | "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", 1546 | "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", 1547 | "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", 1548 | "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", 1549 | "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", 1550 | "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", 1551 | "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", 1552 | "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", 1553 | "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", 1554 | "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", 1555 | "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", 1556 | "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", 1557 | "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", 1558 | "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", 1559 | "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", 1560 | "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", 1561 | "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", 1562 | "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", 1563 | "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", 1564 | "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", 1565 | "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", 1566 | "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", 1567 | "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", 1568 | "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", 1569 | "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", 1570 | "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", 1571 | "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", 1572 | "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", 1573 | "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", 1574 | "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", 1575 | "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", 1576 | "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", 1577 | "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" 1578 | ], 1579 | "markers": "python_version >= '3.6'", 1580 | "version": "==6.0" 1581 | }, 1582 | "requests": { 1583 | "hashes": [ 1584 | "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", 1585 | "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" 1586 | ], 1587 | "markers": "python_version >= '3.7'", 1588 | "version": "==2.31.0" 1589 | }, 1590 | "rfc3986": { 1591 | "extras": [ 1592 | "idna2008" 1593 | ], 1594 | "hashes": [ 1595 | "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835", 1596 | "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97" 1597 | ], 1598 | "version": "==1.5.0" 1599 | }, 1600 | "rich": { 1601 | "hashes": [ 1602 | "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec", 1603 | "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898" 1604 | ], 1605 | "markers": "python_full_version >= '3.7.0'", 1606 | "version": "==13.4.2" 1607 | }, 1608 | "rsa": { 1609 | "hashes": [ 1610 | "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", 1611 | "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21" 1612 | ], 1613 | "markers": "python_version >= '3.6' and python_version < '4'", 1614 | "version": "==4.9" 1615 | }, 1616 | "six": { 1617 | "hashes": [ 1618 | "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", 1619 | "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" 1620 | ], 1621 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1622 | "version": "==1.16.0" 1623 | }, 1624 | "smmap": { 1625 | "hashes": [ 1626 | "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94", 1627 | "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936" 1628 | ], 1629 | "markers": "python_version >= '3.6'", 1630 | "version": "==5.0.0" 1631 | }, 1632 | "sniffio": { 1633 | "hashes": [ 1634 | "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", 1635 | "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" 1636 | ], 1637 | "markers": "python_version >= '3.7'", 1638 | "version": "==1.3.0" 1639 | }, 1640 | "sqlalchemy": { 1641 | "hashes": [ 1642 | "sha256:0db6734cb5644c55d0262a813b764c6e2cda1e66e939a488b3d6298cdc7344c2", 1643 | "sha256:0e4645b260cfe375a0603aa117f0a47680864cf37833129da870919e88b08d8f", 1644 | "sha256:131f0c894c6572cb1bdcf97c92d999d3128c4ff1ca13061296057072f61afe13", 1645 | "sha256:1e2caba78e7d1f5003e88817b7a1754d4e58f4a8f956dc423bf8e304c568ab09", 1646 | "sha256:2de1477af7f48c633b8ecb88245aedd811dca88e88aee9e9d787b388abe74c44", 1647 | "sha256:2f3b6c31b915159b96b68372212fa77f69230b0a32acab40cf539d2823954f5a", 1648 | "sha256:3ef876615ff4b53e2033022195830ec4941a6e21068611f8d77de60203b90a98", 1649 | "sha256:43e69c8c1cea0188b7094e22fb93ae1a1890aac748628b7e925024a206f75368", 1650 | "sha256:53081c6fce0d49bb36d05f12dc87e008c9b0df58a163b792c5fc4ac638925f98", 1651 | "sha256:5a934eff1a2882137be3384826f997db8441d43b61fda3094923e69fffe474be", 1652 | "sha256:5e8522b49e0e640287308b68f71cc338446bbe1c226c8f81743baa91b0246e92", 1653 | "sha256:61f2035dea56ff1a429077e481496f813378beb02b823d2e3e7eb05bc1a7a8ca", 1654 | "sha256:63ea36c08792a7a8a08958bc806ecff6b491386feeaf14607c3d9d2d9325e67f", 1655 | "sha256:6e85e315725807c127ad8ba3d628fdb861cf9ebfb0e10c39a97c01e257cdd71b", 1656 | "sha256:7641f6ed2682de84d77c4894cf2e43700f3cf7a729361d7f9cac98febf3d8614", 1657 | "sha256:7be04dbe3470fe8dd332fdb48c979887c381ef6c635eddf2dec43d2766111be4", 1658 | "sha256:81d867c1be5abd49f7e547c108391f371a9d980ba7ec34666c50d683f782b754", 1659 | "sha256:8544c6e62eacb77d5106e2055ef10f2407fc0dbd547e879f8745b2032eefd2bc", 1660 | "sha256:8d3cbdb2f07fb0e4b897dc1df39166735e194fb946f28f26f4c9f9801c8b24f7", 1661 | "sha256:8d6ef848e5afcd1bda3e9a843751f845c0ca888b61e669237680e913d84ec206", 1662 | "sha256:8e2569dac4e3cb85365b91ab569d06a221e0e17e65ce59949d00c3958946282b", 1663 | "sha256:90d320fde566b864adbc19abb40ecb80f4e25d6f084639969bb972d5cca16858", 1664 | "sha256:91eb8f89fcce8f709f8a4d65d265bc48a80264ee14c7c9e955f3222f19b4b39c", 1665 | "sha256:a08a791c75d6154d46914d1e23bd81d9455f2950ec1de81f2723848c593d2c8b", 1666 | "sha256:a2e9f50a906d0b81292576a9fb458f8cace904c81a67088f4a2ca9ff2856f55d", 1667 | "sha256:a5a2856e12cf5f54301ddf043bcbf0552561d61555e1bcf348b63f42b8e1eec2", 1668 | "sha256:b2801f85c5c0293aa710f8aa5262c707a83c1c203962ae5a22b4d9095e71aa9d", 1669 | "sha256:b72f4e4def50414164a1d899f2ce4e782a029fad0ed5585981d1611e8ae29a74", 1670 | "sha256:bdaf89dd82f4a0e1b8b5ffc9cdc0c9551be6175f7eee5af6a838e92ba2e57100", 1671 | "sha256:c5e333b81fe10d14efebd4e9429b7bb865ed9463ca8bef07a7136dfa1fd4a37b", 1672 | "sha256:ce1fc3f64fd42d5f763d6b83651471f32920338a1ba107a3186211474861af57", 1673 | "sha256:d0c96592f54edd571e00ba6b1ed5df8263328ca1da9e78088c0ebc93c2e6562c", 1674 | "sha256:dc97238fa44be86971270943a0c21c19ce18b8d1596919048e57912e8abc02cc", 1675 | "sha256:e19546924f0cf2ec930d1faf318b7365e5827276410a513340f31a2b423e96a4", 1676 | "sha256:f2938edc512dd1fa48653e14c1655ab46144d4450f0e6b33da7acd8ba77fbfd7", 1677 | "sha256:f387b496a4c9474d8580195bb2660264a3f295a04d3a9d00f4fa15e9e597427e", 1678 | "sha256:f409f35a0330ab0cb18ece736b86d8b8233c64f4461fcb10993f67afc0ac7e5a", 1679 | "sha256:f662cf69484c59f8a3435902c40dfc34d86050bdb15e23d437074ce9f153306b", 1680 | "sha256:fbcc51fdbc89fafe4f4fe66f59372a8be88ded04de34ef438ab04f980beb12d4", 1681 | "sha256:fc1dae11bd5167f9eb53b3ccad24a79813004612141e76de21cf4c028dc30b34", 1682 | "sha256:ff6496ad5e9dc8baeb93a151cc2f599d01e5f8928a2aaf0b09a06428fdbaf553" 1683 | ], 1684 | "markers": "python_version >= '3.7'", 1685 | "version": "==2.0.16" 1686 | }, 1687 | "streamlit": { 1688 | "hashes": [ 1689 | "sha256:520dd9b9e6efb559b5a9a22feadb48b1e6f0340ec83da3514810059fdecd4167", 1690 | "sha256:5bef9bf8deef32814d9565c9df48331e6357eb0b90dabc3ec4f53c44fb34fc73" 1691 | ], 1692 | "index": "pypi", 1693 | "version": "==1.22.0" 1694 | }, 1695 | "streamlit-oauth": { 1696 | "hashes": [ 1697 | "sha256:8e573866da39d2cb9f3420700bbf9a974c7ef5e402f60005406270bb79a8019e", 1698 | "sha256:91eec2752ae5190e769c3a7fad20b65a6b668b65b8ccb2d7f028f9a00e22b676" 1699 | ], 1700 | "index": "pypi", 1701 | "version": "==0.0.1" 1702 | }, 1703 | "tenacity": { 1704 | "hashes": [ 1705 | "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0", 1706 | "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0" 1707 | ], 1708 | "markers": "python_version >= '3.6'", 1709 | "version": "==8.2.2" 1710 | }, 1711 | "toml": { 1712 | "hashes": [ 1713 | "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", 1714 | "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" 1715 | ], 1716 | "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1717 | "version": "==0.10.2" 1718 | }, 1719 | "toolz": { 1720 | "hashes": [ 1721 | "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f", 1722 | "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194" 1723 | ], 1724 | "markers": "python_version >= '3.5'", 1725 | "version": "==0.12.0" 1726 | }, 1727 | "tornado": { 1728 | "hashes": [ 1729 | "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4", 1730 | "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf", 1731 | "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d", 1732 | "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba", 1733 | "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe", 1734 | "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411", 1735 | "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2", 1736 | "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0", 1737 | "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c", 1738 | "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f", 1739 | "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829" 1740 | ], 1741 | "markers": "python_version >= '3.8'", 1742 | "version": "==6.3.2" 1743 | }, 1744 | "tqdm": { 1745 | "hashes": [ 1746 | "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5", 1747 | "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671" 1748 | ], 1749 | "markers": "python_version >= '3.7'", 1750 | "version": "==4.65.0" 1751 | }, 1752 | "typing-extensions": { 1753 | "hashes": [ 1754 | "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26", 1755 | "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5" 1756 | ], 1757 | "markers": "python_version >= '3.7'", 1758 | "version": "==4.6.3" 1759 | }, 1760 | "typing-inspect": { 1761 | "hashes": [ 1762 | "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", 1763 | "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78" 1764 | ], 1765 | "version": "==0.9.0" 1766 | }, 1767 | "tzdata": { 1768 | "hashes": [ 1769 | "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a", 1770 | "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda" 1771 | ], 1772 | "markers": "python_version >= '2'", 1773 | "version": "==2023.3" 1774 | }, 1775 | "tzlocal": { 1776 | "hashes": [ 1777 | "sha256:46eb99ad4bdb71f3f72b7d24f4267753e240944ecfc16f25d2719ba89827a803", 1778 | "sha256:f3596e180296aaf2dbd97d124fe76ae3a0e3d32b258447de7b939b3fd4be992f" 1779 | ], 1780 | "markers": "python_version >= '3.7'", 1781 | "version": "==5.0.1" 1782 | }, 1783 | "uritemplate": { 1784 | "hashes": [ 1785 | "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0", 1786 | "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e" 1787 | ], 1788 | "markers": "python_version >= '3.6'", 1789 | "version": "==4.1.1" 1790 | }, 1791 | "urllib3": { 1792 | "hashes": [ 1793 | "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f", 1794 | "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14" 1795 | ], 1796 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", 1797 | "version": "==1.26.16" 1798 | }, 1799 | "validators": { 1800 | "hashes": [ 1801 | "sha256:24148ce4e64100a2d5e267233e23e7afeb55316b47d30faae7eb6e7292bc226a" 1802 | ], 1803 | "markers": "python_version >= '3.4'", 1804 | "version": "==0.20.0" 1805 | }, 1806 | "watchdog": { 1807 | "hashes": [ 1808 | "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a", 1809 | "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100", 1810 | "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8", 1811 | "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc", 1812 | "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae", 1813 | "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41", 1814 | "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0", 1815 | "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f", 1816 | "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c", 1817 | "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9", 1818 | "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3", 1819 | "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709", 1820 | "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83", 1821 | "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759", 1822 | "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9", 1823 | "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3", 1824 | "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7", 1825 | "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f", 1826 | "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346", 1827 | "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674", 1828 | "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397", 1829 | "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96", 1830 | "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d", 1831 | "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a", 1832 | "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64", 1833 | "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44", 1834 | "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33" 1835 | ], 1836 | "index": "pypi", 1837 | "version": "==3.0.0" 1838 | }, 1839 | "yarl": { 1840 | "hashes": [ 1841 | "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571", 1842 | "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3", 1843 | "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3", 1844 | "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c", 1845 | "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7", 1846 | "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04", 1847 | "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191", 1848 | "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea", 1849 | "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4", 1850 | "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4", 1851 | "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095", 1852 | "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e", 1853 | "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74", 1854 | "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef", 1855 | "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33", 1856 | "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde", 1857 | "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45", 1858 | "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf", 1859 | "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b", 1860 | "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac", 1861 | "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0", 1862 | "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528", 1863 | "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716", 1864 | "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb", 1865 | "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18", 1866 | "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72", 1867 | "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6", 1868 | "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582", 1869 | "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5", 1870 | "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368", 1871 | "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc", 1872 | "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9", 1873 | "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be", 1874 | "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a", 1875 | "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80", 1876 | "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8", 1877 | "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6", 1878 | "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417", 1879 | "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574", 1880 | "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59", 1881 | "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608", 1882 | "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82", 1883 | "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1", 1884 | "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3", 1885 | "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d", 1886 | "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8", 1887 | "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc", 1888 | "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac", 1889 | "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8", 1890 | "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955", 1891 | "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0", 1892 | "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367", 1893 | "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb", 1894 | "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a", 1895 | "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623", 1896 | "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2", 1897 | "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6", 1898 | "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7", 1899 | "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4", 1900 | "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051", 1901 | "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938", 1902 | "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8", 1903 | "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9", 1904 | "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3", 1905 | "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5", 1906 | "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9", 1907 | "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333", 1908 | "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185", 1909 | "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3", 1910 | "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560", 1911 | "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b", 1912 | "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7", 1913 | "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78", 1914 | "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7" 1915 | ], 1916 | "markers": "python_version >= '3.7'", 1917 | "version": "==1.9.2" 1918 | }, 1919 | "zipp": { 1920 | "hashes": [ 1921 | "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", 1922 | "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556" 1923 | ], 1924 | "markers": "python_version >= '3.7'", 1925 | "version": "==3.15.0" 1926 | } 1927 | }, 1928 | "develop": { 1929 | "cfgv": { 1930 | "hashes": [ 1931 | "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426", 1932 | "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736" 1933 | ], 1934 | "markers": "python_full_version >= '3.6.1'", 1935 | "version": "==3.3.1" 1936 | }, 1937 | "distlib": { 1938 | "hashes": [ 1939 | "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46", 1940 | "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e" 1941 | ], 1942 | "version": "==0.3.6" 1943 | }, 1944 | "filelock": { 1945 | "hashes": [ 1946 | "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81", 1947 | "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec" 1948 | ], 1949 | "markers": "python_version >= '3.7'", 1950 | "version": "==3.12.2" 1951 | }, 1952 | "identify": { 1953 | "hashes": [ 1954 | "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4", 1955 | "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d" 1956 | ], 1957 | "markers": "python_version >= '3.7'", 1958 | "version": "==2.5.24" 1959 | }, 1960 | "nodeenv": { 1961 | "hashes": [ 1962 | "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2", 1963 | "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec" 1964 | ], 1965 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", 1966 | "version": "==1.8.0" 1967 | }, 1968 | "platformdirs": { 1969 | "hashes": [ 1970 | "sha256:57e28820ca8094678b807ff529196506d7a21e17156cb1cddb3e74cebce54640", 1971 | "sha256:ffa199e3fbab8365778c4a10e1fbf1b9cd50707de826eb304b50e57ec0cc8d38" 1972 | ], 1973 | "markers": "python_version >= '3.7'", 1974 | "version": "==3.6.0" 1975 | }, 1976 | "pre-commit": { 1977 | "hashes": [ 1978 | "sha256:10badb65d6a38caff29703362271d7dca483d01da88f9d7e05d0b97171c136cb", 1979 | "sha256:a2256f489cd913d575c145132ae196fe335da32d91a8294b7afe6622335dd023" 1980 | ], 1981 | "index": "pypi", 1982 | "version": "==3.3.3" 1983 | }, 1984 | "pyyaml": { 1985 | "hashes": [ 1986 | "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", 1987 | "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", 1988 | "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", 1989 | "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", 1990 | "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", 1991 | "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", 1992 | "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", 1993 | "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", 1994 | "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", 1995 | "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", 1996 | "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", 1997 | "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", 1998 | "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", 1999 | "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", 2000 | "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", 2001 | "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", 2002 | "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", 2003 | "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", 2004 | "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", 2005 | "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", 2006 | "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", 2007 | "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", 2008 | "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", 2009 | "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", 2010 | "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", 2011 | "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", 2012 | "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", 2013 | "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", 2014 | "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", 2015 | "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", 2016 | "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", 2017 | "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", 2018 | "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", 2019 | "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", 2020 | "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", 2021 | "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", 2022 | "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", 2023 | "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", 2024 | "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", 2025 | "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" 2026 | ], 2027 | "markers": "python_version >= '3.6'", 2028 | "version": "==6.0" 2029 | }, 2030 | "setuptools": { 2031 | "hashes": [ 2032 | "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f", 2033 | "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102" 2034 | ], 2035 | "markers": "python_version >= '3.7'", 2036 | "version": "==67.8.0" 2037 | }, 2038 | "virtualenv": { 2039 | "hashes": [ 2040 | "sha256:34da10f14fea9be20e0fd7f04aba9732f84e593dac291b757ce42e3368a39419", 2041 | "sha256:8ff19a38c1021c742148edc4f81cb43d7f8c6816d2ede2ab72af5b84c749ade1" 2042 | ], 2043 | "markers": "python_version >= '3.7'", 2044 | "version": "==20.23.1" 2045 | } 2046 | } 2047 | } 2048 | --------------------------------------------------------------------------------