├── cv
├── matplotlibrc
├── pallete
│ └── .gitignore
├── .gitignore
├── lena.jpg
├── pixel.py
├── resize_slice.py
├── crop.py
├── green_slice.py
├── split_channels.py
├── always_blue.py
├── change_color_component.py
├── resize.py
├── text.py
├── change_green_component.py
├── color_system.py
├── pyproject.toml
├── rotate.py
├── change_with_jump.py
├── metadata.py
├── mask.py
├── flip.py
├── merge_channels.py
├── histogram.py
├── pallete_improved.py
├── pallete.py
├── histogram_color.py
├── draw.py
├── rectangles.py
├── equalize_histogram.py
└── README.md
├── toxpipenv
├── toxpipenv
│ ├── __init__.py
│ └── core.py
├── MANIFEST
├── tests
│ └── test_core.py
├── tox.ini
├── setup.py
├── pyproject.toml
├── README.md
└── poetry.lock
├── learningopencv
├── .gitignore
├── Lupi.AVI
├── lena.jpg
├── th_2013.png
├── cruzeiro_tux_2010_normal.png
├── image.py
├── add.py
├── README.md
├── abs.py
├── absdiff.py
├── simple_transformation.py
├── pyproject.toml
├── camera.py
├── avivideo.py
├── trackbar.py
├── writeavi.py
├── cannyreduce.py
├── videorgb2gray.py
├── logpolar.py
└── poetry.lock
├── multistagepython
├── requirements.txt
├── example_pandas.py
├── Dockerfile.step4
├── Dockerfile.step1
├── Dockerfile.step2
├── Dockerfile.step3
├── Dockerfile.step5
└── README.md
├── selenium_tricks
├── requirements.txt
├── test_api
│ ├── files
│ │ ├── lena.jpg
│ │ └── some_text.txt
│ ├── templates
│ │ ├── hello.html
│ │ ├── list_files.html
│ │ └── base.html
│ └── app.py
├── headless
│ ├── chrome_example.py
│ ├── firefox_example.py
│ └── README.md
├── README.md
└── download_files_headless
│ ├── firefox_example.py
│ ├── chrome_example.py
│ └── README.md
├── assets
├── site.png
├── magic.gif
└── mime-response.png
├── love
├── heart.png
├── README.md
├── love.py
└── love.go
├── fastapi-playground
├── .vscode
│ └── settings.json
├── pyproject.toml
├── main.py
├── README.md
└── poetry.lock
├── lights_out
├── game1.png
├── game2.png
├── README.md
└── lights_out.py
├── snake_game
├── smw_coin.wav
├── backgroundmusic.ogg
├── README.md
└── jogo.py
├── xlsx2csv
├── example_xlsx.xlsx
├── pyproject.toml
├── README.md
├── xlsx2csv.py
└── poetry.lock
├── orderdictbyvalue
├── ord.py
└── README.md
├── paulinhaclass
├── tabela.csv
├── README.md
└── requirements.txt
├── asyncreturn
├── README.md
└── asyncreturn.py
├── summation
├── README.md
└── summation.py
├── dataanalysis
├── README.md
├── requirements.txt
├── Jupyter Notebook.ipynb
├── pokemon.csv
└── google_stock_price.csv
├── onelinechristmas
├── README.md
├── formatchristmas.py
├── onelinechristmas.py
└── colorized.py
├── dockerize
├── README.md
├── pyproject.toml
├── run.py
└── poetry.lock
├── hiding_message_in_an_image
└── README.md
├── copyextension
├── README.md
└── copyextension.py
├── algorithms
├── sort.py
├── search.py
├── greedy.py
├── dijkstra.py
└── bfs.py
├── .gitignore
├── README.md
└── LICENSE
/cv/matplotlibrc:
--------------------------------------------------------------------------------
1 | backend: agg
2 |
--------------------------------------------------------------------------------
/toxpipenv/toxpipenv/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/cv/pallete/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/cv/.gitignore:
--------------------------------------------------------------------------------
1 | !lena.jpg
2 | *.jpg
3 | *.png
4 |
--------------------------------------------------------------------------------
/learningopencv/.gitignore:
--------------------------------------------------------------------------------
1 | !./Lupi.AVI
2 | *.avi
3 |
--------------------------------------------------------------------------------
/multistagepython/requirements.txt:
--------------------------------------------------------------------------------
1 | pandas==1.3.3
2 |
--------------------------------------------------------------------------------
/selenium_tricks/requirements.txt:
--------------------------------------------------------------------------------
1 | selenium==3.141.0
2 | flask==2.3.2
3 |
--------------------------------------------------------------------------------
/cv/lena.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/cv/lena.jpg
--------------------------------------------------------------------------------
/assets/site.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/assets/site.png
--------------------------------------------------------------------------------
/love/heart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/love/heart.png
--------------------------------------------------------------------------------
/assets/magic.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/assets/magic.gif
--------------------------------------------------------------------------------
/fastapi-playground/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "python.formatting.provider": "black"
3 | }
--------------------------------------------------------------------------------
/lights_out/game1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/lights_out/game1.png
--------------------------------------------------------------------------------
/lights_out/game2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/lights_out/game2.png
--------------------------------------------------------------------------------
/assets/mime-response.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/assets/mime-response.png
--------------------------------------------------------------------------------
/learningopencv/Lupi.AVI:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/learningopencv/Lupi.AVI
--------------------------------------------------------------------------------
/learningopencv/lena.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/learningopencv/lena.jpg
--------------------------------------------------------------------------------
/snake_game/smw_coin.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/snake_game/smw_coin.wav
--------------------------------------------------------------------------------
/learningopencv/th_2013.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/learningopencv/th_2013.png
--------------------------------------------------------------------------------
/xlsx2csv/example_xlsx.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/xlsx2csv/example_xlsx.xlsx
--------------------------------------------------------------------------------
/snake_game/backgroundmusic.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/snake_game/backgroundmusic.ogg
--------------------------------------------------------------------------------
/toxpipenv/MANIFEST:
--------------------------------------------------------------------------------
1 | # file GENERATED by distutils, do NOT edit
2 | setup.py
3 | toxpipenv/__init__.py
4 | toxpipenv/core.py
5 |
--------------------------------------------------------------------------------
/toxpipenv/tests/test_core.py:
--------------------------------------------------------------------------------
1 | from toxpipenv.core import square
2 |
3 |
4 | def test_square():
5 | assert square(2) == 4
6 |
--------------------------------------------------------------------------------
/selenium_tricks/test_api/files/lena.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/selenium_tricks/test_api/files/lena.jpg
--------------------------------------------------------------------------------
/selenium_tricks/test_api/templates/hello.html:
--------------------------------------------------------------------------------
1 | {% extends 'base.html' %}
2 | {% block content %}
3 | Hello World!
4 | {% endblock %}
5 |
--------------------------------------------------------------------------------
/learningopencv/cruzeiro_tux_2010_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/learningopencv/cruzeiro_tux_2010_normal.png
--------------------------------------------------------------------------------
/multistagepython/example_pandas.py:
--------------------------------------------------------------------------------
1 | import pandas as pd
2 |
3 | df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
4 | print(df['a'].sum())
5 |
--------------------------------------------------------------------------------
/orderdictbyvalue/ord.py:
--------------------------------------------------------------------------------
1 | from operator import itemgetter
2 | original = {1: 2, 2: 3, 3: 1}
3 | ordered = dict(sorted(original.items(), key=itemgetter(1)))
4 | print(ordered)
5 |
--------------------------------------------------------------------------------
/toxpipenv/tox.ini:
--------------------------------------------------------------------------------
1 | [tox]
2 | envlist = py310,py311
3 |
4 | [testenv]
5 | passenv = HOME
6 | deps = poetry
7 | commands =
8 | poetry install
9 | poetry run python -m pytest tests
10 |
--------------------------------------------------------------------------------
/toxpipenv/toxpipenv/core.py:
--------------------------------------------------------------------------------
1 | def square(number):
2 | """Calculates square of a number.
3 |
4 | :number: a number
5 | :returns: square of a number
6 |
7 | """
8 | return number ** 2
9 |
--------------------------------------------------------------------------------
/multistagepython/Dockerfile.step4:
--------------------------------------------------------------------------------
1 | FROM python:3-slim
2 | WORKDIR /app
3 | COPY requirements.txt /app
4 | RUN pip install -r requirements.txt --no-cache
5 | COPY . /app
6 | CMD ["python", "example_pandas.py"]
7 |
--------------------------------------------------------------------------------
/paulinhaclass/tabela.csv:
--------------------------------------------------------------------------------
1 | faturamento,tempo
2 | 22.988656,88.099884
3 | 13.983982,75.129938
4 | 19.834573,86.648599
5 | 18.874949,84.828383
6 | 15.849892,81.746383
7 | 13.759219,77.937611
8 | 15.125478,80.547181
--------------------------------------------------------------------------------
/multistagepython/Dockerfile.step1:
--------------------------------------------------------------------------------
1 | FROM python:3
2 | COPY requirements.txt .
3 | RUN pip install -r requirements.txt && rm -rf /root/.cache
4 | WORKDIR /app
5 | COPY . /app
6 | CMD ["python", "example_pandas.py"]
7 |
--------------------------------------------------------------------------------
/asyncreturn/README.md:
--------------------------------------------------------------------------------
1 | # AsyncReturn
2 |
3 | This module is an example of how to write async functions that return values,
4 | and how to retrieve these values.
5 |
6 | ## How to run
7 |
8 | `python asyncreturn.py`
9 |
--------------------------------------------------------------------------------
/paulinhaclass/README.md:
--------------------------------------------------------------------------------
1 | # Paulinha's class
2 |
3 | Deep learning fundamentals.
4 |
5 | ## How to run
6 |
7 | ```bash
8 | $ python -m venv .env
9 | $ source .env/bin/activate
10 | $ jupyter notebook
11 | ```
12 |
--------------------------------------------------------------------------------
/cv/pixel.py:
--------------------------------------------------------------------------------
1 | # Module to read one pixel
2 | import cv2
3 |
4 | image = cv2.imread('lena.jpg')
5 | b, g, r = image[0, 0]
6 | print('The pixel (0, 0) has the following colors:')
7 | print(f'Red: {r}, Green: {g}, Blue: {b}')
8 |
--------------------------------------------------------------------------------
/cv/resize_slice.py:
--------------------------------------------------------------------------------
1 | # Module to resize an image using slicing
2 | import cv2
3 | image = cv2.imread('lena.jpg')
4 | cv2.imshow('Original', image)
5 | resized_image = image[::2, ::2]
6 | cv2.imshow('Resized image', resized_image)
7 | cv2.waitKey(0)
8 |
--------------------------------------------------------------------------------
/learningopencv/image.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | import cv2
4 |
5 | image = cv2.imread("lena.jpg")
6 | if image is None:
7 | print("Image not found.", file=sys.stderr)
8 | sys.exit(1)
9 | cv2.imshow("image", image)
10 | cv2.waitKey()
11 |
--------------------------------------------------------------------------------
/cv/crop.py:
--------------------------------------------------------------------------------
1 | # Module to crop an image
2 | import cv2
3 | image = cv2.imread('lena.jpg')
4 | cropping = image[100:200, 100:200]
5 | cv2.imshow('Image cropping', cropping)
6 | cv2.waitKey(0) # wait to press any key
7 | cv2.imwrite('cropping.jpg', cropping)
8 |
--------------------------------------------------------------------------------
/summation/README.md:
--------------------------------------------------------------------------------
1 | # Σ (summation)
2 |
3 | Sum terms from lower_bound until upper_bound, applying some function on each term.
4 |
5 | ## How to run
6 |
7 | Run doctest to check if test is correct.
8 |
9 | `python -m doctest summation.py`
10 |
--------------------------------------------------------------------------------
/multistagepython/Dockerfile.step2:
--------------------------------------------------------------------------------
1 | FROM python:3.9-alpine
2 | RUN apk add --update build-base
3 | COPY requirements.txt .
4 | RUN pip install -r requirements.txt && rm -rf /root/.cache
5 | WORKDIR /app
6 | COPY . /app
7 | CMD ["python", "example_pandas.py"]
8 |
--------------------------------------------------------------------------------
/selenium_tricks/test_api/templates/list_files.html:
--------------------------------------------------------------------------------
1 | {% extends 'base.html' %}
2 | {% block content %}
3 | {% for file in files %}
4 | {{file}}
5 | {% endfor %}
6 | {% endblock %}
7 |
--------------------------------------------------------------------------------
/cv/green_slice.py:
--------------------------------------------------------------------------------
1 | # Module to change a slice of pixels into green
2 | import cv2
3 | image = cv2.imread('lena.jpg')
4 | # from 30 to 50 in y color pixel to green
5 | image[30:50, :] = (0, 255, 0)
6 | cv2.imshow('Modified image', image)
7 | cv2.waitKey(0) # wait to press any key
8 |
--------------------------------------------------------------------------------
/dataanalysis/README.md:
--------------------------------------------------------------------------------
1 | # Data Analysis with Panda
2 |
3 | This module contains notebooks made by course `data analysis with pandas` of udemy.
4 |
5 | ## How to run
6 |
7 | ```bash
8 | $ python -m venv .env
9 | $ source .env/bin/activate
10 | $ jupyter notebook
11 | ```
12 |
--------------------------------------------------------------------------------
/learningopencv/add.py:
--------------------------------------------------------------------------------
1 | import cv2
2 |
3 | image1 = cv2.imread("cruzeiro_tux_2010_normal.png")
4 | image2 = cv2.imread("th_2013.png")
5 | add = cv2.add(image1, image2)
6 | adds = cv2.add(image1, (0, 10, 30, 100))
7 | cv2.imshow("add", add)
8 | cv2.imshow("adds", adds)
9 | cv2.waitKey()
10 |
--------------------------------------------------------------------------------
/learningopencv/README.md:
--------------------------------------------------------------------------------
1 | # Learning opencv
2 |
3 | Opencv library studies(python version).
4 |
5 | Old c++ version [here](https://github.com/cassiobotaro/estudos_opencv).
6 |
7 | ## Requirements
8 |
9 | `pipenv install`
10 |
11 | ## How to run
12 |
13 | `pipenv run python `
14 |
--------------------------------------------------------------------------------
/toxpipenv/setup.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | from distutils.core import setup
4 |
5 | setup(name='toxpipenv',
6 | version='1.0',
7 | description='Just some tests',
8 | author='Cássio Botaro',
9 | author_email='cassiobotaro@gmail.com',
10 | packages=['toxpipenv'],
11 | )
12 |
--------------------------------------------------------------------------------
/learningopencv/abs.py:
--------------------------------------------------------------------------------
1 | import cv2
2 |
3 | image1 = cv2.imread("cruzeiro_tux_2010_normal.png")
4 | image2 = cv2.imread("th_2013.png")
5 | absdiff = cv2.absdiff(image1, image2)
6 | absdiffs = cv2.absdiff(absdiff, (100, 0, 0, 0))
7 | cv2.imshow("absdiff", absdiff)
8 | cv2.imshow("absdiffs", absdiffs)
9 | cv2.waitKey()
10 |
--------------------------------------------------------------------------------
/learningopencv/absdiff.py:
--------------------------------------------------------------------------------
1 | import cv2
2 |
3 | image1 = cv2.imread("cruzeiro_tux_2010_normal.png")
4 | image2 = cv2.imread("th_2013.png")
5 | absdiff = cv2.absdiff(image1, image2)
6 | absdiffs = cv2.absdiff(image1, (0, 0, 255, 0))
7 | cv2.imshow("absdiff", absdiff)
8 | cv2.imshow("absdiffs", absdiffs)
9 | cv2.waitKey()
10 |
--------------------------------------------------------------------------------
/selenium_tricks/test_api/templates/base.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Test API
7 |
8 |
9 | {% block content %}{% endblock %}
10 |
11 |
12 |
--------------------------------------------------------------------------------
/cv/split_channels.py:
--------------------------------------------------------------------------------
1 | # Module that split color channels
2 | import cv2
3 | image = cv2.imread('lena.jpg')
4 | blue_channel, green_channel, red_channel = cv2.split(image)
5 | cv2.imshow('Original', image)
6 | cv2.imshow('Red', red_channel)
7 | cv2.imshow('Green', green_channel)
8 | cv2.imshow('Blue', blue_channel)
9 | cv2.waitKey(0)
10 |
--------------------------------------------------------------------------------
/selenium_tricks/headless/chrome_example.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 | from selenium import webdriver
4 |
5 | options = webdriver.ChromeOptions()
6 | options.headless = True
7 | driver = webdriver.Chrome(options=options)
8 | driver.get("http://localhost:5000/")
9 | print(driver.page_source)
10 | driver.quit()
11 |
--------------------------------------------------------------------------------
/cv/always_blue.py:
--------------------------------------------------------------------------------
1 | # Module to modify an image pixels to blue
2 | import cv2
3 | image = cv2.imread('lena.jpg')
4 | height, width, _ = image.shape
5 | BLUE = (255, 0, 0)
6 | for y in range(height):
7 | for x in range(width):
8 | image[y, x] = BLUE
9 | cv2.imshow('Modified image', image)
10 | cv2.waitKey(0) # wait to press any key
11 |
--------------------------------------------------------------------------------
/learningopencv/simple_transformation.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | import cv2
4 |
5 | image = cv2.imread("lena.jpg")
6 | if image is None:
7 | print("Image not found.", file=sys.stderr)
8 | sys.exit(1)
9 | smooth = cv2.GaussianBlur(image, ksize=(0, 0), sigmaX=4)
10 | cv2.imshow("image", image)
11 | cv2.imshow("smooth", smooth)
12 | cv2.waitKey()
13 |
--------------------------------------------------------------------------------
/onelinechristmas/README.md:
--------------------------------------------------------------------------------
1 | # One line christmas
2 |
3 | An awesome christmas message.
4 |
5 | ```
6 | How big is your tree?(Ex: 5) 5
7 | What's your christmas message? Ho ho ho!
8 | ....★.....
9 | ...★★★....
10 | ..★★★★★...
11 | .★★★★★★★..
12 | ★★★★★★★★★.
13 | ▓
14 |
15 | Ho ho ho!
16 | ```
17 |
18 | ## How to run
19 |
20 | `python onelinechristmas.py`
21 |
--------------------------------------------------------------------------------
/cv/change_color_component.py:
--------------------------------------------------------------------------------
1 | # Module to modify an image pixels based on it's position
2 | import cv2
3 | image = cv2.imread('lena.jpg')
4 | height, width, _ = image.shape
5 | for y in range(height):
6 | for x in range(width):
7 | image[y, x] = (x % 256, y % 256, x % 256)
8 | cv2.imshow('Modified image', image)
9 | cv2.waitKey(0) # wait to press any key
10 |
--------------------------------------------------------------------------------
/dockerize/README.md:
--------------------------------------------------------------------------------
1 | # Dockerize run
2 |
3 | Dockerize will run 42 containers,beign n(number of cores in machine)
4 | containers simutaneously, each one doing some task.
5 |
6 | ## How to run
7 |
8 | You should have [docker](https://docs.docker.com/engine/installation/) installed locally.
9 |
10 | Install requirements: `pipenv install`
11 |
12 | `pipenv run python run.py`
13 |
--------------------------------------------------------------------------------
/dockerize/pyproject.toml:
--------------------------------------------------------------------------------
1 | [tool.poetry]
2 | name = "dockerize"
3 | version = "0.1.0"
4 | description = ""
5 | authors = ["cassiobotaro "]
6 | readme = "README.md"
7 |
8 | [tool.poetry.dependencies]
9 | python = "^3.11"
10 | docker = "^6.0.1"
11 |
12 |
13 | [build-system]
14 | requires = ["poetry-core"]
15 | build-backend = "poetry.core.masonry.api"
16 |
--------------------------------------------------------------------------------
/xlsx2csv/pyproject.toml:
--------------------------------------------------------------------------------
1 | [tool.poetry]
2 | name = "xlsx2csv"
3 | version = "0.1.0"
4 | description = ""
5 | authors = ["cassiobotaro "]
6 | readme = "README.md"
7 |
8 | [tool.poetry.dependencies]
9 | python = "^3.11"
10 | openpyxl = "^3.0.10"
11 |
12 |
13 | [build-system]
14 | requires = ["poetry-core"]
15 | build-backend = "poetry.core.masonry.api"
16 |
--------------------------------------------------------------------------------
/cv/resize.py:
--------------------------------------------------------------------------------
1 | # Module to resize an image
2 | import cv2
3 | image = cv2.imread('lena.jpg')
4 | cv2.imshow('Original', image)
5 | height, width, _ = image.shape
6 | proportion = 100.0 / width
7 | new_size = (100, int(height * proportion))
8 | resized_image = cv2.resize(image, new_size, interpolation=cv2.INTER_AREA)
9 | cv2.imshow('Resized image', resized_image)
10 | cv2.waitKey(0)
11 |
--------------------------------------------------------------------------------
/cv/text.py:
--------------------------------------------------------------------------------
1 | # Module to write a text into an image
2 | import cv2
3 | image = cv2.imread('lena.jpg')
4 | font = cv2.FONT_HERSHEY_TRIPLEX
5 | # cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[,
6 | # lineType[, bottomLeftOrigin]]]) → None
7 | cv2.putText(image, 'Lena', (15, 65), font, 2, (255, 255, 255), 2, cv2.LINE_AA)
8 | cv2.imshow('Lena', image)
9 | cv2.waitKey(0)
10 |
--------------------------------------------------------------------------------
/cv/change_green_component.py:
--------------------------------------------------------------------------------
1 | # Module to modify an image pixels based on it's position
2 | # Just modify green component
3 | import cv2
4 | image = cv2.imread('lena.jpg')
5 | height, width, _ = image.shape
6 | for y in range(height):
7 | for x in range(width):
8 | image[y, x] = (0, (x * y) % 256, 0)
9 | cv2.imshow('Modified image', image)
10 | cv2.waitKey(0) # wait to press any key
11 |
--------------------------------------------------------------------------------
/cv/color_system.py:
--------------------------------------------------------------------------------
1 | # Module to show other color systems
2 | import cv2
3 | image = cv2.imread('lena.jpg')
4 | cv2.imshow('Original', image)
5 | gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
6 | cv2.imshow('Gray', gray)
7 | hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
8 | cv2.imshow('HSV', hsv)
9 | lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
10 | cv2.imshow('L*a*b*', lab)
11 | cv2.waitKey(0)
12 |
--------------------------------------------------------------------------------
/learningopencv/pyproject.toml:
--------------------------------------------------------------------------------
1 | [tool.poetry]
2 | name = "learningopencv"
3 | version = "0.1.0"
4 | description = ""
5 | authors = ["cassiobotaro "]
6 | readme = "README.md"
7 |
8 | [tool.poetry.dependencies]
9 | python = "^3.11"
10 | opencv-python = "^4.8.1.78"
11 |
12 |
13 | [build-system]
14 | requires = ["poetry-core"]
15 | build-backend = "poetry.core.masonry.api"
16 |
--------------------------------------------------------------------------------
/cv/pyproject.toml:
--------------------------------------------------------------------------------
1 | [tool.poetry]
2 | name = "cv"
3 | version = "0.1.0"
4 | description = ""
5 | authors = ["cassiobotaro "]
6 |
7 | [tool.poetry.dependencies]
8 | python = "^3.10"
9 | opencv-python = "^4.8.1"
10 | matplotlib = "^3.5.2"
11 |
12 | [tool.poetry.dev-dependencies]
13 |
14 | [build-system]
15 | requires = ["poetry-core>=1.0.0"]
16 | build-backend = "poetry.core.masonry.api"
17 |
--------------------------------------------------------------------------------
/love/README.md:
--------------------------------------------------------------------------------
1 | # Love
2 |
3 | Draw a heart using a name.
4 |
5 | 
6 |
7 | ## How to build
8 |
9 | When build, set main.love or "Love" will be used as default.
10 |
11 | `go build -ldflags="-X main.love=" love.go`
12 |
13 | ## How to run
14 |
15 | **go version**
16 |
17 | `go run -ldflags="-X main.love=" love.go`
18 |
19 | **python version**
20 |
21 | `python love.py`
22 |
--------------------------------------------------------------------------------
/selenium_tricks/headless/firefox_example.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 | from selenium import webdriver
4 |
5 |
6 | # set browser headless
7 | options = webdriver.FirefoxOptions()
8 | options.headless = True
9 | driver = webdriver.Firefox(options=options)
10 | # navigate to site and print source page
11 | driver.get("http://localhost:5000/")
12 | print(driver.page_source)
13 | driver.quit()
14 |
--------------------------------------------------------------------------------
/cv/rotate.py:
--------------------------------------------------------------------------------
1 | # Module to rotate an image
2 | import cv2
3 | image = cv2.imread('lena.jpg')
4 | height, width, _ = image.shape # caught height and width
5 | center = (width // 2, height // 2) # find the center
6 | rotation_matrix = cv2.getRotationMatrix2D(center, 30, 1.0) # 30 degrees
7 | rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))
8 | cv2.imshow("Image rotated 30 degrees", rotated_image)
9 | cv2.waitKey(0)
10 |
--------------------------------------------------------------------------------
/love/love.py:
--------------------------------------------------------------------------------
1 | matriz = []
2 | nome = "amor"
3 |
4 | for y in range(30, -30, -1):
5 | linha = []
6 | for x in range(-30, 30):
7 | if ((x * 0.05) ** 2 + (y * 0.1) ** 2 - 1) ** 3 - (x * 0.05) ** 2 * (
8 | y * 0.1
9 | ) ** 3 <= 0:
10 | linha.append(nome[(x - y) % len(nome)])
11 | else:
12 | linha.append(" ")
13 | matriz.append("".join(linha))
14 |
15 | print("\n".join(matriz))
16 |
--------------------------------------------------------------------------------
/toxpipenv/pyproject.toml:
--------------------------------------------------------------------------------
1 | [tool.poetry]
2 | name = "toxpipenv"
3 | version = "0.1.0"
4 | description = ""
5 | authors = ["cassiobotaro "]
6 | readme = "README.md"
7 |
8 | [tool.poetry.dependencies]
9 | python = "^3.10"
10 |
11 |
12 | [tool.poetry.group.dev.dependencies]
13 | tox = "^4.0.16"
14 | pytest = "^7.2.0"
15 |
16 | [build-system]
17 | requires = ["poetry-core"]
18 | build-backend = "poetry.core.masonry.api"
19 |
--------------------------------------------------------------------------------
/snake_game/README.md:
--------------------------------------------------------------------------------
1 | # Jogo da Cobrinha
2 |
3 | Jogo da cobrinha é um jogo muito simples, onde o objetivo é coletar todas as frutas.
4 |
5 | ## Como executar o jogo
6 |
7 | Crie um ambiente virtual através do comando: `python -m venv .venv`.
8 |
9 | Para ativa-lo, digite: `source .venv/bin/activate` ou `.venv\Scripts\activate.bat` no windows.
10 |
11 | Com o ambiente ativado, digite `pip install pygame`.
12 |
13 | Por fim execute o jogo: `python jogo.py`
--------------------------------------------------------------------------------
/cv/change_with_jump.py:
--------------------------------------------------------------------------------
1 | # Module to modify an image(yellow) pixels based on it's position
2 | # jumping some pixels
3 | import cv2
4 | image = cv2.imread('lena.jpg')
5 | height, width, _ = image.shape
6 | YELLOW = (0, 255, 255)
7 | for y in range(0, height, 10): # iterate lines
8 | for x in range(0, width, 10): # iterate columns
9 | image[y:y+5, x:x+5] = YELLOW
10 | cv2.imshow('Modified image', image)
11 | cv2.waitKey(0) # wait to press any key
12 |
--------------------------------------------------------------------------------
/selenium_tricks/headless/README.md:
--------------------------------------------------------------------------------
1 | # Headless
2 |
3 | An example of how to run Chrome and Firefox headless without third parties.
4 |
5 | ## Problem
6 |
7 | Run browser headless without third parties.
8 |
9 | ## Discuss
10 |
11 | In recent versions of browsers and selenium you can set option `headless` to `True` and it will works very well.
12 |
13 | ## How to run
14 |
15 | `python firefox_example.py`
16 |
17 | or
18 |
19 | `python chrome_example.py`
20 |
--------------------------------------------------------------------------------
/cv/metadata.py:
--------------------------------------------------------------------------------
1 | # Module to get image metadata
2 | import cv2
3 |
4 | image = cv2.imread('lena.jpg')
5 | height, width, channels = image.shape
6 | print(f'Width in pixels: {width}')
7 | print(f'Height in pixels: {height}')
8 | print(f'Qty of channels: {channels}')
9 | # Show image using function imshow
10 | cv2.imshow('Window\'s name', image)
11 | cv2.waitKey(0) # wait to press any key
12 | # Save image into disk using function imwrite()
13 | cv2.imwrite('output.jpg', image)
14 |
--------------------------------------------------------------------------------
/learningopencv/camera.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | import cv2
4 |
5 | ENTER = 13
6 |
7 | capture = cv2.VideoCapture(0)
8 | if capture is None:
9 | print("Video not found.", file=sys.stderr)
10 | sys.exit(1)
11 |
12 | captured, frame = capture.read()
13 | key = 0
14 |
15 | while captured and key != ENTER:
16 | cv2.imshow('video', frame)
17 | captured, frame = capture.read()
18 | key = cv2.waitKey(delay=33)
19 |
20 | capture.release()
21 | cv2.destroyAllWindows()
22 |
--------------------------------------------------------------------------------
/selenium_tricks/test_api/files/some_text.txt:
--------------------------------------------------------------------------------
1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
2 |
--------------------------------------------------------------------------------
/cv/mask.py:
--------------------------------------------------------------------------------
1 | # Module that apply a bitwise and mask
2 | import cv2
3 | import numpy as np
4 | image = cv2.imread('lena.jpg')
5 | cv2.imshow('Original', image)
6 | height, width, _ = image.shape
7 | mask = np.zeros((height, width), dtype=np.uint8)
8 | center = (width // 2, height // 2)
9 | cv2.circle(mask, center, radius=100, color=255, thickness=-1)
10 | masked_image = cv2.bitwise_and(image, image, mask=mask)
11 | cv2.imshow('Mask applied to image', masked_image)
12 | cv2.waitKey(0)
13 |
--------------------------------------------------------------------------------
/fastapi-playground/pyproject.toml:
--------------------------------------------------------------------------------
1 | [tool.poetry]
2 | name = "fastapi-playground"
3 | version = "0.1.0"
4 | description = ""
5 | authors = ["cassiobotaro "]
6 |
7 | [tool.poetry.dependencies]
8 | python = "^3.13"
9 | fastapi = "^0.120.3"
10 | uvicorn = "^0.38.0"
11 |
12 | [tool.poetry.group.dev.dependencies]
13 | pytest = "^8.4.2"
14 | black = "^25.9.0"
15 |
16 | [build-system]
17 | requires = ["poetry-core>=1.0.0"]
18 | build-backend = "poetry.core.masonry.api"
19 |
--------------------------------------------------------------------------------
/lights_out/README.md:
--------------------------------------------------------------------------------
1 | # Lights Out
2 |
3 | Lights Out is game based on simple concept. Clicking on a cell toggles that cell and each of its immediate neighbors. The goal is to turn out all the lights, ideally with the minimum number of clicks.
4 |
5 |  
6 |
7 | ## Requirements
8 |
9 | It is necessary to install the tkinter package.
10 |
11 | `sudo apt install python3-tkinter`
12 |
13 | ## How to run
14 |
15 | `python lights_out.py`
16 |
--------------------------------------------------------------------------------
/orderdictbyvalue/README.md:
--------------------------------------------------------------------------------
1 | # Order a dict by values
2 |
3 | Given a dictionary, I want to sort its elements by their values, not by their keys.
4 |
5 | E.g. {1:2, 2:1} becomes {2:1, 1:2}.
6 |
7 | Firstly we get dict elements using function `items()`. The return is a list of tuples containing it's keys and values.
8 | Then we sort this list based on second element of the tuple.
9 | Finnaly we transform this list into a dict again.
10 |
11 | Remembering that only works with python 3.6+.
12 |
--------------------------------------------------------------------------------
/learningopencv/avivideo.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | import cv2
4 |
5 | ENTER = 13
6 |
7 | capture = cv2.VideoCapture('Lupi.AVI')
8 | if capture is None:
9 | print("Video not found.", file=sys.stderr)
10 | sys.exit(1)
11 |
12 | captured, frame = capture.read()
13 | key = 0
14 |
15 | while captured and key != ENTER:
16 | cv2.imshow('video', frame)
17 | captured, frame = capture.read()
18 | key = cv2.waitKey(delay=33)
19 |
20 | capture.release()
21 | cv2.destroyAllWindows()
22 |
--------------------------------------------------------------------------------
/multistagepython/Dockerfile.step3:
--------------------------------------------------------------------------------
1 | FROM python:3.9-alpine as builder
2 | RUN apk add --update build-base
3 | COPY requirements.txt .
4 | RUN pip install -r requirements.txt
5 |
6 |
7 | FROM python:3.9-alpine
8 | # required by pandas
9 | RUN apk add --update libstdc++
10 | COPY --from=builder /root/.cache /root/.cache
11 | COPY --from=builder requirements.txt .
12 | RUN pip install -r requirements.txt && rm -rf /root/.cache
13 | WORKDIR /app
14 | COPY . /app
15 | CMD ["python", "example_pandas.py"]
16 |
--------------------------------------------------------------------------------
/fastapi-playground/main.py:
--------------------------------------------------------------------------------
1 | import typing
2 |
3 | from fastapi import FastAPI
4 | from pydantic import BaseModel
5 |
6 | app = FastAPI()
7 |
8 |
9 | class AModel(BaseModel):
10 | name: str
11 | age: int
12 |
13 |
14 | class OtherModel(BaseModel):
15 | name: str
16 | weird: int
17 |
18 |
19 | class Response(BaseModel):
20 | msg: str
21 |
22 |
23 | @app.post("/union")
24 | def post_union(model: typing.Union[AModel, OtherModel]):
25 | return Response(msg=f"My name is {model.name} and my type {type(model)}")
26 |
--------------------------------------------------------------------------------
/hiding_message_in_an_image/README.md:
--------------------------------------------------------------------------------
1 | # Hiding message in an image
2 |
3 | # Step 1 - Create virtual environment
4 |
5 | ```bash
6 | python -m venv .venv && source .venv/bin/activate
7 | ```
8 |
9 | # Step 2 - Install Dependencies
10 |
11 | ```bash
12 | python -m pip install stegano
13 | ```
14 |
15 | # Step 3 - Hiding image
16 |
17 | ```bash
18 | stegano-lsb hide -i ./tests/sample-files/Lenna.png -m "Secret Message" -o Lena1.png
19 | ```
20 |
21 | # Step 4 - To reveal image execute:
22 |
23 | ```bash
24 | stegano-lsb reveal -i Lena1.png
25 | ```
26 |
--------------------------------------------------------------------------------
/copyextension/README.md:
--------------------------------------------------------------------------------
1 | # copyextension
2 |
3 | Small script to copy all files of 'extension' from 'source' to 'destiny'.
4 |
5 |
6 | ## How to run
7 |
8 | `python copyextension.py jpg source/ destiny/`
9 |
10 | ## help
11 |
12 | ```
13 | usage: copyextension.py [-h] extension source destiny
14 |
15 | positional arguments:
16 | extension files extension
17 | source directory that will be scanned
18 | destiny directory where files will be pasted
19 |
20 | optional arguments:
21 | -h, --help show this help message and exit
22 | ```
23 |
--------------------------------------------------------------------------------
/cv/flip.py:
--------------------------------------------------------------------------------
1 | # Module to flip an image
2 | import cv2
3 | image = cv2.imread('lena.jpg')
4 | cv2.imshow('Original', image)
5 | horizontal_flip = image[::-1, :] # command below
6 | # horizontal_flip = cv2.flip(image, 1)
7 | cv2.imshow('Horizontal Flip', horizontal_flip)
8 | vertical_flip = image[:, ::-1] # command below
9 | # vertical_flip = cv2.flip(img, 0)
10 | cv2.imshow('Vertical Flip', vertical_flip)
11 | hv_flip = image[::-1, ::-1] # command below
12 | # hv_flip = cv2.flip(img, -1)
13 | cv2.imshow('Horizontal and Vertical Flip', hv_flip)
14 | cv2.waitKey(0)
15 |
--------------------------------------------------------------------------------
/onelinechristmas/formatchristmas.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # One line python code to wish merry christmas with height and
3 | # custom message.
4 | #
5 | # *
6 | # ***
7 | # *****
8 | # *******
9 | # *********
10 | # |
11 | #
12 | # Merry christmas!
13 | # Usage: python tree.py
14 | # Dependency: Python 3.12+
15 | # fmt: off
16 | print(f'{'' * (width := 2 * int(input('How big is your tree?(E.g. 5) ')))}{'\n'.join(f"{'★' * stars:.^{width}}" for stars in range(1, width, 2))}\n{'▓':^{width}}\n\n{input("What's your christmas message? "):^{width}}')
17 |
--------------------------------------------------------------------------------
/cv/merge_channels.py:
--------------------------------------------------------------------------------
1 | # Module that split color channels and merge with empty channels to generate
2 | # specific colored images
3 | import cv2
4 | import numpy as np
5 |
6 | image = cv2.imread("lena.jpg")
7 | blue_channel, green_channel, red_channel = cv2.split(image)
8 | zeros = np.zeros(image.shape[:2], dtype=np.uint8)
9 |
10 | cv2.imshow('Red', cv2.merge([zeros, zeros, red_channel]))
11 | cv2.imshow('Green', cv2.merge([zeros, green_channel, zeros]))
12 | cv2.imshow('Blue', cv2.merge([blue_channel, zeros, zeros]))
13 | cv2.imshow('Original', image)
14 | cv2.waitKey(0)
15 |
--------------------------------------------------------------------------------
/xlsx2csv/README.md:
--------------------------------------------------------------------------------
1 | # xlsx2csv
2 |
3 | Convert xlsx to csv.
4 |
5 | ## Requirements
6 |
7 | `pipenv install`
8 |
9 | ## How to run
10 |
11 | `pipenv run python xlsx2csv.py example_xlsx.xlsx`
12 |
13 | or
14 |
15 | `pipenv run python xlsx2csv.py --sheet Planilha2 example_xlsx.xlsx`
16 |
17 | ## help
18 |
19 | ```
20 | usage: convert.py [-h] [--sheet SHEET] filename
21 |
22 | positional arguments:
23 | filename name of xlsx file
24 |
25 | optional arguments:
26 | -h, --help show this help message and exit
27 | --sheet SHEET name of the sheet
28 | ```
29 |
--------------------------------------------------------------------------------
/summation/summation.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 |
4 | def Σ(lower_bound, upper_bound, function):
5 | '''Summation is a math operator to easily represent a great sum of terms,
6 | even infinity.
7 |
8 | It's represented with the greek letter sigma.
9 | Sum terms from lower_bound until upper_bound, applying some function on
10 | each term.
11 |
12 | >>> Σ(1,5,lambda x:x) # 1 + 2 + 3 + 4 + 5 = 15
13 | 15
14 | '''
15 | return sum(function(index) for index in range(lower_bound,
16 | upper_bound + 1))
17 |
--------------------------------------------------------------------------------
/multistagepython/Dockerfile.step5:
--------------------------------------------------------------------------------
1 | FROM python:3-slim as builder
2 | WORKDIR /app
3 |
4 | ENV PYTHONDONTWRITEBYTECODE=1
5 | ENV PYTHONUNBUFFERED=1
6 |
7 | RUN apt-get update &&\
8 | apt-get install -y --no-install-recommends gcc
9 |
10 | COPY requirements.txt .
11 | RUN pip wheel --no-cache-dir --no-deps --wheel-dir /app/wheels -r requirements.txt
12 |
13 | FROM python:3-slim
14 | WORKDIR /app
15 |
16 | COPY --from=builder /app/wheels /wheels
17 | COPY --from=builder /app/requirements.txt .
18 |
19 | RUN pip install --no-cache /wheels/*
20 |
21 | COPY . /app
22 | CMD ["python", "example_pandas.py"]
23 |
--------------------------------------------------------------------------------
/algorithms/sort.py:
--------------------------------------------------------------------------------
1 | def find_smallest(arr):
2 | 'Given a iterable, returns smallest index.'
3 | smallest, *_ = arr
4 | smallest_index = 0
5 | for i in range(1, len(arr)):
6 | if arr[i] < smallest:
7 | smallest = arr[i]
8 | smallest_index = i
9 | return smallest_index
10 |
11 |
12 | def selection_sort(arr):
13 | '''Order an iterable using selection sort.
14 |
15 | Complexity: O(n²)
16 | '''
17 | ordered = []
18 | for _ in range(len(arr)):
19 | smallest = find_smallest(arr)
20 | ordered.append(arr.pop(smallest))
21 | return ordered
22 |
--------------------------------------------------------------------------------
/cv/histogram.py:
--------------------------------------------------------------------------------
1 | # Module that plot gray scale image histogram
2 | import cv2
3 | import matplotlib.pyplot as plt
4 |
5 | gray = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
6 | cv2.imshow('Gray Image', gray)
7 | histogram = cv2.calcHist([gray], channels=[0], mask=None,
8 | histSize=[256], ranges=[0, 256])
9 | plt.figure()
10 | plt.title('Histogram')
11 | plt.xlabel('Intesity')
12 | plt.ylabel('Quantity of Pixels')
13 | plt.plot(histogram)
14 | plt.xlim([0, 256])
15 | # Another way to plot histogram
16 | # plt.hist(gray.ravel(), bins=256, range=[0, 256])
17 | plt.savefig('histogram.png')
18 | cv2.waitKey()
19 |
--------------------------------------------------------------------------------
/onelinechristmas/onelinechristmas.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # One line python code to wish merry christmas with height and
3 | # custom message.
4 | #
5 | # *
6 | # ***
7 | # *****
8 | # *******
9 | # *********
10 | # |
11 | #
12 | # Merry christmas!
13 | # Usage: python tree.py
14 | # Dependency: Python 3.X
15 |
16 | (lambda width: print('{tree}\n{root}\n\n{message}\n'.format(tree='\n'.join('{}'.format(('★' * stars).center(width, '.')) for stars in range(1, width, 2)), root='▓'.center(width), message=input("What's your christmas message? ").center(width))))(2 * int(input('How big is your tree?(E.g. 5) '))) # noqa:E501
17 |
--------------------------------------------------------------------------------
/cv/pallete_improved.py:
--------------------------------------------------------------------------------
1 | # module to generate images based on colors(improved version)
2 | import numpy as np
3 | import cv2
4 |
5 | width = height = 100
6 | channels = 3
7 |
8 | # name -> b,g,r
9 | colors = {
10 | 'white': (255, 255, 255),
11 | 'red': (0, 0, 255),
12 | 'blue': (255, 0, 0),
13 | 'green': (0, 255, 0),
14 | 'cyan': (255, 255, 0),
15 | 'magenta': (255, 0, 255),
16 | 'yellow': (0, 255, 255),
17 | 'black': (0, 0, 0),
18 | }
19 |
20 | for name, color in colors.items():
21 | image = np.ndarray(shape=(width, height, channels), dtype=np.uint8)
22 | image[:] = color
23 | cv2.imwrite(f'pallete/{name}.jpg', image)
24 |
--------------------------------------------------------------------------------
/onelinechristmas/colorized.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # One line python code to wish merry christmas with custom height and
3 | # message.
4 | #
5 | # *
6 | # ***
7 | # *****
8 | # *******
9 | # *********
10 | # |
11 | #
12 | # Merry christmas!
13 | # Usage: python tree.py
14 | # Dependency: Python 3.X
15 |
16 | (lambda width: print('\033[0;32;40m{tree}\n{root}\n\n\033[5;31;40m{message}\n\033[0m'.format(tree='\n'.join('{}'.format(('★' * stars).center(width, '.')) for stars in range(1, width, 2)), root='▓'.center(width), message=input("What's your christmas message? ").center(width))))(2 * int(input('How big is your tree?(E.g. 5) '))) # noqa:E501
17 |
--------------------------------------------------------------------------------
/selenium_tricks/test_api/app.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | from flask import Flask, render_template, send_from_directory
4 |
5 | app = Flask(__name__)
6 |
7 |
8 | @app.route('/')
9 | def index():
10 | return render_template("hello.html")
11 |
12 |
13 | @app.route("/files/")
14 | def download_files(filename):
15 | files = os.path.join(app.root_path, "files")
16 | return send_from_directory(
17 | directory=files, filename=filename, as_attachment=True
18 | )
19 |
20 |
21 | @app.route("/files")
22 | def list_files():
23 | files = os.listdir(os.path.join(app.root_path, "files"))
24 | return render_template("list_files.html", files=files)
25 |
--------------------------------------------------------------------------------
/cv/pallete.py:
--------------------------------------------------------------------------------
1 | # module to generate images based on colors
2 | import numpy as np
3 | import cv2
4 |
5 | width = height = 100
6 | channels = 3
7 |
8 | # name -> b,g,r
9 | colors = {
10 | 'white': (255, 255, 255),
11 | 'red': (0, 0, 255),
12 | 'blue': (255, 0, 0),
13 | 'green': (0, 255, 0),
14 | 'cyan': (255, 255, 0),
15 | 'magenta': (255, 0, 255),
16 | 'yellow': (0, 255, 255),
17 | 'black': (0, 0, 0),
18 | }
19 |
20 | for name, color in colors.items():
21 | image = np.ndarray(shape=(width, height, channels), dtype=np.uint8)
22 | for y in range(height):
23 | for x in range(width):
24 | image[y, x] = color
25 | cv2.imwrite(f'pallete/{name}.jpg', image)
26 |
--------------------------------------------------------------------------------
/cv/histogram_color.py:
--------------------------------------------------------------------------------
1 | # Module that plot color image histogram
2 | import cv2
3 | import matplotlib.pyplot as plt
4 |
5 | color = cv2.imread('lena.jpg')
6 | cv2.imshow('Color Image', color)
7 |
8 | # split channels
9 | channels = cv2.split(color)
10 | colors = ('b', 'g', 'r')
11 | plt.figure()
12 | plt.title('Histogram')
13 | plt.xlabel('Intesity')
14 | plt.ylabel('Quantity of Pixels')
15 |
16 | for channel, color in zip(channels, colors):
17 | # one loop for each channel
18 | hist = cv2.calcHist([channel], channels=[0], mask=None,
19 | histSize=[256], ranges=[0, 256])
20 | plt.plot(hist, color=color)
21 | plt.xlim([0, 256])
22 | plt.savefig('histogram-color.png')
23 | cv2.waitKey()
24 |
--------------------------------------------------------------------------------
/cv/draw.py:
--------------------------------------------------------------------------------
1 | # Module to draw circles, rectangles and lines
2 | import cv2
3 |
4 | image = cv2.imread('lena.jpg')
5 |
6 | RED = (0, 0, 255)
7 | GREEN = (0, 255, 0)
8 | BLUE = (255, 0, 0)
9 | cv2.line(image, pt1=(0, 0), pt2=(100, 200), color=GREEN)
10 | cv2.line(image, pt1=(300, 200), pt2=(150, 150), color=RED, thickness=5)
11 | cv2.rectangle(image, pt1=(20, 20), pt2=(120, 120), color=BLUE, thickness=10)
12 | cv2.rectangle(image, pt1=(200, 50), pt2=(225, 125), color=GREEN, thickness=-1)
13 | height, width, _ = image.shape
14 | # image center
15 | center = (width // 2, height // 2)
16 | for radius in range(0, 175, 15):
17 | cv2.circle(image, center, radius, RED)
18 | cv2.imshow('Drawing over image', image)
19 | cv2.waitKey(0)
20 |
--------------------------------------------------------------------------------
/algorithms/search.py:
--------------------------------------------------------------------------------
1 | def linear_search(list_, item):
2 | '''Searches for an item in linear way.
3 |
4 | Complexity: O(n)
5 | '''
6 | for index, value in enumerate(list_):
7 | if value == item:
8 | return index
9 | return None
10 |
11 |
12 | def binary_search(list_, item):
13 | '''Searches for an item in a ordered list.
14 |
15 | Complexity: O(log(n))'''
16 | low = 0
17 | high = len(list_) - 1
18 | while low <= high:
19 | mid = (low + high) // 2
20 | guess = list_[mid]
21 | if guess == item:
22 | return mid
23 | elif guess > item:
24 | high = mid - 1
25 | else:
26 | low = mid + 1
27 | return None
28 |
--------------------------------------------------------------------------------
/asyncreturn/asyncreturn.py:
--------------------------------------------------------------------------------
1 | '''
2 | asyncreturn.py
3 |
4 | This module is an example of how to write async functions that return values,
5 | and how to retrieve these values.
6 | '''
7 | import asyncio
8 | import random
9 |
10 |
11 | async def process(data, sleep):
12 | await asyncio.sleep(random.randint(1, 3))
13 | return f'resultado do processamento {data}'
14 |
15 |
16 | async def data_analysis():
17 | data = [1, 2, 3, 4, 5, 6]
18 | tasks = (process(data[:len(data)//2], 3), process(data[len(data)//2:], 2))
19 | ret = await asyncio.gather(*tasks)
20 | for r in ret:
21 | print(r)
22 |
23 |
24 | if __name__ == "__main__":
25 | loop = asyncio.get_event_loop()
26 | loop.run_until_complete(data_analysis())
27 |
--------------------------------------------------------------------------------
/fastapi-playground/README.md:
--------------------------------------------------------------------------------
1 | # FastAPI Playground 🕹️
2 |
3 | ## Requirements
4 |
5 | Use poetry to install dependencies:
6 |
7 | $ pip install poetry
8 | $ poetry install
9 |
10 | ## How to run
11 |
12 | $ poetry run uvicorn main:app --reload
13 |
14 | ## Questions
15 |
16 | **Q: How to receive different types of payload?**
17 |
18 | We can use `typing.Union` as you can see in `/union` endpoint.
19 |
20 | The OpenAPI specification is correctly created using the `anyOf` element. A detail is in the validation of the fields, if it does not fit in any of the structures, the lack of all fields of all structures will be reported, including those that are repeated.
21 |
22 | NOTE: `typing.Union` is not supported in Python 3.5 and can be replaced by `|` in Python 3.10.
--------------------------------------------------------------------------------
/learningopencv/trackbar.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | import cv2
4 |
5 | ENTER = 13
6 |
7 |
8 | def on_trackbar_slide(position):
9 | capture.set(cv2.CAP_PROP_POS_FRAMES, position)
10 |
11 |
12 | capture = cv2.VideoCapture('Lupi.AVI')
13 | if capture is None:
14 | print("Video not found.", file=sys.stderr)
15 | sys.exit(1)
16 | cv2.namedWindow("Video", cv2.WINDOW_AUTOSIZE)
17 | frames = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))
18 | if frames != 0:
19 | cv2.createTrackbar("Position", "Video", 0, frames, on_trackbar_slide)
20 | captured, frame = capture.read()
21 | key = 0
22 |
23 | while captured and key != ENTER:
24 | cv2.imshow("Video", frame)
25 | captured, frame = capture.read()
26 | key = cv2.waitKey(delay=33)
27 |
28 | capture.release()
29 | cv2.destroyAllWindows()
30 |
--------------------------------------------------------------------------------
/cv/rectangles.py:
--------------------------------------------------------------------------------
1 | # Module to draw rectangles in the image
2 | import cv2
3 | image = cv2.imread('lena.jpg')
4 | # Creates a blue rectangle over the entire width of the image
5 | image[30:50, :] = (255, 0, 0)
6 | # Creates a red square
7 | image[100:150, 50:100] = (0, 0, 255)
8 | # Created a yellow rectangle all over the image height
9 | image[:, 200:220] = (0, 255, 255)
10 | # Creates a green rectangle from line 150 to 300 on columns 250 to 350
11 | image[150:301, 250:351] = (0, 255, 0)
12 | # Creates a cyan square from line 300 to 400 on columns 50 to 150
13 | image[300:401, 50:251] = (255, 255, 0)
14 | # Creates a white square
15 | image[250:350, 300:400] = (255, 255, 255)
16 | # Creates a black rectangle
17 | image[70:100, 300: 450] = (0, 0, 0)
18 |
19 | cv2.imshow('Altered image', image)
20 | cv2.imwrite('rectangles.jpg', image)
21 | cv2.waitKey(0)
22 |
--------------------------------------------------------------------------------
/cv/equalize_histogram.py:
--------------------------------------------------------------------------------
1 | # Module to equalize image histogram
2 | from matplotlib import pyplot as plt
3 | import cv2
4 |
5 | gray = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
6 | equalized_histogram = cv2.equalizeHist(gray)
7 |
8 | plt.figure()
9 | plt.title('Equalized histogram')
10 | plt.xlabel('Intensity')
11 | plt.ylabel('Quantity of Pixels')
12 | plt.hist(equalized_histogram.ravel(), bins=256, range=[0, 256])
13 | plt.xlim([0, 256])
14 | plt.savefig('equalized_histogram.png')
15 | cv2.imwrite('equalized_histogram.jpg', equalized_histogram)
16 |
17 | plt.figure()
18 | plt.title('Original histogram')
19 | plt.xlabel('Intensity')
20 | plt.ylabel('Quantity of Pixels')
21 | plt.hist(gray.ravel(), bins=256, range=[0, 256])
22 | plt.xlim([0, 256])
23 | plt.savefig('original_histogram.png')
24 | cv2.imwrite('original_histogram.jpg', gray)
25 |
26 | cv2.waitKey()
27 |
--------------------------------------------------------------------------------
/learningopencv/writeavi.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | import cv2
4 |
5 | ENTER = 13
6 |
7 | capture = cv2.VideoCapture('Lupi.AVI')
8 | if capture is None:
9 | print("Video not found.", file=sys.stderr)
10 | sys.exit(1)
11 |
12 | fourcc = cv2.VideoWriter_fourcc(*'MJPG')
13 | output_size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
14 | int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
15 | fps = capture.get(cv2.CAP_PROP_FPS)
16 | output = cv2.VideoWriter('writeavi.avi', fourcc, fps, output_size,
17 | isColor=1)
18 |
19 | captured, frame = capture.read()
20 | key = 0
21 |
22 | while captured and key != ENTER:
23 | output.write(frame)
24 | cv2.imshow('video', frame)
25 | captured, frame = capture.read()
26 | key = cv2.waitKey(delay=33)
27 |
28 | capture.release()
29 | output.release()
30 | cv2.destroyAllWindows()
31 |
--------------------------------------------------------------------------------
/love/love.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "math"
6 | "strings"
7 | )
8 |
9 | var love string
10 |
11 | func main() {
12 | if love == "" {
13 | love = "Love"
14 | }
15 | lines := []string{}
16 | for y := 30.0; y > -30; y-- {
17 | arr := []string{}
18 | for x := -30.0; x <= 30; x++ {
19 | result := " "
20 | if math.Pow(math.Pow(x*0.05, 2)+math.Pow(y*0.1, 2)-1, 3)-math.Pow(x*0.05, 2)*math.Pow(y*0.1, 3) <= 0 {
21 | result = string(love[modPy(int(x-y), len(love))])
22 | }
23 | arr = append(arr, result)
24 | }
25 | lines = append(lines, strings.Join(arr, ""))
26 | }
27 | fmt.Println(strings.Join(lines, "\n"))
28 | var exit rune
29 | fmt.Scanf("%c", &exit)
30 | }
31 |
32 | func modPy(d, m int) int {
33 | var res = d % m
34 | if (res < 0 && m > 0) || (res > 0 && m < 0) {
35 | return res + m
36 | }
37 | return res
38 | }
39 |
--------------------------------------------------------------------------------
/learningopencv/cannyreduce.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | import cv2
4 |
5 |
6 | def do_pyr_down(image):
7 | height, width, *_ = image.shape
8 | assert width % 2 == 0 and height % 2 == 0
9 | return cv2.pyrDown(image)
10 |
11 |
12 | def do_canny(image, low_threshold, high_threshold, aperture):
13 | if len(image.shape) < 3:
14 | image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
15 | return cv2.Canny(image, low_threshold, high_threshold,
16 | apertureSize=aperture)
17 |
18 |
19 | image = cv2.imread("lena.jpg")
20 | if image is None:
21 | print("Image not found.", file=sys.stderr)
22 | sys.exit(1)
23 | reduced_image = do_pyr_down(image)
24 | canny = do_canny(image, low_threshold=10, high_threshold=100, aperture=3)
25 | cv2.imshow("image", image)
26 | cv2.imshow("reduced image", reduced_image)
27 | cv2.imshow("canny", canny)
28 | cv2.waitKey()
29 |
--------------------------------------------------------------------------------
/dockerize/run.py:
--------------------------------------------------------------------------------
1 | '''
2 | Dockerize
3 |
4 | Dockerize will run 42 containers,beign n(number of cores in machine)
5 | containers simutaneously, each one doing some task.
6 | '''
7 | import os
8 | from multiprocessing import Pool
9 |
10 | import docker
11 |
12 |
13 | def run_container(command):
14 | # instantiate a client using default socket or enviroment variable.
15 | client = docker.from_env()
16 | # run some command using alpine:latest and then remove the container
17 | output = client.containers.run('alpine:latest', command, remove=True)
18 | # print standard output from container
19 | print(output.decode('utf-8'))
20 |
21 |
22 | # list of commands to run
23 | commands = [f'echo container {index}' for index in range(1, 43)]
24 |
25 | # do a process pool and invoke `run_container` with each command in commands
26 | # list
27 | with Pool(os.cpu_count()) as p:
28 | p.map(run_container, commands)
29 |
--------------------------------------------------------------------------------
/selenium_tricks/README.md:
--------------------------------------------------------------------------------
1 | # Selenium tricks
2 |
3 | Many tricks using selenium.
4 |
5 | ## Requirements
6 |
7 | Install the following requirements to run the codes correctly
8 |
9 | * [geckodriver](https://github.com/mozilla/geckodriver/releases)
10 |
11 | * [chromedriver](https://sites.google.com/a/chromium.org/chromedriver/downloads)
12 |
13 | ```bash
14 | $ python -m venv .env
15 | $ source .env/bin/activate
16 | $ pip install -r requirements.txt
17 | ```
18 |
19 |
20 | ## Summary
21 |
22 | |Title|Description|
23 | |:----|:----------|
24 | |[Headless Selenium](headless/)| An example of how to run headless browsers without third parties. |
25 | |[Download files in headless mode](download_files_headless/)| Download file using selenium. |
26 |
27 |
28 | ## TODO
29 |
30 | - download silent
31 | - proxy
32 | - crop image
33 | - page objects
34 | - dockerize
35 | - remote
36 | - wait open a new window
37 | - image is loaded
38 |
--------------------------------------------------------------------------------
/learningopencv/videorgb2gray.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | import cv2
4 |
5 | ENTER = 13
6 |
7 | capture = cv2.VideoCapture('Lupi.AVI')
8 | if capture is None:
9 | print("Video not found.", file=sys.stderr)
10 | sys.exit(1)
11 |
12 | fourcc = cv2.VideoWriter_fourcc(*'MJPG')
13 | output_size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
14 | int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
15 | fps = capture.get(cv2.CAP_PROP_FPS)
16 | output = cv2.VideoWriter('videorgb2gray.avi', fourcc, fps, output_size,
17 | isColor=0)
18 |
19 | captured, frame = capture.read()
20 | key = 0
21 |
22 | while captured and key != ENTER:
23 | gray_frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
24 | output.write(gray_frame)
25 | cv2.imshow('video', frame)
26 | cv2.imshow('Black & white', gray_frame)
27 | captured, frame = capture.read()
28 | key = cv2.waitKey(delay=33)
29 |
30 | capture.release()
31 | output.release()
32 | cv2.destroyAllWindows()
33 |
--------------------------------------------------------------------------------
/dataanalysis/requirements.txt:
--------------------------------------------------------------------------------
1 | backcall==0.1.0
2 | bleach==3.3.0
3 | cycler==0.10.0
4 | decorator==4.3.0
5 | defusedxml==0.5.0
6 | entrypoints==0.2.3
7 | ipykernel==5.1.0
8 | ipython==8.10.0
9 | ipython-genutils==0.2.0
10 | ipywidgets==7.4.2
11 | jedi==0.13.2
12 | Jinja2==3.1.6
13 | jsonschema==2.6.0
14 | jupyter==1.0.0
15 | jupyter-client==5.2.4
16 | jupyter-console==6.0.0
17 | jupyter-core==4.11.2
18 | kiwisolver==1.0.1
19 | MarkupSafe==1.1.0
20 | matplotlib==3.0.2
21 | mistune==2.0.3
22 | nbconvert==6.5.1
23 | nbformat==4.4.0
24 | notebook==6.4.12
25 | numpy==1.22.0
26 | pandas==0.23.4
27 | pandocfilters==1.4.2
28 | parso==0.5.0
29 | pexpect==4.6.0
30 | pickleshare==0.7.5
31 | prometheus-client==0.5.0
32 | prompt-toolkit==2.0.7
33 | ptyprocess==0.6.0
34 | Pygments==2.15.0
35 | pyparsing==2.3.0
36 | python-dateutil==2.7.5
37 | pytz==2018.7
38 | pyzmq==17.1.2
39 | qtconsole==4.4.3
40 | Send2Trash==1.5.0
41 | six==1.12.0
42 | terminado==0.8.1
43 | testpath==0.4.2
44 | tornado==6.5.1
45 | traitlets==4.3.2
46 | wcwidth==0.1.7
47 | webencodings==0.5.1
48 | widgetsnbextension==3.4.2
49 |
--------------------------------------------------------------------------------
/paulinhaclass/requirements.txt:
--------------------------------------------------------------------------------
1 | backcall==0.1.0
2 | bleach==3.3.0
3 | cycler==0.10.0
4 | decorator==4.3.0
5 | entrypoints==0.2.3
6 | html5lib==1.0.1
7 | ipykernel==4.8.2
8 | ipython==8.10.0
9 | ipython-genutils==0.2.0
10 | ipywidgets==7.3.0
11 | jedi==0.12.1
12 | Jinja2==3.1.6
13 | jsonschema==2.6.0
14 | jupyter==1.0.0
15 | jupyter-client==5.2.3
16 | jupyter-console==5.2.0
17 | jupyter-core==4.11.2
18 | kiwisolver==1.0.1
19 | MarkupSafe==1.0
20 | matplotlib==2.2.2
21 | mistune==2.0.3
22 | nbconvert==6.5.1
23 | nbformat==4.4.0
24 | notebook==6.4.12
25 | numpy==1.22.0
26 | pandas==0.23.3
27 | pandocfilters==1.4.2
28 | parso==0.5.0
29 | pexpect==4.6.0
30 | pickleshare==0.7.4
31 | prometheus-client==0.3.0
32 | prompt-toolkit==1.0.15
33 | ptyprocess==0.6.0
34 | Pygments==2.15.0
35 | pyparsing==2.2.0
36 | python-dateutil==2.7.3
37 | pytz==2018.5
38 | pyzmq==17.1.0
39 | qtconsole==4.3.1
40 | Send2Trash==1.5.0
41 | simplegeneric==0.8.1
42 | six==1.11.0
43 | terminado==0.8.1
44 | testpath==0.3.1
45 | tornado==6.5.1
46 | traitlets==4.3.2
47 | wcwidth==0.1.7
48 | webencodings==0.5.1
49 | widgetsnbextension==3.3.0
50 |
--------------------------------------------------------------------------------
/learningopencv/logpolar.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | import cv2
4 |
5 | ENTER = 13
6 |
7 | capture = cv2.VideoCapture('Lupi.AVI')
8 | if capture is None:
9 | print("Video not found.", file=sys.stderr)
10 | sys.exit(1)
11 |
12 | fourcc = cv2.VideoWriter_fourcc(*'MJPG')
13 | output_size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
14 | int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
15 | fps = capture.get(cv2.CAP_PROP_FPS)
16 | output = cv2.VideoWriter('logpolar.avi', fourcc, fps, output_size,
17 | isColor=1)
18 |
19 | captured, frame = capture.read()
20 | key = 0
21 |
22 | while captured and key != ENTER:
23 | width, height = output_size
24 | logpolar_frame = cv2.warpPolar(
25 | src=frame,
26 | dsize=output_size,
27 | center=(width//2, height//2),
28 | maxRadius=40,
29 | flags=cv2.INTER_LINEAR+cv2.WARP_FILL_OUTLIERS+cv2.WARP_INVERSE_MAP
30 | )
31 | output.write(logpolar_frame)
32 | cv2.imshow('video', frame)
33 | cv2.imshow('Logpolar', logpolar_frame)
34 | captured, frame = capture.read()
35 | key = cv2.waitKey(delay=33)
36 |
37 | capture.release()
38 | output.release()
39 | cv2.destroyAllWindows()
40 |
--------------------------------------------------------------------------------
/xlsx2csv/xlsx2csv.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | '''
3 | xlsx2csv
4 |
5 | Convert xlsx to csv.
6 |
7 | usage: xlsx2csv.py [-h] [--sheet SHEET] filename
8 |
9 | positional arguments:
10 | filename name of xlsx file
11 |
12 | optional arguments:
13 | -h, --help show this help message and exit
14 | --sheet SHEET name of the sheet
15 | '''
16 | import argparse
17 | import csv
18 | import sys
19 |
20 | import openpyxl
21 |
22 | # Define command line interface
23 | parser = argparse.ArgumentParser()
24 | parser.add_argument('filename', help='name of xlsx file')
25 | parser.add_argument('--sheet', required=False, help='name of the sheet')
26 | args = parser.parse_args()
27 |
28 | # load file, but don't convert fields
29 | workbook = openpyxl.load_workbook(filename=args.filename)
30 | # get first sheet or use name passed as parameter
31 | sheet_name, *_ = workbook.sheetnames
32 | if args.sheet:
33 | sheet_name = args.sheet
34 |
35 | # get sheet by it's name
36 | sheet = workbook[sheet_name]
37 |
38 | csv_writer = csv.writer(sys.stdout, quoting=csv.QUOTE_ALL, lineterminator='\n')
39 | # write each csv line in stdout
40 | for row in sheet.rows:
41 | csv_writer.writerow(column.value or '' for column in row)
42 |
--------------------------------------------------------------------------------
/selenium_tricks/download_files_headless/firefox_example.py:
--------------------------------------------------------------------------------
1 | import os
2 | import time
3 |
4 | from selenium.webdriver import Firefox, FirefoxProfile, FirefoxOptions
5 |
6 | # set browser headless
7 | options = FirefoxOptions()
8 | options.headless = True
9 | # profile to download some mime types automatically
10 | profile = FirefoxProfile()
11 | profile.set_preference('browser.download.folderList', 2)
12 | profile.set_preference('browser.download.dir', os.getcwd())
13 | # you can select multiple types of files by separating them with commas
14 | profile.set_preference('browser.helperApps.neverAsk.saveToDisk',
15 | 'text/plain,image/jpeg')
16 | # start firefox and connect into it
17 | driver = Firefox(options=options, firefox_profile=profile)
18 | url = 'http://localhost:5000/files'
19 | # warning: doing driver.get directly in the files downloads URL
20 | # causes a strange crash
21 | # navigate to the site
22 | driver.get(url)
23 | # get "a" element and click
24 | driver.find_element_by_css_selector('a[href $= "some_text.txt"]').click()
25 | # download image also
26 | driver.find_element_by_css_selector('a[href $= "lena.jpg"]').click()
27 | # wait downloads to finish
28 | time.sleep(3)
29 | # close firefox
30 | driver.quit()
31 |
--------------------------------------------------------------------------------
/xlsx2csv/poetry.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Poetry and should not be changed by hand.
2 |
3 | [[package]]
4 | name = "et-xmlfile"
5 | version = "1.1.0"
6 | description = "An implementation of lxml.xmlfile for the standard library"
7 | category = "main"
8 | optional = false
9 | python-versions = ">=3.6"
10 | files = [
11 | {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"},
12 | {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"},
13 | ]
14 |
15 | [[package]]
16 | name = "openpyxl"
17 | version = "3.0.10"
18 | description = "A Python library to read/write Excel 2010 xlsx/xlsm files"
19 | category = "main"
20 | optional = false
21 | python-versions = ">=3.6"
22 | files = [
23 | {file = "openpyxl-3.0.10-py2.py3-none-any.whl", hash = "sha256:0ab6d25d01799f97a9464630abacbb34aafecdcaa0ef3cba6d6b3499867d0355"},
24 | {file = "openpyxl-3.0.10.tar.gz", hash = "sha256:e47805627aebcf860edb4edf7987b1309c1b3632f3750538ed962bbcc3bd7449"},
25 | ]
26 |
27 | [package.dependencies]
28 | et-xmlfile = "*"
29 |
30 | [metadata]
31 | lock-version = "2.0"
32 | python-versions = "^3.11"
33 | content-hash = "9f7b53fe6d82aab922aac531af29c18f1b5257a2a77eb035dd6cd27c6fb7eea9"
34 |
--------------------------------------------------------------------------------
/copyextension/copyextension.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | '''
3 | copytext
4 |
5 | Small script to copy all files of 'extension' from 'source' to 'destiny'.
6 |
7 | usage: copyextension.py [-h] extension source destiny
8 |
9 | positional arguments:
10 | extension files extension
11 | source directory that will be scanned
12 | destiny directory where files will be pasted
13 |
14 | optional arguments:
15 | -h, --help show this help message and exit
16 | '''
17 | import argparse
18 | import shutil
19 | import sys
20 | from pathlib import Path
21 |
22 | # argparse is used to provide a better interface and help
23 | parser = argparse.ArgumentParser()
24 | parser.add_argument('extension', help='files extension')
25 | parser.add_argument('source', help='directory that will be scanned')
26 | parser.add_argument('destiny', help='directory where files will be pasted')
27 | args = parser.parse_args()
28 | extension, source, destiny = args.extension, Path(args.source), \
29 | Path(args.destiny)
30 |
31 | # check if source and destiny exists
32 | if not source.is_dir() or not destiny.is_dir():
33 | print('source or destiny doesn\'t exists.', file=sys.stderr)
34 | sys.exit(1)
35 |
36 | # iterate over source source directory looking for that extension,
37 | # then copy the file
38 | for file in source.glob(f'*.{extension}'):
39 | print(f'copying {file}...')
40 | shutil.copy2(file, destiny)
41 |
42 | print('Done!')
43 |
--------------------------------------------------------------------------------
/algorithms/greedy.py:
--------------------------------------------------------------------------------
1 | '''Greedy algorithms module'''
2 |
3 |
4 | def _best_coverage(stations, states_to_cover):
5 | '''Return station and coverage states for best coverage.'''
6 | best_station = None
7 | coverage_states = {}
8 | for station, states in stations.items():
9 | coverage = states_to_cover & states
10 | if len(coverage) > len(coverage_states):
11 | best_station = station
12 | coverage_states = coverage
13 | return best_station, coverage_states
14 |
15 |
16 | def optimize_stations(stations, states_to_cover):
17 | '''List stations to cover all states.'''
18 | final_stations = set()
19 | while states_to_cover:
20 | best_station, coverage_states = _best_coverage(stations)
21 | states_to_cover -= coverage_states
22 | final_stations.add(best_station)
23 | return final_stations
24 |
25 |
26 | def main():
27 | '''Given states to cover and stations, pick less stations that cover
28 | all states.'''
29 | states_to_cover = {'mt', 'wa', 'or', 'id', 'nv', 'ut', 'ca', 'az'}
30 |
31 | stations = {}
32 | stations['kone'] = {'id', 'nv', 'ut'}
33 | stations['ktwo'] = {'wa', 'id', 'mt'}
34 | stations['kthree'] = {'or', 'nv', 'ca'}
35 | stations['kfour'] = {'nv', 'ut'}
36 | stations['kfive'] = {'ca', 'az'}
37 | print("Stations: ", optimize_stations(stations, states_to_cover))
38 |
39 |
40 | if __name__ == "__main__":
41 | main()
42 |
--------------------------------------------------------------------------------
/toxpipenv/README.md:
--------------------------------------------------------------------------------
1 | # pipenv + tox
2 |
3 | ## Steps to reproduce
4 |
5 | 1 - Follow [the instructions](http://pipenv.readthedocs.io/en/latest/install/#installing-pipenv) to install pipenv.
6 |
7 | 2 - start an empty project with clean setup.py, e.g.
8 |
9 | setup.py
10 |
11 | ```python
12 | #!/usr/bin/env python
13 |
14 | from distutils.core import setup
15 |
16 | setup(name='toxpipenv',
17 | version='1.0',
18 | description='Just some tests',
19 | author='Cássio Botaro',
20 | author_email='cassiobotaro@gmail.com',
21 | packages=['toxpipenv'],
22 | )
23 | ```
24 |
25 | 2 - add simple code and tests
26 |
27 | toxpipenv/core.py
28 |
29 | ```python
30 | def square(number):
31 | """Calculates square of a number.
32 |
33 | :number: a number
34 | :returns: square of a number
35 |
36 | """
37 | return number ** 2
38 | ```
39 |
40 | tests/test_core.py
41 |
42 | ```python
43 | from toxpipenv.core import square
44 |
45 |
46 | def test_square():
47 | assert square(2) == 4
48 | ```
49 |
50 | 3 - Install requirements
51 |
52 | tox
53 |
54 | `pipenv install tox --dev`
55 |
56 | own package
57 |
58 | `pipenv install -e . --dev`
59 |
60 | 4 - configure tox to run using pipenv and pytest
61 |
62 | ```
63 | [tox]
64 | envlist = py27,py36
65 |
66 | [testenv]
67 | passenv = HOME
68 | deps = pipenv
69 | commands =
70 | pipenv install --dev
71 | pipenv run python -m pytest tests
72 | ```
73 |
74 | 5 - Voilá. Tox is configured and running two different versions of python!
75 |
76 | `pipenv run tox`
77 |
--------------------------------------------------------------------------------
/dataanalysis/Jupyter Notebook.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 4,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "import pandas as pd\n",
10 | "import numpy as np\n",
11 | "import matplotlib.pyplot as plt\n",
12 | "%matplotlib inline"
13 | ]
14 | },
15 | {
16 | "cell_type": "code",
17 | "execution_count": 2,
18 | "metadata": {},
19 | "outputs": [
20 | {
21 | "data": {
22 | "text/plain": [
23 | "'0.23.3'"
24 | ]
25 | },
26 | "execution_count": 2,
27 | "metadata": {},
28 | "output_type": "execute_result"
29 | }
30 | ],
31 | "source": [
32 | "pd.__version__"
33 | ]
34 | },
35 | {
36 | "cell_type": "code",
37 | "execution_count": 3,
38 | "metadata": {},
39 | "outputs": [
40 | {
41 | "data": {
42 | "text/plain": [
43 | "'1.15.0'"
44 | ]
45 | },
46 | "execution_count": 3,
47 | "metadata": {},
48 | "output_type": "execute_result"
49 | }
50 | ],
51 | "source": [
52 | "np.__version__"
53 | ]
54 | }
55 | ],
56 | "metadata": {
57 | "kernelspec": {
58 | "display_name": "Python 3",
59 | "language": "python",
60 | "name": "python3"
61 | },
62 | "language_info": {
63 | "codemirror_mode": {
64 | "name": "ipython",
65 | "version": 3
66 | },
67 | "file_extension": ".py",
68 | "mimetype": "text/x-python",
69 | "name": "python",
70 | "nbconvert_exporter": "python",
71 | "pygments_lexer": "ipython3",
72 | "version": "3.6.6"
73 | }
74 | },
75 | "nbformat": 4,
76 | "nbformat_minor": 2
77 | }
78 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | env/
12 | build/
13 | develop-eggs/
14 | dist/
15 | downloads/
16 | eggs/
17 | .eggs/
18 | lib/
19 | lib64/
20 | parts/
21 | sdist/
22 | var/
23 | wheels/
24 | *.egg-info/
25 | .installed.cfg
26 | *.egg
27 |
28 | # PyInstaller
29 | # Usually these files are written by a python script from a template
30 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
31 | *.manifest
32 | *.spec
33 |
34 | # Installer logs
35 | pip-log.txt
36 | pip-delete-this-directory.txt
37 |
38 | # Unit test / coverage reports
39 | htmlcov/
40 | .tox/
41 | .coverage
42 | .coverage.*
43 | .cache
44 | nosetests.xml
45 | coverage.xml
46 | *.cover
47 | .hypothesis/
48 |
49 | # Translations
50 | *.mo
51 | *.pot
52 |
53 | # Django stuff:
54 | *.log
55 | local_settings.py
56 |
57 | # Flask stuff:
58 | instance/
59 | .webassets-cache
60 |
61 | # Scrapy stuff:
62 | .scrapy
63 |
64 | # Sphinx documentation
65 | docs/_build/
66 |
67 | # PyBuilder
68 | target/
69 |
70 | # Jupyter Notebook
71 | .ipynb_checkpoints
72 |
73 | # pyenv
74 | .python-version
75 |
76 | # celery beat schedule file
77 | celerybeat-schedule
78 |
79 | # SageMath parsed files
80 | *.sage.py
81 |
82 | # dotenv
83 | .env
84 |
85 | # virtualenv
86 | .venv
87 | venv/
88 | ENV/
89 |
90 | # Spyder project settings
91 | .spyderproject
92 | .spyproject
93 |
94 | # Rope project settings
95 | .ropeproject
96 |
97 | # mkdocs documentation
98 | /site
99 |
100 | # mypy
101 | .mypy_cache/
102 |
--------------------------------------------------------------------------------
/selenium_tricks/download_files_headless/chrome_example.py:
--------------------------------------------------------------------------------
1 | import os
2 | import time
3 |
4 | from selenium.webdriver import Chrome, ChromeOptions
5 |
6 |
7 | def enable_download_in_headless_chrome(driver, download_dir):
8 | # hack founded in
9 | # https://stackoverflow.com/questions/45631715/downloading-with-chrome-headless-and-selenium
10 | # add missing support for chrome "send_command" to selenium webdriver
11 | driver.command_executor._commands["send_command"] = (
12 | "POST",
13 | "/session/$sessionId/chromium/send_command",
14 | )
15 |
16 | params = {
17 | "cmd": "Page.setDownloadBehavior",
18 | "params": {"behavior": "allow", "downloadPath": download_dir},
19 | }
20 | driver.execute("send_command", params)
21 |
22 |
23 | # set browser headless
24 | options = ChromeOptions()
25 | options.headless = True
26 | # profile to download files automatically
27 | options.add_experimental_option(
28 | "prefs",
29 | {
30 | "download.default_directory": os.getcwd(),
31 | "download.prompt_for_download": False,
32 | "download.directory_upgrade": True,
33 | "safebrowsing.enabled": True,
34 | },
35 | )
36 |
37 | # start firefox and connect into it
38 | driver = Chrome(options=options)
39 | enable_download_in_headless_chrome(driver, os.getcwd())
40 | url = "http://localhost:5000/files"
41 | # navigate to the site
42 | driver.get(url)
43 | # get "a" element and click
44 | driver.find_element_by_css_selector('a[href $= "some_text.txt"]').click()
45 | # download image also
46 | driver.find_element_by_css_selector('a[href $= "lena.jpg"]').click()
47 | # wait downloads to finish
48 | time.sleep(3)
49 | # close firefox
50 | driver.quit()
51 |
--------------------------------------------------------------------------------
/cv/README.md:
--------------------------------------------------------------------------------
1 | # Computer Vision
2 |
3 | Fundamentals of computer vision.
4 |
5 | ## Requirements
6 |
7 | `poetry install`
8 |
9 | ## How to run
10 |
11 | `poetry run python `
12 |
13 | ## Modules
14 |
15 | |module|description|
16 | |:----|:----------|
17 | | always\_blue.py | Module to modify an image pixels to blue |
18 | | change\_color\_component.py | Module to modify an image pixels based on it's position |
19 | | change\_green\_component.py | Module to modify an image pixels based on it's position |
20 | | change\_with\_jump.py | Module to modify an image(yellow) pixels based on it's position |
21 | | metadata.py | Module to get image metadata |
22 | | pallete.py | module to generate images based on colors |
23 | | pixel.py | Module to read one pixel |
24 | | green\_slice.py | Module to change a slice of pixels into green |
25 | | pallete\_improved.py | As pallete but smaller |
26 | | rectangles.py | Module to daw rectangles in the image |
27 | | draw.py | Module to draw rectangles in the image |
28 | | text.py | Module to write a text into an image |
29 | | crop.py | Module to crop an image |
30 | | resize.py | Module to resize an image |
31 | | resize\_slice.py | Module to resize an image using slicing |
32 | | flip.py | Module to flip an image |
33 | | rotate.py | Module to rotate an image |
34 | | mask.py | Module that apply a bitwise and mask |
35 | | color\_system.py | Module to show other color systems |
36 | | split\_channels.py | Module that split color channels |
37 | | merge\_channels.py| Module that split color channels and merge with empty channels to generate specific colored images |
38 | | histogram.py | Module that plot gray scale image histogram |
39 | | histogram\_color.py | Module that plot color image histogram |
40 | | equalize\_histogram.py | Module to equalize image histogram |
41 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Rivendell
2 | :seedling: A place of peace and beauty where knowledge and stories are preserved.
3 |
4 | ## Summary
5 |
6 | |Title|Description|
7 | |:----|:----------|
8 | |[Tox + Pipenv](toxpipenv/)| How to manage environments and run multiple python versions. |
9 | |[Order dict by values](orderdictbyvalue/)| Order dict by it's values. |
10 | |[One line christmas](onelinechristmas/)| Merry christmas with just one line. |
11 | |[Copy extension](copyextension/)| Small CLI to to copy all files of 'extension' from 'source' to 'destiny'. |
12 | |[Σ](summation/)| Sum terms from lower bound until upper bound, applying some function on each term. |
13 | |[Dockerize](dockerize/)| Run containers simutaneously and get output. |
14 | |[xlsx2csv](xlsx2csv/)| Convert xlsx to csv. |
15 | |[Multi-stage build with Python](multistagepython/)| How to optimize your python image using multi-stage build. |
16 | |[Paulinha's class](paulinhaclass/)| Deep learning fundamentals by [@paulinhacnn](http://github.com/paulinhacnn). |
17 | |[algorithms](algorithms/)| Many algorithms from book "Entendendo Algoritmos". |
18 | |[Async with return](asyncreturn/)| Async functions that return values and how to retrieve these values. |
19 | |[Data Analysis with pandas](dataanalysis/)| Notebooks about data analysis with python. |
20 | |[Computer vision 101](cv/)| Algorithms to learning computer vision. |
21 | |[Learning opencv](learningopencv/)| Opencv library studies(python version). |
22 | |[Love](love/)| Draw a heart using a name. |
23 | |[Selenium Tricks](selenium_tricks/)| Many tricks using selenium. |
24 | |[Lights Out](lights_out/)| Game to practice OOP. |
25 | |[Steganography](hiding_message_in_an_image/)| Hiding message in an image |
26 | |[FastAPI Playground](fastapi-playground/)| Some experiments with FastAPI |
27 | |[Snake game](snake_game/)| Snake game using Pygame |
28 |
--------------------------------------------------------------------------------
/algorithms/dijkstra.py:
--------------------------------------------------------------------------------
1 | ''' Dijkstra's algorithm module'''
2 |
3 | # the graph
4 | graph = {}
5 | graph["start"] = {}
6 | graph["start"]["a"] = 6
7 | graph["start"]["b"] = 2
8 |
9 | graph["a"] = {}
10 | graph["a"]["end"] = 1
11 |
12 | graph["b"] = {}
13 | graph["b"]["a"] = 3
14 | graph["b"]["end"] = 5
15 |
16 | graph["end"] = {}
17 |
18 | # the costs table
19 | inendity = float("inf")
20 | costs = {}
21 | costs["a"] = 6
22 | costs["b"] = 2
23 | costs["end"] = inendity
24 |
25 | # the parents table
26 | parents = {}
27 | parents["a"] = "start"
28 | parents["b"] = "start"
29 | parents["end"] = None
30 |
31 | processed = []
32 |
33 |
34 | def find_lowest_cost_node(costs):
35 | '''Find the lowest cost node.'''
36 | lowest_cost = float("inf")
37 | lowest_cost_node = None
38 | for node in costs:
39 | cost = costs[node]
40 | if cost < lowest_cost and node not in processed:
41 | lowest_cost = cost
42 | lowest_cost_node = node
43 | return lowest_cost_node
44 |
45 |
46 | def search(graph, costs, parents):
47 | '''Find the lowest-cost in a pounded graph.'''
48 | node = find_lowest_cost_node(costs)
49 | while node:
50 | cost = costs[node]
51 | neighbors = graph[node]
52 | for n in neighbors.keys():
53 | new_cost = cost + neighbors[n]
54 | if costs[n] > new_cost:
55 | costs[n] = new_cost
56 | parents[n] = node
57 | processed.append(node)
58 | node = find_lowest_cost_node(costs)
59 |
60 |
61 | def path(parents):
62 | '''Draw path from start to end'''
63 | parent = parents["end"]
64 | path = ["end"]
65 | while parent:
66 | path.insert(0, parent)
67 | parent = parents.get(parent)
68 | return path
69 |
70 |
71 | def main():
72 | '''Search shortest path from start to end.'''
73 | search(graph, costs, parents)
74 | print("Path: ", " -> ".join(path(parents)))
75 |
76 |
77 | if __name__ == "__main__":
78 | main()
79 |
--------------------------------------------------------------------------------
/algorithms/bfs.py:
--------------------------------------------------------------------------------
1 | '''Breadth-First Search module. '''
2 | from collections import deque
3 |
4 | GRAPH = {}
5 | GRAPH["you"] = ["alice", "bob", "claire"]
6 | GRAPH["bob"] = ["anuj", "peggy"]
7 | GRAPH["alice"] = ["peggy"]
8 | GRAPH["claire"] = ["thom", "jonny"]
9 | GRAPH["anuj"] = []
10 | GRAPH["peggy"] = []
11 | GRAPH["thom"] = []
12 | GRAPH["jonny"] = []
13 |
14 |
15 | def _sells_mango(person):
16 | return person.endswith("m")
17 |
18 |
19 | def search(name):
20 | '''Search people who sells mango'''
21 | search_queue = deque()
22 | search_queue += GRAPH[name]
23 | verified = []
24 | while search_queue:
25 | person = search_queue.popleft()
26 | if person not in verified:
27 | if _sells_mango(person):
28 | print(f"{person} sells mango!")
29 | return True
30 | search_queue += GRAPH[person]
31 | verified.append(person)
32 | return False
33 |
34 |
35 | def search_path_bookstyle(name):
36 | '''Returns path to people who sells mango, empty if not found.'''
37 | search_queue = deque([(name, [name]), ])
38 | verified = []
39 | while search_queue:
40 | person, path = search_queue.popleft()
41 | if person not in verified:
42 | if _sells_mango(person):
43 | return path
44 | search_queue += ((next_, path + [next_])
45 | for next_ in GRAPH[person])
46 | verified.append(person)
47 | return []
48 |
49 |
50 | def search_path(name):
51 | '''Returns path to people who sells mango, empty if not found.'''
52 | search_queue = deque([(name, [name]), ])
53 | while search_queue:
54 | person, path = search_queue.popleft()
55 | for next_ in set(GRAPH[person]) - set(path):
56 | if _sells_mango(next_):
57 | return path + [next_]
58 | search_queue.append((next_, path + [next_]))
59 | return []
60 |
61 |
62 | def main():
63 | '''Search people who sells mango starting from you.'''
64 | search("you")
65 | print(search_path_bookstyle("you"))
66 | print(search_path("you"))
67 |
68 |
69 | if __name__ == "__main__":
70 | main()
71 |
--------------------------------------------------------------------------------
/lights_out/lights_out.py:
--------------------------------------------------------------------------------
1 | from functools import partial
2 | import tkinter
3 |
4 |
5 | class Cell(tkinter.Button):
6 |
7 | ON_COLOR = 'yellow'
8 | OFF_COLOR = 'blue'
9 |
10 | def __init__(self):
11 | super().__init__()
12 | self.__state = "on"
13 | self.turn_on()
14 | self.configure(command=self.toggle_state)
15 |
16 | def turn_on(self):
17 | self.__state = "on"
18 | self.configure(bg=Cell.ON_COLOR)
19 | self.configure(activebackground=Cell.ON_COLOR)
20 | self.configure(relief=tkinter.RAISED)
21 |
22 | def turn_off(self):
23 | self.__state = "off"
24 | self.configure(bg=Cell.OFF_COLOR)
25 | self.configure(activebackground=Cell.OFF_COLOR)
26 | self.configure(relief=tkinter.SUNKEN)
27 |
28 | def toggle_state(self):
29 | if self.__state == "off":
30 | self.turn_on()
31 | else:
32 | self.turn_off()
33 |
34 | def set_command(self, block):
35 | def composition():
36 | self.toggle_state()
37 | block()
38 | self.configure(command=composition)
39 |
40 |
41 | class Game(tkinter.Frame):
42 | def __init__(self, master=None, cnf={}, **kw):
43 | super().__init__(master=None, cnf={}, **kw)
44 | self.cells = []
45 | for x in range(self.cells_per_side):
46 | line = []
47 | for y in range(self.cells_per_side):
48 | line.append(self.new_cell_at(x, y))
49 | self.cells.append(line)
50 |
51 | def new_cell_at(self, x, y):
52 | c = Cell()
53 | c.grid(row=x, column=y)
54 | c.set_command(partial(self.toggle_neighbours_of_cell_at, x, y))
55 | return c
56 |
57 | def toggle_neighbours_of_cell_at(self, i, j):
58 | if i >= 1:
59 | self.cells[i - 1][j].toggle_state()
60 | if i < self.cells_per_side - 1:
61 | self.cells[i + 1][j].toggle_state()
62 | if j >= 1:
63 | self.cells[i][j - 1].toggle_state()
64 | if j < self.cells_per_side - 1:
65 | self.cells[i][j + 1].toggle_state()
66 |
67 | @property
68 | def cells_per_side(self):
69 | return 3
70 |
71 |
72 | if __name__ == "__main__":
73 | game = Game()
74 | game.mainloop()
75 |
--------------------------------------------------------------------------------
/multistagepython/README.md:
--------------------------------------------------------------------------------
1 | # Multi-stage builds with Python
2 |
3 | How to optimize your python image using multi-stage build.
4 |
5 | ## How to run
6 |
7 | ### Step 1
8 |
9 | Build the fist image, that uses python:3(debian) as base.
10 |
11 | `docker build -t step1 -f Dockerfile.step1 .`
12 |
13 | This generate a fat image, around 1 GB.
14 |
15 | To check if it's running, type:
16 |
17 | `docker run --rm step1`
18 |
19 |
20 | ### Step 2
21 |
22 | Second image we change the base image, from debian to alpine.
23 |
24 | Be careful when you do that because some apps have system dependencies.
25 |
26 | `docker build -t step2 -f Dockerfile.step2 .`
27 |
28 | Image reduce your size by half.
29 |
30 | To check if it's running, type:
31 |
32 | `docker run --rm step2`
33 |
34 | ### Step 3
35 |
36 | Last step is to separate build and run process. We can use a machine with required compiler stuffs, to generate `.whl` and after copy it's files to another clean machine.
37 |
38 | Again, be careful when you do that because some apps have system dependencies.
39 |
40 | `docker build -t step3 -f Dockerfile.step3 .`
41 |
42 | Image size reduce once more.
43 |
44 | To check if it's running, type:
45 |
46 | `docker run --rm step3`
47 |
48 | ### Step 4
49 |
50 | Let's create a minimal dockerfile using `python:3-slim` as base.
51 | Alpine don't have whells and it is a problem, then we will use slim images to reduce image size.
52 |
53 |
54 | `docker build -t step4 -f Dockerfile.step4 .`
55 |
56 | To check if it's running, type:
57 |
58 | `docker run --rm step4`
59 |
60 | ### Step 5
61 |
62 | Exactly like step4 but we use multi stage building to cache our dependencies and improve build speed.
63 |
64 | `docker build -t step5 -f Dockerfile.step5 .`
65 |
66 | To check if it's running, type:
67 |
68 | `docker run --rm step5`
69 |
70 |
71 | ### Conclusion
72 |
73 | Multi stage build can help when you have to compile some dependencies, but as python have [wheels](https://pythonwheels.com/), maybe it's not the best choice for the language.
74 |
75 | Alpine is a tiny image, but don't support wheels and also have problems with system dependencies. Build takes a lot of time.
76 |
77 | ```bash
78 | docker images --filter=reference='step*' --format='{{.Repository}}:{{.Tag}} - {{.Size}}' | sort
79 | step1:latest - 1.04GB
80 | step2:latest - 333MB
81 | step3:latest - 192MB
82 | step4:latest - 247MB
83 | step5:latest - 259MB
84 | ```
85 |
86 | Surprisingly, multi-stage build (step 5) is greater than minimum build with `python:3-slim` as base (step 4).
--------------------------------------------------------------------------------
/selenium_tricks/download_files_headless/README.md:
--------------------------------------------------------------------------------
1 | # Download file using selenium
2 |
3 | ## Problem
4 |
5 | Crawl a website and download some content using browser headless.
6 |
7 |
8 | ## Discuss
9 |
10 | In firefox, we have to create a user profile and configure the directory where the files
11 | will be stored. We should also tell firefox to download certain types of files without asking the user.
12 |
13 | ```python
14 | # profile to download some mime types automatically
15 | profile = FirefoxProfile()
16 | profile.set_preference('browser.download.folderList', 2)
17 | profile.set_preference('browser.download.dir', os.getcwd())
18 | # you can select multiple types of files by separating them with commas
19 | profile.set_preference('browser.helperApps.neverAsk.saveToDisk',
20 | 'text/plain,image/jpeg')
21 | # start firefox and connect into it
22 | driver = Firefox(options=options, firefox_profile=profile)
23 | ```
24 |
25 | In chrome, we also set the directory where the files will be stored and don't prompt for download.
26 |
27 | ```python
28 | # set browser headless
29 | options = ChromeOptions()
30 | options.headless = True
31 | # profile to download files automatically
32 | options.add_experimental_option(
33 | "prefs",
34 | {
35 | "download.default_directory": os.getcwd(),
36 | "download.prompt_for_download": False,
37 | "download.directory_upgrade": True,
38 | "safebrowsing.enabled": True,
39 | },
40 | )
41 | ```
42 |
43 | Unfornately we have to hack to make it work on headless mode.
44 |
45 | ```python
46 | def enable_download_in_headless_chrome(driver, download_dir):
47 | # hack founded in
48 | # https://stackoverflow.com/questions/45631715/downloading-with-chrome-headless-and-selenium
49 | # add missing support for chrome "send_command" to selenium webdriver
50 | driver.command_executor._commands["send_command"] = (
51 | "POST",
52 | "/session/$sessionId/chromium/send_command",
53 | )
54 |
55 | params = {
56 | "cmd": "Page.setDownloadBehavior",
57 | "params": {"behavior": "allow", "downloadPath": download_dir},
58 | }
59 | driver.execute("send_command", params)
60 | ```
61 |
62 | Another thing is that only works on newer versions of google chrome.
63 |
64 | ## How to run
65 |
66 | Start the test server:
67 |
68 | ```bash
69 | cd test_api
70 | flask run &
71 | ```
72 |
73 | return to this repository and then:
74 |
75 | `python firefox_example.py`
76 |
77 | or
78 |
79 | `python chrome_example.py`
80 |
--------------------------------------------------------------------------------
/learningopencv/poetry.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
2 |
3 | [[package]]
4 | name = "numpy"
5 | version = "1.24.0"
6 | description = "Fundamental package for array computing in Python"
7 | optional = false
8 | python-versions = ">=3.8"
9 | files = [
10 | {file = "numpy-1.24.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6e73a1f4f5b74a42abb55bc2b3d869f1b38cbc8776da5f8b66bf110284f7a437"},
11 | {file = "numpy-1.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9387c7d6d50e8f8c31e7bfc034241e9c6f4b3eb5db8d118d6487047b922f82af"},
12 | {file = "numpy-1.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ad6a024a32ee61d18f5b402cd02e9c0e22c0fb9dc23751991b3a16d209d972e"},
13 | {file = "numpy-1.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73cf2c5b5a07450f20a0c8e04d9955491970177dce8df8d6903bf253e53268e0"},
14 | {file = "numpy-1.24.0-cp310-cp310-win32.whl", hash = "sha256:cec79ff3984b2d1d103183fc4a3361f5b55bbb66cb395cbf5a920a4bb1fd588d"},
15 | {file = "numpy-1.24.0-cp310-cp310-win_amd64.whl", hash = "sha256:4f5e78b8b710cd7cd1a8145994cfffc6ddd5911669a437777d8cedfce6c83a98"},
16 | {file = "numpy-1.24.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4445f472b246cad6514cc09fbb5ecb7aab09ca2acc3c16f29f8dca6c468af501"},
17 | {file = "numpy-1.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ec3e5e8172a0a6a4f3c2e7423d4a8434c41349141b04744b11a90e017a95bad5"},
18 | {file = "numpy-1.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9168790149f917ad8e3cf5047b353fefef753bd50b07c547da0bdf30bc15d91"},
19 | {file = "numpy-1.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada6c1e9608ceadaf7020e1deea508b73ace85560a16f51bef26aecb93626a72"},
20 | {file = "numpy-1.24.0-cp311-cp311-win32.whl", hash = "sha256:f3c4a9a9f92734a4728ddbd331e0124eabbc968a0359a506e8e74a9b0d2d419b"},
21 | {file = "numpy-1.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:90075ef2c6ac6397d0035bcd8b298b26e481a7035f7a3f382c047eb9c3414db0"},
22 | {file = "numpy-1.24.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0885d9a7666cafe5f9876c57bfee34226e2b2847bfb94c9505e18d81011e5401"},
23 | {file = "numpy-1.24.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e63d2157f9fc98cc178870db83b0e0c85acdadd598b134b00ebec9e0db57a01f"},
24 | {file = "numpy-1.24.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8960f72997e56781eb1c2ea256a70124f92a543b384f89e5fb3503a308b1d3"},
25 | {file = "numpy-1.24.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f8e0df2ecc1928ef7256f18e309c9d6229b08b5be859163f5caa59c93d53646"},
26 | {file = "numpy-1.24.0-cp38-cp38-win32.whl", hash = "sha256:fe44e925c68fb5e8db1334bf30ac1a1b6b963b932a19cf41d2e899cf02f36aab"},
27 | {file = "numpy-1.24.0-cp38-cp38-win_amd64.whl", hash = "sha256:d7f223554aba7280e6057727333ed357b71b7da7422d02ff5e91b857888c25d1"},
28 | {file = "numpy-1.24.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ab11f6a7602cf8ea4c093e091938207de3068c5693a0520168ecf4395750f7ea"},
29 | {file = "numpy-1.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12bba5561d8118981f2f1ff069ecae200c05d7b6c78a5cdac0911f74bc71cbd1"},
30 | {file = "numpy-1.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9af91f794d2d3007d91d749ebc955302889261db514eb24caef30e03e8ec1e41"},
31 | {file = "numpy-1.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b1ddfac6a82d4f3c8e99436c90b9c2c68c0bb14658d1684cdd00f05fab241f5"},
32 | {file = "numpy-1.24.0-cp39-cp39-win32.whl", hash = "sha256:ac4fe68f1a5a18136acebd4eff91aab8bed00d1ef2fdb34b5d9192297ffbbdfc"},
33 | {file = "numpy-1.24.0-cp39-cp39-win_amd64.whl", hash = "sha256:667b5b1f6a352419e340f6475ef9930348ae5cb7fca15f2cc3afcb530823715e"},
34 | {file = "numpy-1.24.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4d01f7832fa319a36fd75ba10ea4027c9338ede875792f7bf617f4b45056fc3a"},
35 | {file = "numpy-1.24.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbb0490f0a880700a6cc4d000384baf19c1f4df59fff158d9482d4dbbca2b239"},
36 | {file = "numpy-1.24.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0104d8adaa3a4cc60c2777cab5196593bf8a7f416eda133be1f3803dd0838886"},
37 | {file = "numpy-1.24.0.tar.gz", hash = "sha256:c4ab7c9711fe6b235e86487ca74c1b092a6dd59a3cb45b63241ea0a148501853"},
38 | ]
39 |
40 | [[package]]
41 | name = "opencv-python"
42 | version = "4.8.1.78"
43 | description = "Wrapper package for OpenCV python bindings."
44 | optional = false
45 | python-versions = ">=3.6"
46 | files = [
47 | {file = "opencv-python-4.8.1.78.tar.gz", hash = "sha256:cc7adbbcd1112877a39274106cb2752e04984bc01a031162952e97450d6117f6"},
48 | {file = "opencv_python-4.8.1.78-cp37-abi3-macosx_10_16_x86_64.whl", hash = "sha256:91d5f6f5209dc2635d496f6b8ca6573ecdad051a09e6b5de4c399b8e673c60da"},
49 | {file = "opencv_python-4.8.1.78-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31f47e05447da8b3089faa0a07ffe80e114c91ce0b171e6424f9badbd1c5cd"},
50 | {file = "opencv_python-4.8.1.78-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9814beca408d3a0eca1bae7e3e5be68b07c17ecceb392b94170881216e09b319"},
51 | {file = "opencv_python-4.8.1.78-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c406bdb41eb21ea51b4e90dfbc989c002786c3f601c236a99c59a54670a394"},
52 | {file = "opencv_python-4.8.1.78-cp37-abi3-win32.whl", hash = "sha256:a7aac3900fbacf55b551e7b53626c3dad4c71ce85643645c43e91fcb19045e47"},
53 | {file = "opencv_python-4.8.1.78-cp37-abi3-win_amd64.whl", hash = "sha256:b983197f97cfa6fcb74e1da1802c7497a6f94ed561aba6980f1f33123f904956"},
54 | ]
55 |
56 | [package.dependencies]
57 | numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""}
58 |
59 | [metadata]
60 | lock-version = "2.0"
61 | python-versions = "^3.11"
62 | content-hash = "b35eabdb59383e1a21bcdbf70479c1777dc5b683ec7525e61de6fecb6102e486"
63 |
--------------------------------------------------------------------------------
/snake_game/jogo.py:
--------------------------------------------------------------------------------
1 | import pygame
2 | import sys
3 | from random import randint
4 |
5 | pygame.init()
6 |
7 | largura = 640
8 | altura = 480
9 | centro_da_tela = largura // 2, altura // 2
10 |
11 | x_cobra, y_cobra = centro_da_tela
12 |
13 | x_maçã = randint(40, 600)
14 | y_maçã = randint(50, 430)
15 |
16 | velocidade = 10
17 | x_controle = velocidade
18 | y_controle = 0
19 |
20 |
21 | branco = (255, 255, 255)
22 | verde = (0, 255, 0)
23 | vermelho = (255, 0, 0)
24 | preto = (0, 0, 0)
25 |
26 | pontos = 0
27 | fonte = pygame.font.SysFont("arial", 20, bold=True, italic=True)
28 |
29 | comprimento_maximo_cobra = 5
30 | está_morto = False
31 | já_pausou = False
32 |
33 | pygame.mixer.music.set_volume(0.2)
34 | pygame.mixer.music.load("backgroundmusic.ogg")
35 | pygame.mixer.music.play(-1)
36 |
37 | barulho_colisão = pygame.mixer.Sound("smw_coin.wav")
38 |
39 | lista_cobra = []
40 |
41 |
42 |
43 | tela = pygame.display.set_mode((largura, altura))
44 | pygame.display.set_caption("Jogo")
45 | relogio = pygame.time.Clock()
46 |
47 | def aumenta_cobra(lista_cobra):
48 | for x, y in lista_cobra:
49 | pygame.draw.rect(tela, verde, (x, y, 20, 20))
50 |
51 | def reiniciar_jogo():
52 | global pontos, comprimento_maximo_cobra, x_cobra, y_cobra, lista_cobra, lista_cabeça, x_maçã, y_maçã, está_morto
53 | pontos = 0
54 | comprimento_maximo_cobra = 5
55 | x_cobra, y_cobra = centro_da_tela
56 | lista_cobra = []
57 | lista_cabeça = []
58 | x_maçã = randint(40, 600)
59 | y_maçã = randint(50, 430)
60 | está_morto = False
61 |
62 | while True:
63 | relogio.tick(20)
64 | tela.fill(branco)
65 | mensagem = f'Pontos: {pontos}'
66 | texto_formatado = fonte.render(mensagem, True, preto)
67 | for evento in pygame.event.get():
68 | if evento.type == pygame.QUIT:
69 | pygame.quit()
70 | sys.exit()
71 |
72 | if evento.type == pygame.KEYDOWN:
73 | if evento.key == pygame.K_UP and y_controle != velocidade:
74 | y_controle = -velocidade
75 | x_controle = 0
76 | if evento.key == pygame.K_DOWN and y_controle != -velocidade:
77 | y_controle = velocidade
78 | x_controle = 0
79 | if evento.key == pygame.K_LEFT and x_controle != velocidade:
80 | x_controle = -velocidade
81 | y_controle = 0
82 | if evento.key == pygame.K_RIGHT and x_controle != -velocidade:
83 | x_controle = velocidade
84 | y_controle = 0
85 |
86 | x_cobra += x_controle
87 | y_cobra += y_controle
88 |
89 | cobra = pygame.draw.rect(tela, verde, (x_cobra, y_cobra, 20, 20))
90 | maçã = pygame.draw.rect(tela, vermelho, (x_maçã, y_maçã, 20, 20))
91 |
92 | if cobra.colliderect(maçã):
93 | x_maçã = randint(40, 600)
94 | y_maçã = randint(50, 430)
95 | pontos += 1
96 | barulho_colisão.play()
97 | comprimento_maximo_cobra += 1
98 |
99 | lista_cabeça = []
100 | lista_cabeça.append(x_cobra)
101 | lista_cabeça.append(y_cobra)
102 |
103 |
104 | lista_cobra.append(lista_cabeça)
105 |
106 | if lista_cabeça in lista_cobra[:-1]:
107 | fonte2 = pygame.font.SysFont("arial", 20, bold=True, italic=True)
108 | mensagem = "Fim do Jogo! Pressione a tecla R para jogar novamente"
109 | texto_formatado = fonte2.render(mensagem, True, preto)
110 | retângulo_texto = texto_formatado.get_rect()
111 |
112 | está_morto = True
113 | while está_morto:
114 | tela.fill(branco)
115 | for evento in pygame.event.get():
116 | if evento.type == pygame.QUIT:
117 | pygame.quit()
118 | sys.exit()
119 | if evento.type == pygame.KEYDOWN:
120 | if evento.key == pygame.K_r:
121 | reiniciar_jogo()
122 | retângulo_texto.center = centro_da_tela
123 | tela.blit(texto_formatado, retângulo_texto)
124 | pygame.display.update()
125 |
126 | if pontos == 5 and not já_pausou:
127 | fonte2 = pygame.font.SysFont("arial", 20, bold=True, italic=True)
128 | mensagem = "Você está indo bem!"
129 | instrução = "Aperte R para continuar passando o tempo"
130 | texto_formatado = fonte2.render(mensagem, True, vermelho)
131 | texto_formatado2 = fonte2.render(instrução, True, preto)
132 | retângulo_mensagem = texto_formatado.get_rect()
133 | retângulo_instrução = texto_formatado2.get_rect()
134 |
135 | está_morto = True
136 | while está_morto:
137 | tela.fill(branco)
138 | for evento in pygame.event.get():
139 | if evento.type == pygame.QUIT:
140 | pygame.quit()
141 | sys.exit()
142 | if evento.type == pygame.KEYDOWN:
143 | if evento.key == pygame.K_r:
144 | reiniciar_jogo()
145 | retângulo_mensagem.center = (largura // 2, altura // 2)
146 | retângulo_instrução.center = (largura // 2, altura // 2 + retângulo_mensagem.height + 10)
147 | tela.blit(texto_formatado, retângulo_texto)
148 | tela.blit(texto_formatado2, retângulo_instrução)
149 | pygame.display.update()
150 | já_pausou = True
151 |
152 | if x_cobra > largura:
153 | x_cobra = 0
154 | elif x_cobra < 0:
155 | x_cobra = largura
156 | elif y_cobra < 0:
157 | y_cobra = altura
158 | elif y_cobra > altura:
159 | y_cobra = 0
160 |
161 | if len(lista_cobra) > comprimento_maximo_cobra:
162 | lista_cobra.pop(0)
163 |
164 | aumenta_cobra(lista_cobra)
165 |
166 | retângulo_texto = texto_formatado.get_rect()
167 | retângulo_texto.center = (largura // 2, retângulo_texto.height)
168 | tela.blit(texto_formatado, retângulo_texto)
169 | pygame.display.update()
170 |
--------------------------------------------------------------------------------
/dockerize/poetry.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand.
2 |
3 | [[package]]
4 | name = "certifi"
5 | version = "2024.7.4"
6 | description = "Python package for providing Mozilla's CA Bundle."
7 | optional = false
8 | python-versions = ">=3.6"
9 | groups = ["main"]
10 | files = [
11 | {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"},
12 | {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"},
13 | ]
14 |
15 | [[package]]
16 | name = "charset-normalizer"
17 | version = "2.1.1"
18 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
19 | optional = false
20 | python-versions = ">=3.6.0"
21 | groups = ["main"]
22 | files = [
23 | {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"},
24 | {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"},
25 | ]
26 |
27 | [package.extras]
28 | unicode-backport = ["unicodedata2"]
29 |
30 | [[package]]
31 | name = "docker"
32 | version = "6.0.1"
33 | description = "A Python library for the Docker Engine API."
34 | optional = false
35 | python-versions = ">=3.7"
36 | groups = ["main"]
37 | files = [
38 | {file = "docker-6.0.1-py3-none-any.whl", hash = "sha256:dbcb3bd2fa80dca0788ed908218bf43972772009b881ed1e20dfc29a65e49782"},
39 | {file = "docker-6.0.1.tar.gz", hash = "sha256:896c4282e5c7af5c45e8b683b0b0c33932974fe6e50fc6906a0a83616ab3da97"},
40 | ]
41 |
42 | [package.dependencies]
43 | packaging = ">=14.0"
44 | pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""}
45 | requests = ">=2.26.0"
46 | urllib3 = ">=1.26.0"
47 | websocket-client = ">=0.32.0"
48 |
49 | [package.extras]
50 | ssh = ["paramiko (>=2.4.3)"]
51 |
52 | [[package]]
53 | name = "idna"
54 | version = "3.7"
55 | description = "Internationalized Domain Names in Applications (IDNA)"
56 | optional = false
57 | python-versions = ">=3.5"
58 | groups = ["main"]
59 | files = [
60 | {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"},
61 | {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"},
62 | ]
63 |
64 | [[package]]
65 | name = "packaging"
66 | version = "22.0"
67 | description = "Core utilities for Python packages"
68 | optional = false
69 | python-versions = ">=3.7"
70 | groups = ["main"]
71 | files = [
72 | {file = "packaging-22.0-py3-none-any.whl", hash = "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3"},
73 | {file = "packaging-22.0.tar.gz", hash = "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3"},
74 | ]
75 |
76 | [[package]]
77 | name = "pywin32"
78 | version = "305"
79 | description = "Python for Window Extensions"
80 | optional = false
81 | python-versions = "*"
82 | groups = ["main"]
83 | markers = "sys_platform == \"win32\""
84 | files = [
85 | {file = "pywin32-305-cp310-cp310-win32.whl", hash = "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116"},
86 | {file = "pywin32-305-cp310-cp310-win_amd64.whl", hash = "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478"},
87 | {file = "pywin32-305-cp310-cp310-win_arm64.whl", hash = "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4"},
88 | {file = "pywin32-305-cp311-cp311-win32.whl", hash = "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2"},
89 | {file = "pywin32-305-cp311-cp311-win_amd64.whl", hash = "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990"},
90 | {file = "pywin32-305-cp311-cp311-win_arm64.whl", hash = "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db"},
91 | {file = "pywin32-305-cp36-cp36m-win32.whl", hash = "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863"},
92 | {file = "pywin32-305-cp36-cp36m-win_amd64.whl", hash = "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1"},
93 | {file = "pywin32-305-cp37-cp37m-win32.whl", hash = "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496"},
94 | {file = "pywin32-305-cp37-cp37m-win_amd64.whl", hash = "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d"},
95 | {file = "pywin32-305-cp38-cp38-win32.whl", hash = "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504"},
96 | {file = "pywin32-305-cp38-cp38-win_amd64.whl", hash = "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7"},
97 | {file = "pywin32-305-cp39-cp39-win32.whl", hash = "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918"},
98 | {file = "pywin32-305-cp39-cp39-win_amd64.whl", hash = "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271"},
99 | ]
100 |
101 | [[package]]
102 | name = "requests"
103 | version = "2.32.4"
104 | description = "Python HTTP for Humans."
105 | optional = false
106 | python-versions = ">=3.8"
107 | groups = ["main"]
108 | files = [
109 | {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"},
110 | {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"},
111 | ]
112 |
113 | [package.dependencies]
114 | certifi = ">=2017.4.17"
115 | charset_normalizer = ">=2,<4"
116 | idna = ">=2.5,<4"
117 | urllib3 = ">=1.21.1,<3"
118 |
119 | [package.extras]
120 | socks = ["PySocks (>=1.5.6,!=1.5.7)"]
121 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
122 |
123 | [[package]]
124 | name = "urllib3"
125 | version = "2.6.0"
126 | description = "HTTP library with thread-safe connection pooling, file post, and more."
127 | optional = false
128 | python-versions = ">=3.9"
129 | groups = ["main"]
130 | files = [
131 | {file = "urllib3-2.6.0-py3-none-any.whl", hash = "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f"},
132 | {file = "urllib3-2.6.0.tar.gz", hash = "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1"},
133 | ]
134 |
135 | [package.extras]
136 | brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""]
137 | h2 = ["h2 (>=4,<5)"]
138 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
139 | zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""]
140 |
141 | [[package]]
142 | name = "websocket-client"
143 | version = "1.4.2"
144 | description = "WebSocket client for Python with low level API options"
145 | optional = false
146 | python-versions = ">=3.7"
147 | groups = ["main"]
148 | files = [
149 | {file = "websocket-client-1.4.2.tar.gz", hash = "sha256:d6e8f90ca8e2dd4e8027c4561adeb9456b54044312dba655e7cae652ceb9ae59"},
150 | {file = "websocket_client-1.4.2-py3-none-any.whl", hash = "sha256:d6b06432f184438d99ac1f456eaf22fe1ade524c3dd16e661142dc54e9cba574"},
151 | ]
152 |
153 | [package.extras]
154 | docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"]
155 | optional = ["python-socks", "wsaccel"]
156 | test = ["websockets"]
157 |
158 | [metadata]
159 | lock-version = "2.1"
160 | python-versions = "^3.11"
161 | content-hash = "4afa20611398816362bacaaa3125d8e8c9193b164034d0989ca39e7469b33067"
162 |
--------------------------------------------------------------------------------
/toxpipenv/poetry.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand.
2 |
3 | [[package]]
4 | name = "attrs"
5 | version = "22.2.0"
6 | description = "Classes Without Boilerplate"
7 | optional = false
8 | python-versions = ">=3.6"
9 | files = [
10 | {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"},
11 | {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"},
12 | ]
13 |
14 | [package.extras]
15 | cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"]
16 | dev = ["attrs[docs,tests]"]
17 | docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"]
18 | tests = ["attrs[tests-no-zope]", "zope.interface"]
19 | tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"]
20 |
21 | [[package]]
22 | name = "cachetools"
23 | version = "5.2.0"
24 | description = "Extensible memoizing collections and decorators"
25 | optional = false
26 | python-versions = "~=3.7"
27 | files = [
28 | {file = "cachetools-5.2.0-py3-none-any.whl", hash = "sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db"},
29 | {file = "cachetools-5.2.0.tar.gz", hash = "sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757"},
30 | ]
31 |
32 | [[package]]
33 | name = "chardet"
34 | version = "5.1.0"
35 | description = "Universal encoding detector for Python 3"
36 | optional = false
37 | python-versions = ">=3.7"
38 | files = [
39 | {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"},
40 | {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"},
41 | ]
42 |
43 | [[package]]
44 | name = "colorama"
45 | version = "0.4.6"
46 | description = "Cross-platform colored terminal text."
47 | optional = false
48 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
49 | files = [
50 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
51 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
52 | ]
53 |
54 | [[package]]
55 | name = "distlib"
56 | version = "0.3.9"
57 | description = "Distribution utilities"
58 | optional = false
59 | python-versions = "*"
60 | files = [
61 | {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"},
62 | {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"},
63 | ]
64 |
65 | [[package]]
66 | name = "exceptiongroup"
67 | version = "1.1.0"
68 | description = "Backport of PEP 654 (exception groups)"
69 | optional = false
70 | python-versions = ">=3.7"
71 | files = [
72 | {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"},
73 | {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"},
74 | ]
75 |
76 | [package.extras]
77 | test = ["pytest (>=6)"]
78 |
79 | [[package]]
80 | name = "filelock"
81 | version = "3.16.1"
82 | description = "A platform independent file lock."
83 | optional = false
84 | python-versions = ">=3.8"
85 | files = [
86 | {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"},
87 | {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"},
88 | ]
89 |
90 | [package.extras]
91 | docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"]
92 | testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"]
93 | typing = ["typing-extensions (>=4.12.2)"]
94 |
95 | [[package]]
96 | name = "iniconfig"
97 | version = "1.1.1"
98 | description = "iniconfig: brain-dead simple config-ini parsing"
99 | optional = false
100 | python-versions = "*"
101 | files = [
102 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
103 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
104 | ]
105 |
106 | [[package]]
107 | name = "packaging"
108 | version = "22.0"
109 | description = "Core utilities for Python packages"
110 | optional = false
111 | python-versions = ">=3.7"
112 | files = [
113 | {file = "packaging-22.0-py3-none-any.whl", hash = "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3"},
114 | {file = "packaging-22.0.tar.gz", hash = "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3"},
115 | ]
116 |
117 | [[package]]
118 | name = "platformdirs"
119 | version = "4.3.6"
120 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
121 | optional = false
122 | python-versions = ">=3.8"
123 | files = [
124 | {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"},
125 | {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"},
126 | ]
127 |
128 | [package.extras]
129 | docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"]
130 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"]
131 | type = ["mypy (>=1.11.2)"]
132 |
133 | [[package]]
134 | name = "pluggy"
135 | version = "1.0.0"
136 | description = "plugin and hook calling mechanisms for python"
137 | optional = false
138 | python-versions = ">=3.6"
139 | files = [
140 | {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
141 | {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
142 | ]
143 |
144 | [package.extras]
145 | dev = ["pre-commit", "tox"]
146 | testing = ["pytest", "pytest-benchmark"]
147 |
148 | [[package]]
149 | name = "pyproject-api"
150 | version = "1.2.1"
151 | description = "API to interact with the python pyproject.toml based projects"
152 | optional = false
153 | python-versions = ">=3.7"
154 | files = [
155 | {file = "pyproject_api-1.2.1-py3-none-any.whl", hash = "sha256:155d5623453173b7b4e9379a3146ccef2d52335234eb2d03d6ba730e7dad179c"},
156 | {file = "pyproject_api-1.2.1.tar.gz", hash = "sha256:093c047d192ceadcab7afd6b501276bf2ce44adf41cb9c313234518cddd20818"},
157 | ]
158 |
159 | [package.dependencies]
160 | packaging = ">=21.3"
161 | tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""}
162 |
163 | [package.extras]
164 | docs = ["furo (>=2022.9.29)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"]
165 | testing = ["covdefaults (>=2.2.2)", "importlib-metadata (>=5.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "virtualenv (>=20.17)", "wheel (>=0.38.4)"]
166 |
167 | [[package]]
168 | name = "pytest"
169 | version = "7.2.0"
170 | description = "pytest: simple powerful testing with Python"
171 | optional = false
172 | python-versions = ">=3.7"
173 | files = [
174 | {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"},
175 | {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"},
176 | ]
177 |
178 | [package.dependencies]
179 | attrs = ">=19.2.0"
180 | colorama = {version = "*", markers = "sys_platform == \"win32\""}
181 | exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
182 | iniconfig = "*"
183 | packaging = "*"
184 | pluggy = ">=0.12,<2.0"
185 | tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
186 |
187 | [package.extras]
188 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"]
189 |
190 | [[package]]
191 | name = "tomli"
192 | version = "2.0.1"
193 | description = "A lil' TOML parser"
194 | optional = false
195 | python-versions = ">=3.7"
196 | files = [
197 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
198 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
199 | ]
200 |
201 | [[package]]
202 | name = "tox"
203 | version = "4.0.16"
204 | description = "tox is a generic virtualenv management and test command line tool"
205 | optional = false
206 | python-versions = ">=3.7"
207 | files = [
208 | {file = "tox-4.0.16-py3-none-any.whl", hash = "sha256:1ba98d4a67b815403e616cf6ded707aeb0fadff10702928f9b990274c9703e9f"},
209 | {file = "tox-4.0.16.tar.gz", hash = "sha256:968fc4e27110defdf15972893cb15fe1669f338c8408d8835077462fb07e07fe"},
210 | ]
211 |
212 | [package.dependencies]
213 | cachetools = ">=5.2"
214 | chardet = ">=5.1"
215 | colorama = ">=0.4.6"
216 | filelock = ">=3.8.2"
217 | packaging = ">=22"
218 | platformdirs = ">=2.6"
219 | pluggy = ">=1"
220 | pyproject-api = ">=1.2.1"
221 | tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""}
222 | virtualenv = ">=20.17.1"
223 |
224 | [package.extras]
225 | docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-argparse-cli (>=1.10)", "sphinx-autodoc-typehints (>=1.19.5)", "sphinx-copybutton (>=0.5.1)", "sphinx-inline-tabs (>=2022.1.2b11)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.8)"]
226 | testing = ["build[virtualenv] (>=0.9)", "covdefaults (>=2.2.2)", "devpi-process (>=0.3)", "diff-cover (>=7.3)", "distlib (>=0.3.6)", "flaky (>=3.7)", "hatch-vcs (>=0.3)", "hatchling (>=1.11.1)", "psutil (>=5.9.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-xdist (>=3.1)", "re-assert (>=1.1)", "time-machine (>=2.8.2)"]
227 |
228 | [[package]]
229 | name = "virtualenv"
230 | version = "20.26.6"
231 | description = "Virtual Python Environment builder"
232 | optional = false
233 | python-versions = ">=3.7"
234 | files = [
235 | {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"},
236 | {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"},
237 | ]
238 |
239 | [package.dependencies]
240 | distlib = ">=0.3.7,<1"
241 | filelock = ">=3.12.2,<4"
242 | platformdirs = ">=3.9.1,<5"
243 |
244 | [package.extras]
245 | docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"]
246 | test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"]
247 |
248 | [metadata]
249 | lock-version = "2.0"
250 | python-versions = "^3.10"
251 | content-hash = "658f668e1a79a897ee360fb2007fc6d89556359cb2a327cb9b15f694e1ab1ac0"
252 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/dataanalysis/pokemon.csv:
--------------------------------------------------------------------------------
1 | Pokemon,Type
2 | Bulbasaur,Grass
3 | Ivysaur,Grass
4 | Venusaur,Grass
5 | Charmander,Fire
6 | Charmeleon,Fire
7 | Charizard,Fire
8 | Squirtle,Water
9 | Wartortle,Water
10 | Blastoise,Water
11 | Caterpie,Bug
12 | Metapod,Bug
13 | Butterfree,Bug
14 | Weedle,Bug
15 | Kakuna,Bug
16 | Beedrill,Bug
17 | Pidgey,Normal
18 | Pidgeotto,Normal
19 | Pidgeot,Normal
20 | Rattata,Normal
21 | Raticate,Normal
22 | Spearow,Normal
23 | Fearow,Normal
24 | Ekans,Poison
25 | Arbok,Poison
26 | Pikachu,Electric
27 | Raichu,Electric
28 | Sandshrew,Ground
29 | Sandslash,Ground
30 | Nidoran,Poison
31 | Nidorina,Poison
32 | Nidoqueen,Poison
33 | Nidoran♂,Poison
34 | Nidorino,Poison
35 | Nidoking,Poison
36 | Clefairy,Fairy
37 | Clefable,Fairy
38 | Vulpix,Fire
39 | Ninetales,Fire
40 | Jigglypuff,Normal
41 | Wigglytuff,Normal
42 | Zubat,Poison
43 | Golbat,Poison
44 | Oddish,Grass
45 | Gloom,Grass
46 | Vileplume,Grass
47 | Paras,Bug
48 | Parasect,Bug
49 | Venonat,Bug
50 | Venomoth,Bug
51 | Diglett,Ground
52 | Dugtrio,Ground
53 | Meowth,Normal
54 | Persian,Normal
55 | Psyduck,Water
56 | Golduck,Water
57 | Mankey,Fighting
58 | Primeape,Fighting
59 | Growlithe,Fire
60 | Arcanine,Fire
61 | Poliwag,Water
62 | Poliwhirl,Water
63 | Poliwrath,Water
64 | Abra,Psychic
65 | Kadabra,Psychic
66 | Alakazam,Psychic
67 | Machop,Fighting
68 | Machoke,Fighting
69 | Machamp,Fighting
70 | Bellsprout,Grass
71 | Weepinbell,Grass
72 | Victreebel,Grass
73 | Tentacool,Water
74 | Tentacruel,Water
75 | Geodude,Rock
76 | Graveler,Rock
77 | Golem,Rock
78 | Ponyta,Fire
79 | Rapidash,Fire
80 | Slowpoke,Water
81 | Slowbro,Water
82 | Magnemite,Electric
83 | Magneton,Electric
84 | Farfetch'd,Normal
85 | Doduo,Normal
86 | Dodrio,Normal
87 | Seel,Water
88 | Dewgong,Water
89 | Grimer,Poison
90 | Muk,Poison
91 | Shellder,Water
92 | Cloyster,Water
93 | Gastly,Ghost
94 | Haunter,Ghost
95 | Gengar,Ghost
96 | Onix,Rock
97 | Drowzee,Psychic
98 | Hypno,Psychic
99 | Krabby,Water
100 | Kingler,Water
101 | Voltorb,Electric
102 | Electrode,Electric
103 | Exeggcute,Grass
104 | Exeggutor,Grass
105 | Cubone,Ground
106 | Marowak,Ground
107 | Hitmonlee,Fighting
108 | Hitmonchan,Fighting
109 | Lickitung,Normal
110 | Koffing,Poison
111 | Weezing,Poison
112 | Rhyhorn,Ground
113 | Rhydon,Ground
114 | Chansey,Normal
115 | Tangela,Grass
116 | Kangaskhan,Normal
117 | Horsea,Water
118 | Seadra,Water
119 | Goldeen,Water
120 | Seaking,Water
121 | Staryu,Water
122 | Starmie,Water
123 | Mr. Mime,Psychic
124 | Scyther,Bug
125 | Jynx,Ice
126 | Electabuzz,Electric
127 | Magmar,Fire
128 | Pinsir,Bug
129 | Tauros,Normal
130 | Magikarp,Water
131 | Gyarados,Water
132 | Lapras,Water
133 | Ditto,Normal
134 | Eevee,Normal
135 | Vaporeon,Water
136 | Jolteon,Electric
137 | Flareon,Fire
138 | Porygon,Normal
139 | Omanyte,Rock
140 | Omastar,Rock
141 | Kabuto,Rock
142 | Kabutops,Rock
143 | Aerodactyl,Rock
144 | Snorlax,Normal
145 | Articuno,Ice
146 | Zapdos,Electric
147 | Moltres,Fire
148 | Dratini,Dragon
149 | Dragonair,Dragon
150 | Dragonite,Dragon
151 | Mewtwo,Psychic
152 | Mew,Psychic
153 | Chikorita,Grass
154 | Bayleef,Grass
155 | Meganium,Grass
156 | Cyndaquil,Fire
157 | Quilava,Fire
158 | Typhlosion,Fire
159 | Totodile,Water
160 | Croconaw,Water
161 | Feraligatr,Water
162 | Sentret,Normal
163 | Furret,Normal
164 | Hoothoot,Normal
165 | Noctowl,Normal
166 | Ledyba,Bug
167 | Ledian,Bug
168 | Spinarak,Bug
169 | Ariados,Bug
170 | Crobat,Poison
171 | Chinchou,Water
172 | Lanturn,Water
173 | Pichu,Electric
174 | Cleffa,Fairy
175 | Igglybuff,Normal
176 | Togepi,Fairy
177 | Togetic,Fairy
178 | Natu,Psychic
179 | Xatu,Psychic
180 | Mareep,Electric
181 | Flaaffy,Electric
182 | Ampharos,Electric
183 | Bellossom,Grass
184 | Marill,Water
185 | Azumarill,Water
186 | Sudowoodo,Rock
187 | Politoed,Water
188 | Hoppip,Grass
189 | Skiploom,Grass
190 | Jumpluff,Grass
191 | Aipom,Normal
192 | Sunkern,Grass
193 | Sunflora,Grass
194 | Yanma,Bug
195 | Wooper,Water
196 | Quagsire,Water
197 | Espeon,Psychic
198 | Umbreon,Dark
199 | Murkrow,Dark
200 | Slowking,Water
201 | Misdreavus,Ghost
202 | Unown,Psychic
203 | Wobbuffet,Psychic
204 | Girafarig,Normal
205 | Pineco,Bug
206 | Forretress,Bug
207 | Dunsparce,Normal
208 | Gligar,Ground
209 | Steelix,Steel
210 | Snubbull,Fairy
211 | Granbull,Fairy
212 | Qwilfish,Water
213 | Scizor,Bug
214 | Shuckle,Bug
215 | Heracross,Bug
216 | Sneasel,Dark
217 | Teddiursa,Normal
218 | Ursaring,Normal
219 | Slugma,Fire
220 | Magcargo,Fire
221 | Swinub,Ice
222 | Piloswine,Ice
223 | Corsola,Water
224 | Remoraid,Water
225 | Octillery,Water
226 | Delibird,Ice
227 | Mantine,Water
228 | Skarmory,Steel
229 | Houndour,Dark
230 | Houndoom,Dark
231 | Kingdra,Water
232 | Phanpy,Ground
233 | Donphan,Ground
234 | Porygon2,Normal
235 | Stantler,Normal
236 | Smeargle,Normal
237 | Tyrogue,Fighting
238 | Hitmontop,Fighting
239 | Smoochum,Ice
240 | Elekid,Electric
241 | Magby,Fire
242 | Miltank,Normal
243 | Blissey,Normal
244 | Raikou,Electric
245 | Entei,Fire
246 | Suicune,Water
247 | Larvitar,Rock
248 | Pupitar,Rock
249 | Tyranitar,Rock
250 | Lugia,Psychic
251 | Ho-oh,Fire
252 | Celebi,Psychic
253 | Treecko,Grass
254 | Grovyle,Grass
255 | Sceptile,Grass
256 | Torchic,Fire
257 | Combusken,Fire
258 | Blaziken,Fire
259 | Mudkip,Water
260 | Marshtomp,Water
261 | Swampert,Water
262 | Poochyena,Dark
263 | Mightyena,Dark
264 | Zigzagoon,Normal
265 | Linoone,Normal
266 | Wurmple,Bug
267 | Silcoon,Bug
268 | Beautifly,Bug
269 | Cascoon,Bug
270 | Dustox,Bug
271 | Lotad,Water
272 | Lombre,Water
273 | Ludicolo,Water
274 | Seedot,Grass
275 | Nuzleaf,Grass
276 | Shiftry,Grass
277 | Taillow,Normal
278 | Swellow,Normal
279 | Wingull,Water
280 | Pelipper,Water
281 | Ralts,Psychic
282 | Kirlia,Psychic
283 | Gardevoir,Psychic
284 | Surskit,Bug
285 | Masquerain,Bug
286 | Shroomish,Grass
287 | Breloom,Grass
288 | Slakoth,Normal
289 | Vigoroth,Normal
290 | Slaking,Normal
291 | Nincada,Bug
292 | Ninjask,Bug
293 | Shedinja,Bug
294 | Whismur,Normal
295 | Loudred,Normal
296 | Exploud,Normal
297 | Makuhita,Fighting
298 | Hariyama,Fighting
299 | Azurill,Normal
300 | Nosepass,Rock
301 | Skitty,Normal
302 | Delcatty,Normal
303 | Sableye,Dark
304 | Mawile,Steel
305 | Aron,Steel
306 | Lairon,Steel
307 | Aggron,Steel
308 | Meditite,Fighting
309 | Medicham,Fighting
310 | Electrike,Electric
311 | Manectric,Electric
312 | Plusle,Electric
313 | Minun,Electric
314 | Volbeat,Bug
315 | Illumise,Bug
316 | Roselia,Grass
317 | Gulpin,Poison
318 | Swalot,Poison
319 | Carvanha,Water
320 | Sharpedo,Water
321 | Wailmer,Water
322 | Wailord,Water
323 | Numel,Fire
324 | Camerupt,Fire
325 | Torkoal,Fire
326 | Spoink,Psychic
327 | Grumpig,Psychic
328 | Spinda,Normal
329 | Trapinch,Ground
330 | Vibrava,Ground
331 | Flygon,Ground
332 | Cacnea,Grass
333 | Cacturne,Grass
334 | Swablu,Normal
335 | Altaria,Dragon
336 | Zangoose,Normal
337 | Seviper,Poison
338 | Lunatone,Rock
339 | Solrock,Rock
340 | Barboach,Water
341 | Whiscash,Water
342 | Corphish,Water
343 | Crawdaunt,Water
344 | Baltoy,Ground
345 | Claydol,Ground
346 | Lileep,Rock
347 | Cradily,Rock
348 | Anorith,Rock
349 | Armaldo,Rock
350 | Feebas,Water
351 | Milotic,Water
352 | Castform,Normal
353 | Kecleon,Normal
354 | Shuppet,Ghost
355 | Banette,Ghost
356 | Duskull,Ghost
357 | Dusclops,Ghost
358 | Tropius,Grass
359 | Chimecho,Psychic
360 | Absol,Dark
361 | Wynaut,Psychic
362 | Snorunt,Ice
363 | Glalie,Ice
364 | Spheal,Ice
365 | Sealeo,Ice
366 | Walrein,Ice
367 | Clamperl,Water
368 | Huntail,Water
369 | Gorebyss,Water
370 | Relicanth,Water
371 | Luvdisc,Water
372 | Bagon,Dragon
373 | Shelgon,Dragon
374 | Salamence,Dragon
375 | Beldum,Steel
376 | Metang,Steel
377 | Metagross,Steel
378 | Regirock,Rock
379 | Regice,Ice
380 | Registeel,Steel
381 | Latias,Dragon
382 | Latios,Dragon
383 | Kyogre,Water
384 | Groudon,Ground
385 | Rayquaza,Dragon
386 | Jirachi,Steel
387 | Deoxys,Psychic
388 | Turtwig,Grass
389 | Grotle,Grass
390 | Torterra,Grass
391 | Chimchar,Fire
392 | Monferno,Fire
393 | Infernape,Fire
394 | Piplup,Water
395 | Prinplup,Water
396 | Empoleon,Water
397 | Starly,Normal
398 | Staravia,Normal
399 | Staraptor,Normal
400 | Bidoof,Normal
401 | Bibarel,Normal
402 | Kricketot,Bug
403 | Kricketune,Bug
404 | Shinx,Electric
405 | Luxio,Electric
406 | Luxray,Electric
407 | Budew,Grass
408 | Roserade,Grass
409 | Cranidos,Rock
410 | Rampardos,Rock
411 | Shieldon,Rock
412 | Bastiodon,Rock
413 | Burmy,Bug
414 | Wormadam,Bug
415 | Mothim,Bug
416 | Combee,Bug
417 | Vespiquen,Bug
418 | Pachirisu,Electric
419 | Buizel,Water
420 | Floatzel,Water
421 | Cherubi,Grass
422 | Cherrim,Grass
423 | Shellos,Water
424 | Gastrodon,Water
425 | Ambipom,Normal
426 | Drifloon,Ghost
427 | Drifblim,Ghost
428 | Buneary,Normal
429 | Lopunny,Normal
430 | Mismagius,Ghost
431 | Honchkrow,Dark
432 | Glameow,Normal
433 | Purugly,Normal
434 | Chingling,Psychic
435 | Stunky,Poison
436 | Skuntank,Poison
437 | Bronzor,Steel
438 | Bronzong,Steel
439 | Bonsly,Rock
440 | Mime Jr.,Psychic
441 | Happiny,Normal
442 | Chatot,Normal
443 | Spiritomb,Ghost
444 | Gible,Dragon
445 | Gabite,Dragon
446 | Garchomp,Dragon
447 | Munchlax,Normal
448 | Riolu,Fighting
449 | Lucario,Fighting
450 | Hippopotas,Ground
451 | Hippowdon,Ground
452 | Skorupi,Poison
453 | Drapion,Poison
454 | Croagunk,Poison
455 | Toxicroak,Poison
456 | Carnivine,Grass
457 | Finneon,Water
458 | Lumineon,Water
459 | Mantyke,Water
460 | Snover,Grass
461 | Abomasnow,Grass
462 | Weavile,Dark
463 | Magnezone,Electric
464 | Lickilicky,Normal
465 | Rhyperior,Ground
466 | Tangrowth,Grass
467 | Electivire,Electric
468 | Magmortar,Fire
469 | Togekiss,Fairy
470 | Yanmega,Bug
471 | Leafeon,Grass
472 | Glaceon,Ice
473 | Gliscor,Ground
474 | Mamoswine,Ice
475 | Porygon-Z,Normal
476 | Gallade,Psychic
477 | Probopass,Rock
478 | Dusknoir,Ghost
479 | Froslass,Ice
480 | Rotom,Electric
481 | Uxie,Psychic
482 | Mesprit,Psychic
483 | Azelf,Psychic
484 | Dialga,Steel
485 | Palkia,Water
486 | Heatran,Fire
487 | Regigigas,Normal
488 | Giratina,Ghost
489 | Cresselia,Psychic
490 | Phione,Water
491 | Manaphy,Water
492 | Darkrai,Dark
493 | Shaymin,Grass
494 | Arceus,Normal
495 | Victini,Psychic
496 | Snivy,Grass
497 | Servine,Grass
498 | Serperior,Grass
499 | Tepig,Fire
500 | Pignite,Fire
501 | Emboar,Fire
502 | Oshawott,Water
503 | Dewott,Water
504 | Samurott,Water
505 | Patrat,Normal
506 | Watchog,Normal
507 | Lillipup,Normal
508 | Herdier,Normal
509 | Stoutland,Normal
510 | Purrloin,Dark
511 | Liepard,Dark
512 | Pansage,Grass
513 | Simisage,Grass
514 | Pansear,Fire
515 | Simisear,Fire
516 | Panpour,Water
517 | Simipour,Water
518 | Munna,Psychic
519 | Musharna,Psychic
520 | Pidove,Normal
521 | Tranquill,Normal
522 | Unfezant,Normal
523 | Blitzle,Electric
524 | Zebstrika,Electric
525 | Roggenrola,Rock
526 | Boldore,Rock
527 | Gigalith,Rock
528 | Woobat,Psychic
529 | Swoobat,Psychic
530 | Drilbur,Ground
531 | Excadrill,Ground
532 | Audino,Normal
533 | Timburr,Fighting
534 | Gurdurr,Fighting
535 | Conkeldurr,Fighting
536 | Tympole,Water
537 | Palpitoad,Water
538 | Seismitoad,Water
539 | Throh,Fighting
540 | Sawk,Fighting
541 | Sewaddle,Bug
542 | Swadloon,Bug
543 | Leavanny,Bug
544 | Venipede,Bug
545 | Whirlipede,Bug
546 | Scolipede,Bug
547 | Cottonee,Grass
548 | Whimsicott,Grass
549 | Petilil,Grass
550 | Lilligant,Grass
551 | Basculin,Water
552 | Sandile,Ground
553 | Krokorok,Ground
554 | Krookodile,Ground
555 | Darumaka,Fire
556 | Darmanitan,Fire
557 | Maractus,Grass
558 | Dwebble,Bug
559 | Crustle,Bug
560 | Scraggy,Dark
561 | Scrafty,Dark
562 | Sigilyph,Psychic
563 | Yamask,Ghost
564 | Cofagrigus,Ghost
565 | Tirtouga,Water
566 | Carracosta,Water
567 | Archen,Rock
568 | Archeops,Rock
569 | Trubbish,Poison
570 | Garbodor,Poison
571 | Zorua,Dark
572 | Zoroark,Dark
573 | Minccino,Normal
574 | Cinccino,Normal
575 | Gothita,Psychic
576 | Gothorita,Psychic
577 | Gothitelle,Psychic
578 | Solosis,Psychic
579 | Duosion,Psychic
580 | Reuniclus,Psychic
581 | Ducklett,Water
582 | Swanna,Water
583 | Vanillite,Ice
584 | Vanillish,Ice
585 | Vanilluxe,Ice
586 | Deerling,Normal
587 | Sawsbuck,Normal
588 | Emolga,Electric
589 | Karrablast,Bug
590 | Escavalier,Bug
591 | Foongus,Grass
592 | Amoonguss,Grass
593 | Frillish,Water
594 | Jellicent,Water
595 | Alomomola,Water
596 | Joltik,Bug
597 | Galvantula,Bug
598 | Ferroseed,Grass
599 | Ferrothorn,Grass
600 | Klink,Steel
601 | Klang,Steel
602 | Klinklang,Steel
603 | Tynamo,Electric
604 | Eelektrik,Electric
605 | Eelektross,Electric
606 | Elgyem,Psychic
607 | Beheeyem,Psychic
608 | Litwick,Ghost
609 | Lampent,Ghost
610 | Chandelure,Ghost
611 | Axew,Dragon
612 | Fraxure,Dragon
613 | Haxorus,Dragon
614 | Cubchoo,Ice
615 | Beartic,Ice
616 | Cryogonal,Ice
617 | Shelmet,Bug
618 | Accelgor,Bug
619 | Stunfisk,Ground
620 | Mienfoo,Fighting
621 | Mienshao,Fighting
622 | Druddigon,Dragon
623 | Golett,Ground
624 | Golurk,Ground
625 | Pawniard,Dark
626 | Bisharp,Dark
627 | Bouffalant,Normal
628 | Rufflet,Normal
629 | Braviary,Normal
630 | Vullaby,Dark
631 | Mandibuzz,Dark
632 | Heatmor,Fire
633 | Durant,Bug
634 | Deino,Dark
635 | Zweilous,Dark
636 | Hydreigon,Dark
637 | Larvesta,Bug
638 | Volcarona,Bug
639 | Cobalion,Steel
640 | Terrakion,Rock
641 | Virizion,Grass
642 | Tornadus,Flying
643 | Thundurus,Electric
644 | Reshiram,Dragon
645 | Zekrom,Dragon
646 | Landorus,Ground
647 | Kyurem,Dragon
648 | Keldeo,Water
649 | Meloetta,Normal
650 | Genesect,Bug
651 | Chespin,Grass
652 | Quilladin,Grass
653 | Chesnaught,Grass
654 | Fennekin,Fire
655 | Braixen,Fire
656 | Delphox,Fire
657 | Froakie,Water
658 | Frogadier,Water
659 | Greninja,Water
660 | Bunnelby,Normal
661 | Diggersby,Normal
662 | Fletchling,Normal
663 | Fletchinder,Fire
664 | Talonflame,Fire
665 | Scatterbug,Bug
666 | Spewpa,Bug
667 | Vivillon,Bug
668 | Litleo,Fire
669 | Pyroar,Fire
670 | Flabébé,Fairy
671 | Floette,Fairy
672 | Florges,Fairy
673 | Skiddo,Grass
674 | Gogoat,Grass
675 | Pancham,Fighting
676 | Pangoro,Fighting
677 | Furfrou,Normal
678 | Espurr,Psychic
679 | Meowstic,Psychic
680 | Honedge,Steel
681 | Doublade,Steel
682 | Aegislash,Steel
683 | Spritzee,Fairy
684 | Aromatisse,Fairy
685 | Swirlix,Fairy
686 | Slurpuff,Fairy
687 | Inkay,Dark
688 | Malamar,Dark
689 | Binacle,Rock
690 | Barbaracle,Rock
691 | Skrelp,Poison
692 | Dragalge,Poison
693 | Clauncher,Water
694 | Clawitzer,Water
695 | Helioptile,Electric
696 | Heliolisk,Electric
697 | Tyrunt,Rock
698 | Tyrantrum,Rock
699 | Amaura,Rock
700 | Aurorus,Rock
701 | Sylveon,Fairy
702 | Hawlucha,Fighting
703 | Dedenne,Electric
704 | Carbink,Rock
705 | Goomy,Dragon
706 | Sliggoo,Dragon
707 | Goodra,Dragon
708 | Klefki,Steel
709 | Phantump,Ghost
710 | Trevenant,Ghost
711 | Pumpkaboo,Ghost
712 | Gourgeist,Ghost
713 | Bergmite,Ice
714 | Avalugg,Ice
715 | Noibat,Flying
716 | Noivern,Flying
717 | Xerneas,Fairy
718 | Yveltal,Dark
719 | Zygarde,Dragon
720 | Diancie,Rock
721 | Hoopa,Psychic
722 | Volcanion,Fire
723 |
--------------------------------------------------------------------------------
/fastapi-playground/poetry.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand.
2 |
3 | [[package]]
4 | name = "annotated-doc"
5 | version = "0.0.3"
6 | description = "Document parameters, class attributes, return types, and variables inline, with Annotated."
7 | optional = false
8 | python-versions = ">=3.8"
9 | groups = ["main"]
10 | files = [
11 | {file = "annotated_doc-0.0.3-py3-none-any.whl", hash = "sha256:348ec6664a76f1fd3be81f43dffbee4c7e8ce931ba71ec67cc7f4ade7fbbb580"},
12 | {file = "annotated_doc-0.0.3.tar.gz", hash = "sha256:e18370014c70187422c33e945053ff4c286f453a984eba84d0dbfa0c935adeda"},
13 | ]
14 |
15 | [[package]]
16 | name = "annotated-types"
17 | version = "0.7.0"
18 | description = "Reusable constraint types to use with typing.Annotated"
19 | optional = false
20 | python-versions = ">=3.8"
21 | groups = ["main"]
22 | files = [
23 | {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
24 | {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
25 | ]
26 |
27 | [[package]]
28 | name = "anyio"
29 | version = "4.11.0"
30 | description = "High-level concurrency and networking framework on top of asyncio or Trio"
31 | optional = false
32 | python-versions = ">=3.9"
33 | groups = ["main"]
34 | files = [
35 | {file = "anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc"},
36 | {file = "anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4"},
37 | ]
38 |
39 | [package.dependencies]
40 | idna = ">=2.8"
41 | sniffio = ">=1.1"
42 |
43 | [package.extras]
44 | trio = ["trio (>=0.31.0)"]
45 |
46 | [[package]]
47 | name = "black"
48 | version = "25.9.0"
49 | description = "The uncompromising code formatter."
50 | optional = false
51 | python-versions = ">=3.9"
52 | groups = ["dev"]
53 | files = [
54 | {file = "black-25.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce41ed2614b706fd55fd0b4a6909d06b5bab344ffbfadc6ef34ae50adba3d4f7"},
55 | {file = "black-25.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ab0ce111ef026790e9b13bd216fa7bc48edd934ffc4cbf78808b235793cbc92"},
56 | {file = "black-25.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f96b6726d690c96c60ba682955199f8c39abc1ae0c3a494a9c62c0184049a713"},
57 | {file = "black-25.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:d119957b37cc641596063cd7db2656c5be3752ac17877017b2ffcdb9dfc4d2b1"},
58 | {file = "black-25.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:456386fe87bad41b806d53c062e2974615825c7a52159cde7ccaeb0695fa28fa"},
59 | {file = "black-25.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a16b14a44c1af60a210d8da28e108e13e75a284bf21a9afa6b4571f96ab8bb9d"},
60 | {file = "black-25.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aaf319612536d502fdd0e88ce52d8f1352b2c0a955cc2798f79eeca9d3af0608"},
61 | {file = "black-25.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:c0372a93e16b3954208417bfe448e09b0de5cc721d521866cd9e0acac3c04a1f"},
62 | {file = "black-25.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1b9dc70c21ef8b43248f1d86aedd2aaf75ae110b958a7909ad8463c4aa0880b0"},
63 | {file = "black-25.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e46eecf65a095fa62e53245ae2795c90bdecabd53b50c448d0a8bcd0d2e74c4"},
64 | {file = "black-25.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9101ee58ddc2442199a25cb648d46ba22cd580b00ca4b44234a324e3ec7a0f7e"},
65 | {file = "black-25.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:77e7060a00c5ec4b3367c55f39cf9b06e68965a4f2e61cecacd6d0d9b7ec945a"},
66 | {file = "black-25.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0172a012f725b792c358d57fe7b6b6e8e67375dd157f64fa7a3097b3ed3e2175"},
67 | {file = "black-25.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3bec74ee60f8dfef564b573a96b8930f7b6a538e846123d5ad77ba14a8d7a64f"},
68 | {file = "black-25.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b756fc75871cb1bcac5499552d771822fd9db5a2bb8db2a7247936ca48f39831"},
69 | {file = "black-25.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:846d58e3ce7879ec1ffe816bb9df6d006cd9590515ed5d17db14e17666b2b357"},
70 | {file = "black-25.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef69351df3c84485a8beb6f7b8f9721e2009e20ef80a8d619e2d1788b7816d47"},
71 | {file = "black-25.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e3c1f4cd5e93842774d9ee4ef6cd8d17790e65f44f7cdbaab5f2cf8ccf22a823"},
72 | {file = "black-25.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:154b06d618233fe468236ba1f0e40823d4eb08b26f5e9261526fde34916b9140"},
73 | {file = "black-25.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:e593466de7b998374ea2585a471ba90553283fb9beefcfa430d84a2651ed5933"},
74 | {file = "black-25.9.0-py3-none-any.whl", hash = "sha256:474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae"},
75 | {file = "black-25.9.0.tar.gz", hash = "sha256:0474bca9a0dd1b51791fcc507a4e02078a1c63f6d4e4ae5544b9848c7adfb619"},
76 | ]
77 |
78 | [package.dependencies]
79 | click = ">=8.0.0"
80 | mypy-extensions = ">=0.4.3"
81 | packaging = ">=22.0"
82 | pathspec = ">=0.9.0"
83 | platformdirs = ">=2"
84 | pytokens = ">=0.1.10"
85 |
86 | [package.extras]
87 | colorama = ["colorama (>=0.4.3)"]
88 | d = ["aiohttp (>=3.10)"]
89 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
90 | uvloop = ["uvloop (>=0.15.2)"]
91 |
92 | [[package]]
93 | name = "click"
94 | version = "8.3.0"
95 | description = "Composable command line interface toolkit"
96 | optional = false
97 | python-versions = ">=3.10"
98 | groups = ["main", "dev"]
99 | files = [
100 | {file = "click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc"},
101 | {file = "click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4"},
102 | ]
103 |
104 | [package.dependencies]
105 | colorama = {version = "*", markers = "platform_system == \"Windows\""}
106 |
107 | [[package]]
108 | name = "colorama"
109 | version = "0.4.6"
110 | description = "Cross-platform colored terminal text."
111 | optional = false
112 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
113 | groups = ["main", "dev"]
114 | files = [
115 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
116 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
117 | ]
118 | markers = {main = "platform_system == \"Windows\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\""}
119 |
120 | [[package]]
121 | name = "fastapi"
122 | version = "0.120.3"
123 | description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
124 | optional = false
125 | python-versions = ">=3.8"
126 | groups = ["main"]
127 | files = [
128 | {file = "fastapi-0.120.3-py3-none-any.whl", hash = "sha256:bfee21c98db9128dc425a686eafd14899e26e4471aab33076bff2427fd6dcd22"},
129 | {file = "fastapi-0.120.3.tar.gz", hash = "sha256:17db50718ee86c9e01e54f9d8600abf130f6f762711cd0d8f02eb392668271ba"},
130 | ]
131 |
132 | [package.dependencies]
133 | annotated-doc = ">=0.0.2"
134 | pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0"
135 | starlette = ">=0.40.0,<0.50.0"
136 | typing-extensions = ">=4.8.0"
137 |
138 | [package.extras]
139 | all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
140 | standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"]
141 | standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"]
142 |
143 | [[package]]
144 | name = "h11"
145 | version = "0.16.0"
146 | description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
147 | optional = false
148 | python-versions = ">=3.8"
149 | groups = ["main"]
150 | files = [
151 | {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"},
152 | {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"},
153 | ]
154 |
155 | [[package]]
156 | name = "idna"
157 | version = "3.11"
158 | description = "Internationalized Domain Names in Applications (IDNA)"
159 | optional = false
160 | python-versions = ">=3.8"
161 | groups = ["main"]
162 | files = [
163 | {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"},
164 | {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"},
165 | ]
166 |
167 | [package.extras]
168 | all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
169 |
170 | [[package]]
171 | name = "iniconfig"
172 | version = "2.3.0"
173 | description = "brain-dead simple config-ini parsing"
174 | optional = false
175 | python-versions = ">=3.10"
176 | groups = ["dev"]
177 | files = [
178 | {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"},
179 | {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"},
180 | ]
181 |
182 | [[package]]
183 | name = "mypy-extensions"
184 | version = "1.1.0"
185 | description = "Type system extensions for programs checked with the mypy type checker."
186 | optional = false
187 | python-versions = ">=3.8"
188 | groups = ["dev"]
189 | files = [
190 | {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"},
191 | {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"},
192 | ]
193 |
194 | [[package]]
195 | name = "packaging"
196 | version = "25.0"
197 | description = "Core utilities for Python packages"
198 | optional = false
199 | python-versions = ">=3.8"
200 | groups = ["dev"]
201 | files = [
202 | {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"},
203 | {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"},
204 | ]
205 |
206 | [[package]]
207 | name = "pathspec"
208 | version = "0.12.1"
209 | description = "Utility library for gitignore style pattern matching of file paths."
210 | optional = false
211 | python-versions = ">=3.8"
212 | groups = ["dev"]
213 | files = [
214 | {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
215 | {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
216 | ]
217 |
218 | [[package]]
219 | name = "platformdirs"
220 | version = "4.5.0"
221 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
222 | optional = false
223 | python-versions = ">=3.10"
224 | groups = ["dev"]
225 | files = [
226 | {file = "platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3"},
227 | {file = "platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312"},
228 | ]
229 |
230 | [package.extras]
231 | docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx-autodoc-typehints (>=3.2)"]
232 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"]
233 | type = ["mypy (>=1.18.2)"]
234 |
235 | [[package]]
236 | name = "pluggy"
237 | version = "1.6.0"
238 | description = "plugin and hook calling mechanisms for python"
239 | optional = false
240 | python-versions = ">=3.9"
241 | groups = ["dev"]
242 | files = [
243 | {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"},
244 | {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"},
245 | ]
246 |
247 | [package.extras]
248 | dev = ["pre-commit", "tox"]
249 | testing = ["coverage", "pytest", "pytest-benchmark"]
250 |
251 | [[package]]
252 | name = "pydantic"
253 | version = "2.12.3"
254 | description = "Data validation using Python type hints"
255 | optional = false
256 | python-versions = ">=3.9"
257 | groups = ["main"]
258 | files = [
259 | {file = "pydantic-2.12.3-py3-none-any.whl", hash = "sha256:6986454a854bc3bc6e5443e1369e06a3a456af9d339eda45510f517d9ea5c6bf"},
260 | {file = "pydantic-2.12.3.tar.gz", hash = "sha256:1da1c82b0fc140bb0103bc1441ffe062154c8d38491189751ee00fd8ca65ce74"},
261 | ]
262 |
263 | [package.dependencies]
264 | annotated-types = ">=0.6.0"
265 | pydantic-core = "2.41.4"
266 | typing-extensions = ">=4.14.1"
267 | typing-inspection = ">=0.4.2"
268 |
269 | [package.extras]
270 | email = ["email-validator (>=2.0.0)"]
271 | timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""]
272 |
273 | [[package]]
274 | name = "pydantic-core"
275 | version = "2.41.4"
276 | description = "Core functionality for Pydantic validation and serialization"
277 | optional = false
278 | python-versions = ">=3.9"
279 | groups = ["main"]
280 | files = [
281 | {file = "pydantic_core-2.41.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2442d9a4d38f3411f22eb9dd0912b7cbf4b7d5b6c92c4173b75d3e1ccd84e36e"},
282 | {file = "pydantic_core-2.41.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:30a9876226dda131a741afeab2702e2d127209bde3c65a2b8133f428bc5d006b"},
283 | {file = "pydantic_core-2.41.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d55bbac04711e2980645af68b97d445cdbcce70e5216de444a6c4b6943ebcccd"},
284 | {file = "pydantic_core-2.41.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e1d778fb7849a42d0ee5927ab0f7453bf9f85eef8887a546ec87db5ddb178945"},
285 | {file = "pydantic_core-2.41.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b65077a4693a98b90ec5ad8f203ad65802a1b9b6d4a7e48066925a7e1606706"},
286 | {file = "pydantic_core-2.41.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62637c769dee16eddb7686bf421be48dfc2fae93832c25e25bc7242e698361ba"},
287 | {file = "pydantic_core-2.41.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfe3aa529c8f501babf6e502936b9e8d4698502b2cfab41e17a028d91b1ac7b"},
288 | {file = "pydantic_core-2.41.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca2322da745bf2eeb581fc9ea3bbb31147702163ccbcbf12a3bb630e4bf05e1d"},
289 | {file = "pydantic_core-2.41.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e8cd3577c796be7231dcf80badcf2e0835a46665eaafd8ace124d886bab4d700"},
290 | {file = "pydantic_core-2.41.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:1cae8851e174c83633f0833e90636832857297900133705ee158cf79d40f03e6"},
291 | {file = "pydantic_core-2.41.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a26d950449aae348afe1ac8be5525a00ae4235309b729ad4d3399623125b43c9"},
292 | {file = "pydantic_core-2.41.4-cp310-cp310-win32.whl", hash = "sha256:0cf2a1f599efe57fa0051312774280ee0f650e11152325e41dfd3018ef2c1b57"},
293 | {file = "pydantic_core-2.41.4-cp310-cp310-win_amd64.whl", hash = "sha256:a8c2e340d7e454dc3340d3d2e8f23558ebe78c98aa8f68851b04dcb7bc37abdc"},
294 | {file = "pydantic_core-2.41.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:28ff11666443a1a8cf2a044d6a545ebffa8382b5f7973f22c36109205e65dc80"},
295 | {file = "pydantic_core-2.41.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:61760c3925d4633290292bad462e0f737b840508b4f722247d8729684f6539ae"},
296 | {file = "pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eae547b7315d055b0de2ec3965643b0ab82ad0106a7ffd29615ee9f266a02827"},
297 | {file = "pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef9ee5471edd58d1fcce1c80ffc8783a650e3e3a193fe90d52e43bb4d87bff1f"},
298 | {file = "pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15dd504af121caaf2c95cb90c0ebf71603c53de98305621b94da0f967e572def"},
299 | {file = "pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a926768ea49a8af4d36abd6a8968b8790f7f76dd7cbd5a4c180db2b4ac9a3a2"},
300 | {file = "pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916b9b7d134bff5440098a4deb80e4cb623e68974a87883299de9124126c2a8"},
301 | {file = "pydantic_core-2.41.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5cf90535979089df02e6f17ffd076f07237efa55b7343d98760bde8743c4b265"},
302 | {file = "pydantic_core-2.41.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7533c76fa647fade2d7ec75ac5cc079ab3f34879626dae5689b27790a6cf5a5c"},
303 | {file = "pydantic_core-2.41.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:37e516bca9264cbf29612539801ca3cd5d1be465f940417b002905e6ed79d38a"},
304 | {file = "pydantic_core-2.41.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0c19cb355224037c83642429b8ce261ae108e1c5fbf5c028bac63c77b0f8646e"},
305 | {file = "pydantic_core-2.41.4-cp311-cp311-win32.whl", hash = "sha256:09c2a60e55b357284b5f31f5ab275ba9f7f70b7525e18a132ec1f9160b4f1f03"},
306 | {file = "pydantic_core-2.41.4-cp311-cp311-win_amd64.whl", hash = "sha256:711156b6afb5cb1cb7c14a2cc2c4a8b4c717b69046f13c6b332d8a0a8f41ca3e"},
307 | {file = "pydantic_core-2.41.4-cp311-cp311-win_arm64.whl", hash = "sha256:6cb9cf7e761f4f8a8589a45e49ed3c0d92d1d696a45a6feaee8c904b26efc2db"},
308 | {file = "pydantic_core-2.41.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ab06d77e053d660a6faaf04894446df7b0a7e7aba70c2797465a0a1af00fc887"},
309 | {file = "pydantic_core-2.41.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c53ff33e603a9c1179a9364b0a24694f183717b2e0da2b5ad43c316c956901b2"},
310 | {file = "pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:304c54176af2c143bd181d82e77c15c41cbacea8872a2225dd37e6544dce9999"},
311 | {file = "pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025ba34a4cf4fb32f917d5d188ab5e702223d3ba603be4d8aca2f82bede432a4"},
312 | {file = "pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9f5f30c402ed58f90c70e12eff65547d3ab74685ffe8283c719e6bead8ef53f"},
313 | {file = "pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd96e5d15385d301733113bcaa324c8bcf111275b7675a9c6e88bfb19fc05e3b"},
314 | {file = "pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f348cbb44fae6e9653c1055db7e29de67ea6a9ca03a5fa2c2e11a47cff0e47"},
315 | {file = "pydantic_core-2.41.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec22626a2d14620a83ca583c6f5a4080fa3155282718b6055c2ea48d3ef35970"},
316 | {file = "pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a95d4590b1f1a43bf33ca6d647b990a88f4a3824a8c4572c708f0b45a5290ed"},
317 | {file = "pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:f9672ab4d398e1b602feadcffcdd3af44d5f5e6ddc15bc7d15d376d47e8e19f8"},
318 | {file = "pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:84d8854db5f55fead3b579f04bda9a36461dab0730c5d570e1526483e7bb8431"},
319 | {file = "pydantic_core-2.41.4-cp312-cp312-win32.whl", hash = "sha256:9be1c01adb2ecc4e464392c36d17f97e9110fbbc906bcbe1c943b5b87a74aabd"},
320 | {file = "pydantic_core-2.41.4-cp312-cp312-win_amd64.whl", hash = "sha256:d682cf1d22bab22a5be08539dca3d1593488a99998f9f412137bc323179067ff"},
321 | {file = "pydantic_core-2.41.4-cp312-cp312-win_arm64.whl", hash = "sha256:833eebfd75a26d17470b58768c1834dfc90141b7afc6eb0429c21fc5a21dcfb8"},
322 | {file = "pydantic_core-2.41.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:85e050ad9e5f6fe1004eec65c914332e52f429bc0ae12d6fa2092407a462c746"},
323 | {file = "pydantic_core-2.41.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7393f1d64792763a48924ba31d1e44c2cfbc05e3b1c2c9abb4ceeadd912cced"},
324 | {file = "pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94dab0940b0d1fb28bcab847adf887c66a27a40291eedf0b473be58761c9799a"},
325 | {file = "pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de7c42f897e689ee6f9e93c4bec72b99ae3b32a2ade1c7e4798e690ff5246e02"},
326 | {file = "pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:664b3199193262277b8b3cd1e754fb07f2c6023289c815a1e1e8fb415cb247b1"},
327 | {file = "pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95b253b88f7d308b1c0b417c4624f44553ba4762816f94e6986819b9c273fb2"},
328 | {file = "pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1351f5bbdbbabc689727cb91649a00cb9ee7203e0a6e54e9f5ba9e22e384b84"},
329 | {file = "pydantic_core-2.41.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1affa4798520b148d7182da0615d648e752de4ab1a9566b7471bc803d88a062d"},
330 | {file = "pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7b74e18052fea4aa8dea2fb7dbc23d15439695da6cbe6cfc1b694af1115df09d"},
331 | {file = "pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:285b643d75c0e30abda9dc1077395624f314a37e3c09ca402d4015ef5979f1a2"},
332 | {file = "pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f52679ff4218d713b3b33f88c89ccbf3a5c2c12ba665fb80ccc4192b4608dbab"},
333 | {file = "pydantic_core-2.41.4-cp313-cp313-win32.whl", hash = "sha256:ecde6dedd6fff127c273c76821bb754d793be1024bc33314a120f83a3c69460c"},
334 | {file = "pydantic_core-2.41.4-cp313-cp313-win_amd64.whl", hash = "sha256:d081a1f3800f05409ed868ebb2d74ac39dd0c1ff6c035b5162356d76030736d4"},
335 | {file = "pydantic_core-2.41.4-cp313-cp313-win_arm64.whl", hash = "sha256:f8e49c9c364a7edcbe2a310f12733aad95b022495ef2a8d653f645e5d20c1564"},
336 | {file = "pydantic_core-2.41.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ed97fd56a561f5eb5706cebe94f1ad7c13b84d98312a05546f2ad036bafe87f4"},
337 | {file = "pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a870c307bf1ee91fc58a9a61338ff780d01bfae45922624816878dce784095d2"},
338 | {file = "pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25e97bc1f5f8f7985bdc2335ef9e73843bb561eb1fa6831fdfc295c1c2061cf"},
339 | {file = "pydantic_core-2.41.4-cp313-cp313t-win_amd64.whl", hash = "sha256:d405d14bea042f166512add3091c1af40437c2e7f86988f3915fabd27b1e9cd2"},
340 | {file = "pydantic_core-2.41.4-cp313-cp313t-win_arm64.whl", hash = "sha256:19f3684868309db5263a11bace3c45d93f6f24afa2ffe75a647583df22a2ff89"},
341 | {file = "pydantic_core-2.41.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:e9205d97ed08a82ebb9a307e92914bb30e18cdf6f6b12ca4bedadb1588a0bfe1"},
342 | {file = "pydantic_core-2.41.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:82df1f432b37d832709fbcc0e24394bba04a01b6ecf1ee87578145c19cde12ac"},
343 | {file = "pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3b4cc4539e055cfa39a3763c939f9d409eb40e85813257dcd761985a108554"},
344 | {file = "pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b1eb1754fce47c63d2ff57fdb88c351a6c0150995890088b33767a10218eaa4e"},
345 | {file = "pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6ab5ab30ef325b443f379ddb575a34969c333004fca5a1daa0133a6ffaad616"},
346 | {file = "pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31a41030b1d9ca497634092b46481b937ff9397a86f9f51bd41c4767b6fc04af"},
347 | {file = "pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a44ac1738591472c3d020f61c6df1e4015180d6262ebd39bf2aeb52571b60f12"},
348 | {file = "pydantic_core-2.41.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d72f2b5e6e82ab8f94ea7d0d42f83c487dc159c5240d8f83beae684472864e2d"},
349 | {file = "pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c4d1e854aaf044487d31143f541f7aafe7b482ae72a022c664b2de2e466ed0ad"},
350 | {file = "pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b568af94267729d76e6ee5ececda4e283d07bbb28e8148bb17adad93d025d25a"},
351 | {file = "pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6d55fb8b1e8929b341cc313a81a26e0d48aa3b519c1dbaadec3a6a2b4fcad025"},
352 | {file = "pydantic_core-2.41.4-cp314-cp314-win32.whl", hash = "sha256:5b66584e549e2e32a1398df11da2e0a7eff45d5c2d9db9d5667c5e6ac764d77e"},
353 | {file = "pydantic_core-2.41.4-cp314-cp314-win_amd64.whl", hash = "sha256:557a0aab88664cc552285316809cab897716a372afaf8efdbef756f8b890e894"},
354 | {file = "pydantic_core-2.41.4-cp314-cp314-win_arm64.whl", hash = "sha256:3f1ea6f48a045745d0d9f325989d8abd3f1eaf47dd00485912d1a3a63c623a8d"},
355 | {file = "pydantic_core-2.41.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6c1fe4c5404c448b13188dd8bd2ebc2bdd7e6727fa61ff481bcc2cca894018da"},
356 | {file = "pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:523e7da4d43b113bf8e7b49fa4ec0c35bf4fe66b2230bfc5c13cc498f12c6c3e"},
357 | {file = "pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5729225de81fb65b70fdb1907fcf08c75d498f4a6f15af005aabb1fdadc19dfa"},
358 | {file = "pydantic_core-2.41.4-cp314-cp314t-win_amd64.whl", hash = "sha256:de2cfbb09e88f0f795fd90cf955858fc2c691df65b1f21f0aa00b99f3fbc661d"},
359 | {file = "pydantic_core-2.41.4-cp314-cp314t-win_arm64.whl", hash = "sha256:d34f950ae05a83e0ede899c595f312ca976023ea1db100cd5aa188f7005e3ab0"},
360 | {file = "pydantic_core-2.41.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:646e76293345954acea6966149683047b7b2ace793011922208c8e9da12b0062"},
361 | {file = "pydantic_core-2.41.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc8e85a63085a137d286e2791037f5fdfff0aabb8b899483ca9c496dd5797338"},
362 | {file = "pydantic_core-2.41.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:692c622c8f859a17c156492783902d8370ac7e121a611bd6fe92cc71acf9ee8d"},
363 | {file = "pydantic_core-2.41.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d1e2906efb1031a532600679b424ef1d95d9f9fb507f813951f23320903adbd7"},
364 | {file = "pydantic_core-2.41.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04e2f7f8916ad3ddd417a7abdd295276a0bf216993d9318a5d61cc058209166"},
365 | {file = "pydantic_core-2.41.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df649916b81822543d1c8e0e1d079235f68acdc7d270c911e8425045a8cfc57e"},
366 | {file = "pydantic_core-2.41.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c529f862fdba70558061bb936fe00ddbaaa0c647fd26e4a4356ef1d6561891"},
367 | {file = "pydantic_core-2.41.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3b4c5a1fd3a311563ed866c2c9b62da06cb6398bee186484ce95c820db71cb"},
368 | {file = "pydantic_core-2.41.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6e0fc40d84448f941df9b3334c4b78fe42f36e3bf631ad54c3047a0cdddc2514"},
369 | {file = "pydantic_core-2.41.4-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:44e7625332683b6c1c8b980461475cde9595eff94447500e80716db89b0da005"},
370 | {file = "pydantic_core-2.41.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:170ee6835f6c71081d031ef1c3b4dc4a12b9efa6a9540f93f95b82f3c7571ae8"},
371 | {file = "pydantic_core-2.41.4-cp39-cp39-win32.whl", hash = "sha256:3adf61415efa6ce977041ba9745183c0e1f637ca849773afa93833e04b163feb"},
372 | {file = "pydantic_core-2.41.4-cp39-cp39-win_amd64.whl", hash = "sha256:a238dd3feee263eeaeb7dc44aea4ba1364682c4f9f9467e6af5596ba322c2332"},
373 | {file = "pydantic_core-2.41.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:a1b2cfec3879afb742a7b0bcfa53e4f22ba96571c9e54d6a3afe1052d17d843b"},
374 | {file = "pydantic_core-2.41.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:d175600d975b7c244af6eb9c9041f10059f20b8bbffec9e33fdd5ee3f67cdc42"},
375 | {file = "pydantic_core-2.41.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f184d657fa4947ae5ec9c47bd7e917730fa1cbb78195037e32dcbab50aca5ee"},
376 | {file = "pydantic_core-2.41.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ed810568aeffed3edc78910af32af911c835cc39ebbfacd1f0ab5dd53028e5c"},
377 | {file = "pydantic_core-2.41.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:4f5d640aeebb438517150fdeec097739614421900e4a08db4a3ef38898798537"},
378 | {file = "pydantic_core-2.41.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:4a9ab037b71927babc6d9e7fc01aea9e66dc2a4a34dff06ef0724a4049629f94"},
379 | {file = "pydantic_core-2.41.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4dab9484ec605c3016df9ad4fd4f9a390bc5d816a3b10c6550f8424bb80b18c"},
380 | {file = "pydantic_core-2.41.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8a5028425820731d8c6c098ab642d7b8b999758e24acae03ed38a66eca8335"},
381 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1e5ab4fc177dd41536b3c32b2ea11380dd3d4619a385860621478ac2d25ceb00"},
382 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3d88d0054d3fa11ce936184896bed3c1c5441d6fa483b498fac6a5d0dd6f64a9"},
383 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2a054a8725f05b4b6503357e0ac1c4e8234ad3b0c2ac130d6ffc66f0e170e2"},
384 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0d9db5a161c99375a0c68c058e227bee1d89303300802601d76a3d01f74e258"},
385 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:6273ea2c8ffdac7b7fda2653c49682db815aebf4a89243a6feccf5e36c18c347"},
386 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:4c973add636efc61de22530b2ef83a65f39b6d6f656df97f678720e20de26caa"},
387 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b69d1973354758007f46cf2d44a4f3d0933f10b6dc9bf15cf1356e037f6f731a"},
388 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3619320641fd212aaf5997b6ca505e97540b7e16418f4a241f44cdf108ffb50d"},
389 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:491535d45cd7ad7e4a2af4a5169b0d07bebf1adfd164b0368da8aa41e19907a5"},
390 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:54d86c0cada6aba4ec4c047d0e348cbad7063b87ae0f005d9f8c9ad04d4a92a2"},
391 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca1124aced216b2500dc2609eade086d718e8249cb9696660ab447d50a758bd"},
392 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c9024169becccf0cb470ada03ee578d7348c119a0d42af3dcf9eda96e3a247c"},
393 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:26895a4268ae5a2849269f4991cdc97236e4b9c010e51137becf25182daac405"},
394 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:ca4df25762cf71308c446e33c9b1fdca2923a3f13de616e2a949f38bf21ff5a8"},
395 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:5a28fcedd762349519276c36634e71853b4541079cab4acaaac60c4421827308"},
396 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c173ddcd86afd2535e2b695217e82191580663a1d1928239f877f5a1649ef39f"},
397 | {file = "pydantic_core-2.41.4.tar.gz", hash = "sha256:70e47929a9d4a1905a67e4b687d5946026390568a8e952b92824118063cee4d5"},
398 | ]
399 |
400 | [package.dependencies]
401 | typing-extensions = ">=4.14.1"
402 |
403 | [[package]]
404 | name = "pygments"
405 | version = "2.19.2"
406 | description = "Pygments is a syntax highlighting package written in Python."
407 | optional = false
408 | python-versions = ">=3.8"
409 | groups = ["dev"]
410 | files = [
411 | {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"},
412 | {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"},
413 | ]
414 |
415 | [package.extras]
416 | windows-terminal = ["colorama (>=0.4.6)"]
417 |
418 | [[package]]
419 | name = "pytest"
420 | version = "8.4.2"
421 | description = "pytest: simple powerful testing with Python"
422 | optional = false
423 | python-versions = ">=3.9"
424 | groups = ["dev"]
425 | files = [
426 | {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"},
427 | {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"},
428 | ]
429 |
430 | [package.dependencies]
431 | colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""}
432 | iniconfig = ">=1"
433 | packaging = ">=20"
434 | pluggy = ">=1.5,<2"
435 | pygments = ">=2.7.2"
436 |
437 | [package.extras]
438 | dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"]
439 |
440 | [[package]]
441 | name = "pytokens"
442 | version = "0.2.0"
443 | description = "A Fast, spec compliant Python 3.13+ tokenizer that runs on older Pythons."
444 | optional = false
445 | python-versions = ">=3.8"
446 | groups = ["dev"]
447 | files = [
448 | {file = "pytokens-0.2.0-py3-none-any.whl", hash = "sha256:74d4b318c67f4295c13782ddd9abcb7e297ec5630ad060eb90abf7ebbefe59f8"},
449 | {file = "pytokens-0.2.0.tar.gz", hash = "sha256:532d6421364e5869ea57a9523bf385f02586d4662acbcc0342afd69511b4dd43"},
450 | ]
451 |
452 | [package.extras]
453 | dev = ["black", "build", "mypy", "pytest", "pytest-cov", "setuptools", "tox", "twine", "wheel"]
454 |
455 | [[package]]
456 | name = "sniffio"
457 | version = "1.3.1"
458 | description = "Sniff out which async library your code is running under"
459 | optional = false
460 | python-versions = ">=3.7"
461 | groups = ["main"]
462 | files = [
463 | {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
464 | {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
465 | ]
466 |
467 | [[package]]
468 | name = "starlette"
469 | version = "0.49.1"
470 | description = "The little ASGI library that shines."
471 | optional = false
472 | python-versions = ">=3.9"
473 | groups = ["main"]
474 | files = [
475 | {file = "starlette-0.49.1-py3-none-any.whl", hash = "sha256:d92ce9f07e4a3caa3ac13a79523bd18e3bc0042bb8ff2d759a8e7dd0e1859875"},
476 | {file = "starlette-0.49.1.tar.gz", hash = "sha256:481a43b71e24ed8c43b11ea02f5353d77840e01480881b8cb5a26b8cae64a8cb"},
477 | ]
478 |
479 | [package.dependencies]
480 | anyio = ">=3.6.2,<5"
481 |
482 | [package.extras]
483 | full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"]
484 |
485 | [[package]]
486 | name = "typing-extensions"
487 | version = "4.15.0"
488 | description = "Backported and Experimental Type Hints for Python 3.9+"
489 | optional = false
490 | python-versions = ">=3.9"
491 | groups = ["main"]
492 | files = [
493 | {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"},
494 | {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"},
495 | ]
496 |
497 | [[package]]
498 | name = "typing-inspection"
499 | version = "0.4.2"
500 | description = "Runtime typing introspection tools"
501 | optional = false
502 | python-versions = ">=3.9"
503 | groups = ["main"]
504 | files = [
505 | {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"},
506 | {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"},
507 | ]
508 |
509 | [package.dependencies]
510 | typing-extensions = ">=4.12.0"
511 |
512 | [[package]]
513 | name = "uvicorn"
514 | version = "0.38.0"
515 | description = "The lightning-fast ASGI server."
516 | optional = false
517 | python-versions = ">=3.9"
518 | groups = ["main"]
519 | files = [
520 | {file = "uvicorn-0.38.0-py3-none-any.whl", hash = "sha256:48c0afd214ceb59340075b4a052ea1ee91c16fbc2a9b1469cca0e54566977b02"},
521 | {file = "uvicorn-0.38.0.tar.gz", hash = "sha256:fd97093bdd120a2609fc0d3afe931d4d4ad688b6e75f0f929fde1bc36fe0e91d"},
522 | ]
523 |
524 | [package.dependencies]
525 | click = ">=7.0"
526 | h11 = ">=0.8"
527 |
528 | [package.extras]
529 | standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"]
530 |
531 | [metadata]
532 | lock-version = "2.1"
533 | python-versions = "^3.13"
534 | content-hash = "9b8680f2960908b9acf2facaad95f50d7967a6f8ae3aa90a1ab6e84749afb572"
535 |
--------------------------------------------------------------------------------
/dataanalysis/google_stock_price.csv:
--------------------------------------------------------------------------------
1 | Stock Price
2 | 50.12
3 | 54.1
4 | 54.65
5 | 52.38
6 | 52.95
7 | 53.9
8 | 53.02
9 | 50.95
10 | 51.13
11 | 50.07
12 | 50.7
13 | 49.95
14 | 50.74
15 | 51.1
16 | 51.1
17 | 52.61
18 | 53.7
19 | 55.69
20 | 55.94
21 | 56.93
22 | 58.69
23 | 59.62
24 | 58.86
25 | 59.13
26 | 60.35
27 | 59.86
28 | 59.07
29 | 63.37
30 | 65.47
31 | 64.74
32 | 66.22
33 | 67.46
34 | 69.12
35 | 68.47
36 | 69.36
37 | 68.8
38 | 67.56
39 | 68.63
40 | 70.38
41 | 70.93
42 | 71.98
43 | 74.51
44 | 73.9
45 | 70.17
46 | 74.62
47 | 86.13
48 | 93.61
49 | 90.81
50 | 92.89
51 | 96.55
52 | 95.22
53 | 97.92
54 | 97.34
55 | 95.74
56 | 92.26
57 | 84.59
58 | 86.19
59 | 84.27
60 | 83.85
61 | 91.42
62 | 90.91
63 | 92.34
64 | 86.19
65 | 86.16
66 | 83.69
67 | 84.62
68 | 82.47
69 | 83.68
70 | 87.29
71 | 89.61
72 | 90.43
73 | 90.9
74 | 89.89
75 | 89.61
76 | 90.11
77 | 88.06
78 | 85.63
79 | 84.91
80 | 86.63
81 | 85.74
82 | 85.14
83 | 89.26
84 | 89.8
85 | 88.15
86 | 89.95
87 | 92.42
88 | 91.78
89 | 93.06
90 | 93.86
91 | 95.86
92 | 96.28
93 | 96.35
94 | 98.7
95 | 96.3
96 | 101.25
97 | 97.15
98 | 96.66
99 | 94.18
100 | 96.83
101 | 97.43
102 | 96.67
103 | 97.59
104 | 97.57
105 | 99.89
106 | 101.85
107 | 98.55
108 | 96.86
109 | 94.05
110 | 90.27
111 | 88.47
112 | 94.53
113 | 93.95
114 | 95.07
115 | 97.71
116 | 95.85
117 | 102.88
118 | 105.32
119 | 102.08
120 | 97.92
121 | 99.22
122 | 95.69
123 | 93.9
124 | 93.61
125 | 96.4
126 | 97.52
127 | 99.11
128 | 98.85
129 | 98.88
130 | 95.59
131 | 96.88
132 | 94.35
133 | 92.84
134 | 93.9
135 | 92.94
136 | 92.5
137 | 93.41
138 | 92.86
139 | 94.31
140 | 92.51
141 | 90.58
142 | 89.9
143 | 88.81
144 | 87.41
145 | 89.22
146 | 87.71
147 | 89.56
148 | 89.93
149 | 90.35
150 | 89.21
151 | 89.4
152 | 89.54
153 | 90.62
154 | 89.7
155 | 90.13
156 | 90.16
157 | 89.93
158 | 92.55
159 | 94.19
160 | 94.52
161 | 96.78
162 | 95.93
163 | 96.52
164 | 96.88
165 | 96.37
166 | 95.63
167 | 92.41
168 | 93.39
169 | 95.6
170 | 98.95
171 | 102.01
172 | 107.8
173 | 111.65
174 | 109.27
175 | 109.78
176 | 109.62
177 | 109.89
178 | 111.03
179 | 112.98
180 | 114.14
181 | 113.38
182 | 113.9
183 | 112.9
184 | 113.79
185 | 115.53
186 | 114.25
187 | 114.51
188 | 115.41
189 | 116.45
190 | 119.46
191 | 119.47
192 | 120.68
193 | 127.6
194 | 127.87
195 | 130.27
196 | 129.47
197 | 132.87
198 | 138.5
199 | 143.86
200 | 143.81
201 | 139.99
202 | 145.32
203 | 146.41
204 | 139.64
205 | 143.01
206 | 141.11
207 | 141.23
208 | 139.04
209 | 137.26
210 | 138.58
211 | 140
212 | 143.21
213 | 143.78
214 | 144.51
215 | 144.71
216 | 148.48
217 | 151.9
218 | 150.85
219 | 146.21
220 | 146.93
221 | 145.48
222 | 147.71
223 | 145.62
224 | 147.62
225 | 147.97
226 | 146.53
227 | 145.75
228 | 149.28
229 | 150.29
230 | 150.44
231 | 149.62
232 | 154.8
233 | 155.84
234 | 156.81
235 | 151.05
236 | 147.78
237 | 147.9
238 | 148.32
239 | 146.6
240 | 143.74
241 | 145.66
242 | 149.45
243 | 148.5
244 | 148.72
245 | 146.03
246 | 145.48
247 | 145.64
248 | 142.7
249 | 141.88
250 | 144.72
251 | 141.86
252 | 142.68
253 | 142.41
254 | 139.86
255 | 139.86
256 | 136.87
257 | 139.65
258 | 141.14
259 | 141.15
260 | 141.65
261 | 144.08
262 | 143.49
263 | 142.86
264 | 142.98
265 | 144.08
266 | 143.41
267 | 147.29
268 | 147.55
269 | 149.4
270 | 154.72
271 | 155.68
272 | 151.35
273 | 151.16
274 | 149.95
275 | 151.74
276 | 153.8
277 | 155.79
278 | 155.53
279 | 157.52
280 | 156.98
281 | 156.81
282 | 152.85
283 | 154.66
284 | 158.07
285 | 159.18
286 | 155.34
287 | 155.2
288 | 156.22
289 | 156.34
290 | 155.17
291 | 152.9
292 | 150.33
293 | 148.57
294 | 147.92
295 | 152.35
296 | 151.49
297 | 154.2
298 | 151.45
299 | 169.78
300 | 174.15
301 | 173.28
302 | 177.54
303 | 176.35
304 | 178.91
305 | 185.88
306 | 189.5
307 | 189.65
308 | 192.78
309 | 195.02
310 | 197.32
311 | 194.76
312 | 189.39
313 | 195.35
314 | 195
315 | 198.29
316 | 196.2
317 | 198.88
318 | 201.52
319 | 199.9
320 | 204.48
321 | 208.03
322 | 211.22
323 | 214.1
324 | 211.53
325 | 201.57
326 | 202.25
327 | 206.84
328 | 208.64
329 | 202.72
330 | 202.07
331 | 201.91
332 | 205.12
333 | 204.4
334 | 206.1
335 | 208.54
336 | 209.27
337 | 211.05
338 | 214.86
339 | 212.09
340 | 214.66
341 | 212.95
342 | 215.8
343 | 215.25
344 | 212.11
345 | 213.13
346 | 209.86
347 | 207.22
348 | 217.4
349 | 222.4
350 | 225.39
351 | 232.6
352 | 233.22
353 | 234.65
354 | 235.58
355 | 231.58
356 | 232.89
357 | 233.32
358 | 222.23
359 | 218
360 | 199.53
361 | 213.54
362 | 221.29
363 | 216.28
364 | 216.92
365 | 216.53
366 | 213.2
367 | 216.11
368 | 200.69
369 | 197.82
370 | 190.59
371 | 192.36
372 | 183.78
373 | 184.36
374 | 179.21
375 | 181.12
376 | 172.68
377 | 171.49
378 | 171.02
379 | 183.05
380 | 184.19
381 | 183.11
382 | 182.56
383 | 188.85
384 | 188.51
385 | 194.99
386 | 181.13
387 | 182.22
388 | 188.04
389 | 188.9
390 | 183.87
391 | 182.04
392 | 176.76
393 | 171.33
394 | 168.58
395 | 168.36
396 | 175.4
397 | 172.08
398 | 169.22
399 | 169.73
400 | 173.92
401 | 169.79
402 | 169.94
403 | 170.77
404 | 182.72
405 | 184.66
406 | 188.41
407 | 197.29
408 | 194.03
409 | 194.8
410 | 194.66
411 | 201.97
412 | 203.79
413 | 205.38
414 | 202.88
415 | 207.98
416 | 204.63
417 | 204.27
418 | 200.88
419 | 203.21
420 | 201.92
421 | 205.04
422 | 207.29
423 | 218.33
424 | 220.03
425 | 213.37
426 | 212.77
427 | 209.8
428 | 208.76
429 | 199.25
430 | 197.2
431 | 196.89
432 | 197.18
433 | 196.95
434 | 197.19
435 | 204.2
436 | 201.29
437 | 193.31
438 | 186.88
439 | 187.91
440 | 185.46
441 | 187.06
442 | 185.31
443 | 184.82
444 | 185.29
445 | 187.6
446 | 190.43
447 | 191.3
448 | 190.48
449 | 185.78
450 | 185.72
451 | 191.12
452 | 189.53
453 | 187.03
454 | 194.8
455 | 193.06
456 | 196.45
457 | 193.09
458 | 190.58
459 | 193.07
460 | 192
461 | 195.3
462 | 195.15
463 | 193.88
464 | 193.39
465 | 200.86
466 | 199.78
467 | 202.23
468 | 201.91
469 | 200.96
470 | 202.85
471 | 208.7
472 | 209.46
473 | 211.39
474 | 210.52
475 | 211.38
476 | 210.01
477 | 208.89
478 | 212.07
479 | 208.42
480 | 204.21
481 | 201.55
482 | 203.74
483 | 201.32
484 | 199.3
485 | 193.37
486 | 194.86
487 | 195.25
488 | 194.49
489 | 192.56
490 | 191.01
491 | 193.87
492 | 193.11
493 | 187.57
494 | 183.43
495 | 187.51
496 | 186.74
497 | 188.79
498 | 190.31
499 | 188.28
500 | 186.91
501 | 184.07
502 | 184.53
503 | 190.29
504 | 193.67
505 | 192.71
506 | 191.49
507 | 188.46
508 | 188.96
509 | 186.53
510 | 186.68
511 | 186.44
512 | 190.28
513 | 189.29
514 | 190.18
515 | 189.08
516 | 189.11
517 | 191.99
518 | 189.88
519 | 189.06
520 | 188.74
521 | 191.85
522 | 195.75
523 | 203.08
524 | 201.79
525 | 204.74
526 | 207.14
527 | 201.7
528 | 198.3
529 | 203.22
530 | 201.69
531 | 201.79
532 | 203.23
533 | 201.26
534 | 201.59
535 | 200.75
536 | 200.52
537 | 201.82
538 | 207.64
539 | 205.7
540 | 210.04
541 | 214.29
542 | 213.11
543 | 213.04
544 | 213.51
545 | 213.44
546 | 210.66
547 | 210.11
548 | 209.44
549 | 212.82
550 | 229.61
551 | 240.15
552 | 236.42
553 | 243.06
554 | 242.31
555 | 237.36
556 | 238.05
557 | 237.96
558 | 233.52
559 | 234.72
560 | 235.66
561 | 238.24
562 | 236.05
563 | 237.26
564 | 236.08
565 | 236.54
566 | 240.27
567 | 244.41
568 | 245.72
569 | 247.7
570 | 249.15
571 | 247.28
572 | 254.57
573 | 253.75
574 | 252.2
575 | 242.13
576 | 244.51
577 | 242.08
578 | 242.16
579 | 240.16
580 | 242.18
581 | 243.26
582 | 244.11
583 | 241.08
584 | 241.81
585 | 241.72
586 | 240.65
587 | 239.26
588 | 240.82
589 | 239.91
590 | 231.17
591 | 234.08
592 | 231.22
593 | 227.87
594 | 227.56
595 | 228.54
596 | 233.78
597 | 231.05
598 | 230.01
599 | 233.56
600 | 241.39
601 | 243.35
602 | 241.55
603 | 242.51
604 | 244.49
605 | 249.61
606 | 252.25
607 | 251.89
608 | 248.39
609 | 243.67
610 | 244.63
611 | 240.18
612 | 239.29
613 | 249.28
614 | 243.8
615 | 247.67
616 | 245.99
617 | 246.91
618 | 250.5
619 | 240.63
620 | 240.51
621 | 233.35
622 | 235.5
623 | 234.77
624 | 235.28
625 | 230.71
626 | 228.92
627 | 229.32
628 | 232.73
629 | 230.5
630 | 234.74
631 | 235.81
632 | 237.69
633 | 237.69
634 | 235.07
635 | 232.23
636 | 224.16
637 | 224.5
638 | 223.89
639 | 219.12
640 | 220.25
641 | 228.55
642 | 227.59
643 | 227.13
644 | 226.25
645 | 227.15
646 | 221.29
647 | 223.78
648 | 222.87
649 | 220.2
650 | 223.39
651 | 222.42
652 | 228.05
653 | 230.79
654 | 230.68
655 | 232.27
656 | 231.58
657 | 230.71
658 | 230.23
659 | 228.85
660 | 229.04
661 | 236.06
662 | 235.27
663 | 235.52
664 | 233.87
665 | 233.02
666 | 232.03
667 | 233.46
668 | 232.91
669 | 236.9
670 | 236.16
671 | 237.77
672 | 235.59
673 | 241
674 | 239.3
675 | 238.53
676 | 238.76
677 | 240.35
678 | 239.27
679 | 235.45
680 | 234.27
681 | 232.66
682 | 236.38
683 | 235.32
684 | 233.4
685 | 233.17
686 | 234.39
687 | 230.5
688 | 233.14
689 | 230.66
690 | 228.77
691 | 236.07
692 | 235.24
693 | 234.92
694 | 235.06
695 | 237.69
696 | 236.75
697 | 236.93
698 | 241.52
699 | 243.31
700 | 249.05
701 | 248.71
702 | 249.95
703 | 253.28
704 | 259.16
705 | 258.87
706 | 257.27
707 | 257.49
708 | 255.41
709 | 252.13
710 | 252.37
711 | 251.17
712 | 252.69
713 | 257.34
714 | 256.9
715 | 254.73
716 | 256.8
717 | 262.23
718 | 263.45
719 | 264.86
720 | 262.88
721 | 262.24
722 | 261.09
723 | 264.92
724 | 266.9
725 | 270.54
726 | 269.43
727 | 271.01
728 | 271.4
729 | 271.96
730 | 272.39
731 | 275.8
732 | 276.22
733 | 277.22
734 | 274.48
735 | 274.02
736 | 259.8
737 | 256
738 | 256.74
739 | 254.63
740 | 253.75
741 | 255.69
742 | 257.8
743 | 254.74
744 | 256.21
745 | 255.25
746 | 251.25
747 | 254.74
748 | 257.75
749 | 262.63
750 | 257.11
751 | 257.62
752 | 257.49
753 | 254.05
754 | 248.53
755 | 245.51
756 | 249.77
757 | 248.71
758 | 253.05
759 | 256.12
760 | 255.84
761 | 257.24
762 | 256.37
763 | 252.95
764 | 256.18
765 | 255.44
766 | 257.37
767 | 262.31
768 | 263.64
769 | 261.5
770 | 259.42
771 | 256.98
772 | 260.4
773 | 261.06
774 | 262.13
775 | 264.11
776 | 262.39
777 | 267.37
778 | 273.15
779 | 276.14
780 | 279.77
781 | 283.73
782 | 284.22
783 | 283.8
784 | 283.47
785 | 283.35
786 | 290.98
787 | 291.9
788 | 291.72
789 | 289.23
790 | 296.73
791 | 304.51
792 | 307.28
793 | 312.38
794 | 310.69
795 | 318.38
796 | 309.74
797 | 307.69
798 | 316.42
799 | 319.49
800 | 322.03
801 | 325.05
802 | 337.55
803 | 337.57
804 | 333.92
805 | 336.96
806 | 339.28
807 | 347.04
808 | 353.15
809 | 351.25
810 | 355.27
811 | 362.46
812 | 370.52
813 | 366.1
814 | 346.57
815 | 331.65
816 | 315.72
817 | 329.94
818 | 320.52
819 | 314.51
820 | 316.5
821 | 312.61
822 | 323.95
823 | 329.93
824 | 338.01
825 | 332.7
826 | 336.45
827 | 345.78
828 | 348.15
829 | 346.15
830 | 340.42
831 | 341.74
832 | 348.91
833 | 357.27
834 | 357.08
835 | 358.85
836 | 349.25
837 | 349.33
838 | 346.68
839 | 344.64
840 | 334.28
841 | 336.34
842 | 338.35
843 | 344.5
844 | 348
845 | 350.01
846 | 355.06
847 | 350.02
848 | 350.91
849 | 345.39
850 | 342.25
851 | 342.32
852 | 328.17
853 | 324.3
854 | 315.52
855 | 326.27
856 | 323.04
857 | 318.81
858 | 326.58
859 | 318.51
860 | 307.67
861 | 300.09
862 | 299.82
863 | 291.88
864 | 274.04
865 | 286.96
866 | 282.92
867 | 277.71
868 | 274.98
869 | 273.86
870 | 281.87
871 | 257.69
872 | 247.47
873 | 253.15
874 | 250.6
875 | 252.22
876 | 258.09
877 | 260.32
878 | 258.79
879 | 267.04
880 | 265.86
881 | 264.56
882 | 254.22
883 | 254.25
884 | 251.18
885 | 253.65
886 | 242.98
887 | 231.86
888 | 236.19
889 | 237.46
890 | 235.35
891 | 228.28
892 | 222.08
893 | 223.63
894 | 216.13
895 | 216.46
896 | 206.6
897 | 219.7
898 | 219.87
899 | 221.28
900 | 218.74
901 | 209.73
902 | 219.36
903 | 215.78
904 | 216.56
905 | 230.05
906 | 225.16
907 | 228.87
908 | 221.82
909 | 218.82
910 | 220.01
911 | 232.62
912 | 232.62
913 | 227.33
914 | 235.31
915 | 238.17
916 | 233.67
917 | 231.86
918 | 234.3
919 | 228.5
920 | 225.6
921 | 223.2
922 | 227.29
923 | 224.55
924 | 269.44
925 | 268.63
926 | 277.22
927 | 272.97
928 | 271.25
929 | 271.76
930 | 275.78
931 | 278.96
932 | 286.86
933 | 296.24
934 | 290.35
935 | 297.15
936 | 292.89
937 | 289.21
938 | 291.21
939 | 286.3
940 | 292.18
941 | 291.21
942 | 287.86
943 | 290.21
944 | 289.74
945 | 288.47
946 | 289.01
947 | 274.72
948 | 274.46
949 | 272.04
950 | 280.17
951 | 283.84
952 | 291.21
953 | 292.61
954 | 287.21
955 | 283.37
956 | 285.82
957 | 292.86
958 | 283.22
959 | 278.66
960 | 276.81
961 | 272.33
962 | 276.2
963 | 285.47
964 | 286.12
965 | 284.45
966 | 280.91
967 | 279.82
968 | 272.94
969 | 272.33
970 | 270.88
971 | 275.22
972 | 264.15
973 | 263.77
974 | 262.95
975 | 267.1
976 | 263.26
977 | 268.23
978 | 271.68
979 | 276.99
980 | 270.5
981 | 270.02
982 | 266.63
983 | 260.55
984 | 257.79
985 | 267.53
986 | 266.45
987 | 240.42
988 | 234.17
989 | 238.32
990 | 244.37
991 | 237.57
992 | 245.74
993 | 238.32
994 | 241.31
995 | 241.11
996 | 236.64
997 | 233.7
998 | 231.27
999 | 239.69
1000 | 242.93
1001 | 239.32
1002 | 247.26
1003 | 250.17
1004 | 251.05
1005 | 249.76
1006 | 252.49
1007 | 254.82
1008 | 248.9
1009 | 245
1010 | 242.26
1011 | 243.02
1012 | 245.05
1013 | 241.26
1014 | 236.84
1015 | 234.06
1016 | 236.65
1017 | 231.41
1018 | 232.39
1019 | 231.97
1020 | 224.9
1021 | 221.9
1022 | 209.76
1023 | 209.12
1024 | 206.87
1025 | 216.66
1026 | 218.61
1027 | 216.71
1028 | 221.24
1029 | 207.04
1030 | 219.32
1031 | 224.35
1032 | 214.85
1033 | 214.42
1034 | 217.34
1035 | 219.58
1036 | 215.3
1037 | 190.31
1038 | 200.06
1039 | 205.65
1040 | 195.05
1041 | 193.26
1042 | 185.42
1043 | 172.83
1044 | 168.89
1045 | 164.33
1046 | 165.83
1047 | 190.32
1048 | 181.17
1049 | 169.42
1050 | 176.33
1051 | 186.08
1052 | 189.47
1053 | 181.19
1054 | 177.66
1055 | 175.98
1056 | 169.48
1057 | 164.58
1058 | 184.19
1059 | 178.82
1060 | 179.67
1061 | 179.5
1062 | 173.07
1063 | 183.29
1064 | 170.95
1065 | 165.44
1066 | 165.4
1067 | 159.23
1068 | 155.57
1069 | 145.35
1070 | 155.88
1071 | 154.85
1072 | 149.91
1073 | 148.56
1074 | 139.95
1075 | 129.65
1076 | 131.08
1077 | 128.59
1078 | 140.88
1079 | 145.9
1080 | 146.33
1081 | 132.86
1082 | 137.42
1083 | 139.58
1084 | 137.03
1085 | 141.85
1086 | 150.9
1087 | 152.83
1088 | 154.26
1089 | 149.96
1090 | 157.72
1091 | 155.18
1092 | 162.48
1093 | 157.46
1094 | 154.98
1095 | 154.93
1096 | 148.41
1097 | 148.86
1098 | 151.32
1099 | 150.03
1100 | 148.56
1101 | 151.4
1102 | 153.67
1103 | 160.5
1104 | 163.86
1105 | 166.86
1106 | 160.84
1107 | 162.43
1108 | 157.38
1109 | 156.19
1110 | 157
1111 | 150.33
1112 | 149.35
1113 | 149.69
1114 | 141.23
1115 | 151.39
1116 | 153.1
1117 | 162.19
1118 | 161.77
1119 | 165.57
1120 | 174.16
1121 | 171.49
1122 | 169.1
1123 | 170.11
1124 | 170.05
1125 | 171.33
1126 | 176.68
1127 | 185.45
1128 | 189.2
1129 | 179.08
1130 | 178.84
1131 | 181.34
1132 | 178.66
1133 | 171.16
1134 | 176.38
1135 | 171.15
1136 | 173.05
1137 | 164.86
1138 | 172.55
1139 | 170.65
1140 | 168.42
1141 | 168.83
1142 | 163.42
1143 | 162.58
1144 | 159.3
1145 | 152.67
1146 | 154.13
1147 | 145.3
1148 | 153.93
1149 | 158.8
1150 | 161.6
1151 | 162.05
1152 | 159.69
1153 | 167.5
1154 | 166.38
1155 | 164.81
1156 | 164.91
1157 | 174.13
1158 | 173.41
1159 | 171.86
1160 | 176.47
1161 | 173.68
1162 | 171.17
1163 | 173.86
1164 | 176.87
1165 | 181.07
1166 | 184.71
1167 | 183.94
1168 | 179.15
1169 | 180.82
1170 | 186.06
1171 | 188.87
1172 | 184.27
1173 | 189.56
1174 | 194.18
1175 | 195.92
1176 | 189.46
1177 | 190.54
1178 | 191.74
1179 | 192.15
1180 | 194.55
1181 | 192.78
1182 | 191.66
1183 | 195.54
1184 | 197.79
1185 | 196.65
1186 | 200.79
1187 | 201.29
1188 | 201.53
1189 | 198.11
1190 | 203.46
1191 | 203.79
1192 | 199.31
1193 | 194.58
1194 | 193.56
1195 | 194.8
1196 | 198.22
1197 | 199.24
1198 | 198.39
1199 | 198.05
1200 | 196.55
1201 | 201.98
1202 | 202.58
1203 | 204.99
1204 | 208.41
1205 | 213.07
1206 | 213.99
1207 | 215.61
1208 | 219.92
1209 | 221.94
1210 | 219.17
1211 | 217.59
1212 | 216.08
1213 | 214.29
1214 | 212.21
1215 | 208.18
1216 | 207.79
1217 | 207.37
1218 | 206.82
1219 | 209.83
1220 | 203.47
1221 | 202.64
1222 | 204.44
1223 | 207.68
1224 | 212.45
1225 | 211.86
1226 | 210.58
1227 | 209.29
1228 | 204.04
1229 | 204.6
1230 | 198.12
1231 | 201.04
1232 | 204.99
1233 | 206.99
1234 | 211.94
1235 | 212.13
1236 | 218.87
1237 | 221.08
1238 | 214.91
1239 | 214.87
1240 | 213.74
1241 | 213.63
1242 | 218.45
1243 | 223.14
1244 | 222.18
1245 | 219.71
1246 | 217.9
1247 | 222.6
1248 | 221.3
1249 | 225.88
1250 | 226.64
1251 | 225.34
1252 | 224.95
1253 | 228.32
1254 | 228.08
1255 | 226.74
1256 | 229.06
1257 | 230.91
1258 | 229.77
1259 | 222.22
1260 | 222.42
1261 | 221.76
1262 | 229.97
1263 | 232.39
1264 | 234.13
1265 | 235.45
1266 | 233.77
1267 | 232.8
1268 | 232.14
1269 | 230.6
1270 | 227.65
1271 | 226.28
1272 | 228.53
1273 | 230.42
1274 | 229.08
1275 | 231.75
1276 | 235.23
1277 | 235.83
1278 | 237.32
1279 | 238.53
1280 | 243.9
1281 | 245.61
1282 | 245.48
1283 | 248.25
1284 | 249.28
1285 | 248.98
1286 | 248.14
1287 | 245.99
1288 | 249.02
1289 | 249.02
1290 | 247.68
1291 | 243.36
1292 | 242.05
1293 | 244.02
1294 | 249.12
1295 | 258.51
1296 | 256.83
1297 | 257.87
1298 | 261.76
1299 | 262.79
1300 | 267.39
1301 | 264.69
1302 | 274.65
1303 | 275.77
1304 | 275.58
1305 | 275.27
1306 | 276.77
1307 | 276.57
1308 | 276.83
1309 | 273.87
1310 | 269.88
1311 | 275.25
1312 | 267.79
1313 | 266.73
1314 | 268.38
1315 | 269.89
1316 | 274.05
1317 | 275.27
1318 | 280.97
1319 | 283.1
1320 | 284.99
1321 | 283.64
1322 | 285.74
1323 | 287.85
1324 | 288.46
1325 | 288.04
1326 | 286.21
1327 | 284.7
1328 | 290.88
1329 | 291.25
1330 | 292.58
1331 | 289.59
1332 | 291.21
1333 | 294.64
1334 | 293.46
1335 | 292.58
1336 | 292.21
1337 | 292.83
1338 | 293.23
1339 | 294.22
1340 | 295.45
1341 | 294.96
1342 | 297.57
1343 | 296.27
1344 | 298.58
1345 | 296.67
1346 | 297.91
1347 | 299.04
1348 | 300.26
1349 | 305.53
1350 | 308.93
1351 | 311.12
1352 | 309.39
1353 | 311.05
1354 | 309.68
1355 | 313.06
1356 | 311.68
1357 | 303.83
1358 | 296.75
1359 | 300.71
1360 | 300.25
1361 | 294.94
1362 | 293.25
1363 | 294.63
1364 | 289.71
1365 | 293.52
1366 | 289.91
1367 | 291.2
1368 | 274.73
1369 | 269.73
1370 | 270.94
1371 | 270.78
1372 | 266.88
1373 | 264.71
1374 | 266.24
1375 | 265.29
1376 | 270.14
1377 | 263.13
1378 | 265.38
1379 | 266.47
1380 | 267.95
1381 | 266.96
1382 | 267.93
1383 | 266.29
1384 | 270.38
1385 | 268.83
1386 | 271.34
1387 | 270.11
1388 | 271.13
1389 | 267.27
1390 | 265.47
1391 | 262.95
1392 | 263.14
1393 | 266.08
1394 | 270.26
1395 | 272.39
1396 | 277.02
1397 | 281.82
1398 | 280.96
1399 | 279.81
1400 | 287.94
1401 | 290.28
1402 | 289.48
1403 | 281.31
1404 | 282.32
1405 | 282.5
1406 | 282.92
1407 | 279.72
1408 | 278.47
1409 | 274.23
1410 | 278.39
1411 | 281.16
1412 | 281.06
1413 | 280.94
1414 | 283.07
1415 | 283.28
1416 | 285.22
1417 | 283.83
1418 | 281.49
1419 | 283.46
1420 | 282.83
1421 | 286.08
1422 | 293.09
1423 | 294.21
1424 | 297.35
1425 | 274.8
1426 | 274.77
1427 | 277.24
1428 | 276.87
1429 | 273.26
1430 | 272.22
1431 | 265.55
1432 | 264.26
1433 | 264.33
1434 | 265.73
1435 | 262.58
1436 | 265.03
1437 | 252.93
1438 | 254.63
1439 | 249.09
1440 | 246.32
1441 | 260.56
1442 | 254.27
1443 | 252.44
1444 | 255.18
1445 | 253.51
1446 | 253.73
1447 | 248.94
1448 | 246.97
1449 | 237.27
1450 | 235.79
1451 | 238.34
1452 | 238.3
1453 | 237.5
1454 | 244.98
1455 | 242.57
1456 | 240.94
1457 | 246.44
1458 | 252.55
1459 | 249.11
1460 | 242.52
1461 | 242.15
1462 | 236.77
1463 | 243.26
1464 | 244.01
1465 | 241.35
1466 | 248.75
1467 | 250.38
1468 | 249.79
1469 | 249.76
1470 | 244.04
1471 | 242.88
1472 | 240.78
1473 | 237.31
1474 | 236.1
1475 | 235.8
1476 | 226.9
1477 | 222.25
1478 | 219.53
1479 | 218.06
1480 | 217.82
1481 | 224.87
1482 | 228.05
1483 | 233.51
1484 | 237.68
1485 | 244.36
1486 | 245.42
1487 | 246.76
1488 | 229.57
1489 | 232.86
1490 | 240.55
1491 | 238.51
1492 | 242.16
1493 | 244.78
1494 | 244.24
1495 | 246.07
1496 | 241.93
1497 | 242.25
1498 | 242.18
1499 | 244.96
1500 | 244.67
1501 | 252.91
1502 | 253.8
1503 | 249.86
1504 | 252.42
1505 | 251.6
1506 | 245.62
1507 | 245.76
1508 | 242.93
1509 | 242.55
1510 | 245.01
1511 | 240.83
1512 | 233.75
1513 | 230.78
1514 | 231.8
1515 | 225.47
1516 | 227.08
1517 | 225.26
1518 | 229.19
1519 | 226.12
1520 | 224.78
1521 | 229.94
1522 | 231.36
1523 | 234.91
1524 | 231.97
1525 | 235.05
1526 | 237.85
1527 | 237.83
1528 | 240.89
1529 | 239.97
1530 | 240.08
1531 | 240.29
1532 | 244.83
1533 | 253.89
1534 | 256.47
1535 | 257.74
1536 | 256.48
1537 | 263.38
1538 | 264.94
1539 | 263.32
1540 | 263.58
1541 | 262.63
1542 | 262.55
1543 | 260.91
1544 | 268.85
1545 | 266.91
1546 | 264.74
1547 | 267.91
1548 | 269.15
1549 | 270.42
1550 | 271.38
1551 | 270.19
1552 | 300.42
1553 | 308.55
1554 | 303.61
1555 | 303.69
1556 | 305.69
1557 | 305.96
1558 | 307.94
1559 | 308.99
1560 | 307.93
1561 | 308.98
1562 | 306.54
1563 | 307.19
1564 | 307.49
1565 | 309.78
1566 | 311.82
1567 | 312.23
1568 | 313.07
1569 | 312.1
1570 | 311.13
1571 | 308.29
1572 | 301.34
1573 | 297.44
1574 | 291.57
1575 | 291.48
1576 | 297.98
1577 | 295.12
1578 | 295.31
1579 | 291.21
1580 | 297.19
1581 | 294.7
1582 | 290.76
1583 | 277.58
1584 | 281.89
1585 | 285.62
1586 | 286.21
1587 | 288.89
1588 | 293.28
1589 | 294.97
1590 | 295.45
1591 | 295.81
1592 | 297.01
1593 | 297.16
1594 | 294.85
1595 | 295.56
1596 | 295.1
1597 | 297.23
1598 | 301.23
1599 | 302.44
1600 | 301.81
1601 | 300.89
1602 | 299.16
1603 | 300.2
1604 | 299.13
1605 | 296.69
1606 | 301.87
1607 | 300.76
1608 | 304.23
1609 | 306.44
1610 | 307.91
1611 | 306.8
1612 | 307.7
1613 | 308.13
1614 | 308.04
1615 | 311.78
1616 | 319.5
1617 | 315.56
1618 | 313.07
1619 | 305.61
1620 | 305.23
1621 | 309.65
1622 | 307.94
1623 | 308.09
1624 | 300.19
1625 | 299.88
1626 | 305.21
1627 | 305.69
1628 | 304.77
1629 | 305.18
1630 | 306.84
1631 | 308.88
1632 | 307.94
1633 | 307.91
1634 | 311.94
1635 | 313.76
1636 | 311.76
1637 | 311.8
1638 | 312.32
1639 | 314.72
1640 | 304.8
1641 | 305.35
1642 | 304.11
1643 | 304.71
1644 | 306.39
1645 | 300.08
1646 | 300.09
1647 | 304.48
1648 | 300.01
1649 | 295.53
1650 | 295.86
1651 | 295.59
1652 | 289.86
1653 | 288.07
1654 | 284.71
1655 | 284.5
1656 | 278.27
1657 | 280.4
1658 | 280.25
1659 | 287.96
1660 | 288.37
1661 | 290.79
1662 | 293.15
1663 | 289.58
1664 | 287.39
1665 | 290.57
1666 | 290.63
1667 | 293.09
1668 | 295.6
1669 | 293.55
1670 | 284.26
1671 | 286.8
1672 | 289.71
1673 | 288.79
1674 | 288.4
1675 | 285.02
1676 | 287.85
1677 | 288.97
1678 | 265.08
1679 | 263.16
1680 | 260.5
1681 | 262.6
1682 | 262.29
1683 | 262.26
1684 | 266.14
1685 | 268.61
1686 | 268.72
1687 | 271.78
1688 | 269.01
1689 | 266.68
1690 | 267.63
1691 | 266.87
1692 | 267.38
1693 | 268.57
1694 | 271.06
1695 | 267.46
1696 | 267.26
1697 | 264.51
1698 | 258.95
1699 | 264.96
1700 | 264.64
1701 | 265.36
1702 | 261.75
1703 | 258.94
1704 | 258.87
1705 | 259.58
1706 | 258.81
1707 | 260.19
1708 | 264.25
1709 | 262.54
1710 | 263.77
1711 | 261.28
1712 | 260.27
1713 | 259.26
1714 | 259.33
1715 | 258.11
1716 | 254.5
1717 | 252.11
1718 | 253.93
1719 | 251.22
1720 | 249.93
1721 | 242.27
1722 | 242.05
1723 | 246.25
1724 | 243.26
1725 | 239.87
1726 | 237.2
1727 | 241.2
1728 | 246.58
1729 | 248.54
1730 | 252.94
1731 | 260.25
1732 | 265.95
1733 | 267.41
1734 | 273.03
1735 | 265.73
1736 | 263.38
1737 | 266.74
1738 | 268.86
1739 | 264.21
1740 | 298.51
1741 | 297.17
1742 | 300.97
1743 | 297.38
1744 | 303.19
1745 | 308.81
1746 | 309.18
1747 | 310.95
1748 | 303.31
1749 | 305.16
1750 | 301.54
1751 | 303.08
1752 | 296.77
1753 | 300.28
1754 | 288.47
1755 | 289.23
1756 | 272.74
1757 | 286.42
1758 | 274.23
1759 | 280.78
1760 | 281.6
1761 | 278.34
1762 | 269.23
1763 | 266.31
1764 | 252.19
1765 | 245.21
1766 | 248.84
1767 | 259.15
1768 | 261.38
1769 | 259.76
1770 | 263.17
1771 | 269.27
1772 | 270.08
1773 | 270.21
1774 | 265.98
1775 | 262.16
1776 | 260.83
1777 | 266.75
1778 | 267.21
1779 | 262.16
1780 | 264.79
1781 | 264.5
1782 | 265.77
1783 | 271.01
1784 | 273.07
1785 | 273.06
1786 | 273.04
1787 | 269.33
1788 | 260.07
1789 | 262.49
1790 | 265.68
1791 | 269.4
1792 | 264.16
1793 | 263.49
1794 | 257.26
1795 | 247.51
1796 | 250.7
1797 | 252.1
1798 | 257.1
1799 | 257.3
1800 | 268.32
1801 | 271.32
1802 | 273.98
1803 | 279.22
1804 | 295.54
1805 | 290.91
1806 | 294.96
1807 | 290.06
1808 | 291.54
1809 | 294.95
1810 | 297.91
1811 | 291.29
1812 | 292.86
1813 | 299.04
1814 | 299.77
1815 | 296.02
1816 | 289.04
1817 | 292.12
1818 | 298.45
1819 | 297.77
1820 | 303.86
1821 | 305.86
1822 | 300.17
1823 | 297.24
1824 | 303.87
1825 | 306.19
1826 | 307.97
1827 | 305.43
1828 | 300.13
1829 | 297.14
1830 | 290.18
1831 | 289.71
1832 | 284.77
1833 | 281.22
1834 | 293.8
1835 | 291.17
1836 | 299.4
1837 | 306.58
1838 | 309.87
1839 | 312.51
1840 | 311.57
1841 | 311.38
1842 | 307.72
1843 | 313.4
1844 | 312.38
1845 | 312.5
1846 | 308.73
1847 | 309.46
1848 | 312.67
1849 | 310.6
1850 | 314.87
1851 | 312.6
1852 | 314.54
1853 | 316.25
1854 | 319.8
1855 | 319.53
1856 | 320.88
1857 | 322.63
1858 | 332.37
1859 | 333.81
1860 | 329.18
1861 | 324.68
1862 | 310.92
1863 | 311.26
1864 | 312.67
1865 | 314.51
1866 | 312.18
1867 | 313.98
1868 | 316.14
1869 | 319.47
1870 | 292.7
1871 | 292.47
1872 | 290.17
1873 | 284.46
1874 | 283.77
1875 | 289.7
1876 | 288.56
1877 | 289.76
1878 | 290.12
1879 | 292.26
1880 | 297.87
1881 | 304.24
1882 | 303.08
1883 | 304.62
1884 | 305.42
1885 | 302.65
1886 | 305.79
1887 | 304.58
1888 | 302.48
1889 | 302.96
1890 | 302.02
1891 | 306.69
1892 | 303.67
1893 | 302.75
1894 | 304.65
1895 | 304.35
1896 | 308.89
1897 | 308.82
1898 | 310.89
1899 | 310.31
1900 | 306.82
1901 | 302.18
1902 | 303.1
1903 | 303.27
1904 | 299.82
1905 | 302.27
1906 | 308.58
1907 | 307.69
1908 | 310.25
1909 | 312.21
1910 | 316.67
1911 | 316.43
1912 | 319.67
1913 | 322.7
1914 | 320.97
1915 | 324.34
1916 | 323.19
1917 | 327.55
1918 | 323.88
1919 | 320.3
1920 | 323.14
1921 | 320.99
1922 | 317.26
1923 | 315.84
1924 | 315.1
1925 | 313.12
1926 | 317.66
1927 | 325.18
1928 | 311.99
1929 | 302.73
1930 | 304.48
1931 | 303.42
1932 | 299.35
1933 | 297.73
1934 | 298.5
1935 | 300.33
1936 | 304.56
1937 | 307.43
1938 | 307.18
1939 | 302.12
1940 | 301.91
1941 | 303.33
1942 | 305.2
1943 | 298.19
1944 | 303.47
1945 | 306.09
1946 | 304.27
1947 | 306.52
1948 | 302.31
1949 | 301.7
1950 | 305.25
1951 | 314.15
1952 | 311.21
1953 | 299.9
1954 | 306.75
1955 | 300.1
1956 | 304.43
1957 | 301.53
1958 | 295.47
1959 | 296.87
1960 | 293.82
1961 | 290.14
1962 | 285.2
1963 | 289.01
1964 | 284.92
1965 | 289.99
1966 | 288.83
1967 | 289.93
1968 | 283.97
1969 | 282.27
1970 | 280.26
1971 | 279.25
1972 | 281.97
1973 | 285.14
1974 | 290.47
1975 | 288.47
1976 | 282.32
1977 | 285.45
1978 | 280.07
1979 | 282.06
1980 | 284.36
1981 | 281.87
1982 | 289.74
1983 | 289.94
1984 | 293.62
1985 | 297.66
1986 | 292.7
1987 | 292.71
1988 | 290.56
1989 | 285.31
1990 | 284.95
1991 | 287.97
1992 | 287.17
1993 | 288.08
1994 | 290.09
1995 | 296.23
1996 | 305.1
1997 | 307.45
1998 | 303.48
1999 | 303.69
2000 | 306.37
2001 | 317.16
2002 | 315.83
2003 | 316.17
2004 | 316.02
2005 | 314.06
2006 | 320.34
2007 | 321.09
2008 | 319.95
2009 | 320.79
2010 | 320.85
2011 | 320.68
2012 | 329.67
2013 | 334
2014 | 333.44
2015 | 336.1
2016 | 338.23
2017 | 337.43
2018 | 334.42
2019 | 338.25
2020 | 338.06
2021 | 338.98
2022 | 334.28
2023 | 338.29
2024 | 343.66
2025 | 340.5
2026 | 342.2
2027 | 340.18
2028 | 340.02
2029 | 349.35
2030 | 352.72
2031 | 350.03
2032 | 345.75
2033 | 345.1
2034 | 352.67
2035 | 354.49
2036 | 354.64
2037 | 358.78
2038 | 363.39
2039 | 363.69
2040 | 366.63
2041 | 374.32
2042 | 374.21
2043 | 376.35
2044 | 377.87
2045 | 376.87
2046 | 380.51
2047 | 378.12
2048 | 380.87
2049 | 383.64
2050 | 383.44
2051 | 378.54
2052 | 371.67
2053 | 371.91
2054 | 375.36
2055 | 372
2056 | 370.12
2057 | 371.98
2058 | 377.37
2059 | 347.15
2060 | 340.55
2061 | 339
2062 | 339.83
2063 | 338.31
2064 | 338.54
2065 | 337.24
2066 | 339.81
2067 | 343.45
2068 | 343.62
2069 | 341.14
2070 | 340.52
2071 | 333.23
2072 | 325.82
2073 | 331.18
2074 | 332.62
2075 | 329.2
2076 | 325.95
2077 | 323.31
2078 | 323.27
2079 | 333.77
2080 | 334.65
2081 | 332.6
2082 | 333.65
2083 | 330.24
2084 | 335.02
2085 | 341.49
2086 | 345.6
2087 | 348.84
2088 | 347.28
2089 | 345.17
2090 | 343.57
2091 | 345.22
2092 | 341.76
2093 | 342.37
2094 | 348.09
2095 | 348.43
2096 | 351
2097 | 350.63
2098 | 360.03
2099 | 360.17
2100 | 359.69
2101 | 360.82
2102 | 357.46
2103 | 354.4
2104 | 354.08
2105 | 352.79
2106 | 349.65
2107 | 353.34
2108 | 361.26
2109 | 361.47
2110 | 368.62
2111 | 367.01
2112 | 366.28
2113 | 368.69
2114 | 370.37
2115 | 369.62
2116 | 361.26
2117 | 362.1
2118 | 357.24
2119 | 355.3
2120 | 351.9
2121 | 351.08
2122 | 370.38
2123 | 376.54
2124 | 376.46
2125 | 374.99
2126 | 376.46
2127 | 376.54
2128 | 377.47
2129 | 387.4
2130 | 379.13
2131 | 382.49
2132 | 384.7
2133 | 386.59
2134 | 392.29
2135 | 390.82
2136 | 389.96
2137 | 391.04
2138 | 393.52
2139 | 396.05
2140 | 403.02
2141 | 395.83
2142 | 397.37
2143 | 399.46
2144 | 394.99
2145 | 394.67
2146 | 399.49
2147 | 400.2
2148 | 402.69
2149 | 410.34
2150 | 418.88
2151 | 415.27
2152 | 415.88
2153 | 415.34
2154 | 416.99
2155 | 413.39
2156 | 412.24
2157 | 410.36
2158 | 406.74
2159 | 403.49
2160 | 405.25
2161 | 406.95
2162 | 405.22
2163 | 404.75
2164 | 404.42
2165 | 405.8
2166 | 400.93
2167 | 396.7
2168 | 400.19
2169 | 406.11
2170 | 402.7
2171 | 397.14
2172 | 391.13
2173 | 387.04
2174 | 388.44
2175 | 394.69
2176 | 394.8
2177 | 394.63
2178 | 390.57
2179 | 396.29
2180 | 390.89
2181 | 382.57
2182 | 399.54
2183 | 399.66
2184 | 403.55
2185 | 406.32
2186 | 404.15
2187 | 400.31
2188 | 409.12
2189 | 411.87
2190 | 409.8
2191 | 414.39
2192 | 422.44
2193 | 430.34
2194 | 428.19
2195 | 436.38
2196 | 435.3
2197 | 439.67
2198 | 438.33
2199 | 443.11
2200 | 457.49
2201 | 451.48
2202 | 454.14
2203 | 453.81
2204 | 453.03
2205 | 444.27
2206 | 440.95
2207 | 436.22
2208 | 440.19
2209 | 433.72
2210 | 434.94
2211 | 435.17
2212 | 433.38
2213 | 429.12
2214 | 429.42
2215 | 431.89
2216 | 439.43
2217 | 444.66
2218 | 439.47
2219 | 435.55
2220 | 438.06
2221 | 437.08
2222 | 442.68
2223 | 449.86
2224 | 449.89
2225 | 441.93
2226 | 440.02
2227 | 434.46
2228 | 432.67
2229 | 436.39
2230 | 438.1
2231 | 439.74
2232 | 443.5
2233 | 440.71
2234 | 442.77
2235 | 446.3
2236 | 452.09
2237 | 452.17
2238 | 452.54
2239 | 459.66
2240 | 461.04
2241 | 461.88
2242 | 459.34
2243 | 458.82
2244 | 454.88
2245 | 447.85
2246 | 454.89
2247 | 451.45
2248 | 451
2249 | 443.41
2250 | 442.23
2251 | 440.69
2252 | 445.01
2253 | 443.43
2254 | 451.66
2255 | 452.83
2256 | 452.05
2257 | 447.84
2258 | 444.88
2259 | 445.88
2260 | 444.76
2261 | 442.31
2262 | 440.18
2263 | 434.47
2264 | 429.4
2265 | 428.03
2266 | 432.39
2267 | 432.28
2268 | 434.23
2269 | 436.42
2270 | 434.67
2271 | 432.76
2272 | 424.65
2273 | 423.85
2274 | 427.29
2275 | 423.03
2276 | 429.76
2277 | 435.38
2278 | 439.34
2279 | 439.35
2280 | 443.58
2281 | 443.89
2282 | 447.65
2283 | 446.08
2284 | 444.09
2285 | 443.44
2286 | 442.61
2287 | 451.21
2288 | 448.75
2289 | 451.1
2290 | 442.81
2291 | 442.98
2292 | 438.18
2293 | 438.65
2294 | 437.76
2295 | 437.52
2296 | 443.06
2297 | 443.55
2298 | 437.61
2299 | 435.74
2300 | 432.44
2301 | 426.41
2302 | 427.5
2303 | 433.69
2304 | 435.56
2305 | 437.62
2306 | 440.56
2307 | 448.56
2308 | 443.95
2309 | 505.2
2310 | 501.15
2311 | 503
2312 | 515.19
2313 | 512.26
2314 | 507.09
2315 | 506.99
2316 | 517.6
2317 | 514.69
2318 | 514.77
2319 | 513.01
2320 | 512.54
2321 | 510.25
2322 | 510.86
2323 | 503.47
2324 | 507.51
2325 | 504.79
2326 | 505.38
2327 | 515.72
2328 | 517.1
2329 | 516.26
2330 | 515.26
2331 | 512.09
2332 | 510.64
2333 | 516.52
2334 | 515.43
2335 | 522.44
2336 | 528.68
2337 | 531.02
2338 | 529.27
2339 | 526.71
2340 | 526.1
2341 | 528.56
2342 | 528.14
2343 | 534.4
2344 | 538.53
2345 | 541.79
2346 | 538.11
2347 | 534.45
2348 | 529.86
2349 | 535.95
2350 | 534.4
2351 | 541.83
2352 | 542.57
2353 | 549.76
2354 | 556.99
2355 | 555.36
2356 | 558.17
2357 | 558.64
2358 | 554.18
2359 | 559.79
2360 | 556
2361 | 551.95
2362 | 558.1
2363 | 568.86
2364 | 570.04
2365 | 564.55
2366 | 564.52
2367 | 560.93
2368 | 574.13
2369 | 573.74
2370 | 577.53
2371 | 574.69
2372 | 581.27
2373 | 581.93
2374 | 579.47
2375 | 561.35
2376 | 550.06
2377 | 560.94
2378 | 552.91
2379 | 567.13
2380 | 589.89
2381 | 566.15
2382 | 568.51
2383 | 571.03
2384 | 579.4
2385 | 588.13
2386 | 585.88
2387 | 594.49
2388 | 592.75
2389 | 599.35
2390 | 600.8
2391 | 604.83
2392 | 600.57
2393 | 601.45
2394 | 601.29
2395 | 605.65
2396 | 609.39
2397 | 609.47
2398 | 609
2399 | 607.22
2400 | 600.74
2401 | 606.85
2402 | 608.52
2403 | 609.2
2404 | 606.79
2405 | 605.18
2406 | 599.4
2407 | 603.05
2408 | 593.94
2409 | 585.81
2410 | 595.45
2411 | 605.02
2412 | 599.03
2413 | 597.98
2414 | 590.93
2415 | 578.39
2416 | 578.78
2417 | 565.42
2418 | 556.58
2419 | 559.51
2420 | 556.7
2421 | 566.88
2422 | 566.98
2423 | 569.74
2424 | 543.14
2425 | 538.15
2426 | 554.9
2427 | 564.14
2428 | 540.95
2429 | 530.6
2430 | 532.52
2431 | 536.44
2432 | 556.54
2433 | 536.1
2434 | 528.62
2435 | 534.81
2436 | 526.94
2437 | 525.16
2438 | 516.18
2439 | 517.15
2440 | 527.7
2441 | 526.66
2442 | 531.35
2443 | 527.93
2444 | 527.81
2445 | 515.14
2446 | 509.96
2447 | 511
2448 | 518.73
2449 | 529.92
2450 | 533.09
2451 | 526.65
2452 | 519.98
2453 | 520.63
2454 | 528.86
2455 | 529.77
2456 | 538.94
2457 | 545.06
2458 | 552.7
2459 | 565.95
2460 | 561.68
2461 | 560.08
2462 | 559.89
2463 | 553.93
2464 | 544.94
2465 | 544.66
2466 | 553.9
2467 | 556.33
2468 | 562.12
2469 | 560.55
2470 | 558.84
2471 | 551.35
2472 | 551.76
2473 | 544.28
2474 | 543.01
2475 | 553.37
2476 | 554.9
2477 | 556.36
2478 | 564.95
2479 | 564.62
2480 | 578.65
2481 | 576
2482 | 577.24
2483 | 575.28
2484 | 582.67
2485 | 582.34
2486 | 584.73
2487 | 582.25
2488 | 571.09
2489 | 576.08
2490 | 571.1
2491 | 579.18
2492 | 584.87
2493 | 584.78
2494 | 582.66
2495 | 573.73
2496 | 595.08
2497 | 589.47
2498 | 594.74
2499 | 595.98
2500 | 593.35
2501 | 589.02
2502 | 590.6
2503 | 585.61
2504 | 587.42
2505 | 571.6
2506 | 566.07
2507 | 573.15
2508 | 565.07
2509 | 566.37
2510 | 563.36
2511 | 568.77
2512 | 567.88
2513 | 562.73
2514 | 574.78
2515 | 574.65
2516 | 573.48
2517 | 582.16
2518 | 586.86
2519 | 584.49
2520 | 583.37
2521 | 582.56
2522 | 580.2
2523 | 577.86
2524 | 571
2525 | 569.2
2526 | 571.6
2527 | 577.33
2528 | 577.94
2529 | 581.98
2530 | 586.08
2531 | 589.72
2532 | 581.01
2533 | 583.1
2534 | 581.35
2535 | 575.62
2536 | 573.1
2537 | 579.95
2538 | 584.77
2539 | 589.27
2540 | 596.08
2541 | 587.37
2542 | 581.13
2543 | 587.99
2544 | 575.06
2545 | 577.1
2546 | 576.36
2547 | 577.36
2548 | 568.27
2549 | 570.08
2550 | 575.28
2551 | 577.35
2552 | 563.74
2553 | 572.5
2554 | 560.88
2555 | 544.49
2556 | 533.21
2557 | 537.94
2558 | 530.03
2559 | 524.51
2560 | 511.17
2561 | 520.84
2562 | 526.54
2563 | 532.71
2564 | 543.98
2565 | 539.78
2566 | 540.77
2567 | 548.9
2568 | 549.33
2569 | 550.31
2570 | 559.08
2571 | 555.22
2572 | 554.11
2573 | 545.92
2574 | 542.04
2575 | 541.01
2576 | 547.49
2577 | 550.29
2578 | 547.31
2579 | 545.38
2580 | 544.4
2581 | 536.51
2582 | 535.03
2583 | 536.99
2584 | 534.83
2585 | 537.5
2586 | 539.27
2587 | 541.08
2588 | 540.37
2589 | 541.83
2590 | 533.8
2591 | 533.75
2592 | 531.32
2593 | 537.31
2594 | 525.26
2595 | 526.98
2596 | 533.37
2597 | 526.06
2598 | 528.34
2599 | 518.66
2600 | 513.8
2601 | 495.39
2602 | 504.89
2603 | 511.1
2604 | 516.35
2605 | 524.87
2606 | 530.59
2607 | 528.77
2608 | 534.03
2609 | 530.33
2610 | 530.42
2611 | 526.4
2612 | 524.81
2613 | 513.87
2614 | 501.96
2615 | 501.1
2616 | 502.68
2617 | 496.17
2618 | 492.55
2619 | 496.18
2620 | 500.87
2621 | 501.79
2622 | 508.08
2623 | 506.9
2624 | 518.04
2625 | 534.39
2626 | 539.95
2627 | 535.21
2628 | 518.63
2629 | 510
2630 | 510.66
2631 | 534.52
2632 | 528.48
2633 | 529.24
2634 | 522.76
2635 | 527.58
2636 | 531
2637 | 527.83
2638 | 536.94
2639 | 535.97
2640 | 542.93
2641 | 549.01
2642 | 542.84
2643 | 539.7
2644 | 542.87
2645 | 538.95
2646 | 531.91
2647 | 536.09
2648 | 543.87
2649 | 555.48
2650 | 558.4
2651 | 571.34
2652 | 573.64
2653 | 573.37
2654 | 575.33
2655 | 567.68
2656 | 568.85
2657 | 555.01
2658 | 551.18
2659 | 555.51
2660 | 547.32
2661 | 554.51
2662 | 550.84
2663 | 559.5
2664 | 557.99
2665 | 560.36
2666 | 558.81
2667 | 570.19
2668 | 558.78
2669 | 555.17
2670 | 548.34
2671 | 552.03
2672 | 548
2673 | 542.56
2674 | 535.53
2675 | 536.76
2676 | 537.02
2677 | 541.61
2678 | 540.78
2679 | 540.01
2680 | 539.17
2681 | 530.39
2682 | 532.53
2683 | 533.8
2684 | 524.05
2685 | 535.38
2686 | 533.97
2687 | 539.36
2688 | 547
2689 | 565.06
2690 | 555.37
2691 | 553.68
2692 | 549.08
2693 | 537.34
2694 | 537.9
2695 | 540.78
2696 | 530.8
2697 | 524.22
2698 | 530.7
2699 | 538.22
2700 | 535.7
2701 | 529.04
2702 | 529.62
2703 | 538.4
2704 | 533.85
2705 | 532.3
2706 | 537.36
2707 | 539.27
2708 | 542.51
2709 | 540.11
2710 | 532.32
2711 | 539.79
2712 | 539.78
2713 | 532.11
2714 | 533.99
2715 | 539.18
2716 | 540.31
2717 | 536.7
2718 | 533.33
2719 | 526.83
2720 | 526.69
2721 | 536.69
2722 | 534.61
2723 | 532.33
2724 | 527.2
2725 | 528.15
2726 | 529.26
2727 | 536.73
2728 | 536.69
2729 | 538.19
2730 | 540.48
2731 | 537.84
2732 | 535.23
2733 | 531.69
2734 | 521.52
2735 | 520.51
2736 | 521.84
2737 | 523.4
2738 | 522.86
2739 | 525.02
2740 | 516.83
2741 | 520.68
2742 | 530.13
2743 | 546.55
2744 | 561.1
2745 | 560.22
2746 | 579.85
2747 | 672.93
2748 | 663.02
2749 | 662.3
2750 | 662.1
2751 | 644.28
2752 | 623.56
2753 | 627.26
2754 | 628
2755 | 631.93
2756 | 632.59
2757 | 625.61
2758 | 631.21
2759 | 629.25
2760 | 643.78
2761 | 642.68
2762 | 635.3
2763 | 633.73
2764 | 660.78
2765 | 659.56
2766 | 656.45
2767 | 657.12
2768 | 660.87
2769 | 656.13
2770 | 660.9
2771 | 646.83
2772 | 612.48
2773 | 589.61
2774 | 582.06
2775 | 628.62
2776 | 637.61
2777 | 630.38
2778 | 618.25
2779 | 597.79
2780 | 614.34
2781 | 606.25
2782 | 600.7
2783 | 614.66
2784 | 612.72
2785 | 621.35
2786 | 625.77
2787 | 623.24
2788 | 635.14
2789 | 635.98
2790 | 642.9
2791 | 629.25
2792 | 635.44
2793 | 622.69
2794 | 622.36
2795 | 625.8
2796 | 611.97
2797 | 594.89
2798 | 594.97
2799 | 608.42
2800 | 611.29
2801 | 626.91
2802 | 641.47
2803 | 645.44
2804 | 642.36
2805 | 639.16
2806 | 643.61
2807 | 646.67
2808 | 652.3
2809 | 651.16
2810 | 661.74
2811 | 662.2
2812 | 666.1
2813 | 650.28
2814 | 642.61
2815 | 651.79
2816 | 702
2817 | 712.78
2818 | 708.49
2819 | 712.95
2820 | 716.92
2821 | 710.81
2822 | 721.11
2823 | 722.16
2824 | 728.11
2825 | 731.25
2826 | 733.76
2827 | 724.89
2828 | 728.32
2829 | 735.4
2830 | 731.23
2831 | 717
2832 | 728.96
2833 | 725.3
2834 | 740
2835 | 738.41
2836 | 756.6
2837 | 755.98
2838 | 748.28
2839 | 748.15
2840 | 750.26
2841 | 742.6
2842 | 767.04
2843 | 762.38
2844 | 752.54
2845 | 766.81
2846 | 763.25
2847 | 762.37
2848 | 751.61
2849 | 749.46
2850 | 738.87
2851 | 747.77
2852 | 743.4
2853 | 758.09
2854 | 749.43
2855 | 739.31
2856 | 747.77
2857 | 750
2858 | 750.31
2859 | 748.4
2860 | 762.51
2861 | 776.6
2862 | 771
2863 | 758.88
2864 | 741.84
2865 | 742.58
2866 | 743.62
2867 | 726.39
2868 | 714.47
2869 | 716.03
2870 | 726.07
2871 | 700.56
2872 | 714.72
2873 | 694.45
2874 | 701.79
2875 | 698.45
2876 | 706.59
2877 | 725.25
2878 | 711.67
2879 | 713.04
2880 | 699.99
2881 | 730.96
2882 | 742.95
2883 | 752
2884 | 764.65
2885 | 726.95
2886 | 708.01
2887 | 683.57
2888 | 682.74
2889 | 678.11
2890 | 684.12
2891 | 683.11
2892 | 682.4
2893 | 691
2894 | 708.4
2895 | 697.35
2896 | 700.91
2897 | 706.46
2898 | 695.85
2899 | 699.56
2900 | 705.75
2901 | 705.07
2902 | 697.77
2903 | 718.81
2904 | 718.85
2905 | 712.42
2906 | 710.89
2907 | 695.16
2908 | 693.97
2909 | 705.24
2910 | 712.82
2911 | 726.82
2912 | 730.49
2913 | 728.33
2914 | 736.09
2915 | 737.78
2916 | 737.6
2917 | 742.09
2918 | 740.75
2919 | 738.06
2920 | 735.3
2921 | 733.53
2922 | 744.77
2923 | 750.53
2924 | 744.95
2925 | 749.91
2926 | 745.29
2927 | 737.8
2928 | 745.69
2929 | 740.28
2930 | 739.15
2931 | 736.1
2932 | 743.09
2933 | 751.72
2934 | 753.2
2935 | 759
2936 | 766.61
2937 | 753.93
2938 | 752.67
2939 | 759.14
2940 | 718.77
2941 | 723.15
2942 | 708.14
2943 | 705.84
2944 | 691.02
2945 | 693.01
2946 | 698.21
2947 | 692.36
2948 | 695.7
2949 | 701.43
2950 | 711.12
2951 | 712.9
2952 | 723.18
2953 | 715.29
2954 | 713.31
2955 | 710.83
2956 | 716.49
2957 | 706.23
2958 | 706.63
2959 | 700.32
2960 | 709.74
2961 | 704.24
2962 | 720.09
2963 | 725.27
2964 | 724.12
2965 | 732.66
2966 | 735.72
2967 | 734.15
2968 | 730.4
2969 | 722.34
2970 | 716.55
2971 | 716.65
2972 | 728.28
2973 | 728.58
2974 | 719.41
2975 | 718.36
2976 | 718.27
2977 | 718.92
2978 | 710.36
2979 | 691.72
2980 | 693.71
2981 | 695.94
2982 | 697.46
2983 | 701.87
2984 | 675.22
2985 | 668.26
2986 | 680.04
2987 | 684.11
2988 | 692.1
2989 | 699.21
2990 | 694.49
2991 | 697.77
2992 | 695.36
2993 | 705.63
2994 | 715.09
2995 | 720.64
2996 | 716.98
2997 | 720.95
2998 | 719.85
2999 | 733.78
3000 | 736.96
3001 | 741.19
3002 | 738.63
3003 | 742.74
3004 | 739.77
3005 | 738.42
3006 | 741.77
3007 | 745.91
3008 | 768.79
3009 | 772.88
3010 | 771.07
3011 | 773.18
3012 | 771.61
3013 | 782.22
--------------------------------------------------------------------------------