{ "cells": [ { "cell_type": "markdown", "id": "4bf05298-718f-5dfe-a938-0ee07c63b4dd", "metadata": { "id": "4bf05298-718f-5dfe-a938-0ee07c63b4dd" }, "source": [ "# Generating SQL for SQLite using OpenAI, ChromaDB\n", "\n", "This notebook runs through the process of using the `vanna` Python package to generate SQL using AI (RAG + LLMs) including connecting to a database and training. If you're not ready to train on your own database, you can still try it using a sample [SQLite database](app.md).\n" ] }, { "cell_type": "markdown", "id": "453b54b4-c4b0-53f1-9f69-7e0199beb21b", "metadata": { "id": "453b54b4-c4b0-53f1-9f69-7e0199beb21b" }, "source": [ "

Which LLM do you want to use?

\n", "\n" ] }, { "cell_type": "markdown", "id": "b6fc62df-5f87-57cf-99e2-4695a7bc1674", "metadata": { "id": "b6fc62df-5f87-57cf-99e2-4695a7bc1674" }, "source": [ "

Where do you want to store the 'training' data?

\n", "\n" ] }, { "cell_type": "markdown", "id": "ee059407-58ac-50fa-843a-7b876328df13", "metadata": { "id": "ee059407-58ac-50fa-843a-7b876328df13" }, "source": [ "## Setup\n" ] }, { "cell_type": "code", "execution_count": null, "id": "d6e3ecc5-3c05-518b-8285-cf9dbf06ec58", "metadata": { "id": "d6e3ecc5-3c05-518b-8285-cf9dbf06ec58" }, "outputs": [], "source": [ "%pip install 'vanna[chromadb,openai]'" ] }, { "cell_type": "code", "execution_count": 1, "id": "52b8efb0-35ca-56e8-a286-bc08ed219bf0", "metadata": { "id": "52b8efb0-35ca-56e8-a286-bc08ed219bf0" }, "outputs": [], "source": [ "from vanna.openai import OpenAI_Chat\n", "from vanna.chromadb import ChromaDB_VectorStore" ] }, { "cell_type": "code", "execution_count": 3, "id": "28a8d8a1-669f-5f8b-82c4-73a0eb221d64", "metadata": { "id": "28a8d8a1-669f-5f8b-82c4-73a0eb221d64" }, "outputs": [], "source": [ "from dotenv import load_dotenv\n", "import os\n", "\n", "load_dotenv()\n", "\n", "\n", "class MyVanna(ChromaDB_VectorStore, OpenAI_Chat):\n", " def __init__(self, config=None):\n", " ChromaDB_VectorStore.__init__(self, config=config)\n", " OpenAI_Chat.__init__(self, config=config)\n", "\n", "\n", "vn = MyVanna(config={'api_key': os.getenv(\n", " 'OPENAI_API_KEY'), 'model': 'gpt-4o'})" ] }, { "cell_type": "markdown", "id": "42caabc1-e4e7-5e84-81c9-cc33071cd0f5", "metadata": { "id": "42caabc1-e4e7-5e84-81c9-cc33071cd0f5" }, "source": [ "

Which database do you want to query?

\n", "\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1", "metadata": { "id": "4bb60e4c-1036-5c5d-84c6-11c9f2e9c8d1" }, "outputs": [], "source": [ "vn.connect_to_sqlite('./Bahrain_2023_Q.db')" ] }, { "cell_type": "markdown", "id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60", "metadata": { "id": "f06c0e89-83f7-5ad1-8f6e-a64cf5bd8e60" }, "source": [ "## Training\n", "\n", "You only need to train once. Do not train again unless you want to add more training data.\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "068a891d-bbab-5462-9767-ebf7211fe423", "metadata": { "id": "068a891d-bbab-5462-9767-ebf7211fe423" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " type sql\n", "0 table CREATE TABLE Drivers (\\n driver...\n", "1 table CREATE TABLE Tracks (\\n track_i...\n", "2 table CREATE TABLE Event (\\n event_id...\n", "3 table CREATE TABLE Sessions (\\n sessi...\n", "4 table CREATE TABLE Weather (\\n weathe...\n", "5 table CREATE TABLE Laps (\\n lap_id IN...\n", "6 table CREATE TABLE Telemetry (\\n tele...\n", "7 index CREATE INDEX idx_laps_driver_name ON Laps(driv...\n", "8 index CREATE INDEX idx_laps_session_id ON Laps(sessi...\n", "9 index CREATE INDEX idx_telemetry_lap_id ON Telemetry...\n", "10 index CREATE INDEX idx_telemetry_datetime ON Telemet...\n", "11 index CREATE INDEX idx_weather_session_id ON Weather...\n", "12 index CREATE INDEX idx_weather_datetime ON Weather(d...\n", "13 index CREATE INDEX idx_event_date ON Event(event_date)\n", "14 view CREATE VIEW DriverPerformanceSummaryWithWeathe...\n", "15 view CREATE VIEW TyrePerformanceAnalysisWithWeather...\n", "16 view CREATE VIEW WeatherImpactAnalysis AS\\n ...\n", "17 view CREATE VIEW EventPerformanceOverview AS\\n ...\n", "18 view CREATE VIEW TelemetryAnalysisWithWeather AS\\n ...\n", "----------------------------------------------------------------------------------------------------\n", "CREATE TABLE Drivers (\n", " driver_id INTEGER PRIMARY KEY,\n", " driver_name TEXT NOT NULL,\n", " team TEXT NOT NULL\n", " )\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE TABLE Drivers (\n", " driver_id INTEGER PRIMARY KEY,\n", " driver_name TEXT NOT NULL,\n", " team TEXT NOT NULL\n", " )\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/diegomaradona/.cache/chroma/onnx_models/all-MiniLM-L6-v2/onnx.tar.gz: 100%|██████████| 79.3M/79.3M [00:05<00:00, 15.4MiB/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE Tracks (\n", " track_id INTEGER PRIMARY KEY,\n", " track_name TEXT NOT NULL,\n", " country TEXT NOT NULL\n", " )\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE TABLE Tracks (\n", " track_id INTEGER PRIMARY KEY,\n", " track_name TEXT NOT NULL,\n", " country TEXT NOT NULL\n", " )\n", "CREATE TABLE Event (\n", " event_id INTEGER PRIMARY KEY,\n", " round_number INTEGER,\n", " country TEXT,\n", " location TEXT,\n", " event_date DATE,\n", " event_name TEXT,\n", " session_1_date_utc DATETIME,\n", " session_1_name TEXT,\n", " session_2_date_utc DATETIME,\n", " session_2_name TEXT,\n", " session_3_date_utc DATETIME,\n", " session_3_name TEXT,\n", " session_4_date_utc DATETIME,\n", " session_4_name TEXT,\n", " session_5_date_utc DATETIME,\n", " session_5_name TEXT\n", " )\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE TABLE Event (\n", " event_id INTEGER PRIMARY KEY,\n", " round_number INTEGER,\n", " country TEXT,\n", " location TEXT,\n", " event_date DATE,\n", " event_name TEXT,\n", " session_1_date_utc DATETIME,\n", " session_1_name TEXT,\n", " session_2_date_utc DATETIME,\n", " session_2_name TEXT,\n", " session_3_date_utc DATETIME,\n", " session_3_name TEXT,\n", " session_4_date_utc DATETIME,\n", " session_4_name TEXT,\n", " session_5_date_utc DATETIME,\n", " session_5_name TEXT\n", " )\n", "CREATE TABLE Sessions (\n", " session_id INTEGER PRIMARY KEY,\n", " event_id INTEGER,\n", " track_id INTEGER,\n", " session_type TEXT NOT NULL,\n", " date DATETIME NOT NULL,\n", " FOREIGN KEY (event_id) REFERENCES Event(event_id),\n", " FOREIGN KEY (track_id) REFERENCES Tracks(track_id)\n", " )\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE TABLE Sessions (\n", " session_id INTEGER PRIMARY KEY,\n", " event_id INTEGER,\n", " track_id INTEGER,\n", " session_type TEXT NOT NULL,\n", " date DATETIME NOT NULL,\n", " FOREIGN KEY (event_id) REFERENCES Event(event_id),\n", " FOREIGN KEY (track_id) REFERENCES Tracks(track_id)\n", " )\n", "CREATE TABLE Weather (\n", " weather_id INTEGER PRIMARY KEY,\n", " session_id INTEGER,\n", " datetime DATETIME,\n", " air_temperature_in_celsius REAL,\n", " relative_air_humidity_in_percentage REAL,\n", " air_pressure_in_mbar REAL,\n", " is_raining BOOLEAN,\n", " track_temperature_in_celsius REAL,\n", " wind_direction_in_grads REAL,\n", " wind_speed_in_meters_per_seconds REAL,\n", " FOREIGN KEY (session_id) REFERENCES Sessions(session_id)\n", " )\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE TABLE Weather (\n", " weather_id INTEGER PRIMARY KEY,\n", " session_id INTEGER,\n", " datetime DATETIME,\n", " air_temperature_in_celsius REAL,\n", " relative_air_humidity_in_percentage REAL,\n", " air_pressure_in_mbar REAL,\n", " is_raining BOOLEAN,\n", " track_temperature_in_celsius REAL,\n", " wind_direction_in_grads REAL,\n", " wind_speed_in_meters_per_seconds REAL,\n", " FOREIGN KEY (session_id) REFERENCES Sessions(session_id)\n", " )\n", "CREATE TABLE Laps (\n", " lap_id INTEGER PRIMARY KEY,\n", " session_id INTEGER,\n", " driver_name TEXT NOT NULL,\n", " lap_number INTEGER NOT NULL,\n", " stint INTEGER,\n", " sector_1_speed_trap_in_km REAL,\n", " sector_2_speed_trap_in_km REAL,\n", " finish_line_speed_trap_in_km REAL,\n", " longest_strait_speed_trap_in_km REAL,\n", " is_personal_best BOOLEAN,\n", " tyre_compound TEXT,\n", " tyre_life_in_laps INTEGER,\n", " is_fresh_tyre BOOLEAN,\n", " position INTEGER,\n", " lap_time_in_seconds REAL,\n", " sector_1_time_in_seconds REAL,\n", " sector_2_time_in_seconds REAL,\n", " sector_3_time_in_seconds REAL,\n", " lap_start_time_in_datetime DATETIME,\n", " pin_in_time_in_datetime DATETIME,\n", " pin_out_time_in_datetime DATETIME,\n", " FOREIGN KEY (session_id) REFERENCES Sessions(session_id),\n", " UNIQUE (session_id, driver_name, lap_number)\n", " )\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE TABLE Laps (\n", " lap_id INTEGER PRIMARY KEY,\n", " session_id INTEGER,\n", " driver_name TEXT NOT NULL,\n", " lap_number INTEGER NOT NULL,\n", " stint INTEGER,\n", " sector_1_speed_trap_in_km REAL,\n", " sector_2_speed_trap_in_km REAL,\n", " finish_line_speed_trap_in_km REAL,\n", " longest_strait_speed_trap_in_km REAL,\n", " is_personal_best BOOLEAN,\n", " tyre_compound TEXT,\n", " tyre_life_in_laps INTEGER,\n", " is_fresh_tyre BOOLEAN,\n", " position INTEGER,\n", " lap_time_in_seconds REAL,\n", " sector_1_time_in_seconds REAL,\n", " sector_2_time_in_seconds REAL,\n", " sector_3_time_in_seconds REAL,\n", " lap_start_time_in_datetime DATETIME,\n", " pin_in_time_in_datetime DATETIME,\n", " pin_out_time_in_datetime DATETIME,\n", " FOREIGN KEY (session_id) REFERENCES Sessions(session_id),\n", " UNIQUE (session_id, driver_name, lap_number)\n", " )\n", "CREATE TABLE Telemetry (\n", " telemetry_id INTEGER PRIMARY KEY,\n", " lap_id INTEGER,\n", " driver_name TEXT NOT NULL,\n", " speed_in_km REAL,\n", " RPM INTEGER,\n", " gear_number INTEGER,\n", " throttle_input REAL,\n", " is_brake_pressed BOOLEAN,\n", " is_DRS_open BOOLEAN,\n", " x_position REAL,\n", " y_position REAL,\n", " z_position REAL,\n", " is_off_track BOOLEAN,\n", " datetime DATETIME,\n", " FOREIGN KEY (lap_id) REFERENCES Laps(lap_id),\n", " FOREIGN KEY (driver_name) REFERENCES Drivers(driver_name)\n", " )\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE TABLE Telemetry (\n", " telemetry_id INTEGER PRIMARY KEY,\n", " lap_id INTEGER,\n", " driver_name TEXT NOT NULL,\n", " speed_in_km REAL,\n", " RPM INTEGER,\n", " gear_number INTEGER,\n", " throttle_input REAL,\n", " is_brake_pressed BOOLEAN,\n", " is_DRS_open BOOLEAN,\n", " x_position REAL,\n", " y_position REAL,\n", " z_position REAL,\n", " is_off_track BOOLEAN,\n", " datetime DATETIME,\n", " FOREIGN KEY (lap_id) REFERENCES Laps(lap_id),\n", " FOREIGN KEY (driver_name) REFERENCES Drivers(driver_name)\n", " )\n", "CREATE INDEX idx_laps_driver_name ON Laps(driver_name)\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE INDEX idx_laps_driver_name ON Laps(driver_name)\n", "CREATE INDEX idx_laps_session_id ON Laps(session_id)\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE INDEX idx_laps_session_id ON Laps(session_id)\n", "CREATE INDEX idx_telemetry_lap_id ON Telemetry(lap_id)\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE INDEX idx_telemetry_lap_id ON Telemetry(lap_id)\n", "CREATE INDEX idx_telemetry_datetime ON Telemetry(datetime)\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE INDEX idx_telemetry_datetime ON Telemetry(datetime)\n", "CREATE INDEX idx_weather_session_id ON Weather(session_id)\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE INDEX idx_weather_session_id ON Weather(session_id)\n", "CREATE INDEX idx_weather_datetime ON Weather(datetime)\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE INDEX idx_weather_datetime ON Weather(datetime)\n", "CREATE INDEX idx_event_date ON Event(event_date)\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE INDEX idx_event_date ON Event(event_date)\n", "CREATE VIEW DriverPerformanceSummaryWithWeather AS\n", " SELECT \n", " l.driver_name,\n", " e.event_name,\n", " s.session_type,\n", " t.track_name,\n", " COUNT(l.lap_id) AS total_laps,\n", " AVG(l.lap_time_in_seconds) AS avg_lap_time,\n", " MIN(l.lap_time_in_seconds) AS best_lap_time,\n", " AVG(l.sector_1_time_in_seconds) AS avg_sector1_time,\n", " AVG(l.sector_2_time_in_seconds) AS avg_sector2_time,\n", " AVG(l.sector_3_time_in_seconds) AS avg_sector3_time,\n", " AVG(l.finish_line_speed_trap_in_km) AS avg_finish_line_speed,\n", " COUNT(CASE WHEN l.is_personal_best THEN 1 END) AS personal_best_laps,\n", " AVG(w.air_temperature_in_celsius) AS avg_air_temp,\n", " AVG(w.track_temperature_in_celsius) AS avg_track_temp,\n", " SUM(CASE WHEN w.is_raining THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS rain_percentage\n", " FROM Laps l\n", " JOIN Sessions s ON l.session_id = s.session_id\n", " JOIN Tracks t ON s.track_id = t.track_id\n", " JOIN Event e ON s.event_id = e.event_id\n", " LEFT JOIN Weather w ON s.session_id = w.session_id \n", " AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\n", " GROUP BY l.driver_name, e.event_id, s.session_id\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE VIEW DriverPerformanceSummaryWithWeather AS\n", " SELECT \n", " l.driver_name,\n", " e.event_name,\n", " s.session_type,\n", " t.track_name,\n", " COUNT(l.lap_id) AS total_laps,\n", " AVG(l.lap_time_in_seconds) AS avg_lap_time,\n", " MIN(l.lap_time_in_seconds) AS best_lap_time,\n", " AVG(l.sector_1_time_in_seconds) AS avg_sector1_time,\n", " AVG(l.sector_2_time_in_seconds) AS avg_sector2_time,\n", " AVG(l.sector_3_time_in_seconds) AS avg_sector3_time,\n", " AVG(l.finish_line_speed_trap_in_km) AS avg_finish_line_speed,\n", " COUNT(CASE WHEN l.is_personal_best THEN 1 END) AS personal_best_laps,\n", " AVG(w.air_temperature_in_celsius) AS avg_air_temp,\n", " AVG(w.track_temperature_in_celsius) AS avg_track_temp,\n", " SUM(CASE WHEN w.is_raining THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS rain_percentage\n", " FROM Laps l\n", " JOIN Sessions s ON l.session_id = s.session_id\n", " JOIN Tracks t ON s.track_id = t.track_id\n", " JOIN Event e ON s.event_id = e.event_id\n", " LEFT JOIN Weather w ON s.session_id = w.session_id \n", " AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\n", " GROUP BY l.driver_name, e.event_id, s.session_id\n", "CREATE VIEW TyrePerformanceAnalysisWithWeather AS\n", " SELECT \n", " l.driver_name,\n", " e.event_name,\n", " s.session_type,\n", " t.track_name,\n", " l.tyre_compound,\n", " AVG(l.tyre_life_in_laps) AS avg_tyre_life,\n", " AVG(l.lap_time_in_seconds) AS avg_lap_time,\n", " AVG(l.longest_strait_speed_trap_in_km) AS avg_top_speed,\n", " COUNT(CASE WHEN l.is_fresh_tyre THEN 1 END) AS fresh_tyre_laps,\n", " COUNT(CASE WHEN NOT l.is_fresh_tyre THEN 1 END) AS used_tyre_laps,\n", " AVG(w.track_temperature_in_celsius) AS avg_track_temp,\n", " AVG(w.air_temperature_in_celsius) AS avg_air_temp\n", " FROM Laps l\n", " JOIN Sessions s ON l.session_id = s.session_id\n", " JOIN Tracks t ON s.track_id = t.track_id\n", " JOIN Event e ON s.event_id = e.event_id\n", " LEFT JOIN Weather w ON s.session_id = w.session_id \n", " AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\n", " GROUP BY l.driver_name, e.event_id, s.session_id, l.tyre_compound\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE VIEW TyrePerformanceAnalysisWithWeather AS\n", " SELECT \n", " l.driver_name,\n", " e.event_name,\n", " s.session_type,\n", " t.track_name,\n", " l.tyre_compound,\n", " AVG(l.tyre_life_in_laps) AS avg_tyre_life,\n", " AVG(l.lap_time_in_seconds) AS avg_lap_time,\n", " AVG(l.longest_strait_speed_trap_in_km) AS avg_top_speed,\n", " COUNT(CASE WHEN l.is_fresh_tyre THEN 1 END) AS fresh_tyre_laps,\n", " COUNT(CASE WHEN NOT l.is_fresh_tyre THEN 1 END) AS used_tyre_laps,\n", " AVG(w.track_temperature_in_celsius) AS avg_track_temp,\n", " AVG(w.air_temperature_in_celsius) AS avg_air_temp\n", " FROM Laps l\n", " JOIN Sessions s ON l.session_id = s.session_id\n", " JOIN Tracks t ON s.track_id = t.track_id\n", " JOIN Event e ON s.event_id = e.event_id\n", " LEFT JOIN Weather w ON s.session_id = w.session_id \n", " AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\n", " GROUP BY l.driver_name, e.event_id, s.session_id, l.tyre_compound\n", "CREATE VIEW WeatherImpactAnalysis AS\n", " SELECT \n", " e.event_name,\n", " s.session_type,\n", " t.track_name,\n", " AVG(w.air_temperature_in_celsius) AS avg_air_temp,\n", " AVG(w.track_temperature_in_celsius) AS avg_track_temp,\n", " AVG(w.relative_air_humidity_in_percentage) AS avg_humidity,\n", " AVG(w.wind_speed_in_meters_per_seconds) AS avg_wind_speed,\n", " SUM(CASE WHEN w.is_raining THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS rain_percentage,\n", " AVG(l.lap_time_in_seconds) AS avg_lap_time,\n", " MIN(l.lap_time_in_seconds) AS best_lap_time\n", " FROM Weather w\n", " JOIN Sessions s ON w.session_id = s.session_id\n", " JOIN Tracks t ON s.track_id = t.track_id\n", " JOIN Event e ON s.event_id = e.event_id\n", " JOIN Laps l ON s.session_id = l.session_id\n", " AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\n", " GROUP BY e.event_id, s.session_id\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE VIEW WeatherImpactAnalysis AS\n", " SELECT \n", " e.event_name,\n", " s.session_type,\n", " t.track_name,\n", " AVG(w.air_temperature_in_celsius) AS avg_air_temp,\n", " AVG(w.track_temperature_in_celsius) AS avg_track_temp,\n", " AVG(w.relative_air_humidity_in_percentage) AS avg_humidity,\n", " AVG(w.wind_speed_in_meters_per_seconds) AS avg_wind_speed,\n", " SUM(CASE WHEN w.is_raining THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS rain_percentage,\n", " AVG(l.lap_time_in_seconds) AS avg_lap_time,\n", " MIN(l.lap_time_in_seconds) AS best_lap_time\n", " FROM Weather w\n", " JOIN Sessions s ON w.session_id = s.session_id\n", " JOIN Tracks t ON s.track_id = t.track_id\n", " JOIN Event e ON s.event_id = e.event_id\n", " JOIN Laps l ON s.session_id = l.session_id\n", " AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\n", " GROUP BY e.event_id, s.session_id\n", "CREATE VIEW EventPerformanceOverview AS\n", " SELECT \n", " e.event_name,\n", " e.country,\n", " e.location,\n", " s.session_type,\n", " COUNT(DISTINCT l.driver_name) AS driver_count,\n", " AVG(l.lap_time_in_seconds) AS avg_lap_time,\n", " MIN(l.lap_time_in_seconds) AS best_lap_time,\n", " MAX(l.finish_line_speed_trap_in_km) AS max_finish_line_speed,\n", " AVG(w.air_temperature_in_celsius) AS avg_air_temp,\n", " AVG(w.track_temperature_in_celsius) AS avg_track_temp,\n", " SUM(CASE WHEN w.is_raining THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS rain_percentage\n", " FROM Event e\n", " JOIN Sessions s ON e.event_id = s.event_id\n", " JOIN Laps l ON s.session_id = l.session_id\n", " LEFT JOIN Weather w ON s.session_id = w.session_id \n", " AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\n", " GROUP BY e.event_id, s.session_id\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE VIEW EventPerformanceOverview AS\n", " SELECT \n", " e.event_name,\n", " e.country,\n", " e.location,\n", " s.session_type,\n", " COUNT(DISTINCT l.driver_name) AS driver_count,\n", " AVG(l.lap_time_in_seconds) AS avg_lap_time,\n", " MIN(l.lap_time_in_seconds) AS best_lap_time,\n", " MAX(l.finish_line_speed_trap_in_km) AS max_finish_line_speed,\n", " AVG(w.air_temperature_in_celsius) AS avg_air_temp,\n", " AVG(w.track_temperature_in_celsius) AS avg_track_temp,\n", " SUM(CASE WHEN w.is_raining THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS rain_percentage\n", " FROM Event e\n", " JOIN Sessions s ON e.event_id = s.event_id\n", " JOIN Laps l ON s.session_id = l.session_id\n", " LEFT JOIN Weather w ON s.session_id = w.session_id \n", " AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\n", " GROUP BY e.event_id, s.session_id\n", "CREATE VIEW TelemetryAnalysisWithWeather AS\n", " WITH SampledTelemetry AS (\n", " SELECT *,\n", " ROW_NUMBER() OVER (PARTITION BY lap_id ORDER BY RANDOM()) as rn\n", " FROM Telemetry\n", " )\n", " SELECT \n", " l.lap_id,\n", " l.driver_name,\n", " e.event_name,\n", " s.session_type,\n", " t.track_name,\n", " l.lap_number,\n", " l.lap_time_in_seconds,\n", " AVG(tel.speed_in_km) AS avg_speed,\n", " MAX(tel.speed_in_km) AS max_speed,\n", " AVG(tel.RPM) AS avg_RPM,\n", " MAX(tel.RPM) AS max_RPM,\n", " AVG(tel.throttle_input) AS avg_throttle,\n", " SUM(CASE WHEN tel.is_brake_pressed THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS brake_percentage,\n", " SUM(CASE WHEN tel.is_DRS_open THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS drs_usage_percentage,\n", " SUM(CASE WHEN tel.is_off_track THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS off_track_percentage,\n", " AVG(w.air_temperature_in_celsius) AS avg_air_temp,\n", " AVG(w.track_temperature_in_celsius) AS avg_track_temp,\n", " AVG(w.wind_speed_in_meters_per_seconds) AS avg_wind_speed\n", " FROM Laps l\n", " JOIN Sessions s ON l.session_id = s.session_id\n", " JOIN Tracks t ON s.track_id = t.track_id\n", " JOIN Event e ON s.event_id = e.event_id\n", " JOIN SampledTelemetry tel ON l.lap_id = tel.lap_id AND tel.rn <= 100\n", " LEFT JOIN Weather w ON s.session_id = w.session_id \n", " AND tel.datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\n", " GROUP BY l.lap_id\n", "----------------------------------------------------------------------------------------------------\n", "Adding ddl: CREATE VIEW TelemetryAnalysisWithWeather AS\n", " WITH SampledTelemetry AS (\n", " SELECT *,\n", " ROW_NUMBER() OVER (PARTITION BY lap_id ORDER BY RANDOM()) as rn\n", " FROM Telemetry\n", " )\n", " SELECT \n", " l.lap_id,\n", " l.driver_name,\n", " e.event_name,\n", " s.session_type,\n", " t.track_name,\n", " l.lap_number,\n", " l.lap_time_in_seconds,\n", " AVG(tel.speed_in_km) AS avg_speed,\n", " MAX(tel.speed_in_km) AS max_speed,\n", " AVG(tel.RPM) AS avg_RPM,\n", " MAX(tel.RPM) AS max_RPM,\n", " AVG(tel.throttle_input) AS avg_throttle,\n", " SUM(CASE WHEN tel.is_brake_pressed THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS brake_percentage,\n", " SUM(CASE WHEN tel.is_DRS_open THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS drs_usage_percentage,\n", " SUM(CASE WHEN tel.is_off_track THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS off_track_percentage,\n", " AVG(w.air_temperature_in_celsius) AS avg_air_temp,\n", " AVG(w.track_temperature_in_celsius) AS avg_track_temp,\n", " AVG(w.wind_speed_in_meters_per_seconds) AS avg_wind_speed\n", " FROM Laps l\n", " JOIN Sessions s ON l.session_id = s.session_id\n", " JOIN Tracks t ON s.track_id = t.track_id\n", " JOIN Event e ON s.event_id = e.event_id\n", " JOIN SampledTelemetry tel ON l.lap_id = tel.lap_id AND tel.rn <= 100\n", " LEFT JOIN Weather w ON s.session_id = w.session_id \n", " AND tel.datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\n", " GROUP BY l.lap_id\n" ] } ], "source": [ "\n", "df_ddl = vn.run_sql(\n", " \"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n", "\n", "print(df_ddl)\n", "print('-'*100)\n", "\n", "for ddl in df_ddl['sql'].to_list():\n", " print(ddl)\n", " print('-'*100)\n", " vn.train(ddl=ddl)" ] }, { "cell_type": "code", "execution_count": 8, "id": "7c421f88-42ea-567c-8581-3dcac96c36a3", "metadata": { "id": "7c421f88-42ea-567c-8581-3dcac96c36a3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Adding ddl: \n", " CREATE VIEW IF NOT EXISTS DriverPerformanceSummaryWithWeather AS\n", " SELECT \n", " l.driver_name,\n", " e.event_name,\n", " s.session_type,\n", " t.track_name,\n", " COUNT(l.lap_id) AS total_laps,\n", " AVG(l.lap_time_in_seconds) AS avg_lap_time,\n", " MIN(l.lap_time_in_seconds) AS best_lap_time,\n", " AVG(l.sector_1_time_in_seconds) AS avg_sector1_time,\n", " AVG(l.sector_2_time_in_seconds) AS avg_sector2_time,\n", " AVG(l.sector_3_time_in_seconds) AS avg_sector3_time,\n", " AVG(l.finish_line_speed_trap_in_km) AS avg_finish_line_speed,\n", " COUNT(CASE WHEN l.is_personal_best THEN 1 END) AS personal_best_laps,\n", " AVG(w.air_temperature_in_celsius) AS avg_air_temp,\n", " AVG(w.track_temperature_in_celsius) AS avg_track_temp,\n", " SUM(CASE WHEN w.is_raining THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS rain_percentage\n", " FROM Laps l\n", " JOIN Sessions s ON l.session_id = s.session_id\n", " JOIN Tracks t ON s.track_id = t.track_id\n", " JOIN Event e ON s.event_id = e.event_id\n", " LEFT JOIN Weather w ON s.session_id = w.session_id \n", " AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\n", " GROUP BY l.driver_name, e.event_id, s.session_id;\n", "\n", "Adding documentation....\n", "Using model gpt-4o for 65.0 tokens (approx)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", "To disable this warning, you can either:\n", "\t- Avoid using `tokenizers` before the fork if possible\n", "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Question generated with sql: What are the details for the person named John Doe? \n", "Adding SQL...\n" ] }, { "data": { "text/plain": [ "'4dfd73a9-4462-5a23-8b28-b9d5c7125b49-sql'" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "# The following are methods for adding training data. Make sure you modify the examples to match your database.\n", "\n", "# DDL statements are powerful because they specify table names, colume names, types, and potentially relationships\n", "vn.train(ddl=\"\"\"\n", " CREATE VIEW IF NOT EXISTS DriverPerformanceSummaryWithWeather AS\n", " SELECT \n", " l.driver_name,\n", " e.event_name,\n", " s.session_type,\n", " t.track_name,\n", " COUNT(l.lap_id) AS total_laps,\n", " AVG(l.lap_time_in_seconds) AS avg_lap_time,\n", " MIN(l.lap_time_in_seconds) AS best_lap_time,\n", " AVG(l.sector_1_time_in_seconds) AS avg_sector1_time,\n", " AVG(l.sector_2_time_in_seconds) AS avg_sector2_time,\n", " AVG(l.sector_3_time_in_seconds) AS avg_sector3_time,\n", " AVG(l.finish_line_speed_trap_in_km) AS avg_finish_line_speed,\n", " COUNT(CASE WHEN l.is_personal_best THEN 1 END) AS personal_best_laps,\n", " AVG(w.air_temperature_in_celsius) AS avg_air_temp,\n", " AVG(w.track_temperature_in_celsius) AS avg_track_temp,\n", " SUM(CASE WHEN w.is_raining THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS rain_percentage\n", " FROM Laps l\n", " JOIN Sessions s ON l.session_id = s.session_id\n", " JOIN Tracks t ON s.track_id = t.track_id\n", " JOIN Event e ON s.event_id = e.event_id\n", " LEFT JOIN Weather w ON s.session_id = w.session_id \n", " AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\n", " GROUP BY l.driver_name, e.event_id, s.session_id;\n", "\"\"\")\n", "\n", "# Sometimes you may want to add documentation about your business terminology or definitions.\n", "vn.train(documentation=\"Our business defines OTIF score as the percentage of orders that are delivered on time and in full\")\n", "\n", "# You can also add SQL queries to your training data. This is useful if you have some queries already laying around. You can just copy and paste those from your editor to begin generating new SQL.\n", "vn.train(sql=\"SELECT * FROM my-table WHERE name = 'John Doe'\")" ] }, { "cell_type": "code", "execution_count": 9, "id": "59fcb3b1-4434-583d-82be-ed8e9b04d699", "metadata": { "id": "59fcb3b1-4434-583d-82be-ed8e9b04d699" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idquestioncontenttraining_data_type
04dfd73a9-4462-5a23-8b28-b9d5c7125b49-sqlWhat are the details for the person named John...SELECT * FROM my-table WHERE name = 'John Doe'sql
06493e730-8fd5-5c9b-ba80-d991dcf0c4e9-ddlNoneCREATE TABLE Drivers (\\n driver...ddl
1894692ac-1600-54b6-af13-4a9ff62c6e32-ddlNoneCREATE TABLE Tracks (\\n track_i...ddl
27258dd79-d9f7-5a33-86c9-c8cfe10e7967-ddlNoneCREATE TABLE Event (\\n event_id...ddl
364a28e8b-3faf-5ea0-8867-3e1e92958607-ddlNoneCREATE TABLE Sessions (\\n sessi...ddl
4feb0cd7c-e372-50a8-a10a-736c42386360-ddlNoneCREATE TABLE Weather (\\n weathe...ddl
50f9d7dec-f228-53a0-879b-26a7918f177b-ddlNoneCREATE TABLE Laps (\\n lap_id IN...ddl
6ae41976c-72dd-549c-a4d5-327db48beadb-ddlNoneCREATE TABLE Telemetry (\\n tele...ddl
7bb13e8f0-6934-52fd-bbb6-62ab4a40b8b0-ddlNoneCREATE INDEX idx_laps_driver_name ON Laps(driv...ddl
8d0efbc31-d1e0-54f0-a19c-5905d905d9d3-ddlNoneCREATE INDEX idx_laps_session_id ON Laps(sessi...ddl
9db5f7760-144e-5d1d-ae5d-8f699e2d60a4-ddlNoneCREATE INDEX idx_telemetry_lap_id ON Telemetry...ddl
10892655e2-8e10-5a00-b97f-c5916038f464-ddlNoneCREATE INDEX idx_telemetry_datetime ON Telemet...ddl
119caa16be-95d6-5695-8091-b2bee5bd103b-ddlNoneCREATE INDEX idx_weather_session_id ON Weather...ddl
123c897036-893c-5975-9e75-fa9858906478-ddlNoneCREATE INDEX idx_weather_datetime ON Weather(d...ddl
135dacfa83-1fbd-578b-afc0-11571ca5b52f-ddlNoneCREATE INDEX idx_event_date ON Event(event_date)ddl
14b8e57921-9fe3-5d95-b480-67776aaebe07-ddlNoneCREATE VIEW DriverPerformanceSummaryWithWeathe...ddl
1516e24e76-db3f-5495-9943-6bd4d08ba03a-ddlNoneCREATE VIEW TyrePerformanceAnalysisWithWeather...ddl
16874e4eac-9c02-5047-8657-d148b125b702-ddlNoneCREATE VIEW WeatherImpactAnalysis AS\\n ...ddl
17fd528edd-cdd1-5f3d-b7e8-eae03f073560-ddlNoneCREATE VIEW EventPerformanceOverview AS\\n ...ddl
18ce0a1604-e717-5bb2-921a-abedc453f13c-ddlNoneCREATE VIEW TelemetryAnalysisWithWeather AS\\n ...ddl
19ac7cedb2-8062-5ba7-b596-dea4c331fb9a-ddlNone\\n CREATE VIEW IF NOT EXISTS DriverPerforma...ddl
051cf1d6d-7637-5b87-b9e7-31c577fbde59-docNoneOur business defines OTIF score as the percent...documentation
\n", "
" ], "text/plain": [ " id \\\n", "0 4dfd73a9-4462-5a23-8b28-b9d5c7125b49-sql \n", "0 6493e730-8fd5-5c9b-ba80-d991dcf0c4e9-ddl \n", "1 894692ac-1600-54b6-af13-4a9ff62c6e32-ddl \n", "2 7258dd79-d9f7-5a33-86c9-c8cfe10e7967-ddl \n", "3 64a28e8b-3faf-5ea0-8867-3e1e92958607-ddl \n", "4 feb0cd7c-e372-50a8-a10a-736c42386360-ddl \n", "5 0f9d7dec-f228-53a0-879b-26a7918f177b-ddl \n", "6 ae41976c-72dd-549c-a4d5-327db48beadb-ddl \n", "7 bb13e8f0-6934-52fd-bbb6-62ab4a40b8b0-ddl \n", "8 d0efbc31-d1e0-54f0-a19c-5905d905d9d3-ddl \n", "9 db5f7760-144e-5d1d-ae5d-8f699e2d60a4-ddl \n", "10 892655e2-8e10-5a00-b97f-c5916038f464-ddl \n", "11 9caa16be-95d6-5695-8091-b2bee5bd103b-ddl \n", "12 3c897036-893c-5975-9e75-fa9858906478-ddl \n", "13 5dacfa83-1fbd-578b-afc0-11571ca5b52f-ddl \n", "14 b8e57921-9fe3-5d95-b480-67776aaebe07-ddl \n", "15 16e24e76-db3f-5495-9943-6bd4d08ba03a-ddl \n", "16 874e4eac-9c02-5047-8657-d148b125b702-ddl \n", "17 fd528edd-cdd1-5f3d-b7e8-eae03f073560-ddl \n", "18 ce0a1604-e717-5bb2-921a-abedc453f13c-ddl \n", "19 ac7cedb2-8062-5ba7-b596-dea4c331fb9a-ddl \n", "0 51cf1d6d-7637-5b87-b9e7-31c577fbde59-doc \n", "\n", " question \\\n", "0 What are the details for the person named John... \n", "0 None \n", "1 None \n", "2 None \n", "3 None \n", "4 None \n", "5 None \n", "6 None \n", "7 None \n", "8 None \n", "9 None \n", "10 None \n", "11 None \n", "12 None \n", "13 None \n", "14 None \n", "15 None \n", "16 None \n", "17 None \n", "18 None \n", "19 None \n", "0 None \n", "\n", " content training_data_type \n", "0 SELECT * FROM my-table WHERE name = 'John Doe' sql \n", "0 CREATE TABLE Drivers (\\n driver... ddl \n", "1 CREATE TABLE Tracks (\\n track_i... ddl \n", "2 CREATE TABLE Event (\\n event_id... ddl \n", "3 CREATE TABLE Sessions (\\n sessi... ddl \n", "4 CREATE TABLE Weather (\\n weathe... ddl \n", "5 CREATE TABLE Laps (\\n lap_id IN... ddl \n", "6 CREATE TABLE Telemetry (\\n tele... ddl \n", "7 CREATE INDEX idx_laps_driver_name ON Laps(driv... ddl \n", "8 CREATE INDEX idx_laps_session_id ON Laps(sessi... ddl \n", "9 CREATE INDEX idx_telemetry_lap_id ON Telemetry... ddl \n", "10 CREATE INDEX idx_telemetry_datetime ON Telemet... ddl \n", "11 CREATE INDEX idx_weather_session_id ON Weather... ddl \n", "12 CREATE INDEX idx_weather_datetime ON Weather(d... ddl \n", "13 CREATE INDEX idx_event_date ON Event(event_date) ddl \n", "14 CREATE VIEW DriverPerformanceSummaryWithWeathe... ddl \n", "15 CREATE VIEW TyrePerformanceAnalysisWithWeather... ddl \n", "16 CREATE VIEW WeatherImpactAnalysis AS\\n ... ddl \n", "17 CREATE VIEW EventPerformanceOverview AS\\n ... ddl \n", "18 CREATE VIEW TelemetryAnalysisWithWeather AS\\n ... ddl \n", "19 \\n CREATE VIEW IF NOT EXISTS DriverPerforma... ddl \n", "0 Our business defines OTIF score as the percent... documentation " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# At any time you can inspect what training data the package is able to reference\n", "training_data = vn.get_training_data()\n", "training_data" ] }, { "cell_type": "code", "execution_count": 10, "id": "6cf17ab9-dc48-58af-8d75-4e5590a01c88", "metadata": { "id": "6cf17ab9-dc48-58af-8d75-4e5590a01c88" }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# You can remove training data if there's obsolete/incorrect information.\n", "vn.remove_training_data(id='51cf1d6d-7637-5b87-b9e7-31c577fbde59-doc')" ] }, { "cell_type": "code", "execution_count": 12, "id": "5ae7914a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idquestioncontenttraining_data_type
04dfd73a9-4462-5a23-8b28-b9d5c7125b49-sqlWhat are the details for the person named John...SELECT * FROM my-table WHERE name = 'John Doe'sql
06493e730-8fd5-5c9b-ba80-d991dcf0c4e9-ddlNoneCREATE TABLE Drivers (\\n driver...ddl
1894692ac-1600-54b6-af13-4a9ff62c6e32-ddlNoneCREATE TABLE Tracks (\\n track_i...ddl
27258dd79-d9f7-5a33-86c9-c8cfe10e7967-ddlNoneCREATE TABLE Event (\\n event_id...ddl
364a28e8b-3faf-5ea0-8867-3e1e92958607-ddlNoneCREATE TABLE Sessions (\\n sessi...ddl
4feb0cd7c-e372-50a8-a10a-736c42386360-ddlNoneCREATE TABLE Weather (\\n weathe...ddl
50f9d7dec-f228-53a0-879b-26a7918f177b-ddlNoneCREATE TABLE Laps (\\n lap_id IN...ddl
6ae41976c-72dd-549c-a4d5-327db48beadb-ddlNoneCREATE TABLE Telemetry (\\n tele...ddl
7bb13e8f0-6934-52fd-bbb6-62ab4a40b8b0-ddlNoneCREATE INDEX idx_laps_driver_name ON Laps(driv...ddl
8d0efbc31-d1e0-54f0-a19c-5905d905d9d3-ddlNoneCREATE INDEX idx_laps_session_id ON Laps(sessi...ddl
9db5f7760-144e-5d1d-ae5d-8f699e2d60a4-ddlNoneCREATE INDEX idx_telemetry_lap_id ON Telemetry...ddl
10892655e2-8e10-5a00-b97f-c5916038f464-ddlNoneCREATE INDEX idx_telemetry_datetime ON Telemet...ddl
119caa16be-95d6-5695-8091-b2bee5bd103b-ddlNoneCREATE INDEX idx_weather_session_id ON Weather...ddl
123c897036-893c-5975-9e75-fa9858906478-ddlNoneCREATE INDEX idx_weather_datetime ON Weather(d...ddl
135dacfa83-1fbd-578b-afc0-11571ca5b52f-ddlNoneCREATE INDEX idx_event_date ON Event(event_date)ddl
14b8e57921-9fe3-5d95-b480-67776aaebe07-ddlNoneCREATE VIEW DriverPerformanceSummaryWithWeathe...ddl
1516e24e76-db3f-5495-9943-6bd4d08ba03a-ddlNoneCREATE VIEW TyrePerformanceAnalysisWithWeather...ddl
16874e4eac-9c02-5047-8657-d148b125b702-ddlNoneCREATE VIEW WeatherImpactAnalysis AS\\n ...ddl
17fd528edd-cdd1-5f3d-b7e8-eae03f073560-ddlNoneCREATE VIEW EventPerformanceOverview AS\\n ...ddl
18ce0a1604-e717-5bb2-921a-abedc453f13c-ddlNoneCREATE VIEW TelemetryAnalysisWithWeather AS\\n ...ddl
19ac7cedb2-8062-5ba7-b596-dea4c331fb9a-ddlNone\\n CREATE VIEW IF NOT EXISTS DriverPerforma...ddl
\n", "
" ], "text/plain": [ " id \\\n", "0 4dfd73a9-4462-5a23-8b28-b9d5c7125b49-sql \n", "0 6493e730-8fd5-5c9b-ba80-d991dcf0c4e9-ddl \n", "1 894692ac-1600-54b6-af13-4a9ff62c6e32-ddl \n", "2 7258dd79-d9f7-5a33-86c9-c8cfe10e7967-ddl \n", "3 64a28e8b-3faf-5ea0-8867-3e1e92958607-ddl \n", "4 feb0cd7c-e372-50a8-a10a-736c42386360-ddl \n", "5 0f9d7dec-f228-53a0-879b-26a7918f177b-ddl \n", "6 ae41976c-72dd-549c-a4d5-327db48beadb-ddl \n", "7 bb13e8f0-6934-52fd-bbb6-62ab4a40b8b0-ddl \n", "8 d0efbc31-d1e0-54f0-a19c-5905d905d9d3-ddl \n", "9 db5f7760-144e-5d1d-ae5d-8f699e2d60a4-ddl \n", "10 892655e2-8e10-5a00-b97f-c5916038f464-ddl \n", "11 9caa16be-95d6-5695-8091-b2bee5bd103b-ddl \n", "12 3c897036-893c-5975-9e75-fa9858906478-ddl \n", "13 5dacfa83-1fbd-578b-afc0-11571ca5b52f-ddl \n", "14 b8e57921-9fe3-5d95-b480-67776aaebe07-ddl \n", "15 16e24e76-db3f-5495-9943-6bd4d08ba03a-ddl \n", "16 874e4eac-9c02-5047-8657-d148b125b702-ddl \n", "17 fd528edd-cdd1-5f3d-b7e8-eae03f073560-ddl \n", "18 ce0a1604-e717-5bb2-921a-abedc453f13c-ddl \n", "19 ac7cedb2-8062-5ba7-b596-dea4c331fb9a-ddl \n", "\n", " question \\\n", "0 What are the details for the person named John... \n", "0 None \n", "1 None \n", "2 None \n", "3 None \n", "4 None \n", "5 None \n", "6 None \n", "7 None \n", "8 None \n", "9 None \n", "10 None \n", "11 None \n", "12 None \n", "13 None \n", "14 None \n", "15 None \n", "16 None \n", "17 None \n", "18 None \n", "19 None \n", "\n", " content training_data_type \n", "0 SELECT * FROM my-table WHERE name = 'John Doe' sql \n", "0 CREATE TABLE Drivers (\\n driver... ddl \n", "1 CREATE TABLE Tracks (\\n track_i... ddl \n", "2 CREATE TABLE Event (\\n event_id... ddl \n", "3 CREATE TABLE Sessions (\\n sessi... ddl \n", "4 CREATE TABLE Weather (\\n weathe... ddl \n", "5 CREATE TABLE Laps (\\n lap_id IN... ddl \n", "6 CREATE TABLE Telemetry (\\n tele... ddl \n", "7 CREATE INDEX idx_laps_driver_name ON Laps(driv... ddl \n", "8 CREATE INDEX idx_laps_session_id ON Laps(sessi... ddl \n", "9 CREATE INDEX idx_telemetry_lap_id ON Telemetry... ddl \n", "10 CREATE INDEX idx_telemetry_datetime ON Telemet... ddl \n", "11 CREATE INDEX idx_weather_session_id ON Weather... ddl \n", "12 CREATE INDEX idx_weather_datetime ON Weather(d... ddl \n", "13 CREATE INDEX idx_event_date ON Event(event_date) ddl \n", "14 CREATE VIEW DriverPerformanceSummaryWithWeathe... ddl \n", "15 CREATE VIEW TyrePerformanceAnalysisWithWeather... ddl \n", "16 CREATE VIEW WeatherImpactAnalysis AS\\n ... ddl \n", "17 CREATE VIEW EventPerformanceOverview AS\\n ... ddl \n", "18 CREATE VIEW TelemetryAnalysisWithWeather AS\\n ... ddl \n", "19 \\n CREATE VIEW IF NOT EXISTS DriverPerforma... ddl " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "training_data = vn.get_training_data()\n", "training_data" ] }, { "cell_type": "markdown", "id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f", "metadata": { "id": "bf2fc121-a3ab-5a2e-95b0-383271e82d5f" }, "source": [ "## Asking the AI\n", "\n", "Whenever you ask a new question, it will find the 10 most relevant pieces of training data and use it as part of the LLM prompt to generate the SQL.\n" ] }, { "cell_type": "code", "execution_count": 13, "id": "edb6679e-a102-5efc-b890-81babca8f500", "metadata": { "id": "edb6679e-a102-5efc-b890-81babca8f500" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Number of requested results 10 is greater than number of elements in index 1, updating n_results = 1\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "SQL Prompt: [{'role': 'system', 'content': \"You are a SQLite expert. Please help to generate a SQL query to answer the question. Your response should ONLY be based on the given context and follow the response guidelines and format instructions. \\n===Tables \\nCREATE TABLE Drivers (\\n driver_id INTEGER PRIMARY KEY,\\n driver_name TEXT NOT NULL,\\n team TEXT NOT NULL\\n )\\n\\nCREATE VIEW DriverPerformanceSummaryWithWeather AS\\n SELECT \\n l.driver_name,\\n e.event_name,\\n s.session_type,\\n t.track_name,\\n COUNT(l.lap_id) AS total_laps,\\n AVG(l.lap_time_in_seconds) AS avg_lap_time,\\n MIN(l.lap_time_in_seconds) AS best_lap_time,\\n AVG(l.sector_1_time_in_seconds) AS avg_sector1_time,\\n AVG(l.sector_2_time_in_seconds) AS avg_sector2_time,\\n AVG(l.sector_3_time_in_seconds) AS avg_sector3_time,\\n AVG(l.finish_line_speed_trap_in_km) AS avg_finish_line_speed,\\n COUNT(CASE WHEN l.is_personal_best THEN 1 END) AS personal_best_laps,\\n AVG(w.air_temperature_in_celsius) AS avg_air_temp,\\n AVG(w.track_temperature_in_celsius) AS avg_track_temp,\\n SUM(CASE WHEN w.is_raining THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS rain_percentage\\n FROM Laps l\\n JOIN Sessions s ON l.session_id = s.session_id\\n JOIN Tracks t ON s.track_id = t.track_id\\n JOIN Event e ON s.event_id = e.event_id\\n LEFT JOIN Weather w ON s.session_id = w.session_id \\n AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\\n GROUP BY l.driver_name, e.event_id, s.session_id\\n\\nCREATE VIEW TelemetryAnalysisWithWeather AS\\n WITH SampledTelemetry AS (\\n SELECT *,\\n ROW_NUMBER() OVER (PARTITION BY lap_id ORDER BY RANDOM()) as rn\\n FROM Telemetry\\n )\\n SELECT \\n l.lap_id,\\n l.driver_name,\\n e.event_name,\\n s.session_type,\\n t.track_name,\\n l.lap_number,\\n l.lap_time_in_seconds,\\n AVG(tel.speed_in_km) AS avg_speed,\\n MAX(tel.speed_in_km) AS max_speed,\\n AVG(tel.RPM) AS avg_RPM,\\n MAX(tel.RPM) AS max_RPM,\\n AVG(tel.throttle_input) AS avg_throttle,\\n SUM(CASE WHEN tel.is_brake_pressed THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS brake_percentage,\\n SUM(CASE WHEN tel.is_DRS_open THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS drs_usage_percentage,\\n SUM(CASE WHEN tel.is_off_track THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS off_track_percentage,\\n AVG(w.air_temperature_in_celsius) AS avg_air_temp,\\n AVG(w.track_temperature_in_celsius) AS avg_track_temp,\\n AVG(w.wind_speed_in_meters_per_seconds) AS avg_wind_speed\\n FROM Laps l\\n JOIN Sessions s ON l.session_id = s.session_id\\n JOIN Tracks t ON s.track_id = t.track_id\\n JOIN Event e ON s.event_id = e.event_id\\n JOIN SampledTelemetry tel ON l.lap_id = tel.lap_id AND tel.rn <= 100\\n LEFT JOIN Weather w ON s.session_id = w.session_id \\n AND tel.datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\\n GROUP BY l.lap_id\\n\\n\\n CREATE VIEW IF NOT EXISTS DriverPerformanceSummaryWithWeather AS\\n SELECT \\n l.driver_name,\\n e.event_name,\\n s.session_type,\\n t.track_name,\\n COUNT(l.lap_id) AS total_laps,\\n AVG(l.lap_time_in_seconds) AS avg_lap_time,\\n MIN(l.lap_time_in_seconds) AS best_lap_time,\\n AVG(l.sector_1_time_in_seconds) AS avg_sector1_time,\\n AVG(l.sector_2_time_in_seconds) AS avg_sector2_time,\\n AVG(l.sector_3_time_in_seconds) AS avg_sector3_time,\\n AVG(l.finish_line_speed_trap_in_km) AS avg_finish_line_speed,\\n COUNT(CASE WHEN l.is_personal_best THEN 1 END) AS personal_best_laps,\\n AVG(w.air_temperature_in_celsius) AS avg_air_temp,\\n AVG(w.track_temperature_in_celsius) AS avg_track_temp,\\n SUM(CASE WHEN w.is_raining THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS rain_percentage\\n FROM Laps l\\n JOIN Sessions s ON l.session_id = s.session_id\\n JOIN Tracks t ON s.track_id = t.track_id\\n JOIN Event e ON s.event_id = e.event_id\\n LEFT JOIN Weather w ON s.session_id = w.session_id \\n AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\\n GROUP BY l.driver_name, e.event_id, s.session_id;\\n\\n\\nCREATE TABLE Telemetry (\\n telemetry_id INTEGER PRIMARY KEY,\\n lap_id INTEGER,\\n driver_name TEXT NOT NULL,\\n speed_in_km REAL,\\n RPM INTEGER,\\n gear_number INTEGER,\\n throttle_input REAL,\\n is_brake_pressed BOOLEAN,\\n is_DRS_open BOOLEAN,\\n x_position REAL,\\n y_position REAL,\\n z_position REAL,\\n is_off_track BOOLEAN,\\n datetime DATETIME,\\n FOREIGN KEY (lap_id) REFERENCES Laps(lap_id),\\n FOREIGN KEY (driver_name) REFERENCES Drivers(driver_name)\\n )\\n\\nCREATE TABLE Laps (\\n lap_id INTEGER PRIMARY KEY,\\n session_id INTEGER,\\n driver_name TEXT NOT NULL,\\n lap_number INTEGER NOT NULL,\\n stint INTEGER,\\n sector_1_speed_trap_in_km REAL,\\n sector_2_speed_trap_in_km REAL,\\n finish_line_speed_trap_in_km REAL,\\n longest_strait_speed_trap_in_km REAL,\\n is_personal_best BOOLEAN,\\n tyre_compound TEXT,\\n tyre_life_in_laps INTEGER,\\n is_fresh_tyre BOOLEAN,\\n position INTEGER,\\n lap_time_in_seconds REAL,\\n sector_1_time_in_seconds REAL,\\n sector_2_time_in_seconds REAL,\\n sector_3_time_in_seconds REAL,\\n lap_start_time_in_datetime DATETIME,\\n pin_in_time_in_datetime DATETIME,\\n pin_out_time_in_datetime DATETIME,\\n FOREIGN KEY (session_id) REFERENCES Sessions(session_id),\\n UNIQUE (session_id, driver_name, lap_number)\\n )\\n\\nCREATE VIEW EventPerformanceOverview AS\\n SELECT \\n e.event_name,\\n e.country,\\n e.location,\\n s.session_type,\\n COUNT(DISTINCT l.driver_name) AS driver_count,\\n AVG(l.lap_time_in_seconds) AS avg_lap_time,\\n MIN(l.lap_time_in_seconds) AS best_lap_time,\\n MAX(l.finish_line_speed_trap_in_km) AS max_finish_line_speed,\\n AVG(w.air_temperature_in_celsius) AS avg_air_temp,\\n AVG(w.track_temperature_in_celsius) AS avg_track_temp,\\n SUM(CASE WHEN w.is_raining THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS rain_percentage\\n FROM Event e\\n JOIN Sessions s ON e.event_id = s.event_id\\n JOIN Laps l ON s.session_id = l.session_id\\n LEFT JOIN Weather w ON s.session_id = w.session_id \\n AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\\n GROUP BY e.event_id, s.session_id\\n\\nCREATE INDEX idx_laps_driver_name ON Laps(driver_name)\\n\\nCREATE VIEW TyrePerformanceAnalysisWithWeather AS\\n SELECT \\n l.driver_name,\\n e.event_name,\\n s.session_type,\\n t.track_name,\\n l.tyre_compound,\\n AVG(l.tyre_life_in_laps) AS avg_tyre_life,\\n AVG(l.lap_time_in_seconds) AS avg_lap_time,\\n AVG(l.longest_strait_speed_trap_in_km) AS avg_top_speed,\\n COUNT(CASE WHEN l.is_fresh_tyre THEN 1 END) AS fresh_tyre_laps,\\n COUNT(CASE WHEN NOT l.is_fresh_tyre THEN 1 END) AS used_tyre_laps,\\n AVG(w.track_temperature_in_celsius) AS avg_track_temp,\\n AVG(w.air_temperature_in_celsius) AS avg_air_temp\\n FROM Laps l\\n JOIN Sessions s ON l.session_id = s.session_id\\n JOIN Tracks t ON s.track_id = t.track_id\\n JOIN Event e ON s.event_id = e.event_id\\n LEFT JOIN Weather w ON s.session_id = w.session_id \\n AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\\n GROUP BY l.driver_name, e.event_id, s.session_id, l.tyre_compound\\n\\nCREATE VIEW WeatherImpactAnalysis AS\\n SELECT \\n e.event_name,\\n s.session_type,\\n t.track_name,\\n AVG(w.air_temperature_in_celsius) AS avg_air_temp,\\n AVG(w.track_temperature_in_celsius) AS avg_track_temp,\\n AVG(w.relative_air_humidity_in_percentage) AS avg_humidity,\\n AVG(w.wind_speed_in_meters_per_seconds) AS avg_wind_speed,\\n SUM(CASE WHEN w.is_raining THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS rain_percentage,\\n AVG(l.lap_time_in_seconds) AS avg_lap_time,\\n MIN(l.lap_time_in_seconds) AS best_lap_time\\n FROM Weather w\\n JOIN Sessions s ON w.session_id = s.session_id\\n JOIN Tracks t ON s.track_id = t.track_id\\n JOIN Event e ON s.event_id = e.event_id\\n JOIN Laps l ON s.session_id = l.session_id\\n AND l.lap_start_time_in_datetime BETWEEN w.datetime AND datetime(w.datetime, '+1 minutes')\\n GROUP BY e.event_id, s.session_id\\n\\n===Response Guidelines \\n1. If the provided context is sufficient, please generate a valid SQL query without any explanations for the question. \\n2. If the provided context is almost sufficient but requires knowledge of a specific string in a particular column, please generate an intermediate SQL query to find the distinct strings in that column. Prepend the query with a comment saying intermediate_sql \\n3. If the provided context is insufficient, please explain why it can't be generated. \\n4. Please use the most relevant table(s). \\n5. If the question has been asked and answered before, please repeat the answer exactly as it was given before. \\n6. Ensure that the output SQL is SQLite-compliant and executable, and free of syntax errors. \\n\"}, {'role': 'user', 'content': 'What are the details for the person named John Doe?'}, {'role': 'assistant', 'content': \"SELECT * FROM my-table WHERE name = 'John Doe'\"}, {'role': 'user', 'content': 'How was the performance of the driver PIA?'}]\n", "Using model gpt-4o for 2717.25 tokens (approx)\n", "LLM Response: ```sql\n", "SELECT * \n", "FROM DriverPerformanceSummaryWithWeather\n", "WHERE driver_name = 'PIA'\n", "```\n", "Extracted SQL: SELECT * \n", "FROM DriverPerformanceSummaryWithWeather\n", "WHERE driver_name = 'PIA'\n", "\n", "SELECT * \n", "FROM DriverPerformanceSummaryWithWeather\n", "WHERE driver_name = 'PIA'\n", "\n", " driver_name event_name session_type track_name total_laps \\\n", "0 PIA Bahrain Grand Prix Qualifying Sakhir 7 \n", "1 PIA Bahrain Grand Prix Qualifying Sakhir 7 \n", "2 PIA Bahrain Grand Prix Qualifying Sakhir 7 \n", "3 PIA Bahrain Grand Prix Qualifying Sakhir 7 \n", "4 PIA Bahrain Grand Prix Qualifying Sakhir 7 \n", "5 PIA Bahrain Grand Prix Qualifying Sakhir 7 \n", "\n", " avg_lap_time best_lap_time avg_sector1_time avg_sector2_time \\\n", "0 105.21625 92.101 33.27225 46.283 \n", "1 105.21625 92.101 33.27225 46.283 \n", "2 105.21625 92.101 33.27225 46.283 \n", "3 105.21625 92.101 33.27225 46.283 \n", "4 105.21625 92.101 33.27225 46.283 \n", "5 105.21625 92.101 33.27225 46.283 \n", "\n", " avg_sector3_time avg_finish_line_speed personal_best_laps avg_air_temp \\\n", "0 32.934333 284.75 2 NaN \n", "1 32.934333 284.75 2 NaN \n", "2 32.934333 284.75 2 NaN \n", "3 32.934333 284.75 2 NaN \n", "4 32.934333 284.75 2 NaN \n", "5 32.934333 284.75 2 24.285714 \n", "\n", " avg_track_temp rain_percentage \n", "0 NaN 0.0 \n", "1 NaN 0.0 \n", "2 NaN 0.0 \n", "3 NaN 0.0 \n", "4 NaN 0.0 \n", "5 28.728571 0.0 \n", "Using model gpt-4o for 293.5 tokens (approx)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", "To disable this warning, you can either:\n", "\t- Avoid using `tokenizers` before the fork if possible\n", "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAAPoCAYAAABkvZZOAAAgAElEQVR4XuzdB5QTVfvH8Uek90XpvbP03ptI7yCCiEgVkN6RDioW1FdBQQWlS5MqCNIREKT33nvvSlf/55n9Z0iyyW6ymd2Q5XvP8bzL5s69dz4zm3PeX26eeSEoKOg/oSGAAAIIIIAAAggggAACCCCAAAIIIIAAAggEnMALBLwBd81YMAIIIIAAAggggAACCCCAAAIIIIAAAgggYAgQ8HIjIIAAAggggAACCCCAAAIIIIAAAggggAACASpAwBugF45lI4AAAggggAACCCCAAAIIIIAAAggggAACBLzcAwgggAACCCCAAAIIIIAAAggggAACCCCAQIAKEPAG6IVj2QgggAACCCCAAAIIIIAAAggggAACCCCAAAEv9wACCCCAAAIIIIAAAggggAACCCCAAAIIIBCgAgS8AXrhWDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyz2AAAIIIIAAAggggAACCCCAAAIIIIAAAggEqAABb4BeOJaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8HIPIIAAAggggAACCCCAAAIIIIAAAggggAACASpAwBugF45lI4AAAggggAACCCCAAAIIIIAAAggggAACBLzcAwgggAACCCCAAAIIIIAAAggggAACCCCAQIAKEPAG6IVj2QgggAACCCCAAAIIIIAAAggggAACCCCAAAEv9wACCCCAAAIIIIAAAggggAACCCCAAAIIIBCgAgS8AXrhWDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyz2AAAIIIIAAAggggAACCCCAAAIIIIAAAggEqAABb4BeOJaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8HIPIIAAAggggAACCCCAAAIIIIAAAggggAACASpAwBugF45lI4AAAggggAACCCCAAAIIIIAAAggggAACBLzcAwgggAACCCCAAAIIIIAAAggggAACCCCAQIAKEPAG6IVj2QgggAACCCCAAAIIIIAAAggggAACCCCAAAEv9wACCCCAAAIIIIAAAggggAACCCCAAAIIIBCgAgS8AXrhWDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyz2AAAIIIIAAAggggAACCCCAAAIIIIAAAggEqAABb4BeOJaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8HIPIIAAAggggAACCCCAAAIIIIAAAggggAACASpAwBugF45lI4AAAggggAACCCCAAAIIIIAAAggggAACBLzcAwgggAACCCCAAAIIIIAAAggggAACCCCAQIAKEPAG6IVj2QgggAACCCCAAAIIIIAAAggggAACCCCAAAEv9wACCCCAAAIIIIAAAggggAACCCCAAAIIIBCgAgS8AXrhWDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyz2AAAIIIIAAAggggAACCCCAAAIIIIAAAggEqAABb4BeOJaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8HIPIIAAAggggAACCCCAAAIIIIAAAggggAACASpAwBugF45lI4AAAggggAACCCCAAAIIIIAAAggggAACBLzcAwgggAACCCCAAAIIIIAAAggggAACCCCAQIAKEPAG6IVj2QgggAACCCCAAAIIIIAAAggggAACCCCAAAEv9wACCCCAAAIIIIAAAggggAACCCCAAAIIIBCgAgS8AXrhWDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyz2AAAIIIIAAAggggAACCCCAAAIIIIAAAggEqAABb4BeOJaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8HIPIIAAAggggAACCCCAAAIIIIAAAggggAACASpAwBugF45lI4AAAggggAACCCCAAAIIIIAAAggggAACBLzcAwgggAACCCCAAAIIIIAAAggggAACCCCAQIAKEPAG6IVj2QgggAACCCCAAAIIIIAAAggggAACCCCAAAEv9wACCCCAAAIIIIAAAggggAACCCCAAAIIIBCgAgS8AXrhWDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyz2AAAIIIIAAAggggAACCCCAAAIIIIAAAggEqAABb4BeOJaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8HIPIIAAAggggAACCCCAAAIIIIAAAggggAACASpAwBugF45lI4AAAggggAACCCCAAAIIIIAAAggggAACBLzcAwgggAACCCCAAAIIIIAAAggggAACCCCAQIAKEPAG6IVj2QgggAACCCCAAAIIIIAAAggggAACCCCAAAEv9wACCCCAAAIIIIAAAggggAACCCCAAAIIIBCgAgS8AXrhWDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyz2AAAIIIIAAAggggAACCCCAAAIIIIAAAggEqAABb4BeOJaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8HIPIIAAAggggAACCCCAAAIIIIAAAggggAACASpAwBugF45lI4AAAggggAACCCCAAAIIIIAAAggggAACBLzcAwgggAACCCCAAAIIIIAAAggggAACCCCAQIAKEPAG6IVj2QgggAACCCCAAAIIIIAAAggggAACCCCAAAEv9wACCCCAAAIIIIAAAggggAACCCCAAAIIIBCgAgS8AXrhWDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyz2AAAIIIIAAAggggAACCCCAAAIIIIAAAggEqAABb4BeOJaNAAIIIIAAAggggAACCCCAAAIIIIAAAggQ8HIPIIAAAggggAACCCCAAAIIIIAAAggggAACASpAwBugF45lI4AAAggggAACCCCAAAIIIIAAAggggAACBLzcAwgggAACCCCAAAIIIIAAAggggAACCCCAQIAKEPAG6IVj2QgggAACCCCAAAIIIIAAAggggAACCCCAAAEv9wACCCCAAAIIIIAAAggggAACCCCAAAIIIBCgAgS8AXrhWDYCCCCAAAIIIIAAAggggAACCCCAAAIIIEDAyz2AAAIIIIAAAggggAACCCCAAAIIIIAAAggEqAABb4BeOJaNAAK+CSQNCpKSJUtLgYIFJV68+HLr1k05fuyobNiwXm7euOHb4ByNAAIIIIAAAggggAACCCCAAAIIRJEAAa8H0BkyZJSECROG6vnvv//K3bt35erVK/Lo0SMPRoqcLgUKFpLCRYqag69asVzOnDkdOZNFk1HdXVM9vcdPHsvdO3flypXLotc4vJYoUSJJnz5DeN3k5s2bcvHihXD7aYcXXnhBgoNzO/T9+949OX3qpEfHR7STlS4RXUNkH6fXaur0WZI5cxaXU61evVJavd0sspfB+AgggAACCCCAAAIIIIAAAggggIAlAgS8HjAeO3lOYsWKFW5PDQPv3LkjR48clq9HfSm//74m3GOs6DDr5/lSslRpc6gJP4yT4cMGWzF0tB3D02t679492blju7w/bLAcOnTQpcdnX3wljZs0Ddfq6pUrUrRwvnD7aQcdT8e1b//995/k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AQIECBAgUDkCAt7K6bVKCRAgQIAAAQIESlNAwFuafbNrAgQIECBAgEBBBAS8BWG2CAECBAgQIECAAIEGCwh4G0znRgIECBAgQIBA+QsIeMu/xyokQIAAAQIECBAobQEBb2n3z+4JECBAgAABAo0qIOBtVF6TEyBAgAABAgQIEFhtAQHvahOagAABAgQIECBQvgIC3vLtrcoIECBAgAABAgTKQ0DAWx59VAUBAgQIECBAoFEEBLyNwmpSAgQIECBAgAABAnkTEPDmjdJEBAgQIECAAIHyExDwll9PVUSAAAECBAgQIFBeAgLe8uqnaggQIECAAAECeRUQ8OaV02QECBAgQIAAAQIE8i4g4M07qQkJECBAgAABAuUjIOAtn16qhAABAgQIECBAoDwFBLzl2VdVESBAgAABAgTyIiDgzQujSQgQIECAAAECBAg0moCAt9FoTUyAAAECBAgQKH0BAW/p91AFBAgQIECAAAEC5S0g4C3v/qqOAAECBAgQILBaAgLe1eJzMwECBAgQIECAAIFGFxDwNjqxBQgQIECAAAECpSsg4C3d3tk5AQIECBAgQIBAZQgIeCujz6okQIAAAQIECDRIQMDbIDY3ESBAgAABAgQIECiYgIC3YNQWIkCAAAECBAiUnoCAt/R6ZscECBAgQIAAAQKVJSDgrax+q5YAAQIECBAgUC8BAW+9uAwmQIAAAQIECBAgUHABAW/ByS1IgAABAgQIECgdAQFv6fTKTgkQIECAAAECBCpTQMBbmX1XNQECBAgQIEAgJwEBb05MBhEgQIAAAQIECBAomoCAt2j0FiZAgAABAgQIZF9AwJv9HtkhAQIECBAgQIBAZQsIeCu7/6onQIAAAQIECKxSQMDrC0KAAAECBAgQIEAg2wIC3mz3x+4IECBAgAABAkUVEPAWld/iBAgQIECAAAECBOoUEPDWSWQAAQIECBAgQKByBQS8ldt7lRMgQIAAAQIECJSGgIC3NPpklwQIECBAgACBoggIeIvCblECBAgQIECAAAECOQsIeHOmMpAAAQIECBAgUHkCAt7K67mKCRAgQIAAAQIESktAwFta/bJbAgQIECBAgEBBBQS8BeW2GAECBAgQIECAAIF6Cwh4603mBgIECBAgQIBA5QgIeCun1yolQIAAAQIECBAoTQEBb2n2za4JECBAgAABAgUREPAWhNki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gLd8e6syAgQIECBAgACB8hAQ8JZHH1VBgAABAgQIEGgUAQFvo7CalAABAgQIECBAgEDeBAS8eaM0EQECBAgQIECg/AQEvOXXUxURIECAAAECBAiUl4CAt7z6qRoCBAgQIECAQF4FBLx55TQZAQIECBAgQIAAgbwLCHjzTmpCAgQIECBAgED5CAh4y6eXKiFAgAABAgQIEChPAQFvefZVVQQIECBAgACBvAgIePPCaBICBAgQIECAAAECjSaQuYB3wMAt4oc/+nFs1KVLrLPOutGiRYuYOPHT2H7bLWsR/vDnm2PttddJ/3zZpRfHww890GhAJiZAgAABAgQIVLKAgLeSu692AgQIECBAgACBUhDITMDbunXruP7GP8b2O+y4nNvMmTOjT+8etb+/7oabYo89907//Nabb8Zee+xSCtb2SIAAAQIECBAoOQEBb8m1zIYJECBAgAABAgQqTCAzAe+tt98d22z7lRXyLxvwtm3bNl4b9XZUVVVFTU1NbNqjS1RXV1dY65RLgAABAgQIEGh8AQFv4xtbgQABAgQIECBAgMDqCGQi4N1v/wPi8iuvra3jiScei0svvjBO++EZMWjnwbFswJsMvP+hx2Lzzfuk95x4/LHxwP33rY6DewkQIECAAAECBFYgIOD1tSBAgAABAgQIECCQbYFMBLx/+sstaZCbXJcNvzguuuC36c83/emvscsuu60w4P31ub+NI4cdnY4bfulFcfGF52db2u4IECBAgAABAiUoIOAtwabZMgECBAgQIECAQEUJZCLgffGVkdGxY6eYN29eetzC4mtVAe9ee38trrnuxnToP+67J04+8biKapxiCRAgQIAAAQKFEBDwFkLZGgQIECBAgAABAgQaLpCJgPfdMR9E8+bN44MPJsSO222dU8C71dbbxO133puOfejB++P4bx/TcAV3EiBAgAABAgQIrFBAwOuLQYAAAQIECBAgQCDbApkIeEe89mZ0WHvtmDRpYmy9Rb9asd//8S+x6667r/CIhmOPOyHO+sUv07GXXHRBXHrJhdmWtjsCBAgQIECAQAkKCHhLsGm2TIAAAQIECBAgUFECmQh477jrvthyq61j4cKFsdmm3WPu3LlpE1Z1RMNDjzwZvXr3TscNO+LQeOqpJyqqcYolQIAAAQIECBRCQMBbCGVrECBAgAABAgQIEGi4QCYC3rPP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B7xP/vP56Nate1ry8EsviosvPD8uHX5FHDTkkAYzHDZ0SDz37DMNvt+NBAgQIECAAAECKxYQ8PpmECBAgAABAgQIEMi2gIA32/2xOwIECBAgQIBAUQUEvEXltzgBAgQIECBAgACBOgUKHvAecOBBsdnmfdKN3XH7rfH26NGx/vob1P6uzh2vYMBTTz6+wheENWQu9xAgQIAAAQIECPxXQMDr20CAAAECBAgQIEAg2wIFD3izzWF3BAgQIECAAAECSwoIeH0fCBAgQIAAAQIECGRboOAB77HHnRD7H3BQqnLGD38Qo0e/lW0huyNAgAABAgQIVLCAgLeCm690AgQIECBAgACBkhAoeMD7l5tvjR13GpTifOfk4+Pee+4uCSibJECAAAECBAhUooCAtxK7rmYCBAgQIECAAIFSEhDwllK37JUAAQIECBAgUGABAW+BwS1HgAABAgQIECBAoJ4CAt56ghlOgAABAgQIEKgkAQFvJXVbrQQIECBAgAABAqUoIOAtxa7ZMwECBAgQIECgQAIC3gJBW4YAAQIECBAgQIBAAwUEvA2EcxsBAgQIECBAoBIEBLyV0GU1EiBAgAABAgQIlLKAgLeUu2fvBAgQIECAAIFGFhDwNjKw6QkQIECAAAECBAispkBRA977/3FvvD5y5GqWEPHnP90UM2bMWO15TECAAAECBAgQILC0gIDXN4IAAQIECBAgQIBAtgWKGvDmi+awoUPiuWefydd05iFAgAABAgQIEPh/AQGvrwIBAgQIECBAgACBbAsIeLPdH7sjQIAAAQIECBRVQMBbVH6LEyBAgAABAgQIEKhToKgB76xZs2LunDl1brKuAYcdOiTefeeduob5nAABAgQIECBAoJ4CAt56ghlOgAABAgQIECBAoMACRQ14v3Py8XHvPXcXuGTLESBAgAABAgQI5Cog4M1VyjgCBAgQIECAAAECxREQ8BbH3aoECBAgQIAAgZIQEPCWRJtskgABAgQIECBAoIIFBLwV3HylEyBAgAABAgTqEhDw1iXkcwIECBAgQIAAAQLFFRDwFtff6gQIECBAgACBTAsIeDPdHpsjQIAAAQIECBAgEAJeXwICBAgQIECAAIGVCgh4fTkIECBAgAABAgQIZFtAwJvt/tgdAQIECBAgQKCoAgLeovJbnAABAgQIECBAgECdAgUPeP/w55tj8OBd040dd+zR8fBDD9S5SQMIECBAgAABAgSKIyDgLY67VQkQIECAAAECBAjkKlDwgDfXjRlHgAABAgQIECBQfAEBb/F7YAcECBAgQIAAAQIEViUg4PX9IECAAAECBAgQWKmAgNeXgwABAgQIECBAgEC2BQS82e6P3REgQIAAAQIEiiog4C0qv8UJECBAgAABAgQI1Ckg4K2TyAACBAgQIECAQOUKCHgrt/cqJ0CAAAECBAgQKA0BAW9p9MkuCRAgQIAAAQJFERDwFoXdogQIECBAgAABAgRyFhDw5kxlIAECBAgQIECg8gQEvJXXcxUTIECAAAECBAiUloCAt7T6ZbcECBAgQIAAgYIKCHgLym0xAgQIECBAgAABAvUWEPDWm8wNBAgQIECAAIHKERDwVk6vVUqAAAECBAgQIFCaAgLe0uybXRMgQIAAAQIECiIg4C0Is0UIECBAgAABAgQINFhAwNtgOjcSIECAAAECBMpfQMBb/j1WIQECBAgQIECAQGkLZD7gbdKkSST/t3DhwtKWtnsCBAgQIECAQAkKCHhLsGm2TIAAAQIECBAgUFECmQt4N9ts8zjnV+dGz56bROsvfSmaN2+eNmT+/PkxZcrnMeb99+OcX5wZo0e/VVGNUiwBAgQIECBAoBgCAt5iqFuTAAECBAgQIECAQO4CmQl427ZtG7fefk/06t07p90//tgj8f3vnhwzZszIabxBBAgQIECAAAEC9RcQ8NbfzB0ECBAgQIAAAQIECimQiYC3adOm8fy/X4mOHTvVq/aJEz+NbbcaEDU1NfW6z2ACBAgQIECAAIHcBAS8uTkZRYAAAQIECBAgQKBYApkIeL9/6mnxPz88vdZg1qxZ8fe//TVuu/WWGDPm/aiuro6Ne/SIbbfdLr7zvVOjc+f1asfee8/d8Z2Tjy+Wn3UJECBAgAABAmUtIOAt6/YqjgABAgQIECBAoAwEMhHwPvfCy7H++huknJMnTYrtv7Jleubuyq6f/OznceJJ36n9eJONN0pDYBcBAgQIECBAgEB+BQS8+fU0GwECBAgQIECAAIF8C2Qi4H3rnbHRqlWrtLZhRxwaTz31RJ11PvHUs9F94x7puBOPPzYeuP++Ou8xgAABAgQIECBAoH4CAt76eRlNgAABAgQIECBAoNACmQh4R77xTrRr1y6tfeOu68eCBQvqdFjyKd6b//rn+PHpp9V5jwEECBAgQIAAAQL1ExDw1s/LaAIECBAgQIAAAQKFFshEwHvn3f+ILbbcKq39oAO+Fq+8/FKdDgcePCSGX3ZlOk7AWyeXAQQIECBAgACBBgkIeBvE5iYCBAgQIECAAAECBRPIRMB7+o9/Gqd85/tp0Tdef22cc/bP6wQ4+ZTvxRk/+Vk67pfnnBU3XHdNnfcYQIAAAQIECBAgUD8BAW/9vIwmQIAAAQIECBAgUGiBTAS8a665Zrw26u1o0aJF+rK0/n02jblz567S4rY77omtt9k2HTN40PYxdsz7hbazHgECBAgQIECg7AUEvGXfYgUSIECAAAECBAiUuEAmAt4vf7lznPajM+IbQw9LOZ9+6sm4/tqrV0l74x/+HE2bNo2ZM2fGKScet9zYqVOnxMiRr5V4e2yfAAECBAgQIFBcAQFvcf2tToAAAQIECBAgQKAugUwEvJcOvyIOGnJIXXut1+dJ8Nund4963WMwAQIECBAgQIDA0gICXt8IAgQIECBAgAABAtkWEPBmuz92R4AAAQIECBAoqoCAt6j8FidAgAABAgQIECBQp0AmAt4TTjwlvn38CXVutj4DPpgwIQ4+cN/63GIsAQIECBAgQIDAMgICXl8JAgQIECBAgAABAtkWyETAm20iuyNAgAABAgQIVK6AgLdye69yAgQIECBAgACB0hAQ8JZGn+ySAAECBAgQIFAUAQFvUdgtSoAAAQIECBAgQCBnAQFvzlQGEiBAgAABAgQqT0DAW3k9VzEBAgQIECBAgEBpCQh4S6tfdkuAAAECBAgQKJjAmmt1jrZrd0rXm/H5xJg77ZOCrW0hAgQIECBAgAABAgRyE8hUwLtW+/Zx8snfjYFbbBkbbrRRrLHGGjlVcfihh8S777yT01iDCBAgQIAAAQIElhZo26lLNF+zXVRVNYmoiYgmTWoHNPn/n2tqkg/+/0p+bhKxcGFNzJ87PWZMHI+UAAECBAgQIECAAIEiCWQm4B0wcIu4+Zbbo1WrVvWmOGzokHju2WfqfZ8bCBAgQIAAAQIVKdC8RXRYt2s0bdZiUZi7RKC7pEerVt2iadMvpb9asGBWzJkzdsVcSeBbUxMLvqiOKZPHRcyvrkhWRRMgQIAAAQIECBAohkBmAt633hnboHA3QRPwFuOrY00CBAgQIECgFAXW6dInqqrWWCrUTYLcdu36xdpr7xAtm3eKFi0XHcuwsqt63sSYN39ifP75szF9+silg9+amli48D/x2fhRpchjzwQIECBAgAABAgRKTiATAe+wo46JX/3mvBQv+et/d95+W8yeMzuOHHZ0+rsrr7gs/vn0U7W4v7v86lhn3XXTP5/+wx/E7bf9PRYsWFBy+DZMgAABAgQIECiUQIf1N42mzVvWBrtt2/aNtTvsEGt32K7OQLeuPSaB7+dTno/PpzwbM2a8vmh48kTv/Hkx5aO367rd5wQIECBAgAABAgQIrIZAJgLeu+65Pz13N7kuPP+8+N1ll8TW22wbt91xT/q7X5z1s7jpxutry9xiy63izrv/kf559FtvxZ5fHbwaBG4lQIAAAQIECJSvQPKitDbtO9YGu8nTut27nxTt2vZrlKKnzxgZY8Zc9d+nemtqYubUSV7Q1ijaJiVAgAABAgQIECAQkYmA95/P/Ts22qhL+vTupj26RHV1dXTuvF7868URaY+SJ3h/+7+/WapfDz3yZPTq3Tv93U7bbxMTJni5hy80AQIECBAgQGBJgQ7r946mLVqkv2rRvGNstNGR0bHjVwuCNGnSIzFhwp+iev6kdL0F1dUx5aO3CrK2RQgQIECAAAECBAhUkkAmAt7XRr0da621VhrsbrLxRql/8sbmcR98mv78+OOPxjHDjliqL8mRDsnRDsl14/XXxjln/7yS+qZWAgQIECBAgMAqBdbp2i+qqqrSMZ07HxDdu51UFLExY6+KTz65O1174cKF8dm4kUXZh0UJECBAgAABAgQIlKtAJgLe1998N9q2bRvz58+Pnt03rLV+b+yH0axZsxg7dkwM3mm7pXqw9z77xtXX3pD+bkUBcLk2TF0ECBAgQIAAgVUKNG8R667fK/2X5cnVs8dpBXtqd2X7Sp7mffe9i9KPk7+xNfmj0RHzqzWSAAECBAgQIECAAIE8CGQi4H3uhZdj/fU3SMvpuuGX0//hnwa3Tz4TG/fomT7tscWAzWPqlCm1JS/5YrYRr7wcB+6/Tx44TEGAAAECBAgQKGGBJNzdoFc0iSaxRlWr6NPngvjSlzbOREGzZr0fo0b9KP6zcE7URE1M/lDIm4nG2AQBAgQIECBAgEDJC2Qi4H3w4Sei92abpZjfOOTAeOFfz6c///rc38aRw45Of37qqSdi2BGHpj83bdo0Hn/q2ejSpWv65ztuuzV+cOp3Sr4ZCiBAgAABAgQIrI7Aut36p0/uJi9S26zX2dGiZafVmS7v91bPmxhvjj47fQFb+iTv2NfyvoYJCRAgQIAAAQIECFSaQCYC3iuvvi6+tu/+qf09d98V3z3lhPTn/gMGxj33PVjbk5kzZ8Z7770bffv2S0PexdfJJ347/nHfvZXWO/USIECAAAECBGoF1unaN6qq1kif3B044KrMhbuLN5qEvCNePSl9knfhwv/EZ+Ne10UCBAgQIECAAAECBFZDIBMB7+FHHBn/+9sL0zKmfP55DOy/6Gne5Lriqmtj3/0OWGmJ7737Tuy2y06rQeBWAgQIECBAgEBpC3RYv3c0bdEiLaJ/vysycyzDylST4xpeG3lK+vGC6uqY8tFbpd0AuydAgAABAgQIECBQRIFMBLytW7eOr+6xZ8owdcrU9DiGJa9HH386em6y6XJMY95/L74+5MD47LPJRSS0NAECBAgQIECgeAJrrtU52nRYdBRDFl6olqvEki9emzllYsyd9kmutxpHgAABAgQIECBAgMASApkIeHPpyIYbbhTfOPSw2G67HeLDDz6IJ554NO6+685cbjWGAAECBAgQIFC2Ah279Y9o0iQ6dz4gunc7qaTqHDP2qvjkk7sjampikvN4S6p3NkuAAAECBAgQIJAdgZIJeJcl27hHz+jatVv6638+/WTMnz8/O6p2QoAAAQIECBAogMDioxlaNO8YW231xwKsmP8lXnppWFTPn+SohvzTmpEAAQIECBAgQKBCBEo24L3rnvtj4BZbpm06bOiQeO7ZZyqkZcokQIAAAQIECERE8xbRcf1e6dO7pXQ0w7K9qz2qwVO8vtYECBAgQIAAAQIEGiQg4G0Qm5sIECBAgAABAsUVWKdLn6hao2m0bds3+va5oLibWc3VR7x6UsyZMzYW/mdBfDZ+1GrO5nYCBAgQIECAAAEClSUg4K2sfquWAAECBAgQKAeBJZ7e7dPn/GjXtl9JVzV9xsgYNer0RWfxfjQ6Yn51Sddj8wQIECBAgAABAgQKKSDgLaS2tQgQIECAAAECeRBYfPZuOTy9u5jj9VE/ihkzXncWbx6+H6YgQIAAAQIECBCoLAEBb2X1W7UECBAgQIBAGQis27VfNKmqim5dT4z11juwDCqK+Pjju2LsuKujZuHCmDxuZFnUpAgCBAgQIECAAAEChRAQ8BZC2RoECBAgQIAAgTwKdOzWP3252lZb/CFatOyUx5mLN1X1vInx0itHLTqmYexrxduIlQkQIECAAAECBAiUmICAt8QaZrsECBAgQIBAZQu07dQlWrZuH61adYuBA64qK4yXXhoW1fMnxbzZU2PGxPFlVZtiCBAgQIAAAQIECDSWgIC3sWTNS4AAAQIECBBoBIF1uvaNqqo1onPnA6J7t5MaYYXiTTlm7FXxySd3x8KF/4nPxr1evI1YmQABAgQIECBAgEAJCQh4S6hZtkqAAAECBAgQ6Ni9f0Q0iT59zo92bfuVFcj0GSNj1KjTI6ImJo1xTENZNVcxBAgQIECAAAECjSZQ8IC3SZMm0axZs9Uu6O+33x0DB26RznPY0CHx3LPPrPacJiBAgAABAgQIZF2gHM/fXWw+a9b78drIU6ImamKygDfrX0X7I0CAAAECBAgQyIhAwQPeP/7lb7HzzrvktXwBb145TUaAAAECBAhkWKBj9wHp7nbY/sEM77LhW3v2ub3SmyeNebXhk7iTAAECBAgQIECAQAUJFDzg/cvNt8aOOw3KK7GAN6+cJiNAgAABAgQyLCDgzXBzbI0AAQIECBAgQIBAEQQKHvA2xhO8hxy8f7z47xeKwGdJAgQIECBAgEDhBNZcq3O06dApWrXqFgMHXFW4hQu40ohXT4o5c8bGzCkTY+60Twq4sqUIECBAgAABAgQIlKZAwQPefJ3BuyT3/PnzS1PfrgkQIECAAAEC9RBo26lLtGzdPtq27Rt9+1xQjztLZ+jro34UM2a8HvNmT40ZE8eXzsbtlAABAgQIECBAgECRBAoe8BapTssSIECAAAECBEpeQMBb8i1UAAECBAgQIECAAIG8Cwh4805qQgIECBAgQIBA4wgsPqKhdevuMaD/lY2zSJFnffW1k2P27DGOaChyHyxPgAABAgQIECBQOgIC3tLplZ0SIECAAAECBMJL1nwJCBAgQIAAAQIECBBYUkDA6/tAgAABAgQIECghAQFvCTXLVgkQIECAAAECBAgUQEDAWwBkSxAgQIAAAQIE8iXQsduAiCYRW23xh2jRslO+ps3EPNXzJsZLrxwVNTU1MXnsa5nYk00QIECAAAECBAgQyLqAgDfrHbI/AgQIECBAgMASAh27948k4e3T5/xo17ZfWdlMnzEyRo06PSJqYtIYAW9ZNVcxBAgQIECAAAECjSYg4G00WhMTIECAAAECBPIvsE7XvlFVtUZ07nxAdO92Uv4XKOKMY8ZeFZ98cncsXPif+Gzc60XciaUJECBAgAABAgQIlI6AgLd0emWnBAgQIECAAIFo26lLtGzdPlq37h4D+l9ZViIvvTwsqqsnxbzZU2PGxPFlVZtiCBAgQIAAAQIECDSWgIC3sWTNS4AAAQIECBBoJIF1uw2IJmV2Du9/z9+NmDz21UaSMy0BAgQIECBAgACB8hMQ8JZfT1VEgAABAgQIlLnAul37RZOqqujW9cRYb70Dy6Lajz++K8aOuzpqFi6MyeNGlkVNiiBAgAABAgQIECBQCAEBbyGUrUGAAAECBAgQyKNAh/V7R9MWLaJdu37RZ/Pz8zhz8aYa9cbpMX36yFhQXR1TPnqreBuxMgECBAgQIECAAIESExDwlljDbJcAAQIECBAgEM1bxLrr906PaejT5/xo17ZfSaNMnzEyRo06PWpqIiYn4e786pKux+YJECBAgAABAgQIFFIgkwFv69ato/+AgTFgwBbR6ctfjo8+/DCuvea/LxHp3Hm9aN6iRer06ScfR3W1/yegkF8aaxEgQIAAAQLFF1inS5+oWqNpWbxs7dXXTo7Zs8fEwv8siM/Gjyo+rh0QIECAAAECBAgQKCGBTAW8Xbp2i2uuvTF6b7bZUoQzZ86MPr171P7u1ddHR/v27dM/33n7bXHq908pIXJbJUCAEmyggwAAIABJREFUAAECBAjkR6BjtwERTSJ69jgtOnb8an4mLfAskyY9Eu++d1FETcQkL1crsL7lCBAgQIAAAQIEykEgMwHvfvsfEL+74ppokvxdw2WuZQPer+6xV1x/4x/SUTNmzIi+m/Ush16ogQABAgQIECBQL4HFZ/G2aNExttryj/W6NyuDX3p5WFRXT3L2blYaYh8ECBAgQIAAAQIlJ5CJgLddu3bx4iuvR4v/P3ahpqYm3n/v3ej05c7Rpk2bWDbgTZRfHflWtO/QIQXfY/ed4+3Ro0sO34YJECBAgAABAqsrsPgp3s6dD4ju3U5a3ekKev+7714UkyY/Esn/9ps89rWCrm0xAgQIECBAgAABAuUikImA97zzL4rDDv9majpx4qdx0P5fi48++jBu+tNfY5dddlthwPv7P/4ldt119/Ses878SfzhphvLpSfqIECAAAECBAjkLLDmWp2jTYdO6fhSOqqh9miGiJg5ZWLMnfZJzjUbSIAAAQIECBAgQIDAfwUyEfA+9MiT0at37/TpjZ132i7Gjxub7nBVAe8JJ54SPz3zrHTcn//0h/jZT07XVwIECBAgQIBARQosPqohKb5/vyviS1/aONMOs2a9H6+NXPQOhQXV1THlo7cyvV+bI0CAAAECBAgQIJBlgUwEvG++PSZat24dUz7/PAb2/+8L1lYV8PYfMDDuue/B1PaJJx6Lo488PMvO9kaAAAECBAgQaFSBdbr2jaqqNWKNNVrFwP5XRYuWi57qzdpVPW9ijHjtpPjPf+bEwoX/ic/GvZ61LdoPAQIECBAgQIAAgZISyETA+9Y7Y6NVq1Yxfvy4GLTDtrWAqwp4k5eyXX7ltelYT/CW1HfOZgkQIECAAIFGEli3a/9oUtUkWrfuHr03/UXmQt4k3H3r7XNi9uwxUbOwJiaPc+5uI30VTEuAAAECBAgQIFBBApkIeJ/85/PRrVv3mDVrVmze679/pXBVAe9v/vf8+OaRR6WtOv2HP4hb/vbXCmqbUgkQIECAAAECKxBo3iLWXb9XNGnSJH2St8/mF2TmuIbkWIZRb/wofXI3fanaR6Mj5ldrIwECBAgQIECAAAECqymQiYD3mutujL32/lpaynHHHh0PP/RA+vPKAt42bdrEiJFvRbNmzdJxuw7eMd5/793VpHA7AQIECBAgQKAMBJKQd71e6ZO8yZWFF68t+UK19Mndj4W7ZfBNUwIBAgQIECBAgEBGBDIR8CbhbhLyJtecOXNi/333jHffeWeFAW/Hjp3itjvviS5duqbjp02bFv37bJoRTtsgQIAAAQIECGRDYPGZvMluOnc+MLp3O7EoG3v33Yti0uRH0rWduVuUFliUAAECBAgQIECgzAUyEfAmxjffcntsv8OOKXfy1/Yee/Th6NV7s9hggw3jiy++iEsvvjAGbrFFDN5lt2jatGltW44edkQ88fijZd4m5REgQIAAAQIE6i/QYf3e0bRFi/TGFi06xkYbHhkdO361/hM14I7kqd0JH/wpqqsnpXcvqK6OKR+91YCZ3EKAAAECBAgQIECAwKoEMhPwrrnmmvHvl0dG27Ztc+7YU089EcOOODTn8QYSIECAAAECBCpNYM21Okeb9p0iFp3YkL6ArVu3E6Nd236NQjF9xsgYO/bq9EVqyZX8i/tZUyfF3GmfNMp6JiVAgAABAgQIECBQ6QKZCXiTRjRv3jwuuGh4HHDgQenLQVZ2JU/0/u+5v4obrrum0vunfgIECBAgQIBATgLp07zNW9QGve3a9YsO7bePtTtsFy1adsppjpUNqp43MT6f8nxMmfpcTJ8+ctGwmogF8z21u1qwbiZAgAABAgQIECCQg0CmAt7F++3WfeM46qhjYtNevWOjLl2ibdt2MXXqlBgz5v0Y9frIuOH6a2PqlCk5lGcIAQIECBAgQIDAkgLrdOkTTaqaxpL/Lj15qrdt236xztrbR4vmneoMfJNAt3r+xPjs8+dixoyRtU/rprluTUTNwgXx2fhR4AkQIECAAAECBAgQKIBAJgPeAtRtCQIECBAgQIBA5Qo0bxEd1u0eazRrFtGkaqmwd0mUJPht2vRL6a8WLJi1VJC75Lgk1I2ahfGfL76IKZPHRMyvrlxblRMgQIAAAQIECBAosICAt8DgliNAgAABAgQIZE2gbacu0XzNtlFVVZU+gbvkUVmLf07O0l18JT8nTwAvXLgw5s+dETMmjs9aSfZDgAABAgQIECBAoGIEBLwV02qFEiBAgAABAgTqJ5C8oK3t2ovO553x+UQvSqsfn9EECBAgQIAAAQIECiKQiYB3r72/Ft8Yemi9C06eHpk5Y2b8+9//ikcfeTgmTZpY7zncQIAAAQIECBAgsHKBThsPTD+c+P4ITAQIECBAgAABAgQIZFAgEwHvpcOviIOGHLLaPEnAe9IJ346XXvz3as9lAgIECBAgQIAAgQgBr28BAQIECBAgQIAAgWwLlFXAu5j6Zz85Pf78pz9kW97uCBAgQIAAAQIlICDgLYEm2SIBAgQIECBAgEBFC2Qi4N1+hx3j5ltuTxsxedKkePjhB1falG7dukcyPrmmfP55/POfT8dGG20U/QcMTF8MklzV1dXRv8+mMXfu3IpuruIJECBAgAABAqsrIOBdXUH3EyBAgAABAgQIEGhcgUwEvL/6zXkx7Khj0kpzefr21ZFvRfsOHdI3N2+3zRbx6aefpH9+4sln0/9MrttuvSVO+8H3GlfP7AQIECBAgACBMhcQ8JZ5g5VHgAABAgQIECBQ8gKZCHif/OfzkTyZm1zdNuqcBrerug75+tC46JLL0iGPPvJQHHvMsPTnAQO3iLvvfSD9+d133o7ddx1U8g1SAAECBAgQIECgmAIC3mLqW5sAAQIECBAgQIBA3QKZCHhHvvFOtGvXLj1aYZONN6pz161bt4433x6Tjvvggwmx43Zb197z3tgPo1mzZjF9+vTot/kmdc5lAAECBAgQIECAwMoFBLy+HQQIECBAgAABAgSyLZCJgPft98ZHy5Yt0yd3kyd4c7neHfNBNG/efLlQ+NXXR0f79u3rNVcu6xlDgAABAgQIEKhEAQFvJXZdzQQIECBAgAABAqUkkImA94mnno3uG/dI3YYctF+89OK/V2nYtGnTeH/cR+mYZUPht94ZG61atRLwltK30F4JECBAgACBzAoIeDPbGhsjQIAAAQIECBAgkApkIuC9dPgVcdCQQ9INTZ06NbYa2CcWLFiw0hb9/Kxz4tvHn5h+PmPGjOi7Wc/aseM/nJj+PG/evNi0RxdtJkCAAAECBAgQWA0BAe9q4LmVAAECBAgQIECAQAEEMhHwdunaLZ58+rmoqqpKS542bVr86pyz4rZbb1mK4Mtf7hw/+dlZceBBB9f+/h/33RMnn3hc+uettt4mbr/z3vTnKZ9/HgP7b1YAQksQIECAAAECBMpXQMBbvr1VGQECBAgQIECAQHkIZCLgTShPOvm78eOfnrmUak1NTcyZMyfmz58fyYvVkjN3l7y++OKL2GXQ9umL1pJr+O+uqg1///X8czH06weVR5dUQYAAAQIECBAokoCAt0jwliVAgAABAgQIECCQo0BmAt5kv+f86tw46uhvRZMmTercfhLuDvvmofHcs8/Ujr3w4uHxle22T/982aUXx99vubnOeQwgQIAAAQIECBBYuYCA17eDAAECBAgQIECAQLYFMhXwJlQbbrhRXH3djbHJJpsu98Ru8nl1dXV6dMM5vzgz/dlFgAABAgQIECDQeAIC3sazNTMBAgQIECBAgACBfAhkLuBdsqg2bdrEVltvGx07doy33x4db735hlA3H103BwECBAgQIEAgRwEBb45QhhEgQIAAAQIECBAokkCmA94imViWAAECBAgQIEDg/wUEvL4KBAgQIECAAAECBLItIODNdn/sjgABAgQIECBQVAEBb1H5LU6AAAECBAgQIECgToFMBrztO3SIbbfdLlq0aF5nAcmABx+439ENOUkZRIAAAQIECBCon4CAt35eRhMgQIAAAQIECBAotECmAt6fn3VODDv6Wyt8udqq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9OnT44MPJqShsYsAAQIECBAoXQEBb+n2zs4JECBAgAABAgQqQyATAW9Cfe55F8QR3xyWql/w2/+Ny393aWV0oBGrzDXgfX/cR5GE7BMnfhrbbNl/hTta8hzeo755WDz55OMrDHiXvTkJ7B995KH45dlnpef7uggQIECAAIHSEhDwlla/7JYAAQIECBAgQKDyBDIT8CZP744Y+Va0b98+FixYENtuNSA++2xy5XUkjxXnEvAm7uM++DRddfz4cTFoh21XuIOzf/mbOOZb304/O+vMn8Qfbroxp4B38aAk6N1t8I4xYcL4peZvv16PPFZsKgIECBAgQCDfAs3XbJNOOX/uzHxPbT4CBAgQIEAgjwJTP34vj7OZigCBUhLIRMD7q9+cF0cOOzo9omHxVZ+/2n/wgfvGKy+/VEruBdlrLgFv8+bN490xH6T7GfP+e7HLzjuscG8/P+uc+PbxJ6afLRvwHnDgQbHToMEx8rVX48MPP4zZs2fFhhtuFIN32S322nufaNasWXpfcmxDv803WWr+xU8FFQTEIgQIECBAgAABAgQIECBAoEwFJr4/okwrUxYBAnUJZCLgvXT4FXHQkEPq2utKPz9s6JD0RWKupQVyCXiTO5IneJNw/aOPPoztt91yhYznX3hJDD308PSzE48/Nh64/76cuNdZZ9149l8vRcuWLdPxe+y+c7w9enTtvc3X/FJO8xhEgAABAgQIFEeg/Xo904WnfvxucTZgVQIECBAgQCAngflzZ+U0ziACBMpPIBMB73nnXxSHHf7NBusecvD+8eK/X2jw/eV6Y64B79vvjU8D2MmTJsVWW/RdIceVV18XX9t3//SzvffYNd58842c2ZY8X/n8886NKy4fnvO9BhIgQIAAAQLFFXAGb3H9rU6AAAECBAgQIECgLoFMBLx1bdLnDRPINeAd8dqb0WHttSM5J7dn9w1XuNg/Hnw0+vRZFP726tk15s6dm/Omjj3uhDjrF79Mx//pjzfFmT89I+d7DSRAgAABAgSKKyDgLa6/1QkQIECAAAECBAjUJSDgrUuohD/PNeC974FHom/ffmmle+4+OEaPfmu5qt95f0K0aNEivvjii+jRbYN6qSx5BMfpP/xB3PK3v9brfoMJECBAgACB4gkIeItnb2UCBAgQIECAAAECuQgIeHNRKtExuQa8++1/QFx+5bVplY8//mgcM+yIpSo+8OAhMfyyKxd9/tgjccxR/z1OY/31N4iv7rlX3HTj9StUat+hQ7z48sjaF61tvUW/mDRpYomK2jYBAgQIEKg8AQFv5fVcxQQIECBAgAABAqUlkLmAt3nz5nHoYUfE5n36Ro8ePWOttdaKCRPGLxUqJn/lP/l9ct1z953x7jv/x95dR9lVnf8DfpMGigV3CRoDEjQJGtw1BHcvxSkUKQWKu4XgFtyhSCFACO4eQtAAESxQ3KHwW/vkN/O9k0wyd2buvXPlOWt1rZl799nyvIf+8cmefd6uLPUizbZjx44x9dTT1Pf+/EvDsp9fevGF+Mseu9Z/3ljAWncOb2o06MrL4/zzzo2vv/4qNtxokzjjrHOjffv22f0Tnr+79jrrxaWXD4offvgh7rj91njs0Ufi6aeeiD916BD9Nts8Dj3sH/UvWHvm6adiqy36FWn1uiVAgAABAgSKISDgLYaqPgkQIECAAAECBAgUTqCsAt5ddtsjDj/in/WBYN0yv/3221i8+yL1q37o4cdjkc5dst+fePyx2G6bLQonUsE9DRn6WHTu0rXJFfRdabkY9cH7Ddr133zLOPPsAdGuXbtJ3n/P3XfGPn/ds8H3dQFvU4N+9913sXzvpeKbb75pqqnvCRAgQIAAgTISEPCWUTFMhQABAgQIECBAgEAjAmUT8B7zr+Nj190bhoeTCng7d+kSQ4Y+nn09uReD1VrFH3zo0ejStVuTy155hd7ZrugJr759V42LL7syppnm/3YBpza///57XHThwDj15BMnumfeeeeLgRdcHD16LhEdOnSY6Ps//vgj7h98b+y3z15ZrVwECBAgQIBAZQkIeCurXmZLgAABAgQIECBQewJlEfAuttji8Z/BQ+p3j375xRdx5513xOprrBmdOs0fE+7gTWV6/Knnsu/Stc1W/eOpJ5+oveoVacWzzz5HrL3OujHDDDPGw0OHxIgRrzc5Utr52737otGla9dYYMGF4ofvf4hnn306hr36SqSQ10WAAAECBAhUpoCAtzLrZtYECBAgQIAAAQK1I1AWAe8FF10aG2y4cab+5BOPx7Zbb579POia62O11dZoNOAdMPCi2GTT8ee5nnLSCXHhBefVTtWslAABAgQIECBQIgEBb4mgDUOAAAECBAgQIECghQJlEfDW7cb97bffYtGuC8XPP//cZMC71dbbxmlnnJ21u/3WW+KgA/dtIYHbCBAgQIAAAQIEJiUg4PVsECBAgAABAgQIEChvgbIIeN96d1T2YrVPPvk4+iy7ZL3Y5Hbw9uy5RNx97wNZ26FDh8QuO25X3tJmR4AAAQIECBCoQAEBbwUWzZQJECBAgAABAgRqSqAsAt7hb7wbHTt2jA8/HBsr9FmmvgBXXn1drL76mo0e0ZC7g/fiC8+Pk048rqYKZ7EECBAgQIAAgVIICHhLoWwMAgQIECBAgAABAi0XKIuAd/ADD0f3RReNX375JTovNF/9aia3g/fKq66N1ddYK2u77957xt133dlyBXcSIECAAAECBAg0KiDg9WAQIECAAAECBAgQKG+Bsgh4zzjr3Nhiy60zqfMGnB1nnHZK9vOkAt7OXbrEgw89Fu3atcva9Vq6Z4wb92l5S5sdAQIECBAgQKACBQS8FVg0UyZAgAABAgQIEKgpgbIIeLt16x6DH3w4C2z/+OOPOP64Y+LySy9uNODdaONN4syzz4s///nPWaHefOONWGetVWuqaBZLgAABAgQIECiVgIC3VNLGIUCAAAECBAgQINAygbIIeNPUjzjyqNjrr/vWr+Lzzz6LqaeZJqaddtos9H35pRejU6f5Y9bZZqtvkz7vu2KfGD16VMtW7y4CBAgQIECAAIHJCgh4PSAECBAgQIAAAQIEylugbALexHTr7XdFr9598hJL4W46ymHgeefk1V4jAgQIECBAgACB5gsIeJtv5g4CBAgQIECAAAECpRQoq4A3LXzd9TaI0888J6affvpJOowdOyZ23nHbeOftt0tpZSwCBAgQIECAQM0JCHhrruQWTIAAAQIECBAgUGECZRfwJr90Fm+PHj1jmV69o2ePJWLmWWeJTz7+OF55+aV45pmn4/33RlYYs+kSIECAAAECBCpTQMBbmXUzawIECBAgQIAAgdoRKMuAt3b4rZQAAQIECBAgUN4CAt7yro/ZESBAgAABAgQIECiLgLdrt27x008/x6gP3lcRAgQIECBAgACBMhIQ8JZRMUyFAAECBAgQIECAQCMCZRHwnnPu+dGv/+YxatQHcdEFA+P6665RLAIECBAgQIAAgTIQEPCWQRFMgQABAgQIECBAgMBkBMoq4K2b588//xyD77s3Tj35hPjww7EKSIAAAQIECBAg0EYCAt42gjcsAQIECBAgQIAAgTwFyiLgPeTQw2O//Q9qdMoj330nzhtwTtxx+615LkkzAgQIECBAgACBQgkIeAslqR8CBAgQIECAAAECxREoi4A3LW3+BRaMvx96RKy19jox1VRTTbTaH374If5zz11x2iknxbhxnxZHQ68ECBAgQIAAAQINBAS8HggCBAgQIECAAAEC5S1QNgFvLtOm/TaLv+69f6SXr7Vr124iwTffeCMGnHtm/Oeeu8tb1+wIECBAgAABAhUuIOCt8AKaPgECBAgQIECAQNULlGXAW6c+40wzxYEHHRL9Nts8ZpxxxomK8d1338W/77gtTjjumPjxxx+rvlgWSIAAAQIECBAotYCAt9TixiNAgAABAgQIECDQPIGyDnhzl9JnueXjbwcfGr37LBft27dvsMpttuofTz35RPNWrjUBAgQIECBAgECTAgLeJok0IECAAAECBAgQINCmAhUT8CaldE7vP448KtZdbwMBb5s+NgYnQIAAAQIEakVAwFsrlbZOAgQIECBAgACBShUo+4A37dbdZbc9Ypddd4/55uvUqPPGG64br77ycqXWwLwJECBAgAABAmUrIOAt29KYGAECBAgQIECAAIFMoGwD3p49l4iDDz08Vlqpb3To0GGicv38888x+L5747RTToyxY8coJwECBAgQIECAQBEEBLxFQNUlAQIECBAgQIAAgQIKlFXAO/XUU8fe++4f22yzfcw2++yNLvP990bGhRcMjJtuvL6ADLoiQIAAAQIECBBoTEDA67kgQIAAAQIECBAgUN4CZRHw9ujRM449/qRYepllo127dhOJ/fLLL3H/4Pvi1JNPiDFjRpe3qNkRIECAAAECBKpIQMBbRcW0FAIECBAgQIAAgar5e92IAAAgAElEQVQUKIuA95xzz49+/TefCHjUqA/ikosuiOuuvTr++OOPqiyARREgQIAAAQIEyllAwFvO1TE3AgQIECBAgAABAmVyBm9uwJt26w558P445eQTY9QH76sRAQIECBAgQIBAGwoIeNsQ39AECBAgQIAAAQIE8hAoix28Rx19bKy97npx6cUXxjVXD7JbN4/CaUKAAAECBAgQKIWAgLcUysYgQIAAAQIECBAg0HKBsgh4Wzr9dF7vJpv2i6EPDYlvvvmmpd24jwABAgQIECBAYBICAl6PBgECBAgQIECAAIHyFqjIgLdX7z6x3wEHxQor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3T377uh/HhFXDboi+3mFFVeKdDRD6ueTTz6OFZdbNn777beSBbx1k01B7xqrrhSjR49qMP+Z5l6kDStgaAIECBAgQKApgSmn7pg1+eXHb5tq6nsCBAgQIECgDQW+/OjdNhzd0AQItKWAgLcN9fMJeKeccsp4570x2SzfG/lurLbKio3O+Kijj43d99wr+64u4J1/gQXjoYcfjymmmCK+//77WHH5ZePLL76ov79QO3g32bRfrNx31Rj26isxduzY+P7772K++TrFqqutEeuut342frrSsQ09F+vSYP51u4LasAyGJkCAAAECBAgQIECAAAECFS/w6ciXK34NFkCAQMsEBLwtcyvIXfkEvGmgtIM37cD98MOxsUKfZRod+7Qzzo6ttt42+26vPXeL++69Jy674qpYa+11s3Nw09m4b7/9VoN7e/RcImuTrn/fcXucfOJx2e7ezz//rCDrS53MOuts8eQzL8RUU02V9bn2mqvEW2++Wd//lFNPV7CxdESAAAECBAgUXmCmuTtnnX750TuF71yPBAgQIECAQMEEfvnxu4L1pSMCBCpLQMDbhvXKN+B9691RWUD62bhxsezSPRqd8QUXXRobbLhx9t16a68eI0a8HpdfeXWsudY6zV7h/PPO0ex7JnfDSaecHtttv2PW5LRTTorzB55b0P51RoAAAQIECBRPwBm8xbPVMwECBAgQIECAAIFCCAh4C6HYwj7yDXhffnVEzDzLLJHOse280HyNjvafwUNi8cXHh7/dOi8QP/74Y9kEvLvt8Zc4+pjjsrldc/Wg+Oc/DmuhmNsIECBAgACBUgsIeEstbjwCBAgQIECAAAECzRMQ8DbPq6Ct8w1477nvwejRo2c29jprrhpvvvnGRPN4e+To+POf/xy//vprLLLgvNn3008/fcwy62yTnPPiiy8eAy+4JPv+nrvvjDNOPzV++/XXGDNmdEHXec6550e//ptnfR56yEFx043XF7R/nREgQIAAAQLFExDwFs9WzwQIECBAgAABAgQKISDgLYRiC/vIN+DdaONN6oPYoUOHxC47btdgxE036x/nDrgg+2zoQw/GLjttn9eM8nnJWucuXWLg+eND4G+//SY232z8MRB11zzzzBtrrbNuDLriskbHnGnmmeP5F4fVv2it19I9Y9y4T/Oan0YECBAgQIBA2wsIeNu+BmZAgAABAgQIECBAYHICAt4SPh8dO3aMqaeepn7E518alv380osvxF/22LX+88YC0LpzeFOjQVdeHuefd258/fVXseFGm8QZZ50b7du3z+6vO383n2XlE/CusspqcfV1N2bd/f7777Fgp7kadL32OuvFpZcPih9++CHuuP3WeOzRR+Lpp56IP3XoEP022zwOPewf9S9Ye+bpp2KrLfrlMzVtCBAgQIAAgTIREPCWSSFMgwABAgQIECBAgMAkBAS8JXw0hgx9LDp36drkiH1XWi5GffB+g3b9N98yzjx7QLRr126S96djFvb5655N9l/XoJABb1ODfvfdd7F876Xim2++aaqp7wkQIECAAIEyEhDwllExTIUAAQIECBAgQIBAIwIC3hI+Fg8+9Gh06dqtyRFXXqF3jB49aqJ2ffuuGhdfdmVMM83/7QJOjdLO2osuHBinnnxik33nNkjn+qbzfdN19VVXxlFHHj7R/Sut3Deuu+GW7PPffvstFl5gngZt5p13vhh4wcXRo+cS0aFDh4nu/+OPP+L+wffGfvvslb0kzkWAAAECBAhUloCAt7LqZbYECBAgQIAAAQK1JyDgrcCazz77HLH2OuvGDDPMGA8PHRIjRrze5qtIO4u7d180unTtGgssuFD88P0P8eyzT8ewV1+JFPK6CBAgQIAAgcoUEPBWZt3MmgABAgQIECBAoHYEBLy1U2srJUCAAAECBAg0W0DA22wyNxAgQIAAAQIECBAoqYCAt6TcBiNAgAABAgQIVJaAgLey6mW2BAgQIECAAAECtScg4K29mlsxAQIECBAgQCBvAQFv3lQaEiBAgAABAgQIEGgTAQFvm7AblAABAgQIECBQGQIC3sqok1kSIECAAAECBAjUroCAt3Zrb+UECBAgQIAAgSYFBLxNEmlAgAABAgQIECBAoE0FBLxtym9wAgQIECBAgEB5Cwh4y7s+ZkeAAAECBAgQIEBAwOsZIECAAAECBAgQmKSAgNfDQYAAAQIECBAgQKC8BQS85V0fsyNAgAABAgQItKmAgLdN+Q1OgAABAgQIECBAoEkBAW+TRBoQIECAAAECBGpXQMBbu7W3cgIECBAgQIAAgcoQEPBWRp3MkgABAgQIECDQJgIC3jZhNygBAgQIECBAgACBvAUEvHlTaUiAAAECBAgQqD0BAW/t1dyKCRAgQIAAAQIEKktAwFtZ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Xn3l5WbXb/bZ54inn3up/liGFLqn8L2pa8GFFo7ddt8z/vmPw+qbpnmtscZa2RpOOvG47PO0gzWFm126dI1Px30al196cfZ5+izZLbTQwtm5stNMO0188803MW7cp3H7rTfH3Xfd2egUJqzDNttuH2uvs2507dY9fvj++xgxYkQcfdQR8dWXX05yCemc4f33PyiW7d0n5pxzzvjiv1/EsGGvxHfffhu77r5ndl9zz+DN59k+4sijYq+/7pv1f/NNN8TfDz4w+znfZ2urrbfNHMd+ODauvPzS7N50rEf67yFdn3766SSD+SWWXCo23njTrN0rr7w0Sd+m6u57AgQIECBAgACB8hYQ8JZ3fcyOAAECBAhUvEA+Idif//zneHvk6Gytw4e/lp3Dm3tdfd2Nscoqq03SIoWzA887J8447ZQGbXID3hTQLr/8ipHGmvBKAeOKyy2bhcu516ixn2a/phdvDb73P3Hs8SdF2s1ad90/+N7Yc/ddoqXzSy+AS3NM1+LdF8l2x9Zdz780LFIQm/40f8Trw6NX7z4TzTut+7hjj44rLrukWc/J+RdeEhtutEl2z3PPPhNb9B//c0uuiy+9ItZdb4Ps1l5L94xLLh8USy21dIOu5p93juyIh/dHfzzZIVJIv2rf5bNjIBqrw7vvvB0dp58+5phj4rNoU+36b7phDBv26kRjrL3OepHWnFu7xiZSjIA31e3W2+/Khst9tvN9ttJL1uaaa+4sCO+xaOesn/T74089lx1zkq703J834OwGS0oh+3MvDsvO703XX/bYNQbf95+WlNg9BAgQIECAAAECZS4g4C3zApkeAQIECBCodIGmAt6ZZ5klbrr59ujStVu21IMP2j9uveWmBsuuC1BToPnZZ+Pi888/z3a7pp2zuef3pnNs63bapg5yA97cDusCxBSC1V3XXnNVHHnEoQ3GrQvh0rh1f2af22DCgLe588sn4M0dL52Lm46wSKZ14d6vv/6aBX8//vhj3o/K0EeeiIUXGR8WrtBnmfjww7F53zthw9yAN82vsZe1TRjwptA6heppB/YM008fCyy4UP0Zv++NfDdWW2XFRuuQ++FPP/2U7b6dZdZZ62vz/nsjY9W+KzS4N+1iveuewfWfpfs++nBstGvfPuaee54GgX8xAt60a/myK67Kxn/i8cdiu222yH7O99lqLOBN96fQ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numFYP+5+65ILwtL1/777hV3/vuO+nZN1WGTTftFCsvT9feDD4y0Qzj3Ss9Bsu7QoUODz1955eV46snHI53Dm67tttkinnj8sbwdc5/tCf9hoqlOmlpT3f1PPftiFsB//fXX0XOxLtnHm/bbLM4978Ls56+++ip6Ld0j26mbe6VjG154eXhW03Qlk2TjIkCAAAECBAgQqD4BAW/11dSKCBAgQIBAVQq0b98+Vl55lVimV6/smIBhr74Szz7zdNmstdznly9UOtN42WV7xayzzhbDXxsWL730QuZdqCuFlauvsWbMPscc8cH778fQoUOyELvYVwqYe/dZLtvV+s7bb8XQh4Y0CNSLPb7+CRAgQIAAAQIECBRLQMBbLFn9EiBAgAABAgQIECBAgAABAgQIECBAoMgCAt4iA+ueAAECBAgQIECAAAECBAgQIECAAAECxRIQ8BZLVr8ECBAgQIAAAQIECBAgQIAAAQIECBAosoCAt8jAuidAgAABAgQIECBAgAABAgQIECBAgECxBAS8xZLVLwECBAgQIECAAAECBAgQIECAAAECBIosIOAtMrDuCRAgQIAAAQIECBAgQIAAAQIECBAgUCwBAW+xZPVLgAABAgQIECBAgAABAgQIECBAgACBIgsIeIsMrHsCBAgQIECAAAECBAgQIECAAAECBAgUS0DAWyxZ/RIgQIAAAQIECBAgQIAAAQIECBAgQKDIAgLeIgPrngABAgQIECBAgAABAgQIECBAgAABAsUSEPAWS1a/BAgQIECAAAECBAgQIECAAAECBAgQKLKAgLfIwLonQIAAAQIECBAgQIAAAQIECBAgQIBAsQQEvMWS1S8BAgQIECBAgAABAgQIECBAgAABAgSKLCDgLTKw7gkQIECAAAECBAgQIECAAAECBAgQIFAsAQFvsWT1S4AAAQIECBAgQIAAAQIECBAgQIAAgSILCHiLDKx7AgQIECBAgAABAgQIECBAgAABAgQIFEtAwFssWf0SIECAAAECBAgQIECAAAECBAgQIECgyAIC3iID654AAQIECBAgQIAAAQIECBAgQIAAAQLFEhDwFktWvwQIECBAgAABAgQIECBAgAABAgQIECiygIC3yMC6J0CAAAECBAgQIECAAAECBAgQIECAQLEEBLzFktUvAQIECBAgQIAAAQIECBAgQIAAAQIEiiwg4C0ysO4JECBAgAABAgQIECBAgAABAgQIECBQLAEBb7Fk9UuAAAECBAgQIECAAAECBAgQIECAAIEiCwh4iwysewIECBAgQIAAAQIECBAgQIAAAQIECBRLQMBbLFn9EiBAgAABAgQIECBAgAABAgQIECBAoMgCAt4iA+ueAAECBAgQIECAAAECBAgQIECAAAECxRIQ8BZLVr8ECBAgQIAAAQIECBAgQIAAAQIECBAosoCAt8jAuidAgAABAgQIECBAgAABAgQIECBAgECxBAS8xZLVLwECBAgQIECAAAECBAgQIECAAAECBIosIOAtMrDuCRAgQIAAAQIECBAgQIAAAQIECBAgUCwBAW+xZPVLgAABAgQIECBAgAABAgQIECBAgACBIgsIeIsMrHsCBAgQIECAAAECBAgQIECAAAECBAgUS0DAWyxZ/RIgQIAAAQJtKnD/g4/EdB2na9YcxoweHVtvuVmz7qnlxrvstkfsvsdfGhAc/c9/xENDHpgkS+49l116cVx5+aW1TGjtBAgQIECAAAECBFotIOBtNaEOCBAgQIAAgXIU+GDMJ9GuXbtmTe3777+PRbsu1Kx7KqXxbXfcHcv26p1N96QTjouLLzq/1VM/8+wBsfkWWzXoZ9y4T6PX0j0n2XfuPbfeclMcfND+rZ6HDggQIECAAAECBAjUsoCAt5arb+0ECBAgQKCKBVoS8H733XexWLeFq1LlznsGx5JLLpWt7YzTTonzBpzd6nU2FvCmTg895KC46cbrG+1fwNtqdh0QIECAAAECBAgQaCAg4PVAECBAgAABAlUpkBvwbrn5pvH22281uc7ffv01vv322ybbVWKDYge8f/zxR/2O6W+++SZ6LNpZwFuJD4o5EyBAgAABAgQIVJyAgLfiSmbCBAgQIECAQD4CuQHvmquvHO+8/XY+t5WsTfv27eP3339v9Xj59lPsgDedu7v6GmvVh7ynnXJSnD/w3InW19Y7ePP1yrfdpAqYjgdJobeLAAECBAgQIECAQLEFBLzFFtY/AQIECBAg0CYCrQl4+yy3fBz9r+OzeX/7zTdNvnht6WWWjeNPPCVrP+7TT2KXnbafaM1TTjllnHzqGdGrd5+Yc8654s9//nMW8H7x3//GG2+MiH33+Ut89eWXeJrVGQAAGDhJREFUE9230cabxF5775d9/u87botLL74wDjzokEif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HwECBAgQIECAAAECBAgQIECAAAECBEokIOAtEbRhCBAgQIAAAQIECBAgQIAAAQIECBAgUGgBAW+hRfVHgAABAgQIECBAgAABAgQIECBAgACBEgkIeEsEbRgCBAgQIECAAAECBAgQIECAAAECBAgUWkDAW2hR/REgQIAAAQIECBAgQIAAAQIECBAgQKBEAgLeEkEbhgABAgQIECBAgAABAgQI/L927JgGAAAAYZh/15hYuGoAkp4jQIAAAQIEagGBtxa1R4AAAQIECBAgQIAAAQIECBAgQIAAgZOAwHuCdkOAAAECBAgQIECAAAECBAgQIECAAIFaQOCtRe0RIECAAAECBAgQIECAAAECBAgQIEDgJCDwnqDdECBAgAABAgQIECBAgAABAgQIECBAoBYQeGtRewQIECBAgAABAgQIECBAgAABAgQIEDgJCLwnaDcECBAgQIAAAQIECBAgQIAAAQIECBCoBQTeWtQeAQIECBAgQIAAAQIECBAgQIAAAQIETgIC7wnaDQECBAgQIECAAAECBAgQIECAAAECBGoBgbcWtUeAAAECBAgQIECAAAECBAgQIECAAIGTgMB7gnZDgAABAgQIECBAgAABAgQIECBAgACBWkDgrUXtESBAgAABAgQIECBAgAABAgQIECBA4CQg8J6g3RAgQIAAAQIECBAgQIAAAQIECBAgQKAWEHhrUXsECBAgQIAAAQIECBAgQIAAAQIECBA4CQi8J2g3BAgQIECAAAECBAgQIECAAAECBAgQqAUE3lrUHgECBAgQIECAAAECBAgQIECAAAECBE4CAu8J2g0BAgQIECBAgAABAgQIECBAgAABAgRqAYG3FrVHgAABAgQIECBAgAABAgQIECBAgACBk4DAe4J2Q4AAAQIECBAgQIAAAQIECBAgQIAAgVpA4K1F7REgQIAAAQIECBAgQIAAAQIECBAgQOAkIPCeoN0QIECAAAECBAgQIECAAAECBAgQIECgFhB4a1F7BAgQIECAAAECBAgQIECAAAECBAgQOAkIvCdoNwQIECBAgAABAgQIECBAgAABAgQIEKgFBN5a1B4BAgQIECBAgAABAgQIECBAgAABAgROAgLvCdoNAQIECBAgQIAAAQIECBAgQIAAAQIEagGBtxa1R4AAAQIECBAgQIAAAQIECBAgQIAAgZOAwHuCdkOAAAECBAgQIECAAAECBAgQIECAAIFaQOCtRe0RIECAAAECBAgQIECAAAECBAgQIEDgJCDwnqDdECBAgAABAgQIECBAgAABAgQIECBAoBYQeGtRewQIECBAgAABAgQIECBAgAABAgQIEDgJCLwnaDcECBAgQIAAAQIECBAgQIAAAQIECBCoBQTeWtQeAQIECBAgQIAAAQIECBAgQIAAAQIETgIC7wnaDQECBAgQIECAAAECBAgQIECAAAECBGoBgbcWtUeAAAECBAgQIECAAAECBAgQIECAAIGTgMB7gnZDgAABAgQIECBAgAABAgQIECBAgACBWkDgrUXtESBAgAABAgQIECBAgAABAgQIECBA4CQg8J6g3RAgQIAAAQIECBAgQIAAAQIECBAgQKAWEHhrUXsECBAgQIAAAQIECBAgQIAAAQIECBA4CQi8J2g3BAgQIECAAAECBAgQIECAAAECBAgQqAUE3lrUHgECBAgQIECAAAECBAgQIECAAAECBE4CAu8J2g0BAgQIECBAgAABAgQIECBAgAABAgRqAYG3FrVHgAABAgQIECBAgAABAgQIECBAgACBk4DAe4J2Q4AAAQIECBAgQIAAAQIECBAgQIAAgVpA4K1F7REgQIAAAQIECBAgQIAAAQIECBAgQOAkIPCeoN0QIECAAAECBAgQIECAAAECBAgQIECgFhB4a1F7BAgQIECAAAECBAgQIECAAAECBAgQOAkIvCdoNwQIECBAgAABAgQIECBAgAABAgQIEKgFBN5a1B4BAgQIECBAgAABAgQIECBAgAABAgROAgLvCdoNAQIECBAgQIAAAQIECBAgQIAAAQIEagGBtxa1R4AAAQIECBAgQIAAAQIECBAgQIAAgZOAwHuCdkOAAAECBAgQIECAAAECBAgQIECAAIFaQOCtRe0RIECAAAECBAgQIECAAAECBAgQIEDgJCDwnqDdECBAgAABAgQIECBAgAABAgQIECBAoBYQeGtRewQIECBAgAABAgQIECBAgAABAgQIEDgJDK633CWzLX8jAAAAAElFTkSuQmCC", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "(\"SELECT * \\nFROM DriverPerformanceSummaryWithWeather\\nWHERE driver_name = 'PIA'\\n\",\n", " driver_name event_name session_type track_name total_laps \\\n", " 0 PIA Bahrain Grand Prix Qualifying Sakhir 7 \n", " 1 PIA Bahrain Grand Prix Qualifying Sakhir 7 \n", " 2 PIA Bahrain Grand Prix Qualifying Sakhir 7 \n", " 3 PIA Bahrain Grand Prix Qualifying Sakhir 7 \n", " 4 PIA Bahrain Grand Prix Qualifying Sakhir 7 \n", " 5 PIA Bahrain Grand Prix Qualifying Sakhir 7 \n", " \n", " avg_lap_time best_lap_time avg_sector1_time avg_sector2_time \\\n", " 0 105.21625 92.101 33.27225 46.283 \n", " 1 105.21625 92.101 33.27225 46.283 \n", " 2 105.21625 92.101 33.27225 46.283 \n", " 3 105.21625 92.101 33.27225 46.283 \n", " 4 105.21625 92.101 33.27225 46.283 \n", " 5 105.21625 92.101 33.27225 46.283 \n", " \n", " avg_sector3_time avg_finish_line_speed personal_best_laps avg_air_temp \\\n", " 0 32.934333 284.75 2 NaN \n", " 1 32.934333 284.75 2 NaN \n", " 2 32.934333 284.75 2 NaN \n", " 3 32.934333 284.75 2 NaN \n", " 4 32.934333 284.75 2 NaN \n", " 5 32.934333 284.75 2 24.285714 \n", " \n", " avg_track_temp rain_percentage \n", " 0 NaN 0.0 \n", " 1 NaN 0.0 \n", " 2 NaN 0.0 \n", " 3 NaN 0.0 \n", " 4 NaN 0.0 \n", " 5 28.728571 0.0 ,\n", " Figure({\n", " 'data': [{'hovertemplate': ('%{hovertext}

Ses' ... '=%{marker.size}'),\n", " 'hovertext': array(['Sakhir', 'Sakhir', 'Sakhir', 'Sakhir', 'Sakhir', 'Sakhir'],\n", " dtype=object),\n", " 'legendgroup': 'Qualifying',\n", " 'marker': {'color': '#636efa',\n", " 'size': array([7, 7, 7, 7, 7, 7]),\n", " 'sizemode': 'area',\n", " 'sizeref': 0.0175,\n", " 'symbol': 'circle'},\n", " 'mode': 'markers',\n", " 'name': 'Qualifying',\n", " 'orientation': 'v',\n", " 'showlegend': True,\n", " 'type': 'scatter',\n", " 'x': array(['Bahrain Grand Prix', 'Bahrain Grand Prix', 'Bahrain Grand Prix',\n", " 'Bahrain Grand Prix', 'Bahrain Grand Prix', 'Bahrain Grand Prix'],\n", " dtype=object),\n", " 'xaxis': 'x',\n", " 'y': array([105.21625, 105.21625, 105.21625, 105.21625, 105.21625, 105.21625]),\n", " 'yaxis': 'y'}],\n", " 'layout': {'legend': {'itemsizing': 'constant', 'title': {'text': 'Session Type'}, 'tracegroupgap': 0},\n", " 'template': '...',\n", " 'title': {'text': 'Driver PIA Performance'},\n", " 'xaxis': {'anchor': 'y', 'domain': [0.0, 1.0], 'title': {'text': 'Event Name'}},\n", " 'yaxis': {'anchor': 'x', 'domain': [0.0, 1.0], 'title': {'text': 'Average Lap Time'}}}\n", " }))" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vn.ask(question=\"How was the performance of the driver PIA?\")" ] }, { "cell_type": "markdown", "id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb", "metadata": { "id": "8c49dd68-3bc6-5098-93f1-2d4d8617badb" }, "source": [ "## Launch the User Interface\n", "\n", "![vanna-flask](https://vanna.ai/blog/img/vanna-flask.gif)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "b87d140b-ef56-5795-b489-46bb11d01459", "metadata": { "id": "b87d140b-ef56-5795-b489-46bb11d01459" }, "outputs": [], "source": [ "from vanna.flask import VannaFlaskApp\n", "app = VannaFlaskApp(vn)\n", "app.run()" ] }, { "cell_type": "markdown", "id": "29793859-c3c8-50da-994a-c8f6348d6730", "metadata": { "id": "29793859-c3c8-50da-994a-c8f6348d6730" }, "source": [ "## Next Steps\n", "\n", "Using Vanna via Jupyter notebooks is great for getting started but check out additional customizable interfaces like the\n", "\n", "- [Streamlit app](https://github.com/vanna-ai/vanna-streamlit)\n", "- [Flask app](https://github.com/vanna-ai/vanna-flask)\n", "- [Slackbot](https://github.com/vanna-ai/vanna-slack)\n" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.9" } }, "nbformat": 4, "nbformat_minor": 5 }