diff --git a/.all-contributorsrc b/.all-contributorsrc
new file mode 100644
index 0000000..e8a8515
--- /dev/null
+++ b/.all-contributorsrc
@@ -0,0 +1,15 @@
+{
+ "projectName": "aiohappyeyeballs",
+ "projectOwner": "bdraco",
+ "repoType": "github",
+ "repoHost": "https://github.com",
+ "files": [
+ "README.md"
+ ],
+ "imageSize": 80,
+ "commit": true,
+ "commitConvention": "angular",
+ "contributors": [],
+ "contributorsPerLine": 7,
+ "skipCi": true
+}
diff --git a/.copier-answers.yml b/.copier-answers.yml
new file mode 100644
index 0000000..068bcfa
--- /dev/null
+++ b/.copier-answers.yml
@@ -0,0 +1,20 @@
+# Changes here will be overwritten by Copier
+_commit: b09ed7d
+_src_path: gh:browniebroke/pypackage-template
+add_me_as_contributor: false
+copyright_year: '2023'
+documentation: true
+email: nick@koston.org
+full_name: J. Nick Koston
+github_username: bdraco
+has_cli: false
+initial_commit: true
+open_source_license: Apache Software License 2.0
+package_name: aiohappyeyeballs
+project_name: aiohappyeyeballs
+project_short_description: Happy Eyeballs
+project_slug: aiohappyeyeballs
+run_poetry_install: true
+setup_github: true
+setup_pre_commit: true
+
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..d4a2c44
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,21 @@
+# http://editorconfig.org
+
+root = true
+
+[*]
+indent_style = space
+indent_size = 4
+trim_trailing_whitespace = true
+insert_final_newline = true
+charset = utf-8
+end_of_line = lf
+
+[*.bat]
+indent_style = tab
+end_of_line = crlf
+
+[LICENSE]
+insert_final_newline = false
+
+[Makefile]
+indent_style = tab
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..83df482
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+github: ["bdraco"]
diff --git a/.github/ISSUE_TEMPLATE/1-bug_report.md b/.github/ISSUE_TEMPLATE/1-bug_report.md
new file mode 100644
index 0000000..4644945
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/1-bug_report.md
@@ -0,0 +1,14 @@
+---
+name: Bug report
+about: Create a report to help us improve
+labels: bug
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/2-feature-request.md b/.github/ISSUE_TEMPLATE/2-feature-request.md
new file mode 100644
index 0000000..a4c01cc
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/2-feature-request.md
@@ -0,0 +1,14 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+labels: enhancement
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/.github/labels.toml b/.github/labels.toml
new file mode 100644
index 0000000..56865be
--- /dev/null
+++ b/.github/labels.toml
@@ -0,0 +1,94 @@
+[breaking]
+color = "ffcc00"
+name = "breaking"
+description = "Breaking change."
+
+[bug]
+color = "d73a4a"
+name = "bug"
+description = "Something isn't working"
+
+[dependencies]
+color = "0366d6"
+name = "dependencies"
+description = "Pull requests that update a dependency file"
+
+[github_actions]
+color = "000000"
+name = "github_actions"
+description = "Update of github actions"
+
+[documentation]
+color = "1bc4a5"
+name = "documentation"
+description = "Improvements or additions to documentation"
+
+[duplicate]
+color = "cfd3d7"
+name = "duplicate"
+description = "This issue or pull request already exists"
+
+[enhancement]
+color = "a2eeef"
+name = "enhancement"
+description = "New feature or request"
+
+["good first issue"]
+color = "7057ff"
+name = "good first issue"
+description = "Good for newcomers"
+
+["help wanted"]
+color = "008672"
+name = "help wanted"
+description = "Extra attention is needed"
+
+[invalid]
+color = "e4e669"
+name = "invalid"
+description = "This doesn't seem right"
+
+[nochangelog]
+color = "555555"
+name = "nochangelog"
+description = "Exclude pull requests from changelog"
+
+[question]
+color = "d876e3"
+name = "question"
+description = "Further information is requested"
+
+[removed]
+color = "e99695"
+name = "removed"
+description = "Removed piece of functionalities."
+
+[tests]
+color = "bfd4f2"
+name = "tests"
+description = "CI, CD and testing related changes"
+
+[wontfix]
+color = "ffffff"
+name = "wontfix"
+description = "This will not be worked on"
+
+[discussion]
+color = "c2e0c6"
+name = "discussion"
+description = "Some discussion around the project"
+
+[hacktoberfest]
+color = "ffa663"
+name = "hacktoberfest"
+description = "Good issues for Hacktoberfest"
+
+[answered]
+color = "0ee2b6"
+name = "answered"
+description = "Automatically closes as answered after a delay"
+
+[waiting]
+color = "5f7972"
+name = "waiting"
+description = "Automatically closes if no answer after a delay"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..ceb6275
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,109 @@
+name: CI
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+
+concurrency:
+ group: ${{ github.head_ref || github.run_id }}
+ cancel-in-progress: true
+
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v5
+ with:
+ python-version: 3.x
+ - uses: pre-commit/action@v3.0.0
+
+ # Make sure commit messages follow the conventional commits convention:
+ # https://www.conventionalcommits.org
+ commitlint:
+ name: Lint Commit Messages
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - uses: wagoid/commitlint-github-action@v5.4.4
+
+ test:
+ strategy:
+ fail-fast: false
+ matrix:
+ python-version:
+ - "3.8"
+ - "3.9"
+ - "3.10"
+ - "3.11"
+ - "3.12"
+ os:
+ - ubuntu-latest
+ - windows-latest
+ - macOS-latest
+ runs-on: ${{ matrix.os }}
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: ${{ matrix.python-version }}
+ - uses: snok/install-poetry@v1.3.4
+ - name: Install Dependencies
+ run: poetry install
+ shell: bash
+ - name: Test with Pytest
+ run: poetry run pytest --cov-report=xml
+ shell: bash
+ - name: Upload coverage to Codecov
+ uses: codecov/codecov-action@v3
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+
+ release:
+ needs:
+ - test
+ - lint
+ - commitlint
+
+ runs-on: ubuntu-latest
+ environment: release
+ concurrency: release
+ permissions:
+ id-token: write
+ contents: write
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ ref: ${{ github.head_ref || github.ref_name }}
+
+ # Do a dry run of PSR
+ - name: Test release
+ uses: python-semantic-release/python-semantic-release@v8.5.0
+ if: github.ref_name != 'main'
+ with:
+ root_options: --noop
+
+ # On main branch: actual PSR + upload to PyPI & GitHub
+ - name: Release
+ uses: python-semantic-release/python-semantic-release@v8.5.0
+ id: release
+ if: github.ref_name == 'main'
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Publish package distributions to PyPI
+ uses: pypa/gh-action-pypi-publish@release/v1
+ if: steps.release.outputs.released == 'true'
+
+ - name: Publish package distributions to GitHub Releases
+ uses: python-semantic-release/upload-to-gh-release@main
+ if: steps.release.outputs.released == 'true'
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/hacktoberfest.yml b/.github/workflows/hacktoberfest.yml
new file mode 100644
index 0000000..00239a4
--- /dev/null
+++ b/.github/workflows/hacktoberfest.yml
@@ -0,0 +1,17 @@
+name: Hacktoberfest
+
+on:
+ schedule:
+ # Run every day in October
+ - cron: "0 0 * 10 *"
+ # Run on the 1st of November to revert
+ - cron: "0 13 1 11 *"
+
+jobs:
+ hacktoberfest:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: browniebroke/hacktoberfest-labeler-action@v2.3.0
+ with:
+ github_token: ${{ secrets.GH_PAT }}
diff --git a/.github/workflows/issue-manager.yml b/.github/workflows/issue-manager.yml
new file mode 100644
index 0000000..e41c2fb
--- /dev/null
+++ b/.github/workflows/issue-manager.yml
@@ -0,0 +1,32 @@
+name: Issue Manager
+
+on:
+ schedule:
+ - cron: "0 0 * * *"
+ issue_comment:
+ types:
+ - created
+ issues:
+ types:
+ - labeled
+ pull_request_target:
+ types:
+ - labeled
+ workflow_dispatch:
+
+jobs:
+ issue-manager:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: tiangolo/issue-manager@0.4.0
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ config: >
+ {
+ "answered": {
+ "message": "Assuming the original issue was solved, it will be automatically closed now."
+ },
+ "waiting": {
+ "message": "Automatically closing. To re-open, please provide the additional information requested."
+ }
+ }
diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml
new file mode 100644
index 0000000..230db33
--- /dev/null
+++ b/.github/workflows/labels.yml
@@ -0,0 +1,22 @@
+name: Sync Github labels
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - ".github/**"
+
+jobs:
+ labels:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: 3.x
+ - name: Install labels
+ run: pip install labels
+ - name: Sync config with Github
+ run: labels -u ${{ github.repository_owner }} -t ${{ secrets.GH_PAT }} sync -f .github/labels.toml
diff --git a/.github/workflows/poetry-upgrade.yml b/.github/workflows/poetry-upgrade.yml
new file mode 100644
index 0000000..6ee1f3b
--- /dev/null
+++ b/.github/workflows/poetry-upgrade.yml
@@ -0,0 +1,12 @@
+name: Upgrader
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: "59 14 3 * *"
+
+jobs:
+ upgrade:
+ uses: browniebroke/github-actions/.github/workflows/poetry-upgrade.yml@v1
+ secrets:
+ gh_pat: ${{ secrets.GH_PAT }}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..08cfdfd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,140 @@
+# Created by .ignore support plugin (hsz.mobi)
+### Python template
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder {{package_name}} settings
+.spyderproject
+.spyproject
+
+# Rope {{package_name}} settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
diff --git a/.gitpod.yml b/.gitpod.yml
new file mode 100644
index 0000000..450add9
--- /dev/null
+++ b/.gitpod.yml
@@ -0,0 +1,8 @@
+tasks:
+ - command: |
+ pip install poetry
+ PIP_USER=false poetry install
+ - command: |
+ pip install pre-commit
+ pre-commit install
+ PIP_USER=false pre-commit install-hooks
diff --git a/.idea/aiohappyeyeballs.iml b/.idea/aiohappyeyeballs.iml
new file mode 100644
index 0000000..a46d9bb
--- /dev/null
+++ b/.idea/aiohappyeyeballs.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml
new file mode 100644
index 0000000..22b6eba
--- /dev/null
+++ b/.idea/watcherTasks.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..f2e6d22
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..6f27721
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,56 @@
+# See https://pre-commit.com for more information
+# See https://pre-commit.com/hooks.html for more hooks
+exclude: "CHANGELOG.md|.copier-answers.yml|.all-contributorsrc"
+default_stages: [commit]
+
+ci:
+ autofix_commit_msg: "chore(pre-commit.ci): auto fixes"
+ autoupdate_commit_msg: "chore(pre-commit.ci): pre-commit autoupdate"
+
+repos:
+ - repo: https://github.com/commitizen-tools/commitizen
+ rev: v3.13.0
+ hooks:
+ - id: commitizen
+ stages: [commit-msg]
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.5.0
+ hooks:
+ - id: debug-statements
+ - id: check-builtin-literals
+ - id: check-case-conflict
+ - id: check-docstring-first
+ - id: check-json
+ - id: check-toml
+ - id: check-xml
+ - id: check-yaml
+ - id: detect-private-key
+ - id: end-of-file-fixer
+ - id: trailing-whitespace
+ - repo: https://github.com/python-poetry/poetry
+ rev: 1.7.1
+ hooks:
+ - id: poetry-check
+ - repo: https://github.com/pre-commit/mirrors-prettier
+ rev: v3.1.0
+ hooks:
+ - id: prettier
+ args: ["--tab-width", "2"]
+ - repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: v0.1.7
+ hooks:
+ - id: ruff
+ args: [--fix, --exit-non-zero-on-fix]
+ - repo: https://github.com/psf/black
+ rev: 23.11.0
+ hooks:
+ - id: black
+ - repo: https://github.com/codespell-project/codespell
+ rev: v2.2.6
+ hooks:
+ - id: codespell
+ - repo: https://github.com/pre-commit/mirrors-mypy
+ rev: v1.7.1
+ hooks:
+ - id: mypy
+ additional_dependencies: []
diff --git a/.readthedocs.yml b/.readthedocs.yml
new file mode 100644
index 0000000..53891ad
--- /dev/null
+++ b/.readthedocs.yml
@@ -0,0 +1,24 @@
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+# Set the version of Python and other tools you might need
+build:
+ os: ubuntu-20.04
+ tools:
+ python: "3.9"
+ jobs:
+ post_create_environment:
+ # Install poetry
+ - pip install poetry
+ # Tell poetry to not use a virtual environment
+ - poetry config virtualenvs.create false
+ post_install:
+ # Install dependencies
+ - poetry install --with docs
+
+# Build documentation in the docs directory with Sphinx
+sphinx:
+ configuration: docs/conf.py
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..825c32f
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1 @@
+# Changelog
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..24747cd
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,117 @@
+# Contributing
+
+Contributions are welcome, and they are greatly appreciated! Every little helps, and credit will always be given.
+
+You can contribute in many ways:
+
+## Types of Contributions
+
+### Report Bugs
+
+Report bugs to [our issue page][gh-issues]. If you are reporting a bug, please include:
+
+- Your operating system name and version.
+- Any details about your local setup that might be helpful in troubleshooting.
+- Detailed steps to reproduce the bug.
+
+### Fix Bugs
+
+Look through the GitHub issues for bugs. Anything tagged with "bug" and "help wanted" is open to whoever wants to implement it.
+
+### Implement Features
+
+Look through the GitHub issues for features. Anything tagged with "enhancement" and "help wanted" is open to whoever wants to implement it.
+
+### Write Documentation
+
+aiohappyeyeballs could always use more documentation, whether as part of the official aiohappyeyeballs docs, in docstrings, or even on the web in blog posts, articles, and such.
+
+### Submit Feedback
+
+The best way to send feedback [our issue page][gh-issues] on GitHub. If you are proposing a feature:
+
+- Explain in detail how it would work.
+- Keep the scope as narrow as possible, to make it easier to implement.
+- Remember that this is a volunteer-driven project, and that contributions are welcome 😊
+
+## Get Started!
+
+Ready to contribute? Here's how to set yourself up for local development.
+
+1. Fork the repo on GitHub.
+
+2. Clone your fork locally:
+
+ ```shell
+ $ git clone git@github.com:your_name_here/aiohappyeyeballs.git
+ ```
+
+3. Install the project dependencies with [Poetry](https://python-poetry.org):
+
+ ```shell
+ $ poetry install
+ ```
+
+4. Create a branch for local development:
+
+ ```shell
+ $ git checkout -b name-of-your-bugfix-or-feature
+ ```
+
+ Now you can make your changes locally.
+
+5. When you're done making changes, check that your changes pass our tests:
+
+ ```shell
+ $ poetry run pytest
+ ```
+
+6. Linting is done through [pre-commit](https://pre-commit.com). Provided you have the tool installed globally, you can run them all as one-off:
+
+ ```shell
+ $ pre-commit run -a
+ ```
+
+ Or better, install the hooks once and have them run automatically each time you commit:
+
+ ```shell
+ $ pre-commit install
+ ```
+
+7. Commit your changes and push your branch to GitHub:
+
+ ```shell
+ $ git add .
+ $ git commit -m "feat(something): your detailed description of your changes"
+ $ git push origin name-of-your-bugfix-or-feature
+ ```
+
+ Note: the commit message should follow [the conventional commits](https://www.conventionalcommits.org). We run [`commitlint` on CI](https://github.com/marketplace/actions/commit-linter) to validate it, and if you've installed pre-commit hooks at the previous step, the message will be checked at commit time.
+
+8. Submit a pull request through the GitHub website or using the GitHub CLI (if you have it installed):
+
+ ```shell
+ $ gh pr create --fill
+ ```
+
+## Pull Request Guidelines
+
+We like to have the pull request open as soon as possible, that's a great place to discuss any piece of work, even unfinished. You can use draft pull request if it's still a work in progress. Here are a few guidelines to follow:
+
+1. Include tests for feature or bug fixes.
+2. Update the documentation for significant features.
+3. Ensure tests are passing on CI.
+
+## Tips
+
+To run a subset of tests:
+
+```shell
+$ pytest tests
+```
+
+## Making a new release
+
+The deployment should be automated and can be triggered from the Semantic Release workflow in GitHub. The next version will be based on [the commit logs](https://python-semantic-release.readthedocs.io/en/latest/commit-log-parsing.html#commit-log-parsing). This is done by [python-semantic-release](https://python-semantic-release.readthedocs.io/en/latest/index.html) via a GitHub action.
+
+[gh-issues]: https://github.com/bdraco/aiohappyeyeballs/issues
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..3089dd9
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2023 J. Nick Koston
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8bddb90
--- /dev/null
+++ b/README.md
@@ -0,0 +1,67 @@
+# aiohappyeyeballs
+
+